summaryrefslogtreecommitdiffstats
path: root/content/browser/plugin_browsertest.cc
diff options
context:
space:
mode:
Diffstat (limited to 'content/browser/plugin_browsertest.cc')
-rw-r--r--content/browser/plugin_browsertest.cc341
1 files changed, 341 insertions, 0 deletions
diff --git a/content/browser/plugin_browsertest.cc b/content/browser/plugin_browsertest.cc
new file mode 100644
index 0000000..b3c0663
--- /dev/null
+++ b/content/browser/plugin_browsertest.cc
@@ -0,0 +1,341 @@
+// Copyright (c) 2012 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 "base/command_line.h"
+#include "base/path_service.h"
+#include "base/utf_string_conversions.h"
+#include "chrome/browser/ui/browser.h"
+#include "chrome/test/base/in_process_browser_test.h"
+#include "chrome/test/base/ui_test_utils.h"
+#include "content/public/browser/browser_thread.h"
+#include "content/public/common/content_switches.h"
+#include "content/test/net/url_request_mock_http_job.h"
+
+using content::BrowserThread;
+
+namespace {
+
+void SetUrlRequestMock(const FilePath& path) {
+ URLRequestMockHTTPJob::AddUrlHandler(path);
+}
+
+}
+
+class PluginTest : public InProcessBrowserTest {
+ protected:
+ PluginTest() {}
+
+ virtual void SetUpCommandLine(CommandLine* command_line) {
+ // Some NPAPI tests schedule garbage collection to force object tear-down.
+ command_line->AppendSwitchASCII(switches::kJavaScriptFlags, "--expose_gc");
+ // For OpenPopupWindowWithPlugin.
+ command_line->AppendSwitch(switches::kDisablePopupBlocking);
+#if defined(OS_MACOSX)
+ FilePath plugin_dir;
+ PathService::Get(base::DIR_MODULE, &plugin_dir);
+ plugin_dir = plugin_dir.AppendASCII("plugins");
+ // The plugins directory isn't read by default on the Mac, so it needs to be
+ // explicitly registered.
+ command_line->AppendSwitchPath(switches::kExtraPluginDir, plugin_dir);
+#endif
+ }
+
+ virtual void SetUpOnMainThread() OVERRIDE {
+ FilePath path = ui_test_utils::GetTestFilePath(FilePath(), FilePath());
+ BrowserThread::PostTask(
+ BrowserThread::IO, FROM_HERE, base::Bind(&SetUrlRequestMock, path));
+ }
+
+ void LoadAndWait(const GURL& url, const char* title) {
+ string16 expected_title(ASCIIToUTF16(title));
+ ui_test_utils::TitleWatcher title_watcher(
+ browser()->GetSelectedWebContents(), expected_title);
+ title_watcher.AlsoWaitForTitle(ASCIIToUTF16("FAIL"));
+ ui_test_utils::NavigateToURL(browser(), url);
+ EXPECT_EQ(expected_title, title_watcher.WaitAndGetTitle());
+ }
+
+ GURL GetURL(const char* filename) {
+ return ui_test_utils::GetTestUrl(
+ FilePath().AppendASCII("npapi"), FilePath().AppendASCII(filename));
+ }
+
+ void NavigateAway() {
+ GURL url = ui_test_utils::GetTestUrl(
+ FilePath(), FilePath().AppendASCII("simple.html"));
+ LoadAndWait(url, "simple.html");
+ }
+};
+
+// Make sure that navigating away from a plugin referenced by JS doesn't
+// crash.
+IN_PROC_BROWSER_TEST_F(PluginTest, UnloadNoCrash) {
+ LoadAndWait(GetURL("layout_test_plugin.html"), "Layout Test Plugin Test");
+ NavigateAway();
+}
+
+// Tests if a plugin executing a self deleting script using NPN_GetURL
+// works without crashing or hanging
+// Flaky: http://crbug.com/59327
+IN_PROC_BROWSER_TEST_F(PluginTest, SelfDeletePluginGetUrl) {
+ LoadAndWait(GetURL("self_delete_plugin_geturl.html"), "OK");
+}
+
+// Tests if a plugin executing a self deleting script using Invoke
+// works without crashing or hanging
+// Flaky. See http://crbug.com/30702
+IN_PROC_BROWSER_TEST_F(PluginTest, SelfDeletePluginInvoke) {
+ LoadAndWait(GetURL("self_delete_plugin_invoke.html"), "OK");
+}
+
+IN_PROC_BROWSER_TEST_F(PluginTest, NPObjectReleasedOnDestruction) {
+ ui_test_utils::NavigateToURL(
+ browser(), GetURL("npobject_released_on_destruction.html"));
+ NavigateAway();
+}
+
+// Test that a dialog is properly created when a plugin throws an
+// exception. Should be run for in and out of process plugins, but
+// the more interesting case is out of process, where we must route
+// the exception to the correct renderer.
+IN_PROC_BROWSER_TEST_F(PluginTest, NPObjectSetException) {
+ LoadAndWait(GetURL("npobject_set_exception.html"), "OK");
+}
+
+#if defined(OS_WIN)
+// Tests if a plugin executing a self deleting script in the context of
+// a synchronous mouseup works correctly.
+// This was never ported to Mac. The only thing remaining is to make
+// ui_test_utils::SimulateMouseClick get to Mac plugins, currently it doesn't
+// work.
+IN_PROC_BROWSER_TEST_F(PluginTest,
+ SelfDeletePluginInvokeInSynchronousMouseUp) {
+ ui_test_utils::NavigateToURL(
+ browser(), GetURL("execute_script_delete_in_mouse_up.html"));
+
+ string16 expected_title(ASCIIToUTF16("OK"));
+ ui_test_utils::TitleWatcher title_watcher(
+ browser()->GetSelectedWebContents(), expected_title);
+ title_watcher.AlsoWaitForTitle(ASCIIToUTF16("FAIL"));
+ ui_test_utils::SimulateMouseClick(
+ browser()->GetSelectedWebContents(), 150, 250);
+ EXPECT_EQ(expected_title, title_watcher.WaitAndGetTitle());
+}
+#endif
+
+// Flaky, http://crbug.com/60071.
+IN_PROC_BROWSER_TEST_F(PluginTest, GetURLRequest404Response) {
+ GURL url(URLRequestMockHTTPJob::GetMockUrl(
+ FilePath().AppendASCII("npapi").
+ AppendASCII("plugin_url_request_404.html")));
+ LoadAndWait(url, "OK");
+}
+
+// Tests if a plugin executing a self deleting script using Invoke with
+// a modal dialog showing works without crashing or hanging
+// Disabled, flakily exceeds timeout, http://crbug.com/46257.
+IN_PROC_BROWSER_TEST_F(PluginTest, SelfDeletePluginInvokeAlert) {
+ ui_test_utils::NavigateToURL(
+ browser(), GetURL("self_delete_plugin_invoke_alert.html"));
+
+ string16 expected_title(ASCIIToUTF16("OK"));
+ ui_test_utils::TitleWatcher title_watcher(
+ browser()->GetSelectedWebContents(), expected_title);
+ title_watcher.AlsoWaitForTitle(ASCIIToUTF16("FAIL"));
+
+ ui_test_utils::WaitForAppModalDialogAndCloseIt();
+
+ EXPECT_EQ(expected_title, title_watcher.WaitAndGetTitle());
+}
+
+// Test passing arguments to a plugin.
+IN_PROC_BROWSER_TEST_F(PluginTest, Arguments) {
+ LoadAndWait(GetURL("arguments.html"), "OK");
+}
+
+// Test invoking many plugins within a single page.
+IN_PROC_BROWSER_TEST_F(PluginTest, ManyPlugins) {
+ LoadAndWait(GetURL("many_plugins.html"), "OK");
+}
+
+// Test various calls to GetURL from a plugin.
+IN_PROC_BROWSER_TEST_F(PluginTest, GetURL) {
+ LoadAndWait(GetURL("geturl.html"), "OK");
+}
+
+// Test various calls to GetURL for javascript URLs with
+// non NULL targets from a plugin.
+IN_PROC_BROWSER_TEST_F(PluginTest, GetJavaScriptURL) {
+ LoadAndWait(GetURL("get_javascript_url.html"), "OK");
+}
+
+// Test that calling GetURL with a javascript URL and target=_self
+// works properly when the plugin is embedded in a subframe.
+IN_PROC_BROWSER_TEST_F(PluginTest, GetJavaScriptURL2) {
+ LoadAndWait(GetURL("get_javascript_url2.html"), "OK");
+}
+
+// Test is flaky on linux/cros/win builders. http://crbug.com/71904
+IN_PROC_BROWSER_TEST_F(PluginTest, GetURLRedirectNotification) {
+ LoadAndWait(GetURL("geturl_redirect_notify.html"), "OK");
+}
+
+// Tests that identity is preserved for NPObjects passed from a plugin
+// into JavaScript.
+IN_PROC_BROWSER_TEST_F(PluginTest, NPObjectIdentity) {
+ LoadAndWait(GetURL("npobject_identity.html"), "OK");
+}
+
+// Tests that if an NPObject is proxies back to its original process, the
+// original pointer is returned and not a proxy. If this fails the plugin
+// will crash.
+IN_PROC_BROWSER_TEST_F(PluginTest, NPObjectProxy) {
+ LoadAndWait(GetURL("npobject_proxy.html"), "OK");
+}
+
+#if defined(OS_WIN) || defined(OS_MACOSX)
+// Tests if a plugin executing a self deleting script in the context of
+// a synchronous paint event works correctly
+// http://crbug.com/44960
+IN_PROC_BROWSER_TEST_F(PluginTest, SelfDeletePluginInvokeInSynchronousPaint) {
+ LoadAndWait(GetURL("execute_script_delete_in_paint.html"), "OK");
+}
+#endif
+
+IN_PROC_BROWSER_TEST_F(PluginTest, SelfDeletePluginInNewStream) {
+ LoadAndWait(GetURL("self_delete_plugin_stream.html"), "OK");
+}
+
+// If this test flakes use http://crbug.com/95558.
+IN_PROC_BROWSER_TEST_F(PluginTest, DeletePluginInDeallocate) {
+ LoadAndWait(GetURL("plugin_delete_in_deallocate.html"), "OK");
+}
+
+#if defined(OS_WIN)
+
+IN_PROC_BROWSER_TEST_F(PluginTest, VerifyPluginWindowRect) {
+ LoadAndWait(GetURL("verify_plugin_window_rect.html"), "OK");
+}
+
+// Tests that creating a new instance of a plugin while another one is handling
+// a paint message doesn't cause deadlock.
+IN_PROC_BROWSER_TEST_F(PluginTest, CreateInstanceInPaint) {
+ LoadAndWait(GetURL("create_instance_in_paint.html"), "OK");
+}
+
+// Tests that putting up an alert in response to a paint doesn't deadlock.
+IN_PROC_BROWSER_TEST_F(PluginTest, AlertInWindowMessage) {
+ ui_test_utils::NavigateToURL(
+ browser(), GetURL("alert_in_window_message.html"));
+
+ ui_test_utils::WaitForAppModalDialogAndCloseIt();
+ ui_test_utils::WaitForAppModalDialogAndCloseIt();
+}
+
+IN_PROC_BROWSER_TEST_F(PluginTest, VerifyNPObjectLifetimeTest) {
+ LoadAndWait(GetURL("npobject_lifetime_test.html"), "OK");
+}
+
+// Tests that we don't crash or assert if NPP_New fails
+IN_PROC_BROWSER_TEST_F(PluginTest, NewFails) {
+ LoadAndWait(GetURL("new_fails.html"), "OK");
+}
+
+IN_PROC_BROWSER_TEST_F(PluginTest, SelfDeletePluginInNPNEvaluate) {
+ LoadAndWait(GetURL("execute_script_delete_in_npn_evaluate.html"), "OK");
+}
+
+IN_PROC_BROWSER_TEST_F(PluginTest, SelfDeleteCreatePluginInNPNEvaluate) {
+ LoadAndWait(GetURL("npn_plugin_delete_create_in_evaluate.html"), "OK");
+}
+
+#endif // OS_WIN
+
+// If this flakes, reopen http://crbug.com/17645
+// As of 6 July 2011, this test is flaky on Windows (perhaps due to timing out).
+#if !defined(OS_MACOSX)
+// Disabled on Mac because the plugin side isn't implemented yet, see
+// "TODO(port)" in plugin_javascript_open_popup.cc.
+IN_PROC_BROWSER_TEST_F(PluginTest, OpenPopupWindowWithPlugin) {
+ LoadAndWait(GetURL("get_javascript_open_popup_with_plugin.html"), "OK");
+}
+#endif
+
+// Test checking the privacy mode is off.
+IN_PROC_BROWSER_TEST_F(PluginTest, PrivateDisabled) {
+ LoadAndWait(GetURL("private.html"), "OK");
+}
+
+IN_PROC_BROWSER_TEST_F(PluginTest, ScheduleTimer) {
+ LoadAndWait(GetURL("schedule_timer.html"), "OK");
+}
+
+IN_PROC_BROWSER_TEST_F(PluginTest, PluginThreadAsyncCall) {
+ LoadAndWait(GetURL("plugin_thread_async_call.html"), "OK");
+}
+
+// Test checking the privacy mode is on.
+// If this flakes on Linux, use http://crbug.com/104380
+IN_PROC_BROWSER_TEST_F(PluginTest, PrivateEnabled) {
+ LoadAndWait(GetURL("private.html"), "OK");
+}
+
+#if defined(OS_WIN) || defined(OS_MACOSX)
+// Test a browser hang due to special case of multiple
+// plugin instances indulged in sync calls across renderer.
+IN_PROC_BROWSER_TEST_F(PluginTest, MultipleInstancesSyncCalls) {
+ LoadAndWait(GetURL("multiple_instances_sync_calls.html"), "OK");
+}
+#endif
+
+IN_PROC_BROWSER_TEST_F(PluginTest, GetURLRequestFailWrite) {
+ GURL url(URLRequestMockHTTPJob::GetMockUrl(
+ FilePath().AppendASCII("npapi").
+ AppendASCII("plugin_url_request_fail_write.html")));
+ LoadAndWait(url, "OK");
+}
+
+#if defined(OS_WIN)
+IN_PROC_BROWSER_TEST_F(PluginTest, EnsureScriptingWorksInDestroy) {
+ LoadAndWait(GetURL("ensure_scripting_works_in_destroy.html"), "OK");
+}
+
+// This test uses a Windows Event to signal to the plugin that it should crash
+// on NP_Initialize.
+IN_PROC_BROWSER_TEST_F(PluginTest, NoHangIfInitCrashes) {
+ HANDLE crash_event = CreateEvent(NULL, TRUE, FALSE, L"TestPluginCrashOnInit");
+ SetEvent(crash_event);
+ LoadAndWait(GetURL("no_hang_if_init_crashes.html"), "OK");
+ CloseHandle(crash_event);
+}
+#endif
+
+// If this flakes on Mac, use http://crbug.com/111508
+IN_PROC_BROWSER_TEST_F(PluginTest, PluginReferrerTest) {
+ GURL url(URLRequestMockHTTPJob::GetMockUrl(
+ FilePath().AppendASCII("npapi").
+ AppendASCII("plugin_url_request_referrer_test.html")));
+ LoadAndWait(url, "OK");
+}
+
+#if defined(OS_MACOSX)
+IN_PROC_BROWSER_TEST_F(PluginTest, PluginConvertPointTest) {
+ gfx::NativeWindow window = NULL;
+ gfx::Rect bounds(50, 50, 400, 400);
+ ui_test_utils::GetNativeWindow(browser(), &window);
+ ui_test_utils::SetWindowBounds(window, bounds);
+
+ ui_test_utils::NavigateToURL(browser(), GetURL("convert_point.html"));
+
+ string16 expected_title(ASCIIToUTF16("OK"));
+ ui_test_utils::TitleWatcher title_watcher(
+ browser()->GetSelectedWebContents(), expected_title);
+ title_watcher.AlsoWaitForTitle(ASCIIToUTF16("FAIL"));
+ // TODO(stuartmorgan): When the automation system supports sending clicks,
+ // change the test to trigger on mouse-down rather than window focus.
+ static_cast<content::WebContentsDelegate*>(browser())->
+ ActivateContents(browser()->GetSelectedWebContents());
+ EXPECT_EQ(expected_title, title_watcher.WaitAndGetTitle());
+}
+#endif