blob: 5c66331d459f0f1bfc1b5b7ad0b0c20ea6b9802f [file] [log] [blame]
Albert J. Wongcb004632018-07-10 22:58:251// Copyright 2013 The Chromium Authors. All rights reserved.
[email protected]9b159a52013-10-03 17:24:552// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
danakjc492bf82020-09-09 20:02:445#include "content/browser/renderer_host/frame_tree.h"
[email protected]9b159a52013-10-03 17:24:556
avib7348942015-12-25 20:57:107#include <stddef.h>
8
9#include "base/macros.h"
[email protected]9b159a52013-10-03 17:24:5510#include "base/run_loop.h"
[email protected]7cc7ebd2013-10-08 00:59:0011#include "base/strings/string_number_conversions.h"
Lei Zhange02299a2021-04-26 23:12:2412#include "base/strings/stringprintf.h"
danakjc492bf82020-09-09 20:02:4413#include "content/browser/renderer_host/navigator.h"
14#include "content/browser/renderer_host/render_frame_host_factory.h"
15#include "content/browser/renderer_host/render_frame_host_impl.h"
[email protected]9b159a52013-10-03 17:24:5516#include "content/browser/renderer_host/render_view_host_impl.h"
[email protected]94d0cc12013-12-18 00:07:4117#include "content/browser/web_contents/web_contents_impl.h"
[email protected]14266072014-04-19 00:35:2018#include "content/public/browser/web_contents_observer.h"
Gabriel Charettec7108742019-08-23 03:31:4019#include "content/public/test/browser_task_environment.h"
[email protected]9b159a52013-10-03 17:24:5520#include "content/public/test/mock_render_process_host.h"
21#include "content/public/test/test_browser_context.h"
[email protected]6b50e362014-08-15 05:15:5922#include "content/test/test_render_frame_host.h"
[email protected]14266072014-04-19 00:35:2023#include "content/test/test_render_view_host.h"
24#include "content/test/test_web_contents.h"
Gyuyoung Kim6c9ce9022019-11-26 05:40:0825#include "mojo/public/cpp/bindings/pending_receiver.h"
[email protected]9b159a52013-10-03 17:24:5526#include "testing/gtest/include/gtest/gtest.h"
Kevin McNee43fe8292021-10-04 22:59:4127#include "third_party/blink/public/common/frame/frame_owner_element_type.h"
Blink Reformata30d4232018-04-07 15:31:0628#include "third_party/blink/public/common/frame/frame_policy.h"
Chris Hamilton3ff6ed0e2021-02-19 03:54:0429#include "third_party/blink/public/common/tokens/tokens.h"
Julie Jeongeun Kim70a2e4e2020-02-21 05:09:5430#include "third_party/blink/public/mojom/frame/frame_owner_properties.mojom.h"
[email protected]9b159a52013-10-03 17:24:5531
32namespace content {
dgroganfb22f9a2014-10-20 21:32:3233
[email protected]9b159a52013-10-03 17:24:5534namespace {
35
[email protected]14266072014-04-19 00:35:2036// Appends a description of the structure of the frame tree to |result|.
37void AppendTreeNodeState(FrameTreeNode* node, std::string* result) {
38 result->append(
Raul Tambre6c0c3f5b2019-02-04 17:44:1739 base::NumberToString(node->current_frame_host()->GetRoutingID()));
schenney6408fed22015-04-17 17:44:5740 if (!node->current_frame_host()->IsRenderFrameLive())
41 result->append("*"); // Asterisk next to dead frames.
42
[email protected]14266072014-04-19 00:35:2043 if (!node->frame_name().empty()) {
44 result->append(" '");
45 result->append(node->frame_name());
46 result->append("'");
47 }
48 result->append(": [");
49 const char* separator = "";
50 for (size_t i = 0; i < node->child_count(); i++) {
51 result->append(separator);
52 AppendTreeNodeState(node->child_at(i), result);
53 separator = ", ";
54 }
55 result->append("]");
56}
57
danakj0bdfacd2021-01-20 19:27:1858mojo::PendingAssociatedRemote<mojom::Frame> CreateStubFrameRemote() {
59 return TestRenderFrameHost::CreateStubFrameRemote();
60}
61
Oksana Zhuravlovafee097c2019-07-26 17:01:3062mojo::PendingReceiver<blink::mojom::BrowserInterfaceBroker>
63CreateStubBrowserInterfaceBrokerReceiver() {
64 return TestRenderFrameHost::CreateStubBrowserInterfaceBrokerReceiver();
65}
66
Antonio Sartoridb967c52021-01-20 09:54:3067blink::mojom::PolicyContainerBindParamsPtr
68CreateStubPolicyContainerBindParams() {
69 return TestRenderFrameHost::CreateStubPolicyContainerBindParams();
Antonio Sartoria1fd1432020-11-25 09:10:2070}
71
[email protected]14266072014-04-19 00:35:2072// Logs calls to WebContentsObserver along with the state of the frame tree,
73// for later use in EXPECT_EQ().
74class TreeWalkingWebContentsLogger : public WebContentsObserver {
75 public:
76 explicit TreeWalkingWebContentsLogger(WebContents* web_contents)
77 : WebContentsObserver(web_contents) {}
78
Peter Boström828b9022021-09-21 02:28:4379 TreeWalkingWebContentsLogger(const TreeWalkingWebContentsLogger&) = delete;
80 TreeWalkingWebContentsLogger& operator=(const TreeWalkingWebContentsLogger&) =
81 delete;
82
dchengc2282aa2014-10-21 12:07:5883 ~TreeWalkingWebContentsLogger() override {
[email protected]14266072014-04-19 00:35:2084 EXPECT_EQ("", log_) << "Activity logged that was not expected";
85 }
86
87 // Gets and resets the log, which is a string of what happened.
88 std::string GetLog() {
89 std::string result = log_;
90 log_.clear();
91 return result;
92 }
93
94 // content::WebContentsObserver implementation.
dchengc2282aa2014-10-21 12:07:5895 void RenderFrameCreated(RenderFrameHost* render_frame_host) override {
[email protected]14266072014-04-19 00:35:2096 LogWhatHappened("RenderFrameCreated", render_frame_host);
97 }
98
dchengc2282aa2014-10-21 12:07:5899 void RenderFrameHostChanged(RenderFrameHost* old_host,
100 RenderFrameHost* new_host) override {
[email protected]02d7b6e2014-06-24 21:01:50101 if (old_host)
naskof5940b9f2015-03-02 23:04:05102 LogWhatHappened("RenderFrameHostChanged(old)", old_host);
103 LogWhatHappened("RenderFrameHostChanged(new)", new_host);
[email protected]02d7b6e2014-06-24 21:01:50104 }
105
dchengc2282aa2014-10-21 12:07:58106 void RenderFrameDeleted(RenderFrameHost* render_frame_host) override {
[email protected]14266072014-04-19 00:35:20107 LogWhatHappened("RenderFrameDeleted", render_frame_host);
108 }
109
dchengc2282aa2014-10-21 12:07:58110 void RenderProcessGone(base::TerminationStatus status) override {
[email protected]14266072014-04-19 00:35:20111 LogWhatHappened("RenderProcessGone");
112 }
113
114 private:
115 void LogWhatHappened(const std::string& event_name) {
116 if (!log_.empty()) {
117 log_.append("\n");
118 }
119 log_.append(event_name + " -> ");
120 AppendTreeNodeState(
121 static_cast<WebContentsImpl*>(web_contents())->GetFrameTree()->root(),
122 &log_);
123 }
124
125 void LogWhatHappened(const std::string& event_name, RenderFrameHost* rfh) {
126 LogWhatHappened(
127 base::StringPrintf("%s(%d)", event_name.c_str(), rfh->GetRoutingID()));
128 }
129
130 std::string log_;
[email protected]14266072014-04-19 00:35:20131};
132
dgroganfb22f9a2014-10-20 21:32:32133} // namespace
134
[email protected]14266072014-04-19 00:35:20135class FrameTreeTest : public RenderViewHostImplTestHarness {
[email protected]7cc7ebd2013-10-08 00:59:00136 protected:
137 // Prints a FrameTree, for easy assertions of the tree hierarchy.
138 std::string GetTreeState(FrameTree* frame_tree) {
139 std::string result;
[email protected]fa944cb82013-11-15 17:51:21140 AppendTreeNodeState(frame_tree->root(), &result);
[email protected]7cc7ebd2013-10-08 00:59:00141 return result;
142 }
nick4ed970292016-01-20 21:46:45143
144 std::string GetTraversalOrder(FrameTree* frame_tree,
Alex Moshchuk27caae82017-09-11 23:11:18145 FrameTreeNode* subtree_to_skip) {
nick4ed970292016-01-20 21:46:45146 std::string result;
Alex Moshchuk27caae82017-09-11 23:11:18147 for (FrameTreeNode* node :
148 frame_tree->NodesExceptSubtree(subtree_to_skip)) {
dcheng57e39e22016-01-21 00:25:38149 if (!result.empty())
150 result += " ";
Raul Tambre6c0c3f5b2019-02-04 17:44:17151 result +=
152 base::NumberToString(node->current_frame_host()->GetRoutingID());
dcheng57e39e22016-01-21 00:25:38153 }
nick4ed970292016-01-20 21:46:45154 return result;
155 }
Jayson Adams4db0bfe22021-07-15 19:24:07156
157 size_t GetIteratorSize(FrameTree::NodeIterator iterator) {
158 return iterator.queue_.size();
159 }
[email protected]9b159a52013-10-03 17:24:55160};
161
Jayson Adams4db0bfe22021-07-15 19:24:07162// Confirm expected operation of the node queue that supports node iterators.
163TEST_F(FrameTreeTest, FrameNodeQueue) {
164 main_test_rfh()->InitializeRenderFrameIfNeeded();
165
166 // Use the FrameTree of the WebContents so that it has all the delegates it
167 // needs. We may want to consider a test version of this.
168 FrameTree* frame_tree = contents()->GetFrameTree();
169 FrameTreeNode* root = frame_tree->root();
170
Kevin McNee43fe8292021-10-04 22:59:41171 constexpr auto kOwnerType = blink::FrameOwnerElementType::kIframe;
Jayson Adams4db0bfe22021-07-15 19:24:07172 int process_id = root->current_frame_host()->GetProcess()->GetID();
Kevin McNee43fe8292021-10-04 22:59:41173 frame_tree->AddFrame(
174 root->current_frame_host(), process_id, 14, CreateStubFrameRemote(),
175 CreateStubBrowserInterfaceBrokerReceiver(),
176 CreateStubPolicyContainerBindParams(),
177 blink::mojom::TreeScopeType::kDocument, std::string(), "uniqueName0",
178 false, blink::LocalFrameToken(), base::UnguessableToken::Create(),
179 blink::FramePolicy(), blink::mojom::FrameOwnerProperties(), false,
180 kOwnerType, false);
181 frame_tree->AddFrame(
182 root->current_frame_host(), process_id, 15, CreateStubFrameRemote(),
183 CreateStubBrowserInterfaceBrokerReceiver(),
184 CreateStubPolicyContainerBindParams(),
185 blink::mojom::TreeScopeType::kDocument, std::string(), "uniqueName1",
186 false, blink::LocalFrameToken(), base::UnguessableToken::Create(),
187 blink::FramePolicy(), blink::mojom::FrameOwnerProperties(), false,
188 kOwnerType, false);
189 frame_tree->AddFrame(
190 root->current_frame_host(), process_id, 16, CreateStubFrameRemote(),
191 CreateStubBrowserInterfaceBrokerReceiver(),
192 CreateStubPolicyContainerBindParams(),
193 blink::mojom::TreeScopeType::kDocument, std::string(), "uniqueName2",
194 false, blink::LocalFrameToken(), base::UnguessableToken::Create(),
195 blink::FramePolicy(), blink::mojom::FrameOwnerProperties(), false,
196 kOwnerType, false);
Jayson Adams4db0bfe22021-07-15 19:24:07197
198 EXPECT_EQ(3U, root->child_count());
199 FrameTree::NodeIterator node_iterator = frame_tree->Nodes().begin();
200
201 // Before the iterator advances the frame node queue should be empty.
202 EXPECT_EQ(0U, GetIteratorSize(node_iterator));
203
204 std::advance(node_iterator, 1);
205
206 // Advancing the iterator should fill the queue, then pop the first node
207 // from the front of the queue and make it the current node (available by
208 // dereferencing the iterator).
209 EXPECT_EQ(2U, GetIteratorSize(node_iterator));
210 EXPECT_EQ(root->child_at(0), *node_iterator);
211}
212
[email protected]9b159a52013-10-03 17:24:55213// Exercise tree manipulation routines.
214// - Add a series of nodes and verify tree structure.
215// - Remove a series of nodes and verify tree structure.
nasko9f2261b2015-07-02 11:40:26216TEST_F(FrameTreeTest, Shape) {
nick8814e652015-12-18 01:44:12217 main_test_rfh()->InitializeRenderFrameIfNeeded();
218
[email protected]94d0cc12013-12-18 00:07:41219 // Use the FrameTree of the WebContents so that it has all the delegates it
220 // needs. We may want to consider a test version of this.
[email protected]14266072014-04-19 00:35:20221 FrameTree* frame_tree = contents()->GetFrameTree();
[email protected]58faf942014-02-20 21:03:58222 FrameTreeNode* root = frame_tree->root();
[email protected]190b8c52013-11-09 01:35:44223
[email protected]9b159a52013-10-03 17:24:55224 std::string no_children_node("no children node");
225 std::string deep_subtree("node with deep subtree");
dgroganfb22f9a2014-10-20 21:32:32226 int process_id = root->current_frame_host()->GetProcess()->GetID();
[email protected]9b159a52013-10-03 17:24:55227
nasko9f2261b2015-07-02 11:40:26228 // Do not navigate each frame separately, since that will clutter the test
229 // itself. Instead, leave them in "not live" state, which is indicated by the
230 // * after the frame id, since this test cares about the shape, not the
nick8814e652015-12-18 01:44:12231 // frame liveness.
Fergal Dalyfd9136d2020-03-11 14:53:36232 EXPECT_EQ("1: []", GetTreeState(frame_tree));
[email protected]7cc7ebd2013-10-08 00:59:00233
Kevin McNee43fe8292021-10-04 22:59:41234 constexpr auto kOwnerType = blink::FrameOwnerElementType::kIframe;
[email protected]9b159a52013-10-03 17:24:55235 // Simulate attaching a series of frames to build the frame tree.
Kevin McNee43fe8292021-10-04 22:59:41236 frame_tree->AddFrame(
237 root->current_frame_host(), process_id, 14, CreateStubFrameRemote(),
238 CreateStubBrowserInterfaceBrokerReceiver(),
239 CreateStubPolicyContainerBindParams(),
240 blink::mojom::TreeScopeType::kDocument, std::string(), "uniqueName0",
241 false, blink::LocalFrameToken(), base::UnguessableToken::Create(),
242 blink::FramePolicy(), blink::mojom::FrameOwnerProperties(), false,
243 kOwnerType, false);
244 frame_tree->AddFrame(
245 root->current_frame_host(), process_id, 15, CreateStubFrameRemote(),
246 CreateStubBrowserInterfaceBrokerReceiver(),
247 CreateStubPolicyContainerBindParams(),
248 blink::mojom::TreeScopeType::kDocument, std::string(), "uniqueName1",
249 false, blink::LocalFrameToken(), base::UnguessableToken::Create(),
250 blink::FramePolicy(), blink::mojom::FrameOwnerProperties(), false,
251 kOwnerType, false);
252 frame_tree->AddFrame(
253 root->current_frame_host(), process_id, 16, CreateStubFrameRemote(),
254 CreateStubBrowserInterfaceBrokerReceiver(),
255 CreateStubPolicyContainerBindParams(),
256 blink::mojom::TreeScopeType::kDocument, std::string(), "uniqueName2",
257 false, blink::LocalFrameToken(), base::UnguessableToken::Create(),
258 blink::FramePolicy(), blink::mojom::FrameOwnerProperties(), false,
259 kOwnerType, false);
260 frame_tree->AddFrame(
261 root->child_at(0)->current_frame_host(), process_id, 244,
262 CreateStubFrameRemote(), CreateStubBrowserInterfaceBrokerReceiver(),
263 CreateStubPolicyContainerBindParams(),
264 blink::mojom::TreeScopeType::kDocument, std::string(), "uniqueName3",
265 false, blink::LocalFrameToken(), base::UnguessableToken::Create(),
266 blink::FramePolicy(), blink::mojom::FrameOwnerProperties(), false,
267 kOwnerType, false);
268 frame_tree->AddFrame(
269 root->child_at(1)->current_frame_host(), process_id, 255,
270 CreateStubFrameRemote(), CreateStubBrowserInterfaceBrokerReceiver(),
271 CreateStubPolicyContainerBindParams(),
272 blink::mojom::TreeScopeType::kDocument, no_children_node, "uniqueName4",
273 false, blink::LocalFrameToken(), base::UnguessableToken::Create(),
274 blink::FramePolicy(), blink::mojom::FrameOwnerProperties(), false,
275 kOwnerType, false);
276 frame_tree->AddFrame(
277 root->child_at(0)->current_frame_host(), process_id, 245,
278 CreateStubFrameRemote(), CreateStubBrowserInterfaceBrokerReceiver(),
279 CreateStubPolicyContainerBindParams(),
280 blink::mojom::TreeScopeType::kDocument, std::string(), "uniqueName5",
281 false, blink::LocalFrameToken(), base::UnguessableToken::Create(),
282 blink::FramePolicy(), blink::mojom::FrameOwnerProperties(), false,
283 kOwnerType, false);
[email protected]9b159a52013-10-03 17:24:55284
dcheng3ce04b62015-10-26 23:30:55285 EXPECT_EQ(
Fergal Dalyfd9136d2020-03-11 14:53:36286 "1: [14: [244: [], 245: []], "
nick8814e652015-12-18 01:44:12287 "15: [255 'no children node': []], "
288 "16: []]",
dcheng3ce04b62015-10-26 23:30:55289 GetTreeState(frame_tree));
[email protected]9b159a52013-10-03 17:24:55290
[email protected]58faf942014-02-20 21:03:58291 FrameTreeNode* child_16 = root->child_at(2);
Kevin McNee43fe8292021-10-04 22:59:41292 frame_tree->AddFrame(
293 child_16->current_frame_host(), process_id, 264, CreateStubFrameRemote(),
294 CreateStubBrowserInterfaceBrokerReceiver(),
295 CreateStubPolicyContainerBindParams(),
296 blink::mojom::TreeScopeType::kDocument, std::string(), "uniqueName6",
297 false, blink::LocalFrameToken(), base::UnguessableToken::Create(),
298 blink::FramePolicy(), blink::mojom::FrameOwnerProperties(), false,
299 kOwnerType, false);
300 frame_tree->AddFrame(
301 child_16->current_frame_host(), process_id, 265, CreateStubFrameRemote(),
302 CreateStubBrowserInterfaceBrokerReceiver(),
303 CreateStubPolicyContainerBindParams(),
304 blink::mojom::TreeScopeType::kDocument, std::string(), "uniqueName7",
305 false, blink::LocalFrameToken(), base::UnguessableToken::Create(),
306 blink::FramePolicy(), blink::mojom::FrameOwnerProperties(), false,
307 kOwnerType, false);
308 frame_tree->AddFrame(
309 child_16->current_frame_host(), process_id, 266, CreateStubFrameRemote(),
310 CreateStubBrowserInterfaceBrokerReceiver(),
311 CreateStubPolicyContainerBindParams(),
312 blink::mojom::TreeScopeType::kDocument, std::string(), "uniqueName8",
313 false, blink::LocalFrameToken(), base::UnguessableToken::Create(),
314 blink::FramePolicy(), blink::mojom::FrameOwnerProperties(), false,
315 kOwnerType, false);
316 frame_tree->AddFrame(
317 child_16->current_frame_host(), process_id, 267, CreateStubFrameRemote(),
318 CreateStubBrowserInterfaceBrokerReceiver(),
319 CreateStubPolicyContainerBindParams(),
320 blink::mojom::TreeScopeType::kDocument, deep_subtree, "uniqueName9",
321 false, blink::LocalFrameToken(), base::UnguessableToken::Create(),
322 blink::FramePolicy(), blink::mojom::FrameOwnerProperties(), false,
323 kOwnerType, false);
324 frame_tree->AddFrame(
325 child_16->current_frame_host(), process_id, 268, CreateStubFrameRemote(),
326 CreateStubBrowserInterfaceBrokerReceiver(),
327 CreateStubPolicyContainerBindParams(),
328 blink::mojom::TreeScopeType::kDocument, std::string(), "uniqueName10",
329 false, blink::LocalFrameToken(), base::UnguessableToken::Create(),
330 blink::FramePolicy(), blink::mojom::FrameOwnerProperties(), false,
331 kOwnerType, false);
[email protected]9b159a52013-10-03 17:24:55332
[email protected]58faf942014-02-20 21:03:58333 FrameTreeNode* child_267 = child_16->child_at(3);
Kevin McNee43fe8292021-10-04 22:59:41334 frame_tree->AddFrame(
335 child_267->current_frame_host(), process_id, 365, CreateStubFrameRemote(),
336 CreateStubBrowserInterfaceBrokerReceiver(),
337 CreateStubPolicyContainerBindParams(),
338 blink::mojom::TreeScopeType::kDocument, std::string(), "uniqueName11",
339 false, blink::LocalFrameToken(), base::UnguessableToken::Create(),
340 blink::FramePolicy(), blink::mojom::FrameOwnerProperties(), false,
341 kOwnerType, false);
342 frame_tree->AddFrame(
343 child_267->child_at(0)->current_frame_host(), process_id, 455,
344 CreateStubFrameRemote(), CreateStubBrowserInterfaceBrokerReceiver(),
345 CreateStubPolicyContainerBindParams(),
346 blink::mojom::TreeScopeType::kDocument, std::string(), "uniqueName12",
347 false, blink::LocalFrameToken(), base::UnguessableToken::Create(),
348 blink::FramePolicy(), blink::mojom::FrameOwnerProperties(), false,
349 kOwnerType, false);
Alexander Timin381e7e182020-04-28 19:04:03350 frame_tree->AddFrame(
351 child_267->child_at(0)->child_at(0)->current_frame_host(), process_id,
danakj0bdfacd2021-01-20 19:27:18352 555, CreateStubFrameRemote(), CreateStubBrowserInterfaceBrokerReceiver(),
Antonio Sartoridb967c52021-01-20 09:54:30353 CreateStubPolicyContainerBindParams(),
354 blink::mojom::TreeScopeType::kDocument, std::string(), "uniqueName13",
Chris Hamilton3ff6ed0e2021-02-19 03:54:04355 false, blink::LocalFrameToken(), base::UnguessableToken::Create(),
Antonio Sartoridb967c52021-01-20 09:54:30356 blink::FramePolicy(), blink::mojom::FrameOwnerProperties(), false,
Kevin McNee43fe8292021-10-04 22:59:41357 kOwnerType, false);
Alexander Timin381e7e182020-04-28 19:04:03358 frame_tree->AddFrame(
359 child_267->child_at(0)->child_at(0)->child_at(0)->current_frame_host(),
danakj0bdfacd2021-01-20 19:27:18360 process_id, 655, CreateStubFrameRemote(),
361 CreateStubBrowserInterfaceBrokerReceiver(),
Antonio Sartoridb967c52021-01-20 09:54:30362 CreateStubPolicyContainerBindParams(),
363 blink::mojom::TreeScopeType::kDocument, std::string(), "uniqueName14",
Chris Hamilton3ff6ed0e2021-02-19 03:54:04364 false, blink::LocalFrameToken(), base::UnguessableToken::Create(),
Antonio Sartoridb967c52021-01-20 09:54:30365 blink::FramePolicy(), blink::mojom::FrameOwnerProperties(), false,
Kevin McNee43fe8292021-10-04 22:59:41366 kOwnerType, false);
[email protected]9b159a52013-10-03 17:24:55367
[email protected]7cc7ebd2013-10-08 00:59:00368 // Now that's it's fully built, verify the tree structure is as expected.
dcheng3ce04b62015-10-26 23:30:55369 EXPECT_EQ(
Fergal Dalyfd9136d2020-03-11 14:53:36370 "1: [14: [244: [], 245: []], "
nick8814e652015-12-18 01:44:12371 "15: [255 'no children node': []], "
372 "16: [264: [], 265: [], 266: [], "
373 "267 'node with deep subtree': "
374 "[365: [455: [555: [655: []]]]], 268: []]]",
dcheng3ce04b62015-10-26 23:30:55375 GetTreeState(frame_tree));
[email protected]9b159a52013-10-03 17:24:55376
nick4ed970292016-01-20 21:46:45377 // Verify that traversal order is breadth first, even if we skip a subtree.
378 FrameTreeNode* child_14 = root->child_at(0);
379 FrameTreeNode* child_15 = root->child_at(1);
380 FrameTreeNode* child_244 = child_14->child_at(0);
381 FrameTreeNode* child_245 = child_14->child_at(1);
[email protected]58faf942014-02-20 21:03:58382 FrameTreeNode* child_555 = child_267->child_at(0)->child_at(0)->child_at(0);
nick4ed970292016-01-20 21:46:45383 FrameTreeNode* child_655 = child_555->child_at(0);
Fergal Dalyfd9136d2020-03-11 14:53:36384 EXPECT_EQ("1 14 15 16 244 245 255 264 265 266 267 268 365 455 555 655",
nick4ed970292016-01-20 21:46:45385 GetTraversalOrder(frame_tree, nullptr));
Fergal Dalyfd9136d2020-03-11 14:53:36386 EXPECT_EQ("1", GetTraversalOrder(frame_tree, root));
387 EXPECT_EQ("1 14 15 16 255 264 265 266 267 268 365 455 555 655",
nick4ed970292016-01-20 21:46:45388 GetTraversalOrder(frame_tree, child_14));
Fergal Dalyfd9136d2020-03-11 14:53:36389 EXPECT_EQ("1 14 15 16 244 245 255 264 265 266 267 268 365 455 555 655",
nick4ed970292016-01-20 21:46:45390 GetTraversalOrder(frame_tree, child_244));
Fergal Dalyfd9136d2020-03-11 14:53:36391 EXPECT_EQ("1 14 15 16 244 245 255 264 265 266 267 268 365 455 555 655",
nick4ed970292016-01-20 21:46:45392 GetTraversalOrder(frame_tree, child_245));
Fergal Dalyfd9136d2020-03-11 14:53:36393 EXPECT_EQ("1 14 15 16 244 245 264 265 266 267 268 365 455 555 655",
nick4ed970292016-01-20 21:46:45394 GetTraversalOrder(frame_tree, child_15));
Fergal Dalyfd9136d2020-03-11 14:53:36395 EXPECT_EQ("1 14 15 16 244 245 255 264 265 266 267 268",
nick4ed970292016-01-20 21:46:45396 GetTraversalOrder(frame_tree, child_267));
Fergal Dalyfd9136d2020-03-11 14:53:36397 EXPECT_EQ("1 14 15 16 244 245 255 264 265 266 267 268 365 455 555",
Alex Moshchuk27caae82017-09-11 23:11:18398 GetTraversalOrder(frame_tree, child_555));
Fergal Dalyfd9136d2020-03-11 14:53:36399 EXPECT_EQ("1 14 15 16 244 245 255 264 265 266 267 268 365 455 555 655",
nick4ed970292016-01-20 21:46:45400 GetTraversalOrder(frame_tree, child_655));
401
[email protected]58faf942014-02-20 21:03:58402 frame_tree->RemoveFrame(child_555);
dcheng3ce04b62015-10-26 23:30:55403 EXPECT_EQ(
Fergal Dalyfd9136d2020-03-11 14:53:36404 "1: [14: [244: [], 245: []], "
nick8814e652015-12-18 01:44:12405 "15: [255 'no children node': []], "
406 "16: [264: [], 265: [], 266: [], "
407 "267 'node with deep subtree': "
408 "[365: [455: []]], 268: []]]",
dcheng3ce04b62015-10-26 23:30:55409 GetTreeState(frame_tree));
[email protected]9b159a52013-10-03 17:24:55410
[email protected]58faf942014-02-20 21:03:58411 frame_tree->RemoveFrame(child_16->child_at(1));
dcheng3ce04b62015-10-26 23:30:55412 EXPECT_EQ(
Fergal Dalyfd9136d2020-03-11 14:53:36413 "1: [14: [244: [], 245: []], "
nick8814e652015-12-18 01:44:12414 "15: [255 'no children node': []], "
415 "16: [264: [], 266: [], "
416 "267 'node with deep subtree': "
417 "[365: [455: []]], 268: []]]",
dcheng3ce04b62015-10-26 23:30:55418 GetTreeState(frame_tree));
[email protected]9b159a52013-10-03 17:24:55419
[email protected]58faf942014-02-20 21:03:58420 frame_tree->RemoveFrame(root->child_at(1));
dcheng3ce04b62015-10-26 23:30:55421 EXPECT_EQ(
Fergal Dalyfd9136d2020-03-11 14:53:36422 "1: [14: [244: [], 245: []], "
nick8814e652015-12-18 01:44:12423 "16: [264: [], 266: [], "
424 "267 'node with deep subtree': "
425 "[365: [455: []]], 268: []]]",
dcheng3ce04b62015-10-26 23:30:55426 GetTreeState(frame_tree));
[email protected]9b159a52013-10-03 17:24:55427}
428
creis6a93a812015-04-24 23:13:17429// Ensure frames can be found by frame_tree_node_id, routing ID, or name.
Charlie Reisb1405622018-04-02 22:52:39430TEST_F(FrameTreeTest, FindFrames) {
lfg269b702f2015-06-08 19:28:19431 main_test_rfh()->InitializeRenderFrameIfNeeded();
432
creis6a93a812015-04-24 23:13:17433 // Add a few child frames to the main frame.
434 FrameTree* frame_tree = contents()->GetFrameTree();
435 FrameTreeNode* root = frame_tree->root();
lfg269b702f2015-06-08 19:28:19436
Kevin McNee43fe8292021-10-04 22:59:41437 constexpr auto kOwnerType = blink::FrameOwnerElementType::kIframe;
lukasza464d8692016-02-22 19:26:32438 main_test_rfh()->OnCreateChildFrame(
danakj0bdfacd2021-01-20 19:27:18439 22, CreateStubFrameRemote(), CreateStubBrowserInterfaceBrokerReceiver(),
Antonio Sartoridb967c52021-01-20 09:54:30440 CreateStubPolicyContainerBindParams(),
Antonio Gomes9d5c1ef2020-04-30 20:56:41441 blink::mojom::TreeScopeType::kDocument, "child0", "uniqueName0", false,
Chris Hamilton3ff6ed0e2021-02-19 03:54:04442 blink::LocalFrameToken(), base::UnguessableToken::Create(),
Dave Tapuska84449382020-05-01 00:39:04443 blink::FramePolicy(), blink::mojom::FrameOwnerProperties(), kOwnerType);
lukasza464d8692016-02-22 19:26:32444 main_test_rfh()->OnCreateChildFrame(
danakj0bdfacd2021-01-20 19:27:18445 23, CreateStubFrameRemote(), CreateStubBrowserInterfaceBrokerReceiver(),
Antonio Sartoridb967c52021-01-20 09:54:30446 CreateStubPolicyContainerBindParams(),
Antonio Gomes9d5c1ef2020-04-30 20:56:41447 blink::mojom::TreeScopeType::kDocument, "child1", "uniqueName1", false,
Chris Hamilton3ff6ed0e2021-02-19 03:54:04448 blink::LocalFrameToken(), base::UnguessableToken::Create(),
Dave Tapuska84449382020-05-01 00:39:04449 blink::FramePolicy(), blink::mojom::FrameOwnerProperties(), kOwnerType);
lukasza464d8692016-02-22 19:26:32450 main_test_rfh()->OnCreateChildFrame(
danakj0bdfacd2021-01-20 19:27:18451 24, CreateStubFrameRemote(), CreateStubBrowserInterfaceBrokerReceiver(),
Antonio Sartoridb967c52021-01-20 09:54:30452 CreateStubPolicyContainerBindParams(),
Antonio Gomes9d5c1ef2020-04-30 20:56:41453 blink::mojom::TreeScopeType::kDocument, std::string(), "uniqueName2",
Chris Hamilton3ff6ed0e2021-02-19 03:54:04454 false, blink::LocalFrameToken(), base::UnguessableToken::Create(),
Dave Tapuska84449382020-05-01 00:39:04455 blink::FramePolicy(), blink::mojom::FrameOwnerProperties(), kOwnerType);
creis6a93a812015-04-24 23:13:17456 FrameTreeNode* child0 = root->child_at(0);
457 FrameTreeNode* child1 = root->child_at(1);
458 FrameTreeNode* child2 = root->child_at(2);
459
460 // Add one grandchild frame.
dcheng860817a2015-05-22 03:16:56461 child1->current_frame_host()->OnCreateChildFrame(
danakj0bdfacd2021-01-20 19:27:18462 33, CreateStubFrameRemote(), CreateStubBrowserInterfaceBrokerReceiver(),
Antonio Sartoridb967c52021-01-20 09:54:30463 CreateStubPolicyContainerBindParams(),
Antonio Gomes9d5c1ef2020-04-30 20:56:41464 blink::mojom::TreeScopeType::kDocument, "grandchild", "uniqueName3",
Chris Hamilton3ff6ed0e2021-02-19 03:54:04465 false, blink::LocalFrameToken(), base::UnguessableToken::Create(),
Dave Tapuska84449382020-05-01 00:39:04466 blink::FramePolicy(), blink::mojom::FrameOwnerProperties(), kOwnerType);
creis6a93a812015-04-24 23:13:17467 FrameTreeNode* grandchild = child1->child_at(0);
468
469 // Ensure they can be found by FTN id.
470 EXPECT_EQ(root, frame_tree->FindByID(root->frame_tree_node_id()));
471 EXPECT_EQ(child0, frame_tree->FindByID(child0->frame_tree_node_id()));
472 EXPECT_EQ(child1, frame_tree->FindByID(child1->frame_tree_node_id()));
473 EXPECT_EQ(child2, frame_tree->FindByID(child2->frame_tree_node_id()));
474 EXPECT_EQ(grandchild, frame_tree->FindByID(grandchild->frame_tree_node_id()));
475 EXPECT_EQ(nullptr, frame_tree->FindByID(-1));
476
477 // Ensure they can be found by routing id.
478 int process_id = main_test_rfh()->GetProcess()->GetID();
479 EXPECT_EQ(root, frame_tree->FindByRoutingID(process_id,
480 main_test_rfh()->GetRoutingID()));
481 EXPECT_EQ(child0, frame_tree->FindByRoutingID(process_id, 22));
482 EXPECT_EQ(child1, frame_tree->FindByRoutingID(process_id, 23));
483 EXPECT_EQ(child2, frame_tree->FindByRoutingID(process_id, 24));
484 EXPECT_EQ(grandchild, frame_tree->FindByRoutingID(process_id, 33));
485 EXPECT_EQ(nullptr, frame_tree->FindByRoutingID(process_id, 37));
486
487 // Ensure they can be found by name, if they have one.
488 EXPECT_EQ(root, frame_tree->FindByName(std::string()));
489 EXPECT_EQ(child0, frame_tree->FindByName("child0"));
490 EXPECT_EQ(child1, frame_tree->FindByName("child1"));
491 EXPECT_EQ(grandchild, frame_tree->FindByName("grandchild"));
492 EXPECT_EQ(nullptr, frame_tree->FindByName("no such frame"));
493}
494
paulmeyer322777fb2016-05-16 23:15:39495// Check that PreviousSibling() and NextSibling() are retrieved correctly.
496TEST_F(FrameTreeTest, GetSibling) {
lfg269b702f2015-06-08 19:28:19497 main_test_rfh()->InitializeRenderFrameIfNeeded();
498
Kevin McNee43fe8292021-10-04 22:59:41499 constexpr auto kOwnerType = blink::FrameOwnerElementType::kIframe;
alexmos9f8705a2015-05-06 19:58:59500 // Add a few child frames to the main frame.
501 FrameTree* frame_tree = contents()->GetFrameTree();
502 FrameTreeNode* root = frame_tree->root();
lukasza464d8692016-02-22 19:26:32503 main_test_rfh()->OnCreateChildFrame(
danakj0bdfacd2021-01-20 19:27:18504 22, CreateStubFrameRemote(), CreateStubBrowserInterfaceBrokerReceiver(),
Antonio Sartoridb967c52021-01-20 09:54:30505 CreateStubPolicyContainerBindParams(),
Antonio Gomes9d5c1ef2020-04-30 20:56:41506 blink::mojom::TreeScopeType::kDocument, "child0", "uniqueName0", false,
Chris Hamilton3ff6ed0e2021-02-19 03:54:04507 blink::LocalFrameToken(), base::UnguessableToken::Create(),
Dave Tapuska84449382020-05-01 00:39:04508 blink::FramePolicy(), blink::mojom::FrameOwnerProperties(), kOwnerType);
lukasza464d8692016-02-22 19:26:32509 main_test_rfh()->OnCreateChildFrame(
danakj0bdfacd2021-01-20 19:27:18510 23, CreateStubFrameRemote(), CreateStubBrowserInterfaceBrokerReceiver(),
Antonio Sartoridb967c52021-01-20 09:54:30511 CreateStubPolicyContainerBindParams(),
Antonio Gomes9d5c1ef2020-04-30 20:56:41512 blink::mojom::TreeScopeType::kDocument, "child1", "uniqueName1", false,
Chris Hamilton3ff6ed0e2021-02-19 03:54:04513 blink::LocalFrameToken(), base::UnguessableToken::Create(),
Dave Tapuska84449382020-05-01 00:39:04514 blink::FramePolicy(), blink::mojom::FrameOwnerProperties(), kOwnerType);
lukasza464d8692016-02-22 19:26:32515 main_test_rfh()->OnCreateChildFrame(
danakj0bdfacd2021-01-20 19:27:18516 24, CreateStubFrameRemote(), CreateStubBrowserInterfaceBrokerReceiver(),
Antonio Sartoridb967c52021-01-20 09:54:30517 CreateStubPolicyContainerBindParams(),
Antonio Gomes9d5c1ef2020-04-30 20:56:41518 blink::mojom::TreeScopeType::kDocument, "child2", "uniqueName2", false,
Chris Hamilton3ff6ed0e2021-02-19 03:54:04519 blink::LocalFrameToken(), base::UnguessableToken::Create(),
Dave Tapuska84449382020-05-01 00:39:04520 blink::FramePolicy(), blink::mojom::FrameOwnerProperties(), kOwnerType);
alexmos9f8705a2015-05-06 19:58:59521 FrameTreeNode* child0 = root->child_at(0);
522 FrameTreeNode* child1 = root->child_at(1);
523 FrameTreeNode* child2 = root->child_at(2);
524
525 // Add one grandchild frame.
dcheng860817a2015-05-22 03:16:56526 child1->current_frame_host()->OnCreateChildFrame(
danakj0bdfacd2021-01-20 19:27:18527 33, CreateStubFrameRemote(), CreateStubBrowserInterfaceBrokerReceiver(),
Antonio Sartoridb967c52021-01-20 09:54:30528 CreateStubPolicyContainerBindParams(),
Antonio Gomes9d5c1ef2020-04-30 20:56:41529 blink::mojom::TreeScopeType::kDocument, "grandchild", "uniqueName3",
Chris Hamilton3ff6ed0e2021-02-19 03:54:04530 false, blink::LocalFrameToken(), base::UnguessableToken::Create(),
Dave Tapuska84449382020-05-01 00:39:04531 blink::FramePolicy(), blink::mojom::FrameOwnerProperties(), kOwnerType);
alexmos9f8705a2015-05-06 19:58:59532 FrameTreeNode* grandchild = child1->child_at(0);
533
paulmeyer322777fb2016-05-16 23:15:39534 // Test PreviousSibling().
alexmos9f8705a2015-05-06 19:58:59535 EXPECT_EQ(nullptr, root->PreviousSibling());
536 EXPECT_EQ(nullptr, child0->PreviousSibling());
537 EXPECT_EQ(child0, child1->PreviousSibling());
538 EXPECT_EQ(child1, child2->PreviousSibling());
539 EXPECT_EQ(nullptr, grandchild->PreviousSibling());
paulmeyer322777fb2016-05-16 23:15:39540
541 // Test NextSibling().
542 EXPECT_EQ(nullptr, root->NextSibling());
543 EXPECT_EQ(child1, child0->NextSibling());
544 EXPECT_EQ(child2, child1->NextSibling());
545 EXPECT_EQ(nullptr, child2->NextSibling());
546 EXPECT_EQ(nullptr, grandchild->NextSibling());
alexmos9f8705a2015-05-06 19:58:59547}
548
[email protected]14266072014-04-19 00:35:20549// Do some simple manipulations of the frame tree, making sure that
550// WebContentsObservers see a consistent view of the tree as we go.
551TEST_F(FrameTreeTest, ObserverWalksTreeDuringFrameCreation) {
552 TreeWalkingWebContentsLogger activity(contents());
schenney6408fed22015-04-17 17:44:57553 contents()->NavigateAndCommit(GURL("http://www.google.com"));
Fergal Dalyfd9136d2020-03-11 14:53:36554 EXPECT_EQ("RenderFrameCreated(1) -> 1: []", activity.GetLog());
schenney6408fed22015-04-17 17:44:57555
[email protected]14266072014-04-19 00:35:20556 FrameTree* frame_tree = contents()->GetFrameTree();
557 FrameTreeNode* root = frame_tree->root();
558
Kevin McNee43fe8292021-10-04 22:59:41559 constexpr auto kOwnerType = blink::FrameOwnerElementType::kIframe;
[email protected]14266072014-04-19 00:35:20560 // Simulate attaching a series of frames to build the frame tree.
lukasza464d8692016-02-22 19:26:32561 main_test_rfh()->OnCreateChildFrame(
danakj0bdfacd2021-01-20 19:27:18562 14, CreateStubFrameRemote(), CreateStubBrowserInterfaceBrokerReceiver(),
Antonio Sartoridb967c52021-01-20 09:54:30563 CreateStubPolicyContainerBindParams(),
Antonio Gomes9d5c1ef2020-04-30 20:56:41564 blink::mojom::TreeScopeType::kDocument, std::string(), "uniqueName0",
Chris Hamilton3ff6ed0e2021-02-19 03:54:04565 false, blink::LocalFrameToken(), base::UnguessableToken::Create(),
Dave Tapuska84449382020-05-01 00:39:04566 blink::FramePolicy(), blink::mojom::FrameOwnerProperties(), kOwnerType);
naskof5940b9f2015-03-02 23:04:05567 EXPECT_EQ(
Sreeja Kamishetty5b699622021-01-22 12:54:08568 "RenderFrameCreated(14) -> 1: [14: []]\n"
569 "RenderFrameHostChanged(new)(14) -> 1: [14: []]",
naskof5940b9f2015-03-02 23:04:05570 activity.GetLog());
lukasza464d8692016-02-22 19:26:32571 main_test_rfh()->OnCreateChildFrame(
danakj0bdfacd2021-01-20 19:27:18572 18, CreateStubFrameRemote(), CreateStubBrowserInterfaceBrokerReceiver(),
Antonio Sartoridb967c52021-01-20 09:54:30573 CreateStubPolicyContainerBindParams(),
Antonio Gomes9d5c1ef2020-04-30 20:56:41574 blink::mojom::TreeScopeType::kDocument, std::string(), "uniqueName1",
Chris Hamilton3ff6ed0e2021-02-19 03:54:04575 false, blink::LocalFrameToken(), base::UnguessableToken::Create(),
Dave Tapuska84449382020-05-01 00:39:04576 blink::FramePolicy(), blink::mojom::FrameOwnerProperties(), kOwnerType);
naskof5940b9f2015-03-02 23:04:05577 EXPECT_EQ(
Sreeja Kamishetty5b699622021-01-22 12:54:08578 "RenderFrameCreated(18) -> 1: [14: [], 18: []]\n"
579 "RenderFrameHostChanged(new)(18) -> 1: [14: [], 18: []]",
naskof5940b9f2015-03-02 23:04:05580 activity.GetLog());
[email protected]14266072014-04-19 00:35:20581 frame_tree->RemoveFrame(root->child_at(0));
Fergal Dalyfd9136d2020-03-11 14:53:36582 EXPECT_EQ("RenderFrameDeleted(14) -> 1: [18: []]", activity.GetLog());
[email protected]14266072014-04-19 00:35:20583 frame_tree->RemoveFrame(root->child_at(0));
Fergal Dalyfd9136d2020-03-11 14:53:36584 EXPECT_EQ("RenderFrameDeleted(18) -> 1: []", activity.GetLog());
[email protected]14266072014-04-19 00:35:20585}
586
587// Make sure that WebContentsObservers see a consistent view of the tree after
588// recovery from a render process crash.
589TEST_F(FrameTreeTest, ObserverWalksTreeAfterCrash) {
590 TreeWalkingWebContentsLogger activity(contents());
schenney6408fed22015-04-17 17:44:57591 contents()->NavigateAndCommit(GURL("http://www.google.com"));
Fergal Dalyfd9136d2020-03-11 14:53:36592 EXPECT_EQ("RenderFrameCreated(1) -> 1: []", activity.GetLog());
[email protected]14266072014-04-19 00:35:20593
Kevin McNee43fe8292021-10-04 22:59:41594 constexpr auto kOwnerType = blink::FrameOwnerElementType::kIframe;
lukasza464d8692016-02-22 19:26:32595 main_test_rfh()->OnCreateChildFrame(
danakj0bdfacd2021-01-20 19:27:18596 22, CreateStubFrameRemote(), CreateStubBrowserInterfaceBrokerReceiver(),
Antonio Sartoridb967c52021-01-20 09:54:30597 CreateStubPolicyContainerBindParams(),
Antonio Gomes9d5c1ef2020-04-30 20:56:41598 blink::mojom::TreeScopeType::kDocument, std::string(), "uniqueName0",
Chris Hamilton3ff6ed0e2021-02-19 03:54:04599 false, blink::LocalFrameToken(), base::UnguessableToken::Create(),
Dave Tapuska84449382020-05-01 00:39:04600 blink::FramePolicy(), blink::mojom::FrameOwnerProperties(), kOwnerType);
naskof5940b9f2015-03-02 23:04:05601 EXPECT_EQ(
Sreeja Kamishetty5b699622021-01-22 12:54:08602 "RenderFrameCreated(22) -> 1: [22: []]\n"
603 "RenderFrameHostChanged(new)(22) -> 1: [22: []]",
naskof5940b9f2015-03-02 23:04:05604 activity.GetLog());
lukasza464d8692016-02-22 19:26:32605 main_test_rfh()->OnCreateChildFrame(
danakj0bdfacd2021-01-20 19:27:18606 23, CreateStubFrameRemote(), CreateStubBrowserInterfaceBrokerReceiver(),
Antonio Sartoridb967c52021-01-20 09:54:30607 CreateStubPolicyContainerBindParams(),
Antonio Gomes9d5c1ef2020-04-30 20:56:41608 blink::mojom::TreeScopeType::kDocument, std::string(), "uniqueName1",
Chris Hamilton3ff6ed0e2021-02-19 03:54:04609 false, blink::LocalFrameToken(), base::UnguessableToken::Create(),
Dave Tapuska84449382020-05-01 00:39:04610 blink::FramePolicy(), blink::mojom::FrameOwnerProperties(), kOwnerType);
naskof5940b9f2015-03-02 23:04:05611 EXPECT_EQ(
Sreeja Kamishetty5b699622021-01-22 12:54:08612 "RenderFrameCreated(23) -> 1: [22: [], 23: []]\n"
613 "RenderFrameHostChanged(new)(23) -> 1: [22: [], 23: []]",
naskof5940b9f2015-03-02 23:04:05614 activity.GetLog());
[email protected]14266072014-04-19 00:35:20615
616 // Crash the renderer
nick16b07652015-04-18 02:35:31617 main_test_rfh()->GetProcess()->SimulateCrash();
[email protected]14266072014-04-19 00:35:20618 EXPECT_EQ(
Fergal Dalyfd9136d2020-03-11 14:53:36619 "RenderProcessGone -> 1*: [22*: [], 23*: []]\n"
620 "RenderFrameDeleted(23) -> 1*: []\n"
621 "RenderFrameDeleted(22) -> 1*: []\n"
622 "RenderFrameDeleted(1) -> 1*: []",
[email protected]14266072014-04-19 00:35:20623 activity.GetLog());
624}
625
dgroganfb22f9a2014-10-20 21:32:32626// Ensure that frames are not added to the tree, if the process passed in
627// is different than the process of the parent node.
628TEST_F(FrameTreeTest, FailAddFrameWithWrongProcessId) {
schenney6408fed22015-04-17 17:44:57629 contents()->NavigateAndCommit(GURL("http://www.google.com"));
dgroganfb22f9a2014-10-20 21:32:32630 FrameTree* frame_tree = contents()->GetFrameTree();
631 FrameTreeNode* root = frame_tree->root();
632 int process_id = root->current_frame_host()->GetProcess()->GetID();
633
Fergal Dalyfd9136d2020-03-11 14:53:36634 ASSERT_EQ("1: []", GetTreeState(frame_tree));
dgroganfb22f9a2014-10-20 21:32:32635
636 // Simulate attaching a frame from mismatched process id.
dcheng5f60abb2015-05-28 01:39:36637 ASSERT_FALSE(frame_tree->AddFrame(
danakj0bdfacd2021-01-20 19:27:18638 root->current_frame_host(), process_id + 1, 1, CreateStubFrameRemote(),
Oksana Zhuravlovafee097c2019-07-26 17:01:30639 CreateStubBrowserInterfaceBrokerReceiver(),
Antonio Sartoridb967c52021-01-20 09:54:30640 CreateStubPolicyContainerBindParams(),
641 blink::mojom::TreeScopeType::kDocument, std::string(), "uniqueName0",
Chris Hamilton3ff6ed0e2021-02-19 03:54:04642 false, blink::LocalFrameToken(), base::UnguessableToken::Create(),
Antonio Sartoridb967c52021-01-20 09:54:30643 blink::FramePolicy(), blink::mojom::FrameOwnerProperties(), false,
Kevin McNee43fe8292021-10-04 22:59:41644 blink::FrameOwnerElementType::kIframe, false));
Fergal Dalyfd9136d2020-03-11 14:53:36645 ASSERT_EQ("1: []", GetTreeState(frame_tree));
dgroganfb22f9a2014-10-20 21:32:32646}
647
naskoaeca57b2015-02-13 00:50:46648// Ensure that frames removed while a process has crashed are not preserved in
649// the global map of id->frame.
650TEST_F(FrameTreeTest, ProcessCrashClearsGlobalMap) {
lfg269b702f2015-06-08 19:28:19651 main_test_rfh()->InitializeRenderFrameIfNeeded();
652
naskoaeca57b2015-02-13 00:50:46653 // Add a couple child frames to the main frame.
654 FrameTreeNode* root = contents()->GetFrameTree()->root();
655
Kevin McNee43fe8292021-10-04 22:59:41656 constexpr auto kOwnerType = blink::FrameOwnerElementType::kIframe;
lukasza464d8692016-02-22 19:26:32657 main_test_rfh()->OnCreateChildFrame(
danakj0bdfacd2021-01-20 19:27:18658 22, CreateStubFrameRemote(), CreateStubBrowserInterfaceBrokerReceiver(),
Antonio Sartoridb967c52021-01-20 09:54:30659 CreateStubPolicyContainerBindParams(),
Antonio Gomes9d5c1ef2020-04-30 20:56:41660 blink::mojom::TreeScopeType::kDocument, std::string(), "uniqueName0",
Chris Hamilton3ff6ed0e2021-02-19 03:54:04661 false, blink::LocalFrameToken(), base::UnguessableToken::Create(),
Dave Tapuska84449382020-05-01 00:39:04662 blink::FramePolicy(), blink::mojom::FrameOwnerProperties(), kOwnerType);
lukasza464d8692016-02-22 19:26:32663 main_test_rfh()->OnCreateChildFrame(
danakj0bdfacd2021-01-20 19:27:18664 23, CreateStubFrameRemote(), CreateStubBrowserInterfaceBrokerReceiver(),
Antonio Sartoridb967c52021-01-20 09:54:30665 CreateStubPolicyContainerBindParams(),
Antonio Gomes9d5c1ef2020-04-30 20:56:41666 blink::mojom::TreeScopeType::kDocument, std::string(), "uniqueName1",
Chris Hamilton3ff6ed0e2021-02-19 03:54:04667 false, blink::LocalFrameToken(), base::UnguessableToken::Create(),
Dave Tapuska84449382020-05-01 00:39:04668 blink::FramePolicy(), blink::mojom::FrameOwnerProperties(), kOwnerType);
naskoaeca57b2015-02-13 00:50:46669
dmazzonie950ea232015-03-13 21:39:45670 // Add one grandchild frame.
671 RenderFrameHostImpl* child1_rfh = root->child_at(0)->current_frame_host();
Ehsan Karamad192a8da2018-10-21 03:48:08672 child1_rfh->OnCreateChildFrame(
danakj0bdfacd2021-01-20 19:27:18673 33, CreateStubFrameRemote(), CreateStubBrowserInterfaceBrokerReceiver(),
Antonio Sartoridb967c52021-01-20 09:54:30674 CreateStubPolicyContainerBindParams(),
Antonio Gomes9d5c1ef2020-04-30 20:56:41675 blink::mojom::TreeScopeType::kDocument, std::string(), "uniqueName2",
Chris Hamilton3ff6ed0e2021-02-19 03:54:04676 false, blink::LocalFrameToken(), base::UnguessableToken::Create(),
Dave Tapuska84449382020-05-01 00:39:04677 blink::FramePolicy(), blink::mojom::FrameOwnerProperties(), kOwnerType);
dmazzonie950ea232015-03-13 21:39:45678
naskoaeca57b2015-02-13 00:50:46679 // Ensure they can be found by id.
vishal.b782eb5d2015-04-29 12:22:57680 int id1 = root->child_at(0)->frame_tree_node_id();
681 int id2 = root->child_at(1)->frame_tree_node_id();
682 int id3 = root->child_at(0)->child_at(0)->frame_tree_node_id();
dmazzonie950ea232015-03-13 21:39:45683 EXPECT_TRUE(FrameTreeNode::GloballyFindByID(id1));
684 EXPECT_TRUE(FrameTreeNode::GloballyFindByID(id2));
685 EXPECT_TRUE(FrameTreeNode::GloballyFindByID(id3));
naskoaeca57b2015-02-13 00:50:46686
687 // Crash the renderer.
nick16b07652015-04-18 02:35:31688 main_test_rfh()->GetProcess()->SimulateCrash();
naskoaeca57b2015-02-13 00:50:46689
690 // Ensure they cannot be found by id after the process has crashed.
dmazzonie950ea232015-03-13 21:39:45691 EXPECT_FALSE(FrameTreeNode::GloballyFindByID(id1));
692 EXPECT_FALSE(FrameTreeNode::GloballyFindByID(id2));
693 EXPECT_FALSE(FrameTreeNode::GloballyFindByID(id3));
naskoaeca57b2015-02-13 00:50:46694}
695
[email protected]9b159a52013-10-03 17:24:55696} // namespace content