[英]Hide pageAction with declarativeContent in Google Chrome extension API
这是我第一次制作Chrome扩展程序,老实说,我对JS不太熟悉。
persistent: false
, declarativeContent
和pageStateMatcher
API调用和权限,而不是使用选项卡和/或在原始JS上完全pageStateMatcher
如果可以的话)。 当URL包含除二级域名以外的任何内容时,我需要显示pageAction
图标,但co.uk之类的外来pageAction
除外:
☐google.com— 2lvl域
☐bbc.co.uk—等同于2lvl域的异国3lvl域
☑images.google.com— 3lvl域
☑google.com/ search-具有路径的2lvl域
☑news.bbc.co.uk—等同于3lvl域的异国4lvl域
☑bbc.co.uk/ article —具有路径的等效3lvl域等于具有路径的2lvl域
我需要为上述情况的相反方向隐藏pageAction
。
pageAction
进行的操作来通过修剪除第二级域以外的任何内容来更新URL。 我仅在检测部分工作,打算在完成此部分后添加URL更新功能。
manifest.json
{
// Required
"manifest_version": 2,
"name": "Website Home Button",
"version": "0.1",
// Recommended
"description": "Icon made by Freepik from www.flaticon.com is licensed by CC BY 3.0",
"icons": {
"48": "icon48.png",
"128": "icon128.png"
},
// PageAction
"page_action": {
"default_icon": {
"19": "icon19.png",
"38": "icon38.png"
},
"default_title": "Website Home Button" //Tooltip
},
// Optional
"author": "Murad 'Erquint' Beybalaev",
"background": {
"scripts": ["background.js"],
// Recommended
"persistent": false
},
"minimum_chrome_version": "18",
"permissions": ["declarativeContent"]
}
background.js
// Update the declarative rules on install or upgrade.
chrome.runtime.onInstalled.addListener(function() {
chrome.declarativeContent.onPageChanged.addRules([{
conditions: [
// URL is not a 2lvl domain...
new chrome.declarativeContent.PageStateMatcher(
{
pageUrl: {urlMatches: "[^.]+?\..+?(\.|\/).*"}
}
),
//Hostname is not a 3lvl .uk domain
!(new chrome.declarativeContent.PageStateMatcher(
{
pageUrl: {hostSuffix: ".uk"}
}
))],
// ... show the page action.
actions: [new chrome.declarativeContent.ShowPageAction() ]
}]);
});
//[^.]+?\..+?(\.(?!uk)|\/).*
//(?<=\.)(.+?\..+)
在底部,您可以看到我将用于检测和修整的正则表达式,但是pageStateMatcher
使用RE2进行正则表达式,并且它不支持环视(整个API对我来说适得其反),所以我决定使用hostSuffix
条件结合在一起,但为了上帝的爱,我不明白如何在这些条件下工作。
如果要遵循RE2约束,我需要的逻辑是(伪代码)
if(
//URL contains more than just a 2nd-level domain
urlMatchRegExp("[^.]+?\..+?(\.|\/).*")
//AND URL isn't an exotic .uk 3rd-level domain.
&& !urlMatchRegExp("([^.]+?\.){2}uk"))
{pageAction.show}
else
{pageAction.hide}
我如何嵌套/ &&条件?
我该怎么办! 条件?
条件或事件似乎不是布尔值,因此逻辑运算符似乎对它们不起作用。
我应该放弃API并使用JS RegExp吗?
是否可以在没有制表符权限的情况下更新URL?
我很茫然。
任何指导将不胜感激。
聚苯乙烯
我只是尝试将此规则集与功能更强大的RegExp结合使用,但仍然没有环顾四周:
[{
conditions: [
//URL is not a 2lvl domain...
new chrome.declarativeContent.PageStateMatcher(
{
pageUrl: {urlMatches: "^[^.]+?\..+?(\.[^uk]|\/).*$"}
}
)],
// ... show the page action.
actions: [new chrome.declarativeContent.ShowPageAction() ]
},{
conditions: [
//URL is not a 2lvl domain...
new chrome.declarativeContent.PageStateMatcher(
{
pageUrl: {urlMatches: "^[^.]+?\.[^\.|\/]+?(\.uk)??$"}
}
)],
// ... show the page action.
actions: [new chrome.declarativeContent.HidePageAction() ]
}]
但是事实证明没有chrome.declarativeContent.HidePageAction()
。
不满足条件时是否应该自动隐藏?
我们试试吧。
嗯,事实并非如此。
我正在尝试上面的无隐藏规则,并且在任一规则上都显示
example.com
www.example.com
example.com/index.html
www.example.com/index.html
而不管。
到处都是永久的。
尽管没有隐藏规则,调试中也没有错误。
PPS Kinda按照Google的模板重写了整个过程:
background.js
chrome.runtime.onInstalled.addListener(function() {
chrome.declarativeContent.onPageChanged.removeRules(undefined, function() {
chrome.declarativeContent.onPageChanged.addRules([
{
conditions: [
new chrome.declarativeContent.PageStateMatcher({
pageUrl: {urlMatches: "^[^.]+?\..+?(\.[^uk]|\/).*$"},
})
],
actions: [ new chrome.declarativeContent.ShowPageAction() ]
}
]);
});
});
仍然得到所有可能的假阳性。
聚苯硫醚
RE2太烂了!
我将尝试使用更多JS的tabs
。
RE2被证明是功能失调的灾难。
某些Chrome API被证明是适得其反。
使用tabs
权限可以提高JS的灵活性,并且与纯API(+ RE2)相比,它实际上可以工作。
无论如何都解决了环视问题-它们是“常规”正则表达式的有力补充,但强大的功能带来了巨大的责任。
基本扩展功能已经到位。
计划“异国情调”域名和一些令人眼花dy乱的调整。
感谢@Xan提供的信息和建议。
如果有人对这个小项目感到好奇,可以在https://bitbucket.org/Erquint/website_home_button_extension_for_chrome中查看
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.