本文中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")));
 
IDR_EXTENSION_MANIFEST的定义见下面
 
 

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" />
 
  这里的resources\就是上面(1)中的 src\chrome\browser\resources\
 

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文件之外的其他独立文件都加进来

附件:python脚本,从extension目录生成相应的xml声明

二、其它修改

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的值

src\third_party\WebKit\Source\core\loader\FrameLoader.cpp 
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中内置扩展,以及一些简单的定制的更多相关文章

  1. js中内置有对象

    statpot:使用mongo+bootstrap+highcharts做统计报表 最近做了一个统计项目,这个统计项目大致的需求是统计接口的访问速度.客户端会调用一个接口来记录接口的访问情况,我的需求 ...

  2. JavaScript中内置对象的一些属性及方法

    Javascript对象总结 JS中内置了17个对象,常用的是Array对象.Date对象.正则表达式对象.string对象.Global对象 Array对象中常用方法: Concat():表示把几个 ...

  3. CorelDRAW中内置的视频教程在哪里?

    CorelDRAW中内置了很多教学内容和视频教程,可以帮助用户快速学习和掌握CorelDRAW的使用方法,创作出个性化的作品.很多小伙伴表示找不到软件自带学习视频,现在小编就来告诉你. 用户可以通过两 ...

  4. amazeui中内置的web组件有哪些且如何用

    amazeui中内置的web组件有哪些且如何用 一.总结 一句话总结: 1.组件还是jquery.js+amazeui.js,和插件一样,准确的说是amazeui.css+jquery.js+amaz ...

  5. 第8.9节 Python类中内置的查看直接父类的__bases__属性

    终于介绍完了__init__方法和__new__方法,接下来轻松一下,本节介绍类中内置的__bases__属性. 一. 语法释义 Python 为所有类都提供了一个 bases 属性,通过该属性可以查 ...

  6. ES6新特性:Javascript中内置的延迟对象Promise

    Promise的基本使用: 利用Promise是解决JS异步执行时候回调函数嵌套回调函数的问题, 更简洁地控制函数执行流程: 通过new实例化Promise,  构造函数需要两个参数, 第一个参数为函 ...

  7. 详解Python中内置的NotImplemented类型的用法

    它是什么? ? 1 2 >>> type(NotImplemented) <type 'NotImplementedType'> NotImplemented 是Pyth ...

  8. 11 shell中内置关键字[[]]:检查条件是否成立

    0.[[]] [] (())的对比 1.[[]]支持正则表达式 0.[[]] [] (())的对比 [[ ]] 对数字的比较不友好,所以使用 if 判断条件时,建议用(())来处理整型数字,用[[]] ...

  9. Android源码中内置包含so文件的APK文件

    方法一: 在packages/apps下面以需要预置的APK名字创建文件夹,以预置一个名为Test的APK为例 将Test.apk放到packages/apps/Test下面 在packages/ap ...

随机推荐

  1. 【转】 完美配置Tomcat的HTTPS

    Tomcat配置HTTPS的文章到处都有,过程也比较简单,随后文中会转一段过来. 但对于启用APR情况下报异常“java.lang.Exception: Connector attribute SSL ...

  2. 设计模式笔记之一:MVP架构模式入门(转)

    写在前面:昨天晚上,公司请来专家讲解了下MVP,并要求今后各自负责的模块都要慢慢的转到MVP模式上来.以前由于能力有限,没有认真关注过设计模式.框架什么的,昨晚突然兴趣大发,故这两天空闲时间一直在学习 ...

  3. iOS 消息推送原理及实现总结 分类: ios技术 2015-03-01 09:22 70人阅读 评论(0) 收藏

    在实现消息推送之前先提及几个于推送相关概念,如下图: 1. Provider:就是为指定IOS设备应用程序提供Push的服务器,(如果IOS设备的应用程序是客户端的话,那么Provider可以理解为服 ...

  4. java8 stream ,filter 等功能代替for循环

    直接上代码,比较实在. 对象A public Class A{ private Long id; private String userName; ..... ....省略get和set方法 } 在L ...

  5. Linux_System11

    1.查看/var目录的大小:1)ll -hd /var 查看目录的实际大小2)du -sh /var 查看目录所占磁盘空间大小修改权限:chmod 750 hunan修改属主和属组:groupadd ...

  6. KMP算法深入解析

    本文主要介绍KMP算法原理.KMP算法是一种高效的字符串匹配算法,通过对源串进行一次遍历即可完成对字符串的匹配. 1.基础知识的铺垫 字符串T的前k(0 =< k <=tlen)个连续的字 ...

  7. PHP 中 static 和 self 的区别

    使用 self:: 或者 __CLASS__ 对当前类的静态引用,取决于定义当前方法所在的类: 使用 static:: 不再被解析为定义当前方法所在的类,而是在实际运行时计算的.也可以称之为" ...

  8. Struts2框架学习(一)

    Struts2框架学习(一) 1,Struts2框架介绍 Struts2框架是MVC流程框架,适合分层开发.框架应用实现不依赖于Servlet,使用大量的拦截器来处理用户请求,属于无侵入式的设计. 2 ...

  9. HDU-2077-汉诺塔IV

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=2077 这题就我个人认为比较难,做了很久,递推关系式一直找不出正确的来,找很多递推关系,提交了很多次,全 ...

  10. MySQL ibdata多路径扩容

    vi /etc/my.cnf innodb_data_home_dir = innodb_data_file_path= /data/mysql/ibdata1:10M:autoextend(为目前i ...