由于工作原因,需要使用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自己升级修改的钥匙。
本文详细介绍如何在CEF3中自定义网页另存为及缓存清理接口,通过修改源码和利用自动化脚本,实现功能拓展,适用于需要对CEF进行定制化的开发者。

275

被折叠的 条评论
为什么被折叠?



