blob: bce35f7e7d0f55323ff563a7bf42ea9f886ebb8b [file] [log] [blame]
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "extensions/browser/guest_view/web_view/web_view_apitest.h"
#include <utility>
#include "base/command_line.h"
#include "base/macros.h"
#include "base/path_service.h"
#include "base/strings/string_util.h"
#include "base/strings/stringprintf.h"
#include "build/build_config.h"
#include "components/guest_view/browser/guest_view_manager.h"
#include "components/guest_view/browser/guest_view_manager_delegate.h"
#include "components/guest_view/browser/guest_view_manager_factory.h"
#include "components/guest_view/browser/test_guest_view_manager.h"
#include "content/public/browser/render_process_host.h"
#include "content/public/common/content_switches.h"
#include "content/public/test/browser_test_utils.h"
#include "content/public/test/test_renderer_host.h"
#include "content/public/test/test_utils.h"
#include "extensions/browser/api/extensions_api_client.h"
#include "extensions/browser/api/test/test_api.h"
#include "extensions/browser/app_window/app_window.h"
#include "extensions/browser/app_window/app_window_registry.h"
#include "extensions/browser/process_manager.h"
#include "extensions/common/extension.h"
#include "extensions/common/extension_paths.h"
#include "extensions/common/switches.h"
#include "extensions/shell/browser/shell_content_browser_client.h"
#include "extensions/shell/browser/shell_extension_system.h"
#include "extensions/shell/test/shell_test.h"
#include "extensions/test/extension_test_message_listener.h"
#include "net/base/filename_util.h"
#include "net/test/embedded_test_server/embedded_test_server.h"
#include "net/test/embedded_test_server/http_request.h"
#include "net/test/embedded_test_server/http_response.h"
#include "ui/display/display_switches.h"
using guest_view::GuestViewManager;
using guest_view::TestGuestViewManager;
namespace {
const char kEmptyResponsePath[] = "/close-socket";
const char kRedirectResponsePath[] = "/server-redirect";
const char kRedirectResponseFullPath[] = "/guest_redirect.html";
const char kUserAgentRedirectResponsePath[] = "/detect-user-agent";
const char kTestDataDirectory[] = "testDataDirectory";
const char kTestServerPort[] = "testServer.port";
const char kTestWebSocketPort[] = "testWebSocketPort";
const char kIsolateExtensions[] = "isolateExtensions";
// Handles |request| by serving a redirect response if the |User-Agent| is
// foobar.
static std::unique_ptr<net::test_server::HttpResponse> UserAgentResponseHandler(
const std::string& path,
const GURL& redirect_target,
const net::test_server::HttpRequest& request) {
if (!base::StartsWith(path, request.relative_url,
base::CompareCase::SENSITIVE))
return std::unique_ptr<net::test_server::HttpResponse>();
auto it = request.headers.find("User-Agent");
EXPECT_TRUE(it != request.headers.end());
if (!base::StartsWith("foobar", it->second, base::CompareCase::SENSITIVE))
return std::unique_ptr<net::test_server::HttpResponse>();
std::unique_ptr<net::test_server::BasicHttpResponse> http_response(
new net::test_server::BasicHttpResponse);
http_response->set_code(net::HTTP_MOVED_PERMANENTLY);
http_response->AddCustomHeader("Location", redirect_target.spec());
return std::move(http_response);
}
class WebContentsHiddenObserver : public content::WebContentsObserver {
public:
WebContentsHiddenObserver(content::WebContents* web_contents,
const base::Closure& hidden_callback)
: WebContentsObserver(web_contents),
hidden_callback_(hidden_callback),
hidden_observed_(false) {
}
// WebContentsObserver.
void WasHidden() override {
hidden_observed_ = true;
hidden_callback_.Run();
}
bool hidden_observed() { return hidden_observed_; }
private:
base::Closure hidden_callback_;
bool hidden_observed_;
DISALLOW_COPY_AND_ASSIGN(WebContentsHiddenObserver);
};
// Handles |request| by serving a redirect response.
std::unique_ptr<net::test_server::HttpResponse> RedirectResponseHandler(
const std::string& path,
const GURL& redirect_target,
const net::test_server::HttpRequest& request) {
if (!base::StartsWith(path, request.relative_url,
base::CompareCase::SENSITIVE))
return std::unique_ptr<net::test_server::HttpResponse>();
std::unique_ptr<net::test_server::BasicHttpResponse> http_response(
new net::test_server::BasicHttpResponse);
http_response->set_code(net::HTTP_MOVED_PERMANENTLY);
http_response->AddCustomHeader("Location", redirect_target.spec());
return std::move(http_response);
}
// Handles |request| by serving an empty response.
std::unique_ptr<net::test_server::HttpResponse> EmptyResponseHandler(
const std::string& path,
const net::test_server::HttpRequest& request) {
if (base::StartsWith(path, request.relative_url,
base::CompareCase::SENSITIVE)) {
return std::unique_ptr<net::test_server::HttpResponse>(
new net::test_server::RawHttpResponse("", ""));
}
return std::unique_ptr<net::test_server::HttpResponse>();
}
} // namespace
namespace extensions {
WebViewAPITest::WebViewAPITest() {
GuestViewManager::set_factory_for_testing(&factory_);
}
void WebViewAPITest::LaunchApp(const std::string& app_location) {
base::FilePath test_data_dir;
PathService::Get(DIR_TEST_DATA, &test_data_dir);
test_data_dir = test_data_dir.AppendASCII(app_location.c_str());
test_config_.SetString(kTestDataDirectory,
net::FilePathToFileURL(test_data_dir).spec());
const Extension* extension = extension_system_->LoadApp(test_data_dir);
ASSERT_TRUE(extension);
extension_system_->LaunchApp(extension->id());
ExtensionTestMessageListener launch_listener("LAUNCHED", false);
launch_listener.set_failure_message("FAILURE");
ASSERT_TRUE(launch_listener.WaitUntilSatisfied());
embedder_web_contents_ = GetFirstAppWindowWebContents();
}
content::WebContents* WebViewAPITest::GetFirstAppWindowWebContents() {
const AppWindowRegistry::AppWindowList& app_window_list =
AppWindowRegistry::Get(browser_context_)->app_windows();
DCHECK_EQ(1u, app_window_list.size());
return (*app_window_list.begin())->web_contents();
}
void WebViewAPITest::RunTest(const std::string& test_name,
const std::string& app_location) {
LaunchApp(app_location);
ExtensionTestMessageListener done_listener("TEST_PASSED", false);
done_listener.set_failure_message("TEST_FAILED");
ASSERT_TRUE(content::ExecuteScript(
embedder_web_contents_,
base::StringPrintf("runTest('%s')", test_name.c_str())))
<< "Unable to start test.";
ASSERT_TRUE(done_listener.WaitUntilSatisfied());
}
void WebViewAPITest::RunTestOnMainThreadLoop() {
AppShellTest::RunTestOnMainThreadLoop();
GetGuestViewManager()->WaitForAllGuestsDeleted();
}
void WebViewAPITest::SetUpCommandLine(base::CommandLine* command_line) {
AppShellTest::SetUpCommandLine(command_line);
command_line->AppendSwitchASCII(::switches::kJavaScriptFlags, "--expose-gc");
}
void WebViewAPITest::SetUpOnMainThread() {
AppShellTest::SetUpOnMainThread();
TestGetConfigFunction::set_test_config_state(&test_config_);
base::FilePath test_data_dir;
test_config_.SetInteger(kTestWebSocketPort, 0);
bool isolate_extensions = base::CommandLine::ForCurrentProcess()->HasSwitch(
::switches::kSitePerProcess) ||
base::CommandLine::ForCurrentProcess()->HasSwitch(
extensions::switches::kIsolateExtensions);
test_config_.SetBoolean(kIsolateExtensions, isolate_extensions);
}
void WebViewAPITest::StartTestServer(const std::string& app_location) {
// For serving guest pages.
if (!embedded_test_server()->InitializeAndListen()) {
LOG(ERROR) << "Failed to start test server.";
return;
}
test_config_.SetInteger(kTestServerPort, embedded_test_server()->port());
base::FilePath test_data_dir;
PathService::Get(DIR_TEST_DATA, &test_data_dir);
test_data_dir = test_data_dir.AppendASCII(app_location.c_str());
embedded_test_server()->ServeFilesFromDirectory(test_data_dir);
embedded_test_server()->RegisterRequestHandler(
base::Bind(&RedirectResponseHandler,
kRedirectResponsePath,
embedded_test_server()->GetURL(kRedirectResponseFullPath)));
embedded_test_server()->RegisterRequestHandler(
base::Bind(&EmptyResponseHandler, kEmptyResponsePath));
embedded_test_server()->RegisterRequestHandler(
base::Bind(
&UserAgentResponseHandler,
kUserAgentRedirectResponsePath,
embedded_test_server()->GetURL(kRedirectResponseFullPath)));
embedded_test_server()->StartAcceptingConnections();
}
void WebViewAPITest::StopTestServer() {
if (!embedded_test_server()->ShutdownAndWaitUntilComplete()) {
LOG(ERROR) << "Failed to shutdown test server.";
}
}
void WebViewAPITest::TearDownOnMainThread() {
TestGetConfigFunction::set_test_config_state(nullptr);
AppShellTest::TearDownOnMainThread();
}
void WebViewAPITest::SendMessageToEmbedder(const std::string& message) {
EXPECT_TRUE(
content::ExecuteScript(
GetEmbedderWebContents(),
base::StringPrintf("onAppCommand('%s');", message.c_str())));
}
content::WebContents* WebViewAPITest::GetEmbedderWebContents() {
if (!embedder_web_contents_)
embedder_web_contents_ = GetFirstAppWindowWebContents();
return embedder_web_contents_;
}
TestGuestViewManager* WebViewAPITest::GetGuestViewManager() {
content::BrowserContext* context =
ShellContentBrowserClient::Get()->GetBrowserContext();
TestGuestViewManager* manager = static_cast<TestGuestViewManager*>(
TestGuestViewManager::FromBrowserContext(context));
// TestGuestViewManager::WaitForSingleGuestCreated may and will get called
// before a guest is created.
if (!manager) {
manager =
static_cast<TestGuestViewManager*>(GuestViewManager::CreateWithDelegate(
context,
ExtensionsAPIClient::Get()->CreateGuestViewManagerDelegate(
context)));
}
return manager;
}
void WebViewAPITest::SendMessageToGuestAndWait(
const std::string& message,
const std::string& wait_message) {
std::unique_ptr<ExtensionTestMessageListener> listener;
if (!wait_message.empty())
listener.reset(new ExtensionTestMessageListener(wait_message, false));
EXPECT_TRUE(
content::ExecuteScript(
GetGuestWebContents(),
base::StringPrintf("onAppCommand('%s');", message.c_str())));
if (listener)
ASSERT_TRUE(listener->WaitUntilSatisfied());
}
void WebViewDPIAPITest::SetUp() {
base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
command_line->AppendSwitchASCII(::switches::kForceDeviceScaleFactor,
base::StringPrintf("%f", scale()));
WebViewAPITest::SetUp();
}
content::WebContents* WebViewAPITest::GetGuestWebContents() {
return GetGuestViewManager()->WaitForSingleGuestCreated();
}
// Occasionally hits NOTIMPLEMENTED on Linux. https://crbug.com/422998
#if defined(OS_LINUX)
#define MAYBE_AcceptTouchEvents DISABLED_AcceptTouchEvents
#else
#define MAYBE_AcceptTouchEvents AcceptTouchEvents
#endif
IN_PROC_BROWSER_TEST_F(WebViewAPITest, MAYBE_AcceptTouchEvents) {
LaunchApp("web_view/accept_touch_events");
content::RenderViewHost* embedder_rvh =
GetEmbedderWebContents()->GetRenderViewHost();
bool embedder_has_touch_handler =
content::RenderViewHostTester::HasTouchEventHandler(embedder_rvh);
EXPECT_FALSE(embedder_has_touch_handler);
SendMessageToGuestAndWait("install-touch-handler", "installed-touch-handler");
// Note that we need to wait for the installed/registered touch handler to
// appear in browser process before querying |embedder_rvh|.
// In practice, since we do a roundrtip from browser process to guest and
// back, this is sufficient.
embedder_has_touch_handler =
content::RenderViewHostTester::HasTouchEventHandler(embedder_rvh);
EXPECT_TRUE(embedder_has_touch_handler);
SendMessageToGuestAndWait("uninstall-touch-handler",
"uninstalled-touch-handler");
// Same as the note above about waiting.
embedder_has_touch_handler =
content::RenderViewHostTester::HasTouchEventHandler(embedder_rvh);
EXPECT_FALSE(embedder_has_touch_handler);
}
// This test verifies that hiding the embedder also hides the guest.
IN_PROC_BROWSER_TEST_F(WebViewAPITest, EmbedderVisibilityChanged) {
LaunchApp("web_view/visibility_changed");
scoped_refptr<content::MessageLoopRunner> loop_runner(
new content::MessageLoopRunner);
WebContentsHiddenObserver observer(GetGuestWebContents(),
loop_runner->QuitClosure());
// Handled in web_view/visibility_changed/main.js
SendMessageToEmbedder("hide-embedder");
if (!observer.hidden_observed())
loop_runner->Run();
}
// Test for http://crbug.com/419611.
IN_PROC_BROWSER_TEST_F(WebViewAPITest, DisplayNoneSetSrc) {
LaunchApp("web_view/display_none_set_src");
// Navigate the guest while it's in "display: none" state.
SendMessageToEmbedder("navigate-guest");
GetGuestViewManager()->WaitForSingleGuestCreated();
// Now attempt to navigate the guest again.
SendMessageToEmbedder("navigate-guest");
ExtensionTestMessageListener test_passed_listener("WebViewTest.PASSED",
false);
// Making the guest visible would trigger loadstop.
SendMessageToEmbedder("show-guest");
EXPECT_TRUE(test_passed_listener.WaitUntilSatisfied());
}
// This test verifies that hiding the guest triggers WebContents::WasHidden().
IN_PROC_BROWSER_TEST_F(WebViewAPITest, GuestVisibilityChanged) {
LaunchApp("web_view/visibility_changed");
scoped_refptr<content::MessageLoopRunner> loop_runner(
new content::MessageLoopRunner);
WebContentsHiddenObserver observer(GetGuestWebContents(),
loop_runner->QuitClosure());
// Handled in web_view/visibility_changed/main.js
SendMessageToEmbedder("hide-guest");
if (!observer.hidden_observed())
loop_runner->Run();
}
// This test ensures that closing app window on 'loadcommit' does not crash.
// The test launches an app with guest and closes the window on loadcommit. It
// then launches the app window again. The process is repeated 3 times.
// http://crbug.com/291278
#if defined(OS_WIN)
#define MAYBE_CloseOnLoadcommit DISABLED_CloseOnLoadcommit
#else
#define MAYBE_CloseOnLoadcommit CloseOnLoadcommit
#endif
IN_PROC_BROWSER_TEST_F(WebViewAPITest, MAYBE_CloseOnLoadcommit) {
LaunchApp("web_view/close_on_loadcommit");
ExtensionTestMessageListener test_done_listener("done-close-on-loadcommit",
false);
ASSERT_TRUE(test_done_listener.WaitUntilSatisfied());
}
// This test verifies that reloading the embedder reloads the guest (and doest
// not crash).
IN_PROC_BROWSER_TEST_F(WebViewAPITest, ReloadEmbedder) {
// Just load a guest from other test, we do not want to add a separate
// app for this test.
LaunchApp("web_view/visibility_changed");
ExtensionTestMessageListener launched_again_listener("LAUNCHED", false);
embedder_web_contents_->GetController().Reload(content::ReloadType::NORMAL,
false);
ASSERT_TRUE(launched_again_listener.WaitUntilSatisfied());
}
IN_PROC_BROWSER_TEST_F(WebViewAPITest, TestAllowTransparencyAttribute) {
RunTest("testAllowTransparencyAttribute", "web_view/apitest");
}
IN_PROC_BROWSER_TEST_F(WebViewAPITest, TestAPIMethodExistence) {
RunTest("testAPIMethodExistence", "web_view/apitest");
}
IN_PROC_BROWSER_TEST_F(WebViewAPITest, TestAssignSrcAfterCrash) {
RunTest("testAssignSrcAfterCrash", "web_view/apitest");
}
IN_PROC_BROWSER_TEST_F(WebViewAPITest, TestAutosizeAfterNavigation) {
RunTest("testAutosizeAfterNavigation", "web_view/apitest");
}
IN_PROC_BROWSER_TEST_F(WebViewAPITest, TestAutosizeBeforeNavigation) {
RunTest("testAutosizeBeforeNavigation", "web_view/apitest");
}
IN_PROC_BROWSER_TEST_F(WebViewDPIAPITest, TestAutosizeBeforeNavigation) {
RunTest("testAutosizeBeforeNavigation", "web_view/apitest");
}
IN_PROC_BROWSER_TEST_F(WebViewAPITest, TestAutosizeHeight) {
RunTest("testAutosizeHeight", "web_view/apitest");
}
IN_PROC_BROWSER_TEST_F(WebViewDPIAPITest, TestAutosizeHeight) {
RunTest("testAutosizeHeight", "web_view/apitest");
}
IN_PROC_BROWSER_TEST_F(WebViewAPITest, TestAutosizeRemoveAttributes) {
RunTest("testAutosizeRemoveAttributes", "web_view/apitest");
}
IN_PROC_BROWSER_TEST_F(WebViewDPIAPITest, TestAutosizeRemoveAttributes) {
RunTest("testAutosizeRemoveAttributes", "web_view/apitest");
}
// http://crbug.com/473177
IN_PROC_BROWSER_TEST_F(WebViewAPITest,
DISABLED_TestAutosizeWithPartialAttributes) {
RunTest("testAutosizeWithPartialAttributes", "web_view/apitest");
}
IN_PROC_BROWSER_TEST_F(WebViewAPITest, TestCannotMutateEventName) {
RunTest("testCannotMutateEventName", "web_view/apitest");
}
IN_PROC_BROWSER_TEST_F(WebViewAPITest, TestChromeExtensionRelativePath) {
RunTest("testChromeExtensionRelativePath", "web_view/apitest");
}
IN_PROC_BROWSER_TEST_F(WebViewAPITest, TestChromeExtensionURL) {
RunTest("testChromeExtensionURL", "web_view/apitest");
}
IN_PROC_BROWSER_TEST_F(WebViewAPITest, TestContentLoadEvent) {
RunTest("testContentLoadEvent", "web_view/apitest");
}
IN_PROC_BROWSER_TEST_F(WebViewAPITest, TestDeclarativeWebRequestAPI) {
std::string app_location = "web_view/apitest";
StartTestServer(app_location);
RunTest("testDeclarativeWebRequestAPI", app_location);
StopTestServer();
}
IN_PROC_BROWSER_TEST_F(WebViewAPITest,
TestDeclarativeWebRequestAPISendMessage) {
std::string app_location = "web_view/apitest";
StartTestServer(app_location);
RunTest("testDeclarativeWebRequestAPISendMessage", app_location);
StopTestServer();
}
IN_PROC_BROWSER_TEST_F(WebViewAPITest, TestDestroyOnEventListener) {
RunTest("testDestroyOnEventListener", "web_view/apitest");
}
IN_PROC_BROWSER_TEST_F(WebViewAPITest, TestDialogAlert) {
RunTest("testDialogAlert", "web_view/dialog");
}
IN_PROC_BROWSER_TEST_F(WebViewAPITest, TestDialogConfirm) {
RunTest("testDialogConfirm", "web_view/dialog");
}
IN_PROC_BROWSER_TEST_F(WebViewAPITest, TestDialogConfirmCancel) {
RunTest("testDialogConfirmCancel", "web_view/dialog");
}
IN_PROC_BROWSER_TEST_F(WebViewAPITest, TestDialogConfirmDefaultCancel) {
RunTest("testDialogConfirmDefaultCancel", "web_view/dialog");
}
IN_PROC_BROWSER_TEST_F(WebViewAPITest, TestDialogConfirmDefaultGCCancel) {
RunTest("testDialogConfirmDefaultGCCancel", "web_view/dialog");
}
IN_PROC_BROWSER_TEST_F(WebViewAPITest, TestDialogPrompt) {
RunTest("testDialogPrompt", "web_view/dialog");
}
IN_PROC_BROWSER_TEST_F(WebViewAPITest, TestDisplayNoneWebviewLoad) {
RunTest("testDisplayNoneWebviewLoad", "web_view/apitest");
}
IN_PROC_BROWSER_TEST_F(WebViewAPITest, TestDisplayNoneWebviewRemoveChild) {
RunTest("testDisplayNoneWebviewRemoveChild", "web_view/apitest");
}
IN_PROC_BROWSER_TEST_F(WebViewAPITest, TestEventName) {
RunTest("testEventName", "web_view/apitest");
}
IN_PROC_BROWSER_TEST_F(WebViewAPITest, TestExecuteScript) {
RunTest("testExecuteScript", "web_view/apitest");
}
IN_PROC_BROWSER_TEST_F(WebViewAPITest, TestExecuteScriptFail) {
RunTest("testExecuteScriptFail", "web_view/apitest");
}
// Flaky and likely not testing the right assertion. https://crbug.com/702918
IN_PROC_BROWSER_TEST_F(
WebViewAPITest,
DISABLED_TestExecuteScriptIsAbortedWhenWebViewSourceIsChanged) {
RunTest("testExecuteScriptIsAbortedWhenWebViewSourceIsChanged",
"web_view/apitest");
}
IN_PROC_BROWSER_TEST_F(WebViewAPITest, TestFindAPI) {
RunTest("testFindAPI", "web_view/apitest");
}
IN_PROC_BROWSER_TEST_F(WebViewAPITest, TestFindAPI_findupdate) {
RunTest("testFindAPI_findupdate", "web_view/apitest");
}
IN_PROC_BROWSER_TEST_F(WebViewAPITest, TestGetProcessId) {
RunTest("testGetProcessId", "web_view/apitest");
}
IN_PROC_BROWSER_TEST_F(WebViewAPITest, TestHiddenBeforeNavigation) {
RunTest("testHiddenBeforeNavigation", "web_view/apitest");
}
IN_PROC_BROWSER_TEST_F(WebViewAPITest,
TestInlineScriptFromAccessibleResources) {
RunTest("testInlineScriptFromAccessibleResources", "web_view/apitest");
}
IN_PROC_BROWSER_TEST_F(WebViewAPITest, TestInvalidChromeExtensionURL) {
RunTest("testInvalidChromeExtensionURL", "web_view/apitest");
}
IN_PROC_BROWSER_TEST_F(WebViewAPITest,
TestLoadAbortChromeExtensionURLWrongPartition) {
RunTest("testLoadAbortChromeExtensionURLWrongPartition", "web_view/apitest");
}
IN_PROC_BROWSER_TEST_F(WebViewAPITest, TestLoadAbortEmptyResponse) {
std::string app_location = "web_view/apitest";
StartTestServer(app_location);
RunTest("testLoadAbortEmptyResponse", app_location);
StopTestServer();
}
IN_PROC_BROWSER_TEST_F(WebViewAPITest, TestLoadAbortIllegalChromeURL) {
RunTest("testLoadAbortIllegalChromeURL", "web_view/apitest");
}
IN_PROC_BROWSER_TEST_F(WebViewAPITest, TestLoadAbortIllegalFileURL) {
RunTest("testLoadAbortIllegalFileURL", "web_view/apitest");
}
IN_PROC_BROWSER_TEST_F(WebViewAPITest, TestLoadAbortIllegalJavaScriptURL) {
RunTest("testLoadAbortIllegalJavaScriptURL", "web_view/apitest");
}
IN_PROC_BROWSER_TEST_F(WebViewAPITest, TestLoadAbortInvalidNavigation) {
RunTest("testLoadAbortInvalidNavigation", "web_view/apitest");
}
IN_PROC_BROWSER_TEST_F(WebViewAPITest, TestLoadAbortNonWebSafeScheme) {
RunTest("testLoadAbortNonWebSafeScheme", "web_view/apitest");
}
IN_PROC_BROWSER_TEST_F(WebViewAPITest, TestLoadProgressEvent) {
RunTest("testLoadProgressEvent", "web_view/apitest");
}
IN_PROC_BROWSER_TEST_F(WebViewAPITest, TestLoadStartLoadRedirect) {
std::string app_location = "web_view/apitest";
StartTestServer(app_location);
RunTest("testLoadStartLoadRedirect", app_location);
StopTestServer();
}
IN_PROC_BROWSER_TEST_F(WebViewAPITest, TestNavigateAfterResize) {
RunTest("testNavigateAfterResize", "web_view/apitest");
}
IN_PROC_BROWSER_TEST_F(WebViewAPITest, TestNavigationToExternalProtocol) {
RunTest("testNavigationToExternalProtocol", "web_view/apitest");
}
IN_PROC_BROWSER_TEST_F(WebViewAPITest,
TestContentInitiatedNavigationToDataUrlBlocked) {
RunTest("testContentInitiatedNavigationToDataUrlBlocked", "web_view/apitest");
}
IN_PROC_BROWSER_TEST_F(WebViewAPITest,
TestNavOnConsecutiveSrcAttributeChanges) {
RunTest("testNavOnConsecutiveSrcAttributeChanges", "web_view/apitest");
}
IN_PROC_BROWSER_TEST_F(WebViewAPITest, TestNavOnSrcAttributeChange) {
RunTest("testNavOnSrcAttributeChange", "web_view/apitest");
}
IN_PROC_BROWSER_TEST_F(WebViewAPITest, TestNewWindow) {
std::string app_location = "web_view/apitest";
StartTestServer(app_location);
RunTest("testNewWindow", app_location);
StopTestServer();
}
IN_PROC_BROWSER_TEST_F(WebViewAPITest, TestNewWindowNoPreventDefault) {
std::string app_location = "web_view/apitest";
StartTestServer(app_location);
RunTest("testNewWindowNoPreventDefault", app_location);
StopTestServer();
}
IN_PROC_BROWSER_TEST_F(WebViewAPITest, TestNewWindowNoReferrerLink) {
std::string app_location = "web_view/apitest";
StartTestServer(app_location);
RunTest("testNewWindowNoReferrerLink", app_location);
StopTestServer();
}
IN_PROC_BROWSER_TEST_F(WebViewAPITest, TestNewWindowTwoListeners) {
std::string app_location = "web_view/apitest";
StartTestServer(app_location);
RunTest("testNewWindowTwoListeners", app_location);
StopTestServer();
}
IN_PROC_BROWSER_TEST_F(WebViewAPITest, TestOnEventProperty) {
RunTest("testOnEventProperties", "web_view/apitest");
}
IN_PROC_BROWSER_TEST_F(WebViewAPITest, TestPartitionChangeAfterNavigation) {
RunTest("testPartitionChangeAfterNavigation", "web_view/apitest");
}
IN_PROC_BROWSER_TEST_F(WebViewAPITest,
TestPartitionRemovalAfterNavigationFails) {
RunTest("testPartitionRemovalAfterNavigationFails", "web_view/apitest");
}
IN_PROC_BROWSER_TEST_F(WebViewAPITest, TestReassignSrcAttribute) {
RunTest("testReassignSrcAttribute", "web_view/apitest");
}
IN_PROC_BROWSER_TEST_F(WebViewAPITest, TestRemoveWebviewOnExit) {
std::string app_location = "web_view/apitest";
StartTestServer(app_location);
// Launch the app and wait until it's ready to load a test.
LaunchApp("web_view/apitest");
GURL::Replacements replace_host;
replace_host.SetHostStr("localhost");
// Run the test and wait until the guest WebContents is available and has
// finished loading.
ExtensionTestMessageListener guest_loaded_listener("guest-loaded", false);
EXPECT_TRUE(content::ExecuteScript(embedder_web_contents_,
"runTest('testRemoveWebviewOnExit')"));
content::WebContents* guest_web_contents = GetGuestWebContents();
EXPECT_TRUE(guest_web_contents->GetRenderProcessHost()->IsForGuestsOnly());
ASSERT_TRUE(guest_loaded_listener.WaitUntilSatisfied());
content::WebContentsDestroyedWatcher destroyed_watcher(guest_web_contents);
// Tell the embedder to kill the guest.
EXPECT_TRUE(content::ExecuteScript(embedder_web_contents_,
"removeWebviewOnExitDoCrash()"));
// Wait until the guest WebContents is destroyed.
destroyed_watcher.Wait();
StopTestServer();
}
IN_PROC_BROWSER_TEST_F(WebViewAPITest, TestReload) {
RunTest("testReload", "web_view/apitest");
}
IN_PROC_BROWSER_TEST_F(WebViewAPITest, TestReloadAfterTerminate) {
RunTest("testReloadAfterTerminate", "web_view/apitest");
}
IN_PROC_BROWSER_TEST_F(WebViewAPITest, TestRemoveSrcAttribute) {
RunTest("testRemoveSrcAttribute", "web_view/apitest");
}
IN_PROC_BROWSER_TEST_F(WebViewAPITest, TestRemoveWebviewAfterNavigation) {
RunTest("testRemoveWebviewAfterNavigation", "web_view/apitest");
}
IN_PROC_BROWSER_TEST_F(WebViewAPITest, TestResizeWebviewResizesContent) {
RunTest("testResizeWebviewResizesContent", "web_view/apitest");
}
IN_PROC_BROWSER_TEST_F(WebViewAPITest, TestTerminateAfterExit) {
RunTest("testTerminateAfterExit", "web_view/apitest");
}
IN_PROC_BROWSER_TEST_F(WebViewAPITest, TestWebRequestAPI) {
std::string app_location = "web_view/apitest";
StartTestServer(app_location);
RunTest("testWebRequestAPI", app_location);
StopTestServer();
}
IN_PROC_BROWSER_TEST_F(WebViewAPITest, TestWebRequestAPIWithHeaders) {
std::string app_location = "web_view/apitest";
StartTestServer(app_location);
RunTest("testWebRequestAPIWithHeaders", app_location);
StopTestServer();
}
IN_PROC_BROWSER_TEST_F(WebViewAPITest, TestLoadEventsSameDocumentNavigation) {
std::string app_location = "web_view/apitest";
StartTestServer(app_location);
RunTest("testLoadEventsSameDocumentNavigation", app_location);
StopTestServer();
}
// Tests the existence of WebRequest API event objects on the request
// object, on the webview element, and hanging directly off webview.
IN_PROC_BROWSER_TEST_F(WebViewAPITest, TestWebRequestAPIExistence) {
RunTest("testWebRequestAPIExistence", "web_view/apitest");
}
IN_PROC_BROWSER_TEST_F(WebViewAPITest, TestWebRequestAPIGoogleProperty) {
RunTest("testWebRequestAPIGoogleProperty", "web_view/apitest");
}
// This test verifies that webview.contentWindow works inside an iframe
IN_PROC_BROWSER_TEST_F(WebViewAPITest, TestWebViewInsideFrame) {
LaunchApp("web_view/inside_iframe");
}
IN_PROC_BROWSER_TEST_F(WebViewAPITest, TestCaptureVisibleRegion) {
RunTest("testCaptureVisibleRegion", "web_view/apitest");
}
} // namespace extensions