如何扩展Chromium各层的接口

添加新功能时,可能需要增加各层的接口,接口如何加?必然需要向Chromium的原则看齐。

首先Chromium的模块设计遵循依赖倒置原则,上层模块依赖于低层模块,低层模块不会依赖上层模块的实现。

再者要区分增加接口的两种目的:

  1. 提供功能供外部使用 (一些以功能定义的接口属于这类,如WebView,NavigationState等 )。

  2. 允许将一些业务逻辑在外部实现 (命名中带有client,observer或delegate属于这类)。

除了命名上不同外,可以参考的实现方式也不同。


 1. 使用IPC Message Filter

  Chromium为了避免添加新功能时使得接口类”膨胀”,特别提供了一系列的Helper (Observers)。当需要实现新功能时,可以通过这些observers,过滤IPC消息,实现自己的功能。

如果新功能可以向外派发或接收IPC消息完成通知或回调功能,则优先使用IPC Filter的模式。

   Renderer进程中实现RenderViewObserver接口可以接收处理RenderView上的IPC消息。ChromeExtensionHelper是一个用来监控Frame加载及关闭的示例。

  如果有一部分代码在WebKit里,不要直接扩展WebViewClient, 可以定义一个新的接口给WebKit调用,然后在Render端的实现。可以参考WebAutoFillClient的实现。

                                        

  Browser进程中通过实现WebContentsObserver的方式过滤IPC消息。具体的做法可以参考TabHelper。

  WebKit模块等其它类消息

    可以通过实现BrowserMessageFilter接口,在RenderProcessHostImpl::CreateMessageFilters()再将其加入到Filter列表中(render_process_host_impl.cc)。

 如果一个功能需要处理不同的IPC消息,就不要放在render_messages.h里了,应当放到独立的文件里,比如pepper_messages.h。

 详情请参考:How to add new features

2. 提供独立的接口

如果功能相对独立,则可以在模块中增加新的接口提供出去。如blink模块中的很多功能,下面是其中WebImageCache的类图: 

如果需要外部实现某些业务逻辑,则可以使用观察者模式或者允许以继承的方式实现,对应提供一个注册接口或接口类(interface)。

比如blink::Prerender需要外部定义实现blink::WebPrerenderingSupport时才有功能,这个blink::WebPrerenderingSupport就是一个要求上层类实现的接口类:

               

这是一个命名比较奇特的例子。在命名上注意client/delegate表示对外部业务逻辑依赖较重,而observer则表示逻辑上不存在对外部业务的依赖,仅仅是通知。

3. 以独立的方式扩展既有接口

如果是对既有功能的直接扩展,且无法分离成新的接口,则可以尝试使用如下方法扩展:

  a. 继承旧的接口或使用装饰器、组合等模式扩展接口功能。

     如果接口本身没有定义上的兼容性需求,上层模块可以根据需要选择使用新旧接口,就可以使用这个方式。

     WebViewClient可以近似看作一个示例:

          

  b. 封装到旧的接口中 (如组合,Helper class等方式) 

      如果接口需要保持兼容性,接口的定义不能修改,只能改变其行为,就可以应用这种方式。变更对上层模块透明。     

4. 修改原有接口

最后才能选择修改原有接口,但不建议直接修改接口函数定义,而是以新增接口函数的方式来实现。

如果使用C++实现,还应当将实现文件独立出来。

转载请注明出处: http://blog.csdn.net/horkychen

时间: 2025-01-30 17:52:13

如何扩展Chromium各层的接口的相关文章

生成浮动层的接口知识总结

我们在做应用开发时很经常地要生成浮动层,里面显示一些我们需要显示的内容.这里写一个生成浮动层的接口.如下: Js代码 function minimizeExec(floatLyrComm){ var execObjCnt = $(floatLyrComm+"Cnt"); var execObjDiv = $(floatLyrComm); var eventElement = event.srcElement || event.target; if(execObjCnt.style.di

php基于curl扩展制作跨平台的restfule 接口

  这篇文章主要介绍了php基于curl扩展制作跨平台的restfule 接口的相关资料以及详细的代码,有需要的小伙伴可以参考下. restfule 接口 适用的平台:跨平台 所依赖:curl扩展 git:https://git.oschina.net/anziguoer/restAPI ApiServer.php ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33

扩展信息怎么弄的,接口在哪里?-Android端?

问题描述 扩展信息怎么弄的,接口在哪里?-Android端? 解决方案 发普通消息的时候会带着扩展信息,接口文档http://easemob.com/docs/android/advanced/解决方案二:我也想知道,哈哈解决方案三:本帖最后由 chaoren 于 2015-2-27 13:24 编辑 SDK包含的数据类型只有语音,图片,文字,文件,视频,但是针对这几种并不能满足所有的app,环信提供的自定义扩展属性正好弥补了这个缺陷,你想做一个图文混排,名片等不同需求都可以很好的处理,举个制作

Dreamweaver扩展:Web开发jQuery UI接口框架

绝大多数的Web设计师和Web开发者可能都会经常使用Adobe的产品来完成工作,本文整理了5个在Web设计开发中最常用jQuery UI 接口框架,帮助你提高项目开发效率.这些jQuery UI 框架操作非常简单,即使你是初学者. 安装这些Dreamweaver扩展前,你需要检查你的Dreamweaver和Extension Manager版本是否为当前最新版本: Dreamweaver CS4 and Extension Manager CS4. 1. jQuery UI Calendar j

php基于curl扩展制作跨平台的restfule 接口_php实例

restfule 接口 适用的平台:跨平台 所依赖:curl扩展 git:https://git.oschina.net/anziguoer/restAPI ApiServer.php <?php /** * @Author: yangyulong * @Email : anziguoer@sina.com * @Date: 2015-04-30 05:38:34 * @Last Modified by: yangyulong * @Last Modified time: 2015-04-30

OledbHelper ,c#访问OLEDB数据源的一个数据访问层公共接口文件

问题描述 usingSystem;usingSystem.Collections.Generic;usingSystem.Text;//引入必须的命名空间usingSystem.Data;usingSystem.Data.SqlClient;usingSystem.Configuration;namespaceDAL{publicclassSqlHelper{#region静态似有变量///<summary>///SqlConnection对象实例///</summary>priv

一个分层架构设计的例子(2)

接着上一篇关于分层架构的讨论,一个分层架构设计的例子(1).上篇介绍了实体类(Entity).数据库访问类(DAL).数据访问接口(IDAL)的相关设计,本篇主要讨论下面几个部分内容:业务逻辑层.缓存机制.界面层等方面.业务逻辑层,主要是业务逻辑基类的设计,由于数据库访问类(DAL)的基类封装了大量的操作实现,因此,业务逻辑层的主要工作是进一步封装对底层访问接口的实现,如下所示.     public class BaseBLL<T> where T : BaseEntity, new()  

java-数据访问层和业务逻辑层为什么要定义接口?

问题描述 数据访问层和业务逻辑层为什么要定义接口? 数据访问层可能会操作不同的数据库,可是业务逻辑层我感觉没必要吧,不管从哪个数据库都是一种逻辑判断吧?我感觉没必要写两个实现类 解决方案 首先,面向接口编程是一种常用的编程规范,使用接口有很多好处,例如便于扩展和代码维护等. 其次,DAO层使用接口,可能不同的数据库访问有不同的实现方法,这个用接口可能相对好理解一下: 而业务逻辑层用接口,是为了便于系统维护和扩展,万一哪一天整个业务流程变化了呢,那时我们只要重新一种实现,然后配置该类型的引用就可以

ASP.NET 三层架构使用IDAL 接口层有什么作用,有和妙用,使用业务逻辑层BLL直接调用数据层DAL不可以嘛。

问题描述 我们通常是UIweb层调用BLL层,BLL层调用DAL达到数据的交换.但是看到大多数项目是有个IDAL接口,只是声明方法没有任何的代码实现部分,代码实现部分都放在了DAL层,然后BLL层去调用IDAL接口层的方法实现,并没有去调用DAL层,UI层调用BLL层,这里的接口层有和作用,请教各位帮忙解答,不胜感激! 解决方案 解决方案二:IDAL是DAL层的类要实现的接口.DAL层的各类需要完成对数据库的访问,但是不同的数据库需要使用不同的DAL对象,这样对于BLL层来说无法实现数据库无关性