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();