【问题标题】:firefox extension with native messaging application not working带有本机消息传递应用程序的 Firefox 扩展无法正常工作
【发布时间】:2018-03-26 10:49:30
【问题描述】:

我有一个用 Java 开发的本机应用程序(已编译的 jar),该扩展程序基本上通过用户输入向本机应用程序发送消息,并将响应返回到网页上的标签中。

该扩展在 Chrome 上运行良好,但我无法在 Firefox 58.0.1(量子 64 位)中执行相同的操作。

浏览器控制台出错。

无法将 null 转换为对象

下面是sn-p代码和错误截图。

   {
    "manifest_version":2,

    "name":"Firefox Automation Extension",
    "version":"1.0",
    "description":"Automation Extensions",

    "icons": {
      "16": "icons/synergy.png"
    },

    "browser_action":{

      "default_icon": {
       "32" : "icons/synergy.png"
      },
      "default_title": "Native Messaging Application Testing",
      "default_popup": "index.html"      
},
    "background":{
    "scripts": ["background.js"]
    },

    "applications": {
        "gecko": {
          "id": "webdom@oracle.com",
          "strict_min_version": "58.0"
        }
      },
        "content_security_policy":"script-src 'self' 'unsafe-eval'; object-src 'self'",

    "permissions": [
      "nativeMessaging", "<all_urls>"
    ],

    "content_scripts": [
        {
          "matches": [
            "<all_urls>"
          ],
          "js": [
            "jquery-1.12.2.min.js", 
            "contentScript.js"
          ]
        }
      ]

}

/* background.js */

browser.runtime.onMessage.addListener(function (msg, sender, sendResponse) { console.info("收到 %o 来自 %o, 帧", msg, sender.tab, sender.frameId);

// As it is registered in registy
var host_name="xxxxxxxxxxxxxxxxxxx";

// Open port (for communication).
var port = browser.runtime.connectNative(host_name);

// Send message to native application.
port.postMessage(msg);

// Listen for response...
port.onMessage.addListener(function (msg) {
    // Send data to the content.
    browser.tabs.query({ active: true, currentWindow: true }, function (tabs) {
        browser.tabs.sendMessage(tabs[0].id, msg, function (response) { });
    });
});

port.onDisconnect.addListener(function () {
    console.info("Disconnected.");
});

});

/* contentScript.js */

document.addEventListener("send-message-event", function (data) {

    var request = data.detail.data;
    console.log("content script : ", request);
    // Send message to the background script
    browser.runtime.sendMessage(request, null);
});

/**
 * Listens to the background script and dispatches 'get-message-event' 
 * to the client when the data is received.
 */
browser.runtime.onMessage.addListener(function (response, sender, sendResponse) {
    console.log(response);
    // Send response to the front page
    var event = new CustomEvent("get-message-event", {
        detail: {
            data: response
        },
        bubbles: true,
        cancelable: true
    });
    document.dispatchEvent(event);
});

/* Main.js(从 html 页面调用的脚本)*/

$(document).ready(function () {

    var sendMessageBtn = $('#send-message-button');
    var inputElem = $('#input-text');
    var responseElem = $('#response');

    /**
     * Send message operation
     */
    sendMessageBtn.click(function () {
        var request = {};
        request.message = inputElem.val();

        var event = new CustomEvent("send-message-event", {
            detail: {
                data: request
            },
            bubbles: true,
            cancelable: true
        });

        console.log("From Main : ",event.detail.data);
        document.dispatchEvent(event);
    });

    /**
     * Get message event listener
     */
    document.addEventListener("get-message-event", function (data) {
        var responseObject = data.detail.data;
        responseElem.text(responseObject.message);
    });
});

index.html 页面

<!DOCTYPE html>
<html>

<head>
    <title>Native Messaging</title>
    <meta charset="utf-8">
    <link rel="stylesheet" href="bootstrap.min.css">
</head>

<body>
    <div class="container">
        <div class="row">
            <div class="col-md-4"></div>
            <div class="col-md-4">
                <div class="page-header">
                    <h2>Native Messaging</h2>
                </div>
                <div class="form-group">
                    <label for="input-text">Input message:</label>
                    <input class="form-control" id='input-text' type='text' value="Test" />
                </div>
                <button type="button" class="btn btn-block btn-default" id='send-message-button'>Send Message</button>
                <hr>
                <div class="well well-lg" id='response'>Response from Native app...</div>
            </div>
            <div class="col-md-4"></div>
        </div>

    </div>
    <!-- jQuery and JS files -->
    <script src="jquery-1.12.2.min.js"></script>
    <script src="main.js"></script>
</body>

</html>

单击发送消息按钮时,我得到的错误是无法将 null 转换为对象。

代码在 Chrome 中运行良好,我能够从 chrome 扩展中的本机应用程序获得响应

【问题讨论】:

    标签: firefox-addon chrome-native-messaging


    【解决方案1】:

    我认为问题是因为您没有在 regedit 中注册您的本机应用程序:

    HKEY_LOCAL_MACHINE\SOFTWARE\Mozilla\NativeMessagingHosts 
    HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Mozilla\NativeMessagingHosts
    

    我会同意的:

    "tabs",
    "nativeMessaging",
    "<all_urls>",
    "webNavigation"
    

    使用您的浏览器。

    【讨论】:

      猜你喜欢
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-10
      • 2021-07-04
      • 1970-01-01
      相关资源
      最近更新 更多