CefApp
/*--cef(source=client,no_debugct_check)--*/
class CefApp : public virtual CefBase {
public:
///
// Provides an opportunity to view and/or modify command-line arguments before
// processing by CEF and Chromium. The |process_type| value will be empty for
// the browser process. Do not keep a reference to the CefCommandLine object
// passed to this method. The CefSettings.command_line_args_disabled value
// can be used to start with an empty command-line object. Any values
// specified in CefSettings that equate to command-line arguments will be set
// before this method is called. Be cautious when using this method to modify
// command-line arguments for non-browser processes as this may result in
// undefined behavior including crashes.
///
/*--cef(optional_param=process_type)--*/
virtual void OnBeforeCommandLineProcessing(
const CefString& process_type,
CefRefPtr command_line) {
}
///
// Provides an opportunity to register custom schemes. Do not keep a reference
// to the |registrar| object. This method is called on the main thread for
// each process and the registered schemes should be the same across all
// processes.
///
/*--cef()--*/
virtual void OnRegisterCustomSchemes(
CefRefPtr registrar) {
}
///
// Return the handler for resource bundle events. If
// CefSettings.pack_loading_disabled is true a handler must be returned. If no
// handler is returned resources will be loaded from pack files. This method
// is called by the browser and render processes on multiple threads.
///
/*--cef()--*/
virtual CefRefPtr GetResourceBundleHandler() {
return NULL;
}
///
// Return the handler for functionality specific to the browser process. This
// method is called on multiple threads in the browser process.
///
/*--cef()--*/
virtual CefRefPtr GetBrowserProcessHandler() {
return NULL;
}
///
// Return the handler for functionality specific to the render process. This
// method is called on the render process main thread.
///
/*--cef()--*/
virtual CefRefPtr GetRenderProcessHandler() {
return NULL;
}
};
接口说明
//提供修改命令行参数的机会
virtual void OnBeforeCommandLineProcessing(
const CefString& process_type,
CefRefPtr command_line) {}
//提供注册自定义schemes的机会
virtual void OnRegisterCustomSchemes(
CefRawPtr registrar) {}
//资源包Handler
virtual CefRefPtr GetResourceBundleHandler() {
return nullptr;
}
//浏览器进程Handler:返回定制Browser进程的Handler,该Handler包括了诸如OnContextInitialized的回调。
virtual CefRefPtr GetBrowserProcessHandler() {
return nullptr;
}
//渲染进程Handler:返回定制Render进程的Handler,该Handler包含了JavaScript相关的一些回调以及消息处理的回调
virtual CefRefPtr GetRenderProcessHandler() {
return nullptr;
}
需要处理对应的Handler,我们则需要继承当前Handler类,并且在该函数里面返回this,具体需要继承哪些Handler需要根据业务需求然后查看对应的Handler事件,实际处理。
CefBrowserProcessHandler
/*--cef(source=client)--*/
class CefBrowserProcessHandler : public virtual CefBase {
public:
///
// Called on the browser process UI thread immediately after the CEF context
// has been initialized.
///
/*--cef()--*/
virtual void OnContextInitialized() {}
///
// Called before a child process is launched. Will be called on the browser
// process UI thread when launching a render process and on the browser
// process IO thread when launching a GPU or plugin process. Provides an
// opportunity to modify the child process command line. Do not keep a
// reference to |command_line| outside of this method.
///
/*--cef()--*/
virtual void OnBeforeChildProcessLaunch(
CefRefPtr command_line) {}
///
// Called on the browser process IO thread after the main thread has been
// created for a new render process. Provides an opportunity to specify extra
// information that will be passed to
// CefRenderProcessHandler::OnRenderThreadCreated() in the render process. Do
// not keep a reference to |extra_info| outside of this method.
///
/*--cef()--*/
virtual void OnRenderProcessThreadCreated(
CefRefPtr extra_info) {}
///
// Return the handler for printing on Linux. If a print handler is not
// provided then printing will not be supported on the Linux platform.
///
/*--cef()--*/
virtual CefRefPtr GetPrintHandler() {
return NULL;
}
};
说明
// 在CEF上下文初始化后,在浏览器进程UI线程中进行调用。
virtual void OnContextInitialized() {}
// 可定制化处理子进程启动时的命令行参数
virtual void OnBeforeChildProcessLaunch(
CefRefPtr command_line) {}
// 打印处理
virtual CefRefPtr GetPrintHandler() { return nullptr; }
CefRenderProcessHandler
/*--cef(source=client)--*/
class CefRenderProcessHandler : public virtual CefBase {
public:
typedef cef_navigation_type_t NavigationType;
///
// Called after the render process main thread has been created. |extra_info|
// is a read-only value originating from
// CefBrowserProcessHandler::OnRenderProcessThreadCreated(). Do not keep a
// reference to |extra_info| outside of this method.
///
/*--cef()--*/
virtual void OnRenderThreadCreated(CefRefPtr extra_info) {}
///
// Called after WebKit has been initialized.
///
/*--cef()--*/
virtual void OnWebKitInitialized() {}
///
// Called after a browser has been created. When browsing cross-origin a new
// browser will be created before the old browser with the same identifier is
// destroyed.
///
/*--cef()--*/
virtual void OnBrowserCreated(CefRefPtr browser) {}
///
// Called before a browser is destroyed.
///
/*--cef()--*/
virtual void OnBrowserDestroyed(CefRefPtr browser) {}
///
// Return the handler for browser load status events.
///
/*--cef()--*/
virtual CefRefPtr GetLoadHandler() {
return NULL;
}
///
// Called before browser navigation. Return true to cancel the navigation or
// false to allow the navigation to proceed. The |request| object cannot be
// modified in this callback.
///
/*--cef()--*/
virtual bool OnBeforeNavigation(CefRefPtr browser,
CefRefPtr frame,
CefRefPtr request,
NavigationType navigation_type,
bool is_redirect) { return false; }
///
// Called immediately after the V8 context for a frame has been created. To
// retrieve the JavaScript 'window' object use the CefV8Context::GetGlobal()
// method. V8 handles can only be accessed from the thread on which they are
// created. A task runner for posting tasks on the associated thread can be
// retrieved via the CefV8Context::GetTaskRunner() method.
///
/*--cef()--*/
virtual void OnContextCreated(CefRefPtr browser,
CefRefPtr frame,
CefRefPtr context) {}
///
// Called immediately before the V8 context for a frame is released. No
// references to the context should be kept after this method is called.
///
/*--cef()--*/
virtual void OnContextReleased(CefRefPtr browser,
CefRefPtr frame,
CefRefPtr context) {}
///
// Called for global uncaught exceptions in a frame. Execution of this
// callback is disabled by default. To enable set
// CefSettings.uncaught_exception_stack_size > 0.
///
/*--cef()--*/
virtual void OnUncaughtException(CefRefPtr browser,
CefRefPtr frame,
CefRefPtr context,
CefRefPtr exception,
CefRefPtr stackTrace) {}
///
// Called when a new node in the the browser gets focus. The |node| value may
// be empty if no specific node has gained focus. The node object passed to
// this method represents a snapshot of the DOM at the time this method is
// executed. DOM objects are only valid for the scope of this method. Do not
// keep references to or attempt to access any DOM objects outside the scope
// of this method.
///
/*--cef(optional_param=frame,optional_param=node)--*/
virtual void OnFocusedNodeChanged(CefRefPtr browser,
CefRefPtr frame,
CefRefPtr node) {}
///
// Called when a new message is received from a different process. Return true
// if the message was handled or false otherwise. Do not keep a reference to
// or attempt to access the message outside of this callback.
///
/*--cef()--*/
virtual bool OnProcessMessageReceived(CefRefPtr browser,
CefProcessId source_process,
CefRefPtr message) {
return false;
}
};
重写CefApp
继承CefApp类、CefBrowserProcessHandler类、 CefRenderProcessHandler类
class CCefClientApp : public CefApp, public CefBrowserProcessHandler, CefRenderProcessHandler
{
public:
CCefClientApp();
~CCefClientApp();
// CefApp methods:
virtual CefRefPtr GetRenderProcessHandler() {
return this;
}
virtual CefRefPtr GetBrowserProcessHandler() {
return this;
}
// CefBrowserProcessHandler methods:
virtual void OnContextInitialized() override;
//CefRenderProcessHandler methods
virtual void OnWebKitInitialized() override;
virtual void OnContextCreated(CefRefPtr browser, CefRefPtr frame, CefRefPtr context) override;
virtual void OnContextReleased(CefRefPtr browser, CefRefPtr frame, CefRefPtr context) override;
};
GetBrowserProcessHandler和GetRenderProcessHandler
- 重写GetBrowserProcessHandler(),返回浏览器进程特定功能的处理程序。在浏览器进程中的多个线程上调用此方法。返回this。该Handler包括了诸如OnContextInitialized的回调。
- 重写GetRenderProcessHandler(),回渲染进程特定功能的处理程序。在渲染进程中的主线程上调用此方法。返回this。该Handler包含了JavaScript相关的一些回调以及消息处理的回调
在浏览器进程运行的过程中,会使用到CefApp的某个实例化对象,而在渲染进程的运行过程中,又会使用到CefApp另一个实例化对象,它们都是CefApp子类的实例,但一定不是同一个实例对象。
一个CefApp对应了一个进程,而一个进程可以是浏览器进程(Browser Process),可以是渲染进程(Renderer Process)。因此,CefApp提供了GetBrowserProcessHandler和GetRendererProcessHandler来分别在相关进程中获取对应的handler。
这两个方法的实现由我们来决定,即我们可以通过编程方式来返回handler,但这两个方法不会由我们客户端代码进行调用,而是CEF在运行过程中,由CEF在某个时刻来回调这两个方法。所以,这里虽然写了两个GetXXXProcessHandler,但在浏览器进程和渲染进程中只会分别调用GetBrowserProcessHandler和GetRendererProcessHandler。
按照程序运行的角度讲,当浏览器进程运行的时候,CEF框架就会在某个时候调用CefApp::GetBrowserProcessHandler获得由我们定义的BrowserProcessHandler实例,这个实例会在适当的时候调用它提供的一些方法(后文介绍有哪些方法);当渲染进程运行的时候,CEF框架就会在某个时候调用CefApp::GetRendererProcessHandler得到我们定义的RendererProcessHandler实例,然后在适当的时候调用RenererProcessHandler中的一些方法(后文介绍有哪些方法)。
CefApp是如何关联到CEF的运行中的
览器进程CefApp几个子类:子类ClientAppBrowser、子类ClientAppRenderer、子类ClientAppOther的CefApp
SimpleApp是继承自CefApp、GetBrowserProcessHandler和GetRenderProcessHandler
通过一个工具函数GetProcessType从命令行中解析--type=xxx(浏览器进程没有这个命令参数)来判断进程的类型,然后实例化对应的CefApp子类,最后通过CefExecuteProcess来运行进程。
OnContextInitialized
- 重写CefBrowserProcessHandler的事件OnContextInitialized():OnContextInitialized函数做一些浏览器的创建工作。调用CefInitialize初始化Cef浏览器进程信息的时候,该触发OnContextInitialized。