这是我第一次制作Chrome扩展程序的经验,说实话,我对JS不太熟悉。
persistent: false
,declarativeContent
和pageStateMatcher
API调用和权限而不是标签和/或完整。 当网页包含除二级域名以外的任何内容时,我需要显示pageAction
图标,但co.uk等外来物品除外:
☐google.com - 2lvl域名
☐bbc.co.uk - 异域3lvl域相当于2lvl域
☑images.google.com - 3lvl域
☑google.com/ search - 包含路径的2lvl域
☑news.bbc.co.uk - 异域4lvl域相当于3lvl域
☑bbc.co.uk/ article - 异域3lvl域,路径相当于带路径的2lvl域
我需要隐藏pageAction
与上述条件相反。
pageAction
更新网址来执行操作,方法是修剪除二级域名以外的任何内容。 我还在检测部分工作,计划在完成此部分后添加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}
如何嵌套/ &amp;&amp; 条件?
我如何!条件?
条件和事件似乎不是布尔值,因此逻辑运算符似乎不会对它们起作用
我应该抛弃API并使用JS RegExp吗?
我可以在没有预先标签的情况下更新URL吗?
我很茫然 任何指导都将非常感谢。
P.S。
我只是尝试使用这个规则集与更强大的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
无论。
它永远无处不在。
没有隐藏规则,调试时没有错误。
P.P.S。
有点像谷歌的模板重写了整个事情:
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() ]
}
]);
});
});
仍然得到所有可能的假阳性。
P.P.P.S。
RE2糟透了!
我会用更多的JS尝试tabs
。
答案 0 :(得分:2)
RE2被证明是一种功能失调的灾难 一些Chrome API被证明是适得其反的可憎行为。
使用tabs
提交可以提供更多JS灵活性,与纯API(+ RE2)相比,它实际上有效。
无论如何都要对外观进行处理 - 它们是对“常规”正则表达的有力补充,但强大的力量带来了很大的责任。
基本的扩展功能已经到位
计划“异国情调”的域名和一些眼圈调整。
感谢@Xan提供的信息和建议 如果有人对这个小项目感到好奇 - 你可以在https://bitbucket.org/Erquint/website_home_button_extension_for_chrome
查看