Safari 14:chrome.permissions.request() 无法无缝工作并且 tab.url 总是空白 - 扩展

Safari 14: chrome.permissions.request() not working seamless and tab.url comes blanks always - Extension

我有工作的跨平台扩展,我使用 xcrun safari-web-extension-converter PATH 为 Safari 转换了它。 扩展的目标是将任何 URL 添加到我的网站帐户 (https://ourdomain.in) 中。

我的扩展在 Chrome 上运行良好,但对于 Safari 版本,如果用户 允许每个网站的访问权限,则一切正常。

问题是,即使我有适当的 optional_permissions 并使用 chrome.permissions.request() 方法请求用户同意 ourdomain.in,我们看到用户允许访问,仍然 tab.url 每次 chrome.tabs.onUpdated 都是空白。

详细情况如下,当用户按下扩展按钮时,我们通过打开我们的网站URL进入另一个标签[=68=来检查用户是否登录到其帐户].

var openSignin = function openSignin() {
    console.log('hey');
    chrome.tabs.create({ url: _config.baseURL + '?extension=1', active: false });
};

加载此 AUTH 选项卡时,将调用以下方法,就像在 Chrome 中发生的那样,该方法依次提取 public 和任何用户登录我们网站时生成的私人令牌。

chrome.tabs.onUpdated.addListener(function (tabID, changeInfo, tab) {
    if (tab.status == 'complete' && tab.url.startsWith(_config.baseURL)) {
      chrome.tabs.executeScript(tab.id, { code: 'localStorage.getItem("PUBLIC")' }, function (r) {
       localStorage['PUBLIC'] = JSON.parse(r[0]);
       chrome.tabs.executeScript(tab.id, { code: 'localStorage.getItem("PRIVATE")' }, function (r) {
        localStorage['PRIVATE'] = JSON.parse(r[0]);
        if (localStorage['PRIVATE'] && tab.url === _config.baseURL + '?extension=1') {
         chrome.tabs.remove(tabID);
        }
       });
      });
     }
});

这里的问题是,除非用户不授予“在每个网站上始终允许”(我的意思是授予 https://ourdomain.in/extension?extension=1 的权限),chrome.tabs.onUpdate 给出 tab.url = "" 并且它没有给出正确的 URL 值,因此我们的条件不匹配并且知道特定用户是否已登录。

以下是我们的 manifest.json 我在其中使用了事件 optional_permissions:

{
    "name": "EXT NAME",
    "description": "DESCRIPTION",
    "manifest_version": 2,
    "version": "1.0.181",
    "minimum_chrome_version": "23",
    "offline_enabled": true, 
    "browser_action" : {
        "default_icon" : {
             "64": "logo/icon.png"
        },
        "default_title" : "Add here"
    },
    "background" : {
        "scripts" : [
            "background.js"
        ]
    },
    "content_scripts": [{
            "js": [ "content.js" ],
            "matches": [ "<all_urls>" ]
    }],
    "icons": {
         "16": "logo/icon_small.png",
         "64": "logo/icon.png"
    },
    "permissions" : [
        "https://*.ourdomain.in/*",
        "activeTab",
        "gcm",
        "storage",
        "notifications",
        "identity",
        "contextMenus",
        "tabs",
        "idle"
    ],
    "externally_connectable": {
        "matches": ["https://*.ourdomain.in/*"]
    },

    "optional_permissions": ["activeTab", "tabs", "storage", "contextMenus", "*://*.ourdomain.in/*"],

    "content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'",
    "web_accessible_resources": [
        "corner.css",
        "js/init.js",
        "content.js",
        "js/jquery.min.js",
        "js/taggle.min.js",
        "js/typeahead.bundle.min.js",
        "ext.html.js",
        "assets/*"
    ], 
 "commands": {
         "_execute_browser_action": {
             "suggested_key": {
                 "default": "Ctrl+Shift+S",
                 "mac": "Command+Shift+S"
             },
             "description": "Send a link to DOMAIN!"
         }
     }
}

下面是在扩展按钮的点击事件处理程序中实现的权限请求代码。

chrome.browserAction.onClicked.addListener(function (tab) {
     var reqPerm = {
        permissions: ["activeTab", "tabs", "storage", "contextMenus"],
        origins: ['https://ourdomain.in/']
     };
    
     chrome.permissions.request(reqPerm, function (granted) {
        if (granted) {
            return go(tab.url);
        } else {
            console.log("Requested not granted.");
            chrome.tabs.sendMessage(tabID, { action: 'signin', text: 'Please allow stash.ai to proceed.' });
        }
    });
});

在这里,我可以看到“隐私”对话框,我确实按下了 Allow for the Day

现在,如果我在 Safari > 首选项 > 网站 > 存储扩展中看到,我可以清楚地看到 ourdomain.in -> Allowed,这证明我相信提示按预期工作。

仍然在打开新选项卡进行身份验证时,执行上述 chrome.tabs.onUpdate 的代码并给出 tab.url = ''。当 Allow for Every website 开启时,这绝对有效。

还有一件事是,当我打开 https://ourdomain.in 时,我的扩展程序图标仍然显示为已禁用,并且在单击该图标时它再次询问我的权限。如果在此选项卡上,我允许,一切都会顺利。

因此,如果我必须从选项卡手动授予权限,chrome.permissions.request() 是没有用的。

请在这里让我知道任何建议。

答案很简单,我必须改变我的 reqPerm 喜欢,

var reqPerm = {
        permissions: ["activeTab", "tabs", "storage", "contextMenus"],
        origins: ['https://ourdomain.in/*']
     };

因此 ourdomain.in 中的每个端点都有效。