搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
IT小白
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
matlab矩阵分解函数说明_matlab evd
2
整数规划---割平面解法
3
添加字段_Odoo开发教程3-为表单视图添加字段
4
Python:使用SSH隧道链接数据库_用python和ssh隧道连接数据库
5
一分钟实现内网穿透(ngrok服务器搭建)_ngrok部署
6
Linux 文件探秘:检查Linux系统的文件大小的四种神器
7
建筑企业在进行数字化转型的过程中的捷径有哪些?
8
github命令行下载某一历史版本的代码的方法_git 下载历史
9
解决ubuntu 22.04新内核6.5.0-15无法编译NVIDIA显卡驱动_/tmp/selfgz1715/nvidia-linux
10
oracle先排序再分页
当前位置:
article
> 正文
Chrome源码剖析 【五】Chrome的插件模型_影刀chrome插件代码分析
作者:IT小白 | 2024-03-21 16:26:49
赞
踩
影刀chrome插件代码分析
1. NPAPI
为了紧密的与各个开源浏览器团结起来,共同抗击IE的垄断,Chrome的插件,也遵循了
NPAPI
(Netscape Plugin Application Programming Interface)标准,支持这个标准的浏览器需要实现一组规定的API供插件调用,这组API形如
NPN_XXX
,比如NPN_GetURL,插件可以利用这些API进行二次开发。而NPAPI插件以一个Dll之类的作为物理载体(windows下dll,linux下是so...)进行提供,里面同样也实现了一组规定的API。形式包括
NP_XXX
和
NPP_XXX
,NP_XXX是系统需要默认调用的方法,用于认知这个插件,比如NP_Initialize, 而NPP_XXX是用于插件完成一些实际功能,比如NPP_New。。。
所有的插件dll都需要放置在指定目录下(根据操作系统的不同而不同...),每个插件可以处理一种或多种MIME格式的数据,比如application/pdf,说明该插件可以处理pdf相关的文档。在Chrome中键入about:plugins,可以查看当前Chrome中具有的插件信息。。。
NPAPI是一个很经典的插件方案,
用dll进行注入,用协定的API进行通信,用字符串描述插件能力
。插件宿主(在这里就是浏览器...),会根据能力描述,动态加载插件,并负责插件调用的流程和生命周期管理。而插件中,负责真实逻辑的处理,并可以构造UI与用户交流。以此类方式实现的插件系统,往往是处理的逻辑比较固定适用范围一般(用API写死了逻辑...),但可扩展性不错(用字符串描述能力,可无限扩展...)。。。
在Chrome中
nphostapi.h
中,定义了所有NPAPI相关的函数指针和结构,这个文件放置在glue目录下,如果看过前面碰过的文章就知道,在WebKit内肯定也有一套相同的东西;在
npapi.h/.cc
中,提供了Chrome浏览器端的NPN_XXX系列函数的实现;每一个插件物理实例,用
PluginLib
类来表示,而每一个插件的逻辑实例,用
PluginInstance
类来表示。这个概念牵强附会的可以用windows中的句柄来类比,当你想操作一个内核对象,你需要获得一个内核对象的句柄,每个进程中的句柄肯定不相同,但后面的内核对象却是同一个,内核对象的生命周期通过句柄的计数来控制,有人用则或,无人用则死(当然这个类比相当的牵强,主要是想说明引用计数和逻辑与物理的关系,但一个关键性的区别在于,
PluginLib与PluginInstance都是在一个进程内的
,不能跨越进程边界...)。在Chrome中,PluginLib负责加载和销毁一个dll,拿到所有导出函数的函数指针,PluginInstance对这些东西进行了封装,可以更好的来调用。。。
关于NPAPI的更多细节,Chrome并没有提供任何文档,但是,各个先驱的浏览器们都提供了大量丰富的文档。比如,你可以到
这里
,查看firefox中的NPAPI文档,基本通用。。。
2. Chrome的多进程插件模型
Chrome的插件模型,与早先的浏览器的最大不同,是它采用了
多进程
的方式,每一个插件,都有一个单独的进程来承载(Shift + Esc打开Chrome进程管理器,可以看到现在已经加载的插件进程...)。当WebKit进行页面渲染的时候,发现了未知的MIME类型数据,它会告知给Browser进程,召唤它提供一个插件来解析。如果该插件还未加载,Browser会在指定目录中搜寻出具有此实力的插件(如果没有此类人才只能作罢...),并为它创建一个进程,让它负责所有的该插件相关的任务,然后建立起一个IPC通路,与它“保持通话”。这套流程一定不会太陌生,因为它与Render进程的创建大同小异换汤不换药。。。
Plugin进程与Render进程最大的区别在于,Render需要与Browser进程大量通信,因为它的HWND归Browser老大掌管着,相关所有内容都需要通信完成。但Plugin不需要与Browser频繁联系,它大部分的通信都是与Render进程发生的。如果Plugin与Render之间的通信,还需要走Browser中转一下,这就显得有些脱裤子放屁了,虽然Browser是大头,但不是冤大头,它不会干这种吃力不讨好的事情。他只是做了一回Render与Plugin间的媒婆而已。当Plugin与Browser建立好了IPC通路后,它会让Render建立一个新IPC通路,用以与Plugin通信,IPC的有名管道名,经由Browser通知给Plugin。完成名字协商后,Render与Plugin的通信关系就建立好了,它们之间就可以直接进行通信了。。。
整个通信模式,可以看
这里
。这是一个很标准的代理模式的应用,稍有了解的都可以跳过我后面会做的一段罗嗦的描述,一看官方文档中的图便能知晓。在Render进程端,
WebPluginImpl
是
WebPlugin
的一个子类,WebPlugin是供Webkit进行调用的一个接口,利用依赖倒置,实现了扩展。在Plugin进程端,实现了一个
WebPluginDelegateImpl
类,该类会调用PluginInstance的相关接口实现真实的插件功能。这样的话,只需要WebPluginImpl调用WebPluginDelegateImpl中的相应方法,就可以实现功能。但问题是WebPluginImpl与WebPluginDelegateImpl天各一方各处于一个进程,很显然,这里需要一个代理模式。这里沿用了COM的架构,Delegate + Stub + Proxy。WebPluginImpl调用代理
WebPluginDelegateProxy
,该代理会将调用转换成消息,通过IPC发送给Plugin进程,在Plugin端,通过
WebPluginDelegateStub
监听消息,并转换成对真实WebPluginDelegateImpl的调用,从而完成了跨进程的一个调用,反之亦然。。。
3. Chrome的可扩展性
总所周知,firefox通过三种方式进行自定义,插件、扩展和皮肤。其中,插件是使得浏览器能用,不会出现一大块一大块的无法显示的区域;扩展是使得浏览器好用,可以简单方便的进行功能的定制和个性化配置;皮肤是帮助浏览器变得好看,毕竟罗卜白菜,给有所爱。。。
与之对比,来看Chrome。Chrome有了插件,有了皮肤,但是没有扩展。这就意味着,你很难为Chrome定制一些特色的功能。目前,所有对Chrome的功能扩展,都是通过书签抑或是修改内核来实现的。前者能力太弱,后者开发起来太麻烦,容易出错不提,还必须要与时俱进,跟上版本的变化,并且还不能自由的选择或关闭。因此,这都不是长远之计,Chrome提供一套类似于firefox的扩展机制,也许才是正道。据传说,Chrome团队正在琢磨这件事,不知道最终会出来个怎么样的结果,是尽力接近firefox降低移植成本,还是另立门户特立独行,我想可以拭目以待一把。。。
在多进程模式下,Chrome的插件还有一个问题,前面提到过,就是关于UI控件的。由于NPAPI的标准,是允许插件创建HWND窗口的,这就使得当Plugin繁忙,且Browser进程发起HWND的同步的时候,主进程被挂起,这个浏览器停滞。在Render进程中,解决这个问题的思路是控制权限,不然Render创建HWND,到了Plugin中,这招不能使用,只能够使用另一招,就是监管。不停的检查Plugin是否太繁忙,无法响应,一旦发现,立即杀死该Plugin及其所处的页面。这就好比你想解决奶中有三氯氰胺的问题,要么控制奶源,不从奶站购买全部用自家的,要么加强监管,提高检查力度防止隐患。两种策略的优缺点一眼便知,依照不同环境采取不同策略即可。。。
总体说来,Chrome的可扩展性着实一般,不过Chrome还处于Beta中,我们可以继续期待。。。
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/IT小白/article/detail/281967
推荐阅读
article
因为
manifest
.
json
文件引起的
android
-
chrome
-
192x192
.
png
40...
manifest
.
json
icon图片报错404因为
manifest
.
json
文件引起的
android
-
chrome
...
赞
踩
article
selenium
+
Chrome
driver
环境配置_chrome
driver
122.0
.626...
为避免下一步出现问题,所以直接这里把
selenium
==3.141.0卸载掉,安装
selenium
==3.3.1,否则仍...
赞
踩
article
关闭
Mac
版
Chrome
自动
更新
的方法_mac
chrome
关闭
更新
...
Chrome
的一大特性之一就是
自动
更新
,但如果在某些特定情况下想要
关闭
自动
更新
功能的话,也是可以实现的,本文就分享下如...
赞
踩
article
Mac下关闭
Chrome
自动更新
_
googlesoftwareupdate
.
bundle
...
如果在你的Mac上,
Chrome
安装在了用户目录 ~/Library 下,想要关闭
Chrome
自动更新
,执行一下命令即...
赞
踩
article
禁止谷歌浏览器
Google
Chrome
自动
更新
_
chrome
禁用
更新
...
禁用
Google
Chrome
自动
更新
_
chrome
禁用
更新
chrome
禁用
更新
...
赞
踩
article
mac
下
关闭
Chrome
的
自动更新
_
mac
chrome
关闭
右上角
的更新提示...
前提:
关闭
chrome
浏览器1、打开终端,输入如下命令行,进入
mac
系统下的“/Library/Google/Googl...
赞
踩
article
旧版
chrome
下载(
windows
/
mac
/
linux
)_
mac
os
旧版
本 google chro...
旧版
chrome
浏览器下载,有
windows
、
mac
、
linux
_
mac
os
旧版
本 google
chrome
mac
os...
赞
踩
article
如何在旧
Mac
或
Mac
Book 上安装
Chrome
操作系统
?_chrome for
mac
...
有一台无法处理
mac
OS 的旧
Mac
Book?您知道吗,您可以从
Mac
擦除
mac
OS 并安装
Chrome
O...
赞
踩
article
Mac下解决
Chrome
自动升级问题_
mac
“
google
chrome
”可能无法
自动更新
...
UI自动化之解决
chrome
自动升级问题_
mac
“
google
chrome
”可能无法
自动更新
mac
“
google
...
赞
踩
article
Google
Chrome
旧版本下载地址_
chrome
old
version
download
...
Google
Chrome
旧版本下载地址_
chrome
old
version
download
chrome
old ...
赞
踩
article
Google
Chrome
旧版本
下载地址_如何下载
chrome
旧版本
...
chrome
旧版本
下载地址分享给大家_如何下载
chrome
旧版本
如何下载
chrome
旧版本
...
赞
踩
article
google
chrome
历史
版本
下载_
google
-
chrome
历史
版本
...
https://downzen.com/en/windows/
google
-
chrome
/versions/_googl...
赞
踩
article
Chrome
69
for
mac
版本浏览器
下载
,OpenSUSE版本,
Chrome
69
wind...
废话不多说,直接上网盘,链接,喜欢的请给个赞或评论,谢谢!https://pan.baidu.com/s/1ugUqnX...
赞
踩
article
【Selenium】
chrome
driver新版本与
Chrome
自动更新版本不匹配问题_this v...
3.然后关键的来了. 把你下载的浏览器驱动复制粘贴放在python解释器所在的文件夹(不知道文件夹目录的可以在pytho...
赞
踩
article
Fiddler
抓不到包
Fiddler
chrome Edge无法
抓包
原因排查
Fiddler
死活抓不了...
我这电脑上的
Fiddler
莫名其妙的死活就是无法
抓包
,换了几个版本的
Fiddler
都没有解决,这里参考了一些网上的教程,...
赞
踩
相关标签
json
前端
vue.js
javascript
selenium
chrome
测试工具
google
closeUpdate
谷歌浏览器关闭更新
mac
python
macos
chrone
旧版
旧版chrome
linux
windows
文章
Mac教程