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:
@@ -56,19 +56,13 @@ class MRRenderDelegate : public ClientAppRenderer::Delegate {
|
||||
|
||||
const CefString& msg = arguments[0]->GetStringValue();
|
||||
CefRefPtr<CefV8Context> context = CefV8Context::GetCurrentContext();
|
||||
CefRefPtr<CefBrowser> browser = context->GetBrowser();
|
||||
CefRefPtr<CefFrame> frame = context->GetFrame();
|
||||
const int64 frame_id = frame->GetIdentifier();
|
||||
const bool is_main_frame = frame->IsMain();
|
||||
|
||||
CefRefPtr<CefProcessMessage> message =
|
||||
CefProcessMessage::Create(kDoneMessageName);
|
||||
CefRefPtr<CefListValue> args = message->GetArgumentList();
|
||||
args->SetInt(0, CefInt64GetLow(frame_id));
|
||||
args->SetInt(1, CefInt64GetHigh(frame_id));
|
||||
args->SetBool(2, is_main_frame);
|
||||
args->SetString(3, msg);
|
||||
EXPECT_TRUE(browser->SendProcessMessage(PID_BROWSER, message));
|
||||
args->SetString(0, msg);
|
||||
frame->SendProcessMessage(PID_BROWSER, message);
|
||||
return true;
|
||||
} else {
|
||||
EXPECT_EQ(1U, arguments.size());
|
||||
@@ -166,14 +160,15 @@ class MRRenderDelegate : public ClientAppRenderer::Delegate {
|
||||
|
||||
bool OnProcessMessageReceived(CefRefPtr<ClientAppRenderer> app,
|
||||
CefRefPtr<CefBrowser> browser,
|
||||
CefRefPtr<CefFrame> frame,
|
||||
CefProcessId source_process,
|
||||
CefRefPtr<CefProcessMessage> message) override {
|
||||
const std::string& url = browser->GetMainFrame()->GetURL();
|
||||
if (url.find(kTestDomainRoot) != 0)
|
||||
return false;
|
||||
|
||||
return message_router_->OnProcessMessageReceived(browser, source_process,
|
||||
message);
|
||||
return message_router_->OnProcessMessageReceived(browser, frame,
|
||||
source_process, message);
|
||||
}
|
||||
|
||||
private:
|
||||
@@ -237,32 +232,20 @@ class MRTestHandler : public TestHandler {
|
||||
|
||||
// Returns true if the router handled the navigation.
|
||||
bool OnProcessMessageReceived(CefRefPtr<CefBrowser> browser,
|
||||
CefRefPtr<CefFrame> frame,
|
||||
CefProcessId source_process,
|
||||
CefRefPtr<CefProcessMessage> message) override {
|
||||
const std::string& message_name = message->GetName();
|
||||
if (message_name == kDoneMessageName) {
|
||||
CefRefPtr<CefListValue> args = message->GetArgumentList();
|
||||
EXPECT_EQ(4U, args->GetSize());
|
||||
EXPECT_EQ(VTYPE_INT, args->GetType(0));
|
||||
EXPECT_EQ(VTYPE_INT, args->GetType(1));
|
||||
EXPECT_EQ(VTYPE_BOOL, args->GetType(2));
|
||||
EXPECT_EQ(VTYPE_STRING, args->GetType(3));
|
||||
|
||||
const int64 frame_id = CefInt64Set(args->GetInt(0), args->GetInt(1));
|
||||
const bool is_main_frame = args->GetBool(2);
|
||||
CefRefPtr<CefFrame> frame;
|
||||
if (is_main_frame)
|
||||
frame = browser->GetMainFrame();
|
||||
else
|
||||
frame = browser->GetFrame(frame_id);
|
||||
EXPECT_TRUE(frame.get());
|
||||
|
||||
OnNotify(browser, frame, args->GetString(3));
|
||||
EXPECT_EQ(1U, args->GetSize());
|
||||
EXPECT_EQ(VTYPE_STRING, args->GetType(0));
|
||||
OnNotify(browser, frame, args->GetString(0));
|
||||
return true;
|
||||
}
|
||||
|
||||
return message_router_->OnProcessMessageReceived(browser, source_process,
|
||||
message);
|
||||
return message_router_->OnProcessMessageReceived(browser, frame,
|
||||
source_process, message);
|
||||
}
|
||||
|
||||
CefRefPtr<CefMessageRouterBrowserSide> GetRouter() const {
|
||||
|
Reference in New Issue
Block a user