如有Chromium扩展(Extension)的页面(Page)加载过程分析

extension_dir  时间:2021-03-15  阅读:()

精品学习资料---收集网络如有侵权请联系网

站删除

Chromium扩展Extension的页面

 P a g e  加载过程分析Chromium的ExtensionPage其实就是网页因此它们的加载过程与普通网页相同。常见的ExtensionPage有BackgroundPage和PopupPage。其中B ackgroundPage在浏览器窗口初始化完成后自动加载之后运行在后台中。 PopupPage在用户点击地址栏右边的按钮时加载并且显示在弹窗中。本文接下来就分析ExtensionPage的加载过程。

ExtensionPage是加载在ExtensionProcess中的如图1所示

ExtensionProcess实际上就是RenderProcess。精品学习资料---收集网络如有侵权请联系网

站删除

精品学习资料---收集网络如有侵权请联系网

站删除

Chromium的 Content层向外提供了一个WebContents类通过调用这个类的静态成员函数Create就可以在一个ExtensionProcess加载一个指定的ExtensionPage。

B ackgroundPage是一个特殊的网页它的内容是空的 不过包含有一个background.j s。这个background.j s是在Extension的清单文件中指定的。 PopupPage则与普通网页是一样的它既可以包含有UI元素也可以包含Java S crip t脚本。接下来 我们就结合源代码 先分析BackgroundPage的加载过程再分析PopupPage的加载过程。

Chro mium 的 chro me模块会创建一个ChromeNotificationOb server对象用来监听每一个 新 打 开 的 浏 览 器 窗 口 的NOT IFIC AT ION_B ROWS ER_WINDOW_READ

Y事件。这时候上述ChromeNotificationOb server

精品学习资料---收集网络如有侵权请联系网

站删除

精品学习资料---收集网络如有侵权请联系网站删除

对象的成员函数OnBrowserWindowReady会被调用如下所示

[cpp]viewplaincopy在CODE上查看代码片派生到我的代码片voidChromeNotificationOb server: :OnBrowserWindowReady(Browser*browser){

Profile*profile=browser->profile();

. . . . . .extensions: :ProcessManager*manager=

ExtensionSystem: :Get(profile)->process_manager();

. . . . . .manager->OnBrowserWindowReady();

. . . . . .

}

这 个 函 数 定 义 在 文 件精品学习资料---收集网络如有侵权请联系网站删除

精品学习资料---收集网络如有侵权请联系网

站删除

external/chromium_org/chrome/browser/extensions/chrome_notification_ob server.cc中。

参数browser指向的是一个Browser对象。这个Browser对象描述的就是一个新打开的浏览器窗口 ChromeNotificationOb server类的成员函数OnBrowserWindowReady首先调用它的成员函数profile获得浏览器在启动过程中创建的Profile然后再根据这个Profile获得一个ProcessManager对象。有了这个ProcessManager对象之后就可以调用它的成员函数OnBrowserWindowRe ady用来通知它有一个新的浏览器窗口打开了。浏览器启动时创建Profile的过程 以及根据Profile创建ProcessManager对象的过程可以参考前面Chromium扩展Extension加载过程分析一文。ProcessManager 类 的 成 员 函 数OnBrowserWindowReady在执行的过程中就会为当前加载的Extension创建BackgroundPage如下所示

精品学习资料---收集网络如有侵权请联系网

站删除

精品学习资料---收集网络如有侵权请联系网

站删除

[cpp]viewplaincopy在CODE上查看代码片派生到我的代码片voidPro cessManager: :OnBrowserWindowReady(){. . . . . .

CreateBackgroundHo stsForPro fileStartup();

}

这 个 函 数 定 义 在 文 件external/chromium_org/extensions/browser/process中。

ProcessManager 类 的 成 员 函 数OnBrowserWindowReady调用另外一个成员函数CreateBackgroundHo stsForPro fileStartup为当前加载的Extension创建B ackgroundPage如下所示

[cpp]viewplaincopy在CODE上查看代码片派生到我的代码片voidProcessManager: :CreateBackgroundHo stsForPro fil e S tartup(){

精品学习资料---收集网络如有侵权请联系网

站删除

精品学习资料---收集网络如有侵权请联系网

站删除

. . . . . .constExtensionSet&enabled_extensions=

ExtensionRegistry: :Get(GetBrowserContext())->enabled_extensions();for(ExtensionSet: :const_iteratorextension=enabled_extensions.begin();extension!=enabled_extensions.end();

++exten sion){

CreateB ackgroundHo stForExtensionLo ad(this,extension->get());

. . . . . .

}

. . . . . .

}

这 个 函 数 定 义 在 文 件external/chromium_org/extensions/browser/process中。

精品学习资料---收集网络如有侵权请联系网

站删除

精品学习资料---收集网络如有侵权请联系网

站删除

在前面Chro mium扩展Exten sion加载过程分析一文提到 Chromium的Browser进程在启动的时候 会将那些状态设置为Enabled的Exten sion保存在一个Exten sionRegistry 的EnabledList中。 ProcessManager类的成员函数CreateBackgroundHo stsForPro fileStartup主要就是遍历这个EnabledList中的每一个Extension并 且 调 用 函 数CreateB ackgroundHo stForExtensionLoad检查它们是否指定了BackgroundPage。如果指定了那么就会进行加载。

函数CreateBackgroundHostForExtensionLoad的实现如下所示

[cpp]viewplaincopy在CODE上查看代码片派生到我的代码片staticvoidCreateBackgroundHostForExtensionLoad(

ProcessManager*manager,constExtension*extensio精品学习资料---收集网络如有侵权请联系网

站删除

精品学习资料---收集网络如有侵权请联系网

站删除

n){

DVLOG(1)<<"CreateBackgroundHo stForExtensionLoad";if(BackgroundInfo: :HasPersistentBackgroundPage(extension))manager->CreateBackgroundHo st(extension,

B ackgroundInfo: :GetB ackgroundURL(extension));}

这 个 函 数 定 义 在 文 件external/chromium_org/extensions/browser/process中。

函数CreateBackgroundHostForExtensionLoad首先检查参数extension描述的Extension是否指定了类型为persitent的BackgroundPage。如果指定了那么就会调用参数man a ge r指向的一个ProcessManager 对 象 的 成 员 函 数CreateB ackgroundHo st对它进行加载。对于非persitent的BackgroundPage它们只会在特定事件发生时才会被加载。本文主要以类型为persitent的B ackgroundPage为例说明它们的加精品学习资料---收集网络如有侵权请联系网

站删除

精品学习资料---收集网络如有侵权请联系网

站删除

载过程。非persitent的BackgroundPage的加载过程也是类似的。

函数CreateBackgroundHostForExtensionLoad在调用 ProcessManager 类的成员 函数CreateB ackgroundHo st加载一个BackgroundPage之前首先要获得这个B ackgroundPage的URL。这个URL是通过调用B ackgroundIn fo类的静态成员函数GetB ackgroundURL获得的如下所示[cpp]viewplaincopy在CODE上查看代码片派生到我的代码片

GURLB ackgroundInfo: :GetB ackgroundURL(con stExtension*extension){constBackgroundInfo&info=GetBackgroundInfo(extension);if(info.b ackground_scripts_.empty())returninfo.b ackground_url_;returnextension->GetResourceURL(kGeneratedB ackgroundPageFilename);

精品学习资料---收集网络如有侵权请联系网

站删除

BuyVM迈阿密KVM上线,AMD Ryzen 3900X+NVMe硬盘$2/月起

BuyVM在昨天宣布上线了第四个数据中心产品:迈阿密,基于KVM架构的VPS主机,采用AMD Ryzen 3900X CPU,DDR4内存,NVMe硬盘,1Gbps带宽,不限制流量方式,最低$2/月起,支持Linux或者Windows操作系统。这是一家成立于2010年的国外主机商,提供基于KVM架构的VPS产品,数据中心除了新上的迈阿密外还包括美国拉斯维加斯、新泽西和卢森堡等,主机均为1Gbps带...

腾讯云CVM云服务器大硬盘方案400GB和800GB数据盘方案

最近看到群里的不少网友在搭建大数据内容网站,内容量有百万篇幅,包括图片可能有超过50GB,如果一台服务器有需要多个站点的话,那肯定默认的服务器50GB存储空间是不够用的。如果单独在购买数据盘会成本提高不少。这里我们看到腾讯云促销活动中有2款带大数据盘的套餐还是比较实惠的,一台是400GB数据盘,一台是800GB数据盘,适合他们的大数据网站。 直达链接 - 腾讯云 大数据盘套餐服务器这里我们看到当前...

racknerd新上架“洛杉矶”VPS$29/年,3.8G内存/3核/58gSSD/5T流量

racknerd发表了2021年美国独立日的促销费用便宜的vps,两种便宜的美国vps位于洛杉矶multacom室,访问了1Gbps的带宽,采用了solusvm管理,硬盘是SSDraid10...近两年来,racknerd的声誉不断积累,服务器的稳定性和售后服务。官方网站:https://www.racknerd.com多种加密数字货币、信用卡、PayPal、支付宝、银联、webmoney,可以付...

extension_dir为你推荐
百度爱好者知道手机怎么查询百度账号易烊千玺弟弟创魔方世界纪录易烊千玺的弟弟楠楠,在TFBOYS三周年牵的那个小女孩是谁?sonicchat国外军人的左胸上有彩色的阁子是什么意思百度商城百度知道一般一天能挣多少钱?西部妈妈网啊,又是星期天冯媛甑尸城女主角叫什么名字网站检测如何进行网站全面诊断5xoy.com求个如月群真汉化版下载地址抓站工具抓鸡要什么工具?lcoc.topeagle solder stop mask top是什么层
免费linux主机 申请空间 台湾谷歌地址 dux 息壤代理 空间首页登陆 备案空间 starry 贵阳电信测速 深圳域名 攻击服务器 博客域名 wordpress空间 winserver2008 restart reboot 饭桶 rewrite规则 usb大容量存储设备 魔兽世界服务器维护 更多