ctai/3rdparty/QCefView/include/QCefCore/CefViewBrowserClient.h

478 lines
21 KiB
C++

//
// CefViewBrowserClient.h
// CefViewCore
//
// Created by Sheen Tian on 2020/6/11.
//
#ifndef CefViewBrowserHandler_h
#define CefViewBrowserHandler_h
#pragma once
#pragma region stl_headers
#include <unordered_map>
#pragma endregion
#include <CefViewCoreGlobal.h>
#include <CefViewBrowserApp.h>
#include <CefViewBrowserClientDelegate.h>
#if CEF_VERSION_MAJOR < 122
#define CEFVIEW_MAIN_FRAME (0)
#define CEFVIEW_ALL_FRAMES (-1)
#else
#define CEFVIEW_MAIN_FRAME ("0")
#define CEFVIEW_ALL_FRAMES ("-1")
#endif
/// <summary>
/// Forward declaration
/// </summary>
class CefViewQueryHandler;
/// <summary>
///
/// </summary>
class CefViewBrowserClient
: public CefClient
, public CefContextMenuHandler
, public CefDialogHandler
, public CefDisplayHandler
, public CefDownloadHandler
, public CefDragHandler
, public CefFindHandler
, public CefFocusHandler
, public CefJSDialogHandler
, public CefKeyboardHandler
, public CefLifeSpanHandler
, public CefLoadHandler
, public CefRequestHandler
, public CefResourceRequestHandler
, public CefRenderHandler
{
IMPLEMENT_REFCOUNTING(CefViewBrowserClient);
private:
/// <summary>
///
/// </summary>
CefRefPtr<CefViewBrowserApp> app_;
/// <summary>
///
/// </summary>
CefViewBrowserClientDelegateInterface::WeakPtr client_delegate_;
// flags
bool is_closing_;
bool close_by_native_;
bool initial_navigation_;
// message router
CefMessageRouterConfig message_router_config_;
CefRefPtr<CefMessageRouterBrowserSide> message_router_;
CefRefPtr<CefViewQueryHandler> message_router_handler_;
// resource manager
CefRefPtr<CefResourceManager> resource_manager_;
// browser map
std::unordered_map<int, CefRefPtr<CefBrowser>> browser_map_;
public:
/// <summary>
///
/// </summary>
/// <param name="app_"></param>
/// <param name="delegate"></param>
CefViewBrowserClient(CefRefPtr<CefViewBrowserApp> app, CefViewBrowserClientDelegateInterface::RefPtr delegate);
/// <summary>
///
/// </summary>
~CefViewBrowserClient();
/// <summary>
///
/// </summary>
/// <returns></returns>
int GetBrowserCount() { return static_cast<int>(browser_map_.size()); }
/// <summary>
///
/// </summary>
void CloseAllBrowsers();
/// <summary>
///
/// </summary>
/// <param name="dir_path"></param>
/// <param name="url"></param>
/// <param name="priority"></param>
void AddLocalDirectoryResourceProvider(const CefString& dir_path, const CefString& url, int priority = 0);
/// <summary>
///
/// </summary>
/// <param name="archive_path"></param>
/// <param name="url"></param>
/// <param name="password"></param>
/// <param name="priority"></param>
void AddArchiveResourceProvider(const CefString& archive_path,
const CefString& url,
const CefString& password,
int priority = 0);
bool TriggerEvent(CefRefPtr<CefBrowser> browser, const CefFrameId& frame_id, const CefRefPtr<CefProcessMessage> msg);
/// <summary>
///
/// </summary>
/// <param name="query"></param>
/// <param name="success"></param>
/// <param name="response"></param>
/// <param name="error"></param>
/// <returns></returns>
bool ResponseQuery(const int64_t query, bool success, const CefString& response, int error);
/// <summary>
///
/// </summary>
/// <param name="browser"></param>
/// <param name="frame"></param>
/// <param name="code"></param>
/// <param name="url"></param>
/// <param name="context"></param>
/// <returns></returns>
bool AsyncExecuteJSCode(CefRefPtr<CefBrowser> browser,
CefRefPtr<CefFrame> frame,
const CefString& code,
const CefString& url,
const CefString& context);
protected:
bool DispatchRenderMessage(CefRefPtr<CefBrowser> browser,
CefRefPtr<CefFrame> frame,
CefRefPtr<CefProcessMessage> message);
bool OnRenderFocusedNodeChangedMessage(CefRefPtr<CefBrowser> browser,
CefRefPtr<CefFrame> frame,
CefRefPtr<CefProcessMessage> message);
bool OnRenderInvokeMethodMessage(CefRefPtr<CefBrowser> browser,
CefRefPtr<CefFrame> frame,
CefRefPtr<CefProcessMessage> message);
bool OnRenderReportJSResultMessage(CefRefPtr<CefBrowser> browser,
CefRefPtr<CefFrame> frame,
CefRefPtr<CefProcessMessage> message);
// CefClient methods:
#pragma region CefContextMenuHandler
virtual bool OnProcessMessageReceived(CefRefPtr<CefBrowser> browser,
CefRefPtr<CefFrame> frame,
CefProcessId source_process,
CefRefPtr<CefProcessMessage> message) override;
#pragma endregion
// CefContextMenuHandler methods
#pragma region CefContextMenuHandler
virtual CefRefPtr<CefContextMenuHandler> GetContextMenuHandler() override;
virtual void OnBeforeContextMenu(CefRefPtr<CefBrowser> browser,
CefRefPtr<CefFrame> frame,
CefRefPtr<CefContextMenuParams> params,
CefRefPtr<CefMenuModel> model) override;
virtual bool RunContextMenu(CefRefPtr<CefBrowser> browser,
CefRefPtr<CefFrame> frame,
CefRefPtr<CefContextMenuParams> params,
CefRefPtr<CefMenuModel> model,
CefRefPtr<CefRunContextMenuCallback> callback) override;
virtual bool OnContextMenuCommand(CefRefPtr<CefBrowser> browser,
CefRefPtr<CefFrame> frame,
CefRefPtr<CefContextMenuParams> params,
int command_id,
EventFlags event_flags) override;
virtual void OnContextMenuDismissed(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame) override;
#pragma endregion
// CefDialogHandler
#pragma region CefDialogHandler
virtual CefRefPtr<CefDialogHandler> GetDialogHandler() override;
#if CEF_VERSION_MAJOR < 102
virtual bool OnFileDialog(CefRefPtr<CefBrowser> browser,
FileDialogMode mode,
const CefString& title,
const CefString& default_file_path,
const std::vector<CefString>& accept_filters,
int selected_accept_filter,
CefRefPtr<CefFileDialogCallback> callback) override;
#elif CEF_VERSION_MAJOR < 126
virtual bool OnFileDialog(CefRefPtr<CefBrowser> browser,
FileDialogMode mode,
const CefString& title,
const CefString& default_file_path,
const std::vector<CefString>& accept_filters,
CefRefPtr<CefFileDialogCallback> callback) override;
#else
virtual bool OnFileDialog(CefRefPtr<CefBrowser> browser,
FileDialogMode mode,
const CefString& title,
const CefString& default_file_path,
const std::vector<CefString>& accept_filters,
const std::vector<CefString>& accept_extensions,
const std::vector<CefString>& accept_descriptions,
CefRefPtr<CefFileDialogCallback> callback) override;
#endif
#pragma endregion
// CefDisplayHandler methods
#pragma region CefDisplayHandler
virtual CefRefPtr<CefDisplayHandler> GetDisplayHandler() override;
virtual void OnAddressChange(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, const CefString& url) override;
virtual void OnTitleChange(CefRefPtr<CefBrowser> browser, const CefString& title) override;
virtual void OnFaviconURLChange(CefRefPtr<CefBrowser> browser, const std::vector<CefString>& icon_urls) override;
virtual void OnFullscreenModeChange(CefRefPtr<CefBrowser> browser, bool fullscreen) override;
virtual bool OnTooltip(CefRefPtr<CefBrowser> browser, CefString& text) override;
virtual void OnStatusMessage(CefRefPtr<CefBrowser> browser, const CefString& value) override;
virtual bool OnConsoleMessage(CefRefPtr<CefBrowser> browser,
cef_log_severity_t level,
const CefString& message,
const CefString& source,
int line) override;
virtual bool OnAutoResize(CefRefPtr<CefBrowser> browser, const CefSize& new_size) override;
virtual void OnLoadingProgressChange(CefRefPtr<CefBrowser> browser, double progress) override;
virtual bool OnCursorChange(CefRefPtr<CefBrowser> browser,
CefCursorHandle cursor,
cef_cursor_type_t type,
const CefCursorInfo& custom_cursor_info) override;
#pragma endregion
// CefDownloadHandler
#pragma region CefDownloadHandler
virtual CefRefPtr<CefDownloadHandler> GetDownloadHandler() override;
#if CEF_VERSION_MAJOR < 125
virtual void OnBeforeDownload(CefRefPtr<CefBrowser> browser,
CefRefPtr<CefDownloadItem> download_item,
const CefString& suggested_name,
CefRefPtr<CefBeforeDownloadCallback> callback) override;
#else
virtual bool OnBeforeDownload(CefRefPtr<CefBrowser> browser,
CefRefPtr<CefDownloadItem> download_item,
const CefString& suggested_name,
CefRefPtr<CefBeforeDownloadCallback> callback) override;
#endif
void OnDownloadUpdated(CefRefPtr<CefBrowser> browser,
CefRefPtr<CefDownloadItem> download_item,
CefRefPtr<CefDownloadItemCallback> callback) override;
#pragma endregion
// CefDragHandler methods
#pragma region CefDragHandler
virtual CefRefPtr<CefDragHandler> GetDragHandler() override;
virtual bool OnDragEnter(CefRefPtr<CefBrowser> browser,
CefRefPtr<CefDragData> dragData,
CefDragHandler::DragOperationsMask mask) override;
virtual void OnDraggableRegionsChanged(CefRefPtr<CefBrowser> browser,
CefRefPtr<CefFrame> frame,
const std::vector<CefDraggableRegion>& regions) override;
#pragma endregion
// CefFindHandler methods
#pragma region CefFindHandler
virtual CefRefPtr<CefFindHandler> GetFindHandler() override;
virtual void OnFindResult(CefRefPtr<CefBrowser> browser,
int identifier,
int count,
const CefRect& selectionRect,
int activeMatchOrdinal,
bool finalUpdate) override;
#pragma endregion
// CefFocusHandler methods
#pragma region CefFocusHandler
virtual CefRefPtr<CefFocusHandler> GetFocusHandler() override;
void OnTakeFocus(CefRefPtr<CefBrowser> browser, bool next) override;
bool OnSetFocus(CefRefPtr<CefBrowser> browser, FocusSource source) override;
void OnGotFocus(CefRefPtr<CefBrowser> browser) override;
#pragma endregion
// CefJSDialogHandler methods
#pragma region CefJSDialogHandler
virtual CefRefPtr<CefJSDialogHandler> GetJSDialogHandler() override;
virtual bool OnJSDialog(CefRefPtr<CefBrowser> browser,
const CefString& origin_url,
JSDialogType dialog_type,
const CefString& message_text,
const CefString& default_prompt_text,
CefRefPtr<CefJSDialogCallback> callback,
bool& suppress_message) override;
virtual bool OnBeforeUnloadDialog(CefRefPtr<CefBrowser> browser,
const CefString& message_text,
bool is_reload,
CefRefPtr<CefJSDialogCallback> callback) override;
virtual void OnResetDialogState(CefRefPtr<CefBrowser> browser) override;
virtual void OnDialogClosed(CefRefPtr<CefBrowser> browser) override;
#pragma endregion
// CefKeyboardHandler methods
#pragma region CefKeyboardHandler
virtual CefRefPtr<CefKeyboardHandler> GetKeyboardHandler() override;
virtual bool OnPreKeyEvent(CefRefPtr<CefBrowser> browser,
const CefKeyEvent& event,
CefEventHandle os_event,
bool* is_keyboard_shortcut) override;
virtual bool OnKeyEvent(CefRefPtr<CefBrowser> browser, const CefKeyEvent& event, CefEventHandle os_event) override;
#pragma endregion
// CefLifeSpanHandler methods:
#pragma region CefLifeSpanHandler
virtual CefRefPtr<CefLifeSpanHandler> GetLifeSpanHandler() override;
virtual bool OnBeforePopup(CefRefPtr<CefBrowser> browser,
CefRefPtr<CefFrame> frame,
#if CEF_VERSION_MAJOR > 131
int popup_id,
#endif
const CefString& target_url,
const CefString& target_frame_name,
CefLifeSpanHandler::WindowOpenDisposition target_disposition,
bool user_gesture,
const CefPopupFeatures& popupFeatures,
CefWindowInfo& windowInfo,
CefRefPtr<CefClient>& client,
CefBrowserSettings& settings,
CefRefPtr<CefDictionaryValue>& extra_info,
bool* no_javascript_access) override;
virtual void OnAfterCreated(CefRefPtr<CefBrowser> browser) override;
virtual bool DoClose(CefRefPtr<CefBrowser> browser) override;
virtual void OnBeforeClose(CefRefPtr<CefBrowser> browser) override;
#pragma endregion
// CefLoadHandler methods
#pragma region CefLoadHandler
virtual CefRefPtr<CefLoadHandler> GetLoadHandler() override;
virtual void OnLoadingStateChange(CefRefPtr<CefBrowser> browser,
bool isLoading,
bool canGoBack,
bool canGoForward) override;
virtual void OnLoadStart(CefRefPtr<CefBrowser> browser,
CefRefPtr<CefFrame> frame,
TransitionType transition_type) override;
virtual void OnLoadEnd(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, int httpStatusCode) override;
virtual void OnLoadError(CefRefPtr<CefBrowser> browser,
CefRefPtr<CefFrame> frame,
ErrorCode errorCode,
const CefString& errorText,
const CefString& failedUrl) override;
#pragma endregion
// CefRenderHandler
#pragma region CefRenderHandler
virtual CefRefPtr<CefRenderHandler> GetRenderHandler() override;
virtual CefRefPtr<CefAccessibilityHandler> GetAccessibilityHandler() override;
virtual bool GetRootScreenRect(CefRefPtr<CefBrowser> browser, CefRect& rect) override;
virtual void GetViewRect(CefRefPtr<CefBrowser> browser, CefRect& rect) override;
virtual bool GetScreenPoint(CefRefPtr<CefBrowser> browser, int viewX, int viewY, int& screenX, int& screenY) override;
virtual bool GetScreenInfo(CefRefPtr<CefBrowser> browser, CefScreenInfo& screen_info) override;
virtual void OnPopupShow(CefRefPtr<CefBrowser> browser, bool show) override;
virtual void OnPopupSize(CefRefPtr<CefBrowser> browser, const CefRect& rect) override;
virtual void OnPaint(CefRefPtr<CefBrowser> browser,
PaintElementType type,
const RectList& dirtyRects,
const void* buffer,
int width,
int height) override;
#if CEF_VERSION_MAJOR < 124
virtual void OnAcceleratedPaint(CefRefPtr<CefBrowser> browser,
PaintElementType type,
const RectList& dirtyRects,
void* shared_handle) override;
#else
virtual void OnAcceleratedPaint(CefRefPtr<CefBrowser> browser,
PaintElementType type,
const RectList& dirtyRects,
const CefAcceleratedPaintInfo& info) override;
#endif
virtual bool StartDragging(CefRefPtr<CefBrowser> browser,
CefRefPtr<CefDragData> drag_data,
CefRenderHandler::DragOperationsMask allowed_ops,
int x,
int y) override;
virtual void UpdateDragCursor(CefRefPtr<CefBrowser> browser, DragOperation operation) override;
virtual void OnScrollOffsetChanged(CefRefPtr<CefBrowser> browser, double x, double y) override;
virtual void OnImeCompositionRangeChanged(CefRefPtr<CefBrowser> browser,
const CefRange& selected_range,
const RectList& character_bounds) override;
virtual void OnTextSelectionChanged(CefRefPtr<CefBrowser> browser,
const CefString& selected_text,
const CefRange& selected_range) override;
virtual void OnVirtualKeyboardRequested(CefRefPtr<CefBrowser> browser, TextInputMode input_mode) override;
#pragma endregion
// CefRequestHandler methods
#pragma region CefRequestHandler
virtual CefRefPtr<CefRequestHandler> GetRequestHandler() override;
virtual bool OnBeforeBrowse(CefRefPtr<CefBrowser> browser,
CefRefPtr<CefFrame> frame,
CefRefPtr<CefRequest> request,
bool user_gesture,
bool is_redirect) override;
virtual bool OnOpenURLFromTab(CefRefPtr<CefBrowser> browser,
CefRefPtr<CefFrame> frame,
const CefString& target_url,
CefRequestHandler::WindowOpenDisposition target_disposition,
bool user_gesture) override;
#if CEF_VERSION_MAJOR > 91 && CEF_VERSION_MAJOR < 109
virtual bool OnQuotaRequest(CefRefPtr<CefBrowser> browser,
const CefString& origin_url,
int64 new_size,
CefRefPtr<CefCallback> callback) override;
#endif
#if CEF_VERSION_MAJOR < 124
virtual void OnRenderProcessTerminated(CefRefPtr<CefBrowser> browser, TerminationStatus status) override;
#else
virtual void OnRenderProcessTerminated(CefRefPtr<CefBrowser> browser,
TerminationStatus status,
int error_code,
const CefString& error_string) override;
#endif
#pragma endregion
// CefResourceRequestHandler
#pragma region CefResourceRequestHandler
virtual CefRefPtr<CefResourceRequestHandler> GetResourceRequestHandler(CefRefPtr<CefBrowser> browser,
CefRefPtr<CefFrame> frame,
CefRefPtr<CefRequest> request,
bool is_navigation,
bool is_download,
const CefString& request_initiator,
bool& disable_default_handling) override;
virtual ReturnValue OnBeforeResourceLoad(CefRefPtr<CefBrowser> browser,
CefRefPtr<CefFrame> frame,
CefRefPtr<CefRequest> request,
#if CEF_VERSION_MAJOR > 91
CefRefPtr<CefCallback> callback
#else
CefRefPtr<CefRequestCallback> callback
#endif
) override;
virtual CefRefPtr<CefResourceHandler> GetResourceHandler(CefRefPtr<CefBrowser> browser,
CefRefPtr<CefFrame> frame,
CefRefPtr<CefRequest> request) override;
virtual void OnProtocolExecution(CefRefPtr<CefBrowser> browser,
CefRefPtr<CefFrame> frame,
CefRefPtr<CefRequest> request,
bool& allow_os_execution) override;
#pragma endregion
};
#endif