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