如何扩展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_internal.h里了,应当放到独立的文件里,比如pepper_file_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

时间: 2024-10-12 17:57:13

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

安卓自动化业务层测试接口

安卓自动化业务层测试接口 阅读前需知的基本知识: 1. uiautomator 脚本的执行通过shell命令调起执行,向执行的方法传递参数也是通过shell命令 2  调起的执行方法所在类必须要继承UIATestCasel类 3.  调起方法内部,职能通过bundle获取外部传递的参数,而不是通过函数参数的方式传递 抛出问题: 在新的自动化测试框架中,业务层属于API层级,非继承于UIATestCasel类(com.android.uiautomator.testrunner.UiAutomat

java web项目DAO层通用接口BaseDao与实现类BaseDaoImpl

在spring+hibernate的web项目中,处理数据层通常会使用Spring框架提供的HibernateTemplate类提供的方法.通常的用法是每一个实体类对应的去写DAO层的接口和实现类.每个实现类中都写hibernateTemp.save(entity).hibernateTemp.update(entity).hibernateTemp.get(id)...这样写固然没错,但存在着大量的重复代码.所以懒惰的程序员烦了,他们要写一个通用的实现类来解决这个问题,让DAO层解放出来.如果

java Web项目Service层通用接口和entityVo对象与entity对象转化问题的解决方案

Service层的接口中有一些比较常用方法,一次又一次的在新的Service层中被书写,所以懒惰的程序员又烦了,他们决定写个通用接口来解决这个问题. 有些项目中,实体类即承担接收表单数据的任务,又承担持久化任务,很省心.但有些项目中这两项任务的执行类不是同一个,一个Entity.java来执行数据 持久化的任务,一个EntityVo.java类来执行接收表单数据的任务.那么问题来了:Service层需要的是entityVo对象,而DAO层需要的是entity对象,这两个对象 会有一些相同的属性和

微服务迁移记(四):公共层、接口层和实现层搭建

公共层Nodule:zyproject-common,通用返回体.状态码枚举.自定义分页类.本来计划Entity放在common里的,后来想了下,还是放到接口层,反正其他层也都会引用接口层. 接口独立成一个Module:zyproject-api-service,定义访问接口,供实现类.表现层调用,其中Feign接口直接继续接口层,可以避免很多冗余代码 实现层Module:zyproject-api-service-impl,与数据库打交道,实现接口. 一.公共层 通用返回体是从网上抄的,Res

PPAPI中使用Chromium的3D图形接口

使用PPAPI的Graphics 3D接口做了一个小示例,鼠标点击插件区域,绘制颜色,效果与ppapi_simple类似. foruok原创,如需转载请关注foruok的微信订阅号"程序视界"联系foruok. 项目 项目与VS2013编译最简单的PPAPI插件这篇文章里说的ppapi_simple类似. 附加包含路径有些不同,如下: E:\sources\CEF\2526\chromium\src\ E:\sources\CEF\2526\chromium\src\ppapi\lib

教你快速高效接入SDK——渠道SDK的接入(就是实现抽象层的接口而已)

题记:很多做游戏开发的人,估计都或多或少地接过渠道SDK,什么UC,当乐,91,小米,360......据统计国内市场当前不下于100家渠道,还包括一些没有SDK的小渠道.每个渠道SDK接入的方法呢,多是大同小异.但是,正是这些小异,又让SDK的接入,产生了无穷无尽的变数.所以,接入SDK之前,如果你没有经验,或者没有被SDK坑过,那么当你看到这系列文章的时候,你很幸运,你可以避免这一切了.如果你之前被坑过,而且还在继续被坑着,那么现在,就是你解脱的时刻. 先将之前的每一篇做个索引,方便亲们查阅

自己在项目中的学习总结:利用工厂模式+反射机制+缓存机制,实现动态创建不同的数据层对象接口

工作一年多,自己小小的心得,方便自己以后查找.首先上架构截图: 且看截图,其中DALFactory为工厂类库,IDAL为接口类库,SQLServerDAL则为实际的数据层实现类库. 1.数据层实现.这个不多说,起始就是编写相关数据操作的方法. public partial class ActivityInfo:IActivityInfo { public int Add(ActivityInfo model) { reutrn 1; } } 2.IDAL接口 public interface I

EF架构~豁出去了,为了IOC,为了扩展,改变以前的IRepository接口

回到目录 使用了4年的IRepository数据仓储接口,今天要改变了,对于这个数据仓储操作接口,它提倡的是简洁,单纯,就是对数据上下文的操作,而直正的数据上下文本身我们却把它忽略了,在我的IRepository接口里根本没有数据上下文对象,这是不完整的,也许你会说,我使用了基类,数据基类里有数据上下文,是的,我也是那样用的,但有时,这种方法有些死板了,真的,当你碰到IOC时,这种方式的短板就出来了,即,每个反射出来的Repository对象都是独立的,每个对象里的上下文也都是独立的,这是重点,

JavaWeb中Dao层的接口和基本功能简单抽取技巧

在dao层书写具体实现类的时候会将dao层功能抽取到接口中,然后去实现该接口,实现具体方法,书写具体功能代码. 抽取如图: 但是这种抽取不是很友好,由图可以看出,每个实现类中都要书写共同的增删改查方法,这样就是使得代码存再冗余,重复代码多次书写.此时就需要考虑将增删改查的代码再次抽取出来,写在一个类中. 抽取如图: 将增删改查的共用代码抽取到BaseDaoImpl中,提高代码的重用性,在具体的Dao调用共用方法时,指定泛型类型即可.