加入新功能时,可能须要添加各层的接口,接口怎样加?必定须要向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的实现。

                                        

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSG9ya3lDaGVu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />

  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就是一个要求上层类实现的接口类:
               

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSG9ya3lDaGVu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />

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

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

假设是对既有功能的直接扩展,且无法分离成新的接口,则能够尝试使用例如以下方法扩展:
  a. 继承旧的接口或使用装饰器、组合等模式扩展接口功能。
     假设接口本身未定义上的兼容性需求,上层模块能够依据须要选择使用新旧接口。就能够使用这个方式。
     WebViewClient能够近似看作一个演示样例:
          
  b. 封装到旧的接口中 (如组合,Helper class等方式) 
      假设接口须要保持兼容性,接口的定义不能改动,只能改变其行为,就能够应用这样的方式。变更对上层模块透明。     

4. 改动原有接口

最后才干选择改动原有接口,但不建议直接改动接口函数定义,而是以新增接口函数的方式来实现。
假设使用C++实现,还应当将实现文件独立出来。

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

怎样扩展Chromium各层的接口的更多相关文章

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

    Service层的接口中有一些比较常用方法,一次又一次的在新的Service层中被书写,所以懒惰的程序员又烦了,他们决定写个通用接口来解决这个问题. 有些项目中,实体类即承担接收表单数据的任务,又承担 ...

  2. 数据访问层的接口IBaseDAL

    using System; using System.Collections; using System.Data; using System.Data.Common; using System.Co ...

  3. Mybatis的dao层实现 接口代理方式实现规范+plugins-PageHelper

    Mybatis的dao层实现 接口代理方式实现规范 Mapper接口实现时的相关规范: Mapper接口开发只需要程序员编写Mapper接口而不用具体实现其代码(相当于我们写的Imp实现类) Mapp ...

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

    回到目录 使用了4年的IRepository数据仓储接口,今天要改变了,对于这个数据仓储操作接口,它提倡的是简洁,单纯,就是对数据上下文的操作,而直正的数据上下文本身我们却把它忽略了,在我的IRepo ...

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

    使用PPAPI的Graphics 3D接口做了一个小演示样例,鼠标点击插件区域.绘制颜色,效果与ppapi_simple相似. foruok原创,如需转载请关注foruok的微信订阅号"程序 ...

  6. Robot Framework(十五) 扩展RobotFramework框架——远程库接口

    4.2远程库接口 远程库接口提供了在运行Robot Framework本身的机器上运行测试库的方法,以及使用除本机支持的Python和Java之外的其他语言实现库的方法.对于测试库,用户远程库看起来与 ...

  7. Robot Framework(十六) 扩展RobotFramework框架——使用监听器接口

    4.3使用监听器接口 Robot Framework有一个侦听器接口,可用于接收有关测试执行的通知.监听器是具有某些特殊方法的类或模块,它们可以用Python和Java实现.监听器接口的示例用法包括外 ...

  8. MVC扩展ValueProvider,通过实现IValueProvider接口创建SessionValueProvider

    □ ValueProvider的大致工作原理 →通过Request.Form, Request.QueryString, Request.Files, RouteData.Values获取数据.→然后 ...

  9. 黑马MyBatisday2 MyBatis Dao层实现 接口代理实现&传统实现 动态SQL和SQL抽取 自定义类型处理 分页插件PageHelper

    package com.itheima.mapper; import com.github.pagehelper.Page; import com.github.pagehelper.PageHelp ...

随机推荐

  1. [POI2010]KLO-Blocks(单调栈)

    题意 给出N个正整数a[1..N],再给出一个正整数k,现在可以进行如下操作:每次选择一个大于k的正整数a[i],将a[i]减去1,选择a[i-1]或a[i+1]中的一个加上1.经过一定次数的操作后, ...

  2. python etree.HTML

    1.编码问题(编码参数 parser): resp_html = etree.HTML(res,parser=etree.HTMLParser(encoding='gbk')) 2.大小写问题(大写转 ...

  3. php后端控制可跨域的域名,允许图片跨域上传

    跨域问题经常需要面对,前端需要做的比较直接要么选择ajax异步提交,XML或者jsonp,要么表单提交前端常见跨域解决方案 jsonp基本可以搞定大部分跨域问题,但问题也比较明显,只能通过get方式提 ...

  4. 洛谷P2196 && caioj 1415 动态规划6:挖地雷

    没看出来动规怎么做,看到n <= 20,直接一波暴搜,过了. #include<cstdio> #include<cstring> #include<algorit ...

  5. 【Henu ACM Round#15 F】Arthur and Questions

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] a1+a2+...+ak<a2+a3+...ak+1 ->a1<ak+1 a2+a3+...+ak+1<a3 ...

  6. 【Android 进阶】图片载入框架之Glide

    简单介绍 在泰国举行的谷歌开发人员论坛上,谷歌为我们介绍了一个名叫 Glide 的图片载入库,作者是 bumptech.这个库被广泛的运用在 google 的开源项目中,包含 2014 年 googl ...

  7. Maven的SSH搭建以及部署

    本人有点傻,研究Maven研究了有一段时间,刚刚有些入门,记录下来方便以后使用 工作环境:jdk7 myeclipse10 maven3.1.1 1 下载maven3.1.1 http://maven ...

  8. win32下实现透明窗体

    最開始写透明窗体的代码,在百度了之后,找到了SetLayeredWindowAttributes()这一个函数,可是因为网上案列的缺少,使得非常多人无法非常好的使用这一个方法,我花了几天的时间写了一个 ...

  9. 给QQ群发送消息

    地址:http://d.web2.qq.com/channel/send_qun_msg2 方式:POST 參数: r  = {"group_uin":2393471267,&qu ...

  10. Ubuntu系统下的Mysql安装与使用

    摘要 在本篇博文中.笔者将从基础出发.介绍Mysql在Linux环境下的安装和基本使用命令,仅适用于Mysql刚開始学习的人.大牛请绕道-- 安装Mysql数据库 这里介绍最最简单的安装方式,至于编译 ...