Chromium预置搜索引擎

Chromium是Google主导一个开源浏览器项目,而Google是以搜索引擎起家的,因此Chromium里面搜索是个很重要的功能,给它增加了很多特性。我写篇博客介绍一下Chromium里面的搜索功能。 预置的搜索引擎 在浏览器的地址栏里面输入chrome://settings/searchEngines就可以管理搜索引擎。里面有一些预置的搜索引擎,你可以删除它们也可以添加一些你自定义的搜索引擎:如下图所示: 预置的搜索引擎是由Chromium代码prepopulated_engines.json定义的,这个文件的注释值得一读。文件其实就是包含了json格式的一些数据,在编译的时候会动态生成prepopulated_engine.h/cc文件。值得注意的是:每次修改过prepopulated_engines.json文件里面的数据都需要自增int_variables.kCurrentDataVersion的值,否则你的修改可能不会生效。原因是浏览器运行之后会把预置搜索引擎的数据保存在Web... Read More | Share it now!

Chromium UI框架widget

很早之前就想把Chromium的UI框架总结一遍。知道一个事物并向别人描述清楚并非是一件容易的事情,而且它又是如此的复杂,我没有把握把Chromium的UI框架给别人讲清楚,只有尽力而为。 我准备分三部分来讲Chromium的UI框架。首先是Widget,它是View的宿主,也是连接操作系统原生的UI系统的枢纽,同时还与CC(Chrome... Read More | Share it now!

Breakpad崩溃报告系统介绍

Breakpad是Google开发的一套开源的崩溃报告系统,它是跨平台的,支持Windows、Linux、Mac等操作系统,被Chrome、Firefox等各大软件采用。最近做Chromium内核升级,需要把Breakpad升级成Crashpad,故再看看Breakpad项目的实现,写篇博客总结一下。 Breakpad的机制 如上图所示是Breakpad的工作机制,它是参考Windows上那套崩溃处理机制。Windows上面编译器把代码编译成可执行文件,同时生成包含调试信息的PDB符号文件。程序运行发生崩溃时,将崩溃的堆栈等信息存储成一个dump文件。调试器打开dump文件并读取PDB里面的调试信息,就可以看到崩溃的堆栈。因为Breakpad是跨平台的,所以在Linux等其他平台也实现了Windows上的生成调试符号、生成dump、处理dump等功能。 Breakpad分为3个主要的模块: Client。Client模块会被编译到客户端程序中,它的职责包括捕获客户端的异常、生成崩溃的dump文件、上报dump文件到服务器。在Windows平台,我们只需要这部分就足够了。 Symbol... Read More | Share it now!

踏破铁鞋无觅处

最近学习Chromium的UI渲染,于是编译一下ui/views/examples的例子工程来看看。运行views_examples_exe,发现界面是上下颠倒显示。 一开始以为是例子工程可能好久没有维护了,在代码升级的过程中出了偏差,导致界面颠倒显示。于是自己动手写了一个例子工程,也是颠倒显示。看了下aura_demo工程界面的坐标,显示也是颠倒。我意识到这不是Aura层的问题,可能是CC模块通过GPU硬件加速渲染出来的结果本身就是颠倒的。 我家虚拟机里有Chromium... Read More | Share it now!

Chromium fast start机制

我们知道Chromium有一个Browser进程,多个Renderer进程。如果已经运行了Chromium浏览器,再通过快捷方式启动浏览器,会打开新的浏览器窗口,显示新标签页。或者创建一个新的浏览器进程,给它传递一个url参数,比如https://www.baidu.com/,就会在现有的窗口里面打开一个百度的页面。查看浏览器的进程,发现仍然只有Browser进程,那么第二次创建的新创建的进程哪里去了呢? 这就是Chromium的fast... Read More | Share it now!

Chromium多线程

之前也写过Chromium多线程相关的博客,就不再重复了。这两天基于Chromium50画了一下Thread相关的图,想到了一个恰当的比喻,分享一下。 这是相关的类图。 我们把线程Thread比喻成一个机器人,我们告诉机器人怎么做事,那我们就可以跟机器人并行做一些事情。 我们把要做的事情按照协议打包成一个Task,这个Task包含各种所需的信息,机器人拿到Task就知道该如何做事。打包Task就是使用base::Bind接口返回一个无参数无返回值的Callback,这样特殊的Callback称之为Closure。 一开始机器人是出于关机状态的,所以需要调用Thread::Start开动机器人。然后机器创建一个UI交互界面MessageLoop,我们可以通过task_runner给这个MessageLoop... Read More | Share it now!

Chromium静默安装扩展

Chromium有非常强大的扩展系统,很多功能可以通过扩展实现,比如广告过滤,购物比价。所以开发Chromium功能,不一定需要修改Chromium的C++源代码,只需要做一个扩展就可以了。 通过Chromium的扩展来增强浏览器功能,有多个优点: 功能耦合低。浏览器客户端只需要提供相应的接口API,扩展去调用相应的接口API即可。 开发客户端接口API和开发扩展可以并行。另外Chromium有完善的扩展系统,调试等等都非常方便。 升级独立。以后升级扩展就可以升级功能了,而不需要升级整个浏览器。 开发速度开。因为扩展大多数是用的web开发技术,就是html和js,所以开发起来很快。而修改Chromium的c++代码则复杂很多。 随着Chromium安全策略的收紧,一般来说,只能通过Chrome的应用商店来安装扩展,禁止其他扩展静默安装。https://developer.chrome.com/extensions/external_extensions根据这篇文档的描述,浏览器想内置一些扩展限制很多,比较麻烦。如果自己定制浏览器,想默认安装一些扩展,不是很方便。 其实,如果改代码的话,就没有任何限制,直接调用extensions::CrxInstaller去安装。下面是静默安装本地crx扩展文件的例子: 以前大概是2015年前,Chromium也是可以静默的安装内置的扩展的,现在代码里面需要改一点也是支持的。 把我们需要内置的扩展放到chrome/browser/resources/default_apps里面,这个目录已经有了几个其他的内置扩展,比如docs.crx、drive.crx等等。 此外需要在external_extensions.json里面添加我们扩展的信息。 当浏览器启动的时候,ExtensionService会调用default_apps::Provider会按照external_extensions.json的描述去安装我们内置的扩展。   ... Read More | Share it now!

利用Tracing阅读Chromium代码

Chromium中的Tracing工具可以记录每个函数的执行时间,是用来诊断浏览器性能问题的工具。它还有一个意想不到的用处,就是帮我们理解Chromium的代码,因为Tracing会把调用过的函数按照时间轴输出出来,通过Tracing的图形化界面,可以很清楚的明白对象函数之间的调用关系。 components/tracing/tracing_switches.cc代码文件的注释很清楚了介绍了Tracing命令行参数的用法: trace-config-file。这个开关指定Tracing命令行的配置文件,Tracing既可以通过命令行字符串设置配置,也可以通过加载一个配置文件来设置配置。 trace-shutdown。记录浏览器关闭时候到的Tracing信息。 trace-shutdown-file。把trace-shutdown记录的信息保存到一个指定的文件中。 trace-startup。记录浏览器启动时候的Tracing信息。 trace-startup-file。把trace-startup记录的信息保存到一个指定的文件中。 trace-startup-duration。设置trace-startup记录的秒数。 另外在trace-startup、trace-shutdown里面可以设置记录的Tracing类别,比如–trace-startup=base,net,就只会记录base和net类别的Tracing。 比如把以下命令行参数传递给浏览器: 它会记录浏览器启动的时候的Tracing信息,包含browser、content、input、renderer、renderer_host、startup、ui类别,记录10秒的数据,并把数据保存到tracing.json文件中。 然后浏览器地址栏中输入chrome://tracing/,点击左上角的Load按钮,加载我们生成的tracing.json数据文件,然后浏览器就会把数据以图形的样式展现给我们,如下图所示: 图中清楚显示了浏览器启动时做的各种初始化的工作,以及各种工作的先后次序。 Tracing中的数据是根据代码中的TRACE_EVENT宏收集到的: 我们也可以增进自己的数据,宏的第一个参数是类别。 ... Read More | Share it now!