CEF3源码修改与接口扩展

本文详细介绍如何在CEF3中自定义网页另存为及缓存清理接口,通过修改源码和利用自动化脚本,实现功能拓展,适用于需要对CEF进行定制化的开发者。

由于工作原因,需要使用CEF3实现网页另存为,以及清理缓存操作,现有版本的CEF没有相应的接口,所以自己在现有版本上做了一次升级,针对自己需求增加了一些接口。下面讲讲如何一步一步的来修改源码。首先自己本机的有一个完整的可编译的CEF版本,这样才能顺利的修改。

1. 增加网页另存为功能。

    首先我们知道这个功能在Chromium已经实现,只是CEF3没有对外提供此接口而已,我们可以在源码中寻找具体的调用位置,既然是对网页来做保存操作,那源码必定是跟 CefBrowserHost 或者 CefFrame 有关的,首先我们找到void CefBrowserHostImpl::DownloadImage()接口的实现,发现把调用转向到了web_contents()->DownloadImage(),找到WebContents* web_contents() ,此函数在CefBrowserHostImpl并没实现,而是由父类content::WebContentsObserver实现的,

源码路径在src\content\public\browser\web_contents_observer.h,

最终调用的是src\content\browser\web_contents\web_contents_impl.h,

从中找到 bool SavePage(const base::FilePath& main_file, const base::FilePath& dir_path, SavePageType save_type) override;

好了,接下来我们修改CefBrowserHostImpl是不是就可以了呢?No,这只是内部实现了转接,还需要cef api 公开函数才可以,首先你想到的是会去修改相关的文件一个一个的改,实际上不需要,CEF3已经为我们写好了自动化python脚本,自动生成所有接口相关文件此文件位于src\cef\tools\translator.bat

此脚本文件自动遍历src\cef\include\下所有cef_xxx.h的文件,然后根据注释去生成以下相关文件:

src\cef\include\capi\cef_xxx_capi.h

src\cef\libcef_dll\cpptoc\xxx_cpptoc.h 与 src\cef\libcef_dll\cpptoc\xxx_cpptoc.cc

src\cef\libcef_dll\ctocpp\xxx_ctocpp.h 与 src\cef\libcef_dll\ctocpp\xxx_ctocpp.cc

src\cef\include\下所cef_xxx.h的文件,实际上是SDK提供的对外接口文件,把接口在此用注释描述清楚即可执行脚本自动更新所有相关文件,自动生成的文件内部都有一个Hash值,如果文件没变化不会更新的,也不会导致重新编译

接口的注释描述如下所示

///
// Class used to represent the browser process aspects of a browser window. The
// methods of this class can only be called in the browser process. They may be
// called on any thread in that process unless otherwise indicated in the
// comments.
///
/*--cef(source=library)--*/
class CefBrowserHost : public virtual CefBaseRefCounted {

  ///
  //save page
  ///
  /*--cef()--*/
  virtual void SavePage(const CefString& main_file,
                const CefString& dir_path,
                cef_save_page_type_t save_type)=0;

///
// 函数或者类说明
///
/*--cef()--*/此处不能有空格, 

source=library 表示此类是CEF已实现的代码,并对外公开的接口
source=client  表示此类是一个回调接口类

更多参数说明可参考脚本同目录下的translator.README.txt文件

每个函数或者类都必须严格按照这样的格式书写,否则脚本报错。

新增的自定义结构或者枚举类型需要放在src\cef\include\internal\cef_types.h 里面

接口定义完毕后就可以执行translator.bat,然后使用 ninja -C out\Debug_GN_x86 cefclient 重新编译

2. 缓存清理接口

此接口是新增的文件,接口定义在上面已经说明,缓存的清理接口也是通过分析源码找到调用位置并封装为标准CEF接口的

src\cef\include\cef_cache.h  

src\cef\libcef\browser\net_service\cache_manager_impl.h

src\cef\libcef\browser\net_service\cache_manager_impl.cc

在src\cef\BUILD.gn的 libcef_static 源码列表新增两个文件

static_library("libcef_static") { 

    "libcef/browser/net_service/cache_manager_impl.cc",
    "libcef/browser/net_service/cache_manager_impl.h",

}

掌握上面知识,基本拥有了CEF3自己升级修改的钥匙。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值