// Copyright 2012 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "base/command_line.h" #include "base/strings/stringprintf.h" #include "build/build_config.h" #include "chrome/browser/extensions/extension_apitest.h" #include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_commands.h" #include "chrome/browser/ui/browser_finder.h" #include "chrome/browser/ui/browser_list.h" #include "chrome/browser/ui/browser_window.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" #include "chrome/browser/ui/view_ids.h" #include "chrome/test/base/ui_test_utils.h" #include "components/blocked_content/popup_blocker_tab_helper.h" #include "components/embedder_support/switches.h" #include "components/sync/model/string_ordinal.h" #include "content/public/browser/navigation_entry.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" #include "content/public/browser/site_instance.h" #include "content/public/browser/web_contents.h" #include "content/public/common/content_features.h" #include "content/public/test/browser_test.h" #include "content/public/test/browser_test_utils.h" #include "content/public/test/test_navigation_observer.h" #include "extensions/browser/extension_host.h" #include "extensions/browser/extension_system.h" #include "extensions/browser/install_flag.h" #include "extensions/browser/process_map.h" #include "extensions/common/extension.h" #include "extensions/common/file_util.h" #include "extensions/common/switches.h" #include "net/dns/mock_host_resolver.h" #include "net/test/embedded_test_server/embedded_test_server.h" NavigationController; RenderViewHost; SiteInstance; WebContents; Extension; class AppApiTest : public extensions::ExtensionApiTest { … }; // Omits the disable-popup-blocking flag so we can cover that case. class BlockedAppApiTest : public AppApiTest { … }; // 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) { … } // 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) { … } // 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) { … } // Tests that app process switching works properly in the following scenario: // 1. navigate to a page1 in the app // 2. page1 redirects to a page2 outside the app extent (ie, "/server-redirect") // 3. page2 redirects back to a page in the app // The final navigation should end up in the app process. // See http://crbug.com/61757 // Flaky. http://crbug.com/341898 IN_PROC_BROWSER_TEST_F(AppApiTest, DISABLED_AppProcessRedirectBack) { … } // Ensure that re-navigating to a URL after installing or uninstalling it as an // app correctly swaps the tab to the app process. (http://crbug.com/80621) // // Fails on Windows. http://crbug.com/238670 // Added logging to help diagnose the location of the problem. IN_PROC_BROWSER_TEST_F(AppApiTest, NavigateIntoAppProcess) { … } // Ensure that reloading a URL after installing or uninstalling it as an app // correctly swaps the tab to the app process. (http://crbug.com/80621) // // Added logging to help diagnose the location of the problem. // http://crbug.com/238670 IN_PROC_BROWSER_TEST_F(AppApiTest, ReloadIntoAppProcess) { … } // Ensure that reloading a URL with JavaScript after installing or uninstalling // it as an app correctly swaps the process. (http://crbug.com/80621) // // Crashes on Windows and Mac. http://crbug.com/238670 // Added logging to help diagnose the location of the problem. IN_PROC_BROWSER_TEST_F(AppApiTest, ReloadIntoAppProcessWithJavaScript) { … } // Similar to the previous test, but ensure that popup blocking bypass // isn't granted to the iframe. See crbug.com/117446. IN_PROC_BROWSER_TEST_F(BlockedAppApiTest, OpenAppFromIframe) { … } // Tests that if an extension launches an app via chrome.tabs.create with an URL // that's not in the app's extent but that server redirects to it, we still end // up with an app process. See http://crbug.com/99349 for more details. IN_PROC_BROWSER_TEST_F(AppApiTest, ServerRedirectToAppFromExtension) { … } // Tests that if an extension launches an app via chrome.tabs.create with an URL // that's not in the app's extent but that client redirects to it, we still end // up with an app process. IN_PROC_BROWSER_TEST_F(AppApiTest, ClientRedirectToAppFromExtension) { … } // Tests that if we have an app process (path1/container.html) with a non-app // iframe (path3/iframe.html), then opening a link from that iframe to a new // window to a same-origin non-app URL (path3/empty.html) should keep the window // in the app process. // This is in contrast to OpenAppFromIframe, since here the popup will not be // 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) { … } IN_PROC_BROWSER_TEST_F(AppApiTest, ReloadAppAfterCrash) { … } // Test that a cross-site renderer-initiated navigation away from a hosted app // stays in the same BrowsingInstance, so that postMessage calls to the app's // other windows still work, and a cross-site browser-initiated navigation away // from a hosted app switches BrowsingInstances. IN_PROC_BROWSER_TEST_F(AppApiTest, NavigatePopupFromAppToOutsideApp) { … }