| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/browser/frame_host/frame_tree.h" | 5 #include "content/browser/frame_host/frame_tree.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include "base/macros.h" | 9 #include "base/macros.h" |
| 10 #include "base/run_loop.h" | 10 #include "base/run_loop.h" |
| (...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 149 int process_id = root->current_frame_host()->GetProcess()->GetID(); | 149 int process_id = root->current_frame_host()->GetProcess()->GetID(); |
| 150 | 150 |
| 151 // Do not navigate each frame separately, since that will clutter the test | 151 // Do not navigate each frame separately, since that will clutter the test |
| 152 // itself. Instead, leave them in "not live" state, which is indicated by the | 152 // itself. Instead, leave them in "not live" state, which is indicated by the |
| 153 // * after the frame id, since this test cares about the shape, not the | 153 // * after the frame id, since this test cares about the shape, not the |
| 154 // frame liveness. | 154 // frame liveness. |
| 155 EXPECT_EQ("2: []", GetTreeState(frame_tree)); | 155 EXPECT_EQ("2: []", GetTreeState(frame_tree)); |
| 156 | 156 |
| 157 // Simulate attaching a series of frames to build the frame tree. | 157 // Simulate attaching a series of frames to build the frame tree. |
| 158 frame_tree->AddFrame(root, process_id, 14, blink::WebTreeScopeType::Document, | 158 frame_tree->AddFrame(root, process_id, 14, blink::WebTreeScopeType::Document, |
| 159 std::string(), blink::WebSandboxFlags::None, | 159 std::string(), "uniqueName0", |
| 160 blink::WebSandboxFlags::None, |
| 160 blink::WebFrameOwnerProperties()); | 161 blink::WebFrameOwnerProperties()); |
| 161 frame_tree->AddFrame(root, process_id, 15, blink::WebTreeScopeType::Document, | 162 frame_tree->AddFrame(root, process_id, 15, blink::WebTreeScopeType::Document, |
| 162 std::string(), blink::WebSandboxFlags::None, | 163 std::string(), "uniqueName1", |
| 164 blink::WebSandboxFlags::None, |
| 163 blink::WebFrameOwnerProperties()); | 165 blink::WebFrameOwnerProperties()); |
| 164 frame_tree->AddFrame(root, process_id, 16, blink::WebTreeScopeType::Document, | 166 frame_tree->AddFrame(root, process_id, 16, blink::WebTreeScopeType::Document, |
| 165 std::string(), blink::WebSandboxFlags::None, | 167 std::string(), "uniqueName2", |
| 168 blink::WebSandboxFlags::None, |
| 166 blink::WebFrameOwnerProperties()); | 169 blink::WebFrameOwnerProperties()); |
| 167 | 170 |
| 168 frame_tree->AddFrame(root->child_at(0), process_id, 244, | 171 frame_tree->AddFrame(root->child_at(0), process_id, 244, |
| 169 blink::WebTreeScopeType::Document, std::string(), | 172 blink::WebTreeScopeType::Document, std::string(), |
| 170 blink::WebSandboxFlags::None, | 173 "uniqueName3", blink::WebSandboxFlags::None, |
| 171 blink::WebFrameOwnerProperties()); | 174 blink::WebFrameOwnerProperties()); |
| 172 frame_tree->AddFrame(root->child_at(1), process_id, 255, | 175 frame_tree->AddFrame(root->child_at(1), process_id, 255, |
| 173 blink::WebTreeScopeType::Document, no_children_node, | 176 blink::WebTreeScopeType::Document, no_children_node, |
| 174 blink::WebSandboxFlags::None, | 177 "uniqueName4", blink::WebSandboxFlags::None, |
| 175 blink::WebFrameOwnerProperties()); | 178 blink::WebFrameOwnerProperties()); |
| 176 frame_tree->AddFrame(root->child_at(0), process_id, 245, | 179 frame_tree->AddFrame(root->child_at(0), process_id, 245, |
| 177 blink::WebTreeScopeType::Document, std::string(), | 180 blink::WebTreeScopeType::Document, std::string(), |
| 178 blink::WebSandboxFlags::None, | 181 "uniqueName5", blink::WebSandboxFlags::None, |
| 179 blink::WebFrameOwnerProperties()); | 182 blink::WebFrameOwnerProperties()); |
| 180 | 183 |
| 181 EXPECT_EQ( | 184 EXPECT_EQ( |
| 182 "2: [14: [244: [], 245: []], " | 185 "2: [14: [244: [], 245: []], " |
| 183 "15: [255 'no children node': []], " | 186 "15: [255 'no children node': []], " |
| 184 "16: []]", | 187 "16: []]", |
| 185 GetTreeState(frame_tree)); | 188 GetTreeState(frame_tree)); |
| 186 | 189 |
| 187 FrameTreeNode* child_16 = root->child_at(2); | 190 FrameTreeNode* child_16 = root->child_at(2); |
| 188 frame_tree->AddFrame(child_16, process_id, 264, | 191 frame_tree->AddFrame(child_16, process_id, 264, |
| 189 blink::WebTreeScopeType::Document, std::string(), | 192 blink::WebTreeScopeType::Document, std::string(), |
| 190 blink::WebSandboxFlags::None, | 193 "uniqueName6", blink::WebSandboxFlags::None, |
| 191 blink::WebFrameOwnerProperties()); | 194 blink::WebFrameOwnerProperties()); |
| 192 frame_tree->AddFrame(child_16, process_id, 265, | 195 frame_tree->AddFrame(child_16, process_id, 265, |
| 193 blink::WebTreeScopeType::Document, std::string(), | 196 blink::WebTreeScopeType::Document, std::string(), |
| 194 blink::WebSandboxFlags::None, | 197 "uniqueName7", blink::WebSandboxFlags::None, |
| 195 blink::WebFrameOwnerProperties()); | 198 blink::WebFrameOwnerProperties()); |
| 196 frame_tree->AddFrame(child_16, process_id, 266, | 199 frame_tree->AddFrame(child_16, process_id, 266, |
| 197 blink::WebTreeScopeType::Document, std::string(), | 200 blink::WebTreeScopeType::Document, std::string(), |
| 198 blink::WebSandboxFlags::None, | 201 "uniqueName8", blink::WebSandboxFlags::None, |
| 199 blink::WebFrameOwnerProperties()); | 202 blink::WebFrameOwnerProperties()); |
| 200 frame_tree->AddFrame(child_16, process_id, 267, | 203 frame_tree->AddFrame(child_16, process_id, 267, |
| 201 blink::WebTreeScopeType::Document, deep_subtree, | 204 blink::WebTreeScopeType::Document, deep_subtree, |
| 202 blink::WebSandboxFlags::None, | 205 "uniqueName9", blink::WebSandboxFlags::None, |
| 203 blink::WebFrameOwnerProperties()); | 206 blink::WebFrameOwnerProperties()); |
| 204 frame_tree->AddFrame(child_16, process_id, 268, | 207 frame_tree->AddFrame(child_16, process_id, 268, |
| 205 blink::WebTreeScopeType::Document, std::string(), | 208 blink::WebTreeScopeType::Document, std::string(), |
| 206 blink::WebSandboxFlags::None, | 209 "uniqueName10", blink::WebSandboxFlags::None, |
| 207 blink::WebFrameOwnerProperties()); | 210 blink::WebFrameOwnerProperties()); |
| 208 | 211 |
| 209 FrameTreeNode* child_267 = child_16->child_at(3); | 212 FrameTreeNode* child_267 = child_16->child_at(3); |
| 210 frame_tree->AddFrame(child_267, process_id, 365, | 213 frame_tree->AddFrame(child_267, process_id, 365, |
| 211 blink::WebTreeScopeType::Document, std::string(), | 214 blink::WebTreeScopeType::Document, std::string(), |
| 212 blink::WebSandboxFlags::None, | 215 "uniqueName11", blink::WebSandboxFlags::None, |
| 213 blink::WebFrameOwnerProperties()); | 216 blink::WebFrameOwnerProperties()); |
| 214 frame_tree->AddFrame(child_267->child_at(0), process_id, 455, | 217 frame_tree->AddFrame(child_267->child_at(0), process_id, 455, |
| 215 blink::WebTreeScopeType::Document, std::string(), | 218 blink::WebTreeScopeType::Document, std::string(), |
| 216 blink::WebSandboxFlags::None, | 219 "uniqueName12", blink::WebSandboxFlags::None, |
| 217 blink::WebFrameOwnerProperties()); | 220 blink::WebFrameOwnerProperties()); |
| 218 frame_tree->AddFrame(child_267->child_at(0)->child_at(0), process_id, 555, | 221 frame_tree->AddFrame(child_267->child_at(0)->child_at(0), process_id, 555, |
| 219 blink::WebTreeScopeType::Document, std::string(), | 222 blink::WebTreeScopeType::Document, std::string(), |
| 220 blink::WebSandboxFlags::None, | 223 "uniqueName13", blink::WebSandboxFlags::None, |
| 221 blink::WebFrameOwnerProperties()); | 224 blink::WebFrameOwnerProperties()); |
| 222 frame_tree->AddFrame(child_267->child_at(0)->child_at(0)->child_at(0), | 225 frame_tree->AddFrame( |
| 223 process_id, 655, blink::WebTreeScopeType::Document, | 226 child_267->child_at(0)->child_at(0)->child_at(0), process_id, 655, |
| 224 std::string(), blink::WebSandboxFlags::None, | 227 blink::WebTreeScopeType::Document, std::string(), "uniqueName14", |
| 225 blink::WebFrameOwnerProperties()); | 228 blink::WebSandboxFlags::None, blink::WebFrameOwnerProperties()); |
| 226 | 229 |
| 227 // Now that's it's fully built, verify the tree structure is as expected. | 230 // Now that's it's fully built, verify the tree structure is as expected. |
| 228 EXPECT_EQ( | 231 EXPECT_EQ( |
| 229 "2: [14: [244: [], 245: []], " | 232 "2: [14: [244: [], 245: []], " |
| 230 "15: [255 'no children node': []], " | 233 "15: [255 'no children node': []], " |
| 231 "16: [264: [], 265: [], 266: [], " | 234 "16: [264: [], 265: [], 266: [], " |
| 232 "267 'node with deep subtree': " | 235 "267 'node with deep subtree': " |
| 233 "[365: [455: [555: [655: []]]]], 268: []]]", | 236 "[365: [455: [555: [655: []]]]], 268: []]]", |
| 234 GetTreeState(frame_tree)); | 237 GetTreeState(frame_tree)); |
| 235 | 238 |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 286 } | 289 } |
| 287 | 290 |
| 288 // Ensure frames can be found by frame_tree_node_id, routing ID, or name. | 291 // Ensure frames can be found by frame_tree_node_id, routing ID, or name. |
| 289 TEST_F(FrameTreeTest, FindFrames) { | 292 TEST_F(FrameTreeTest, FindFrames) { |
| 290 main_test_rfh()->InitializeRenderFrameIfNeeded(); | 293 main_test_rfh()->InitializeRenderFrameIfNeeded(); |
| 291 | 294 |
| 292 // Add a few child frames to the main frame. | 295 // Add a few child frames to the main frame. |
| 293 FrameTree* frame_tree = contents()->GetFrameTree(); | 296 FrameTree* frame_tree = contents()->GetFrameTree(); |
| 294 FrameTreeNode* root = frame_tree->root(); | 297 FrameTreeNode* root = frame_tree->root(); |
| 295 | 298 |
| 296 main_test_rfh()->OnCreateChildFrame(22, blink::WebTreeScopeType::Document, | 299 main_test_rfh()->OnCreateChildFrame( |
| 297 "child0", blink::WebSandboxFlags::None, | 300 22, blink::WebTreeScopeType::Document, "child0", "uniqueName0", |
| 298 blink::WebFrameOwnerProperties()); | 301 blink::WebSandboxFlags::None, blink::WebFrameOwnerProperties()); |
| 299 main_test_rfh()->OnCreateChildFrame(23, blink::WebTreeScopeType::Document, | 302 main_test_rfh()->OnCreateChildFrame( |
| 300 "child1", blink::WebSandboxFlags::None, | 303 23, blink::WebTreeScopeType::Document, "child1", "uniqueName1", |
| 301 blink::WebFrameOwnerProperties()); | 304 blink::WebSandboxFlags::None, blink::WebFrameOwnerProperties()); |
| 302 main_test_rfh()->OnCreateChildFrame(24, blink::WebTreeScopeType::Document, | 305 main_test_rfh()->OnCreateChildFrame( |
| 303 std::string(), | 306 24, blink::WebTreeScopeType::Document, std::string(), "uniqueName2", |
| 304 blink::WebSandboxFlags::None, | 307 blink::WebSandboxFlags::None, blink::WebFrameOwnerProperties()); |
| 305 blink::WebFrameOwnerProperties()); | |
| 306 FrameTreeNode* child0 = root->child_at(0); | 308 FrameTreeNode* child0 = root->child_at(0); |
| 307 FrameTreeNode* child1 = root->child_at(1); | 309 FrameTreeNode* child1 = root->child_at(1); |
| 308 | 310 |
| 309 FrameTreeNode* child2 = root->child_at(2); | 311 FrameTreeNode* child2 = root->child_at(2); |
| 310 | 312 |
| 311 // Add one grandchild frame. | 313 // Add one grandchild frame. |
| 312 child1->current_frame_host()->OnCreateChildFrame( | 314 child1->current_frame_host()->OnCreateChildFrame( |
| 313 33, blink::WebTreeScopeType::Document, "grandchild", | 315 33, blink::WebTreeScopeType::Document, "grandchild", "uniqueName3", |
| 314 blink::WebSandboxFlags::None, blink::WebFrameOwnerProperties()); | 316 blink::WebSandboxFlags::None, blink::WebFrameOwnerProperties()); |
| 315 FrameTreeNode* grandchild = child1->child_at(0); | 317 FrameTreeNode* grandchild = child1->child_at(0); |
| 316 | 318 |
| 317 // Ensure they can be found by FTN id. | 319 // Ensure they can be found by FTN id. |
| 318 EXPECT_EQ(root, frame_tree->FindByID(root->frame_tree_node_id())); | 320 EXPECT_EQ(root, frame_tree->FindByID(root->frame_tree_node_id())); |
| 319 EXPECT_EQ(child0, frame_tree->FindByID(child0->frame_tree_node_id())); | 321 EXPECT_EQ(child0, frame_tree->FindByID(child0->frame_tree_node_id())); |
| 320 EXPECT_EQ(child1, frame_tree->FindByID(child1->frame_tree_node_id())); | 322 EXPECT_EQ(child1, frame_tree->FindByID(child1->frame_tree_node_id())); |
| 321 EXPECT_EQ(child2, frame_tree->FindByID(child2->frame_tree_node_id())); | 323 EXPECT_EQ(child2, frame_tree->FindByID(child2->frame_tree_node_id())); |
| 322 EXPECT_EQ(grandchild, frame_tree->FindByID(grandchild->frame_tree_node_id())); | 324 EXPECT_EQ(grandchild, frame_tree->FindByID(grandchild->frame_tree_node_id())); |
| 323 EXPECT_EQ(nullptr, frame_tree->FindByID(-1)); | 325 EXPECT_EQ(nullptr, frame_tree->FindByID(-1)); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 340 EXPECT_EQ(nullptr, frame_tree->FindByName("no such frame")); | 342 EXPECT_EQ(nullptr, frame_tree->FindByName("no such frame")); |
| 341 } | 343 } |
| 342 | 344 |
| 343 // Check that PreviousSibling() is retrieved correctly. | 345 // Check that PreviousSibling() is retrieved correctly. |
| 344 TEST_F(FrameTreeTest, PreviousSibling) { | 346 TEST_F(FrameTreeTest, PreviousSibling) { |
| 345 main_test_rfh()->InitializeRenderFrameIfNeeded(); | 347 main_test_rfh()->InitializeRenderFrameIfNeeded(); |
| 346 | 348 |
| 347 // Add a few child frames to the main frame. | 349 // Add a few child frames to the main frame. |
| 348 FrameTree* frame_tree = contents()->GetFrameTree(); | 350 FrameTree* frame_tree = contents()->GetFrameTree(); |
| 349 FrameTreeNode* root = frame_tree->root(); | 351 FrameTreeNode* root = frame_tree->root(); |
| 350 main_test_rfh()->OnCreateChildFrame(22, blink::WebTreeScopeType::Document, | 352 main_test_rfh()->OnCreateChildFrame( |
| 351 "child0", blink::WebSandboxFlags::None, | 353 22, blink::WebTreeScopeType::Document, "child0", "uniqueName0", |
| 352 blink::WebFrameOwnerProperties()); | 354 blink::WebSandboxFlags::None, blink::WebFrameOwnerProperties()); |
| 353 main_test_rfh()->OnCreateChildFrame(23, blink::WebTreeScopeType::Document, | 355 main_test_rfh()->OnCreateChildFrame( |
| 354 "child1", blink::WebSandboxFlags::None, | 356 23, blink::WebTreeScopeType::Document, "child1", "uniqueName1", |
| 355 blink::WebFrameOwnerProperties()); | 357 blink::WebSandboxFlags::None, blink::WebFrameOwnerProperties()); |
| 356 main_test_rfh()->OnCreateChildFrame(24, blink::WebTreeScopeType::Document, | 358 main_test_rfh()->OnCreateChildFrame( |
| 357 "child2", blink::WebSandboxFlags::None, | 359 24, blink::WebTreeScopeType::Document, "child2", "uniqueName2", |
| 358 blink::WebFrameOwnerProperties()); | 360 blink::WebSandboxFlags::None, blink::WebFrameOwnerProperties()); |
| 359 FrameTreeNode* child0 = root->child_at(0); | 361 FrameTreeNode* child0 = root->child_at(0); |
| 360 FrameTreeNode* child1 = root->child_at(1); | 362 FrameTreeNode* child1 = root->child_at(1); |
| 361 FrameTreeNode* child2 = root->child_at(2); | 363 FrameTreeNode* child2 = root->child_at(2); |
| 362 | 364 |
| 363 // Add one grandchild frame. | 365 // Add one grandchild frame. |
| 364 child1->current_frame_host()->OnCreateChildFrame( | 366 child1->current_frame_host()->OnCreateChildFrame( |
| 365 33, blink::WebTreeScopeType::Document, "grandchild", | 367 33, blink::WebTreeScopeType::Document, "grandchild", "uniqueName3", |
| 366 blink::WebSandboxFlags::None, blink::WebFrameOwnerProperties()); | 368 blink::WebSandboxFlags::None, blink::WebFrameOwnerProperties()); |
| 367 FrameTreeNode* grandchild = child1->child_at(0); | 369 FrameTreeNode* grandchild = child1->child_at(0); |
| 368 | 370 |
| 369 EXPECT_EQ(nullptr, root->PreviousSibling()); | 371 EXPECT_EQ(nullptr, root->PreviousSibling()); |
| 370 EXPECT_EQ(nullptr, child0->PreviousSibling()); | 372 EXPECT_EQ(nullptr, child0->PreviousSibling()); |
| 371 EXPECT_EQ(child0, child1->PreviousSibling()); | 373 EXPECT_EQ(child0, child1->PreviousSibling()); |
| 372 EXPECT_EQ(child1, child2->PreviousSibling()); | 374 EXPECT_EQ(child1, child2->PreviousSibling()); |
| 373 EXPECT_EQ(nullptr, grandchild->PreviousSibling()); | 375 EXPECT_EQ(nullptr, grandchild->PreviousSibling()); |
| 374 } | 376 } |
| 375 | 377 |
| 376 // Do some simple manipulations of the frame tree, making sure that | 378 // Do some simple manipulations of the frame tree, making sure that |
| 377 // WebContentsObservers see a consistent view of the tree as we go. | 379 // WebContentsObservers see a consistent view of the tree as we go. |
| 378 TEST_F(FrameTreeTest, ObserverWalksTreeDuringFrameCreation) { | 380 TEST_F(FrameTreeTest, ObserverWalksTreeDuringFrameCreation) { |
| 379 TreeWalkingWebContentsLogger activity(contents()); | 381 TreeWalkingWebContentsLogger activity(contents()); |
| 380 contents()->NavigateAndCommit(GURL("http://www.google.com")); | 382 contents()->NavigateAndCommit(GURL("http://www.google.com")); |
| 381 EXPECT_EQ("RenderFrameCreated(2) -> 2: []", activity.GetLog()); | 383 EXPECT_EQ("RenderFrameCreated(2) -> 2: []", activity.GetLog()); |
| 382 | 384 |
| 383 FrameTree* frame_tree = contents()->GetFrameTree(); | 385 FrameTree* frame_tree = contents()->GetFrameTree(); |
| 384 FrameTreeNode* root = frame_tree->root(); | 386 FrameTreeNode* root = frame_tree->root(); |
| 385 | 387 |
| 386 // Simulate attaching a series of frames to build the frame tree. | 388 // Simulate attaching a series of frames to build the frame tree. |
| 387 main_test_rfh()->OnCreateChildFrame(14, blink::WebTreeScopeType::Document, | 389 main_test_rfh()->OnCreateChildFrame( |
| 388 std::string(), | 390 14, blink::WebTreeScopeType::Document, std::string(), "uniqueName0", |
| 389 blink::WebSandboxFlags::None, | 391 blink::WebSandboxFlags::None, blink::WebFrameOwnerProperties()); |
| 390 blink::WebFrameOwnerProperties()); | |
| 391 EXPECT_EQ( | 392 EXPECT_EQ( |
| 392 "RenderFrameHostChanged(new)(14) -> 2: []\n" | 393 "RenderFrameHostChanged(new)(14) -> 2: []\n" |
| 393 "RenderFrameCreated(14) -> 2: [14: []]", | 394 "RenderFrameCreated(14) -> 2: [14: []]", |
| 394 activity.GetLog()); | 395 activity.GetLog()); |
| 395 main_test_rfh()->OnCreateChildFrame(18, blink::WebTreeScopeType::Document, | 396 main_test_rfh()->OnCreateChildFrame( |
| 396 std::string(), | 397 18, blink::WebTreeScopeType::Document, std::string(), "uniqueName1", |
| 397 blink::WebSandboxFlags::None, | 398 blink::WebSandboxFlags::None, blink::WebFrameOwnerProperties()); |
| 398 blink::WebFrameOwnerProperties()); | |
| 399 EXPECT_EQ( | 399 EXPECT_EQ( |
| 400 "RenderFrameHostChanged(new)(18) -> 2: [14: []]\n" | 400 "RenderFrameHostChanged(new)(18) -> 2: [14: []]\n" |
| 401 "RenderFrameCreated(18) -> 2: [14: [], 18: []]", | 401 "RenderFrameCreated(18) -> 2: [14: [], 18: []]", |
| 402 activity.GetLog()); | 402 activity.GetLog()); |
| 403 frame_tree->RemoveFrame(root->child_at(0)); | 403 frame_tree->RemoveFrame(root->child_at(0)); |
| 404 EXPECT_EQ("RenderFrameDeleted(14) -> 2: [18: []]", activity.GetLog()); | 404 EXPECT_EQ("RenderFrameDeleted(14) -> 2: [18: []]", activity.GetLog()); |
| 405 frame_tree->RemoveFrame(root->child_at(0)); | 405 frame_tree->RemoveFrame(root->child_at(0)); |
| 406 EXPECT_EQ("RenderFrameDeleted(18) -> 2: []", activity.GetLog()); | 406 EXPECT_EQ("RenderFrameDeleted(18) -> 2: []", activity.GetLog()); |
| 407 } | 407 } |
| 408 | 408 |
| 409 // Make sure that WebContentsObservers see a consistent view of the tree after | 409 // Make sure that WebContentsObservers see a consistent view of the tree after |
| 410 // recovery from a render process crash. | 410 // recovery from a render process crash. |
| 411 TEST_F(FrameTreeTest, ObserverWalksTreeAfterCrash) { | 411 TEST_F(FrameTreeTest, ObserverWalksTreeAfterCrash) { |
| 412 TreeWalkingWebContentsLogger activity(contents()); | 412 TreeWalkingWebContentsLogger activity(contents()); |
| 413 contents()->NavigateAndCommit(GURL("http://www.google.com")); | 413 contents()->NavigateAndCommit(GURL("http://www.google.com")); |
| 414 EXPECT_EQ("RenderFrameCreated(2) -> 2: []", activity.GetLog()); | 414 EXPECT_EQ("RenderFrameCreated(2) -> 2: []", activity.GetLog()); |
| 415 | 415 |
| 416 main_test_rfh()->OnCreateChildFrame(22, blink::WebTreeScopeType::Document, | 416 main_test_rfh()->OnCreateChildFrame( |
| 417 std::string(), | 417 22, blink::WebTreeScopeType::Document, std::string(), "uniqueName0", |
| 418 blink::WebSandboxFlags::None, | 418 blink::WebSandboxFlags::None, blink::WebFrameOwnerProperties()); |
| 419 blink::WebFrameOwnerProperties()); | |
| 420 EXPECT_EQ( | 419 EXPECT_EQ( |
| 421 "RenderFrameHostChanged(new)(22) -> 2: []\n" | 420 "RenderFrameHostChanged(new)(22) -> 2: []\n" |
| 422 "RenderFrameCreated(22) -> 2: [22: []]", | 421 "RenderFrameCreated(22) -> 2: [22: []]", |
| 423 activity.GetLog()); | 422 activity.GetLog()); |
| 424 main_test_rfh()->OnCreateChildFrame(23, blink::WebTreeScopeType::Document, | 423 main_test_rfh()->OnCreateChildFrame( |
| 425 std::string(), | 424 23, blink::WebTreeScopeType::Document, std::string(), "uniqueName1", |
| 426 blink::WebSandboxFlags::None, | 425 blink::WebSandboxFlags::None, blink::WebFrameOwnerProperties()); |
| 427 blink::WebFrameOwnerProperties()); | |
| 428 EXPECT_EQ( | 426 EXPECT_EQ( |
| 429 "RenderFrameHostChanged(new)(23) -> 2: [22: []]\n" | 427 "RenderFrameHostChanged(new)(23) -> 2: [22: []]\n" |
| 430 "RenderFrameCreated(23) -> 2: [22: [], 23: []]", | 428 "RenderFrameCreated(23) -> 2: [22: [], 23: []]", |
| 431 activity.GetLog()); | 429 activity.GetLog()); |
| 432 | 430 |
| 433 // Crash the renderer | 431 // Crash the renderer |
| 434 main_test_rfh()->GetProcess()->SimulateCrash(); | 432 main_test_rfh()->GetProcess()->SimulateCrash(); |
| 435 EXPECT_EQ( | 433 EXPECT_EQ( |
| 436 "RenderProcessGone -> 2*: [22*: [], 23*: []]\n" | 434 "RenderProcessGone -> 2*: [22*: [], 23*: []]\n" |
| 437 "RenderFrameDeleted(23) -> 2*: [22*: [], 23*: []]\n" | 435 "RenderFrameDeleted(23) -> 2*: [22*: [], 23*: []]\n" |
| 438 "RenderFrameDeleted(22) -> 2*: [22*: [], 23*: []]\n" | 436 "RenderFrameDeleted(22) -> 2*: [22*: [], 23*: []]\n" |
| 439 "RenderFrameDeleted(2) -> 2*: []", | 437 "RenderFrameDeleted(2) -> 2*: []", |
| 440 activity.GetLog()); | 438 activity.GetLog()); |
| 441 } | 439 } |
| 442 | 440 |
| 443 // Ensure that frames are not added to the tree, if the process passed in | 441 // Ensure that frames are not added to the tree, if the process passed in |
| 444 // is different than the process of the parent node. | 442 // is different than the process of the parent node. |
| 445 TEST_F(FrameTreeTest, FailAddFrameWithWrongProcessId) { | 443 TEST_F(FrameTreeTest, FailAddFrameWithWrongProcessId) { |
| 446 contents()->NavigateAndCommit(GURL("http://www.google.com")); | 444 contents()->NavigateAndCommit(GURL("http://www.google.com")); |
| 447 FrameTree* frame_tree = contents()->GetFrameTree(); | 445 FrameTree* frame_tree = contents()->GetFrameTree(); |
| 448 FrameTreeNode* root = frame_tree->root(); | 446 FrameTreeNode* root = frame_tree->root(); |
| 449 int process_id = root->current_frame_host()->GetProcess()->GetID(); | 447 int process_id = root->current_frame_host()->GetProcess()->GetID(); |
| 450 | 448 |
| 451 ASSERT_EQ("2: []", GetTreeState(frame_tree)); | 449 ASSERT_EQ("2: []", GetTreeState(frame_tree)); |
| 452 | 450 |
| 453 // Simulate attaching a frame from mismatched process id. | 451 // Simulate attaching a frame from mismatched process id. |
| 454 ASSERT_FALSE(frame_tree->AddFrame( | 452 ASSERT_FALSE(frame_tree->AddFrame( |
| 455 root, process_id + 1, 1, blink::WebTreeScopeType::Document, std::string(), | 453 root, process_id + 1, 1, blink::WebTreeScopeType::Document, std::string(), |
| 456 blink::WebSandboxFlags::None, blink::WebFrameOwnerProperties())); | 454 "uniqueName0", blink::WebSandboxFlags::None, |
| 455 blink::WebFrameOwnerProperties())); |
| 457 ASSERT_EQ("2: []", GetTreeState(frame_tree)); | 456 ASSERT_EQ("2: []", GetTreeState(frame_tree)); |
| 458 } | 457 } |
| 459 | 458 |
| 460 // Ensure that frames removed while a process has crashed are not preserved in | 459 // Ensure that frames removed while a process has crashed are not preserved in |
| 461 // the global map of id->frame. | 460 // the global map of id->frame. |
| 462 TEST_F(FrameTreeTest, ProcessCrashClearsGlobalMap) { | 461 TEST_F(FrameTreeTest, ProcessCrashClearsGlobalMap) { |
| 463 main_test_rfh()->InitializeRenderFrameIfNeeded(); | 462 main_test_rfh()->InitializeRenderFrameIfNeeded(); |
| 464 | 463 |
| 465 // Add a couple child frames to the main frame. | 464 // Add a couple child frames to the main frame. |
| 466 FrameTreeNode* root = contents()->GetFrameTree()->root(); | 465 FrameTreeNode* root = contents()->GetFrameTree()->root(); |
| 467 | 466 |
| 468 main_test_rfh()->OnCreateChildFrame(22, blink::WebTreeScopeType::Document, | 467 main_test_rfh()->OnCreateChildFrame( |
| 469 std::string(), | 468 22, blink::WebTreeScopeType::Document, std::string(), "uniqueName0", |
| 470 blink::WebSandboxFlags::None, | 469 blink::WebSandboxFlags::None, blink::WebFrameOwnerProperties()); |
| 471 blink::WebFrameOwnerProperties()); | 470 main_test_rfh()->OnCreateChildFrame( |
| 472 main_test_rfh()->OnCreateChildFrame(23, blink::WebTreeScopeType::Document, | 471 23, blink::WebTreeScopeType::Document, std::string(), "uniqueName1", |
| 473 std::string(), | 472 blink::WebSandboxFlags::None, blink::WebFrameOwnerProperties()); |
| 474 blink::WebSandboxFlags::None, | |
| 475 blink::WebFrameOwnerProperties()); | |
| 476 | 473 |
| 477 // Add one grandchild frame. | 474 // Add one grandchild frame. |
| 478 RenderFrameHostImpl* child1_rfh = root->child_at(0)->current_frame_host(); | 475 RenderFrameHostImpl* child1_rfh = root->child_at(0)->current_frame_host(); |
| 479 child1_rfh->OnCreateChildFrame(33, blink::WebTreeScopeType::Document, | 476 child1_rfh->OnCreateChildFrame( |
| 480 std::string(), blink::WebSandboxFlags::None, | 477 33, blink::WebTreeScopeType::Document, std::string(), "uniqueName2", |
| 481 blink::WebFrameOwnerProperties()); | 478 blink::WebSandboxFlags::None, blink::WebFrameOwnerProperties()); |
| 482 | 479 |
| 483 // Ensure they can be found by id. | 480 // Ensure they can be found by id. |
| 484 int id1 = root->child_at(0)->frame_tree_node_id(); | 481 int id1 = root->child_at(0)->frame_tree_node_id(); |
| 485 int id2 = root->child_at(1)->frame_tree_node_id(); | 482 int id2 = root->child_at(1)->frame_tree_node_id(); |
| 486 int id3 = root->child_at(0)->child_at(0)->frame_tree_node_id(); | 483 int id3 = root->child_at(0)->child_at(0)->frame_tree_node_id(); |
| 487 EXPECT_TRUE(FrameTreeNode::GloballyFindByID(id1)); | 484 EXPECT_TRUE(FrameTreeNode::GloballyFindByID(id1)); |
| 488 EXPECT_TRUE(FrameTreeNode::GloballyFindByID(id2)); | 485 EXPECT_TRUE(FrameTreeNode::GloballyFindByID(id2)); |
| 489 EXPECT_TRUE(FrameTreeNode::GloballyFindByID(id3)); | 486 EXPECT_TRUE(FrameTreeNode::GloballyFindByID(id3)); |
| 490 | 487 |
| 491 // Crash the renderer. | 488 // Crash the renderer. |
| 492 main_test_rfh()->GetProcess()->SimulateCrash(); | 489 main_test_rfh()->GetProcess()->SimulateCrash(); |
| 493 | 490 |
| 494 // Ensure they cannot be found by id after the process has crashed. | 491 // Ensure they cannot be found by id after the process has crashed. |
| 495 EXPECT_FALSE(FrameTreeNode::GloballyFindByID(id1)); | 492 EXPECT_FALSE(FrameTreeNode::GloballyFindByID(id1)); |
| 496 EXPECT_FALSE(FrameTreeNode::GloballyFindByID(id2)); | 493 EXPECT_FALSE(FrameTreeNode::GloballyFindByID(id2)); |
| 497 EXPECT_FALSE(FrameTreeNode::GloballyFindByID(id3)); | 494 EXPECT_FALSE(FrameTreeNode::GloballyFindByID(id3)); |
| 498 } | 495 } |
| 499 | 496 |
| 500 } // namespace content | 497 } // namespace content |
| OLD | NEW |