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

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

Issue 9508008: Allow apps with background pages to request process-per-app-instance. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Clean up tests. Created 8 years, 10 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
« no previous file with comments | « chrome/browser/extensions/app_background_page_apitest.cc ('k') | chrome/common/extensions/extension.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/extensions/app_process_apitest.cc
diff --git a/chrome/browser/extensions/app_process_apitest.cc b/chrome/browser/extensions/app_process_apitest.cc
index 7f670458ccb2b0ed076b4e6a75a8fa15f68c332f..7192af277844fb61ffb38efb4b2a820650dd6c0e 100644
--- a/chrome/browser/extensions/app_process_apitest.cc
+++ b/chrome/browser/extensions/app_process_apitest.cc
@@ -28,21 +28,6 @@
using content::NavigationController;
using content::WebContents;
-class AppApiTest : public ExtensionApiTest {
- protected:
- // Gets the base URL for files for a specific test, making sure that it uses
- // "localhost" as the hostname, since that is what the extent is declared
- // as in the test apps manifests.
- GURL GetTestBaseURL(std::string test_directory) {
- GURL::Replacements replace_host;
- std::string host_str("localhost"); // must stay in scope with replace_host
- replace_host.SetHostStr(host_str);
- GURL base_url = test_server()->GetURL(
- "files/extensions/api_test/" + test_directory + "/");
- return base_url.ReplaceComponents(replace_host);
- }
-};
-
// Simulates a page calling window.open on an URL, and waits for the navigation.
static void WindowOpenHelper(Browser* browser,
RenderViewHost* opener_host,
@@ -87,12 +72,97 @@ static void NavigateTabHelper(WebContents* contents, const GURL& url) {
EXPECT_EQ(url, contents->GetController().GetLastCommittedEntry()->GetURL());
}
+class AppApiTest : public ExtensionApiTest {
+ protected:
+ // Gets the base URL for files for a specific test, making sure that it uses
+ // "localhost" as the hostname, since that is what the extent is declared
+ // as in the test apps manifests.
+ GURL GetTestBaseURL(std::string test_directory) {
+ GURL::Replacements replace_host;
+ std::string host_str("localhost"); // must stay in scope with replace_host
+ replace_host.SetHostStr(host_str);
+ GURL base_url = test_server()->GetURL(
+ "files/extensions/api_test/" + test_directory + "/");
+ return base_url.ReplaceComponents(replace_host);
+ }
+
+ // Pass flags to make testing apps easier.
+ void SetUpCommandLine(CommandLine* command_line) {
+ ExtensionApiTest::SetUpCommandLine(command_line);
+ CommandLine::ForCurrentProcess()->AppendSwitch(
+ switches::kDisablePopupBlocking);
+ CommandLine::ForCurrentProcess()->AppendSwitch(
+ switches::kAllowHTTPBackgroundPage);
+ }
+
+ // Helper function to test that independent tabs of the named app are loaded
+ // into separate processes.
+ void TestAppInstancesHelper(std::string app_name) {
+ LOG(INFO) << "Start of test.";
+
+ extensions::ProcessMap* process_map =
+ browser()->profile()->GetExtensionService()->process_map();
+
+ host_resolver()->AddRule("*", "127.0.0.1");
+ ASSERT_TRUE(test_server()->Start());
+
+ ASSERT_TRUE(LoadExtension(
+ test_data_dir_.AppendASCII(app_name)));
+
+ // Open two tabs in the app, one outside it.
+ GURL base_url = GetTestBaseURL(app_name);
+
+ // Test both opening a URL in a new tab, and opening a tab and then
+ // navigating it. Either way, app tabs should be considered extension
+ // processes, but they have no elevated privileges and thus should not
+ // have WebUI bindings.
+ ui_test_utils::NavigateToURLWithDisposition(
+ browser(), base_url.Resolve("path1/empty.html"), NEW_FOREGROUND_TAB,
+ ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
+ LOG(INFO) << "Nav 1.";
+ EXPECT_TRUE(process_map->Contains(
+ browser()->GetWebContentsAt(1)->GetRenderProcessHost()->GetID()));
+ EXPECT_FALSE(browser()->GetWebContentsAt(1)->GetWebUI());
+
+ ui_test_utils::WindowedNotificationObserver tab_added_observer(
+ content::NOTIFICATION_TAB_ADDED,
+ content::NotificationService::AllSources());
+ browser()->NewTab();
+ tab_added_observer.Wait();
+ LOG(INFO) << "New tab.";
+ ui_test_utils::NavigateToURL(browser(),
+ base_url.Resolve("path2/empty.html"));
+ LOG(INFO) << "Nav 2.";
+ EXPECT_TRUE(process_map->Contains(
+ browser()->GetWebContentsAt(2)->GetRenderProcessHost()->GetID()));
+ EXPECT_FALSE(browser()->GetWebContentsAt(2)->GetWebUI());
+
+ // We should have opened 2 new extension tabs. Including the original blank
+ // tab, we now have 3 tabs. The two app tabs should not be in the same
+ // process, since they do not have the background permission. (Thus, we
+ // want to separate them to improve responsiveness.)
+ ASSERT_EQ(3, browser()->tab_count());
+ RenderViewHost* host1 = browser()->GetWebContentsAt(1)->GetRenderViewHost();
+ RenderViewHost* host2 = browser()->GetWebContentsAt(2)->GetRenderViewHost();
+ EXPECT_NE(host1->process(), host2->process());
+
+ // Opening tabs with window.open should keep the page in the opener's
+ // process.
+ ASSERT_EQ(1u, BrowserList::GetBrowserCount(browser()->profile()));
+ WindowOpenHelper(browser(), host1,
+ base_url.Resolve("path1/empty.html"), true);
+ LOG(INFO) << "WindowOpenHelper 1.";
+ WindowOpenHelper(browser(), host2,
+ base_url.Resolve("path2/empty.html"), true);
+ LOG(INFO) << "End of test.";
+ }
+};
+
+// Tests that hosted apps with the background permission get a process-per-app
+// model, since all pages need to be able to script the background page.
IN_PROC_BROWSER_TEST_F(AppApiTest, AppProcess) {
LOG(INFO) << "Start of test.";
- CommandLine::ForCurrentProcess()->AppendSwitch(
- switches::kDisablePopupBlocking);
-
extensions::ProcessMap* process_map =
browser()->profile()->GetExtensionService()->process_map();
@@ -200,71 +270,19 @@ IN_PROC_BROWSER_TEST_F(AppApiTest, AppProcess) {
// Test that hosted apps without the background permission use a process per app
// instance model, such that separate instances are in separate processes.
IN_PROC_BROWSER_TEST_F(AppApiTest, AppProcessInstances) {
- LOG(INFO) << "Start of test.";
-
- CommandLine::ForCurrentProcess()->AppendSwitch(
- switches::kDisablePopupBlocking);
-
- extensions::ProcessMap* process_map =
- browser()->profile()->GetExtensionService()->process_map();
-
- host_resolver()->AddRule("*", "127.0.0.1");
- ASSERT_TRUE(test_server()->Start());
-
- ASSERT_TRUE(LoadExtension(
- test_data_dir_.AppendASCII("app_process_instances")));
-
- // Open two tabs in the app, one outside it.
- GURL base_url = GetTestBaseURL("app_process_instances");
-
- // Test both opening a URL in a new tab, and opening a tab and then navigating
- // it. Either way, app tabs should be considered extension processes, but
- // they have no elevated privileges and thus should not have WebUI bindings.
- ui_test_utils::NavigateToURLWithDisposition(
- browser(), base_url.Resolve("path1/empty.html"), NEW_FOREGROUND_TAB,
- ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
- LOG(INFO) << "Nav 1.";
- EXPECT_TRUE(process_map->Contains(
- browser()->GetWebContentsAt(1)->GetRenderProcessHost()->GetID()));
- EXPECT_FALSE(browser()->GetWebContentsAt(1)->GetWebUI());
-
- ui_test_utils::WindowedNotificationObserver tab_added_observer(
- content::NOTIFICATION_TAB_ADDED,
- content::NotificationService::AllSources());
- browser()->NewTab();
- tab_added_observer.Wait();
- LOG(INFO) << "New tab.";
- ui_test_utils::NavigateToURL(browser(), base_url.Resolve("path2/empty.html"));
- LOG(INFO) << "Nav 2.";
- EXPECT_TRUE(process_map->Contains(
- browser()->GetWebContentsAt(2)->GetRenderProcessHost()->GetID()));
- EXPECT_FALSE(browser()->GetWebContentsAt(2)->GetWebUI());
-
- // We should have opened 2 new extension tabs. Including the original blank
- // tab, we now have 3 tabs. The two app tabs should not be in the same
- // process, since they do not have the background permission. (Thus, we want
- // to separate them to improve responsiveness.)
- ASSERT_EQ(3, browser()->tab_count());
- RenderViewHost* host1 = browser()->GetWebContentsAt(1)->GetRenderViewHost();
- RenderViewHost* host2 = browser()->GetWebContentsAt(2)->GetRenderViewHost();
- EXPECT_NE(host1->process(), host2->process());
+ TestAppInstancesHelper("app_process_instances");
+}
- // Opening tabs with window.open should keep the page in the opener's process.
- ASSERT_EQ(1u, BrowserList::GetBrowserCount(browser()->profile()));
- WindowOpenHelper(browser(), host1,
- base_url.Resolve("path1/empty.html"), true);
- LOG(INFO) << "WindowOpenHelper 1.";
- WindowOpenHelper(browser(), host2,
- base_url.Resolve("path2/empty.html"), true);
- LOG(INFO) << "End of test.";
+// Test that hosted apps with the background permission but that set
+// allow_js_access to false also use a process per app instance model.
+// Separate instances should be in separate processes.
+IN_PROC_BROWSER_TEST_F(AppApiTest, AppProcessBackgroundInstances) {
+ TestAppInstancesHelper("app_process_background_instances");
}
// Tests that bookmark apps do not use the app process model and are treated
// like normal web pages instead. http://crbug.com/104636.
IN_PROC_BROWSER_TEST_F(AppApiTest, BookmarkAppGetsNormalProcess) {
- CommandLine::ForCurrentProcess()->AppendSwitch(
- switches::kDisablePopupBlocking);
-
ExtensionService* service = browser()->profile()->GetExtensionService();
extensions::ProcessMap* process_map = service->process_map();
@@ -345,9 +363,6 @@ IN_PROC_BROWSER_TEST_F(AppApiTest, BookmarkAppGetsNormalProcess) {
#define MAYBE_AppProcessRedirectBack AppProcessRedirectBack
#endif
IN_PROC_BROWSER_TEST_F(AppApiTest, MAYBE_AppProcessRedirectBack) {
- CommandLine::ForCurrentProcess()->AppendSwitch(
- switches::kDisablePopupBlocking);
-
host_resolver()->AddRule("*", "127.0.0.1");
ASSERT_TRUE(test_server()->Start());
@@ -388,9 +403,6 @@ IN_PROC_BROWSER_TEST_F(AppApiTest, MAYBE_AppProcessRedirectBack) {
// Ensure that reloading a URL after installing or uninstalling it as an app
// correctly swaps the process. (http://crbug.com/80621)
IN_PROC_BROWSER_TEST_F(AppApiTest, ReloadIntoAppProcess) {
- CommandLine::ForCurrentProcess()->AppendSwitch(
- switches::kDisablePopupBlocking);
-
extensions::ProcessMap* process_map =
browser()->profile()->GetExtensionService()->process_map();
@@ -478,9 +490,6 @@ IN_PROC_BROWSER_TEST_F(AppApiTest, ReloadIntoAppProcess) {
// empty.html) results in the new window being in an app process. See
// http://crbug.com/89272 for more details.
IN_PROC_BROWSER_TEST_F(AppApiTest, OpenAppFromIframe) {
- CommandLine::ForCurrentProcess()->AppendSwitch(
- switches::kDisablePopupBlocking);
-
extensions::ProcessMap* process_map =
browser()->profile()->GetExtensionService()->process_map();
@@ -576,9 +585,6 @@ IN_PROC_BROWSER_TEST_F(AppApiTest, OpenAppFromExtension) {
// missing special permissions and should be scriptable from the iframe.
// See http://crbug.com/92669 for more details.
IN_PROC_BROWSER_TEST_F(AppApiTest, OpenWebPopupFromWebIframe) {
- CommandLine::ForCurrentProcess()->AppendSwitch(
- switches::kDisablePopupBlocking);
-
extensions::ProcessMap* process_map =
browser()->profile()->GetExtensionService()->process_map();
« no previous file with comments | « chrome/browser/extensions/app_background_page_apitest.cc ('k') | chrome/common/extensions/extension.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698