zoukankan      html  css  js  c++  java
  • CefApp和CefClient的作用

    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进程生命周期中的重要回调。

    ///
    // 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。

    结合cefsimple来看,cefapp的具体作用。

    // 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);
    };
    

    十分简单,还将CefAppCefBrowserProcessHandler多继承了,并且在OnContextInitialized中,调用了CreateBrowser

    从cefclient和cefsimple这俩demo来看,在构建app的时候CefApp主要用在俩地方,CefExecuteProcessCefInitialize。从上面的代码可以看出CefApp和监视进程级别的handler一起工作所以需要的时机会比较早。

    CefClient

    与CefApp相对应的还有CefClient,这个CefClient指的是一个类,不是指的那个demo程序,和CefClient类似,他也是提供了很多获取handler的接口

    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实体。

    因为是基于功能的回调,所以在浏览器没起来的时候,也没有啥功能。因此CefClient初始化和传入的时机会比CefApp要晚一些,会在CreateBrowser的时候传入。

    在cefsimple中,也是采用了多继承的方式实现,因为很简单

    class SimpleHandler : public CefClient,
                          public CefDisplayHandler,
                          public CefLifeSpanHandler,
                          public CefLoadHandler {
     public:
      explicit SimpleHandler(bool use_views);
      ~SimpleHandler();
    
  • 相关阅读:
    0722
    SGU
    预测一下吧
    0625
    0624
    0610
    0607
    0604
    poj2455Secret Milking Machine【二分 + 最大流】
    BZOJ3489: A simple rmq problem
  • 原文地址:https://www.cnblogs.com/lenomirei/p/12197895.html
Copyright © 2011-2022 走看看