资源描述
xx农业大学理学院本科毕业论文
基于chrome浏览器插件扩展开发
摘要
Chrome浏览器高安全性的沙盒技术、多进程技术、隐身模式、快速高效的浏览体验吸引了大量用户。Chrome扩展可以提升用户体验,乃至解决一些使用过程中遇到的实际问题。本文介绍Chrome浏览器的进程与线程模型解析,对浏览器的框架也做出了一定的分析。Chrome浏览器基于HTML的扩展开发方式极大地方便了开发人员。本文是一显示图片和文字为例的chrome浏览器插件扩展开发,介绍了Chrome扩展的开发流程,并结合Ajax技术增强了特性。扩展插件增加了浏览器的功能,使得浏览器趋向便捷,个性化。扩展插件的开发也必定成为各大浏览器厂商竞争的方向,了解和编写插件扩展显得十分必要。
本文首先介绍了插件扩展开发的相关辅助知识,这对于chrome浏览器的扩展插件的开发具有指导意义,然后着重介绍了chrome浏览器的框架和插件的机构使得插件的开发原理清晰明了,最后介绍了运用Ajax技术的插件实例和解决插件开发过程中面临的一些常见问题的讲解。本文的简单研究chrome浏览器的插件开发,有助于初学者的学习。
关键字:chrome 浏览器 ; 插件 ; Ajax
Based on the chrome browser plug-inextension development
Abstract
Chrome Browser security sandbox technology, process technology, more stealth mode,fast and efficient browsing experience attracts a large number of users.Chrome extensions can enhance the user experience,and solve some practical problems encountered during use.This article describes the process and thread Model Analysis of the chrome browser,the browser frame is also made some analysis.Extension of the chrome browser is based on HTML development mode greatly simplifies developer.This is a display image and text,for example chrome browser plug-inextension Development,introduced the chrome extension development process,and AJAX technologies with enhanced features.Extensions in crease the capabilities of the browser,making his bangs.
This article first describes the plug-inextensions related to the development of secondary knowledge,the development of extensions for chrome browser with a guide,and then focus on the framework of the chrome browser and plug-in makes it easy to develop the structure of the principle of clarity,and finally describes the plug-in instance by using AJAX technology,and solve some of the frequently asked questions about plugin development process.Study on the simple chrome browser plug-in development of this article,helps beginners learn.
Keywords:chrome browser ; pulg-inextentsion ; Ajax
目录
1 绪论 4
1.1 本文研究目的 4
1.2 Chrome浏览器扩展插件与实现技术 4
1.3 本文主要内容 5
2 浏览器发展与现状 6
2.1浏览器简介 6
2.2 浏览器发展历程 6
2.3 浏览器分类 6
2.4 chrome浏览器简介 7
2.5 插件开发 7
3 插件开发环境 8
3.1 为什么是chrome浏览器 8
3.2 chrome插件开发环境 8
4 开发语言简介 9
4.1 java script语言 9
4.2 HTML语言 9
5 Chrome的详解与插件结构 11
5.1 chrome浏览器 11
5.2 chrome浏览器的特点[15] 11
5.2.1高速程序启动快,载入网页快 11
5.2.2简单高效、易用性的设计 11
5.2.3样式 11
5.2.4多进程及多线程模型 11
5.2.5搜索简洁 11
5.3 chrome浏览器内核 11
5.4 chrome的进程与线程模型 12
5.4.1chrome的进程和线程模型[16] 12
5.5 chrome线程模型 13
5.6 chrome插件结构[17] 14
5.6.1插件组成 14
5.6.2 manifest.json文件 15
5.6.3浏览器插件结构 15
5.7 小结 16
6.3 插件制作 18
6.3 插件安装步骤 19
6.4 小结 22
7 Chrome浏览器插件开发相关问题 23
7.1 如何输出和查看调试信息 23
7.2 Chrome插件开发中文问题解决方法 23
7.3 如何在execute script多个content script文件[19] 23
7.4 插件是否提交 24
7.5小结 24
8 结论 25
8.1 工作总结 25
8.2 论文展望 25
参考文献 26
附录 27
致谢 29
1 绪论
本文对论文涉及的研究领域进行了较为详细的综述。简要介绍了chrome浏览器以及插件开发的研究的目的和意义,给出了chrome浏览器插件开发的原理和主要步聚。在对谷歌浏览器的特点简要概述的基础之上,着重强调了谷歌浏览插件开发的研究暨论文主要研究的内容。
1.1 本文研究目的
21世纪是互联网的时代,社会的个个方面似乎都与互联网离不开,互联网的发展日新月异,对人们的工作方式,交往方式,学习方式的影响越来越大[1]。互联网提高了办事效率,也扩展了人们的想象空间。加上与移动通讯相结合,互联网简直就像“幽灵”一般如影随形,成为人们日常生活须臾不可分离的组成部分。特别是由DOS的交互界面发展到windows图形界面[2],这些拉近与互联网的距离,浏览器作为信息的交互的工具具有不可替代的作用,浏览器的功能多少似乎影响着信息量的多少,所以似乎有必要增加浏览器的功能。本文研究的目的是增加浏览器的扩展功能,实现浏览器的特定的功能以扩展浏览信息量或者实现浏览器特定的基本功能。例如,增加浏览器的计算扩展,增加浏览器的信息存储扩展等。
在高速信息发展的时代似乎准确查找信息是有必要的也是必须的,扩展是解决浏览器信息的抓取的有效解决办法。这并不是不能实现,可以在浏览器增加插件实现特定信息的抓取,例如在浏览器中抓取广告并删除。节省时间,增加阅读性,实现更深层次的浏览器互动是增加插件的目的与意义。本文是实现chrome浏览器插件开发的研究论文,具有指导插件开发的方法,步骤以及遇到的问题。这也是本文研究的目的。
1.2 Chrome浏览器扩展插件与实现技术
Chrome浏览器是谷歌公司的开源项目[3]。Chrome浏览器是2008年发布的新一代浏览器,基于web kit内核和强大v8javascript渲染引擎,以其快速,简洁,安全性很快占据了相当大的市场份额一跃成为全球第二大浏览器。
插件就是扩展浏览器功能的实现某种特定需要的程序[4]。Chrome浏览器插件开发相比于其他浏览器插件开发较容易,具有易于开发的开发者模式,插件的调试较易完成。
Chrome扩展是一个包括HTML文档、CSS、Java script、图片以及其它文件在内的zip压缩包,为浏览器添加某些功能,其本质其实是web页面,可以使用浏览器所提供的所有操作web页面的API,包XML Http Request和JSON等等。Chrome扩展UI分为browser actions和page actions两类,任何Chrome扩展最多只能选择其一。本文是运用Ajax技术实现chrome浏览器插件的开发。Ajax是一种创建交互式网页开发技术,用于快速动态网页的技术,Ajax可以实现式网页实现异步更新,可以在不重新加载整个网页的情况下对网页的某部分进行更新,有很多使用Ajax的应用程序案例:新浪微博,Google地图等。
Chrome浏览器插件的开发是较易于初学者实现的,在实现插件的同时也培养了开发者大量的相关知识,完善插件开发的相关思想,对日后更近一步的发展插件奠定了一定的经验知识。
1.3 本文主要内容
本文是实现chrome浏览器的插件开发。文章讲解chrome浏览器的相关知识,插件开发的环境搭建,插件开发语言,这是本论文的基础知识。chrome浏览器与插件结构知识是本文的核心知识,本文也提供相关的插件开发的样式供读者参考,最后本文简要介绍了在插件开发的过程中所遇到的一些问题并提供了一定的解决办法。本文也存在许多不足之处,本文的研究水平有限仅供初学chrome浏览器插件开发人员参考。
2 浏览器发展与现状
2.1浏览器简介
浏览器[5]是指可以显示网页服务器或者文件系统的HTML文件内容,并让用户与这些文件交互的一种软件。
浏览器主要通过HTTP[6]协议与网页服务器交互并获取网页,这些网页有URL(统一资源定位器)指定,文件格式通常为HTML[7],并有MIME在HTTP协议中指明,其过程就是解释与翻译超文本语言的过程。大部分的浏览器支持除了HTML之外的广泛的格式,如JPEG,PNG,GIF等图像格式,并且能够扩展支持众多的插件(plug-ins),另外,许多浏览器还支持其他的URL类型及其相应的协议,如FTP、Gopher、HTTPS(HTTP协议的加密版本)。HTTP内容类型和URL协议规范允许网页设计者在网页中嵌入图像、动画、视频、声音、流媒体等。
2.2 浏览器发展历程
浏览器的发展过程也就是最近几年快速发展起来了的,浏览器在发展的过程中出现了很多不同种类。第一个web浏览器是在1990年有蒂姆-伯纳斯-李(Tim Bemers-Lee)发明的,刚开此时web浏览器取名为World Wide Web后改名为Nexus,第一个web浏览器的发明与作者的爱好习惯有关,李习惯使用超文本分享资讯,这就促使浏览器的诞生。所以浏览器主要功能就是解释显示超文本文档,可见浏览器的诞生促进了文化,社会,科技的交流。
随着第一浏览器的诞生,各软件公司为抢占市场纷纷推出其各自的浏览器,著名的浏览器之争莫过于就是网景(Netscape)与微软(Windows),网景于1994年10月发布了其旗舰版浏览器,与之同时微软发布了著名的IE浏览器,两家互联网巨头公司在其浏览器编写中添加了互不兼容的HTML语言各自为阵,微软为了快速占领市场将IE浏览器与其操作系统捆绑销售,从而快速占领了市场,网景公司由于缺乏相应的推广手段很快败下阵来。这场浏览器之争更加推动了互联网的发展,首先是制定了统一的标准,推去了HTML4语言,此外w3c也规范了许多标准,加快了浏览器市场的标准建立;其次,加快了其他浏览器的产生,网景为挽回Netscape的市场占有率,网景公司以开放源代码迎战,创造了Mozilla,2002年,衍生出phoenix后改为Firefox,就是著名的火狐浏览器。其他浏览器如opera浏览器(欧朋浏览器其手机市场的占有率较高,个人电脑市场占有率较低),Lynx浏览器(Linux市场十分流行的浏览器,但它是全字模式的浏览器,视觉效果不是太好),Konqueror浏览器(由KDE开发而成,浏览器使用的是自家开发的排版引擎KHTML),Safari浏览器(基于Konqueror这个开放源代码浏览器的KHTML排版引擎而制成的,也是MacOSX的默认浏览器)。最后,有助于IT产业的发展,浏览器的的普及化使得互联网能够快速的进入普通家庭,方便社交,文化交流,零售百货等快速的发展。
2.3 浏览器分类
根据引擎区分[9]可分为:基于gecko排版引擎,有Mozilla.Firefox,Hot Browser等浏览器,基于web kit排版引擎,代表作Google chrome,safari,opera等,基于khtml排版引擎,代表作Konqueror,基于trident排版引擎,代表作Internet explorer,Netscape browser等。根据内核区分为ie内核,chrome内核和双内核(ie和chrome内核)。
2.4 chrome浏览器简介
Chrome浏览器又叫称为Google chrome浏览器,有谷歌公司在2008年9月2号发布的全新浏览器。这是一款全新的,简约,高效的基于web kit内核,KHTML渲染引擎的浏览器,且支持Windows,mac,Linux等平台,同时也是开源软件。chrome浏览器的支持的编写语言也是多样的,比如C++,汇编语言,JavaScript等语言。Chrome最大的亮点就是其多进程架构,保护浏览器不会因恶意网页和应用软件而崩溃。每个标签、窗口和插件都在各自的环境中运行,因此一个站点出了问题不会影响打开其它站点。通过将每个站点和应用软件限制在一个封闭的环境中这种架构,这进一步提高了系统的安全性。与此同时chrome浏览器有许多特点,浏览器中包含V8Javascript虚拟机,这个多线程的虚拟机可以加速Java script的执行,网页的执行速度快,也是其它浏览器无法实现的;几乎隐身的设计让用户似乎感觉不到是在使用一款浏览器而是在像操作系统;以及更为简单方便的搜索设计。
2.5 插件开发
浏览器的设计之初是为了更好的实现不同网络之间的交流,文档的互换与显示,并没有过多的考虑其它问题,随着网络的发展有太多的问题逐渐的显露出来,为了更好的人性化的服务许多应用插件应运而生。
插件 (Plug-in,又称addin、add-in、addon或add-on,又译外挂)是一种遵循一定规范的应用程序接口编写出来的程序。很多软件都有插件,插件有无数种。例如在IE中,安装相关的插件后,WEB浏览器能够直接调用插件程序,用于处理特定类型的文件。插件最大的好处就是实现浏览器不能实现的功能,也就是说扩展了浏览器的网页动作实现了许多功能。比如,可以设计一个插件实现过滤广告的功能,这是浏览器本身所不具有的网页过滤功能;同样也可以设计一个插件实现动态与服务器进行交换的功能,这就是我们所熟悉的众多的抢火车票插件;还有一些插件实现了用户的安全登录与退去的功能,比如我们经常使用的支付宝登录插件,这些插件就是在浏览器的脚本中添加与服务器不断进行交换并且显示的功能。插件实现了许多服务器没有的网页动作、功能,扩展了服务器的使用范围与使用的方便程度。插件的定位应该是开发实现原纯净系统平台/应用软件平台不具备的功能的程序,其只能运行在程序规定的系统平台下(可能同时支持多个平台),而不能脱离指定的平台单独运行。因为插件需要调用原纯净系统提供的函数库或者数据。
插件也有不利的一面[10],插件的开发有可能会涉及到网页的稳定性与安全性。插件可能会使浏览器的脚本与服务器运行的脚本发生混乱造成服务器的崩溃,插件中众多的js文件同样也会在浏览器的交换过程中获取用户的帐号密码等信息危害用户的安全。总之,插件的利于弊需要的是用户全面的衡量,插件的下载应该在其官方网站下载与安装,这样就能保证其一定的稳定,安全。
本文所涉及的chrome浏览器插件开发是是实现浏览器的扩展功能,如浏览器中增加一些小的实用性的工具,像计算器,日历,文档的编辑等工作,生活小工具。本文也是着重探讨chrome浏览器插件开发的步骤方法,明白简易原理以及实现自己的开发。
3 插件开发环境
3.1 为什么是chrome浏览器
插件开发普遍适合大多数的浏览器,插件的语言也是各种各样,有需要汇编的,C语言的,JavaScript语言的。插件开发的方式方法也各有千秋。但为什么选择chrome浏览器作为我们开发插件的浏览器呢?
首先,chrome浏览器是开源项目,chrome浏览器的安全性能也高于其它浏览器,其次,chrome浏览器的是基于web kit的内核设计,浏览器的脚本文件运行的快速且其单独的空间基本不会相互影响造成浏览器的浏览堵塞或者崩溃,这涉及到浏览器插件开发运行机制原理在后面章节中有所介绍。最后,chrome浏览器插件开发要比IE浏览器插件开发容易的多,IE浏览器的插件开发的复杂程度不是一般初学者所能够理解运用的。
选用chrome浏览器的原因除了chrome浏览器本身的特点还有其他的优势与特色。Google公司为了推广其浏览器,Google公司为其开设了一套完整的生态系统,上下游的弦接也是非常到位的。例如Google chrome浏览器本身具有开发者的模式,点击进入开发者的模式并加载自己的脚本文件就能够实现用户对chrome浏览器插件的功能。Google公司也开辟了chrome浏览器插件的应用商店,有许多不错实用的插件提供下载,还有就是Google公司也为插件开发者提供技术支持,在其官方网站中有许多插件开发的技术指导指南,这也是相当不错的,另外也要提到360极速浏览器[11],它是基于chrome浏览器的开发的,它所倡导的极速特点也是chrome浏览器最大的特色,360极速浏览器官方网站也是全文翻译谷歌的官方文档。这些都是chrome浏览器插件开发的有优势,也不叫适合初学者的学习,所以这是选择chrome浏览器的一些原因。
3.2 chrome插件开发环境
Chrome插件开发必然少不了chrome浏览器,谷歌的浏览器为免费产品所以可以从其官网中获取,差价开发也必然少不了编写语言,所以推荐有一文本编辑器。带语法亮点的是比较不错的,推荐使用edit plus能够满足插件开发所需要的所有文本编辑工作需求[12]。
搭建开发环境是所有步骤的开始,硬件要求是比较低的,只要能够运行chrome浏览器就行了,其次,软件的要求同样只需要有chrome浏览器和文本编辑器就行了,至于网络的连接问题的需要看开发者的需求而行,互联网也可以获取许多帮助,有利于开发。这就是所需的开发环境。
4 开发语言简介
4.1 java script语言
不管什么样的浏览器大都可以开发出其特有的插件以实现各种功能实现目的,但是个个浏览器的插件开发语言就很大的不同了,有的需要C、C++语言,有的需要JavaScript语言[13]以及网页编程语言。本文是以Google chrome浏览器为例开发插件所需的语言是JavaScript,HTML等就足以满足插件的开发,以下就是简要的介绍这几种语言。
Google chrome浏览器插件开发指南中可以得知需要的是以js为后缀的JavaScript脚本,以HTML为后缀的HTML代码以及json为后缀的主程序。首先介绍json主函数程序:JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。它基于JavaScript(Standard ECMA-2623rdEdition-December1999)的一个子集。JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C、C++、C#、 Java、 JavaScript、 Perl、 Python等)。这些特性使JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成。在chrome浏览器插件开发中就是以JSON主函数告知浏览器并实现对就js脚本,HTML代码的运用。为了节约浏览器的消耗内存与时间,就运用了JavaScript语言。Java script是一种由Netscape的Live Script发展而来的原型化继承的基于对象的动态类型的区分大小写的客户端脚本语言,主要目的是为了解决服务器端语言,比如Perl,遗留的速度问题,为客户提供更流畅的浏览效果。当时服务端需要对数据进行验证,由于网络速度相当缓慢,只有28.8kbps,验证步骤浪费的时间太多。于是Netscape的浏览器Navigator加入了Java script,提供了数据验证的基本功能,大大加快网页速度。同时是一种基于对象和事件驱动并具有相对安全性的客户端脚本语言。且广泛用于客户端Web开发的脚本语言,常用来给HTML(标准通用标记语言的子集)网页添加动态功能,比如响应用户的各种操作。它最初由网景公司(Netscape)的Brendan Eich 设计,是一种动态、弱类型、基于原型的语言,内置支持类。JavaScript是Sun公司(已被oracle收购)的注册商标。Ecma国际以JavaScript为基础制定了ECMA Script标准。JavaScript也可以用于其他场合,如服务器端编程。完整的JavaScript实现包含三个部分:ECMA Script,文档对象模型,字节顺序记号。Netscape公司在最初将其脚本语言命名为Live Script。在Netscape在与Sun合作之后将其改名为JavaScript。JavaScript最初受Java启发而开始设计的,目的之一就是“看上去像Java”,因此语法上有类似之处,一些名称和命名规范也借自Java。但JavaScript的主要设计原则源自Self和Scheme。
4.2 HTML语言
在万维网上的一个超媒体文档称之为一个页面(外语:page)。作为一个组织或者个人在万维网上放置开始点的页面称为主页(外语:Homepage)或首页,主页中通常包括有指向其他相关页面或其他节点的指针(超级链接),所谓超级链接,就是一种统一资源定位器(Uniform Resource Locator,外语缩写:URL)指针,通过激活(点击)它,可使浏览器方便地获取新的网页。这也是HTML获得广泛应用的最重要的原因之一。在逻辑上将视为一个整体的一系列页面的有机集合称为网站(Website或Site)。超级文本标记语言(英文缩写:HTML)是为“网页创建和其它可在网页浏览器中看到的信息”设计的一种标记语言。超级文本标记语言是标准通用标记语言下的一个应用,也是一种规范,一种标准,它通过标记符号来标记要显示的网页中的各个部分。网页文件本身是一种文本文件,通过在文本文件中添加标记符,可以告诉浏览器如何显示其中的内容(如:文字如何处理,画面如何安排,图片如何显示等)。浏览器按顺序阅读网页文件,然后根据标记符解释和显示其标记的内容,对书写出错的标记将不指出其错误,且不停止其解释执行过程,编制者只能通过显示效果来分析出错原因和出错部位。但需要注意的是,对于不同的浏览器,对同一标记符可能会有不完全相同的解释,因而可能会有不同的显示效果。超级文本标记语言文档制作不是很复杂,但功能强大,支持不同数据格式的文件镶入,这也是万维网(WWW)盛行的原因之一,其主要特点如下:
1.简易性:超级文本标记语言版本升级采用超集方式,从而更加灵活方便。
2.可扩展性:超级文本标记语言的广泛应用带来了加强功能,增加标识符等要求,超级文本标记语言采取子类元素的方式,为系统扩展带来保证。
3.平台无关性:虽然个人计算机大行其道,但使用MAC等其他机器的大有人在,超级文本标记语言可以使用在广泛的平台上,这也是万维网(WWW)盛行的另一个原因。
4.通用性:另外,HTML是网络的通用语言,一种简单、通用的全置标记语言。它允许网页制作人建立文本与图片相结合的复杂页面,这些页面可以被网上任何其他人浏览到,无论使用的是什么类型的电脑或浏览器。
以上简约讲解了chrome浏览器使用到的开发语言,讲解开发语言的特色以及相关历史简介,具体语法结构因篇幅有限未能详细讲解可以另参考其它书籍。
5 Chrome的详解与插件结构
5.1 chrome浏览器
Chrome浏览器是谷歌(Google)公司研发的浏览器,同时也是一个开源项目(Chromium),即它是一个开源浏览器。Chrome中文名叫谷歌浏览器,它是一款可高速运行网页和应用程序的网络浏览器。
谷歌之所以想开发这么个浏览器,主要是想提供一个能更好地支持各种复杂网络应用的浏览器基础平台,因为如今众多的优秀应用都是构建在浏览器的基础上。Google公司认识到网络已经从简单的文本页面进化到富媒体和互动应用广泛普及的新时代。从界面来看,谷歌设计了一个简单而高效的浏览器窗口。对大多数人来说,浏览器本身并不重要,它只是一个能够运行互联网网页、网站和网络应用等重要程序的工具。正如谷歌的经典主页,谷歌浏览器延续了简洁、快速的设计理念,帮助用户快速准确地到达目的地。
5.2 chrome浏览器的特点[15]
5.2.1高速程序启动快,载入网页快
1 谷歌浏览器可以从桌面快速启动。
2 谷歌浏览器可以在弹指间载入网页。
3 谷歌浏览器能够以前所未有的速度运行交互式网页、网络应用程序和JavaScript。
5.2.2简单高效、易用性的设计
1 从一个框即可搜索并导航到网页。
2 可以方便快捷、随心所欲地排列和整理标签页。
3 只需在“新标签页”页面中轻点最常访问的网站的缩略图,就可以转到最喜欢的网站上。
5.2.3样式
主题可为浏览器增添色彩和乐趣。用色彩、图案、图片和艺术作品来装饰浏览器。
5.2.4多进程及多线程模型
这特点也是谷歌浏览器的一个很显著的特点,这样设计起来浏览器不会出现假死,“因小失大”的现象。具体的分析见后面的进程及线程分析部分。
5.2.5搜索简洁
地址栏与google搜索引擎的结合这个特点可以算得上是一个完善的结合,也是Chrome的特色之一。用户直接在地址栏里输入想要搜索的东西,Chrome会自动检测输入是不是合法的链接,如果不是,则自动识别为要搜索刚才输入的东西。
5.3 chrome浏览器内核
Chrome浏览器的内核是基于Web kit的,这点跟safari浏览器是一样的。目前主流浏览器的内核主要有3类:Web kit内核,IE内核(如遨游浏览器,搜狗浏览器等),Fire Fox内核。这3个内核笔者个人感觉IE内核整体差点,而Web kit速度最快。这也是Chrome速度快的主要原因(当然谷歌自己研发了自己的V8渲染引擎,后面会讲到),V8速度快,这是吸引笔者研究Chrome源代码的原因之一。V8是渲染JavaScript的引擎,是基于Web kit内核上的。对比Firefox,IE,Chrome这3个主流浏览器,发现Chrome对JavaScript的渲染速度是最快的。所以某一方面Chrome可以说是自己有了自己的内核。
5.4 chrome的进程与线程模型
5.4.1chrome的进程和线程模型[16]
图5.1
5.4.2chrome进程模型
Google在宣传Chrome时口号是“One tab one process”,即一个标签一个进程。但经过分析它的源代码之后,这种说法其实不是很准确。从图5.1的总体模型图可以看出,Chrome浏览有一个最主要的进程,称作Browser进程,它是其他所有进程的“老大”。这个主进程负责绝大多数的日常事务,比如书签的管理,工具栏的功能等。其次就是一堆的渲染进程(Renderer),这些Renderer则是自己负责自己的部分,一般是Renderer负责一组站点。所以之前说“一个标签一个进程”不是很准确。这个可以自己简单测试下,打开任务管理器,从一个网站中打开另一个属于这个站点的子网页,会发现在任务管理器中并没有多一个进程,这是因为它们是属于同一站点的,也就是属于同一个Renderer负责的。但谷歌浏览器可以通过命令行来支持“One tab one process”这个模型。各个Renderer之间不互相通信,只和Browser进程进行通信。而Renderer与Browser进程通信则由于IPC(Inter-Process Communication)统一管理,IPC是谷歌自己设计的一种通信规则。这样,就把功能的耦合度降低到最低,一组站点崩溃不会影响其他站点。最后简单地说,Chrome支持以下几种进程模型:
1 Process-per-site-instance:打开一个网站,然后从这个网站链开的一系列网站都属于一个进程。这是Chrome的默认模式。
2 Process-per-site:同域名范畴的网站放在一个进程,比如和
3 Process-per-tab:这个简单,一个tab一个process,不论各个tab的站点有无联系,就和宣传的那样,用process-per-tab开启, 这个才是谷歌宣传的那种。
4 Single Process:传统浏览器的模式,没有多进程只有多线程,用single-process开启。对于各种模式,它们的优缺点,官方有官方的说法,大家自己也会有自己的评述,真正是仁者见仁。至少可以说明,Google不是由于不小心的而采取多进程的策略,而是实验出来的效果。对于Renderer,它们也是管理层的,在它们之都有一些更低的线程为它们服务。每个Renderer进程下都至少有两个线程,一个是Main线程,专门用来跟老大(Browser)进程进行通信。另一个则是Render线程,则是负责各Renderer进程的事务及渲染工作。然而,Browser的Main线程则事情更多,领导事多啊,他除了整个日常事务管理外,还负责着各个Renderer的IO Thread,File Thread(这个就像下载时的文件进度,下载速度等),Db Thread等进行通信。一个进程配多个线程有几下两点好处:
1 为了更好的用户体验。有的事情处理起来太慢,比如数据库读写、远程通信、复杂计算等等,如果在一个线程一个进程里面来做,往往会影响用户感受,因此需要另开一个线程或进程转到后台进行处理。它之所以能够生效,仰仗的是单CPU的分时机制,或者是多CPU协同工作。在单CPU的条件下,两个任务分成两拨完成的总时间,是大于两个任务轮流完成的,但是由于彼此交错,使人的感觉更自然一些。
2 为了加速完成某项工作。大名鼎鼎的Map/Reduce,做的就是这样的事情,它将一个大的任务拆分成若干个小的任务,分配个若干个进程去完成,各自收工后,再汇集在一起,更快地得到最后的结果。为了达到这个目的,只有在多CPU的情形下才有可能,在单CPU的场合(单机单CPU),是无法实现的。
5.5 chrome线程模型
线程并发的出现给用户体验带来的新的爽快。一般线程的启动是以入口函数开始启动一个线程,传入一个入口函数,要保证这个函数没有什么副作用。Chrome的线程用到了消息循环的手段。每一个Chrome的线程入口函数都差不多,都是启动一个消息循环,等待并执行任务。而其中,唯一的差别在于,根据线程处理事务类别的不同,所起的消息循环有所不同。比如处理进程间通信的线程(在Chrome中,这类线程都叫做IO线程,估计是当初设计者一时不注意)启用的是Message Pump For IO类,处理UI的线程用的是Message Pump For UI类,一般的线程用到的是Message Pump Default类(只讨论windows)。不同的消息循环类,主要差异有两个,一是消息循环中需要处理什么样的消息和任务,第二个是循环流程(比如是死循环还是阻塞在某信号量上)。下图5.2是个完整版的Chrome消息循环图,包含处理Windows的消息,处理各种Task(Task是什么,稍后揭晓,),处理各个信号量观察者(Watcher),然后阻塞在某个信号量上等待唤醒。
图5.2
当然,不是每一个消息循环类都需要跑那么一大圈的,有些线程不会涉及到那么多的事情和逻辑,就不用浪费精力去走完所有循环。对于所有的多线程,都要分清什么是同步跟异步,如何保证不由于竞争资源而死锁。Chrome用了一个简单的防死锁机制,就是加锁直接加到Task上,而不是直接加在Thread上,这样相当对Thread进行了封装后再加锁。
5.6 chrome插件结构[17]
5.6.1插件组成
一个完整的插件是由4个部分组成,分别是manifest.json、js文件、图标和HTML文件,设计插件就是设计这4类文件。当然还可以视需要添加其他的文件进去。
1 manifest.json的作用是定义插件的属性,例如名称、版本、类型等。
2 HTML文件具体实现插件的功能,插件要实现什么功能全靠这个文件。
3 js文件是一个跟浏览器互动的脚本,是连接浏览器和插件的桥梁。需要注意的是,这个脚本文件的执行环境是在manifest里面指定的页面,亦即它像病毒一样注入到原始网页上面去执行,但是它不能访问原始网页的JS变量、函数等任何代码,只允许通过DOM来交互,它也不能只用除chrome extention及其派生以外的API。
4 图标的格式为PNG,JPG等格式。
5.6.2 manifest.json文件
manifest.json所有插件都要有这个文件,这是插件的配置文件,可看作插件的“入口”。它指定显示什么图标,background script有哪些文件,content script有哪些文件。
{
"manifest_version":2,
"name":"viewer",
"version":"0.0.1",
"background":{"scripts":["background.js"]},
"permissions":["tabs"],
"page_action":{
"default_icon":{
"19":"cnblogs_19.png",
"38":"cnblogs_38.png"
},
"default_title":"articleinformation"
}}
以上程序是标准的Manifest.json文件,下面简要的介绍manifest.json文件中的几个重要的属性,为后面的插件结构作准备。
"manifest_version":现在应该总是2。
"permissions":很重要的东西,即允许插件做哪些事情,访问哪些站点。
"background":这是一个很重要的东西,可以把它认为是chrome插件的主程序,理解这个很关键,一旦插件被启用(有些插件对所有页面都启用,有些则只对某些页面启用),chrome就给插件开辟了
展开阅读全文