mirror of
https://bitbucket.org/chromiumembedded/cef
synced 2025-06-05 21:39:12 +02:00
Move message routing from CefBrowser to CefFrame (see issue #2498).
This change moves the SendProcessMessage method from CefBrowser to CefFrame and adds CefBrowser parameters to OnProcessMessageReceived and OnDraggableRegionsChanged. The internal implementation has changed as follows: - Frame IDs are now a 64-bit combination of the 32-bit render_process_id and render_routing_id values that uniquely identify a RenderFrameHost (RFH). - CefFrameHostImpl objects are now managed by CefBrowserInfo with life span tied to RFH expectations. Specifically, a CefFrameHostImpl object representing a sub-frame will be created when a RenderFrame is created in the renderer process and detached when the associated RenderFrame is deleted or the renderer process in which it runs has died. - The CefFrameHostImpl object representing the main frame will always be valid but the underlying RFH (and associated frame ID) may change over time as a result of cross-origin navigations. Despite these changes calling LoadURL on the main frame object in the browser process will always navigate as expected. - Speculative RFHs, which may be created as a result of a cross-origin navigation and discarded if that navigation is not committed, are now handled correctly (e.g. ignored in most cases until they're committed). - It is less likely, but still possible, to receive a CefFrame object with an invalid frame ID (ID < 0). This can happen in cases where a RFH has not yet been created for a sub-frame. For example, when OnBeforeBrowse is called before initiating navigation in a previously nonexisting sub-frame. To test: All tests pass with NetworkService enabled and disabled.
This commit is contained in:
@ -10,6 +10,7 @@
|
||||
#include <stdint.h>
|
||||
|
||||
#include <map>
|
||||
#include <memory>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
@ -20,17 +21,6 @@
|
||||
|
||||
#include "content/public/renderer/render_view_observer.h"
|
||||
|
||||
class GURL;
|
||||
struct CefMsg_LoadRequest_Params;
|
||||
struct Cef_Request_Params;
|
||||
struct Cef_Response_Params;
|
||||
class CefContentRendererClient;
|
||||
class CefResponseManager;
|
||||
|
||||
namespace base {
|
||||
class ListValue;
|
||||
}
|
||||
|
||||
namespace blink {
|
||||
class WebFrame;
|
||||
class WebNode;
|
||||
@ -40,11 +30,7 @@ class WebNode;
|
||||
// between RenderView on the renderer side and RenderViewHost on the browser
|
||||
// side.
|
||||
//
|
||||
// RenderViewObserver: Interface for observing RenderView notifications and IPC
|
||||
// messages. IPC messages received by the RenderView will be forwarded to this
|
||||
// RenderViewObserver implementation. IPC messages sent using
|
||||
// RenderViewObserver::Send() will be forwarded to the RenderView. Use
|
||||
// RenderViewObserver::routing_id() when sending IPC messages.
|
||||
// RenderViewObserver: Interface for observing RenderView notifications.
|
||||
class CefBrowserImpl : public CefBrowser, public content::RenderViewObserver {
|
||||
public:
|
||||
// Returns the browser associated with the specified RenderView.
|
||||
@ -74,8 +60,6 @@ class CefBrowserImpl : public CefBrowser, public content::RenderViewObserver {
|
||||
size_t GetFrameCount() override;
|
||||
void GetFrameIdentifiers(std::vector<int64>& identifiers) override;
|
||||
void GetFrameNames(std::vector<CefString>& names) override;
|
||||
bool SendProcessMessage(CefProcessId target_process,
|
||||
CefRefPtr<CefProcessMessage> message) override;
|
||||
|
||||
CefBrowserImpl(content::RenderView* render_view,
|
||||
int browser_id,
|
||||
@ -83,14 +67,6 @@ class CefBrowserImpl : public CefBrowser, public content::RenderViewObserver {
|
||||
bool is_windowless);
|
||||
~CefBrowserImpl() override;
|
||||
|
||||
void LoadRequest(const CefMsg_LoadRequest_Params& params);
|
||||
|
||||
// Avoids unnecessary string type conversions.
|
||||
bool SendProcessMessage(CefProcessId target_process,
|
||||
const std::string& name,
|
||||
base::ListValue* arguments,
|
||||
bool user_initiated);
|
||||
|
||||
// Returns the matching CefFrameImpl reference or creates a new one.
|
||||
CefRefPtr<CefFrameImpl> GetWebFrameImpl(blink::WebLocalFrame* frame);
|
||||
CefRefPtr<CefFrameImpl> GetWebFrameImpl(int64_t frame_id);
|
||||
@ -111,24 +87,13 @@ class CefBrowserImpl : public CefBrowser, public content::RenderViewObserver {
|
||||
const blink::WebURLError& error) override;
|
||||
void DidCommitProvisionalLoad(blink::WebLocalFrame* frame,
|
||||
bool is_new_navigation) override;
|
||||
bool OnMessageReceived(const IPC::Message& message) override;
|
||||
|
||||
// Forwarded from CefRenderFrameObserver.
|
||||
void DidFinishLoad(blink::WebLocalFrame* frame);
|
||||
void FrameDetached(blink::WebLocalFrame* frame);
|
||||
void FocusedNodeChanged(const blink::WebNode& node);
|
||||
void DraggableRegionsChanged(blink::WebLocalFrame* frame);
|
||||
|
||||
private:
|
||||
// RenderViewObserver::OnMessageReceived message handlers.
|
||||
void OnRequest(const Cef_Request_Params& params);
|
||||
void OnResponse(const Cef_Response_Params& params);
|
||||
void OnResponseAck(int request_id);
|
||||
void OnDidStopLoading();
|
||||
void FrameDetached(int64_t frame_id);
|
||||
|
||||
void OnLoadingStateChange(bool isLoading);
|
||||
|
||||
private:
|
||||
void OnLoadStart(blink::WebLocalFrame* frame);
|
||||
void OnLoadEnd(blink::WebLocalFrame* frame);
|
||||
void OnLoadError(blink::WebLocalFrame* frame,
|
||||
const blink::WebURLError& error);
|
||||
|
||||
@ -148,8 +113,22 @@ class CefBrowserImpl : public CefBrowser, public content::RenderViewObserver {
|
||||
typedef std::map<int64, CefRefPtr<CefTrackManager>> FrameObjectMap;
|
||||
FrameObjectMap frame_objects_;
|
||||
|
||||
// Manages response registrations.
|
||||
std::unique_ptr<CefResponseManager> response_manager_;
|
||||
struct LoadingState {
|
||||
LoadingState(bool is_loading, bool can_go_back, bool can_go_forward)
|
||||
: is_loading_(is_loading),
|
||||
can_go_back_(can_go_back),
|
||||
can_go_forward_(can_go_forward) {}
|
||||
|
||||
bool IsMatch(bool is_loading, bool can_go_back, bool can_go_forward) const {
|
||||
return is_loading_ == is_loading && can_go_back_ == can_go_back &&
|
||||
can_go_forward_ == can_go_forward;
|
||||
}
|
||||
|
||||
bool is_loading_;
|
||||
bool can_go_back_;
|
||||
bool can_go_forward_;
|
||||
};
|
||||
std::unique_ptr<LoadingState> last_loading_state_;
|
||||
|
||||
IMPLEMENT_REFCOUNTING(CefBrowserImpl);
|
||||
DISALLOW_COPY_AND_ASSIGN(CefBrowserImpl);
|
||||
|
Reference in New Issue
Block a user