是否可以使用 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});
我有一个包含 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});