初识WebExtensions

WebExtension是一个打包好的、可供发布的安装包,该安装包中包含若干文件,主要用于跨浏览器开发附加组件的工具。

火狐自45版本开始全面支持WebExtension开发浏览器扩展,并逐渐边缘化XPCOM 和 XUL,预计到2017年,WebExtension将成为火狐唯一合法的扩展开发方式。

用了火狐很多年,一直没了解过其扩展开发流程,这次正好简单熟悉一下。

WebExtension扩展必须包含一个名为manifest.json的文件,文件内包含有关扩展的基本元数据,例如它的名称,版本和它需要的权限。它也提供了指向扩展需要的其他文件。这也是之后通过about:debugging测试所需添加的唯一文件。

manifest.json可以指向以下几种类型的文件:

初识WebExtensions_第1张图片
111.png

我们今天要做一个简单的插件,能实现以下功能:

1.在工具栏增加了一个新的按钮

2.当用户点击该按钮,我们会显示弹出使他们能够选择一种动物。

3.一旦他们选择的动物,我们将取代当前页面的与所选动物的图片内容。

根据需求,我们可以得出插件的结构图:

初识WebExtensions_第2张图片
222.png

首先编写最重要的manifest.json文件

{

  "manifest_version": 2,
  "name": "Beastify",
  "version": "1.0",

  "description": "添加一个可以通过点击选择更换页面内容的插件",
  "icons": {
    "48": "icons/48.png"
  },

  "permissions": [
    "activeTab"
  ],

  "browser_action": {
    "default_icon": "icons/32.png",
    "default_title": "Beastify",
    "default_popup": "popup/choose_beast.html"
  },

  "web_accessible_resources": [
    "beasts/frog.jpg",
    "beasts/turtle.jpg",
    "beasts/snake.jpg"
  ]
![333.png](http://upload-images.jianshu.io/upload_images/3931549-6efbc97b34e64c13.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)


}

其中参数manifest_version,name和version这三个参数都是必填的:
manifest_version 必填,值固定为2,额,你使用的版本就是第二代,总不能填3吧^ v ^
name 必填,是你插件的名字,这个随便你取,到时候显示在浏览器上的就是这个名字
version 必填,是你插件的版本,看你自己的情况定。
description 选填,是对你插件功能的描述
icons 选填,是插件的图标,注意,这里定义的图标是显示在附加组件里面的,而不是工具栏上的,一般默认大小是48x48

permissions是设置列表权限的,这里我们只需要简单的actionTab功能即可

browser_action是对工具栏操作的具体描述:
default_icons 必填,展示在工具栏上的图标,一般大小为32x32
default_title 选填,鼠标悬停在图标上显示名字
default_popup用于点击插件按钮后展示的页面,在这里必填,如果只有一个功能可以不填(即点击即用)

web_accessible_resources列出了我们要替换网页的文件,在这里必填

有了manifest.json文件后,我们就可以对所需文件进行一一配置。
在同目录下,创建beasts,icons,popup这三个文件夹,分别用于存放用于替换的动物图片,48和32两类插件图标和插件的操作界面
创建完后大概像这样:

初识WebExtensions_第3张图片
333.png

动物图和图标就大家自己去弄了哈,把自己喜欢的图片添加进去就行了,但是注意哦,插件图标的大小是48和32两种格式哦,当然,在附加组件里面的图标可以使用96x96的。
这里我们再来说说popup这个文件,里面存放的就是我们插件的操作界面
你可以根据自己的喜好设计,因为只是测试,就怎么简单怎么来啦!我反正就用了简单的三个文件。

初识WebExtensions_第4张图片
444.png

HTML文件看起来是这样的:




  
    
    
  

  
    
Frog
Turtle
Snake

CSS加了点颜色和光标选择变化:

html, body {
  width: 100px;
}

.beast {
  margin: 3% auto;
  padding: 4px;
  text-align: center;
  font-size: 1.5em;
  background-color: #E5F2F2;
  cursor: pointer;
}

.beast:hover {
  background-color: #CFF2F2;
}

js则是点击选项后跳转到具体操作的脚本文件:

/*
给定一个动物的名字,得到相应的图像的网址
*/
function beastNameToURL(beastName) {
  switch (beastName) {
    case "Frog":
      return browser.extension.getURL("beasts/frog.jpg");
    case "Snake":
      return browser.extension.getURL("beasts/snake.jpg");
    case "Turtle":
      return browser.extension.getURL("beasts/turtle.jpg");
  }
}

/*
监听鼠标点击事件
如果点击了动物的名字
就给beastify.js发送一个消息根据点击的内容选择相应的图片
如果没有点击列表中的内容
If it's on a button wich contains class "clear":
  Reload the page.
  Close the popup. This is needed, as the content script malfunctions after page reloads.
*/
document.addEventListener("click", (e) => {
  if (e.target.classList.contains("beast")) {
    var chosenBeast = e.target.textContent;
    var chosenBeastURL = beastNameToURL(chosenBeast);

    browser.tabs.executeScript(null, {
      file: "/content_scripts/beastify.js"
    });

    var gettingActiveTab = browser.tabs.query({active: true, currentWindow: true});
    gettingActiveTab.then((tabs) => {
      browser.tabs.sendMessage(tabs[0].id, {beastURL: chosenBeastURL});
    });
  }
  else if (e.target.classList.contains("clear")) {
    browser.tabs.reload();
    window.close();
  }
});

创建一个新的目录下的附加根,被称为“content_scripts”,并创建一个新的文件叫“beastify.js”,这个文件用于处理choose_beast.js传来的信息

/*
beastify():
* 移除页面中的节点
* 插入选择的图片
* 然后让自己成为监听对象
*/
function beastify(request, sender, sendResponse) {
  removeEverything();
  insertBeast(request.beastURL);
  browser.runtime.onMessage.removeListener(beastify);
}

/*
移除页面中的节点
*/
function removeEverything() {
  while (document.body.firstChild) {
    document.body.firstChild.remove();
  }
}

/*
分配一个url给图片,
设置图片的各类参数 ,
最后把配置好的节点插入其中
*/
function insertBeast(beastURL) {
  var beastImage = document.createElement("img");
  beastImage.setAttribute("src", beastURL);
  beastImage.setAttribute("style", "width: 100vw");
  beastImage.setAttribute("style", "height: 100vh");
  document.body.appendChild(beastImage);
}

/*
Assign beastify() as a listener for messages from the extension.
*/
browser.runtime.onMessage.addListener(beastify);

这样就大概完成了这个插件,如果要测试可以在浏览器中输入:about:debugging

会出现以下界面:


初识WebExtensions_第5张图片
555.png

点开临时加载附加组件然后选择manifest.json这个文件


初识WebExtensions_第6张图片
666.png

选择打开就可以看到自己附加组件里面多出了自己开发的插件。
777.png

如果想要其他人使用你的插件,你需要打包,并将其提交给Mozilla签名。有了证书之后,就可以和大家分享你的成果了!

本文的内容均根据Mozilla的官方教程而来,如果想要深入学习的,可以多花花时间去看看哦,附上链接:
https://developer.mozilla.org/en-US/

你可能感兴趣的:(初识WebExtensions)