activeTab 权限未按预期工作 - Chrome 扩展

San*_*mar 1 google-chrome-extension

根据权限文档,如果我们有activeTab权限,则不需要指定基于 URL 的权限

以下任何 URL 都与所有主机匹配:

http://*/*
https://*/*
*://*/*
<all_urls>
Run Code Online (Sandbox Code Playgroud)

请注意,您可以避免 使用 activeTab 权限声明所有主机权限。

但这只能工作一次,第二次出现错误(当我们第二次尝试时,扩展 UI 已打开),如果我们通过单击扩展图标再次启动弹出窗口,则它可以正常工作。

Unchecked runtime.lastError while running tabs.executeScript: 
Cannot access contents of the page. 
Extension manifest must request permission to access the respective host.
Run Code Online (Sandbox Code Playgroud)

以下为详细内容

清单.json

{
  "manifest_version": 2,

  "name": "Getting started example",
  "description": "This is hello world example",
  "version": "1.0",

  "browser_action": {
    "default_icon": "icon.png",
    "default_popup": "popup.html"
  },
  "permissions": [
    "activeTab"
  ]
}
Run Code Online (Sandbox Code Playgroud)

弹出窗口.html

<html>
  <head>
    <title>Getting Started Extension's Popup</title>
    <script src="popup.js"></script>
  </head>
  <body>
    <div>Hello World!</div>
    <input type="button" id="refreshPage" value="Refresh Page"/>
  </body>
</html>
Run Code Online (Sandbox Code Playgroud)

弹出窗口.js

document.addEventListener('DOMContentLoaded', function() {

    function refreshPage() {
        chrome.tabs.executeScript(null, {
            code: 'window.location.reload(true)'
        }, function(){
            console.log("Page refershed");
        });
    }

    document.getElementById("refreshPage").addEventListener("click", refreshPage);

});
Run Code Online (Sandbox Code Playgroud)

如果我们添加"*://localhost/*"(这适用于本地主机),则还有另一种方法可以为所有主机指定*://*/*(不确定这是否正确且安全),刷新按钮可以多次工作而无需重新启动弹出式 UI。activeTab 与基于 URL 的权限之间是否存在差异,并且由于特定原因推荐任何特定方式而不是其他方式?

hol*_*erd 6

activeTab暂时授予权限直到导航或关闭该选项卡。我的猜测是,通过在刷新时重新加载选项卡会撤销activeTab权限。避免使用window.location.reload或指定与您尝试执行脚本的域匹配的 url。

https://developer.chrome.com/extensions/activeTab

当用户调用扩展程序时(例如通过单击其浏览器操作),activeTab 权限允许扩展程序临时访问当前活动的选项卡。对该选项卡的访问将持续到导航或关闭该选项卡为止。