194 lines
6.5 KiB
C++
194 lines
6.5 KiB
C++
// 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 <memory>
|
|
#include <queue>
|
|
#include <string>
|
|
|
|
#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<CefBrowserInfo> 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<CefBrowserInfo> 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<CefStringVisitor> visitor) override;
|
|
void GetText(CefRefPtr<CefStringVisitor> visitor) override;
|
|
void LoadRequest(CefRefPtr<CefRequest> 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<CefFrame> GetParent() override;
|
|
CefString GetURL() override;
|
|
CefRefPtr<CefBrowser> GetBrowser() override;
|
|
CefRefPtr<CefV8Context> GetV8Context() override;
|
|
void VisitDOM(CefRefPtr<CefDOMVisitor> visitor) override;
|
|
CefRefPtr<CefURLRequest> CreateURLRequest(
|
|
CefRefPtr<CefRequest> request,
|
|
CefRefPtr<CefURLRequestClient> client) override;
|
|
void SendProcessMessage(CefProcessId target_process,
|
|
CefRefPtr<CefProcessMessage> 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<CefResponseManager::Handler> 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<CefResponseManager::Handler> 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<CefBrowserHostBase> GetBrowserHostBase() const;
|
|
|
|
// OnMessageReceived message handlers.
|
|
void OnAttached();
|
|
void OnDidFinishLoad(const GURL& validated_url, int http_status_code);
|
|
void OnUpdateDraggableRegions(
|
|
const std::vector<Cef_DraggableRegion_Params>& 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<CefBrowserInfo> 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<std::unique_ptr<IPC::Message>> queued_messages_;
|
|
|
|
// Manages response registrations.
|
|
std::unique_ptr<CefResponseManager> response_manager_;
|
|
|
|
IMPLEMENT_REFCOUNTING(CefFrameHostImpl);
|
|
DISALLOW_COPY_AND_ASSIGN(CefFrameHostImpl);
|
|
};
|
|
|
|
#endif // CEF_LIBCEF_BROWSER_FRAME_HOST_IMPL_H_
|