chrome插件的一些知识点

关于 chrome 插件的一些知识点:

manifest.json 文件

这个是写 chrome 插件的主要方法 就是需要这个配置文件 是一个入口

{
  "name": "test-cookie-check",
  "version": "1.0",
  "description": "联调cookie检测",
  "manifest_version": 2,
  // 前面这几个主要是插件的一些信息描述
  "permissions": ["declarativeContent", "activeTab"],
  //permissions 是当我们使用chrome上的某一写功能是需要在这里开启权限 background文件中使用了declarativeContent 并且添加了一些规则 这些规则需要和 activeTab 一起使用 所以也要开启 activeTab权限
  "background": {
  // 扩展常常用一个单独的长时间运行的脚本来管理一些任务或者状态 background-背景页
  // 背景页是一个运行在扩展进程中的HTML页面。它在你的扩展的整个生命周期都存在,同时,在同一时间只有一个实例处于活动状态。
  // 在一个有背景页的典型扩展中,用户界面(比如,浏览器行为或者页面行为和任何选项页)是由沉默视图实现的。当视图需要一些状态,它从背景页获取该   状态。当背景页发现了状态改变,它会通知视图进行更新。
  // 背景页一般不需要html 只需要在scripts中添加js文件即可
  // 需要背景页可以添加page字段: eg: page:"background.html"
    "scripts": ["background.js"],
    "persistent": false
  },
  "page_action": {
    "default_popup": "popup.html",
    "default_icon": {
      "16": "assets/logo.png",
      "32": "assets/logo.png",
      "48": "assets/logo.png",
      "128": "assets/logo.png"
    }
  },
  "icons": {
    "16": "assets/logo.png",
    "32": "assets/logo.png",
    "48": "assets/logo.png",
    "128": "assets/logo.png"
  }
}

  • chrome 插件:

Chrome 浏览器扩展的架构:不可视的 background 页面、可视页面、Google Chrome 扩展与 Web 页面/服务器之间的交互、使用 chrome.* API、 Google Chrome 扩展中的页面之间的数据通信

  • browser actions 这样的 Google Chrome 扩展可以适用于任何页面。图标往往位于浏览器地址栏外右侧。点击图标将弹出窗口。

  • page actions,这样的 Google Chrome 扩展只能作用于某一页面,当打开该页面时触发该 Google Chrome 扩展,关闭页面则 Google Chrome 扩展也随之消失。图标往往位于浏览器地址栏内右端。

  • 关于 background 字段的配置说明:

在 Manifest 中指定 background 域可以使扩展常驻后台。 background 可以包含三种属性,分别是 scripts、page 和 persistent。

如果指定了 scripts 属性,则 Chrome 会在扩展启动时自动创建一个包含所有指定脚本的页面;如果指定了 page 属性,则 Chrome 会将指定的 HTML 文件作为后台页面运行。通常我们只需要使用 scripts 属性即可,除非在后台页面中需要构建特殊的 HTML——但一般情况下后台页面的 HTML 我们是看不到的。persistent 属性定义了常驻后台的方式——当其值为 true 时,表示扩展将一直在后台运行,无论其是否正在工作;当其值为 false 时,表示扩展在后台按需运行,这就是 Chrome 后来提出的 Event Page。Event Page 可以有效减小扩展对内存的消耗,如非必要,请将 persistent 设置为 false。persistent 的默认值为 true 也就是我们在 background.js 中添加的一些规则 就是为了在满足这些规则的时候才运行扩展

  • 关于 page_action 字段的说明:

Page Action 类型的 Google Chrome 浏览器扩展程序,通常也会有一个图标,但这个图标位于 Chrome 浏览器的地址栏内右端。而且这个图标并非始终出现,而是当某指定的页面打开时才会出现。也就是说,这个图标与当前打开的页面有关,只有打开了指定的页面才会显示该图标,对该页面执行对应的操作

如果定义 pageAction 类型的插件 需要在 manifest 文件进行以下配置:

{
  ...
        "page_action": {
          "default_icon": {                    // optional
            "19": "images/icon19.png",           // optional
            "38": "images/icon38.png"            // optional
          },
          "default_title": "Google Mail",      // optional; shown in tooltip
          "default_popup": "popup.html"        // optional
        },
        ...
      }

这个其实就是在我们点击拓展程序的按钮是所弹出来的内容 popup.html 这个就是弹窗的 html 页面 可以在这个页面中引入 js 代码 js 代码中则用于实现我们插件的功能:

popup.js 文件
function autoAssignSubTasks() {
  const code = `(${function() {
    function hasCookie(sKey) {
      return new RegExp(
        "(?:^|;\\s*)" +
          encodeURIComponent(sKey).replace(/[-.+*]/g, "\\$&") +
          "\\s*\\="
      ).test(document.cookie);
    }
    const checkTime = 10 * 1000;
    const toast = message => {
      const dom = document.createElement("div");
      const toast = document.createElement("span");
      toast.innerHTML = message;
      dom.appendChild(toast);

      dom.style.position = "fixed";
      dom.style.left = "6px";
      dom.style.top = "6px";
      dom.style.display = "flex";
      dom.style.justifyContent = "center";
      dom.style.alignItems = "center";
      dom.style.zIndex = "9999";

      toast.style.minWidth = "250px";
      toast.style.padding = "10px";
      toast.style.fontSize = "12px";
      toast.style.fontWeight = "bolder";
      toast.style.color = "#0c5460";
      toast.style.backgroundColor = "rgba(209, 236, 241, 0.8)";
      toast.style.borderRadius = "10px";

      document.body.appendChild(dom);
      const destroy = () => document.body.removeChild(dom);
      return destroy;
    };
    let destroyToast;
    setInterval(() => {
      if (hasCookie("local_debug_ip")) {
        destroyToast = toast("请记得在联调完毕后删除 local_debug_ip cookie");
      } else {
        if (destroyToast) {
          destroyToast();
          destroyToast = undefined;
        }
      }
    }, checkTime);
  }})()`;

  chrome.tabs.query({ active: true, currentWindow: true }, function(tabs) {
    chrome.tabs.executeScript(tabs[0].id, {
      code
    });
  });
}

autoAssignSubTasks();

  • chrome.tabs:

使用 chrome.tabs API 与浏览器的标签页系统交互。
您不需要在扩展程序的清单文件中声明任何权限就能使用 chrome.tabs 的大多数方法和事件。然而,如果您需要访问 Tab 的 url、title 或 favIconUrl 属性,您必须在清单文件中声明 "tabs" 权限 所以才在我们的文件中没有定义

  1. 关于标签页的几个属性:
  • active ( boolean )
    标签页是否是窗口中的活动标签页。(窗口不一定有焦点。)

  • id ( integer )
    标签页的标识符。标签页的标识符在浏览器会话中唯一。

  • index ( integer )
    标签页在所在窗口中的索引,从 0 开始。

  1. 标签页的方法:
  • query

chrome.tabs.query(object queryInfo, function callback)

获取具有指定属性的所有标签页,如果没有指定任何属性的话则获取所有标签页。

queryInfo 可以传递任意标签页属性来进行标签页的选取

回调函数的参数就是标签对象

  • executeScript

chrome.tabs.executeScript(integer tabId, InjectDetails details, function callback)

该标签页需要运行的代码:

details 是一个对象 有一个 code 属性 值为字符串 也就是需要执行的 js 代码的字符串

background.js 文件

"use strict";

const host = ".xxx.com";

chrome.runtime.onInstalled.addListener(function() {
chrome.declarativeContent.onPageChanged.removeRules(undefined, function() {

    chrome.declarativeContent.onPageChanged.addRules([
      {
        conditions: [
          new chrome.declarativeContent.PageStateMatcher({
            pageUrl: { urlContains: host }
          })
        ],
        actions: [new chrome.declarativeContent.ShowPageAction()]
      }
    ]);

});
});

  • declarativeContent

声明式内容 API 允许您根据网页的 URL 和它的内容匹配的 CSS 选择器来显示您的扩展程序的页面按钮,而不需要拥有主机权限或插入内容脚本。为了在用户单击您的页面按钮后能够与网页交互,请使用 activeTab 权限。

作为一种声明式 API,该 API 让您在 onPageChanged 事件对象上注册规则,当一系列由 PageStateMatcher 表示的条件满足时执行某个操作(目前只有 ShowPageAction)

eg:
当且仅当列出的所有条件都满足时,PageStateMatcher 才会匹配网页。当 https://www.google.com/ 上的页面存在密码字段时,以下规则将为该页面显示页面按钮 也就是扩展程序的按钮


var rule1 = {
  conditions: [
    new chrome.declarativeContent.PageStateMatcher({
    pageUrl: { hostEquals: 'www.google.com', schemes: ['https'] },
    css: ["input[type='password']"]
    })
  ],
  actions: [ new chrome.declarativeContent.ShowPageAction() ]
};

添加多个规则:
eg:
如果要为包含视频的网站显示页面按钮,您可以添加第二个条件,每一个条件都足以触发所有指定的操作:


var rule2 = {
  conditions: [
    new chrome.declarativeContent.PageStateMatcher({
    pageUrl: { hostEquals: 'www.google.com', schemes: ['https'] },
    css: ["input[type='password']"]
    }),
    new chrome.declarativeContent.PageStateMatcher({
    css: ["video"]
    })
  ],
  actions: [ new chrome.declarativeContent.ShowPageAction() ]
};

添加的规则在浏览器重新启动后也将保留,所以请按照下面的方式注册它们


chrome.runtime.onInstalled.addListener(function(details) {
  chrome.declarativeContent.onPageChanged.removeRules(undefined, function() {
  chrome.declarativeContent.onPageChanged.addRules([rule2]);
  });
});

也就是我代码里写的那种方式
您一定要批量注册或取消注册规则,而不是一个一个地进行,因为每一次这样的操作都会重新创建内部的数据结构,这一重新创建的过程需要大量的计算,但是利用了一种更快的匹配算法。

  • 对于 url 的匹配 可以使用 pageUrl:{hostEquals/urlContains} 前者的 url 需要完全一致 后者只需要包含就可以了

  • 对于 pageUrl 的匹配规则可以看这里 UrlFilter

  • ShowPageAction

声明式事件操作,当相应的条件满足时显示扩展程序的 页面按钮。使用该操作不需要主机权限,但是扩展程序必须要有页面按钮。如果扩展程序拥有 activeTab 权限,单击页面按钮就会授予对活动标签页的访问权限。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,830评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,992评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,875评论 0 331
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,837评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,734评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,091评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,550评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,217评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,368评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,298评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,350评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,027评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,623评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,706评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,940评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,349评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,936评论 2 341

推荐阅读更多精彩内容