How to send message FROM native app TO Chrome extension?

后端 未结 3 1350
醉话见心
醉话见心 2020-12-03 06:13

I have read docs, but still cannot realize. I have desktop application written in C and Chrome extension. I know how to receive this message in my chrome extension:

3条回答
  •  青春惊慌失措
    2020-12-03 06:35

    In order for a native messaging host to send data back to Chrome, you must first send four bytes of length information and then send the JSON formatted message as a string/char-array.

    Below are two examples for C and C++ respectively that do the same thing in slightly different ways.

    C example:

    #include 
    #include 
    
    int main(int argc, char* argv[]) {
        // Define our message
        char message[] = "{\"text\": \"This is a response message\"}";
        // Collect the length of the message
        unsigned int len = strlen(message);
        // We need to send the 4 bytes of length information
        printf("%c%c%c%c", (char) (len & 0xff),
                           (char) ((len>>8) & 0xFF),
                           (char) ((len>>16) & 0xFF),
                           (char) ((len>>24) & 0xFF));
        // Now we can output our message
        printf("%s", message);
        return 0;
    }
    

    C++ example:

    #include 
    
    int main(int argc, char* argv[]) {
        // Define our message
        std::string message = "{\"text\": \"This is a response message\"}";
        // Collect the length of the message
        unsigned int len = message.length();
        // We need to send the 4 bytes of length information
        std::cout << char(((len>>0) & 0xFF))
                  << char(((len>>8) & 0xFF))
                  << char(((len>>16) & 0xFF))
                  << char(((len>>24) & 0xFF));
        // Now we can output our message
        std::cout << message;
        return 0;
    }
    

    (The actual message can be sent at the same time as the length information; it is merely broken out for clarity.)

    So following the OP Chrome example, here is how to output the message:

    port.onMessage.addListener(function(msg) {
        console.log("Received" + msg.text);
    });
    

    In reality, there is no requirement to use "text" as the key returned from your native messaging app; it could be anything. The JSON string passed to the listener from your native messaging app is converted to a JavaScript Object.

    For a C++ example of a native messaging app that uses the above technique in combination with jsoncpp (C++ JSON library) and also parses the request sent to the app, see here: https://github.com/kylehuff/libwebpg/blob/22d4843f41670d4fd7c4cc7ea3cf833edf8f1baf/webpg.cc#L4501

提交回复
热议问题