如何使用实验性的offscreenTab API?

时间:2012-07-06 01:00:20

标签: google-chrome-extension offscreentabs

我一直在寻找示例和参考,并且没有提出任何建议。我在offscreenTab源代码中发现了一个注释,提到它无法从后台页面实例化(它没有与offscreenTab相关的选项卡)。在其他地方我发现提到弹出窗口也没有与标签相关联。

如何在Chrome扩展程序中成功创建offscreenTab?

1 个答案:

答案 0 :(得分:1)

根据文档,offscreenTabs.create将无法在后台页面中运行。虽然未明确提及,但API也不能在内容脚本中使用。通过一个简单的测试,似乎弹出窗口与背景页面具有相同的限制。

唯一的剩余选项是在Chrome扩展程序的上下文中运行的标签。最简单的方法是在后台/弹出窗口中使用以下代码:

chrome.tabs.create({url: chrome.extension.getURL('ost.htm'), active:false});
// active:false, so that the window do not jump to the front

ost.htm是一个帮助页面,它创建了标签:

chrome.experimental.offscreenTabs.create({url: '...'}, function(offscreenTab) {
    // Do something with  offscreenTab.id !
});

要更改网址,请使用chrome.experimental.offscreenTabs.update

offscreenTab.id是一个tabId,应该与chrome.tabs API一起使用。但是,至少在Chrome 20.0.1130.1中,情况并非如此。 tabs API的所有方法都无法识别返回的tabID。

解决方法是使用manifest file注入内容脚本,例如:

{"content_scripts": {"js":["contentscript.js"], "matches":["<all_urls>"]}}
// contentscript.js:
chrome.extension.sendMessage({ .. any request .. }, function(response) {
    // Do something with response.
});

背景页面的附录:

chrome.extension.onMessage.addListener(function(message, sender, sendResponse) {
    // Instead of checking for index == -1, you can also see if the ID matches
    // the ID of a previously created offscreenTab
    if (sender.tab && sender.tab.index === -1) {
        // index is negative if the tab is invisible
        // ... do something (logic) ...
        sendResponse( /* .. some response .. */ );
    }
});

使用内容脚本,您可以完全访问页面的DOM。但不是全球性的对象。如果要在页面上下文中运行代码,则必须注入脚本(请参阅this answer)。

另一个可能有用的API是chrome.webRequest API。它可用于修改标头/中止/重定向请求。注意:它不能用于读取或修改响应。

目前,offscreenTabs API是实验性的。要使用它,您必须通过chrome://flags启用实验性API,并将"permissions":["experimental"]添加到清单文件中。一旦它不再是实验性的,请使用"permissions":["offscreenTabs"]