Chrome浏览器扩展开发系列之三:Google Chrome浏览器扩展的架构

1) 不可视的background页面javascript

Google Chrome扩展每每包含一个不可见的background页面,Google Chrome扩展的主要业务逻辑都位于此。有两种类型的background 页面,一种是persistent background pages,另外一种是event pages。Persistent background pages持续运行,随时可访问。而Event pages是事件驱动运行的,只有在事件发生的时候才能够访问。java

Persistent background pages默认加载入内存,持续运行在后台。在manifest.json文中注册Persistent background page以下:chrome

{json

"background": {跨域

"scripts": [myBackgroundPage.js],数组

"persistent": true浏览器

]服务器

}并发

Event pages默认是不加载的,只在事件发生时加载并运行。触发加载Event pages的场景以下:异步

· Google Chrome扩展第一次被安装或升级到新版本

· 发生了Event pages监听的事件

· content script或其余Google Chrome扩展发出了一个message

· Google Chrome扩展中的其余页面调用了chrome.runtime.getBackgroundPage()方法

Google Chrome扩展经过chrome.runtime.onInstalled.addListener(onInit)要求监听onInstalled事件,Chrome浏览器跟踪当前发生的全部事件。一旦被监听的事件发生,Chrome浏览器就会加载Event pages。

若是Google Chrome扩展经过removeListener取消了对某事件的监听,则该事件发生时Chrome浏览器也不会加载Event pages。

当事件再也不被监听器引用后卸载以释放内存并发出chrome.runtime.onSuspend事件。

在manifest.json文中注册Event page以下:

{

"background": {

"scripts": [myEventPage.js],

"persistent": false

]

}

2) 可视页面

Google Chrome扩展能够彻底运行在后台,也能够为用户提供可视界面。Google Chrome扩展最经常使用的可视界面为以下两种形式(二者是互斥的):

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

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

此外,Google Chrome扩展还支持其余的可视界面:

· context menu,右键菜单

· options 页面,Google Chrome扩展能够有一个options 页面,支持用户定制Chrome扩展的运行参数。

· override页面,Google Chrome扩展中的override页面能够替换浏览器中打开的默认页面,如标签管理器页面chrome://bookmarks、浏览历史记录页面chrome://history或新建Tab页面chrome://newtab。不过,一个Google Chrome扩展只能替换一个默认页面。

· 经过chrome.tabs.create()或window.open()打开的页面

3) Google Chrome扩展与Web页面/服务器之间的交互

· 经过content scripts,能够实现Google Chrome扩展与用户打开的Web页面之间的交互。

· 经过跨域的 XMLHttpRequest,能够实现Google Chrome扩展与其余服务器之间的交互。

content scripts是一组JavaScript文件,运行在浏览器当前打开的页面的上下文中,能够读取并修改当前打开的页面DOM结构。事实上,content scripts能够被看做是当前打开的页面的组成部分。

4) 使用chrome.* API

Google Chrome扩展除了使用javascript的通用标准API以外,还可使用Chrome浏览器专有的API(称为chrome.* API).

不过,大多数chrome.* API都是异步调用,调用以后当即返回而不等待调用结果,因此对chrome.* API的调用每每都须要一个回调函数做为参数以处理调用结果。

固然,也有少许chrome.* API是同步调用。这样的chrome.* API每每都有一个返回类型,也无需回调函数做为参数。

5) Google Chrome扩展中的页面之间的数据通讯

Google Chrome扩展中的不一样页面之间每每要通讯,以调用彼此方法共享数据。因为一个Google Chrome扩展中的全部页面都运行于同一个进程中的同一个线程,因此各个页面能够经过必定的方法直接调用。

如经过chrome.extension.getViews()得到全部可视页面的window对象的数组,经过chrome.extension.getBackgroundPage()得到不可视的background页面的window对象。经过页面的window对象就能够对页面的DOM进行任何操做。

相关文章
相关标签/搜索