OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "base/macros.h" | 5 #include "base/macros.h" |
6 #include "build/build_config.h" | 6 #include "build/build_config.h" |
7 #include "content/browser/frame_host/frame_tree.h" | 7 #include "content/browser/frame_host/frame_tree.h" |
8 #include "content/browser/frame_host/frame_tree_node.h" | 8 #include "content/browser/frame_host/frame_tree_node.h" |
9 #include "content/browser/renderer_host/render_view_host_impl.h" | 9 #include "content/browser/renderer_host/render_view_host_impl.h" |
10 #include "content/browser/web_contents/web_contents_impl.h" | 10 #include "content/browser/web_contents/web_contents_impl.h" |
(...skipping 27 matching lines...) Expand all Loading... |
38 void SetUpOnMainThread() override { | 38 void SetUpOnMainThread() override { |
39 host_resolver()->AddRule("*", "127.0.0.1"); | 39 host_resolver()->AddRule("*", "127.0.0.1"); |
40 ASSERT_TRUE(embedded_test_server()->Start()); | 40 ASSERT_TRUE(embedded_test_server()->Start()); |
41 SetupCrossSiteRedirector(embedded_test_server()); | 41 SetupCrossSiteRedirector(embedded_test_server()); |
42 } | 42 } |
43 | 43 |
44 protected: | 44 protected: |
45 std::string GetOriginFromRenderer(FrameTreeNode* node) { | 45 std::string GetOriginFromRenderer(FrameTreeNode* node) { |
46 std::string origin; | 46 std::string origin; |
47 EXPECT_TRUE(ExecuteScriptAndExtractString( | 47 EXPECT_TRUE(ExecuteScriptAndExtractString( |
48 node->current_frame_host(), | 48 node, "window.domAutomationController.send(document.origin);", |
49 "window.domAutomationController.send(document.origin);", &origin)); | 49 &origin)); |
50 return origin; | 50 return origin; |
51 } | 51 } |
52 | 52 |
53 private: | 53 private: |
54 DISALLOW_COPY_AND_ASSIGN(FrameTreeBrowserTest); | 54 DISALLOW_COPY_AND_ASSIGN(FrameTreeBrowserTest); |
55 }; | 55 }; |
56 | 56 |
57 // Ensures FrameTree correctly reflects page structure during navigations. | 57 // Ensures FrameTree correctly reflects page structure during navigations. |
58 IN_PROC_BROWSER_TEST_F(FrameTreeBrowserTest, FrameTreeShape) { | 58 IN_PROC_BROWSER_TEST_F(FrameTreeBrowserTest, FrameTreeShape) { |
59 GURL base_url = embedded_test_server()->GetURL("A.com", "/site_isolation/"); | 59 GURL base_url = embedded_test_server()->GetURL("A.com", "/site_isolation/"); |
(...skipping 253 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
313 GURL main_url(embedded_test_server()->GetURL( | 313 GURL main_url(embedded_test_server()->GetURL( |
314 "a.com", "/cross_site_iframe_factory.html?a(b(c))")); | 314 "a.com", "/cross_site_iframe_factory.html?a(b(c))")); |
315 EXPECT_TRUE(NavigateToURL(shell(), main_url)); | 315 EXPECT_TRUE(NavigateToURL(shell(), main_url)); |
316 | 316 |
317 // The root node will initiate the navigation; its grandchild node will be the | 317 // The root node will initiate the navigation; its grandchild node will be the |
318 // target of the navigation. | 318 // target of the navigation. |
319 FrameTreeNode* target = root->child_at(0)->child_at(0); | 319 FrameTreeNode* target = root->child_at(0)->child_at(0); |
320 | 320 |
321 std::string blob_url_string; | 321 std::string blob_url_string; |
322 EXPECT_TRUE(ExecuteScriptAndExtractString( | 322 EXPECT_TRUE(ExecuteScriptAndExtractString( |
323 root->current_frame_host(), | 323 root, |
324 "function receiveMessage(event) {" | 324 "function receiveMessage(event) {" |
325 " document.body.appendChild(document.createTextNode(event.data));" | 325 " document.body.appendChild(document.createTextNode(event.data));" |
326 " domAutomationController.send(event.source.location.href);" | 326 " domAutomationController.send(event.source.location.href);" |
327 "}" | 327 "}" |
328 "window.addEventListener('message', receiveMessage, false);" | 328 "window.addEventListener('message', receiveMessage, false);" |
329 "var blob = new Blob([" | 329 "var blob = new Blob([" |
330 " '<html><body><div>This is blob content.</div><script>" | 330 " '<html><body><div>This is blob content.</div><script>" |
331 " window.parent.parent.postMessage(\"HI\", document.origin);" | 331 " window.parent.parent.postMessage(\"HI\", document.origin);" |
332 " </script></body></html>'], {type: 'text/html'});" | 332 " </script></body></html>'], {type: 'text/html'});" |
333 "var blob_url = URL.createObjectURL(blob);" | 333 "var blob_url = URL.createObjectURL(blob);" |
334 "frames[0][0].location.href = blob_url;", | 334 "frames[0][0].location.href = blob_url;", |
335 &blob_url_string)); | 335 &blob_url_string)); |
336 EXPECT_EQ(GURL(blob_url_string), target->current_url()); | 336 EXPECT_EQ(GURL(blob_url_string), target->current_url()); |
337 EXPECT_EQ(url::kBlobScheme, target->current_url().scheme()); | 337 EXPECT_EQ(url::kBlobScheme, target->current_url().scheme()); |
338 EXPECT_FALSE(target->current_origin().unique()); | 338 EXPECT_FALSE(target->current_origin().unique()); |
339 EXPECT_EQ("a.com", target->current_origin().host()); | 339 EXPECT_EQ("a.com", target->current_origin().host()); |
340 EXPECT_EQ(url::kHttpScheme, target->current_origin().scheme()); | 340 EXPECT_EQ(url::kHttpScheme, target->current_origin().scheme()); |
341 | 341 |
342 std::string document_body; | 342 std::string document_body; |
343 EXPECT_TRUE(ExecuteScriptAndExtractString( | 343 EXPECT_TRUE(ExecuteScriptAndExtractString( |
344 target->current_frame_host(), | 344 target, |
345 "domAutomationController.send(document.body.children[0].innerHTML);", | 345 "domAutomationController.send(document.body.children[0].innerHTML);", |
346 &document_body)); | 346 &document_body)); |
347 EXPECT_EQ("This is blob content.", document_body); | 347 EXPECT_EQ("This is blob content.", document_body); |
348 EXPECT_EQ(reference_tree, FrameTreeVisualizer().DepictFrameTree(root)); | 348 EXPECT_EQ(reference_tree, FrameTreeVisualizer().DepictFrameTree(root)); |
349 } | 349 } |
350 | 350 |
351 IN_PROC_BROWSER_TEST_F(FrameTreeBrowserTest, NavigateChildToAboutBlank) { | 351 IN_PROC_BROWSER_TEST_F(FrameTreeBrowserTest, NavigateChildToAboutBlank) { |
352 GURL main_url(embedded_test_server()->GetURL( | 352 GURL main_url(embedded_test_server()->GetURL( |
353 "a.com", "/cross_site_iframe_factory.html?a(b(c))")); | 353 "a.com", "/cross_site_iframe_factory.html?a(b(c))")); |
354 EXPECT_TRUE(NavigateToURL(shell(), main_url)); | 354 EXPECT_TRUE(NavigateToURL(shell(), main_url)); |
355 WebContentsImpl* contents = | 355 WebContentsImpl* contents = |
356 static_cast<WebContentsImpl*>(shell()->web_contents()); | 356 static_cast<WebContentsImpl*>(shell()->web_contents()); |
357 | 357 |
358 // The leaf node (c.com) will be navigated. Its parent node (b.com) will | 358 // The leaf node (c.com) will be navigated. Its parent node (b.com) will |
359 // initiate the navigation. | 359 // initiate the navigation. |
360 FrameTreeNode* target = | 360 FrameTreeNode* target = |
361 contents->GetFrameTree()->root()->child_at(0)->child_at(0); | 361 contents->GetFrameTree()->root()->child_at(0)->child_at(0); |
362 FrameTreeNode* initiator = target->parent(); | 362 FrameTreeNode* initiator = target->parent(); |
363 | 363 |
364 // Give the target a name. | 364 // Give the target a name. |
365 EXPECT_TRUE( | 365 EXPECT_TRUE(ExecuteScript(target, "window.name = 'target';")); |
366 ExecuteScript(target->current_frame_host(), "window.name = 'target';")); | |
367 | 366 |
368 // Use window.open(about:blank), then poll the document for access. | 367 // Use window.open(about:blank), then poll the document for access. |
369 std::string about_blank_origin; | 368 std::string about_blank_origin; |
370 EXPECT_TRUE(ExecuteScriptAndExtractString( | 369 EXPECT_TRUE(ExecuteScriptAndExtractString( |
371 initiator->current_frame_host(), | 370 initiator, |
372 "var didNavigate = false;" | 371 "var didNavigate = false;" |
373 "var intervalID = setInterval(function() {" | 372 "var intervalID = setInterval(function() {" |
374 " if (!didNavigate) {" | 373 " if (!didNavigate) {" |
375 " didNavigate = true;" | 374 " didNavigate = true;" |
376 " window.open('about:blank', 'target');" | 375 " window.open('about:blank', 'target');" |
377 " }" | 376 " }" |
378 " // Poll the document until it doesn't throw a SecurityError.\n" | 377 " // Poll the document until it doesn't throw a SecurityError.\n" |
379 " try {" | 378 " try {" |
380 " frames[0].document.write('Hi from ' + document.domain);" | 379 " frames[0].document.write('Hi from ' + document.domain);" |
381 " } catch (e) { return; }" | 380 " } catch (e) { return; }" |
382 " clearInterval(intervalID);" | 381 " clearInterval(intervalID);" |
383 " domAutomationController.send(frames[0].document.origin);" | 382 " domAutomationController.send(frames[0].document.origin);" |
384 "}, 16);", | 383 "}, 16);", |
385 &about_blank_origin)); | 384 &about_blank_origin)); |
386 EXPECT_EQ(GURL(url::kAboutBlankURL), target->current_url()); | 385 EXPECT_EQ(GURL(url::kAboutBlankURL), target->current_url()); |
387 EXPECT_EQ(url::kAboutScheme, target->current_url().scheme()); | 386 EXPECT_EQ(url::kAboutScheme, target->current_url().scheme()); |
388 EXPECT_FALSE(target->current_origin().unique()); | 387 EXPECT_FALSE(target->current_origin().unique()); |
389 EXPECT_EQ("b.com", target->current_origin().host()); | 388 EXPECT_EQ("b.com", target->current_origin().host()); |
390 EXPECT_EQ(url::kHttpScheme, target->current_origin().scheme()); | 389 EXPECT_EQ(url::kHttpScheme, target->current_origin().scheme()); |
391 EXPECT_EQ(target->current_origin().Serialize(), about_blank_origin); | 390 EXPECT_EQ(target->current_origin().Serialize(), about_blank_origin); |
392 | 391 |
393 std::string document_body; | 392 std::string document_body; |
394 EXPECT_TRUE(ExecuteScriptAndExtractString( | 393 EXPECT_TRUE(ExecuteScriptAndExtractString( |
395 target->current_frame_host(), | 394 target, "domAutomationController.send(document.body.innerHTML);", |
396 "domAutomationController.send(document.body.innerHTML);", | |
397 &document_body)); | 395 &document_body)); |
398 EXPECT_EQ("Hi from b.com", document_body); | 396 EXPECT_EQ("Hi from b.com", document_body); |
399 } | 397 } |
400 | 398 |
401 // Nested iframes, three origins: A(B(C)). Frame A navigates C to about:blank | 399 // Nested iframes, three origins: A(B(C)). Frame A navigates C to about:blank |
402 // (via window.open). This should wind up in A's origin per the spec. Test fails | 400 // (via window.open). This should wind up in A's origin per the spec. Test fails |
403 // because of http://crbug.com/564292 | 401 // because of http://crbug.com/564292 |
404 IN_PROC_BROWSER_TEST_F(FrameTreeBrowserTest, | 402 IN_PROC_BROWSER_TEST_F(FrameTreeBrowserTest, |
405 DISABLED_NavigateGrandchildToAboutBlank) { | 403 DISABLED_NavigateGrandchildToAboutBlank) { |
406 GURL main_url(embedded_test_server()->GetURL( | 404 GURL main_url(embedded_test_server()->GetURL( |
407 "a.com", "/cross_site_iframe_factory.html?a(b(c))")); | 405 "a.com", "/cross_site_iframe_factory.html?a(b(c))")); |
408 EXPECT_TRUE(NavigateToURL(shell(), main_url)); | 406 EXPECT_TRUE(NavigateToURL(shell(), main_url)); |
409 WebContentsImpl* contents = | 407 WebContentsImpl* contents = |
410 static_cast<WebContentsImpl*>(shell()->web_contents()); | 408 static_cast<WebContentsImpl*>(shell()->web_contents()); |
411 | 409 |
412 // The leaf node (c.com) will be navigated. Its grandparent node (a.com) will | 410 // The leaf node (c.com) will be navigated. Its grandparent node (a.com) will |
413 // initiate the navigation. | 411 // initiate the navigation. |
414 FrameTreeNode* target = | 412 FrameTreeNode* target = |
415 contents->GetFrameTree()->root()->child_at(0)->child_at(0); | 413 contents->GetFrameTree()->root()->child_at(0)->child_at(0); |
416 FrameTreeNode* initiator = target->parent()->parent(); | 414 FrameTreeNode* initiator = target->parent()->parent(); |
417 | 415 |
418 // Give the target a name. | 416 // Give the target a name. |
419 EXPECT_TRUE( | 417 EXPECT_TRUE(ExecuteScript(target, "window.name = 'target';")); |
420 ExecuteScript(target->current_frame_host(), "window.name = 'target';")); | |
421 | 418 |
422 // Use window.open(about:blank), then poll the document for access. | 419 // Use window.open(about:blank), then poll the document for access. |
423 std::string about_blank_origin; | 420 std::string about_blank_origin; |
424 EXPECT_TRUE(ExecuteScriptAndExtractString( | 421 EXPECT_TRUE(ExecuteScriptAndExtractString( |
425 initiator->current_frame_host(), | 422 initiator, |
426 "var didNavigate = false;" | 423 "var didNavigate = false;" |
427 "var intervalID = setInterval(function() {" | 424 "var intervalID = setInterval(function() {" |
428 " if (!didNavigate) {" | 425 " if (!didNavigate) {" |
429 " didNavigate = true;" | 426 " didNavigate = true;" |
430 " window.open('about:blank', 'target');" | 427 " window.open('about:blank', 'target');" |
431 " }" | 428 " }" |
432 " // May raise a SecurityError, that's expected.\n" | 429 " // May raise a SecurityError, that's expected.\n" |
433 " frames[0][0].document.write('Hi from ' + document.domain);" | 430 " frames[0][0].document.write('Hi from ' + document.domain);" |
434 " clearInterval(intervalID);" | 431 " clearInterval(intervalID);" |
435 " domAutomationController.send(frames[0][0].document.origin);" | 432 " domAutomationController.send(frames[0][0].document.origin);" |
436 "}, 16);", | 433 "}, 16);", |
437 &about_blank_origin)); | 434 &about_blank_origin)); |
438 EXPECT_EQ(GURL(url::kAboutBlankURL), target->current_url()); | 435 EXPECT_EQ(GURL(url::kAboutBlankURL), target->current_url()); |
439 EXPECT_EQ(url::kAboutScheme, target->current_url().scheme()); | 436 EXPECT_EQ(url::kAboutScheme, target->current_url().scheme()); |
440 EXPECT_FALSE(target->current_origin().unique()); | 437 EXPECT_FALSE(target->current_origin().unique()); |
441 EXPECT_EQ("a.com", target->current_origin().host()); | 438 EXPECT_EQ("a.com", target->current_origin().host()); |
442 EXPECT_EQ(url::kHttpScheme, target->current_origin().scheme()); | 439 EXPECT_EQ(url::kHttpScheme, target->current_origin().scheme()); |
443 EXPECT_EQ(target->current_origin().Serialize(), about_blank_origin); | 440 EXPECT_EQ(target->current_origin().Serialize(), about_blank_origin); |
444 | 441 |
445 std::string document_body; | 442 std::string document_body; |
446 EXPECT_TRUE(ExecuteScriptAndExtractString( | 443 EXPECT_TRUE(ExecuteScriptAndExtractString( |
447 target->current_frame_host(), | 444 target, "domAutomationController.send(document.body.innerHTML);", |
448 "domAutomationController.send(document.body.innerHTML);", | |
449 &document_body)); | 445 &document_body)); |
450 EXPECT_EQ("Hi from a.com", document_body); | 446 EXPECT_EQ("Hi from a.com", document_body); |
451 } | 447 } |
452 | 448 |
453 // Ensures that iframe with srcdoc is always put in the same origin as its | 449 // Ensures that iframe with srcdoc is always put in the same origin as its |
454 // parent frame. | 450 // parent frame. |
455 IN_PROC_BROWSER_TEST_F(FrameTreeBrowserTest, ChildFrameWithSrcdoc) { | 451 IN_PROC_BROWSER_TEST_F(FrameTreeBrowserTest, ChildFrameWithSrcdoc) { |
456 GURL main_url(embedded_test_server()->GetURL( | 452 GURL main_url(embedded_test_server()->GetURL( |
457 "a.com", "/cross_site_iframe_factory.html?a(b)")); | 453 "a.com", "/cross_site_iframe_factory.html?a(b)")); |
458 EXPECT_TRUE(NavigateToURL(shell(), main_url)); | 454 EXPECT_TRUE(NavigateToURL(shell(), main_url)); |
459 WebContentsImpl* contents = | 455 WebContentsImpl* contents = |
460 static_cast<WebContentsImpl*>(shell()->web_contents()); | 456 static_cast<WebContentsImpl*>(shell()->web_contents()); |
461 FrameTreeNode* root = contents->GetFrameTree()->root(); | 457 FrameTreeNode* root = contents->GetFrameTree()->root(); |
462 EXPECT_EQ(1U, root->child_count()); | 458 EXPECT_EQ(1U, root->child_count()); |
463 | 459 |
464 FrameTreeNode* child = root->child_at(0); | 460 FrameTreeNode* child = root->child_at(0); |
465 std::string frame_origin; | 461 std::string frame_origin; |
466 EXPECT_TRUE(ExecuteScriptAndExtractString( | 462 EXPECT_TRUE(ExecuteScriptAndExtractString( |
467 child->current_frame_host(), | 463 child, "domAutomationController.send(document.origin);", &frame_origin)); |
468 "domAutomationController.send(document.origin);", &frame_origin)); | |
469 EXPECT_TRUE( | 464 EXPECT_TRUE( |
470 child->current_frame_host()->GetLastCommittedOrigin().IsSameOriginWith( | 465 child->current_frame_host()->GetLastCommittedOrigin().IsSameOriginWith( |
471 url::Origin(GURL(frame_origin)))); | 466 url::Origin(GURL(frame_origin)))); |
472 EXPECT_FALSE( | 467 EXPECT_FALSE( |
473 root->current_frame_host()->GetLastCommittedOrigin().IsSameOriginWith( | 468 root->current_frame_host()->GetLastCommittedOrigin().IsSameOriginWith( |
474 url::Origin(GURL(frame_origin)))); | 469 url::Origin(GURL(frame_origin)))); |
475 | 470 |
476 // Create a new iframe with srcdoc and add it to the main frame. It should | 471 // Create a new iframe with srcdoc and add it to the main frame. It should |
477 // be created in the same SiteInstance as the parent. | 472 // be created in the same SiteInstance as the parent. |
478 { | 473 { |
479 std::string script("var f = document.createElement('iframe');" | 474 std::string script("var f = document.createElement('iframe');" |
480 "f.srcdoc = 'some content';" | 475 "f.srcdoc = 'some content';" |
481 "document.body.appendChild(f)"); | 476 "document.body.appendChild(f)"); |
482 TestNavigationObserver observer(shell()->web_contents()); | 477 TestNavigationObserver observer(shell()->web_contents()); |
483 EXPECT_TRUE(ExecuteScript(root->current_frame_host(), script)); | 478 EXPECT_TRUE(ExecuteScript(root, script)); |
484 EXPECT_EQ(2U, root->child_count()); | 479 EXPECT_EQ(2U, root->child_count()); |
485 observer.Wait(); | 480 observer.Wait(); |
486 | 481 |
487 EXPECT_EQ(GURL(url::kAboutBlankURL), root->child_at(1)->current_url()); | 482 EXPECT_EQ(GURL(url::kAboutBlankURL), root->child_at(1)->current_url()); |
488 EXPECT_TRUE(ExecuteScriptAndExtractString( | 483 EXPECT_TRUE(ExecuteScriptAndExtractString( |
489 root->child_at(1)->current_frame_host(), | 484 root->child_at(1), "domAutomationController.send(document.origin);", |
490 "domAutomationController.send(document.origin);", &frame_origin)); | 485 &frame_origin)); |
491 EXPECT_EQ(root->current_frame_host()->GetLastCommittedURL().GetOrigin(), | 486 EXPECT_EQ(root->current_frame_host()->GetLastCommittedURL().GetOrigin(), |
492 GURL(frame_origin)); | 487 GURL(frame_origin)); |
493 EXPECT_NE(child->current_frame_host()->GetLastCommittedURL().GetOrigin(), | 488 EXPECT_NE(child->current_frame_host()->GetLastCommittedURL().GetOrigin(), |
494 GURL(frame_origin)); | 489 GURL(frame_origin)); |
495 } | 490 } |
496 | 491 |
497 // Set srcdoc on the existing cross-site frame. It should navigate the frame | 492 // Set srcdoc on the existing cross-site frame. It should navigate the frame |
498 // back to the origin of the parent. | 493 // back to the origin of the parent. |
499 { | 494 { |
500 std::string script("var f = document.getElementById('child-0');" | 495 std::string script("var f = document.getElementById('child-0');" |
501 "f.srcdoc = 'some content';"); | 496 "f.srcdoc = 'some content';"); |
502 TestNavigationObserver observer(shell()->web_contents()); | 497 TestNavigationObserver observer(shell()->web_contents()); |
503 EXPECT_TRUE(ExecuteScript(root->current_frame_host(), script)); | 498 EXPECT_TRUE(ExecuteScript(root, script)); |
504 observer.Wait(); | 499 observer.Wait(); |
505 | 500 |
506 EXPECT_EQ(GURL(url::kAboutBlankURL), child->current_url()); | 501 EXPECT_EQ(GURL(url::kAboutBlankURL), child->current_url()); |
507 EXPECT_TRUE(ExecuteScriptAndExtractString( | 502 EXPECT_TRUE(ExecuteScriptAndExtractString( |
508 child->current_frame_host(), | 503 child, "domAutomationController.send(document.origin);", |
509 "domAutomationController.send(document.origin);", &frame_origin)); | 504 &frame_origin)); |
510 EXPECT_EQ(root->current_frame_host()->GetLastCommittedURL().GetOrigin(), | 505 EXPECT_EQ(root->current_frame_host()->GetLastCommittedURL().GetOrigin(), |
511 GURL(frame_origin)); | 506 GURL(frame_origin)); |
512 } | 507 } |
513 } | 508 } |
514 | 509 |
515 // Ensure that sandbox flags are correctly set when child frames are created. | 510 // Ensure that sandbox flags are correctly set when child frames are created. |
516 IN_PROC_BROWSER_TEST_F(FrameTreeBrowserTest, SandboxFlagsSetForChildFrames) { | 511 IN_PROC_BROWSER_TEST_F(FrameTreeBrowserTest, SandboxFlagsSetForChildFrames) { |
517 GURL main_url(embedded_test_server()->GetURL("/sandboxed_frames.html")); | 512 GURL main_url(embedded_test_server()->GetURL("/sandboxed_frames.html")); |
518 EXPECT_TRUE(NavigateToURL(shell(), main_url)); | 513 EXPECT_TRUE(NavigateToURL(shell(), main_url)); |
519 | 514 |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
558 EXPECT_TRUE(NavigateToURL(shell(), main_url)); | 553 EXPECT_TRUE(NavigateToURL(shell(), main_url)); |
559 | 554 |
560 // It is safe to obtain the root frame tree node here, as it doesn't change. | 555 // It is safe to obtain the root frame tree node here, as it doesn't change. |
561 FrameTreeNode* root = static_cast<WebContentsImpl*>(shell()->web_contents()) | 556 FrameTreeNode* root = static_cast<WebContentsImpl*>(shell()->web_contents()) |
562 ->GetFrameTree() | 557 ->GetFrameTree() |
563 ->root(); | 558 ->root(); |
564 | 559 |
565 // Open a new window from a subframe. | 560 // Open a new window from a subframe. |
566 ShellAddedObserver new_shell_observer; | 561 ShellAddedObserver new_shell_observer; |
567 GURL popup_url(embedded_test_server()->GetURL("foo.com", "/title1.html")); | 562 GURL popup_url(embedded_test_server()->GetURL("foo.com", "/title1.html")); |
568 EXPECT_TRUE(ExecuteScript(root->child_at(0)->current_frame_host(), | 563 EXPECT_TRUE(ExecuteScript(root->child_at(0), |
569 "window.open('" + popup_url.spec() + "');")); | 564 "window.open('" + popup_url.spec() + "');")); |
570 Shell* new_shell = new_shell_observer.GetShell(); | 565 Shell* new_shell = new_shell_observer.GetShell(); |
571 WebContents* new_contents = new_shell->web_contents(); | 566 WebContents* new_contents = new_shell->web_contents(); |
572 WaitForLoadStop(new_contents); | 567 WaitForLoadStop(new_contents); |
573 | 568 |
574 // Check that the new window's opener points to the correct subframe on | 569 // Check that the new window's opener points to the correct subframe on |
575 // original window. | 570 // original window. |
576 FrameTreeNode* popup_root = | 571 FrameTreeNode* popup_root = |
577 static_cast<WebContentsImpl*>(new_contents)->GetFrameTree()->root(); | 572 static_cast<WebContentsImpl*>(new_contents)->GetFrameTree()->root(); |
578 EXPECT_EQ(root->child_at(0), popup_root->opener()); | 573 EXPECT_EQ(root->child_at(0), popup_root->opener()); |
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
690 | 685 |
691 GURL data_url("data:text/html,foo"); | 686 GURL data_url("data:text/html,foo"); |
692 NavigateFrameToURL(root->child_at(1), data_url); | 687 NavigateFrameToURL(root->child_at(1), data_url); |
693 | 688 |
694 // Navigating to a data URL should set a unique origin. This is represented | 689 // Navigating to a data URL should set a unique origin. This is represented |
695 // as "null" per RFC 6454. | 690 // as "null" per RFC 6454. |
696 EXPECT_EQ(root->child_at(1)->current_origin().Serialize(), "null"); | 691 EXPECT_EQ(root->child_at(1)->current_origin().Serialize(), "null"); |
697 } | 692 } |
698 | 693 |
699 } // namespace content | 694 } // namespace content |
OLD | NEW |