[content] Make FrameTreeNode::parent return RenderFrameHostImpl*.

As child FrameTreeNodes are now owned by RenderFrameHost, make
parent() return RenderFrameHostImpl* because the parent RenderFrameHost
cannot change for the lifetime of the FrameTreeNode.

This makes our handling of non-current (pending deletion, bfcache)
frames more robust by making harder to refer to a frame which is not
your parent.

[email protected],[email protected],​[email protected]
CC=,[email protected]
BUG=1073269

Change-Id: Ic2661b69ddd09e1cc5d9095caf7f158fa31f4189
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2160970
Commit-Queue: Alexander Timin <[email protected]>
Reviewed-by: Alex Moshchuk <[email protected]>
Reviewed-by: Charlie Reis <[email protected]>
Reviewed-by: Arthur Sonzogni <[email protected]>
Cr-Commit-Position: refs/heads/master@{#763470}
diff --git a/content/browser/frame_host/frame_tree_unittest.cc b/content/browser/frame_host/frame_tree_unittest.cc
index 8b7b4ba..b0d5a90a 100644
--- a/content/browser/frame_host/frame_tree_unittest.cc
+++ b/content/browser/frame_host/frame_tree_unittest.cc
@@ -170,42 +170,48 @@
 
   constexpr auto kOwnerType = blink::FrameOwnerElementType::kIframe;
   // Simulate attaching a series of frames to build the frame tree.
-  frame_tree->AddFrame(
-      root, process_id, 14, CreateStubInterfaceProviderReceiver(),
-      CreateStubBrowserInterfaceBrokerReceiver(),
-      blink::WebTreeScopeType::kDocument, std::string(), "uniqueName0", false,
-      base::UnguessableToken::Create(), blink::FramePolicy(),
-      blink::mojom::FrameOwnerProperties(), false, kOwnerType);
-  frame_tree->AddFrame(
-      root, process_id, 15, CreateStubInterfaceProviderReceiver(),
-      CreateStubBrowserInterfaceBrokerReceiver(),
-      blink::WebTreeScopeType::kDocument, std::string(), "uniqueName1", false,
-      base::UnguessableToken::Create(), blink::FramePolicy(),
-      blink::mojom::FrameOwnerProperties(), false, kOwnerType);
-  frame_tree->AddFrame(
-      root, process_id, 16, CreateStubInterfaceProviderReceiver(),
-      CreateStubBrowserInterfaceBrokerReceiver(),
-      blink::WebTreeScopeType::kDocument, std::string(), "uniqueName2", false,
-      base::UnguessableToken::Create(), blink::FramePolicy(),
-      blink::mojom::FrameOwnerProperties(), false, kOwnerType);
-  frame_tree->AddFrame(
-      root->child_at(0), process_id, 244, CreateStubInterfaceProviderReceiver(),
-      CreateStubBrowserInterfaceBrokerReceiver(),
-      blink::WebTreeScopeType::kDocument, std::string(), "uniqueName3", false,
-      base::UnguessableToken::Create(), blink::FramePolicy(),
-      blink::mojom::FrameOwnerProperties(), false, kOwnerType);
-  frame_tree->AddFrame(
-      root->child_at(1), process_id, 255, CreateStubInterfaceProviderReceiver(),
-      CreateStubBrowserInterfaceBrokerReceiver(),
-      blink::WebTreeScopeType::kDocument, no_children_node, "uniqueName4",
-      false, base::UnguessableToken::Create(), blink::FramePolicy(),
-      blink::mojom::FrameOwnerProperties(), false, kOwnerType);
-  frame_tree->AddFrame(
-      root->child_at(0), process_id, 245, CreateStubInterfaceProviderReceiver(),
-      CreateStubBrowserInterfaceBrokerReceiver(),
-      blink::WebTreeScopeType::kDocument, std::string(), "uniqueName5", false,
-      base::UnguessableToken::Create(), blink::FramePolicy(),
-      blink::mojom::FrameOwnerProperties(), false, kOwnerType);
+  frame_tree->AddFrame(root->current_frame_host(), process_id, 14,
+                       CreateStubInterfaceProviderReceiver(),
+                       CreateStubBrowserInterfaceBrokerReceiver(),
+                       blink::WebTreeScopeType::kDocument, std::string(),
+                       "uniqueName0", false, base::UnguessableToken::Create(),
+                       blink::FramePolicy(),
+                       blink::mojom::FrameOwnerProperties(), false, kOwnerType);
+  frame_tree->AddFrame(root->current_frame_host(), process_id, 15,
+                       CreateStubInterfaceProviderReceiver(),
+                       CreateStubBrowserInterfaceBrokerReceiver(),
+                       blink::WebTreeScopeType::kDocument, std::string(),
+                       "uniqueName1", false, base::UnguessableToken::Create(),
+                       blink::FramePolicy(),
+                       blink::mojom::FrameOwnerProperties(), false, kOwnerType);
+  frame_tree->AddFrame(root->current_frame_host(), process_id, 16,
+                       CreateStubInterfaceProviderReceiver(),
+                       CreateStubBrowserInterfaceBrokerReceiver(),
+                       blink::WebTreeScopeType::kDocument, std::string(),
+                       "uniqueName2", false, base::UnguessableToken::Create(),
+                       blink::FramePolicy(),
+                       blink::mojom::FrameOwnerProperties(), false, kOwnerType);
+  frame_tree->AddFrame(root->child_at(0)->current_frame_host(), process_id, 244,
+                       CreateStubInterfaceProviderReceiver(),
+                       CreateStubBrowserInterfaceBrokerReceiver(),
+                       blink::WebTreeScopeType::kDocument, std::string(),
+                       "uniqueName3", false, base::UnguessableToken::Create(),
+                       blink::FramePolicy(),
+                       blink::mojom::FrameOwnerProperties(), false, kOwnerType);
+  frame_tree->AddFrame(root->child_at(1)->current_frame_host(), process_id, 255,
+                       CreateStubInterfaceProviderReceiver(),
+                       CreateStubBrowserInterfaceBrokerReceiver(),
+                       blink::WebTreeScopeType::kDocument, no_children_node,
+                       "uniqueName4", false, base::UnguessableToken::Create(),
+                       blink::FramePolicy(),
+                       blink::mojom::FrameOwnerProperties(), false, kOwnerType);
+  frame_tree->AddFrame(root->child_at(0)->current_frame_host(), process_id, 245,
+                       CreateStubInterfaceProviderReceiver(),
+                       CreateStubBrowserInterfaceBrokerReceiver(),
+                       blink::WebTreeScopeType::kDocument, std::string(),
+                       "uniqueName5", false, base::UnguessableToken::Create(),
+                       blink::FramePolicy(),
+                       blink::mojom::FrameOwnerProperties(), false, kOwnerType);
 
   EXPECT_EQ(
       "1: [14: [244: [], 245: []], "
@@ -214,65 +220,71 @@
       GetTreeState(frame_tree));
 
   FrameTreeNode* child_16 = root->child_at(2);
-  frame_tree->AddFrame(
-      child_16, process_id, 264, CreateStubInterfaceProviderReceiver(),
-      CreateStubBrowserInterfaceBrokerReceiver(),
-      blink::WebTreeScopeType::kDocument, std::string(), "uniqueName6", false,
-      base::UnguessableToken::Create(), blink::FramePolicy(),
-      blink::mojom::FrameOwnerProperties(), false, kOwnerType);
-  frame_tree->AddFrame(
-      child_16, process_id, 265, CreateStubInterfaceProviderReceiver(),
-      CreateStubBrowserInterfaceBrokerReceiver(),
-      blink::WebTreeScopeType::kDocument, std::string(), "uniqueName7", false,
-      base::UnguessableToken::Create(), blink::FramePolicy(),
-      blink::mojom::FrameOwnerProperties(), false, kOwnerType);
-  frame_tree->AddFrame(
-      child_16, process_id, 266, CreateStubInterfaceProviderReceiver(),
-      CreateStubBrowserInterfaceBrokerReceiver(),
-      blink::WebTreeScopeType::kDocument, std::string(), "uniqueName8", false,
-      base::UnguessableToken::Create(), blink::FramePolicy(),
-      blink::mojom::FrameOwnerProperties(), false, kOwnerType);
-  frame_tree->AddFrame(
-      child_16, process_id, 267, CreateStubInterfaceProviderReceiver(),
-      CreateStubBrowserInterfaceBrokerReceiver(),
-      blink::WebTreeScopeType::kDocument, deep_subtree, "uniqueName9", false,
-      base::UnguessableToken::Create(), blink::FramePolicy(),
-      blink::mojom::FrameOwnerProperties(), false, kOwnerType);
-  frame_tree->AddFrame(
-      child_16, process_id, 268, CreateStubInterfaceProviderReceiver(),
-      CreateStubBrowserInterfaceBrokerReceiver(),
-      blink::WebTreeScopeType::kDocument, std::string(), "uniqueName10", false,
-      base::UnguessableToken::Create(), blink::FramePolicy(),
-      blink::mojom::FrameOwnerProperties(), false, kOwnerType);
+  frame_tree->AddFrame(child_16->current_frame_host(), process_id, 264,
+                       CreateStubInterfaceProviderReceiver(),
+                       CreateStubBrowserInterfaceBrokerReceiver(),
+                       blink::WebTreeScopeType::kDocument, std::string(),
+                       "uniqueName6", false, base::UnguessableToken::Create(),
+                       blink::FramePolicy(),
+                       blink::mojom::FrameOwnerProperties(), false, kOwnerType);
+  frame_tree->AddFrame(child_16->current_frame_host(), process_id, 265,
+                       CreateStubInterfaceProviderReceiver(),
+                       CreateStubBrowserInterfaceBrokerReceiver(),
+                       blink::WebTreeScopeType::kDocument, std::string(),
+                       "uniqueName7", false, base::UnguessableToken::Create(),
+                       blink::FramePolicy(),
+                       blink::mojom::FrameOwnerProperties(), false, kOwnerType);
+  frame_tree->AddFrame(child_16->current_frame_host(), process_id, 266,
+                       CreateStubInterfaceProviderReceiver(),
+                       CreateStubBrowserInterfaceBrokerReceiver(),
+                       blink::WebTreeScopeType::kDocument, std::string(),
+                       "uniqueName8", false, base::UnguessableToken::Create(),
+                       blink::FramePolicy(),
+                       blink::mojom::FrameOwnerProperties(), false, kOwnerType);
+  frame_tree->AddFrame(child_16->current_frame_host(), process_id, 267,
+                       CreateStubInterfaceProviderReceiver(),
+                       CreateStubBrowserInterfaceBrokerReceiver(),
+                       blink::WebTreeScopeType::kDocument, deep_subtree,
+                       "uniqueName9", false, base::UnguessableToken::Create(),
+                       blink::FramePolicy(),
+                       blink::mojom::FrameOwnerProperties(), false, kOwnerType);
+  frame_tree->AddFrame(child_16->current_frame_host(), process_id, 268,
+                       CreateStubInterfaceProviderReceiver(),
+                       CreateStubBrowserInterfaceBrokerReceiver(),
+                       blink::WebTreeScopeType::kDocument, std::string(),
+                       "uniqueName10", false, base::UnguessableToken::Create(),
+                       blink::FramePolicy(),
+                       blink::mojom::FrameOwnerProperties(), false, kOwnerType);
 
   FrameTreeNode* child_267 = child_16->child_at(3);
-  frame_tree->AddFrame(
-      child_267, process_id, 365, CreateStubInterfaceProviderReceiver(),
-      CreateStubBrowserInterfaceBrokerReceiver(),
-      blink::WebTreeScopeType::kDocument, std::string(), "uniqueName11", false,
-      base::UnguessableToken::Create(), blink::FramePolicy(),
-      blink::mojom::FrameOwnerProperties(), false, kOwnerType);
-  frame_tree->AddFrame(child_267->child_at(0), process_id, 455,
+  frame_tree->AddFrame(child_267->current_frame_host(), process_id, 365,
                        CreateStubInterfaceProviderReceiver(),
                        CreateStubBrowserInterfaceBrokerReceiver(),
                        blink::WebTreeScopeType::kDocument, std::string(),
+                       "uniqueName11", false, base::UnguessableToken::Create(),
+                       blink::FramePolicy(),
+                       blink::mojom::FrameOwnerProperties(), false, kOwnerType);
+  frame_tree->AddFrame(child_267->child_at(0)->current_frame_host(), process_id,
+                       455, CreateStubInterfaceProviderReceiver(),
+                       CreateStubBrowserInterfaceBrokerReceiver(),
+                       blink::WebTreeScopeType::kDocument, std::string(),
                        "uniqueName12", false, base::UnguessableToken::Create(),
                        blink::FramePolicy(),
                        blink::mojom::FrameOwnerProperties(), false, kOwnerType);
-  frame_tree->AddFrame(child_267->child_at(0)->child_at(0), process_id, 555,
-                       CreateStubInterfaceProviderReceiver(),
-                       CreateStubBrowserInterfaceBrokerReceiver(),
-                       blink::WebTreeScopeType::kDocument, std::string(),
-                       "uniqueName13", false, base::UnguessableToken::Create(),
-                       blink::FramePolicy(),
-                       blink::mojom::FrameOwnerProperties(), false, kOwnerType);
-  frame_tree->AddFrame(child_267->child_at(0)->child_at(0)->child_at(0),
-                       process_id, 655, CreateStubInterfaceProviderReceiver(),
-                       CreateStubBrowserInterfaceBrokerReceiver(),
-                       blink::WebTreeScopeType::kDocument, std::string(),
-                       "uniqueName14", false, base::UnguessableToken::Create(),
-                       blink::FramePolicy(),
-                       blink::mojom::FrameOwnerProperties(), false, kOwnerType);
+  frame_tree->AddFrame(
+      child_267->child_at(0)->child_at(0)->current_frame_host(), process_id,
+      555, CreateStubInterfaceProviderReceiver(),
+      CreateStubBrowserInterfaceBrokerReceiver(),
+      blink::WebTreeScopeType::kDocument, std::string(), "uniqueName13", false,
+      base::UnguessableToken::Create(), blink::FramePolicy(),
+      blink::mojom::FrameOwnerProperties(), false, kOwnerType);
+  frame_tree->AddFrame(
+      child_267->child_at(0)->child_at(0)->child_at(0)->current_frame_host(),
+      process_id, 655, CreateStubInterfaceProviderReceiver(),
+      CreateStubBrowserInterfaceBrokerReceiver(),
+      blink::WebTreeScopeType::kDocument, std::string(), "uniqueName14", false,
+      base::UnguessableToken::Create(), blink::FramePolicy(),
+      blink::mojom::FrameOwnerProperties(), false, kOwnerType);
 
   // Now that's it's fully built, verify the tree structure is as expected.
   EXPECT_EQ(
@@ -544,7 +556,8 @@
 
   // Simulate attaching a frame from mismatched process id.
   ASSERT_FALSE(frame_tree->AddFrame(
-      root, process_id + 1, 1, CreateStubInterfaceProviderReceiver(),
+      root->current_frame_host(), process_id + 1, 1,
+      CreateStubInterfaceProviderReceiver(),
       CreateStubBrowserInterfaceBrokerReceiver(),
       blink::WebTreeScopeType::kDocument, std::string(), "uniqueName0", false,
       base::UnguessableToken::Create(), blink::FramePolicy(),