转载请注明原文地址:http://blog.csdn.net/milado_nju

##概述

插件和扩展是一种扩充浏览器功能的技术,在之前我们介绍过NPAPI插件技术,在Chromium中,远远不只是这一种技术,这里面包括PPAPI机制,NativeClient技术和Extension机制。这些新技术极大的扩展了浏览器的能力,下面逐次来介绍它们。限于篇幅,这里只是简单介绍一下它们的基础知识,详细的内容会有专门的文章来介绍它们。

## PPAPI插件

PPAPI的提出是因为NPAPI的可移植性和性能存在比较大的问题,特别是针对跨进程的插件,特别是插件需要2D和3D绘图,声音等问题时候就更为棘手。早期的时候就是要解决这些问题,同时为了赢得插件厂商的支持,尽可能的使用原来NPAPI的接口。现在,随着PPAPI的不断发展,接口不断发生改变。后来,PPAPI也被用在Native Client技术中,之后也被逐渐的修改,直到现在的样子,完整的列表可以查看链接http://code.google.com/p/ppapi/w/list

那么为什么PPAPI能够提供较高性能的绘图和声音等问题呢?前面我们提到,在现在的NPAPI插件系统中,通常的做法是,当网页需要显示该插件的时候或者需要更新的时候,它会发送一个失效(Invalidate)的通知,让插件来绘制它们。而在PPAPI插件机制,它引入了一个叫做保留(retained)模式,其含义是浏览器始终保留一个后端存储空间用来表示上一次绘制完的区域。这个很有用,因为PPAPI插件通常是跨进程的,所以浏览器可以绘制网页而不需要锁,与此同时插件进程能够在后台绘制新的结果。

PPAPI插件有两种运行模式,受信(trusted)插件和非受信(untrusted)插件。对于受信的PPAPI插件,它可以在Renderer进程中运行,也可以跨进程运行。对于新版本的实现中,架构设计都是基于IPC来设计的。而对于非受信的PPAPI插件则使用NativeClient技术来安全运行它们。对于受信插件,它们是平台相关的,那么可能调用平台相关的接口。而对于非受信插件而言,它们是平台无关的代码,它们调用NativeClient提供的有限接口,而不能调用任意接口,这个后面再介绍。

## Native Client

Native Client是一项运行在PPAPI机制之上的技术,NativeClient,也简称为NaCl,是一种沙箱技术,它能够提供给平台无关的不受信本地代码一个安全运行环境,它是针对那些计算密集型的需求,例如游戏引擎,可视化计算,大数据分析,3D图形渲染等方面的需求,它们指需要访问有限的一些本地接口,这样不需要通过网络服务来计算它们,以免占用额外的带宽资源。它同WebGL,WebAudio这样的技术所解决的问题相似,但是途径不同,因为它们是标准,而NativeClient技术是Google提出的,使用NativeClient能够将很多本地库的能力轻易的提供给网页使用,而不需要复杂的移植过程,给重用带来很大的方便。

本身PPAPI和NativeClient没有必然联系,两者解决的是不同方面的问题,只是目前NativeClient是基于PPAPI接口来实现的,其实之前NativeClient也曾经基于NPAPI接口来实现的,所以能够在Firefox,Safari和Opera浏览器中运行。

因为NativeClient使用PPAPI来提供一个安全的运行环境,本身它也是一个PPAPI插件,下图就是Chrome浏览器中一个PPAPI插件-NativeClient。同其它的PPAPI插件不一样,它是一个在Renderer进程中运行的插件,图中的”Type: PPAPI(in-process)”。


## Extension机制

Chromium的扩展(Extension)机制(为了避免跟通用的“JavaScript扩展机制”产生名字上的混淆,后面一律称为Chromium Extension机制)原先是Chromium推出的一项技术,该机制能够扩展帮助浏览器的能力,例如笔者使用的一个扩展实例名为“switchy proxy”,它可以帮助用户方便的切换Chromium浏览器的代理。为了但是也就仅此而已。本质上,它其实就是浏览器能力的简单扩展,而对于一些本地的功能,例如书签,USB,蓝牙,电源管理等,它并没有这方面的能力。

一个Chromium Extension的实例其实就是一个网页加上JavaScript代码和CSS,当然,在Extension中,开发者也可以使用NPAPI插件和PPAPI及NaCl机制技术来扩展网页能力,所以它同这些技术没有冲突,相反,Extension可能需要这些技术以达到提供一定的功能。

当然,Chromium Extension机制的目标远不只这么简单,扩展浏览器功能的Extension只是其中一个很小的功能。随着该机制的不断发展,Extension机制已经被用来支持Web应用程序,也就是使用HTML5、JavaScript、CSS技术来开发应用程序,使用Chromium浏览器来运行,当然获得用户体验同本地应用程序非常接近。Chromium打造为一个依赖于Web的运行平台,使用扩展机制的网页已经可以称之为Web应用。如果你认为功能还不够,也可以理解为初级阶段,但是它实实在在将网页扩展到web应用的范畴。在Google的Web Store中,读者可以发现其中有两个类别,包括传统的Extension和Web应用。这里面,从用户的角度看,普通扩展和Web应用的区别在于普通插件只是在Extension在当前窗口运行(当然也不是绝对的,但是工作机制的确是不一样),而Web应用是一个独立的窗口。

下图是Chrome浏览器中已经安装的Extensions(Google Docs)和Web应用(Cut theRope),读者可以通过在地址栏输入chrome://extensions/来查看它们。


在目前的Chromium中,对于Web应用,Chromium根据它们的特性分成两类,第一种叫做Host App,另外一种叫做Packaged App。前面一种表示将网络上的资源直接变成一个Web引用,所以它需要使用外部的资源才能够工作,而对于后一种,该Web应用所需要的文件和资源都包含在该应用中,而不需要外部的资源,所以对于那些离线应用特别有用,这感觉更像本地应用。

## 参考资料

1. http://www.chromium.org/developers/design-documents/pepper-plugin-implementation

2. http://www.chromium.org/nativeclient

3.  http://www.chromium.org/developers/design-documents/extensions

by yongsheng@chromium.org

理解WebKit和Chromium: Chromium插件和扩展基础的更多相关文章

  1. 理解WebKit和Chromium(电子书)

    前言   基础篇 WebKit, WebKit2, Chromium和Chrome介绍 WebKit和Blink WebKit和Chromium代码目录结构介绍 WebKit和Chromium功能模块 ...

  2. 理解WebKit和Chromium: 硬件加速之RenderLayer树到合成树

    转载请注明原文地址:http://blog.csdn.net/milado_nju ## 概述 在前面的章节中,笔者介绍了WebKit渲染引擎是如何有HTML网页构建DOM树.RenderObject ...

  3. 理解WebKit和Chromium: 调试Android系统上的Chromium

    转载请注明原文地址:http://blog.csdn.net/milado_nju 1. Android上的调试技术 在Android系统上,开发人员能够使用两种不同的语言来开发应用程序,一种是Jav ...

  4. 理解WebKit和Chromium: Android 4.4 上的Chromium WebView

    转载请注明原文地址:http://blog.csdn.net/milado_nju ## 概述 相信读者已经注意到了,在最新的Android 4.4 Kitkat版本中,原本基于Android Web ...

  5. 理解WebKit和Chromium: 网页渲染的基本过程

    转载请注明原文地址:http://blog.csdn.net/milado_nju ## 概述 前面介绍了一些渲染引擎的功能,包括网络,资源加载,DOM树,RenderObject树等等,但是,给人以 ...

  6. 理解WebKit和Chromium:Chromium资源磁盘缓存

    转载请注明原文地址:http://blog.csdn.net/milado_nju ## 概述 想象一下,如果没有磁盘缓存的世界.当用户访问网页的时候,每次浏览器都需要从网站下载网页,图片,JS等资源 ...

  7. 理解WebKit和Chromium: Chromium的多进程资源加载机制

    转载请注明原文地址:http://blog.csdn.net/milado_nju ##概述 前面介绍了WebKit中的资源加载机制,其实它只是一个框架性的东西,实际的资源加载依赖于各个WebKit移 ...

  8. 理解WebKit和Chromium: Chromium WebView和Chrome浏览器渲染机制

    转载请注明原文地址:http://blog.csdn.net/milado_nju ## 数据对比 前面介绍过Chromium WebView的时候,说过有关ChromiumWebView同Chrom ...

  9. 理解WebKit和Chromium: JavaScript引擎简介

    转载请注明原文地址:http://blog.csdn.net/milado_nju 1. 什么是JavaScript引擎 什么是JavaScript引擎?简单来讲,就是能够提供执行JavaScript ...

随机推荐

  1. 2016移动端Android新技术综合预览--好文不多,这一篇就足够

    Csdn /Tamic 原文地址: http://blog.csdn.net/sk719887916/article/details/53525067 本文章6月份已完成(http://www.jia ...

  2. 查看oracle数据库的连接数以及用户 (转:http://blog.itpub.net/24558279/viewspace-752293/)

    select2.查询oracle的并发连接数4select3.查看不同用户的连接数6select4.查看所有用户:8select5.查看用户或角色系统权限(直接赋值给用户或角色的系统权限):10sel ...

  3. CoreText精彩文字轮廓绘制动画的一点改进

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 原文在: http://oleb.net/blog/2010/ ...

  4. 看见的力量 – (I) 解题的思维

    本文转自台湾李智桦老师的博客,原文地址 这篇文章:已经梗了我三个多星期了.这期间飞了二次大陆做演讲.往返几个大城市做教授敏捷开发运用在精实创业的课程.教材内容都是简体的,它们始终没有机会在国内用上,心 ...

  5. Django开发自己的博客系统

    好久之前就想做一下自己的博客系统了,但是在网上查了查好像是需要会一些Node.js的相关知识,而且还要安装辣么多的库什么的,就不想碰了.但是我遇到了Django这么一款神器,没想到我的博客系统就这么建 ...

  6. iOS7 CookBook精彩瞬间(一)property、selector细节、__unused

    1.我们常常使用nonatomic,很多人只知道它的效率较高,却不知道其含义,其含义是非线程安全的,也就是说多线程修改时不加锁,可能出现多个线程先后修改而成为脏数据的情况. 2.unsafe_unre ...

  7. scala for spark

    写了点scala的内容,方便看spark源码,估计一两天就能看完,内容比较粗浅. 下载地址: http://download.csdn.net/detail/lsshlsw/7983541

  8. 剑指Offer——栈的java实现和栈的应用举例

    剑指Offer--栈的java实现和栈的应用举例 栈是一种先进后出的数据结构, 栈的实现如下: 首先定义了栈需要实现的接口: public interface MyStack<T> { / ...

  9. Android回调事件传播-android学习之旅(四十五)

    概念简介 代码演示 package peng.liu.test; import android.app.ActionBar; import android.app.Activity; import a ...

  10. Linux下使用两个线程协作完成一个任务的简易实现

    刚解决了之前的那个Linux下Pthread库的问题,这次就来使用两个线程来协作,共同完成一个求和的任务. 打一下基础吧 本次需要使用到的知识点有: lpthread,编译的时候用到,相当于一个声明的 ...