// Copyright © 2010 The CefSharp Authors. All rights reserved. // // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file. #ifndef CEFSHARP_CORE_INTERNALS_CLIENTADAPTER_H_ #define CEFSHARP_CORE_INTERNALS_CLIENTADAPTER_H_ #pragma once #include "Stdafx.h" #include "include/cef_app.h" #include "include/cef_client.h" #include "include/cef_render_process_handler.h" #include "include/internal/cef_types.h" using namespace System::Threading::Tasks; namespace CefSharp { namespace Internals { private class ClientAdapter : public CefClient, public CefLifeSpanHandler, public CefLoadHandler, public CefRequestHandler, public CefDisplayHandler, public CefContextMenuHandler, public CefFocusHandler, public CefKeyboardHandler, public CefJSDialogHandler, public CefDialogHandler, public CefDragHandler, public CefDownloadHandler, public CefFindHandler, public CefAudioHandler, public CefFrameHandler, public CefPermissionHandler { private: gcroot _browserControl; HWND _browserHwnd; CefRefPtr _cefBrowser; bool _disposed; gcroot _browser; gcroot^> _popupBrowsers; gcroot _tooltip; gcroot _browserAdapter; //contains in-progress eval script tasks gcroot^> _pendingTaskRepository; //contains js callback factories for each browser IBrowser^ GetBrowserWrapper(int browserId, bool isPopup); public: ClientAdapter(IWebBrowserInternal^ browserControl, IBrowserAdapter^ browserAdapter) : _browserControl(browserControl), _popupBrowsers(gcnew Dictionary()), _pendingTaskRepository(gcnew PendingTaskRepository()), _browserAdapter(browserAdapter), _browserHwnd(nullptr), _disposed(false) { } ~ClientAdapter() { _disposed = true; CloseAllPopups(true); //this will dispose the repository and cancel all pending tasks delete _pendingTaskRepository; _browser = nullptr; _browserControl = nullptr; _browserHwnd = nullptr; _cefBrowser = nullptr; _tooltip = nullptr; _browserAdapter = nullptr; _popupBrowsers = nullptr; } HWND GetBrowserHwnd() { return _browserHwnd; } PendingTaskRepository^ GetPendingTaskRepository(); void CloseAllPopups(bool forceClose); void MethodInvocationComplete(MethodInvocationResult^ result); IBrowser^ GetBrowserWrapper(int browserId); bool IsMainBrowser(bool isPopup, int browserId); // CefClient virtual DECL CefRefPtr GetLifeSpanHandler() override { return this; } virtual DECL CefRefPtr GetLoadHandler() override { return this; } virtual DECL CefRefPtr GetRequestHandler() override { return this; } virtual DECL CefRefPtr GetDisplayHandler() override { return this; } virtual DECL CefRefPtr GetDownloadHandler() override { return this; } virtual DECL CefRefPtr GetContextMenuHandler() override { return this; } virtual DECL CefRefPtr GetFocusHandler() override { return this; } virtual DECL CefRefPtr GetKeyboardHandler() override { return this; } virtual DECL CefRefPtr GetJSDialogHandler() override { return this; } virtual DECL CefRefPtr GetDialogHandler() override { return this; } virtual DECL CefRefPtr GetDragHandler() override { return this; } virtual DECL CefRefPtr GetFindHandler() override { return this; } virtual DECL CefRefPtr GetAudioHandler() override { return this; } virtual DECL CefRefPtr GetFrameHandler() override { return this; } virtual DECL CefRefPtr GetPermissionHandler() override { return this; } virtual DECL bool OnProcessMessageReceived(CefRefPtr browser, CefRefPtr frame, CefProcessId source_process, CefRefPtr message) override; // CefLifeSpanHandler virtual DECL bool OnBeforePopup(CefRefPtr browser, CefRefPtr frame, const CefString& target_url, const CefString& target_frame_name, CefLifeSpanHandler::WindowOpenDisposition target_disposition, bool user_gesture, const CefPopupFeatures& popupFeatures, CefWindowInfo& windowInfo, CefRefPtr& client, CefBrowserSettings& settings, CefRefPtr& extraInfo, bool* no_javascript_access) override; virtual DECL void OnAfterCreated(CefRefPtr browser) override; virtual DECL bool DoClose(CefRefPtr browser) override; virtual DECL void OnBeforeClose(CefRefPtr browser) override; // CefLoadHandler virtual DECL void OnLoadStart(CefRefPtr browser, CefRefPtr frame, TransitionType transitionType) override; virtual DECL void OnLoadEnd(CefRefPtr browser, CefRefPtr frame, int httpStatusCode) override; virtual DECL void OnLoadError(CefRefPtr browser, CefRefPtr frame, ErrorCode errorCode, const CefString& errorText, const CefString& failedUrl) override; // CefRequestHandler virtual DECL bool OnBeforeBrowse(CefRefPtr browser, CefRefPtr frame, CefRefPtr request, bool userGesture, bool isRedirect) override; virtual DECL bool OnOpenURLFromTab(CefRefPtr browser, CefRefPtr frame, const CefString& targetUrl, CefRequestHandler::WindowOpenDisposition targetDisposition, bool userGesture) override; virtual DECL CefRefPtr GetResourceRequestHandler(CefRefPtr browser, CefRefPtr frame, CefRefPtr request, bool isNavigation, bool isDownload, const CefString& requestInitiator, bool& disableDefaultHandling) override; virtual DECL bool GetAuthCredentials(CefRefPtr browser, const CefString& originUrl, bool isProxy, const CefString& host, int port, const CefString& realm, const CefString& scheme, CefRefPtr callback) override; virtual DECL bool OnCertificateError(CefRefPtr browser, cef_errorcode_t cert_error, const CefString& request_url, CefRefPtr ssl_info, CefRefPtr callback) override; virtual DECL bool OnSelectClientCertificate(CefRefPtr browser, bool isProxy, const CefString& host, int port, const CefRequestHandler::X509CertificateList& certificates, CefRefPtr callback) override; virtual DECL void OnRenderViewReady(CefRefPtr browser) override; virtual DECL void OnRenderProcessTerminated(CefRefPtr browser, TerminationStatus status, int errorCode, const CefString& errorString) override; virtual DECL void OnDocumentAvailableInMainFrame(CefRefPtr browser) override; // CefDisplayHandler virtual DECL void OnLoadingStateChange(CefRefPtr browser, bool isLoading, bool canGoBack, bool canGoForward) override; virtual DECL void OnAddressChange(CefRefPtr browser, CefRefPtr frame, const CefString& url) override; virtual DECL bool OnAutoResize(CefRefPtr< CefBrowser > browser, const CefSize& new_size) override; virtual DECL bool OnCursorChange(CefRefPtr browser, CefCursorHandle cursor, cef_cursor_type_t type, const CefCursorInfo & custom_cursor_info) override; virtual DECL void OnTitleChange(CefRefPtr browser, const CefString& title) override; virtual DECL void OnFaviconURLChange(CefRefPtr browser, const std::vector& iconUrls) override; virtual DECL void OnFullscreenModeChange(CefRefPtr browser, bool fullscreen) override; virtual DECL void OnLoadingProgressChange(CefRefPtr browser, double progress) override; virtual DECL bool OnTooltip(CefRefPtr browser, CefString& text) override; virtual DECL bool OnConsoleMessage(CefRefPtr browser, cef_log_severity_t level, const CefString& message, const CefString& source, int line) override; virtual DECL void OnStatusMessage(CefRefPtr browser, const CefString& message) override; virtual DECL void InternalCursorChange(CefRefPtr browser, CefCursorHandle cursor, cef_cursor_type_t type, const CefCursorInfo& custom_cursor_info); // CefContextMenuHandler virtual DECL void OnBeforeContextMenu(CefRefPtr browser, CefRefPtr frame, CefRefPtr params, CefRefPtr model) override; virtual DECL bool OnContextMenuCommand(CefRefPtr browser, CefRefPtr frame, CefRefPtr params, int commandId, EventFlags eventFlags) override; virtual DECL void OnContextMenuDismissed(CefRefPtr browser, CefRefPtr frame) override; virtual DECL bool RunContextMenu(CefRefPtr browser, CefRefPtr frame, CefRefPtr params, CefRefPtr model, CefRefPtr callback) override; // CefFocusHandler virtual DECL void OnGotFocus(CefRefPtr browser) override; virtual DECL bool OnSetFocus(CefRefPtr browser, FocusSource source) override; virtual DECL void OnTakeFocus(CefRefPtr browser, bool next) override; // CefKeyboardHandler virtual DECL bool OnKeyEvent(CefRefPtr browser, const CefKeyEvent& event, CefEventHandle os_event) override; virtual DECL bool OnPreKeyEvent(CefRefPtr browser, const CefKeyEvent& event, CefEventHandle os_event, bool* is_keyboard_shortcut) override; // CefJSDialogHandler virtual DECL bool OnJSDialog(CefRefPtr browser, const CefString& origin_url, JSDialogType dialog_type, const CefString& message_text, const CefString& default_prompt_text, CefRefPtr callback, bool& suppress_message) override; virtual DECL bool OnBeforeUnloadDialog(CefRefPtr browser, const CefString& message_text, bool is_reload, CefRefPtr callback) override; virtual DECL void OnResetDialogState(CefRefPtr browser) override; virtual DECL void OnDialogClosed(CefRefPtr browser) override; // CefDialogHandler virtual DECL bool OnFileDialog(CefRefPtr browser, FileDialogMode mode, const CefString& title, const CefString& default_file_path, const std::vector& accept_filters, const std::vector& accept_extensions, const std::vector& accept_descriptions, CefRefPtr callback) override; //CefDragHandler virtual DECL bool OnDragEnter(CefRefPtr browser, CefRefPtr dragData, DragOperationsMask mask) override; virtual DECL void OnDraggableRegionsChanged(CefRefPtr browser, CefRefPtr frame, const std::vector& regions) override; //CefDownloadHandler virtual DECL bool CanDownload(CefRefPtr browser, const CefString & url, const CefString & request_method) override; virtual DECL bool OnBeforeDownload(CefRefPtr browser, CefRefPtr download_item, const CefString& suggested_name, CefRefPtr callback) override; virtual DECL void OnDownloadUpdated(CefRefPtr browser, CefRefPtr download_item, CefRefPtr callback) override; //CefFindHandler virtual DECL void OnFindResult(CefRefPtr browser, int identifier, int count, const CefRect& selectionRect, int activeMatchOrdinal, bool finalUpdate) override; //CefAudioHandler virtual DECL bool GetAudioParameters(CefRefPtr browser, CefAudioParameters & params) override; virtual DECL void OnAudioStreamStarted(CefRefPtr browser, const CefAudioParameters& params, int channels) override; virtual DECL void OnAudioStreamPacket(CefRefPtr browser, const float** data, int frames, int64_t pts) override; virtual DECL void OnAudioStreamStopped(CefRefPtr browser) override; virtual DECL void OnAudioStreamError(CefRefPtr browser, const CefString& message) override; //CefFrameHandler virtual DECL void OnFrameCreated(CefRefPtr browser, CefRefPtr frame) override; virtual DECL void OnFrameAttached(CefRefPtr browser, CefRefPtr frame, bool reattached) override; virtual DECL void OnFrameDetached(CefRefPtr browser, CefRefPtr frame) override; virtual DECL void OnMainFrameChanged(CefRefPtr browser, CefRefPtr old_frame, CefRefPtr new_frame) override; //CefPermissionHandler virtual DECL bool OnShowPermissionPrompt( CefRefPtr browser, uint64_t prompt_id, const CefString& requesting_origin, uint32_t requested_permissions, CefRefPtr callback) override; virtual DECL void OnDismissPermissionPrompt( CefRefPtr browser, uint64_t prompt_id, cef_permission_request_result_t result) override; virtual DECL bool OnRequestMediaAccessPermission( CefRefPtr browser, CefRefPtr frame, const CefString& requesting_origin, uint32_t requested_permissions, CefRefPtr callback) override; IMPLEMENT_REFCOUNTINGM(ClientAdapter); }; } } #endif // CEFSHARP_CORE_INTERNALS_CLIENTADAPTER_H_