2.CEF常用接口類攔截請求回調函數


2      Cef常用接口類介紹

2.1     CefClient

2.2     CefContextMenuHandler右鍵菜單處理類

2.3     CefDisplayHandler網頁顯示處理類

2.4     CefDownloadHandler網頁下載處理類

2.5     CefDragHandler鼠標拖動到網頁處理類

2.6     CefKeyboardHandler鍵盤事件響應處理類

2.7     CefLifeSpanHandler生命周期處理類

2.7.1     DoClose標准關閉處理

2.7.2     DoClose非標准關閉處理

2.8     CefLoadHandler網頁加載處理類

2.9     CefRequestHandler網絡請求處理類

Cef是一個網頁嵌入外殼,要獲取網頁的響應,攔截網頁中的事件消息,CEF提供了一系列的接口回調類,提供各種事件回調函數,例如攔截獲取鍵盤、鼠標、加載、顯示、右鍵菜單、提示消息、狀態變化、窗口打開關閉等,CEF都可以從網頁上攔截捕捉消息事件,並通過回調函數傳給應用程序進行處理。

2.1  CefClient

CefClient提供了獲取各種handler的接口,例如上下文菜單handler、對話框handler、顯示狀態handler,下載事件handler、拖動事件handler、查找事件handler、鍵盤handler、生命周期事件handler、加載頁面事件handler、離屏render進程handler、請求事件handler等。但是只是返回事件的handle。每個handler的具體的回調函數不在CefClient類中,需要繼承各個handler類,才可以實現回調。CefClient類只有一個回調函數OnProcessMessageReceived用來處理進程間的通訊消息。CefClient的定義如下:

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

 

  ///

  // Return the handler for download events. If no handler is returned downloads

  // will not be allowed.

  ///

  /*--cef()--*/

  virtual CefRefPtr<CefDownloadHandler> GetDownloadHandler() { return NULL; }

 

  ///

  // Return the handler for drag events.

  ///

  /*--cef()--*/

  virtual CefRefPtr<CefDragHandler> GetDragHandler() { return NULL; }

 

  ///

  // Return the handler for find result events.

  ///

  /*--cef()--*/

  virtual CefRefPtr<CefFindHandler> GetFindHandler() { return NULL; }

 

  ///

  // Return the handler for focus events.

  ///

  /*--cef()--*/

  virtual CefRefPtr<CefFocusHandler> GetFocusHandler() { return NULL; }

 

  ///

  // Return the handler for JavaScript dialogs. If no handler is provided the

  // default implementation will be used.

  ///

  /*--cef()--*/

  virtual CefRefPtr<CefJSDialogHandler> GetJSDialogHandler() { return NULL; }

 

  ///

  // Return the handler for keyboard events.

  ///

  /*--cef()--*/

  virtual CefRefPtr<CefKeyboardHandler> GetKeyboardHandler() { return NULL; }

 

  ///

  // Return the handler for browser life span events.

  ///

  /*--cef()--*/

  virtual CefRefPtr<CefLifeSpanHandler> GetLifeSpanHandler() { return NULL; }

 

  ///

  // Return the handler for browser load status events.

  ///

  /*--cef()--*/

  virtual CefRefPtr<CefLoadHandler> GetLoadHandler() { return NULL; }

 

  ///

  // Return the handler for off-screen rendering events.

  ///

  /*--cef()--*/

  virtual CefRefPtr<CefRenderHandler> GetRenderHandler() { return NULL; }

 

  ///

  // Return the handler for browser request events.

  ///

  /*--cef()--*/

  virtual CefRefPtr<CefRequestHandler> GetRequestHandler() { return NULL; }

 

  ///

  // 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<CefBrowser> browser,

                                        CefProcessId source_process,

                                        CefRefPtr<CefProcessMessage> message) {

    return false;

  }

};

2.2  CefContextMenuHandler右鍵菜單處理類

CefContextMenuHandler是網頁上的右鍵菜單事件回調函數類,提供OnBeforeContextMenu回調函數,在右鍵菜單彈出之前修改或者禁用右鍵菜單。右鍵菜單按鈕響應回調RunContextMenu、右鍵菜單命令回調OnContextMenuCommand菜單禁用回調函數OnContextMenuDismissed等。可以攔截右鍵菜單響應,進行自定義的處理。

class CefContextMenuHandler : public virtual CefBaseRefCounted {

 public:

  typedef cef_event_flags_t EventFlags;

 

  ///

  // Called before a context menu is displayed. |params| provides information

  // about the context menu state. |model| initially contains the default

  // context menu. The |model| can be cleared to show no context menu or

  // modified to show a custom menu. Do not keep references to |params| or

  // |model| outside of this callback.

  ///

  /*--cef()--*/

  virtual void OnBeforeContextMenu(CefRefPtr<CefBrowser> browser,

                                   CefRefPtr<CefFrame> frame,

                                   CefRefPtr<CefContextMenuParams> params,

                                   CefRefPtr<CefMenuModel> model) {}

 

  ///

  // Called to allow custom display of the context menu. |params| provides

  // information about the context menu state. |model| contains the context menu

  // model resulting from OnBeforeContextMenu. For custom display return true

  // and execute |callback| either synchronously or asynchronously with the

  // selected command ID. For default display return false. Do not keep

  // references to |params| or |model| outside of this callback.

  ///

  /*--cef()--*/

  virtual bool RunContextMenu(CefRefPtr<CefBrowser> browser,

                              CefRefPtr<CefFrame> frame,

                              CefRefPtr<CefContextMenuParams> params,

                              CefRefPtr<CefMenuModel> model,

                              CefRefPtr<CefRunContextMenuCallback> callback) {

    return false;

  }

 

  ///

  // Called to execute a command selected from the context menu. Return true if

  // the command was handled or false for the default implementation. See

  // cef_menu_id_t for the command ids that have default implementations. All

  // user-defined command ids should be between MENU_ID_USER_FIRST and

  // MENU_ID_USER_LAST. |params| will have the same values as what was passed to

  // OnBeforeContextMenu(). Do not keep a reference to |params| outside of this

  // callback.

  ///

  /*--cef()--*/

  virtual bool OnContextMenuCommand(CefRefPtr<CefBrowser> browser,

                                    CefRefPtr<CefFrame> frame,

                                    CefRefPtr<CefContextMenuParams> params,

                                    int command_id,

                                    EventFlags event_flags) {

    return false;

  }

  ///

  // Called when the context menu is dismissed irregardless of whether the menu

  // was empty or a command was selected.

  ///

  /*--cef()--*/

  virtual void OnContextMenuDismissed(CefRefPtr<CefBrowser> browser,

                                      CefRefPtr<CefFrame> frame) {}

};

 

2.3  CefDisplayHandler網頁顯示處理類

CefDisplayHandler提供了一些頁面顯示回調函數,例如網址發送變化OnAddressChange,網頁標題OnTitleChange發生變化,網頁圖標發生變化OnFaviconURLChange,全屏變化OnFullscreenModeChange,顯示提示消息OnTooltip,狀態欄消息顯示OnStatusMessage,控制台消息回調OnConsoleMessage,設置了自動調整大小回調OnAutoResize,加載進程變化回調OnLoadingProgressChange,CefDisplayHandler類定義如下

class CefDisplayHandler : public virtual CefBaseRefCounted {

 public:

  ///

  // Called when a frame's address has changed.

  ///

  /*--cef()--*/

  virtual void OnAddressChange(CefRefPtr<CefBrowser> browser,

                               CefRefPtr<CefFrame> frame,

                               const CefString& url) {}

 

  ///

  // Called when the page title changes.

  ///

  /*--cef(optional_param=title)--*/

  virtual void OnTitleChange(CefRefPtr<CefBrowser> browser,

                             const CefString& title) {}

 

  ///

  // Called when the page icon changes.

  ///

  /*--cef(optional_param=icon_urls)--*/

  virtual void OnFaviconURLChange(CefRefPtr<CefBrowser> browser,

                                  const std::vector<CefString>& icon_urls) {}

 

  ///

  // Called when web content in the page has toggled fullscreen mode. If

  // |fullscreen| is true the content will automatically be sized to fill the

  // browser content area. If |fullscreen| is false the content will

  // automatically return to its original size and position. The client is

  // responsible for resizing the browser if desired.

  ///

  /*--cef()--*/

  virtual void OnFullscreenModeChange(CefRefPtr<CefBrowser> browser,

                                      bool fullscreen) {}

 

  ///

  // Called when the browser is about to display a tooltip. |text| contains the

  // text that will be displayed in the tooltip. To handle the display of the

  // tooltip yourself return true. Otherwise, you can optionally modify |text|

  // and then return false to allow the browser to display the tooltip.

  // When window rendering is disabled the application is responsible for

  // drawing tooltips and the return value is ignored.

  ///

  /*--cef(optional_param=text)--*/

  virtual bool OnTooltip(CefRefPtr<CefBrowser> browser, CefString& text) {

    return false;

  }

 

  ///

  // Called when the browser receives a status message. |value| contains the

  // text that will be displayed in the status message.

  ///

  /*--cef(optional_param=value)--*/

  virtual void OnStatusMessage(CefRefPtr<CefBrowser> browser,

                               const CefString& value) {}

 

  ///

  // Called to display a console message. Return true to stop the message from

  // being output to the console.

  ///

  /*--cef(optional_param=message,optional_param=source)--*/

  virtual bool OnConsoleMessage(CefRefPtr<CefBrowser> browser,

                                cef_log_severity_t level,

                                const CefString& message,

                                const CefString& source,

                                int line) {

    return false;

  }

 

  ///

  // Called when auto-resize is enabled via CefBrowserHost::SetAutoResizeEnabled

  // and the contents have auto-resized. |new_size| will be the desired size in

  // view coordinates. Return true if the resize was handled or false for

  // default handling.

  ///

  /*--cef()--*/

  virtual bool OnAutoResize(CefRefPtr<CefBrowser> browser,

                            const CefSize& new_size) {

    return false;

  }

 

  ///

  // Called when the overall page loading progress has changed. |progress|

  // ranges from 0.0 to 1.0.

  ///

  /*--cef()--*/

  virtual void OnLoadingProgressChange(CefRefPtr<CefBrowser> browser,

                                       double progress) {}

};

2.4  CefDownloadHandler網頁下載處理類

CefDownloadHandler網頁上下載文件類,提供開始從網頁下載文件回調函數OnBeforeDownload,下載文件進度更新回調函數OnDownloadUpdated。

class CefDownloadHandler : public virtual CefBaseRefCounted {

 public:

  ///

  // Called before a download begins. |suggested_name| is the suggested name for

  // the download file. By default the download will be canceled. Execute

  // |callback| either asynchronously or in this method to continue the download

  // if desired. Do not keep a reference to |download_item| outside of this

  // method.

  ///

  /*--cef()--*/

  virtual void OnBeforeDownload(

      CefRefPtr<CefBrowser> browser,

      CefRefPtr<CefDownloadItem> download_item,

      const CefString& suggested_name,

      CefRefPtr<CefBeforeDownloadCallback> callback) = 0;

 

  ///

  // Called when a download's status or progress information has been updated.

  // This may be called multiple times before and after OnBeforeDownload().

  // Execute |callback| either asynchronously or in this method to cancel the

  // download if desired. Do not keep a reference to |download_item| outside of

  // this method.

  ///

  /*--cef()--*/

  virtual void OnDownloadUpdated(CefRefPtr<CefBrowser> browser,

                                 CefRefPtr<CefDownloadItem> download_item,

                                 CefRefPtr<CefDownloadItemCallback> callback) {}

};

 

2.5  CefDragHandler鼠標拖動到網頁處理類

CefDragHandler處理鼠標拖動事件,提供鼠標拖動進入網頁回調函數OnDragEnter,網頁中可以拖動放入的區域發生變化回調函數OnDraggableRegionsChanged。

// Implement this interface to handle events related to dragging. The methods of

// this class will be called on the UI thread.

///

/*--cef(source=client)--*/

class CefDragHandler : public virtual CefBaseRefCounted {

 public:

  typedef cef_drag_operations_mask_t DragOperationsMask;

 

  ///

  // Called when an external drag event enters the browser window. |dragData|

  // contains the drag event data and |mask| represents the type of drag

  // operation. Return false for default drag handling behavior or true to

  // cancel the drag event.

  ///

  /*--cef()--*/

  virtual bool OnDragEnter(CefRefPtr<CefBrowser> browser,

                           CefRefPtr<CefDragData> dragData,

                           DragOperationsMask mask) {

    return false;

  }

 

  ///

  // Called whenever draggable regions for the browser window change. These can

  // be specified using the '-webkit-app-region: drag/no-drag' CSS-property. If

  // draggable regions are never defined in a document this method will also

  // never be called. If the last draggable region is removed from a document

  // this method will be called with an empty vector.

  ///

  /*--cef()--*/

  virtual void OnDraggableRegionsChanged(

      CefRefPtr<CefBrowser> browser,

      const std::vector<CefDraggableRegion>& regions) {}

};

 

2.6  CefKeyboardHandler鍵盤事件響應處理類

CefKeyboardHandler處理鍵盤響應事件,提供鍵盤按鍵響應回調函數。攔截鍵盤消息。

// Implement this interface to handle events related to keyboard input. The

// methods of this class will be called on the UI thread.

///

/*--cef(source=client)--*/

class CefKeyboardHandler : public virtual CefBaseRefCounted {

 public:

  ///

  // Called before a keyboard event is sent to the renderer. |event| contains

  // information about the keyboard event. |os_event| is the operating system

  // event message, if any. Return true if the event was handled or false

  // otherwise. If the event will be handled in OnKeyEvent() as a keyboard

  // shortcut set |is_keyboard_shortcut| to true and return false.

  ///

  /*--cef()--*/

  virtual bool OnPreKeyEvent(CefRefPtr<CefBrowser> browser,

                             const CefKeyEvent& event,

                             CefEventHandle os_event,

                             bool* is_keyboard_shortcut) {

    return false;

  }

 

  ///

  // Called after the renderer and JavaScript in the page has had a chance to

  // handle the event. |event| contains information about the keyboard event.

  // |os_event| is the operating system event message, if any. Return true if

  // the keyboard event was handled or false otherwise.

  ///

  /*--cef()--*/

  virtual bool OnKeyEvent(CefRefPtr<CefBrowser> browser,

                          const CefKeyEvent& event,

                          CefEventHandle os_event) {

    return false;

  }

};

2.7  CefLifeSpanHandler生命周期處理類

CefLifeSpanHandler是生命周期處理類,新打開一個網頁或者關閉一個網頁時,會觸發回調函數。OnBeforePopup這個只能在創建一個新的彈出式網頁時,才會觸發,如果是在一個網頁中打開一個子網頁,回調函數是攔截不到消息的。OnAfterCreated網頁創建完成后的回調函數。browser銷毀之前會觸發回調函數OnBeforeClose。還有一個關閉回調函數DoClose有點復雜,當調用CefBrowserHost::*CloseBrowser()函數關閉browser,或者browser是CEF創建的頂層窗口的子窗口,當頂層窗口關閉時,也會觸發關閉DoClose回調函數。點擊網頁的關閉按鈕后,網頁不會立刻關閉,而是會調用兩次CloseBrowser()或TryCloseBrowser(),提供了一個讓CEF處理JS的onbeforeunload事件和選擇性取消關閉網頁的機會。CefLifeSpanHandler類定義如下:

 

// Implement this interface to handle events related to browser life span. The

// methods of this class will be called on the UI thread unless otherwise

// indicated.

///

/*--cef(source=client)--*/

class CefLifeSpanHandler : public virtual CefBaseRefCounted {

 public:

  typedef cef_window_open_disposition_t WindowOpenDisposition;

 

  ///

  // Called on the UI thread before a new popup browser is created. The

  // |browser| and |frame| values represent the source of the popup request. The

  // |target_url| and |target_frame_name| values indicate where the popup

  // browser should navigate and may be empty if not specified with the request.

  // The |target_disposition| value indicates where the user intended to open

  // the popup (e.g. current tab, new tab, etc). The |user_gesture| value will

  // be true if the popup was opened via explicit user gesture (e.g. clicking a

  // link) or false if the popup opened automatically (e.g. via the

  // DomContentLoaded event). The |popupFeatures| structure contains additional

  // information about the requested popup window. To allow creation of the

  // popup browser optionally modify |windowInfo|, |client|, |settings| and

  // |no_javascript_access| and return false. To cancel creation of the popup

  // browser return true. The |client| and |settings| values will default to the

  // source browser's values. If the |no_javascript_access| value is set to

  // false the new browser will not be scriptable and may not be hosted in the

  // same renderer process as the source browser. Any modifications to

  // |windowInfo| will be ignored if the parent browser is wrapped in a

  // CefBrowserView. Popup browser creation will be canceled if the parent

  // browser is destroyed before the popup browser creation completes (indicated

  // by a call to OnAfterCreated for the popup browser).

  ///

  /*--cef(optional_param=target_url,optional_param=target_frame_name)--*/

  virtual bool OnBeforePopup(CefRefPtr<CefBrowser> browser,

                             CefRefPtr<CefFrame> frame,

                             const CefString& target_url,

                             const CefString& target_frame_name,

                             WindowOpenDisposition target_disposition,

                             bool user_gesture,

                             const CefPopupFeatures& popupFeatures,

                             CefWindowInfo& windowInfo,

                             CefRefPtr<CefClient>& client,

                             CefBrowserSettings& settings,

                             bool* no_javascript_access) {

    return false;

  }

 

  ///

  // Called after a new browser is created. This callback will be the first

  // notification that references |browser|.

  ///

  /*--cef()--*/

  virtual void OnAfterCreated(CefRefPtr<CefBrowser> browser) {}

 

  ///

  // Called when a browser has recieved a request to close. This may result

  // directly from a call to CefBrowserHost::*CloseBrowser() or indirectly if

  // the browser is parented to a top-level window created by CEF and the user

  // attempts to close that window (by clicking the 'X', for example). The

  // DoClose() method will be called after the JavaScript 'onunload' event has

  // been fired.

  //

  // An application should handle top-level owner window close notifications by

  // calling CefBrowserHost::TryCloseBrowser() or

  // CefBrowserHost::CloseBrowser(false) instead of allowing the window to close

  // immediately (see the examples below). This gives CEF an opportunity to

  // process the 'onbeforeunload' event and optionally cancel the close before

  // DoClose() is called.

  //

  // When windowed rendering is enabled CEF will internally create a window or

  // view to host the browser. In that case returning false from DoClose() will

  // send the standard close notification to the browser's top-level owner

  // window (e.g. WM_CLOSE on Windows, performClose: on OS X, "delete_event" on

  // Linux or CefWindowDelegate::CanClose() callback from Views). If the

  // browser's host window/view has already been destroyed (via view hierarchy

  // tear-down, for example) then DoClose() will not be called for that browser

  // since is no longer possible to cancel the close.

  //

  // When windowed rendering is disabled returning false from DoClose() will

  // cause the browser object to be destroyed immediately.

  //

  // If the browser's top-level owner window requires a non-standard close

  // notification then send that notification from DoClose() and return true.

  //

  // The CefLifeSpanHandler::OnBeforeClose() method will be called after

  // DoClose() (if DoClose() is called) and immediately before the browser

  // object is destroyed. The application should only exit after OnBeforeClose()

  // has been called for all existing browsers.

  //

  // The below examples describe what should happen during window close when the

  // browser is parented to an application-provided top-level window.

  //

  // Example 1: Using CefBrowserHost::TryCloseBrowser(). This is recommended for

  // clients using standard close handling and windows created on the browser

  // process UI thread.

  // 1.  User clicks the window close button which sends a close notification to

  //     the application's top-level window.

  // 2.  Application's top-level window receives the close notification and

  //     calls TryCloseBrowser() (which internally calls CloseBrowser(false)).

  //     TryCloseBrowser() returns false so the client cancels the window close.

  // 3.  JavaScript 'onbeforeunload' handler executes and shows the close

  //     confirmation dialog (which can be overridden via

  //     CefJSDialogHandler::OnBeforeUnloadDialog()).

  // 4.  User approves the close.

  // 5.  JavaScript 'onunload' handler executes.

  // 6.  CEF sends a close notification to the application's top-level window

  //     (because DoClose() returned false by default).

  // 7.  Application's top-level window receives the close notification and

  //     calls TryCloseBrowser(). TryCloseBrowser() returns true so the client

  //     allows the window close.

  // 8.  Application's top-level window is destroyed.

  // 9.  Application's OnBeforeClose() handler is called and the browser object

  //     is destroyed.

  // 10. Application exits by calling CefQuitMessageLoop() if no other browsers

  //     exist.

  //

  // Example 2: Using CefBrowserHost::CloseBrowser(false) and implementing the

  // DoClose() callback. This is recommended for clients using non-standard

  // close handling or windows that were not created on the browser process UI

  // thread.

  // 1.  User clicks the window close button which sends a close notification to

  //     the application's top-level window.

  // 2.  Application's top-level window receives the close notification and:

  //     A. Calls CefBrowserHost::CloseBrowser(false).

  //     B. Cancels the window close.

  // 3.  JavaScript 'onbeforeunload' handler executes and shows the close

  //     confirmation dialog (which can be overridden via

  //     CefJSDialogHandler::OnBeforeUnloadDialog()).

  // 4.  User approves the close.

  // 5.  JavaScript 'onunload' handler executes.

  // 6.  Application's DoClose() handler is called. Application will:

  //     A. Set a flag to indicate that the next close attempt will be allowed.

  //     B. Return false.

  // 7.  CEF sends an close notification to the application's top-level window.

  // 8.  Application's top-level window receives the close notification and

  //     allows the window to close based on the flag from #6B.

  // 9.  Application's top-level window is destroyed.

  // 10. Application's OnBeforeClose() handler is called and the browser object

  //     is destroyed.

  // 11. Application exits by calling CefQuitMessageLoop() if no other browsers

  //     exist.

  ///

  /*--cef()--*/

  virtual bool DoClose(CefRefPtr<CefBrowser> browser) { return false; }

 

  ///

  // Called just before a browser is destroyed. Release all references to the

  // browser object and do not attempt to execute any methods on the browser

  // object after this callback returns. This callback will be the last

  // notification that references |browser|. See DoClose() documentation for

  // additional usage information.

  ///

  /*--cef()--*/

  virtual void OnBeforeClose(CefRefPtr<CefBrowser> browser) {}

};

 

2.7.1         DoClose標准關閉處理

當窗口創建是在browser進程的UI線程創建時,采用標准的關閉處理,使用CefBrowserHost::TryCloseBrowser()。不實現DoClose回調,默認返回false。具體步驟:

(1)   點擊窗口的關閉按鈕,發送一個關閉通知給頂層窗口。

(2)   頂層窗口接收到關閉通知,調用TryCloseBrowser()函數,返回false;

(3)   JS的onbeforeunload處理句柄執行顯示關閉確認對話框。

(4)   用戶點擊按鈕同意關閉;

(5)   JS的onunload處理句柄執行;

(6)   CEF發送一個close通知給頂層窗口;

(7)   定鞥窗口接收到關閉通知,調用TryCloseBrowser,返回true,表示允許關閉。

(8)   頂層窗口銷毀

(9)   程序的OnBeforeClose處理回調函數執行,browser銷毀.

(10)如果不存在其他browser,則調用CefQuitMessageLoop退出程序。

2.7.2         DoClose非標准關閉處理

當窗口不是在browser進程的UI線程中創建時,采用非標准的關閉處理,使用函數CefBrowserHost::CloseBrowser(false),並且實現DoClose函數。

(1)   用戶點擊窗口的關閉按鈕,發送一個關閉通知給頂層窗口。

(2)   頂層窗口接收到關閉通知,調用CefBrowserHost::CloseBrowser(false)函數,取消關閉;

(3)   JS的onbeforeunload處理句柄執行顯示關閉確認對話框。

(4)   用戶點擊按鈕同意關閉;

(5)   JS的onunload處理句柄執行;

(6)   程序的DoClose()回調函數被調用,設置一個flag表明下次關閉嘗試會被允許,返回false;

(7)   CEF發送一個close通知給頂層窗口;

(8)   頂層窗口接收到關閉通知,根據之前設置的flag判斷是否關閉窗口。

(9)   頂層窗口銷毀;

(10)程序的OnBeforeClose處理回調函數執行,browser銷毀.

(11)如果不存在其他browser,則調用CefQuitMessageLoop退出程序。

 

2.8  CefLoadHandler網頁加載處理類

在一個網頁中加載內容,或者在網頁中打開一個子frame,都可以攔截到iframe打開時的消息以及url等信息。可以攔截子網頁url

(1)   開始加載OnLoadStart,navigation執行網之后,開始加載內容之前,回調此函數,多frame的進程會同時加載。同頁面巡航不會調用。

(2)   加載結束OnLoadEnd,加載結束時回調,sub-frame在主frame加載結束后, 會繼續開始加載或繼續進行加載,同頁面巡航不會調用。

(3)   加載錯誤OnLoadError,navigation失敗或者取消是回調。

(4)   加載狀態發生變化OnLoadingStateChange,加載初始化和加載結束時各調用一次,在OnLoadStart之前調用一次,OnLoadEnd或OnLoadError之后調用一次。

 

// Implement this interface to handle events related to browser load status. The

// methods of this class will be called on the browser process UI thread or

// render process main thread (TID_RENDERER).

///

/*--cef(source=client)--*/

class CefLoadHandler : public virtual CefBaseRefCounted {

 public:

  typedef cef_errorcode_t ErrorCode;

  typedef cef_transition_type_t TransitionType;

 

  ///

  // Called when the loading state has changed. This callback will be executed

  // twice -- once when loading is initiated either programmatically or by user

  // action, and once when loading is terminated due to completion, cancellation

  // of failure. It will be called before any calls to OnLoadStart and after all

  // calls to OnLoadError and/or OnLoadEnd.

  ///

  /*--cef()--*/

  virtual void OnLoadingStateChange(CefRefPtr<CefBrowser> browser,

                                    bool isLoading,

                                    bool canGoBack,

                                    bool canGoForward) {}

 

  ///

  // Called after a navigation has been committed and before the browser begins

  // loading contents in the frame. The |frame| value will never be empty --

  // call the IsMain() method to check if this frame is the main frame.

  // |transition_type| provides information about the source of the navigation

  // and an accurate value is only available in the browser process. Multiple

  // frames may be loading at the same time. Sub-frames may start or continue

  // loading after the main frame load has ended. This method will not be called

  // for same page navigations (fragments, history state, etc.) or for

  // navigations that fail or are canceled before commit. For notification of

  // overall browser load status use OnLoadingStateChange instead.

  ///

  /*--cef()--*/

  virtual void OnLoadStart(CefRefPtr<CefBrowser> browser,

                           CefRefPtr<CefFrame> frame,

                           TransitionType transition_type) {}

 

  ///

  // Called when the browser is done loading a frame. The |frame| value will

  // never be empty -- call the IsMain() method to check if this frame is the

  // main frame. Multiple frames may be loading at the same time. Sub-frames may

  // start or continue loading after the main frame load has ended. This method

  // will not be called for same page navigations (fragments, history state,

  // etc.) or for navigations that fail or are canceled before commit. For

  // notification of overall browser load status use OnLoadingStateChange

  // instead.

  ///

  /*--cef()--*/

  virtual void OnLoadEnd(CefRefPtr<CefBrowser> browser,

                         CefRefPtr<CefFrame> frame,

                         int httpStatusCode) {}

 

  ///

  // Called when a navigation fails or is canceled. This method may be called

  // by itself if before commit or in combination with OnLoadStart/OnLoadEnd if

  // after commit. |errorCode| is the error code number, |errorText| is the

  // error text and |failedUrl| is the URL that failed to load.

  // See net\base\net_error_list.h for complete descriptions of the error codes.

  ///

  /*--cef(optional_param=errorText)--*/

  virtual void OnLoadError(CefRefPtr<CefBrowser> browser,

                           CefRefPtr<CefFrame> frame,

                           ErrorCode errorCode,

                           const CefString& errorText,

                           const CefString& failedUrl) {}

};

 

2.9  CefRequestHandler網絡請求處理類

當打開一個網頁, CefRequestHandler的OnBeforeBrowser可以攔截網絡請求,只有在新打開網頁的時候,才會觸發,如果網頁已經打開,在網頁內部點擊查詢按鈕,查詢內容,雖然也有request請求,但是OnBeforeBrowser攔截不到獲取請求的URL,post請求的參數都可以獲取到。OnResourceRedirect還可以攔截重定向請求。CefLoadHandler也可以攔截request請求,而且頁面加載中調用很多的GET和POST請求都可以攔截到。測試發現CefRequestHandler頁面內部的加載變化是獲取不到的,只有打開頁面的請求能獲取到。而另外一個函數OnBeforeResourceLoad則可以攔截所有的請求,在瀏覽器中F12顯示的所有請求,包括圖片下載等請求都能一一獲取。所以CefLoadHandler攔截的請求更詳細一些,點擊查詢查詢,OnLoadStart和OnLoadEnd 攔截不到,但是OnLoadingStateChange 可以攔截的到請求。

OnBeforeBrowser

打開新的網頁可以攔截,頁面內容變化,或者頁面內部調用請求攔截不到。

OnBeforeResourceLoad

攔截一切請求,最詳細。

OnResourceResponse

攔截一切請求,最詳細。

 

 

OnLoadStart和OnLoadEnd

新打開頁面可以攔截

OnLoadingStateChange

打開新頁面, 頁面內容重新加載,查詢,按鈕響應可以攔截。像一些圖片加載,CSS加載是攔截不到的。第二詳細。

 

各回調函的調用的先后順序是

OnLoadingStateChange->OnBeforeBrowser->OnLoadStart->OnLoadEnd->OnLoadingStateChange。

// Implement this interface to handle events related to browser requests. The

// methods of this class will be called on the thread indicated.

///

/*--cef(source=client)--*/

class CefRequestHandler : public virtual CefBaseRefCounted {

 public:

  typedef cef_return_value_t ReturnValue;

  typedef cef_termination_status_t TerminationStatus;

  typedef cef_urlrequest_status_t URLRequestStatus;

  typedef cef_window_open_disposition_t WindowOpenDisposition;

  typedef std::vector<CefRefPtr<CefX509Certificate>> X509CertificateList;

 

  ///

  // Called on the UI thread 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.

  // CefLoadHandler::OnLoadingStateChange will be called twice in all cases.

  // If the navigation is allowed CefLoadHandler::OnLoadStart and

  // CefLoadHandler::OnLoadEnd will be called. If the navigation is canceled

  // CefLoadHandler::OnLoadError will be called with an |errorCode| value of

  // ERR_ABORTED. The |user_gesture| value will be true if the browser

  // navigated via explicit user gesture (e.g. clicking a link) or false if it

  // navigated automatically (e.g. via the DomContentLoaded event).

  ///

  /*--cef()--*/

(1)OnBeforeBrowse,在瀏覽器巡航前調用。

  virtual bool OnBeforeBrowse(CefRefPtr<CefBrowser> browser,

                              CefRefPtr<CefFrame> frame,

                              CefRefPtr<CefRequest> request,

                              bool user_gesture,

                              bool is_redirect) {

    return false;

  }

 

  ///

  // Called on the UI thread before OnBeforeBrowse in certain limited cases

  // where navigating a new or different browser might be desirable. This

  // includes user-initiated navigation that might open in a special way (e.g.

  // links clicked via middle-click or ctrl + left-click) and certain types of

  // cross-origin navigation initiated from the renderer process (e.g.

  // navigating the top-level frame to/from a file URL). The |browser| and

  // |frame| values represent the source of the navigation. The

  // |target_disposition| value indicates where the user intended to navigate

  // the browser based on standard Chromium behaviors (e.g. current tab,

  // new tab, etc). The |user_gesture| value will be true if the browser

  // navigated via explicit user gesture (e.g. clicking a link) or false if it

  // navigated automatically (e.g. via the DomContentLoaded event). Return true

  // to cancel the navigation or false to allow the navigation to proceed in the

  // source browser's top-level frame.

  ///

  /*--cef()--*/

(2)OnOpenURLFromTab,以特殊的方式打開的網頁,例如鼠標中間按鈕,快捷鍵等,一些很少的應用場景。

  virtual bool OnOpenURLFromTab(CefRefPtr<CefBrowser> browser,

                                CefRefPtr<CefFrame> frame,

                                const CefString& target_url,

                                WindowOpenDisposition target_disposition,

                                bool user_gesture) {

    return false;

  }

 

  ///

  // Called on the IO thread before a resource request is loaded. The |request|

  // object may be modified. Return RV_CONTINUE to continue the request

  // immediately. Return RV_CONTINUE_ASYNC and call CefRequestCallback::

  // Continue() at a later time to continue or cancel the request

  // asynchronously. Return RV_CANCEL to cancel the request immediately.

  //

  ///

  /*--cef(default_retval=RV_CONTINUE)--*/

(3)OnBeforeResourceLoad網頁開始加載資源時調用,可以攔截所有的請求,最為詳細。

  virtual ReturnValue OnBeforeResourceLoad(

      CefRefPtr<CefBrowser> browser,

      CefRefPtr<CefFrame> frame,

      CefRefPtr<CefRequest> request,

      CefRefPtr<CefRequestCallback> callback) {

    return RV_CONTINUE;

  }

};

///

  // Called on the IO thread before a resource is loaded. To allow the resource

  // to load normally return NULL. To specify a handler for the resource return

  // a CefResourceHandler object. The |request| object should not be modified in

  // this callback.

  ///

  /*--cef()--*/

  virtual CefRefPtr<CefResourceHandler> GetResourceHandler(

      CefRefPtr<CefBrowser> browser,

      CefRefPtr<CefFrame> frame,

      CefRefPtr<CefRequest> request) {

    return NULL;

  }

 

  ///

  // Called on the IO thread when a resource load is redirected. The |request|

  // parameter will contain the old URL and other request-related information.

  // The |response| parameter will contain the response that resulted in the

  // redirect. The |new_url| parameter will contain the new URL and can be

  // changed if desired. The |request| object cannot be modified in this

  // callback.

  ///

  /*--cef()--*/

(4)OnResourceRedirect重定向請求攔截

  virtual void OnResourceRedirect(CefRefPtr<CefBrowser> browser,

                                  CefRefPtr<CefFrame> frame,

                                  CefRefPtr<CefRequest> request,

                                  CefRefPtr<CefResponse> response,

                                  CefString& new_url) {}

 

  ///

  // Called on the IO thread when a resource response is received. To allow the

  // resource to load normally return false. To redirect or retry the resource

  // modify |request| (url, headers or post body) and return true. The

  // |response| object cannot be modified in this callback.

  ///

  /*--cef()--*/

(5)OnResourceResponse請求響應后的回調函數

  virtual bool OnResourceResponse(CefRefPtr<CefBrowser> browser,

                                  CefRefPtr<CefFrame> frame,

                                  CefRefPtr<CefRequest> request,

                                  CefRefPtr<CefResponse> response) {

    return false;

  }

 

  ///

  // Called on the IO thread to optionally filter resource response content.

  // |request| and |response| represent the request and response respectively

  // and cannot be modified in this callback.

  ///

  /*--cef()--*/

  virtual CefRefPtr<CefResponseFilter> GetResourceResponseFilter(

      CefRefPtr<CefBrowser> browser,

      CefRefPtr<CefFrame> frame,

      CefRefPtr<CefRequest> request,

      CefRefPtr<CefResponse> response) {

    return NULL;

  }

///

  // Called on the IO thread when a resource load has completed. |request| and

  // |response| represent the request and response respectively and cannot be

  // modified in this callback. |status| indicates the load completion status.

  // |received_content_length| is the number of response bytes actually read.

  ///

  /*--cef()--*/

(6)OnResourceLoadComplete資源加載結束時的回調

  virtual void OnResourceLoadComplete(CefRefPtr<CefBrowser> browser,

                                      CefRefPtr<CefFrame> frame,

                                      CefRefPtr<CefRequest> request,

                                      CefRefPtr<CefResponse> response,

                                      URLRequestStatus status,

                                      int64 received_content_length) {}

 

  ///

  // Called on the IO thread when the browser needs credentials from the user.

  // |isProxy| indicates whether the host is a proxy server. |host| contains the

  // hostname and |port| contains the port number. |realm| is the realm of the

  // challenge and may be empty. |scheme| is the authentication scheme used,

  // such as "basic" or "digest", and will be empty if the source of the request

  // is an FTP server. Return true to continue the request and call

  // CefAuthCallback::Continue() either in this method or at a later time when

  // the authentication information is available. Return false to cancel the

  // request immediately.

  ///

  /*--cef(optional_param=realm,optional_param=scheme)--*/

  virtual bool GetAuthCredentials(CefRefPtr<CefBrowser> browser,

                                  CefRefPtr<CefFrame> frame,

                                  bool isProxy,

                                  const CefString& host,

                                  int port,

                                  const CefString& realm,

                                  const CefString& scheme,

                                  CefRefPtr<CefAuthCallback> callback) {

    return false;

  }

 

  ///

  // Called on the IO thread before sending a network request with a "Cookie"

  // request header. Return true to allow cookies to be included in the network

  // request or false to block cookies. The |request| object should not be

  // modified in this callback.

  ///

  /*--cef()--*/

  virtual bool CanGetCookies(CefRefPtr<CefBrowser> browser,

                             CefRefPtr<CefFrame> frame,

                             CefRefPtr<CefRequest> request) {

    return true;

  }

 

  ///

  // Called on the IO thread when receiving a network request with a

  // "Set-Cookie" response header value represented by |cookie|. Return true to

  // allow the cookie to be stored or false to block the cookie. The |request|

  // object should not be modified in this callback.

  ///

  /*--cef()--*/

  virtual bool CanSetCookie(CefRefPtr<CefBrowser> browser,

                            CefRefPtr<CefFrame> frame,

                            CefRefPtr<CefRequest> request,

                            const CefCookie& cookie) {

    return true;

  }

 

  ///

  // Called on the IO thread when JavaScript requests a specific storage quota

  // size via the webkitStorageInfo.requestQuota function. |origin_url| is the

  // origin of the page making the request. |new_size| is the requested quota

  // size in bytes. Return true to continue the request and call

  // CefRequestCallback::Continue() either in this method or at a later time to

  // grant or deny the request. Return false to cancel the request immediately.

  ///

  /*--cef()--*/

  virtual bool OnQuotaRequest(CefRefPtr<CefBrowser> browser,

                              const CefString& origin_url,

                              int64 new_size,

                              CefRefPtr<CefRequestCallback> callback) {

    return false;

  }

 

  ///

  // Called on the UI thread to handle requests for URLs with an unknown

  // protocol component. Set |allow_os_execution| to true to attempt execution

  // via the registered OS protocol handler, if any.

  // SECURITY WARNING: YOU SHOULD USE THIS METHOD TO ENFORCE RESTRICTIONS BASED

  // ON SCHEME, HOST OR OTHER URL ANALYSIS BEFORE ALLOWING OS EXECUTION.

  ///

  /*--cef()--*/

  virtual void OnProtocolExecution(CefRefPtr<CefBrowser> browser,

                                   const CefString& url,

                                   bool& allow_os_execution) {}

 

  ///

  // Called on the UI thread to handle requests for URLs with an invalid

  // SSL certificate. Return true and call CefRequestCallback::Continue() either

  // in this method or at a later time to continue or cancel the request. Return

  // false to cancel the request immediately. If

  // CefSettings.ignore_certificate_errors is set all invalid certificates will

  // be accepted without calling this method.

  ///

  /*--cef()--*/

  virtual bool OnCertificateError(CefRefPtr<CefBrowser> browser,

                                  cef_errorcode_t cert_error,

                                  const CefString& request_url,

                                  CefRefPtr<CefSSLInfo> ssl_info,

                                  CefRefPtr<CefRequestCallback> callback) {

    return false;

  }

 

  ///

  // Called on the UI thread when a client certificate is being requested for

  // authentication. Return false to use the default behavior and automatically

  // select the first certificate available. Return true and call

  // CefSelectClientCertificateCallback::Select either in this method or at a

  // later time to select a certificate. Do not call Select or call it with NULL

  // to continue without using any certificate. |isProxy| indicates whether the

  // host is an HTTPS proxy or the origin server. |host| and |port| contains the

  // hostname and port of the SSL server. |certificates| is the list of

  // certificates to choose from; this list has already been pruned by Chromium

  // so that it only contains certificates from issuers that the server trusts.

  ///

  /*--cef()--*/

  virtual bool OnSelectClientCertificate(

      CefRefPtr<CefBrowser> browser,

      bool isProxy,

      const CefString& host,

      int port,

      const X509CertificateList& certificates,

      CefRefPtr<CefSelectClientCertificateCallback> callback) {

    return false;

  }

 

  ///

  // Called on the browser process UI thread when a plugin has crashed.

  // |plugin_path| is the path of the plugin that crashed.

  ///

  /*--cef()--*/

  virtual void OnPluginCrashed(CefRefPtr<CefBrowser> browser,

                               const CefString& plugin_path) {}

 

  ///

  // Called on the browser process UI thread when the render view associated

  // with |browser| is ready to receive/handle IPC messages in the render

  // process.

  ///

  /*--cef()--*/

  virtual void OnRenderViewReady(CefRefPtr<CefBrowser> browser) {}

///

  // Called on the browser process UI thread when the render process

  // terminates unexpectedly. |status| indicates how the process

  // terminated.

  ///

  /*--cef()--*/

  virtual void OnRenderProcessTerminated(CefRefPtr<CefBrowser> browser,

                                         TerminationStatus status) {}

};

自己開發了一個股票智能分析軟件,功能很強大,需要的點擊下面的鏈接獲取:

https://www.cnblogs.com/bclshuai/p/11380657.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM