在Google Chrome扩展程序API

时间:2015-05-30 14:32:23

标签: javascript regex google-chrome-extension

这是我第一次制作Chrome扩展程序的经验,说实话,我对JS不太熟悉。

  • 如果这是一个选项,我想在原始JS上使用persistent: falsedeclarativeContentpageStateMatcher 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

1 个答案:

答案 0 :(得分:2)

RE2被证明是一种功能失调的灾难 一些Chrome API被证明是适得其反的可憎行为。

使用tabs提交可以提供更多JS灵活性,与纯API(+ RE2)相比,它实际上有效。
无论如何都要对外观进行处理 - 它们是对“常规”正则表达的有力补充,但强大的力量带来了很大的责任。
基本的扩展功能已经到位 计划“异国情调”的域名和一些眼圈调整。

感谢@Xan提供的信息和建议 如果有人对这个小项目感到好奇 - 你可以在https://bitbucket.org/Erquint/website_home_button_extension_for_chrome

查看