与本机消息传递主机通信时出错(chrome 令牌签名)
Posted
技术标签:
【中文标题】与本机消息传递主机通信时出错(chrome 令牌签名)【英文标题】:Error when communicating with the native messaging host (chrome token signing) 【发布时间】:2017-05-24 10:42:20 【问题描述】:我从 github 安装了 chrome 令牌签名,在构建本机消息传递并在 Google chrome 中加载扩展后,它返回一个窗口 cmd,当我退出或放置任何字符串时出现错误 与本机消息传递主机通信时出错
【问题讨论】:
你能显示你的代码和错误日志吗? @Mr.Rebot 日志错误后台页面已激活 TEST: ERROR "message":"与本机消息传递主机通信时出错。" 【参考方案1】:background.js
* Chrome token signing extension
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
var NO_NATIVE_URL = "https://open-eid.github.io/chrome-token-signing/missing.html";
var HELLO_URL = "https://open-eid.github.io/chrome-token-signing/hello.html";
var DEVELOPER_URL = "https://github.com/open-eid/chrome-token-signing/wiki/DeveloperTips";
var NATIVE_HOST = "ee.ria.esteid";
var K_SRC = "src";
var K_ORIGIN = "origin";
var K_NONCE = "nonce";
var K_RESULT = "result";
var K_TAB = "tab";
var K_EXTENSION = "extension";
// Stores the longrunning ports per tab
// Used to route all request from a tab to the same host instance
var ports = ;
// Probed to false if host component is OK.
var missing = true;
console.log("Background page activated");
// XXX: probe test, because connectNative() does not allow to check the presence
// of native component for some reason
typeof chrome.runtime.onStartup !== 'undefined' && chrome.runtime.onStartup.addListener(function()
// Also probed for in onInstalled()
_testNativeComponent().then(function(result)
if (result === "ok")
missing = false;
);
);
// Force kill of native process
// Becasue Port.disconnect() does not work
function _killPort(tab)
if (tab in ports)
console.log("KILL " + tab);
// Force killing with an empty message
ports[tab].postMessage();
// Check if native implementation is OK resolves with "ok", "missing" or "forbidden"
function _testNativeComponent()
return new Promise(function(resolve, reject)
chrome.runtime.sendNativeMessage(NATIVE_HOST, text: "some_valid_argument", function(response)
if (!response)
console.log("TEST: ERROR " + JSON.stringify(chrome.runtime.lastError));
// Try to be smart and do some string matching
var permissions = "Access to the specified native messaging host is forbidden.";
var missing = "Specified native messaging host not found.";
if (chrome.runtime.lastError.message === permissions)
resolve("forbidden")
else if (chrome.runtime.lastError.message === missing)
resolve("missing");
else
resolve("missing");
else
console.log("TEST: " + JSON.stringify(response));
if (response["result"] === "invalid_argument")
resolve("ok");
else
resolve("missing"); // TODO: something better here
);
);
// When extension is installed, check for native component or direct to helping page
typeof chrome.runtime.onInstalled !== 'undefined' && chrome.runtime.onInstalled.addListener(function(details)
if (details.reason === "install" || details.reason === "update")
_testNativeComponent().then(function(result)
var url = null;
if (result === "ok" && details.reason === "install")
// Also set the flag, onStartup() shall be called only
// on next startup
missing = false;
// TODO: Add back HELLO page on install
// once there is a nice tutorial
url = HELLO_URL;
console.log('succes'+ url);
else if (result === "forbidden")
url = DEVELOPER_URL;
else if (result === "missing")
url = NO_NATIVE_URL;
if (url)
chrome.tabs.create('url': url + "?" + details.reason);
);
);
// When message is received from page send it to native
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse)
if(sender.id !== chrome.runtime.id && sender.extensionId !== chrome.runtime.id)
console.log('WARNING: Ignoring message not from our extension');
// Not our extension, do nothing
return;
if (sender.tab)
// Check if page is DONE and close the native component without doing anything else
if (request["type"] === "DONE")
console.log("DONE " + sender.tab.id);
if (sender.tab.id in ports)
// FIXME: would want to use Port.disconnect() here
_killPort(sender.tab.id);
else
request[K_TAB] = sender.tab.id;
if (missing)
_testNativeComponent().then(function(result)
if (result === "ok")
missing = false;
_forward(request);
else
return _fail_with(request, "no_implementation");
);
else
// TODO: Check if the URL is in allowed list or not
// Either way forward to native currently
_forward(request);
);
// Send the message back to the originating tab
function _reply(tab, msg)
msg[K_SRC] = "background.js";
msg[K_EXTENSION] = chrome.runtime.getManifest().version;
chrome.tabs.sendMessage(tab, msg);
// Fail an incoming message if the underlying implementation is not
// present
function _fail_with(msg, result)
var resp = ;
resp[K_NONCE] = msg[K_NONCE];
resp[K_RESULT] = result;
_reply(msg[K_TAB], resp);
// Forward a message to the native component
function _forward(message)
var tabid = message[K_TAB];
console.log("SEND " + tabid + ": " + JSON.stringify(message));
// Open a port if necessary
if(!ports[tabid])
// For some reason there does not seem to be a way to detect missing components from longrunning ports
// So we probe before opening a new port.
console.log("OPEN " + tabid + ": " + NATIVE_HOST);
// create a new port
var port = chrome.runtime.connectNative(NATIVE_HOST);
// XXX: does not indicate anything for some reason.
if (!port)
console.log("OPEN ERROR: " + JSON.stringify(chrome.runtime.lastError));
port.onMessage.addListener(function(response)
if (response)
console.log("RECV "+tabid+": " + JSON.stringify(response));
_reply(tabid, response);
else
console.log("ERROR "+tabid+": " + JSON.stringify(chrome.runtime.lastError));
_fail_with(message, "technical_error");
);
port.onDisconnect.addListener(function()
console.log("QUIT " + tabid);
delete ports[tabid];
// TODO: reject all pending promises for tab, if any
);
ports[tabid] = port;
ports[tabid].postMessage(message);
else
// Port already open
ports[tabid].postMessage(message);
chrome.runtime.onMessageExternal.addListener(
function(request, sender, sendResponse)
if (sender.url == blacklistedWebsite)
return; // don't allow this web page access
if (request.openUrlInEditor)
openUrl(request.openUrlInEditor);
);
错误 后台页面已激活 TEST: ERROR "message":"与本机消息传递主机通信时出错。"
当我运行扩展时,我有:
当我写一些东西或在 Enter 触摸或关闭 cmd 时单击 2 次时,我有这个:
【讨论】:
以上是关于与本机消息传递主机通信时出错(chrome 令牌签名)的主要内容,如果未能解决你的问题,请参考以下文章
如何在 chrome 扩展本机消息传递和 c# 应用程序之间发送/接收消息