CefApp
在cefsimple中,提到了一个cefapp的类型,这个类型是一个接口类,主要目的是提供获取三种handler的接口浏览器
/// // Implement this interface to provide handler implementations. Methods will be // called by the process and/or thread indicated. /// /*--cef(source=client,no_debugct_check)--*/ class CefApp : public virtual CefBaseRefCounted { 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<CefCommandLine> 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( CefRawPtr<CefSchemeRegistrar> 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<CefResourceBundleHandler> 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<CefBrowserProcessHandler> 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<CefRenderProcessHandler> GetRenderProcessHandler() { return NULL; } };
GetResourceBundleHandler``GetBrowserProcessHandler``GetRenderProcessHandler
分别能够获得对应回调handler,若是继承了这三种handler就能在这些时机处理本身的回调业务,举个例子,例如CefBrowserProcessHandler
,能够实现browser进程的回调,用于执行browser进程生命周期中的重要回调。app
/// // Class used to implement browser process callbacks. The methods of this class // will be called on the browser process main thread unless otherwise indicated. /// /*--cef(source=client,no_debugct_check)--*/ class CefBrowserProcessHandler : public virtual CefBaseRefCounted { 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<CefCommandLine> 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<CefListValue> 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<CefPrintHandler> GetPrintHandler() { return NULL; } /// // Called from any thread when work has been scheduled for the browser process // main (UI) thread. This callback is used in combination with CefSettings. // external_message_pump and CefDoMessageLoopWork() in cases where the CEF // message loop must be integrated into an existing application message loop // (see additional comments and warnings on CefDoMessageLoopWork). This // callback should schedule a CefDoMessageLoopWork() call to happen on the // main (UI) thread. |delay_ms| is the requested delay in milliseconds. If // |delay_ms| is <= 0 then the call should happen reasonably soon. If // |delay_ms| is > 0 then the call should be scheduled to happen after the // specified delay and any currently pending scheduled call should be // cancelled. /// /*--cef()--*/ virtual void OnScheduleMessagePumpWork(int64 delay_ms) {} };
上述代码就是CefBrowserProcessHandler
提供的接口,能够看到,当上下文初始化后,子进程启动前等等时机都有。在cefsimple中,还用OnContextInitialized
函数来CreateBrowser
,是十分重要的handler。less
结合cefsimple来看,cefapp的具体做用。ide
// Implement application-level callbacks for the browser process. class SimpleApp : public CefApp, public CefBrowserProcessHandler { public: SimpleApp(); // CefApp methods: virtual CefRefPtr<CefBrowserProcessHandler> GetBrowserProcessHandler() OVERRIDE { return this; } // CefBrowserProcessHandler methods: virtual void OnContextInitialized() OVERRIDE; private: // Include the default reference counting implementation. IMPLEMENT_REFCOUNTING(SimpleApp); };
十分简单,还将CefApp
和CefBrowserProcessHandler
多继承了,而且在OnContextInitialized
中,调用了CreateBrowser
。函数
从cefclient和cefsimple这俩demo来看,在构建app的时候CefApp主要用在俩地方,CefExecuteProcess
和CefInitialize
。从上面的代码能够看出CefApp和监视进程级别的handler一块儿工做因此须要的时机会比较早。oop
CefClient
与CefApp相对应的还有CefClient,这个CefClient
指的是一个类,不是指的那个demo程序,和CefClient相似,他也是提供了不少获取handler的接口this
class CefClient : public virtual CefBaseRefCounted { public: /// // Return the handler for context menus. If no handler is provided the default // implementation will be used. /// /*--cef()--*/ virtual CefRefPtr<CefContextMenuHandler> GetContextMenuHandler() { return NULL; } /// // Return the handler for dialogs. If no handler is provided the default // implementation will be used. /// /*--cef()--*/ virtual CefRefPtr<CefDialogHandler> GetDialogHandler() { return NULL; } /// // Return the handler for browser display state events. /// /*--cef()--*/ virtual CefRefPtr<CefDisplayHandler> GetDisplayHandler() { return NULL; } ...
这些handler的都是基于功能的回调,应用开发者应该提供对应的handler实现,而后提供CefClient获取对应handler实体。debug
由于是基于功能的回调,因此在浏览器没起来的时候,也没有啥功能。所以CefClient
初始化和传入的时机会比CefApp
要晚一些,会在CreateBrowser
的时候传入。code
在cefsimple中,也是采用了多继承的方式实现,由于很简单orm
class SimpleHandler : public CefClient, public CefDisplayHandler, public CefLifeSpanHandler, public CefLoadHandler { public: explicit SimpleHandler(bool use_views); ~SimpleHandler();