Commit 5b699625 authored by Sreeja Kamishetty's avatar Sreeja Kamishetty Committed by Chromium LUCI CQ

Dispatch WCO::RenderFrameCreated before WCO::RenderFrameHostChanged for iframes

Currently, WebContentsObserver::RenderFrameHostChanged callback is
being dispatched before WebContentsObserver::RenderFrameCreated callback
for child frames.

This is problematic as embedders use
WebContentsObserver::RenderFrameCreated callback to initialize
per-RenderFrameHost state. This CL fixes this ordering.

BUG=1097143

Change-Id: Iced632ee3369b3dbf3822dd57620b687ed47cb5a
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2614467
Commit-Queue: Sreeja Kamishetty <sreejakshetty@chromium.org>
Reviewed-by: default avatarAlex Moshchuk <alexmos@chromium.org>
Reviewed-by: default avatarAlexander Timin <altimin@chromium.org>
Reviewed-by: default avatarArthur Sonzogni <arthursonzogni@chromium.org>
Cr-Commit-Position: refs/heads/master@{#846079}
parent 73bb0361
...@@ -254,11 +254,19 @@ FrameTreeNode* FrameTree::AddFrame( ...@@ -254,11 +254,19 @@ FrameTreeNode* FrameTree::AddFrame(
// Now that the new node is part of the FrameTree and has a RenderFrameHost, // Now that the new node is part of the FrameTree and has a RenderFrameHost,
// we can announce the creation of the initial RenderFrame which already // we can announce the creation of the initial RenderFrame which already
// exists in the renderer process. // exists in the renderer process.
// For consistency with navigating to a new RenderFrameHost case, we dispatch
// RenderFrameCreated before RenderFrameHostChanged.
if (added_node->frame_owner_element_type() != if (added_node->frame_owner_element_type() !=
blink::mojom::FrameOwnerElementType::kPortal) { blink::mojom::FrameOwnerElementType::kPortal) {
// Portals do not have a live RenderFrame in the renderer process. // Portals do not have a live RenderFrame in the renderer process.
added_node->current_frame_host()->RenderFrameCreated(); added_node->current_frame_host()->RenderFrameCreated();
} }
// Notify the delegate of the creation of the current RenderFrameHost.
// This is only for subframes, as the main frame case is taken care of by
// WebContentsImpl::Init.
manager_delegate_->NotifySwappedFromRenderManager(
nullptr, added_node->current_frame_host(), false /* is_main_frame */);
return added_node; return added_node;
} }
......
...@@ -506,8 +506,8 @@ TEST_F(FrameTreeTest, ObserverWalksTreeDuringFrameCreation) { ...@@ -506,8 +506,8 @@ TEST_F(FrameTreeTest, ObserverWalksTreeDuringFrameCreation) {
false, base::UnguessableToken::Create(), base::UnguessableToken::Create(), false, base::UnguessableToken::Create(), base::UnguessableToken::Create(),
blink::FramePolicy(), blink::mojom::FrameOwnerProperties(), kOwnerType); blink::FramePolicy(), blink::mojom::FrameOwnerProperties(), kOwnerType);
EXPECT_EQ( EXPECT_EQ(
"RenderFrameHostChanged(new)(14) -> 1: []\n" "RenderFrameCreated(14) -> 1: [14: []]\n"
"RenderFrameCreated(14) -> 1: [14: []]", "RenderFrameHostChanged(new)(14) -> 1: [14: []]",
activity.GetLog()); activity.GetLog());
main_test_rfh()->OnCreateChildFrame( main_test_rfh()->OnCreateChildFrame(
18, CreateStubFrameRemote(), CreateStubBrowserInterfaceBrokerReceiver(), 18, CreateStubFrameRemote(), CreateStubBrowserInterfaceBrokerReceiver(),
...@@ -516,8 +516,8 @@ TEST_F(FrameTreeTest, ObserverWalksTreeDuringFrameCreation) { ...@@ -516,8 +516,8 @@ TEST_F(FrameTreeTest, ObserverWalksTreeDuringFrameCreation) {
false, base::UnguessableToken::Create(), base::UnguessableToken::Create(), false, base::UnguessableToken::Create(), base::UnguessableToken::Create(),
blink::FramePolicy(), blink::mojom::FrameOwnerProperties(), kOwnerType); blink::FramePolicy(), blink::mojom::FrameOwnerProperties(), kOwnerType);
EXPECT_EQ( EXPECT_EQ(
"RenderFrameHostChanged(new)(18) -> 1: [14: []]\n" "RenderFrameCreated(18) -> 1: [14: [], 18: []]\n"
"RenderFrameCreated(18) -> 1: [14: [], 18: []]", "RenderFrameHostChanged(new)(18) -> 1: [14: [], 18: []]",
activity.GetLog()); activity.GetLog());
frame_tree->RemoveFrame(root->child_at(0)); frame_tree->RemoveFrame(root->child_at(0));
EXPECT_EQ("RenderFrameDeleted(14) -> 1: [18: []]", activity.GetLog()); EXPECT_EQ("RenderFrameDeleted(14) -> 1: [18: []]", activity.GetLog());
...@@ -540,8 +540,8 @@ TEST_F(FrameTreeTest, ObserverWalksTreeAfterCrash) { ...@@ -540,8 +540,8 @@ TEST_F(FrameTreeTest, ObserverWalksTreeAfterCrash) {
false, base::UnguessableToken::Create(), base::UnguessableToken::Create(), false, base::UnguessableToken::Create(), base::UnguessableToken::Create(),
blink::FramePolicy(), blink::mojom::FrameOwnerProperties(), kOwnerType); blink::FramePolicy(), blink::mojom::FrameOwnerProperties(), kOwnerType);
EXPECT_EQ( EXPECT_EQ(
"RenderFrameHostChanged(new)(22) -> 1: []\n" "RenderFrameCreated(22) -> 1: [22: []]\n"
"RenderFrameCreated(22) -> 1: [22: []]", "RenderFrameHostChanged(new)(22) -> 1: [22: []]",
activity.GetLog()); activity.GetLog());
main_test_rfh()->OnCreateChildFrame( main_test_rfh()->OnCreateChildFrame(
23, CreateStubFrameRemote(), CreateStubBrowserInterfaceBrokerReceiver(), 23, CreateStubFrameRemote(), CreateStubBrowserInterfaceBrokerReceiver(),
...@@ -550,8 +550,8 @@ TEST_F(FrameTreeTest, ObserverWalksTreeAfterCrash) { ...@@ -550,8 +550,8 @@ TEST_F(FrameTreeTest, ObserverWalksTreeAfterCrash) {
false, base::UnguessableToken::Create(), base::UnguessableToken::Create(), false, base::UnguessableToken::Create(), base::UnguessableToken::Create(),
blink::FramePolicy(), blink::mojom::FrameOwnerProperties(), kOwnerType); blink::FramePolicy(), blink::mojom::FrameOwnerProperties(), kOwnerType);
EXPECT_EQ( EXPECT_EQ(
"RenderFrameHostChanged(new)(23) -> 1: [22: []]\n" "RenderFrameCreated(23) -> 1: [22: [], 23: []]\n"
"RenderFrameCreated(23) -> 1: [22: [], 23: []]", "RenderFrameHostChanged(new)(23) -> 1: [22: [], 23: []]",
activity.GetLog()); activity.GetLog());
// Crash the renderer // Crash the renderer
......
...@@ -233,11 +233,6 @@ void RenderFrameHostManager::InitChild( ...@@ -233,11 +233,6 @@ void RenderFrameHostManager::InitChild(
CreateFrameCase::kInitChild, site_instance, frame_routing_id, CreateFrameCase::kInitChild, site_instance, frame_routing_id,
std::move(frame_remote), frame_token, std::move(frame_remote), frame_token,
/*renderer_initiated_creation=*/false)); /*renderer_initiated_creation=*/false));
// Notify the delegate of the creation of the current RenderFrameHost.
// Do this only for subframes, as the main frame case is taken care of by
// WebContentsImpl::Init.
delegate_->NotifySwappedFromRenderManager(nullptr, render_frame_host_.get(),
false);
} }
RenderViewHostImpl* RenderFrameHostManager::current_host() const { RenderViewHostImpl* RenderFrameHostManager::current_host() const {
......
...@@ -431,7 +431,7 @@ class CONTENT_EXPORT RenderFrameHost : public IPC::Listener, ...@@ -431,7 +431,7 @@ class CONTENT_EXPORT RenderFrameHost : public IPC::Listener,
// of a frame are defined in Blink. // of a frame are defined in Blink.
virtual PageVisibilityState GetVisibilityState() = 0; virtual PageVisibilityState GetVisibilityState() = 0;
// Returns true if WebContentsObserver::RenderFrameCreate notification has // Returns true if WebContentsObserver::RenderFrameCreated notification has
// been dispatched for this frame, and so a RenderFrameDeleted notification // been dispatched for this frame, and so a RenderFrameDeleted notification
// will later be dispatched for this frame. // will later be dispatched for this frame.
virtual bool IsRenderFrameCreated() = 0; virtual bool IsRenderFrameCreated() = 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment