Swap processes on reload if a hosted app has been installed/uninstalled.
Also ensure the task manager only shows "App" if the process is an app process.

BUG=80621
TEST=AppApiTest.ReloadIntoAppProcess
TEST=TaskManagerBrowserTest.NoticeHostedAppTabs

Review URL: http://codereview.chromium.org/7063015

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@86566 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/chrome/browser/extensions/app_process_apitest.cc b/chrome/browser/extensions/app_process_apitest.cc
index 7467c04..381fd49b 100644
--- a/chrome/browser/extensions/app_process_apitest.cc
+++ b/chrome/browser/extensions/app_process_apitest.cc
@@ -189,3 +189,53 @@
   EXPECT_EQ(host->process(),
             browser()->GetTabContentsAt(2)->render_view_host()->process());
 }
+
+// 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);
+
+  host_resolver()->AddRule("*", "127.0.0.1");
+  ASSERT_TRUE(test_server()->Start());
+
+  // The app under test acts on URLs whose host is "localhost",
+  // so the URLs we navigate to must have host "localhost".
+  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/app_process/");
+  base_url = base_url.ReplaceComponents(replace_host);
+
+  // Load an app URL before loading the app.
+  ui_test_utils::NavigateToURL(browser(), base_url.Resolve("path1/empty.html"));
+  TabContents* contents = browser()->GetTabContentsAt(0);
+  EXPECT_FALSE(contents->render_view_host()->process()->is_extension_process());
+
+  // Load app and reload page.
+  const Extension* app =
+      LoadExtension(test_data_dir_.AppendASCII("app_process"));
+  ASSERT_TRUE(app);
+  ui_test_utils::NavigateToURL(browser(), base_url.Resolve("path1/empty.html"));
+  EXPECT_TRUE(contents->render_view_host()->process()->is_extension_process());
+
+  // Disable app and reload page.
+  DisableExtension(app->id());
+  ui_test_utils::NavigateToURL(browser(), base_url.Resolve("path1/empty.html"));
+  EXPECT_FALSE(contents->render_view_host()->process()->is_extension_process());
+
+  // Enable app and reload via JavaScript.
+  EnableExtension(app->id());
+  ASSERT_TRUE(ui_test_utils::ExecuteJavaScript(contents->render_view_host(),
+                                               L"", L"location.reload();"));
+  ui_test_utils::WaitForNavigation(&contents->controller());
+  EXPECT_TRUE(contents->render_view_host()->process()->is_extension_process());
+
+  // Disable app and reload via JavaScript.
+  DisableExtension(app->id());
+  ASSERT_TRUE(ui_test_utils::ExecuteJavaScript(contents->render_view_host(),
+                                               L"", L"location.reload();"));
+  ui_test_utils::WaitForNavigation(&contents->controller());
+  EXPECT_FALSE(contents->render_view_host()->process()->is_extension_process());
+}