javascriptc++firefoxfirefox-addonnativeapplication

webextension native application c++ hello world


I want to create a webextension on firefox, that communicate with a simple c++ application, I would like to send a message to the c++ application, and to recieve a simple message(Hello world by example).

For now this is what I have done :

manifest.json (webextension)

{
  "manifest_version": 2,
  "name": "nameofwebextension",
  "version": "1.0",

  "description": "test",
    "permissions": [
    "tabs",
    "activeTab",
    "downloads",
    "downloads.open",
    "nativeMessaging"
    ],
  "icons": {
    "48": "icons/border-48.png"
  },
  "content_scripts": [
  {
    "matches": ["http://www.testwebsite.com/*"],
    "js": ["content.js"]
  }
    ],
  "background": {
  "scripts": ["background.js"]
},
  "browser_action": {
    "default_icon": "icons/beasts-32.png",
    "default_title": "test",
    "default_popup": "popup/test.html",
    "browser_style": false
  },

    "applications": {
    "gecko": {
      "id": "name@example.org",
      "strict_min_version": "50.0"
    }
  }

}

background.js

var port = browser.runtime.connectNative("nameofapp");
console.log("Sending:  ping");
port.postMessage("ping");
port.onMessage.addListener((response) => {
  console.log("Received: " + response);
});

manifest.json (c++ app)

{
  "name": "nameofapp",
  "description": "Example host for native messaging",
  "path": "bin/Debug/nameofapp.exe",
  "type": "stdio",
  "allowed_extensions": [ "name@example.org" ]
}

main.cpp

#include <iostream>

using namespace std;

int main()
{
    cout << "Hello world!" << endl;
    //cin.get();
    return 0;
}

i have also create the right key in the registry editor.

This what I get into the browser console :

Sending:  ping  
Native application tried to send a message of 1819043144 bytes, 
which exceeds the limit of 1048576 bytes.

Solution

  • I found the answer here : https://groups.google.com/a/chromium.org/forum/#!msg/chromium-extensions/Y5RckbPVnr8/xe5w9RC6O5sJ

    #include <iostream>
    
    int main(int argc, char* argv[])
    {
        std::cout.setf( std::ios_base::unitbuf ); //instead of "<< eof" and "flushall"
        unsigned int a, c, i, t=0;
        std::string inp;
        bool bCommunicationEnds = false;
    
        do {
    
            inp="";
            t=0;
            // Sum the first 4 chars from stdin (the length of the message passed).
            for (i = 0; i <= 3; i++)
            {
    //          t += getchar();
                t += std::cin.get();
            }
            // Loop getchar to pull in the message until we reach the total
            //  length provided.
            for (i=0; i < t; i++)
            {
                //c = getchar();
                c = std::cin.get();
                //if(c == EOF)
                if(c == 65)
                {
                    bCommunicationEnds = true;
                    i = t;
                }
                else
                {
                    inp += c;
                }
            }
    
            if(!bCommunicationEnds)
            {
                //Collect the length of the message
                 unsigned int len = inp.length();
                //unsigned int len = strJson.length();
                //// We need to send the 4 btyes 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 << inp;
    
            }
        }while(!bCommunicationEnds);
        return 0;
    }