blob: 253532dab3a20daddf7f22d889adc95e1df9612b [file] [log] [blame]
// Copyright (c) 2010 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 "build/build_config.h"
#if defined(OS_WIN)
// windows headers
#include <comutil.h>
#include <shellapi.h>
#include <shlobj.h>
#include <windows.h>
#endif
// runtime headers
#include <memory.h>
#include <stdlib.h>
#include <string.h>
#include <ostream>
#include "base/file_path.h"
#include "base/keyboard_codes.h"
#include "base/string_number_conversions.h"
#include "chrome/browser/net/url_request_mock_http_job.h"
#include "chrome/common/chrome_paths.h"
#include "chrome/common/url_constants.h"
#include "chrome/test/automation/browser_proxy.h"
#include "chrome/test/automation/tab_proxy.h"
#include "chrome/test/automation/window_proxy.h"
#include "chrome/test/ui/npapi_test_helper.h"
#include "chrome/test/ui_test_utils.h"
using npapi_test::kTestCompleteCookie;
using npapi_test::kTestCompleteSuccess;
static const FilePath::CharType* kTestDir = FILE_PATH_LITERAL("npapi");
// Test passing arguments to a plugin.
TEST_F(NPAPITester, Arguments) {
const FilePath test_case(FILE_PATH_LITERAL("arguments.html"));
GURL url = ui_test_utils::GetTestUrl(FilePath(kTestDir), test_case);
ASSERT_NO_FATAL_FAILURE(NavigateToURL(url));
WaitForFinish("arguments", "1", url, kTestCompleteCookie,
kTestCompleteSuccess, action_max_timeout_ms());
}
// Test invoking many plugins within a single page.
// Test still flaky under valgrind
// http://crbug.com/28372, http://crbug.com/45561
TEST_F(NPAPITester, FLAKY_ManyPlugins) {
const FilePath test_case(FILE_PATH_LITERAL("many_plugins.html"));
GURL url(ui_test_utils::GetTestUrl(FilePath(kTestDir), test_case));
ASSERT_NO_FATAL_FAILURE(NavigateToURL(url));
for (int i = 1; i <= 15; i++) {
SCOPED_TRACE(StringPrintf("Waiting for plugin #%d", i));
ASSERT_NO_FATAL_FAILURE(WaitForFinish("arguments", base::IntToString(i),
url, kTestCompleteCookie,
kTestCompleteSuccess,
action_max_timeout_ms()));
}
}
// Test various calls to GetURL from a plugin.
TEST_F(NPAPITester, GetURL) {
const FilePath test_case(FILE_PATH_LITERAL("geturl.html"));
GURL url = ui_test_utils::GetTestUrl(FilePath(kTestDir), test_case);
ASSERT_NO_FATAL_FAILURE(NavigateToURL(url));
WaitForFinish("geturl", "1", url, kTestCompleteCookie,
kTestCompleteSuccess, action_max_timeout_ms());
}
// Test various calls to GetURL for javascript URLs with
// non NULL targets from a plugin.
TEST_F(NPAPITester, GetJavaScriptURL) {
const FilePath test_case(FILE_PATH_LITERAL("get_javascript_url.html"));
GURL url = ui_test_utils::GetTestUrl(FilePath(kTestDir), test_case);
ASSERT_NO_FATAL_FAILURE(NavigateToURL(url));
WaitForFinish("getjavascripturl", "1", url, kTestCompleteCookie,
kTestCompleteSuccess, action_max_timeout_ms());
}
// Flaky test: http://crbug.com/29020
// Test that calling GetURL with a javascript URL and target=_self
// works properly when the plugin is embedded in a subframe.
TEST_F(NPAPITester, FLAKY_GetJavaScriptURL2) {
const FilePath test_case(FILE_PATH_LITERAL("get_javascript_url2.html"));
GURL url = ui_test_utils::GetTestUrl(FilePath(kTestDir), test_case);
ASSERT_NO_FATAL_FAILURE(NavigateToURL(url));
WaitForFinish("getjavascripturl2", "1", url, kTestCompleteCookie,
kTestCompleteSuccess, action_max_timeout_ms());
}
// 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.
TEST_F(NPAPITester, NPObjectProxy) {
const FilePath test_case(FILE_PATH_LITERAL("npobject_proxy.html"));
GURL url = ui_test_utils::GetTestUrl(FilePath(kTestDir), test_case);
ASSERT_NO_FATAL_FAILURE(NavigateToURL(url));
WaitForFinish("npobject_proxy", "1", url, kTestCompleteCookie,
kTestCompleteSuccess, action_max_timeout_ms());
}
#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
TEST_F(NPAPIVisiblePluginTester,
FLAKY_SelfDeletePluginInvokeInSynchronousPaint) {
if (UITest::in_process_renderer())
return;
show_window_ = true;
const FilePath test_case(
FILE_PATH_LITERAL("execute_script_delete_in_paint.html"));
GURL url = ui_test_utils::GetTestUrl(FilePath(kTestDir), test_case);
ASSERT_NO_FATAL_FAILURE(NavigateToURL(url));
WaitForFinish("execute_script_delete_in_paint", "1", url,
kTestCompleteCookie, kTestCompleteSuccess,
action_max_timeout_ms());
}
#endif
TEST_F(NPAPIVisiblePluginTester, SelfDeletePluginInNewStream) {
if (UITest::in_process_renderer())
return;
show_window_ = true;
const FilePath test_case(FILE_PATH_LITERAL("self_delete_plugin_stream.html"));
GURL url = ui_test_utils::GetTestUrl(FilePath(kTestDir), test_case);
ASSERT_NO_FATAL_FAILURE(NavigateToURL(url));
WaitForFinish("self_delete_plugin_stream", "1", url,
kTestCompleteCookie, kTestCompleteSuccess,
action_max_timeout_ms());
}
#if defined(OS_WIN)
// Tests if a plugin has a non zero window rect.
TEST_F(NPAPIVisiblePluginTester, VerifyPluginWindowRect) {
show_window_ = true;
const FilePath test_case(FILE_PATH_LITERAL("verify_plugin_window_rect.html"));
GURL url = ui_test_utils::GetTestUrl(FilePath(kTestDir), test_case);
ASSERT_NO_FATAL_FAILURE(NavigateToURL(url));
WaitForFinish("checkwindowrect", "1", url, kTestCompleteCookie,
kTestCompleteSuccess, action_max_timeout_ms());
}
// Tests that creating a new instance of a plugin while another one is handling
// a paint message doesn't cause deadlock.
TEST_F(NPAPIVisiblePluginTester, CreateInstanceInPaint) {
show_window_ = true;
const FilePath test_case(FILE_PATH_LITERAL("create_instance_in_paint.html"));
GURL url = ui_test_utils::GetTestUrl(FilePath(kTestDir), test_case);
ASSERT_NO_FATAL_FAILURE(NavigateToURL(url));
WaitForFinish("create_instance_in_paint", "2", url, kTestCompleteCookie,
kTestCompleteSuccess, action_max_timeout_ms());
}
// Tests that putting up an alert in response to a paint doesn't deadlock.
TEST_F(NPAPIVisiblePluginTester, AlertInWindowMessage) {
show_window_ = true;
const FilePath test_case(FILE_PATH_LITERAL("alert_in_window_message.html"));
GURL url = ui_test_utils::GetTestUrl(FilePath(kTestDir), test_case);
ASSERT_NO_FATAL_FAILURE(NavigateToURL(url));
bool modal_dialog_showing = false;
MessageBoxFlags::DialogButton available_buttons;
ASSERT_TRUE(automation()->WaitForAppModalDialog());
ASSERT_TRUE(automation()->GetShowingAppModalDialog(&modal_dialog_showing,
&available_buttons));
ASSERT_TRUE(modal_dialog_showing);
ASSERT_NE((MessageBoxFlags::DIALOGBUTTON_OK & available_buttons), 0);
ASSERT_TRUE(automation()->ClickAppModalDialogButton(
MessageBoxFlags::DIALOGBUTTON_OK));
modal_dialog_showing = false;
ASSERT_TRUE(automation()->WaitForAppModalDialog());
ASSERT_TRUE(automation()->GetShowingAppModalDialog(&modal_dialog_showing,
&available_buttons));
ASSERT_TRUE(modal_dialog_showing);
ASSERT_NE((MessageBoxFlags::DIALOGBUTTON_OK & available_buttons), 0);
ASSERT_TRUE(automation()->ClickAppModalDialogButton(
MessageBoxFlags::DIALOGBUTTON_OK));
}
// Flaky, http://crbug.com/34997.
TEST_F(NPAPIVisiblePluginTester, FLAKY_VerifyNPObjectLifetimeTest) {
if (UITest::in_process_renderer())
return;
show_window_ = true;
const FilePath test_case(FILE_PATH_LITERAL("npobject_lifetime_test.html"));
GURL url = ui_test_utils::GetTestUrl(FilePath(kTestDir), test_case);
ASSERT_NO_FATAL_FAILURE(NavigateToURL(url));
WaitForFinish("npobject_lifetime_test", "1", url,
kTestCompleteCookie, kTestCompleteSuccess,
action_max_timeout_ms());
}
// Tests that we don't crash or assert if NPP_New fails
TEST_F(NPAPIVisiblePluginTester, NewFails) {
const FilePath test_case(FILE_PATH_LITERAL("new_fails.html"));
GURL url = ui_test_utils::GetTestUrl(FilePath(kTestDir), test_case);
ASSERT_NO_FATAL_FAILURE(NavigateToURL(url));
WaitForFinish("new_fails", "1", url, kTestCompleteCookie,
kTestCompleteSuccess, action_max_timeout_ms());
}
TEST_F(NPAPIVisiblePluginTester, SelfDeletePluginInNPNEvaluate) {
if (UITest::in_process_renderer())
return;
const FilePath test_case(
FILE_PATH_LITERAL("execute_script_delete_in_npn_evaluate.html"));
GURL url = ui_test_utils::GetTestUrl(FilePath(kTestDir), test_case);
ASSERT_NO_FATAL_FAILURE(NavigateToURL(url));
WaitForFinish("npobject_delete_plugin_in_evaluate", "1", url,
kTestCompleteCookie, kTestCompleteSuccess,
action_max_timeout_ms());
}
#endif
// Flaky. See http://crbug.com/17645
TEST_F(NPAPIVisiblePluginTester, DISABLED_OpenPopupWindowWithPlugin) {
const FilePath test_case(
FILE_PATH_LITERAL("get_javascript_open_popup_with_plugin.html"));
GURL url = ui_test_utils::GetTestUrl(FilePath(kTestDir), test_case);
ASSERT_NO_FATAL_FAILURE(NavigateToURL(url));
WaitForFinish("plugin_popup_with_plugin_target", "1", url,
kTestCompleteCookie, kTestCompleteSuccess,
action_timeout_ms());
}
// Test checking the privacy mode is off.
TEST_F(NPAPITester, PrivateDisabled) {
if (UITest::in_process_renderer())
return;
const FilePath test_case(FILE_PATH_LITERAL("private.html"));
GURL url = ui_test_utils::GetTestUrl(FilePath(kTestDir), test_case);
ASSERT_NO_FATAL_FAILURE(NavigateToURL(url));
WaitForFinish("private", "1", url, kTestCompleteCookie,
kTestCompleteSuccess, action_max_timeout_ms());
}
TEST_F(NPAPITester, ScheduleTimer) {
const FilePath test_case(FILE_PATH_LITERAL("schedule_timer.html"));
GURL url = ui_test_utils::GetTestUrl(FilePath(kTestDir), test_case);
ASSERT_NO_FATAL_FAILURE(NavigateToURL(url));
WaitForFinish("schedule_timer", "1", url, kTestCompleteCookie,
kTestCompleteSuccess, action_max_timeout_ms());
}
TEST_F(NPAPITester, PluginThreadAsyncCall) {
const FilePath test_case(FILE_PATH_LITERAL("plugin_thread_async_call.html"));
GURL url = ui_test_utils::GetTestUrl(FilePath(kTestDir), test_case);
ASSERT_NO_FATAL_FAILURE(NavigateToURL(url));
WaitForFinish("plugin_thread_async_call", "1", url, kTestCompleteCookie,
kTestCompleteSuccess, action_max_timeout_ms());
}
// Test checking the privacy mode is on.
TEST_F(NPAPIIncognitoTester, PrivateEnabled) {
if (UITest::in_process_renderer())
return;
const FilePath test_case(FILE_PATH_LITERAL("private.html?private"));
GURL url = ui_test_utils::GetTestUrl(FilePath(kTestDir), test_case);
ASSERT_NO_FATAL_FAILURE(NavigateToURL(url));
WaitForFinish("private", "1", url, kTestCompleteCookie,
kTestCompleteSuccess, action_max_timeout_ms());
}
#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.
TEST_F(NPAPIVisiblePluginTester, MultipleInstancesSyncCalls) {
if (UITest::in_process_renderer())
return;
const FilePath test_case(
FILE_PATH_LITERAL("multiple_instances_sync_calls.html"));
GURL url = ui_test_utils::GetTestUrl(FilePath(kTestDir), test_case);
ASSERT_NO_FATAL_FAILURE(NavigateToURL(url));
WaitForFinish("multiple_instances_sync_calls", "1", url, kTestCompleteCookie,
kTestCompleteSuccess, action_max_timeout_ms());
}
#endif
TEST_F(NPAPIVisiblePluginTester, GetURLRequestFailWrite) {
if (UITest::in_process_renderer())
return;
GURL url(URLRequestMockHTTPJob::GetMockUrl(
FilePath(FILE_PATH_LITERAL(
"npapi/plugin_url_request_fail_write.html"))));
ASSERT_NO_FATAL_FAILURE(NavigateToURL(url));
WaitForFinish("geturl_fail_write", "1", url, kTestCompleteCookie,
kTestCompleteSuccess, action_max_timeout_ms());
}
#if defined(OS_WIN)
TEST_F(NPAPITester, EnsureScriptingWorksInDestroy) {
if (UITest::in_process_renderer())
return;
const FilePath test_case(
FILE_PATH_LITERAL("ensure_scripting_works_in_destroy.html"));
GURL url = ui_test_utils::GetTestUrl(FilePath(kTestDir), test_case);
ASSERT_NO_FATAL_FAILURE(NavigateToURL(url));
WaitForFinish("ensure_scripting_works_in_destroy", "1", url,
kTestCompleteCookie, kTestCompleteSuccess,
action_max_timeout_ms());
}
// This test uses a Windows Event to signal to the plugin that it should crash
// on NP_Initialize.
// This is flaky. http://crbug.com/32048
TEST_F(NPAPITester, FLAKY_NoHangIfInitCrashes) {
if (UITest::in_process_renderer())
return;
// Only Windows implements the crash service for now.
#if defined(OS_WIN)
expected_crashes_ = 1;
#endif
HANDLE crash_event = CreateEvent(NULL, TRUE, FALSE, L"TestPluginCrashOnInit");
SetEvent(crash_event);
const FilePath test_case(FILE_PATH_LITERAL("no_hang_if_init_crashes.html"));
GURL url = ui_test_utils::GetTestUrl(FilePath(kTestDir), test_case);
NavigateToURL(url);
WaitForFinish("no_hang_if_init_crashes", "1", url,
kTestCompleteCookie, kTestCompleteSuccess,
action_max_timeout_ms());
CloseHandle(crash_event);
}
#endif
TEST_F(NPAPIVisiblePluginTester, PluginReferrerTest) {
if (UITest::in_process_renderer())
return;
GURL url(URLRequestMockHTTPJob::GetMockUrl(
FilePath(FILE_PATH_LITERAL(
"npapi/plugin_url_request_referrer_test.html"))));
ASSERT_NO_FATAL_FAILURE(NavigateToURL(url));
WaitForFinish("plugin_referrer_test", "1", url, kTestCompleteCookie,
kTestCompleteSuccess, action_max_timeout_ms());
}
#if defined(OS_MACOSX)
TEST_F(NPAPIVisiblePluginTester, PluginConvertPointTest) {
if (UITest::in_process_renderer())
return;
scoped_refptr<BrowserProxy> browser(automation()->GetBrowserWindow(0));
ASSERT_TRUE(browser.get());
scoped_refptr<WindowProxy> window(browser->GetWindow());
ASSERT_TRUE(window.get());
window->SetBounds(gfx::Rect(50, 50, 400, 400));
GURL url(URLRequestMockHTTPJob::GetMockUrl(
FilePath(FILE_PATH_LITERAL("npapi/convert_point.html"))));
ASSERT_NO_FATAL_FAILURE(NavigateToURL(url));
// TODO(stuartmorgan): When the automation system supports sending clicks,
// change the test to trigger on mouse-down rather than window focus.
ASSERT_TRUE(browser->BringToFront());
WaitForFinish("convert_point", "1", url, kTestCompleteCookie,
kTestCompleteSuccess, action_max_timeout_ms());
}
#endif