diff options
author | jyasskin@chromium.org <jyasskin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-04-17 21:55:36 +0000 |
---|---|---|
committer | jyasskin@chromium.org <jyasskin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-04-17 21:55:36 +0000 |
commit | 3ae0ea1cfccc6c166cfd9531e34f6b0ea8833f82 (patch) | |
tree | c0fd33fb1b2add79a7fb7eebea8dc850199cef87 | |
parent | 80f2011a2e7982572aff821f6085e134f955996d (diff) | |
download | chromium_src-3ae0ea1cfccc6c166cfd9531e34f6b0ea8833f82.zip chromium_src-3ae0ea1cfccc6c166cfd9531e34f6b0ea8833f82.tar.gz chromium_src-3ae0ea1cfccc6c166cfd9531e34f6b0ea8833f82.tar.bz2 |
Merge 261496 "Check the scheme of a RenderViewHost before assumi..."
> Check the scheme of a RenderViewHost before assuming it contains an extension.
>
> Thanks to ncarter for the test!
>
> BUG=357382
>
> Review URL: https://codereview.chromium.org/216113007
TBR=aarya
Review URL: https://codereview.chromium.org/241773002
git-svn-id: svn://svn.chromium.org/chrome/branches/1847/src@264652 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | chrome/browser/extensions/process_manager_browsertest.cc | 57 | ||||
-rw-r--r-- | extensions/browser/process_manager.cc | 15 |
2 files changed, 69 insertions, 3 deletions
diff --git a/chrome/browser/extensions/process_manager_browsertest.cc b/chrome/browser/extensions/process_manager_browsertest.cc index 68efedf..4140ebd 100644 --- a/chrome/browser/extensions/process_manager_browsertest.cc +++ b/chrome/browser/extensions/process_manager_browsertest.cc @@ -7,10 +7,15 @@ #include "chrome/browser/extensions/browser_action_test_util.h" #include "chrome/browser/extensions/extension_browsertest.h" #include "chrome/browser/extensions/extension_service.h" +#include "chrome/browser/ui/tabs/tab_strip_model.h" #include "chrome/test/base/in_process_browser_test.h" +#include "chrome/test/base/ui_test_utils.h" #include "content/public/browser/notification_service.h" +#include "content/public/browser/web_contents.h" #include "content/public/test/test_utils.h" #include "extensions/browser/extension_system.h" +#include "net/dns/mock_host_resolver.h" +#include "net/test/embedded_test_server/embedded_test_server.h" namespace extensions { @@ -102,4 +107,56 @@ IN_PROC_BROWSER_TEST_F(ProcessManagerBrowserTest, EXPECT_EQ(0, pm->GetLazyKeepaliveCount(popup.get())); } +// Content loaded from http://hlogonemlfkgpejgnedahbkiabcdhnnn should not +// interact with an installed extension with that ID. Regression test +// for bug 357382. +IN_PROC_BROWSER_TEST_F(ProcessManagerBrowserTest, HttpHostMatchingExtensionId) { + ProcessManager* pm = ExtensionSystem::Get(profile())->process_manager(); + + // We start with no background hosts. + ASSERT_EQ(0u, pm->background_hosts().size()); + ASSERT_EQ(0u, pm->GetAllViews().size()); + + // Load an extension with a background page. + scoped_refptr<const Extension> extension = + LoadExtension(test_data_dir_.AppendASCII("api_test") + .AppendASCII("browser_action") + .AppendASCII("none")); + + // Set up a test server running at http://[extension-id] + ASSERT_TRUE(extension.get()); + const std::string aliased_host = extension->id(); + host_resolver()->AddRule(aliased_host, "127.0.0.1"); + ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); + GURL url = + embedded_test_server()->GetURL("/extensions/test_file_with_body.html"); + GURL::Replacements replace_host; + replace_host.SetHostStr(aliased_host); + url = url.ReplaceComponents(replace_host); + + // Load a page from the test host in a new tab. + ui_test_utils::NavigateToURLWithDisposition( + browser(), + url, + NEW_FOREGROUND_TAB, + ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); + + // Sanity check that there's no bleeding between the extension and the tab. + content::WebContents* tab_web_contents = + browser()->tab_strip_model()->GetActiveWebContents(); + EXPECT_EQ(url, tab_web_contents->GetVisibleURL()); + EXPECT_TRUE(NULL == pm->GetExtensionForRenderViewHost( + tab_web_contents->GetRenderViewHost())) + << "Non-extension content must not have an associated extension"; + ASSERT_EQ(1u, pm->GetRenderViewHostsForExtension(extension->id()).size()); + content::WebContents* extension_web_contents = + content::WebContents::FromRenderViewHost( + *pm->GetRenderViewHostsForExtension(extension->id()).begin()); + EXPECT_TRUE(extension_web_contents->GetSiteInstance() != + tab_web_contents->GetSiteInstance()); + EXPECT_TRUE(pm->GetSiteInstanceForURL(extension->url()) != + tab_web_contents->GetSiteInstance()); + EXPECT_TRUE(pm->GetBackgroundHostForExtension(extension->id())); +} + } // namespace extensions diff --git a/extensions/browser/process_manager.cc b/extensions/browser/process_manager.cc index 96a8b28..a82a734 100644 --- a/extensions/browser/process_manager.cc +++ b/extensions/browser/process_manager.cc @@ -32,10 +32,12 @@ #include "content/public/browser/web_contents_observer.h" #include "content/public/browser/web_contents_user_data.h" #include "content/public/common/renderer_preferences.h" +#include "content/public/common/url_constants.h" #include "extensions/browser/extension_registry.h" #include "extensions/browser/extension_system.h" #include "extensions/browser/extensions_browser_client.h" #include "extensions/browser/view_type_utils.h" +#include "extensions/common/constants.h" #include "extensions/common/extension.h" #include "extensions/common/manifest_handlers/background_info.h" #include "extensions/common/manifest_handlers/incognito_info.h" @@ -58,11 +60,18 @@ namespace { std::string GetExtensionID(RenderViewHost* render_view_host) { // This works for both apps and extensions because the site has been - // normalized to the extension URL for apps. - if (!render_view_host->GetSiteInstance()) + // normalized to the extension URL for hosted apps. + content::SiteInstance* site_instance = render_view_host->GetSiteInstance(); + if (!site_instance) + return std::string(); + + const GURL& site_url = site_instance->GetSiteURL(); + + if (!site_url.SchemeIs(kExtensionScheme) && + !site_url.SchemeIs(content::kGuestScheme)) return std::string(); - return render_view_host->GetSiteInstance()->GetSiteURL().host(); + return site_url.host(); } std::string GetExtensionIDFromFrame( |