初识WebExtensions

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

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

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

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

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

111.png

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

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

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

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

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

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两类插件图标和插件的操作界面
创建完后大概像这样:

333.png

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

444.png

HTML文件看起来是这样的:

<!DOCTYPE html>

<html>
  <head>
    <meta charset="utf-8">
    <link rel="stylesheet" href="choose_beast.css"/>
  </head>

  <body>
    <div class="beast">Frog</div>
    <div class="beast">Turtle</div>
    <div class="beast">Snake</div>

    <script src="choose_beast.js"></script>
  </body>

</html>

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

会出现以下界面:


555.png

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


666.png

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

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

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

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

推荐阅读更多精彩内容