// Copyright (c) 2011 The Chromium Embedded Framework 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 CEF_TESTS_CEFCLIENT_CLIENT_HANDLER_H_ #define CEF_TESTS_CEFCLIENT_CLIENT_HANDLER_H_ #pragma once #include #include #include #include #include "include/base/cef_lock.h" #include "include/cef_client.h" #include "include/wrapper/cef_helpers.h" #include "include/wrapper/cef_message_router.h" #if defined(OS_LINUX) // The Linux client uses GTK instead of the underlying platform type (X11). #include #define ClientWindowHandle GtkWidget* #else #define ClientWindowHandle CefWindowHandle #endif // Define this value to redirect all popup URLs to the main application browser // window. // #define TEST_REDIRECT_POPUP_URLS namespace client { // ClientHandler implementation. class ClientHandler : public CefClient, public CefContextMenuHandler, public CefDisplayHandler, public CefDownloadHandler, public CefDragHandler, public CefGeolocationHandler, public CefKeyboardHandler, public CefLifeSpanHandler, public CefLoadHandler, public CefRenderHandler, public CefRequestHandler { public: // Interface implemented to handle off-screen rendering. class RenderHandler : public CefRenderHandler { public: virtual void OnBeforeClose(CefRefPtr browser) =0; }; typedef std::set MessageHandlerSet; ClientHandler(); ~ClientHandler(); // CefClient methods CefRefPtr GetContextMenuHandler() OVERRIDE { return this; } CefRefPtr GetDialogHandler() OVERRIDE { return dialog_handler_; } CefRefPtr GetDisplayHandler() OVERRIDE { return this; } CefRefPtr GetDownloadHandler() OVERRIDE { return this; } CefRefPtr GetDragHandler() OVERRIDE { return this; } CefRefPtr GetGeolocationHandler() OVERRIDE { return this; } CefRefPtr GetJSDialogHandler() OVERRIDE { return jsdialog_handler_; } CefRefPtr GetKeyboardHandler() OVERRIDE { return this; } CefRefPtr GetLifeSpanHandler() OVERRIDE { return this; } CefRefPtr GetLoadHandler() OVERRIDE { return this; } CefRefPtr GetRenderHandler() OVERRIDE { return this; } CefRefPtr GetRequestHandler() OVERRIDE { return this; } bool OnProcessMessageReceived(CefRefPtr browser, CefProcessId source_process, CefRefPtr message) OVERRIDE; // CefContextMenuHandler methods void OnBeforeContextMenu(CefRefPtr browser, CefRefPtr frame, CefRefPtr params, CefRefPtr model) OVERRIDE; bool OnContextMenuCommand(CefRefPtr browser, CefRefPtr frame, CefRefPtr params, int command_id, EventFlags event_flags) OVERRIDE; // CefDisplayHandler methods void OnAddressChange(CefRefPtr browser, CefRefPtr frame, const CefString& url) OVERRIDE; void OnTitleChange(CefRefPtr browser, const CefString& title) OVERRIDE; bool OnConsoleMessage(CefRefPtr browser, const CefString& message, const CefString& source, int line) OVERRIDE; // CefDownloadHandler methods void OnBeforeDownload( CefRefPtr browser, CefRefPtr download_item, const CefString& suggested_name, CefRefPtr callback) OVERRIDE; void OnDownloadUpdated( CefRefPtr browser, CefRefPtr download_item, CefRefPtr callback) OVERRIDE; // CefDragHandler methods bool OnDragEnter(CefRefPtr browser, CefRefPtr dragData, CefDragHandler::DragOperationsMask mask) OVERRIDE; // CefGeolocationHandler methods bool OnRequestGeolocationPermission( CefRefPtr browser, const CefString& requesting_url, int request_id, CefRefPtr callback) OVERRIDE; // CefKeyboardHandler methods bool OnPreKeyEvent(CefRefPtr browser, const CefKeyEvent& event, CefEventHandle os_event, bool* is_keyboard_shortcut) OVERRIDE; // CefLifeSpanHandler methods bool OnBeforePopup(CefRefPtr browser, CefRefPtr frame, const CefString& target_url, const CefString& target_frame_name, const CefPopupFeatures& popupFeatures, CefWindowInfo& windowInfo, CefRefPtr& client, CefBrowserSettings& settings, bool* no_javascript_access) OVERRIDE; void OnAfterCreated(CefRefPtr browser) OVERRIDE; bool DoClose(CefRefPtr browser) OVERRIDE; void OnBeforeClose(CefRefPtr browser) OVERRIDE; // CefLoadHandler methods void OnLoadingStateChange(CefRefPtr browser, bool isLoading, bool canGoBack, bool canGoForward) OVERRIDE; void OnLoadError(CefRefPtr browser, CefRefPtr frame, ErrorCode errorCode, const CefString& errorText, const CefString& failedUrl) OVERRIDE; // CefRequestHandler methods bool OnBeforeBrowse(CefRefPtr browser, CefRefPtr frame, CefRefPtr request, bool is_redirect) OVERRIDE; CefRefPtr GetResourceHandler( CefRefPtr browser, CefRefPtr frame, CefRefPtr request) OVERRIDE; bool OnQuotaRequest(CefRefPtr browser, const CefString& origin_url, int64 new_size, CefRefPtr callback) OVERRIDE; void OnProtocolExecution(CefRefPtr browser, const CefString& url, bool& allow_os_execution) OVERRIDE; void OnRenderProcessTerminated(CefRefPtr browser, TerminationStatus status) OVERRIDE; // CefRenderHandler methods bool GetRootScreenRect(CefRefPtr browser, CefRect& rect) OVERRIDE; bool GetViewRect(CefRefPtr browser, CefRect& rect) OVERRIDE; bool GetScreenPoint(CefRefPtr browser, int viewX, int viewY, int& screenX, int& screenY) OVERRIDE; bool GetScreenInfo(CefRefPtr browser, CefScreenInfo& screen_info) OVERRIDE; void OnPopupShow(CefRefPtr browser, bool show) OVERRIDE; void OnPopupSize(CefRefPtr browser, const CefRect& rect) OVERRIDE; void OnPaint(CefRefPtr browser, PaintElementType type, const RectList& dirtyRects, const void* buffer, int width, int height) OVERRIDE; void OnCursorChange(CefRefPtr browser, CefCursorHandle cursor, CursorType type, const CefCursorInfo& custom_cursor_info) OVERRIDE; bool StartDragging(CefRefPtr browser, CefRefPtr drag_data, CefRenderHandler::DragOperationsMask allowed_ops, int x, int y) OVERRIDE; void UpdateDragCursor(CefRefPtr browser, CefRenderHandler::DragOperation operation) OVERRIDE; void SetMainWindowHandle(ClientWindowHandle handle); ClientWindowHandle GetMainWindowHandle() const; void SetEditWindowHandle(ClientWindowHandle handle); void SetButtonWindowHandles(ClientWindowHandle backHandle, ClientWindowHandle forwardHandle, ClientWindowHandle reloadHandle, ClientWindowHandle stopHandle); void SetOSRHandler(CefRefPtr handler); CefRefPtr GetOSRHandler() const; CefRefPtr GetBrowser() const; int GetBrowserId() const; // Request that all existing browser windows close. void CloseAllBrowsers(bool force_close); // Returns true if the main browser window is currently closing. Used in // combination with DoClose() and the OS close notification to properly handle // 'onbeforeunload' JavaScript events during window close. bool IsClosing() const; void ShowDevTools(CefRefPtr browser, const CefPoint& inspect_element_at); void CloseDevTools(CefRefPtr browser); // Returns the startup URL. std::string GetStartupURL() const; bool Save(const std::string& path, const std::string& data); private: void SetLoading(bool isLoading); void SetNavState(bool canGoBack, bool canGoForward); // Test context menu creation. void BuildTestMenu(CefRefPtr model); bool ExecuteTestMenu(int command_id); struct TestMenuState { TestMenuState() : check_item(true), radio_item(0) {} bool check_item; int radio_item; } test_menu_state_; // START THREAD SAFE MEMBERS // The following members are thread-safe because they're initialized during // object construction and not changed thereafter. // The startup URL. std::string startup_url_; // True if mouse cursor change is disabled. bool mouse_cursor_change_disabled_; CefRefPtr dialog_handler_; CefRefPtr jsdialog_handler_; // END THREAD SAFE MEMBERS // Lock used to protect members accessed on multiple threads. Make it mutable // so that it can be used from const methods. mutable base::Lock lock_; // START LOCK PROTECTED MEMBERS // The following members are accessed on multiple threads and must be // protected by |lock_|. // The child browser window. CefRefPtr browser_; // The child browser id. int browser_id_; // True if the main browser window is currently closing. bool is_closing_; // END LOCK PROTECTED MEMBERS // START UI THREAD ACCESS ONLY MEMBERS // The following members will only be accessed on the CEF UI thread. // List of any popup browser windows. typedef std::list > BrowserList; BrowserList popup_browsers_; // The main frame window handle. ClientWindowHandle main_handle_; // The edit window handle. ClientWindowHandle edit_handle_; // The button window handles. ClientWindowHandle back_handle_; ClientWindowHandle forward_handle_; ClientWindowHandle stop_handle_; ClientWindowHandle reload_handle_; // The handler for off-screen rendering, if any. CefRefPtr osr_handler_; // Used for console logging purposes. const std::string console_log_file_; bool first_console_message_; // True if an editable field currently has focus. bool focus_on_editable_field_; // Handles the browser side of query routing. The renderer side is handled // in client_renderer.cc. CefRefPtr message_router_; // Set of Handlers registered with the message router. MessageHandlerSet message_handler_set_; // Number of currently existing browser windows. The application will exit // when the number of windows reaches 0. static int browser_count_; // END UI THREAD ACCESS ONLY MEMBERS // Include the default reference counting implementation. IMPLEMENT_REFCOUNTING(ClientHandler); }; } // namespace client #endif // CEF_TESTS_CEFCLIENT_CLIENT_HANDLER_H_