本地消息传递无法在youtube.com上正常工作

时间:2018-12-14 11:13:44

标签: javascript c++ stdin stdio chrome-native-messaging

该扩展程序仅检索活动选项卡的URL并将其发送到本机应用程序。它在所有其他网站(包括正在播放视频的youtube子页面)上都成功。 Firefox和Chrome都发生相同的问题。

以下是Chrome的代码

chrome.tabs.query({currentWindow:true,active:true},onGot);

function onGot(tabs){
    tab=tabs[0].url;
    port.postMessage(tab);
    console.log(tab);
    console.log("Response sent!");
}

在本机应用程序中,我先阅读尺寸,然后阅读消息。以下是读取尺寸的代码。

    int num = 0;
    unsigned char c;
    log("Listening for data Attempt1");
    for (int i = 1;i <= 4;i++)
    {
        log("Waiting for chararcter");
        c = cin.get();
        int s = (i - 1) * 8 - 1;
        if (s < 0) s = 0;
        num = num | (((int)c) << s);
        log("Read Character from extension");
        log(int(c));
    }
    log("Output Size:");
    log(num);
    if (num <0 || num>1999)        *//EDIT*
        return "NULL";

当我尝试在“ https://www.youtube.com/”上将URL返回到本机应用程序时,这是我的日志文件

Listening for data Attempt1
Waiting for chararcter
Read Character from extension
255
Waiting for chararcter
Read Character from extension
255
Waiting for chararcter
Read Character from extension
255
Waiting for chararcter
Read Character from extension
255
Output Size:
2147483647

0xFFFFFFFF是文件结尾。这意味着标准输入流已关闭。仅在youtube.com上会发生这种情况。

1 个答案:

答案 0 :(得分:0)

std::cin的类型std::istream documentation可以看到:

int_type get();
     

读取一个字符并返回(如果有)。否则,返回Traits::eof()并设置failbit和eofbit。

如果您希望尽可能少地修改代码,请对照c检查Traits::eof()

c = cin.get();
if (c == decltype(std::cin)::traits_type::eof()) {
    break;
}

但是,一种改进是在代码的两个不同部分(两个函数?)中处理std::cin的读取和数据操作,然后使用std::transform进行链接。

>