是否可以使用 chrome.tab.executeScript 调用带有 chrome 扩展名的 gwt jsni 方法?

is there possible calling gwt jsni method with chrome extension using chrome.tab.executeScript?

我有一个包含 chrome 个扩展的 gwt 项目。

在 GWT 中,我将一个 java 方法导出到 jsni,名为:

Java Method: sendMessage(String msg);
export jsni: $wnd.sendMessage = function(msg) { ... };

然后在 chrome 扩展中,我执行:

chrome.tabs.executeScript(tabId, {code: "sendMessage('hello');"}

但没有发生,我试过了:

chrome.tabs.executeScript(tabId, {code: "alert('hello');"}

而且效果很好。但它就是不能调用我的 gwt jsni 方法。

Chrome 内容脚本存在于 an isolated world

$wnd.sendMessage 在页面上下文中导出,无法从内容脚本访问。

您需要将代码注入页面本身(使用 <script> 标记)才能访问它。

this canonical question on the topic, and this question can also be of use: Executing code at page-level from Background.js and returning the value

解决了这个问题,当传递一个 json 字符串时,你必须对字符串进行编码以防止字符串中出现双 quotes/special 字符,这是我的代码:

假设数据格式为:

var data = '{"abc":123,"cde":"kkk"}';

然后对数据进行编码:

var param = '\'' + encodeURIComponent(data) + '\'';

将数据放入代码中执行:

var codeToExec = [
        'var actualCode = "window.sendMessage(' + param + ');"',
        'var script = document.createElement("script");',
        'script.textContent = actualCode;',
        '(document.head||document.documentElement).appendChild(script);',
        'script.remove();'
    ].join('\n');

chrome.tabs.executeScript(mainTabId, {code: codeToExec});