cef -- CefApp

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。

你可能感兴趣的:(cef)