| 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 <stddef.h> | 5 #include <stddef.h> |
| 6 | 6 |
| 7 #include <memory> | 7 #include <memory> |
| 8 #include <utility> | 8 #include <utility> |
| 9 | 9 |
| 10 #include "base/callback.h" | 10 #include "base/callback.h" |
| (...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 245 NavigationCompletedObserver observer( | 245 NavigationCompletedObserver observer( |
| 246 browser()->tab_strip_model()->GetActiveWebContents()); | 246 browser()->tab_strip_model()->GetActiveWebContents()); |
| 247 | 247 |
| 248 ui_test_utils::NavigateToURL(browser(), url); | 248 ui_test_utils::NavigateToURL(browser(), url); |
| 249 | 249 |
| 250 // Wait until the last RenderFrameHosts are deleted. This wait doesn't take | 250 // Wait until the last RenderFrameHosts are deleted. This wait doesn't take |
| 251 // long. | 251 // long. |
| 252 observer.Wait(); | 252 observer.Wait(); |
| 253 } | 253 } |
| 254 | 254 |
| 255 size_t IfExtensionsIsolated(size_t if_enabled, size_t if_disabled) { | |
| 256 return content::AreAllSitesIsolatedForTesting() || | |
| 257 IsIsolateExtensionsEnabled() | |
| 258 ? if_enabled | |
| 259 : if_disabled; | |
| 260 } | |
| 261 | |
| 262 content::WebContents* OpenPopup(content::RenderFrameHost* opener, | 255 content::WebContents* OpenPopup(content::RenderFrameHost* opener, |
| 263 const GURL& url) { | 256 const GURL& url) { |
| 264 content::WindowedNotificationObserver popup_observer( | 257 content::WindowedNotificationObserver popup_observer( |
| 265 chrome::NOTIFICATION_TAB_ADDED, | 258 chrome::NOTIFICATION_TAB_ADDED, |
| 266 content::NotificationService::AllSources()); | 259 content::NotificationService::AllSources()); |
| 267 EXPECT_TRUE(ExecuteScript( | 260 EXPECT_TRUE(ExecuteScript( |
| 268 opener, "window.popup = window.open('" + url.spec() + "')")); | 261 opener, "window.popup = window.open('" + url.spec() + "')")); |
| 269 popup_observer.Wait(); | 262 popup_observer.Wait(); |
| 270 content::WebContents* popup = | 263 content::WebContents* popup = |
| 271 browser()->tab_strip_model()->GetActiveWebContents(); | 264 browser()->tab_strip_model()->GetActiveWebContents(); |
| (...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 522 EXPECT_EQ(0u, pm->GetRenderFrameHostsForExtension(extension2->id()).size()); | 515 EXPECT_EQ(0u, pm->GetRenderFrameHostsForExtension(extension2->id()).size()); |
| 523 | 516 |
| 524 NavigateToURL(embedded_test_server()->GetURL("/two_iframes.html")); | 517 NavigateToURL(embedded_test_server()->GetURL("/two_iframes.html")); |
| 525 EXPECT_EQ(0u, pm->GetAllFrames().size()); | 518 EXPECT_EQ(0u, pm->GetAllFrames().size()); |
| 526 | 519 |
| 527 content::WebContents* tab = | 520 content::WebContents* tab = |
| 528 browser()->tab_strip_model()->GetActiveWebContents(); | 521 browser()->tab_strip_model()->GetActiveWebContents(); |
| 529 | 522 |
| 530 // Tests extension frames in non-extension page. | 523 // Tests extension frames in non-extension page. |
| 531 EXPECT_TRUE(content::NavigateIframeToURL(tab, "frame1", kExt1EmptyUrl)); | 524 EXPECT_TRUE(content::NavigateIframeToURL(tab, "frame1", kExt1EmptyUrl)); |
| 532 EXPECT_EQ(IfExtensionsIsolated(1, 0), | 525 EXPECT_EQ(1u, pm->GetRenderFrameHostsForExtension(extension1->id()).size()); |
| 533 pm->GetRenderFrameHostsForExtension(extension1->id()).size()); | 526 EXPECT_EQ(1u, pm->GetAllFrames().size()); |
| 534 EXPECT_EQ(IfExtensionsIsolated(1, 0), pm->GetAllFrames().size()); | |
| 535 | 527 |
| 536 EXPECT_TRUE(content::NavigateIframeToURL(tab, "frame2", kExt2EmptyUrl)); | 528 EXPECT_TRUE(content::NavigateIframeToURL(tab, "frame2", kExt2EmptyUrl)); |
| 537 EXPECT_EQ(IfExtensionsIsolated(1, 0), | 529 EXPECT_EQ(1u, pm->GetRenderFrameHostsForExtension(extension2->id()).size()); |
| 538 pm->GetRenderFrameHostsForExtension(extension2->id()).size()); | 530 EXPECT_EQ(2u, pm->GetAllFrames().size()); |
| 539 EXPECT_EQ(IfExtensionsIsolated(2, 0), pm->GetAllFrames().size()); | |
| 540 | 531 |
| 541 // Tests non-extension page in extension frame. | 532 // Tests non-extension page in extension frame. |
| 542 NavigateToURL(kExt1TwoFramesUrl); | 533 NavigateToURL(kExt1TwoFramesUrl); |
| 543 // 1 top-level + 2 child frames from Extension 1. | 534 // 1 top-level + 2 child frames from Extension 1. |
| 544 EXPECT_EQ(3u, pm->GetAllFrames().size()); | 535 EXPECT_EQ(3u, pm->GetAllFrames().size()); |
| 545 EXPECT_EQ(3u, pm->GetRenderFrameHostsForExtension(extension1->id()).size()); | 536 EXPECT_EQ(3u, pm->GetRenderFrameHostsForExtension(extension1->id()).size()); |
| 546 EXPECT_EQ(0u, pm->GetRenderFrameHostsForExtension(extension2->id()).size()); | 537 EXPECT_EQ(0u, pm->GetRenderFrameHostsForExtension(extension2->id()).size()); |
| 547 | 538 |
| 548 EXPECT_TRUE(content::NavigateIframeToURL(tab, "frame1", | 539 EXPECT_TRUE(content::NavigateIframeToURL(tab, "frame1", |
| 549 embedded_test_server() | 540 embedded_test_server() |
| 550 ->GetURL("/empty.html"))); | 541 ->GetURL("/empty.html"))); |
| 551 // 1 top-level + 1 child frame from Extension 1. | 542 // 1 top-level + 1 child frame from Extension 1. |
| 552 EXPECT_EQ(2u, pm->GetRenderFrameHostsForExtension(extension1->id()).size()); | 543 EXPECT_EQ(2u, pm->GetRenderFrameHostsForExtension(extension1->id()).size()); |
| 553 EXPECT_EQ(2u, pm->GetAllFrames().size()); | 544 EXPECT_EQ(2u, pm->GetAllFrames().size()); |
| 554 | 545 |
| 555 EXPECT_TRUE(content::NavigateIframeToURL(tab, "frame1", kExt1EmptyUrl)); | 546 EXPECT_TRUE(content::NavigateIframeToURL(tab, "frame1", kExt1EmptyUrl)); |
| 556 // 1 top-level + 2 child frames from Extension 1. | 547 // 1 top-level + 2 child frames from Extension 1. |
| 557 EXPECT_EQ(3u, pm->GetAllFrames().size()); | 548 EXPECT_EQ(3u, pm->GetAllFrames().size()); |
| 558 EXPECT_EQ(3u, pm->GetRenderFrameHostsForExtension(extension1->id()).size()); | 549 EXPECT_EQ(3u, pm->GetRenderFrameHostsForExtension(extension1->id()).size()); |
| 559 | 550 |
| 560 // Load a frame from another extension. | 551 // Load a frame from another extension. |
| 561 EXPECT_TRUE(content::NavigateIframeToURL(tab, "frame1", kExt2EmptyUrl)); | 552 EXPECT_TRUE(content::NavigateIframeToURL(tab, "frame1", kExt2EmptyUrl)); |
| 562 // 1 top-level + 1 child frame from Extension 1, | 553 // 1 top-level + 1 child frame from Extension 1, |
| 563 // 1 child frame from Extension 2. | 554 // 1 child frame from Extension 2. |
| 564 EXPECT_EQ(IfExtensionsIsolated(3, 2), pm->GetAllFrames().size()); | 555 EXPECT_EQ(3u, pm->GetAllFrames().size()); |
| 565 EXPECT_EQ(2u, pm->GetRenderFrameHostsForExtension(extension1->id()).size()); | 556 EXPECT_EQ(2u, pm->GetRenderFrameHostsForExtension(extension1->id()).size()); |
| 566 EXPECT_EQ(IfExtensionsIsolated(1, 0), | 557 EXPECT_EQ(1u, pm->GetRenderFrameHostsForExtension(extension2->id()).size()); |
| 567 pm->GetRenderFrameHostsForExtension(extension2->id()).size()); | |
| 568 | 558 |
| 569 // Destroy all existing frames by navigating to another extension. | 559 // Destroy all existing frames by navigating to another extension. |
| 570 NavigateToURL(extension2->url().Resolve("empty.html")); | 560 NavigateToURL(extension2->url().Resolve("empty.html")); |
| 571 EXPECT_EQ(1u, pm->GetAllFrames().size()); | 561 EXPECT_EQ(1u, pm->GetAllFrames().size()); |
| 572 EXPECT_EQ(0u, pm->GetRenderFrameHostsForExtension(extension1->id()).size()); | 562 EXPECT_EQ(0u, pm->GetRenderFrameHostsForExtension(extension1->id()).size()); |
| 573 EXPECT_EQ(1u, pm->GetRenderFrameHostsForExtension(extension2->id()).size()); | 563 EXPECT_EQ(1u, pm->GetRenderFrameHostsForExtension(extension2->id()).size()); |
| 574 | 564 |
| 575 // Test about:blank and about:srcdoc child frames. | 565 // Test about:blank and about:srcdoc child frames. |
| 576 NavigateToURL(extension2->url().Resolve("srcdoc_iframe.html")); | 566 NavigateToURL(extension2->url().Resolve("srcdoc_iframe.html")); |
| 577 // 1 top-level frame + 1 child frame from Extension 2. | 567 // 1 top-level frame + 1 child frame from Extension 2. |
| (...skipping 27 matching lines...) Expand all Loading... |
| 605 // 1 top-level + 2 child frames from Extension 1, | 595 // 1 top-level + 2 child frames from Extension 1, |
| 606 // 2 child frames in frame1 from Extension 2. | 596 // 2 child frames in frame1 from Extension 2. |
| 607 EXPECT_EQ(5u, pm->GetAllFrames().size()); | 597 EXPECT_EQ(5u, pm->GetAllFrames().size()); |
| 608 EXPECT_EQ(5u, pm->GetRenderFrameHostsForExtension(extension2->id()).size()); | 598 EXPECT_EQ(5u, pm->GetRenderFrameHostsForExtension(extension2->id()).size()); |
| 609 | 599 |
| 610 // The extension frame from the other extension should not be classified as an | 600 // The extension frame from the other extension should not be classified as an |
| 611 // extension (unless out-of-process frames are enabled). | 601 // extension (unless out-of-process frames are enabled). |
| 612 EXPECT_TRUE(content::NavigateIframeToURL(tab, "frame1", kExt1EmptyUrl)); | 602 EXPECT_TRUE(content::NavigateIframeToURL(tab, "frame1", kExt1EmptyUrl)); |
| 613 // 1 top-level + 1 child frames from Extension 2, | 603 // 1 top-level + 1 child frames from Extension 2, |
| 614 // 1 child frame from Extension 1. | 604 // 1 child frame from Extension 1. |
| 615 EXPECT_EQ(IfExtensionsIsolated(3, 2), pm->GetAllFrames().size()); | 605 EXPECT_EQ(3u, pm->GetAllFrames().size()); |
| 616 EXPECT_EQ(IfExtensionsIsolated(1, 0), | 606 EXPECT_EQ(1u, pm->GetRenderFrameHostsForExtension(extension1->id()).size()); |
| 617 pm->GetRenderFrameHostsForExtension(extension1->id()).size()); | |
| 618 EXPECT_EQ(2u, pm->GetRenderFrameHostsForExtension(extension2->id()).size()); | 607 EXPECT_EQ(2u, pm->GetRenderFrameHostsForExtension(extension2->id()).size()); |
| 619 | 608 |
| 620 EXPECT_TRUE(content::NavigateIframeToURL(tab, "frame2", kExt1TwoFramesUrl)); | 609 EXPECT_TRUE(content::NavigateIframeToURL(tab, "frame2", kExt1TwoFramesUrl)); |
| 621 // 1 top-level + 1 child frames from Extension 2, | 610 // 1 top-level + 1 child frames from Extension 2, |
| 622 // 1 child frame + 2 child frames in frame2 from Extension 1. | 611 // 1 child frame + 2 child frames in frame2 from Extension 1. |
| 623 EXPECT_EQ(IfExtensionsIsolated(5, 1), pm->GetAllFrames().size()); | 612 EXPECT_EQ(5u, pm->GetAllFrames().size()); |
| 624 EXPECT_EQ(IfExtensionsIsolated(4, 0), | 613 EXPECT_EQ(4u, pm->GetRenderFrameHostsForExtension(extension1->id()).size()); |
| 625 pm->GetRenderFrameHostsForExtension(extension1->id()).size()); | |
| 626 EXPECT_EQ(1u, pm->GetRenderFrameHostsForExtension(extension2->id()).size()); | 614 EXPECT_EQ(1u, pm->GetRenderFrameHostsForExtension(extension2->id()).size()); |
| 627 | 615 |
| 628 // Crash tab where the top-level frame is an extension frame. | 616 // Crash tab where the top-level frame is an extension frame. |
| 629 content::CrashTab(tab); | 617 content::CrashTab(tab); |
| 630 EXPECT_EQ(0u, pm->GetAllFrames().size()); | 618 EXPECT_EQ(0u, pm->GetAllFrames().size()); |
| 631 EXPECT_EQ(0u, pm->GetRenderFrameHostsForExtension(extension1->id()).size()); | 619 EXPECT_EQ(0u, pm->GetRenderFrameHostsForExtension(extension1->id()).size()); |
| 632 EXPECT_EQ(0u, pm->GetRenderFrameHostsForExtension(extension2->id()).size()); | 620 EXPECT_EQ(0u, pm->GetRenderFrameHostsForExtension(extension2->id()).size()); |
| 633 | 621 |
| 634 // Now load an extension page and a non-extension page... | 622 // Now load an extension page and a non-extension page... |
| 635 ui_test_utils::NavigateToURLWithDisposition( | 623 ui_test_utils::NavigateToURLWithDisposition( |
| 636 browser(), kExt1EmptyUrl, WindowOpenDisposition::NEW_BACKGROUND_TAB, | 624 browser(), kExt1EmptyUrl, WindowOpenDisposition::NEW_BACKGROUND_TAB, |
| 637 ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); | 625 ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); |
| 638 NavigateToURL(embedded_test_server()->GetURL("/two_iframes.html")); | 626 NavigateToURL(embedded_test_server()->GetURL("/two_iframes.html")); |
| 639 EXPECT_EQ(1u, pm->GetAllFrames().size()); | 627 EXPECT_EQ(1u, pm->GetAllFrames().size()); |
| 640 | 628 |
| 641 // ... load an extension frame in the non-extension process | 629 // ... load an extension frame in the non-extension process |
| 642 EXPECT_TRUE(content::NavigateIframeToURL(tab, "frame1", kExt1EmptyUrl)); | 630 EXPECT_TRUE(content::NavigateIframeToURL(tab, "frame1", kExt1EmptyUrl)); |
| 643 EXPECT_EQ(IfExtensionsIsolated(2, 1), | 631 EXPECT_EQ(2u, pm->GetRenderFrameHostsForExtension(extension1->id()).size()); |
| 644 pm->GetRenderFrameHostsForExtension(extension1->id()).size()); | |
| 645 | 632 |
| 646 // ... and take down the tab. The extension process is not part of the tab, | 633 // ... and take down the tab. The extension process is not part of the tab, |
| 647 // so it should be kept alive (minus the frames that died). | 634 // so it should be kept alive (minus the frames that died). |
| 648 content::CrashTab(tab); | 635 content::CrashTab(tab); |
| 649 EXPECT_EQ(1u, pm->GetAllFrames().size()); | 636 EXPECT_EQ(1u, pm->GetAllFrames().size()); |
| 650 EXPECT_EQ(1u, pm->GetRenderFrameHostsForExtension(extension1->id()).size()); | 637 EXPECT_EQ(1u, pm->GetRenderFrameHostsForExtension(extension1->id()).size()); |
| 651 } | 638 } |
| 652 | 639 |
| 653 // Verify correct keepalive count behavior on network request events. | 640 // Verify correct keepalive count behavior on network request events. |
| 654 // Regression test for http://crbug.com/535716. | 641 // Regression test for http://crbug.com/535716. |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 756 // Navigate main tab to a web page with two web iframes. There should be no | 743 // Navigate main tab to a web page with two web iframes. There should be no |
| 757 // extension frames yet. | 744 // extension frames yet. |
| 758 NavigateToURL(embedded_test_server()->GetURL("/two_iframes.html")); | 745 NavigateToURL(embedded_test_server()->GetURL("/two_iframes.html")); |
| 759 ProcessManager* pm = ProcessManager::Get(profile()); | 746 ProcessManager* pm = ProcessManager::Get(profile()); |
| 760 EXPECT_EQ(0u, pm->GetAllFrames().size()); | 747 EXPECT_EQ(0u, pm->GetAllFrames().size()); |
| 761 EXPECT_EQ(0u, pm->GetRenderFrameHostsForExtension(extension->id()).size()); | 748 EXPECT_EQ(0u, pm->GetRenderFrameHostsForExtension(extension->id()).size()); |
| 762 | 749 |
| 763 content::WebContents* tab = | 750 content::WebContents* tab = |
| 764 browser()->tab_strip_model()->GetActiveWebContents(); | 751 browser()->tab_strip_model()->GetActiveWebContents(); |
| 765 | 752 |
| 766 // Navigate first subframe to an extension URL. With --isolate-extensions, | 753 // Navigate first subframe to an extension URL. This will go into a new |
| 767 // this will go into a new extension process. | 754 // extension process. |
| 768 const GURL extension_url(extension->url().Resolve("empty.html")); | 755 const GURL extension_url(extension->url().Resolve("empty.html")); |
| 769 EXPECT_TRUE(content::NavigateIframeToURL(tab, "frame1", extension_url)); | 756 EXPECT_TRUE(content::NavigateIframeToURL(tab, "frame1", extension_url)); |
| 770 EXPECT_EQ(IfExtensionsIsolated(1, 0), | 757 EXPECT_EQ(1u, pm->GetRenderFrameHostsForExtension(extension->id()).size()); |
| 771 pm->GetRenderFrameHostsForExtension(extension->id()).size()); | 758 EXPECT_EQ(1u, pm->GetAllFrames().size()); |
| 772 EXPECT_EQ(IfExtensionsIsolated(1, 0), pm->GetAllFrames().size()); | |
| 773 | 759 |
| 774 content::RenderFrameHost* main_frame = tab->GetMainFrame(); | 760 content::RenderFrameHost* main_frame = tab->GetMainFrame(); |
| 775 content::RenderFrameHost* extension_frame = ChildFrameAt(main_frame, 0); | 761 content::RenderFrameHost* extension_frame = ChildFrameAt(main_frame, 0); |
| 776 | 762 |
| 777 // Validate that permissions have been granted for the extension scheme | 763 // Validate that permissions have been granted for the extension scheme |
| 778 // to the process of the extension iframe. | 764 // to the process of the extension iframe. |
| 779 content::ChildProcessSecurityPolicy* policy = | 765 content::ChildProcessSecurityPolicy* policy = |
| 780 content::ChildProcessSecurityPolicy::GetInstance(); | 766 content::ChildProcessSecurityPolicy::GetInstance(); |
| 781 EXPECT_TRUE(policy->CanRequestURL( | 767 EXPECT_TRUE(policy->CanRequestURL( |
| 782 extension_frame->GetProcess()->GetID(), | 768 extension_frame->GetProcess()->GetID(), |
| 783 GURL("blob:chrome-extension://some-extension-id/some-guid"))); | 769 GURL("blob:chrome-extension://some-extension-id/some-guid"))); |
| 784 EXPECT_TRUE(policy->CanRequestURL( | 770 EXPECT_TRUE(policy->CanRequestURL( |
| 785 main_frame->GetProcess()->GetID(), | 771 main_frame->GetProcess()->GetID(), |
| 786 GURL("blob:chrome-extension://some-extension-id/some-guid"))); | 772 GURL("blob:chrome-extension://some-extension-id/some-guid"))); |
| 787 EXPECT_TRUE(policy->CanRequestURL( | 773 EXPECT_TRUE(policy->CanRequestURL( |
| 788 extension_frame->GetProcess()->GetID(), | 774 extension_frame->GetProcess()->GetID(), |
| 789 GURL("filesystem:chrome-extension://some-extension-id/some-path"))); | 775 GURL("filesystem:chrome-extension://some-extension-id/some-path"))); |
| 790 EXPECT_TRUE(policy->CanRequestURL( | 776 EXPECT_TRUE(policy->CanRequestURL( |
| 791 main_frame->GetProcess()->GetID(), | 777 main_frame->GetProcess()->GetID(), |
| 792 GURL("filesystem:chrome-extension://some-extension-id/some-path"))); | 778 GURL("filesystem:chrome-extension://some-extension-id/some-path"))); |
| 793 EXPECT_TRUE(policy->CanRequestURL( | 779 EXPECT_TRUE(policy->CanRequestURL( |
| 794 extension_frame->GetProcess()->GetID(), | 780 extension_frame->GetProcess()->GetID(), |
| 795 GURL("chrome-extension://some-extension-id/resource.html"))); | 781 GURL("chrome-extension://some-extension-id/resource.html"))); |
| 796 EXPECT_TRUE(policy->CanRequestURL( | 782 EXPECT_TRUE(policy->CanRequestURL( |
| 797 main_frame->GetProcess()->GetID(), | 783 main_frame->GetProcess()->GetID(), |
| 798 GURL("chrome-extension://some-extension-id/resource.html"))); | 784 GURL("chrome-extension://some-extension-id/resource.html"))); |
| 799 | 785 |
| 800 if (IsIsolateExtensionsEnabled()) { | 786 EXPECT_TRUE(policy->CanCommitURL( |
| 801 EXPECT_TRUE(policy->CanCommitURL( | 787 extension_frame->GetProcess()->GetID(), |
| 802 extension_frame->GetProcess()->GetID(), | 788 GURL("blob:chrome-extension://some-extension-id/some-guid"))); |
| 803 GURL("blob:chrome-extension://some-extension-id/some-guid"))); | 789 EXPECT_FALSE(policy->CanCommitURL( |
| 804 EXPECT_FALSE(policy->CanCommitURL( | 790 main_frame->GetProcess()->GetID(), |
| 805 main_frame->GetProcess()->GetID(), | 791 GURL("blob:chrome-extension://some-extension-id/some-guid"))); |
| 806 GURL("blob:chrome-extension://some-extension-id/some-guid"))); | 792 EXPECT_TRUE(policy->CanCommitURL( |
| 807 EXPECT_TRUE(policy->CanCommitURL( | 793 extension_frame->GetProcess()->GetID(), |
| 808 extension_frame->GetProcess()->GetID(), | 794 GURL("chrome-extension://some-extension-id/resource.html"))); |
| 809 GURL("chrome-extension://some-extension-id/resource.html"))); | 795 EXPECT_FALSE(policy->CanCommitURL( |
| 810 EXPECT_FALSE(policy->CanCommitURL( | 796 main_frame->GetProcess()->GetID(), |
| 811 main_frame->GetProcess()->GetID(), | 797 GURL("chrome-extension://some-extension-id/resource.html"))); |
| 812 GURL("chrome-extension://some-extension-id/resource.html"))); | 798 EXPECT_TRUE(policy->CanCommitURL( |
| 813 EXPECT_TRUE(policy->CanCommitURL( | 799 extension_frame->GetProcess()->GetID(), |
| 814 extension_frame->GetProcess()->GetID(), | 800 GURL("filesystem:chrome-extension://some-extension-id/some-path"))); |
| 815 GURL("filesystem:chrome-extension://some-extension-id/some-path"))); | 801 EXPECT_FALSE(policy->CanCommitURL( |
| 816 EXPECT_FALSE(policy->CanCommitURL( | 802 main_frame->GetProcess()->GetID(), |
| 817 main_frame->GetProcess()->GetID(), | 803 GURL("filesystem:chrome-extension://some-extension-id/some-path"))); |
| 818 GURL("filesystem:chrome-extension://some-extension-id/some-path"))); | |
| 819 } | |
| 820 | 804 |
| 821 // Open a new about:blank popup from main frame. This should stay in the web | 805 // Open a new about:blank popup from main frame. This should stay in the web |
| 822 // process. | 806 // process. |
| 823 content::WebContents* popup = | 807 content::WebContents* popup = |
| 824 OpenPopup(main_frame, GURL(url::kAboutBlankURL)); | 808 OpenPopup(main_frame, GURL(url::kAboutBlankURL)); |
| 825 EXPECT_NE(popup, tab); | 809 EXPECT_NE(popup, tab); |
| 826 ASSERT_EQ(2, browser()->tab_strip_model()->count()); | 810 ASSERT_EQ(2, browser()->tab_strip_model()->count()); |
| 827 EXPECT_EQ(IfExtensionsIsolated(1, 0), | 811 EXPECT_EQ(1u, pm->GetRenderFrameHostsForExtension(extension->id()).size()); |
| 828 pm->GetRenderFrameHostsForExtension(extension->id()).size()); | 812 EXPECT_EQ(1u, pm->GetAllFrames().size()); |
| 829 EXPECT_EQ(IfExtensionsIsolated(1, 0), pm->GetAllFrames().size()); | |
| 830 | 813 |
| 831 // Create valid blob and filesystem URLs in the extension's origin. | 814 // Create valid blob and filesystem URLs in the extension's origin. |
| 832 url::Origin extension_origin(extension_frame->GetLastCommittedOrigin()); | 815 url::Origin extension_origin(extension_frame->GetLastCommittedOrigin()); |
| 833 GURL blob_url(CreateBlobURL(extension_frame, "foo")); | 816 GURL blob_url(CreateBlobURL(extension_frame, "foo")); |
| 834 EXPECT_EQ(extension_origin, url::Origin(blob_url)); | 817 EXPECT_EQ(extension_origin, url::Origin(blob_url)); |
| 835 GURL filesystem_url(CreateFileSystemURL(extension_frame, "foo")); | 818 GURL filesystem_url(CreateFileSystemURL(extension_frame, "foo")); |
| 836 EXPECT_EQ(extension_origin, url::Origin(filesystem_url)); | 819 EXPECT_EQ(extension_origin, url::Origin(filesystem_url)); |
| 837 | 820 |
| 838 // Navigate the popup to each nested URL with extension origin. | 821 // Navigate the popup to each nested URL with extension origin. |
| 839 GURL nested_urls[] = {blob_url, filesystem_url}; | 822 GURL nested_urls[] = {blob_url, filesystem_url}; |
| 840 for (size_t i = 0; i < arraysize(nested_urls); i++) { | 823 for (size_t i = 0; i < arraysize(nested_urls); i++) { |
| 841 content::TestNavigationObserver observer(popup); | 824 content::TestNavigationObserver observer(popup); |
| 842 EXPECT_TRUE(ExecuteScript( | 825 EXPECT_TRUE(ExecuteScript( |
| 843 popup, "location.href = '" + nested_urls[i].spec() + "';")); | 826 popup, "location.href = '" + nested_urls[i].spec() + "';")); |
| 844 observer.Wait(); | 827 observer.Wait(); |
| 845 | 828 |
| 846 // This is a top-level navigation that should be blocked since it | 829 // This is a top-level navigation that should be blocked since it |
| 847 // originates from a non-extension process. Ensure that the error page | 830 // originates from a non-extension process. Ensure that the error page |
| 848 // doesn't commit an extension URL or origin. | 831 // doesn't commit an extension URL or origin. |
| 849 EXPECT_NE(nested_urls[i], popup->GetLastCommittedURL()); | 832 EXPECT_NE(nested_urls[i], popup->GetLastCommittedURL()); |
| 850 EXPECT_FALSE(extension_origin.IsSameOriginWith( | 833 EXPECT_FALSE(extension_origin.IsSameOriginWith( |
| 851 popup->GetMainFrame()->GetLastCommittedOrigin())); | 834 popup->GetMainFrame()->GetLastCommittedOrigin())); |
| 852 EXPECT_NE("foo", GetTextContent(popup->GetMainFrame())); | 835 EXPECT_NE("foo", GetTextContent(popup->GetMainFrame())); |
| 853 | 836 |
| 854 EXPECT_EQ(IfExtensionsIsolated(1, 0), | 837 EXPECT_EQ(1u, pm->GetRenderFrameHostsForExtension(extension->id()).size()); |
| 855 pm->GetRenderFrameHostsForExtension(extension->id()).size()); | 838 EXPECT_EQ(1u, pm->GetAllFrames().size()); |
| 856 EXPECT_EQ(IfExtensionsIsolated(1, 0), pm->GetAllFrames().size()); | |
| 857 } | 839 } |
| 858 | 840 |
| 859 // Navigate second subframe to each nested URL from the main frame (i.e., | 841 // Navigate second subframe to each nested URL from the main frame (i.e., |
| 860 // from non-extension process). This should be blocked in | 842 // from non-extension process). This should be blocked. |
| 861 // --isolate-extensions, but allowed without --isolate-extensions due to | |
| 862 // unblessed extension frames. | |
| 863 // | 843 // |
| 864 // TODO(alexmos): This is also temporarily allowed under PlzNavigate, because | 844 // TODO(alexmos): This is also temporarily allowed under PlzNavigate, because |
| 865 // currently this particular blocking happens in | 845 // currently this particular blocking happens in |
| 866 // ChromeContentBrowserClientExtensionsPart::ShouldAllowOpenURL, which isn't | 846 // ChromeContentBrowserClientExtensionsPart::ShouldAllowOpenURL, which isn't |
| 867 // triggered below under PlzNavigate (since there'll be no transfer). Once | 847 // triggered below under PlzNavigate (since there'll be no transfer). Once |
| 868 // the blob/filesystem URL checks in ExtensionNavigationThrottle are updated | 848 // the blob/filesystem URL checks in ExtensionNavigationThrottle are updated |
| 869 // to apply to all frames and not just main frames, the PlzNavigate exception | 849 // to apply to all frames and not just main frames, the PlzNavigate exception |
| 870 // below can be removed. See https://crbug.com/661324. | 850 // below can be removed. See https://crbug.com/661324. |
| 871 for (size_t i = 0; i < arraysize(nested_urls); i++) { | 851 for (size_t i = 0; i < arraysize(nested_urls); i++) { |
| 872 EXPECT_TRUE(content::NavigateIframeToURL(tab, "frame2", nested_urls[i])); | 852 EXPECT_TRUE(content::NavigateIframeToURL(tab, "frame2", nested_urls[i])); |
| 873 content::RenderFrameHost* second_frame = ChildFrameAt(main_frame, 1); | 853 content::RenderFrameHost* second_frame = ChildFrameAt(main_frame, 1); |
| 874 if (IsIsolateExtensionsEnabled() && | 854 if (!content::IsBrowserSideNavigationEnabled()) { |
| 875 !content::IsBrowserSideNavigationEnabled()) { | |
| 876 EXPECT_NE(nested_urls[i], second_frame->GetLastCommittedURL()); | 855 EXPECT_NE(nested_urls[i], second_frame->GetLastCommittedURL()); |
| 877 EXPECT_FALSE(extension_origin.IsSameOriginWith( | 856 EXPECT_FALSE(extension_origin.IsSameOriginWith( |
| 878 second_frame->GetLastCommittedOrigin())); | 857 second_frame->GetLastCommittedOrigin())); |
| 879 EXPECT_NE("foo", GetTextContent(second_frame)); | 858 EXPECT_NE("foo", GetTextContent(second_frame)); |
| 880 EXPECT_EQ(IfExtensionsIsolated(1, 0), | 859 EXPECT_EQ(1u, |
| 881 pm->GetRenderFrameHostsForExtension(extension->id()).size()); | 860 pm->GetRenderFrameHostsForExtension(extension->id()).size()); |
| 882 EXPECT_EQ(IfExtensionsIsolated(1, 0), pm->GetAllFrames().size()); | 861 EXPECT_EQ(1u, pm->GetAllFrames().size()); |
| 883 } else { | 862 } else { |
| 884 EXPECT_EQ(nested_urls[i], second_frame->GetLastCommittedURL()); | 863 EXPECT_EQ(nested_urls[i], second_frame->GetLastCommittedURL()); |
| 885 EXPECT_EQ(extension_origin, second_frame->GetLastCommittedOrigin()); | 864 EXPECT_EQ(extension_origin, second_frame->GetLastCommittedOrigin()); |
| 886 EXPECT_EQ("foo", GetTextContent(second_frame)); | 865 EXPECT_EQ("foo", GetTextContent(second_frame)); |
| 887 EXPECT_EQ(IfExtensionsIsolated(2, 0), | 866 EXPECT_EQ(2u, |
| 888 pm->GetRenderFrameHostsForExtension(extension->id()).size()); | 867 pm->GetRenderFrameHostsForExtension(extension->id()).size()); |
| 889 EXPECT_EQ(IfExtensionsIsolated(2, 0), pm->GetAllFrames().size()); | 868 EXPECT_EQ(2u, pm->GetAllFrames().size()); |
| 890 } | 869 } |
| 891 EXPECT_TRUE( | 870 EXPECT_TRUE( |
| 892 content::NavigateIframeToURL(tab, "frame2", GURL(url::kAboutBlankURL))); | 871 content::NavigateIframeToURL(tab, "frame2", GURL(url::kAboutBlankURL))); |
| 893 } | 872 } |
| 894 } | 873 } |
| 895 | 874 |
| 896 // Test that navigations to blob: and filesystem: URLs with extension origins | 875 // Test that navigations to blob: and filesystem: URLs with extension origins |
| 897 // are allowed when initiated from extension processes. See | 876 // are allowed when initiated from extension processes. See |
| 898 // https://crbug.com/645028 and https://crbug.com/644426. | 877 // https://crbug.com/645028 and https://crbug.com/644426. |
| 899 IN_PROC_BROWSER_TEST_F(ProcessManagerBrowserTest, | 878 IN_PROC_BROWSER_TEST_F(ProcessManagerBrowserTest, |
| (...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1170 | 1149 |
| 1171 // Verify that postMessage to window.opener works. | 1150 // Verify that postMessage to window.opener works. |
| 1172 VerifyPostMessageToOpener(popup->GetMainFrame(), main_frame); | 1151 VerifyPostMessageToOpener(popup->GetMainFrame(), main_frame); |
| 1173 } | 1152 } |
| 1174 | 1153 |
| 1175 // Verify that a web popup created via window.open from an extension subframe | 1154 // Verify that a web popup created via window.open from an extension subframe |
| 1176 // can communicate with the extension page via window.opener. Similar to the | 1155 // can communicate with the extension page via window.opener. Similar to the |
| 1177 // test above, but for subframes. See https://crbug.com/590068. | 1156 // test above, but for subframes. See https://crbug.com/590068. |
| 1178 IN_PROC_BROWSER_TEST_F(ProcessManagerBrowserTest, | 1157 IN_PROC_BROWSER_TEST_F(ProcessManagerBrowserTest, |
| 1179 WebPopupFromExtensionSubframeHasValidOpener) { | 1158 WebPopupFromExtensionSubframeHasValidOpener) { |
| 1180 // This test only makes sense if OOPIFs are enabled for extension subframes. | |
| 1181 if (!IsIsolateExtensionsEnabled()) | |
| 1182 return; | |
| 1183 | |
| 1184 // Create a simple extension without a background page. | 1159 // Create a simple extension without a background page. |
| 1185 const Extension* extension = CreateExtension("Extension", false); | 1160 const Extension* extension = CreateExtension("Extension", false); |
| 1186 embedded_test_server()->ServeFilesFromDirectory(extension->path()); | 1161 embedded_test_server()->ServeFilesFromDirectory(extension->path()); |
| 1187 ASSERT_TRUE(embedded_test_server()->Start()); | 1162 ASSERT_TRUE(embedded_test_server()->Start()); |
| 1188 | 1163 |
| 1189 // Navigate main tab to a web page with a blank iframe. There should be no | 1164 // Navigate main tab to a web page with a blank iframe. There should be no |
| 1190 // extension frames yet. | 1165 // extension frames yet. |
| 1191 NavigateToURL(embedded_test_server()->GetURL("/blank_iframe.html")); | 1166 NavigateToURL(embedded_test_server()->GetURL("/blank_iframe.html")); |
| 1192 ProcessManager* pm = ProcessManager::Get(profile()); | 1167 ProcessManager* pm = ProcessManager::Get(profile()); |
| 1193 EXPECT_EQ(0u, pm->GetAllFrames().size()); | 1168 EXPECT_EQ(0u, pm->GetAllFrames().size()); |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1268 GURL b_url(embedded_test_server()->GetURL("b.com", "/empty.html")); | 1243 GURL b_url(embedded_test_server()->GetURL("b.com", "/empty.html")); |
| 1269 EXPECT_TRUE(content::NavigateIframeToURL(tab, "frame0", b_url)); | 1244 EXPECT_TRUE(content::NavigateIframeToURL(tab, "frame0", b_url)); |
| 1270 { | 1245 { |
| 1271 content::RenderFrameHost* subframe = ChildFrameAt(main_frame, 0); | 1246 content::RenderFrameHost* subframe = ChildFrameAt(main_frame, 0); |
| 1272 EXPECT_EQ(subframe->GetProcess(), main_frame->GetProcess()); | 1247 EXPECT_EQ(subframe->GetProcess(), main_frame->GetProcess()); |
| 1273 EXPECT_EQ(subframe->GetSiteInstance(), main_frame->GetSiteInstance()); | 1248 EXPECT_EQ(subframe->GetSiteInstance(), main_frame->GetSiteInstance()); |
| 1274 } | 1249 } |
| 1275 } | 1250 } |
| 1276 | 1251 |
| 1277 } // namespace extensions | 1252 } // namespace extensions |
| OLD | NEW |