怎样在chrome中内置扩展,以及一些简单的定制
本文中chromium 版本为54
参考资料:
chromium如何新增extension API以及添加内部扩展
http://slides.com/luyuan/grit#/
一、嵌入扩展
1. 复制扩展的资源文件夹,到 src\chrome\browser\resources\ 文件夹下,
其中manifest.json文件的“key”的来源:通过载入一个自定义的crx插件然后在chromium的appdata下找到该插件的key,该key可能被用于计算extension-id,如果扩展无法调用接口,有可能是key不对,在src\base\base64.cc的Base64Decode函数处做检查。
(在chromium中用开发者模式添加你的扩展,找到用户数据中以id命名的文件夹,得到manifest.json中的key)
如果没有这个key,chromium启动就会崩溃。
2. 在src\chrome\browser\extensions\component_loader.cc文件下,
AddDefaultComponentExtensions()函数中添加:
Add(IDR_EXTENSION_MANIFEST,
base::FilePath(FILE_PATH_LITERAL("extension_name")));
3.在src\chrome\browser\browser_resources.grd 文件下,定义一个ID IDR_EXTENSION_MANIFEST跟扩展mainfest.json的关联
<include name="IDR_EXTENSION_MANIFEST" file="resources\extension_dir\manifest.json" type="BINDATA" />
4.在src\chrome\browser\extensions\component_extensions_whitelist\whitelist.cc文件,
bool IsComponentExtensionWhitelisted(int manifest_resource_id)函数中添加:
case IDR_EXTENSION_MANIFEST:
5.把web资源添加到src\chrome\browser\resources\component_extension_resources.grd文件中,用于资源打包,必须把除了mainfest.json文件之外的其他独立文件都加进来。
二、其它修改
1.安装后首次运行的欢迎页面URL
src\chrome\app\resources\locale_settings.grd 中修改 IDS_WELCOME_PAGE_URL
2.改图标
替换
src\chrome\app\theme\chromium
src\chrome\app\theme\default_100_percent\chromium
src\chrome\app\theme\default_200_percent\chromium
下面相关的图片
exe图标在资源文件src/chrome/app/chrome_exe.rc中定义IDR_MAINFRAME,chrome.dll里也定义了一个IDR_MAINFRAME,在chrome_dll.rc中。
3.菜单修改
以新建标签为例:
符号定义:src\chrome\app\chrome_command_ids.h(49):#define IDC_NEW_TAB 34014
命令执行:src\chrome\browser\ui\browser_command_controller.cc(367): case IDC_NEW_TAB:
初始化状态:src\chrome\browser\ui\browser_command_controller.cc(802) BrowserCommandController::InitCommandState
添加菜单项:src\chrome\browser\ui\toolbar\app_menu_model.cc(787): AddItemWithStringId(IDC_NEW_TAB, IDS_NEW_TAB);
4.改产品名称
- src\chrome\app\chromium_strings.grd 中的 IDS_PRODUCT_NAME 和其它带Chromium字样的字符串,IDS_PRODUCT_NAME 也出现在关于页面中
- src\chrome\app\resources\chromium_strings_XX.xtb 等语言相关的文件中的Chromium字样,主要是<translation id = "2910007522516064972">&Chromium Browser সম্পর্কে< / translation>这句(关于chrome...)。
- src\components\components_chromium_strings.grd : IDS_VERSION_UI_LICENSE (关于...页面下面的感谢声明)
- src\components\strings\components_chromium_strings_en-GB.xtb <translation id="4365115785552740256"> 同上,还有其它语言的
- <translation id="459535195905078186">Chromium 应用</translation> 改成 <translation id="459535195905078186">Chromium Browser 应用</translation>
5.移除“缺少Google API 密钥……”的警告
找到src\chrome\browser\ui\startup\startup_browser_creator_impl.cc GoogleApiKeysInfoBarDelegate::Create一句
GoogleApiKeysInfoBarDelegate::Create(InfoBarService::FromWebContents(
browser->tab_strip_model()->GetActiveWebContents()));
,注释掉。
注:这个警告是编译时 google_api_key = "no" 的结果,不使用api key,你定制的浏览器就没法登录google账户。
6.在代码中加命令行参数
src\chrome\app\chrome_main_delegate.cc ChromeMainDelegate::BasicStartupComplete 中
bool ChromeMainDelegate::BasicStartupComplete(int* exit_code) { base::CommandLine& command_line =
*base::CommandLine::ForCurrentProcess();
// add custom switches
command_line.AppendSwitch(switches::kProcessPerSite);
command_line.AppendSwitch(switches::kEnableExperimentalWebPlatformFeatures);
7.获取chrome APP的app-id
进入 chrome://extensions/ =》 开发者模式 =》 加载APP =》 详细信息 =》创建快捷方式 =》 快捷方式属性里有 --app-id=xxxxxx
8.修改navigator.userAgent/appVersion的值
String FrameLoader::userAgent() const
String userAgent = client()->userAgent();
String userAgent = String::format("%s 你想加的内容/1.0.0.5", client()->userAgent().utf8().data());
注:因为沙箱的原因,这样硬编码只是权宜之计,最好是跟browser process通信获得本地配置文件中的版本信息。
附件:
grd_generator.py
# -*- coding: utf-8 -*- import os from Tools.scripts.treesync import raw_input def traverse(rootDir):
for lists in os.listdir(rootDir):
path = os.path.join(rootDir, lists)
if os.path.isfile(path):
if os.path.basename(path) == 'manifest.json':
continue
rel_path = os.path.relpath(path, parent_dir)
symbol = rel_path.replace('\\', '_').replace('-', '_').replace('.', '_').upper()
print('<include name="IDR_' + symbol + '" file="' + rel_path + '" type="BINDATA" />')
# print(path)
if os.path.isdir(path):
traverse(path) dir = raw_input('请输入扩展文件夹路径:').strip('\n')
parent_dir = os.path.abspath(os.path.join(dir, os.pardir))
traverse(dir)
怎样在chrome中内置扩展,以及一些简单的定制的更多相关文章
- js中内置有对象
statpot:使用mongo+bootstrap+highcharts做统计报表 最近做了一个统计项目,这个统计项目大致的需求是统计接口的访问速度.客户端会调用一个接口来记录接口的访问情况,我的需求 ...
- JavaScript中内置对象的一些属性及方法
Javascript对象总结 JS中内置了17个对象,常用的是Array对象.Date对象.正则表达式对象.string对象.Global对象 Array对象中常用方法: Concat():表示把几个 ...
- CorelDRAW中内置的视频教程在哪里?
CorelDRAW中内置了很多教学内容和视频教程,可以帮助用户快速学习和掌握CorelDRAW的使用方法,创作出个性化的作品.很多小伙伴表示找不到软件自带学习视频,现在小编就来告诉你. 用户可以通过两 ...
- amazeui中内置的web组件有哪些且如何用
amazeui中内置的web组件有哪些且如何用 一.总结 一句话总结: 1.组件还是jquery.js+amazeui.js,和插件一样,准确的说是amazeui.css+jquery.js+amaz ...
- 第8.9节 Python类中内置的查看直接父类的__bases__属性
终于介绍完了__init__方法和__new__方法,接下来轻松一下,本节介绍类中内置的__bases__属性. 一. 语法释义 Python 为所有类都提供了一个 bases 属性,通过该属性可以查 ...
- ES6新特性:Javascript中内置的延迟对象Promise
Promise的基本使用: 利用Promise是解决JS异步执行时候回调函数嵌套回调函数的问题, 更简洁地控制函数执行流程: 通过new实例化Promise, 构造函数需要两个参数, 第一个参数为函 ...
- 详解Python中内置的NotImplemented类型的用法
它是什么? ? 1 2 >>> type(NotImplemented) <type 'NotImplementedType'> NotImplemented 是Pyth ...
- 11 shell中内置关键字[[]]:检查条件是否成立
0.[[]] [] (())的对比 1.[[]]支持正则表达式 0.[[]] [] (())的对比 [[ ]] 对数字的比较不友好,所以使用 if 判断条件时,建议用(())来处理整型数字,用[[]] ...
- Android源码中内置包含so文件的APK文件
方法一: 在packages/apps下面以需要预置的APK名字创建文件夹,以预置一个名为Test的APK为例 将Test.apk放到packages/apps/Test下面 在packages/ap ...
随机推荐
- 修改替换/system/framework/framework.jar后重启手机为何没有效果?
自Android 5.0开始android默认使用art(Android4.4开始有实验性质的art),取代原来的Dalvik, art会加载boot.art和boot.oat两个文件(静态编译优化, ...
- BZOJ 1101 [POI2007]Zap ——Dirichlet积
[题目分析] Dirichlet积+莫比乌斯函数. 对于莫比乌斯函数直接筛出处理前缀和. 对于后面向下取整的部分,可以分成sqrt(n)+sqrt(m)部分分别计算 学习了一下线性筛法. 积性函数可以 ...
- css 之!important
主要是自己犯了个错误: 把 !important 放到了分号后面; 正确写法写法: .current{ background-color: #f1f1f1; border-left: 2px soli ...
- .net面试题【持续更新.....】
1.C#中readonly和const的区别? 2.C#中的排序继承自哪个接口?Icompare 3.阐述单点登录的实现原理? 4.C#中property和Attribute的区别? 5.Datase ...
- 【转】mysql-5..6.23-win64.zip安装及配置
[强烈建议!!!!]把文件夹的名字也改成如下所说的,不然即使你什么环境配置都对,启动服务的时候依然会出现‘net’不是计算机内部或外部的命令这种令人很郁闷的问题了! 原文链接:http://jingy ...
- [Angular Tutorial] 8 - Templating Links & Images
在这一步中,我们将会在电话列表中为电话添加略图,并附上链接,当然现在也不会链接去哪.在随后的步骤中,我们将使用这些链接来展示电话列表中额外的信息. ·现在电话列表中会有链接和图片. 最重要的不同在下面 ...
- UWP项目的包无法通过本地校验程序
在UWP工程中,我们打出的包Appx需要通过本地的校验程序校验通过后才可以进行商店的提交.在校验程序汇报的不通过原因当中,除了显而易见的因为美术资源不规范.代码调用不合法API等原因之外,还有一些奇怪 ...
- jQuery插件Flot实战Demo
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8&qu ...
- 响应的系统设置的事件——Configuration类简介
Configuration类专门用于描述手机设备上的配置信息,这些配置信息既包括用户特定的配置项,也包括系统的动态设置配置. 程序可调用Activity的如下方法来获取系统的Configuration ...
- WebSocket协议再认识
WebSocket出现之前 在线聊天室.在线客服系统.评论系统.WebIM等这些应用有一个共同点,就是用户不需要去刷新浏览器就能够从服务器获得最新的数据,这就用到了推送技术. WebSocket出现之 ...