// Copyright (c) 2012 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_LIBCEF_BROWSER_FRAME_HOST_IMPL_H_ #define CEF_LIBCEF_BROWSER_FRAME_HOST_IMPL_H_ #pragma once #include #include #include #include "include/cef_frame.h" #include "libcef/common/response_manager.h" #include "base/synchronization/lock.h" #include "ui/base/page_transition_types.h" namespace content { class RenderFrameHost; struct Referrer; } // namespace content namespace IPC { class Message; } class GURL; struct Cef_DraggableRegion_Params; struct Cef_Request_Params; struct Cef_Response_Params; class CefBrowserInfo; class CefBrowserHostBase; struct CefNavigateParams; // Implementation of CefFrame. CefFrameHostImpl objects should always be created // or retrieved via CefBrowerInfo. class CefFrameHostImpl : public CefFrame { public: // Create a temporary frame. CefFrameHostImpl(scoped_refptr browser_info, bool is_main_frame, int64_t parent_frame_id); // Create a frame backed by a RFH and owned by CefBrowserInfo. CefFrameHostImpl(scoped_refptr browser_info, content::RenderFrameHost* render_frame_host); // Update an existing main frame object. void SetRenderFrameHost(content::RenderFrameHost* host); ~CefFrameHostImpl() override; // CefFrame methods bool IsValid() override; void Undo() override; void Redo() override; void Cut() override; void Copy() override; void Paste() override; void Delete() override; void SelectAll() override; void ViewSource() override; void GetSource(CefRefPtr visitor) override; void GetText(CefRefPtr visitor) override; void LoadRequest(CefRefPtr request) override; void LoadURL(const CefString& url) override; void ExecuteJavaScript(const CefString& jsCode, const CefString& scriptUrl, int startLine) override; bool IsMain() override; bool IsFocused() override; CefString GetName() override; int64 GetIdentifier() override; CefRefPtr GetParent() override; CefString GetURL() override; CefRefPtr GetBrowser() override; CefRefPtr GetV8Context() override; void VisitDOM(CefRefPtr visitor) override; CefRefPtr CreateURLRequest( CefRefPtr request, CefRefPtr client) override; void SendProcessMessage(CefProcessId target_process, CefRefPtr message) override; void SetFocused(bool focused); void RefreshAttributes(); // Notification that a move or resize of the renderer's containing window has // started. Used on Windows and Linux with the Alloy runtime. void NotifyMoveOrResizeStarted(); // Navigate as specified by the |params| argument. void Navigate(const CefNavigateParams& params); // Load the specified URL. void LoadURLWithExtras(const std::string& url, const content::Referrer& referrer, ui::PageTransition transition, const std::string& extra_headers); // Send a command to the renderer for execution. void SendCommand(const std::string& command, CefRefPtr responseHandler); // Send code to the renderer for execution. void SendCode(bool is_javascript, const std::string& code, const std::string& script_url, int script_start_line, CefRefPtr responseHandler); // Send JavaScript to the renderer for execution. void SendJavaScript(const std::string& jsCode, const std::string& scriptUrl, int startLine); // Called from CefBrowserHostBase::DidStopLoading. void MaybeSendDidStopLoading(); // Called from CefBrowserHostBase::OnMessageReceived. bool OnMessageReceived(const IPC::Message& message); void ExecuteJavaScriptWithUserGestureForTests(const CefString& javascript); // Returns the RFH associated with this frame. Must be called on the UI // thread. content::RenderFrameHost* GetRenderFrameHost() const; // Owned frame objects will be detached explicitly when the associated // RenderFrame is deleted. Temporary frame objects will be detached // implicitly via CefBrowserInfo::browser() returning nullptr. void Detach(); static int64_t MakeFrameId(const content::RenderFrameHost* host); static int64_t MakeFrameId(int32_t render_process_id, int32_t render_routing_id); static const int64_t kMainFrameId; static const int64_t kFocusedFrameId; static const int64_t kUnspecifiedFrameId; static const int64_t kInvalidFrameId; // PageTransition type for explicit navigations. This must pass the check in // ContentBrowserClient::IsExplicitNavigation for debug URLs (HandleDebugURL) // to work as expected. static const ui::PageTransition kPageTransitionExplicit; private: int64 GetFrameId() const; CefRefPtr GetBrowserHostBase() const; // OnMessageReceived message handlers. void OnAttached(); void OnDidFinishLoad(const GURL& validated_url, int http_status_code); void OnUpdateDraggableRegions( const std::vector& regions); void OnRequest(const Cef_Request_Params& params); void OnResponse(const Cef_Response_Params& params); void OnResponseAck(int request_id); // Send a message to the RenderFrameHost associated with this frame. void Send(IPC::Message* message); const bool is_main_frame_; // The following members may be read/modified from any thread. All access must // be protected by |state_lock_|. mutable base::Lock state_lock_; int64 frame_id_; scoped_refptr browser_info_; bool is_focused_; CefString url_; CefString name_; int64 parent_frame_id_; // The following members are only accessed on the UI thread. content::RenderFrameHost* render_frame_host_ = nullptr; bool is_attached_ = false; // Qeueud messages to send when the renderer process attaches. std::queue> queued_messages_; // Manages response registrations. std::unique_ptr response_manager_; IMPLEMENT_REFCOUNTING(CefFrameHostImpl); DISALLOW_COPY_AND_ASSIGN(CefFrameHostImpl); }; #endif // CEF_LIBCEF_BROWSER_FRAME_HOST_IMPL_H_