Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(5428)

Unified Diff: chrome/browser/extensions/process_management_browsertest.cc

Issue 2739193004: Check for already existing entry when adding to SiteProcessMap. (Closed)
Patch Set: Fix. Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/extensions/process_management_browsertest.cc
diff --git a/chrome/browser/extensions/process_management_browsertest.cc b/chrome/browser/extensions/process_management_browsertest.cc
index 012fb553d0cf27c65aba7a9f90c980fe9cedae4e..57b03120acf465aa54010b231b32b9fd0462583c 100644
--- a/chrome/browser/extensions/process_management_browsertest.cc
+++ b/chrome/browser/extensions/process_management_browsertest.cc
@@ -6,16 +6,19 @@
#include "base/strings/utf_string_conversions.h"
#include "build/build_config.h"
+#include "chrome/browser/chrome_notification_types.h"
#include "chrome/browser/extensions/extension_apitest.h"
#include "chrome/browser/extensions/extension_service.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/profiles/profile_manager.h"
+#include "chrome/browser/sessions/session_tab_helper.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "chrome/common/chrome_switches.h"
#include "chrome/common/extensions/extension_process_policy.h"
#include "chrome/common/url_constants.h"
#include "chrome/test/base/ui_test_utils.h"
+#include "content/public/browser/notification_service.h"
#include "content/public/browser/render_frame_host.h"
#include "content/public/browser/render_process_host.h"
#include "content/public/browser/render_view_host.h"
@@ -390,3 +393,80 @@ IN_PROC_BROWSER_TEST_F(ChromeWebStoreProcessTest,
// Verify that Chrome Web Store is isolated in a separate renderer process.
EXPECT_NE(old_process_host, new_process_host);
}
+
+// This test verifies that blocked navigations to extensions pages do not
+// overwrite process-per-site map inside content/.
+IN_PROC_BROWSER_TEST_F(ExtensionBrowserTest,
+ NavigateToBlockedExtensionPageInNewTab) {
+ host_resolver()->AddRule("*", "127.0.0.1");
+ ASSERT_TRUE(embedded_test_server()->Start());
+
+ // Load an extension, which will block a request for a specifig page in it.
Devlin 2017/03/11 01:52:17 *specific
nasko 2017/03/13 17:22:03 Done.
+ const extensions::Extension* extension =
+ LoadExtension(test_data_dir_.AppendASCII("web_request_blocking"));
+ ASSERT_TRUE(extension);
+
+ WebContents* web_contents =
+ browser()->tab_strip_model()->GetActiveWebContents();
+ WebContents* new_web_contents = nullptr;
+ GURL blocked_url(extension->GetResourceURL("/blocked.html"));
+
+ // Navigating to the blocked extension URL should be done through a redirect,
+ // otherwise it will result in an OpenURL IPC from the renderer process, which
+ // will initiate a navigation through the browser process.
+ GURL redirect_url(
+ embedded_test_server()->GetURL("/server-redirect?" + blocked_url.spec()));
+
+ // Navigate the current tab to the test page in the extension, which will
+ // create the extension process and register the webRequest blocking listener.
+ {
+ content::TestNavigationObserver observer(web_contents);
Devlin 2017/03/11 01:52:17 Doesn't NavigateToURL by default block until navig
nasko 2017/03/13 17:22:03 Good point :). I had so many iterations of this co
+ ui_test_utils::NavigateToURL(browser(),
+ extension->GetResourceURL("/test.html"));
+ observer.Wait();
+ }
+
+ // Open a new tab to about:blank, which will result in a new SiteInstance
+ // without an explicit site set.
+ {
+ content::WindowedNotificationObserver tab_added_observer(
+ chrome::NOTIFICATION_TAB_ADDED,
+ content::NotificationService::AllSources());
+ EXPECT_TRUE(content::ExecuteScript(
+ web_contents, "chrome.tabs.create({url: 'about:blank'});"));
Devlin 2017/03/11 01:52:18 Does this have to be done through the extension AP
nasko 2017/03/13 17:22:03 I was trying to mimic as closely what I observed.
+ tab_added_observer.Wait();
+ new_web_contents = browser()->tab_strip_model()->GetActiveWebContents();
+
+ // If the navigation hasn't committed yet, the test needs to wait for it.
+ if (new_web_contents->GetLastCommittedURL() != GURL(url::kAboutBlankURL)) {
Devlin 2017/03/11 01:52:17 The above might also solve this, since NavigateToU
nasko 2017/03/13 17:22:03 Done.
+ content::TestNavigationObserver observer(new_web_contents);
+ observer.Wait();
+ }
+ }
+
+ // Navigate the new tab to an extension URL that will be blocked by
+ // webRequest.
+ {
+ std::string script = base::StringPrintf("location.href = '%s';",
+ redirect_url.spec().c_str());
+ content::TestNavigationObserver observer(new_web_contents);
+ EXPECT_TRUE(content::ExecuteScript(new_web_contents, script));
Devlin 2017/03/11 01:52:17 Same question - does this need to be through Execu
nasko 2017/03/13 17:22:03 This needs to be a renderer initiated navigation a
+ observer.Wait();
+
+ EXPECT_EQ(observer.last_navigation_url(), blocked_url);
+ EXPECT_FALSE(observer.last_navigation_succeeded());
+ }
+
+ // Very subtle check for content/ internal functionality :(.
+ // When a navigation is blocked, it still commits an error page. Since
+ // extensions use the process-per-site model, each extension URL is registered
Devlin 2017/03/11 01:52:17 nit: process-per-extension? process-per-origin?
nasko 2017/03/13 17:22:03 Our codebase and docs already talk about process-p
+ // in a map from URL to a process. Creating a brand new SiteInstance for the
+ // extension URL should always result in a SiteInstance that has a process and
+ // the process is the same for all SiteInstances.
+ scoped_refptr<content::SiteInstance> new_site_instance =
+ content::SiteInstance::CreateForURL(web_contents->GetBrowserContext(),
+ extension->GetResourceURL(""));
Devlin 2017/03/11 01:52:17 nit: extension->url()
nasko 2017/03/13 17:22:03 Done.
+ EXPECT_TRUE(new_site_instance->HasProcess());
+ EXPECT_EQ(new_site_instance->GetProcess(),
+ web_contents->GetSiteInstance()->GetProcess());
+}

Powered by Google App Engine
This is Rietveld 408576698