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 中的每个端点都有效。
我有工作的跨平台扩展,我使用 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 中的每个端点都有效。