我有一个工作的跨平台扩展,我使用xcrun safari-web-extension-converter PATH
将其转换为Safari扩展的目标是将任何URL添加到我的网站帐户中(https://ourdomain.in)
我的扩展程序在Chrome上运行得很好,但在Safari版本上,如果用户允许访问每个网站,一切都会很好。
问题是,即使我有合适的optional_permissions
,并使用chrome.permissions.request()
方法请求用户同意我们的domain.in,并且我们看到用户允许访问,但tab.url
每次对chrome.tabs.onUpdated
都是空的。
详细情况如下,当用户按下扩展按钮时,我们通过将我们的网站URL打开到另一个选项卡来检查用户是否登录到其帐户。
var openSignin = function openSignin() {
console.log('hey');
chrome.tabs.create({ url: _config.baseURL + '?extension=1', active: false });
};
当这个AUTH选项卡被加载时,以下方法将被调用,就像在Chrome中发生的那样,它依次提取任何用户登录我们的网站时生成的公共和私有令牌。
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.' });
}
});
});
在这里,我可以看到"隐私"对话框,并按允许一天。
现在,如果我在Safari>首选项>网站>Stash Extension,我清楚地看到了ourdomain.in
->我相信Allowed
证明了它的及时性。
仍然当打开新的选项卡进行验证时,执行上述用于chrome.tabs.onUpdate
的代码并给出tab.url = ''
。当允许每个网站打开时,这肯定有效。
另一件事是,当我打开https://ourdomain.in
时,我的扩展图标仍然显示为禁用,单击该图标时,它会再次向我请求权限。如果在这个选项卡上,我确实允许,一切都会顺利进行。
因此,如果我必须手动从选项卡授予权限,chrome.permissions.request()
是没有用的。
请告诉我这里的任何建议。
答案很简单,我必须更改我的reqPerm
,比如
var reqPerm = {
permissions: ["activeTab", "tabs", "storage", "contextMenus"],
origins: ['https://ourdomain.in/*']
};
因此,我们domain.in中的每个端点都有效。