// Copyright (c) 2006-2008 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 #include "base/file_path.h" #include "base/file_util.h" #include "base/path_service.h" #include "base/string_util.h" #include "net/base/escape.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/WebKit/Source/WebKit/chromium/public/WebData.h" #include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" #include "third_party/WebKit/Source/WebKit/chromium/public/WebInputEvent.h" #include "third_party/WebKit/Source/WebKit/chromium/public/WebScriptSource.h" #include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h" #include "webkit/tools/test_shell/test_shell.h" #include "webkit/tools/test_shell/test_shell_test.h" using WebKit::WebFrame; using WebKit::WebScriptSource; using WebKit::WebString; #if defined(OS_WIN) #define TEST_PLUGIN_NAME "npapi_test_plugin.dll" #elif defined(OS_MACOSX) #define TEST_PLUGIN_NAME "npapi_test_plugin.plugin" #elif defined(OS_POSIX) #define TEST_PLUGIN_NAME "libnpapi_test_plugin.so" #endif namespace { const char kPluginsDir[] = "plugins"; } // Ignore these until 64-bit plugin build is fixed. http://crbug.com/18337 #if !defined(ARCH_CPU_64_BITS) // Provides functionality for creating plugin tests. class PluginTest : public TestShellTest { public: PluginTest() { FilePath executable_directory; PathService::Get(base::DIR_EXE, &executable_directory); plugin_src_ = executable_directory.AppendASCII(TEST_PLUGIN_NAME); CHECK(file_util::PathExists(plugin_src_)); plugin_file_path_ = executable_directory.AppendASCII(kPluginsDir); file_util::CreateDirectory(plugin_file_path_); plugin_file_path_ = plugin_file_path_.AppendASCII(TEST_PLUGIN_NAME); } void CopyTestPlugin() { // On Linux, we need to delete before copying because if the plugin is a // hard link, the copy will fail. DeleteTestPlugin(); ASSERT_TRUE(file_util::CopyDirectory(plugin_src_, plugin_file_path_, true)); } void DeleteTestPlugin() { file_util::Delete(plugin_file_path_, true); } virtual void SetUp() { CopyTestPlugin(); TestShellTest::SetUp(); } FilePath plugin_src_; FilePath plugin_file_path_; }; // Tests navigator.plugins.refresh() works. TEST_F(PluginTest, Refresh) { std::string html = "\
Test running....
\ \ "; WebScriptSource call_check( WebString::fromUTF8("check();")); WebScriptSource refresh( WebString::fromUTF8("navigator.plugins.refresh(false)")); // Remove any leftover from previous tests if they exist. We must also // refresh WebKit's plugin cache since it might have had an entry for the // test plugin from a previous test. DeleteTestPlugin(); ASSERT_FALSE(file_util::PathExists(plugin_file_path_)); test_shell_->webView()->mainFrame()->executeScript(refresh); test_shell_->webView()->mainFrame()->loadHTMLString( html, GURL("about:blank")); test_shell_->WaitTestFinished(); std::string text; test_shell_->webView()->mainFrame()->executeScript(call_check); text = test_shell_->webView()->mainFrame()->contentAsText(10000).utf8(); ASSERT_EQ(text, "FAIL"); CopyTestPlugin(); test_shell_->webView()->mainFrame()->executeScript(refresh); test_shell_->webView()->mainFrame()->executeScript(call_check); text = test_shell_->webView()->mainFrame()->contentAsText(10000).utf8(); ASSERT_EQ(text, "DONE"); } // Tests that if a frame is deleted as a result of calling NPP_HandleEvent, we // don't crash. TEST_F(PluginTest, DeleteFrameDuringEvent) { FilePath test_html = data_dir_; test_html = test_html.AppendASCII(kPluginsDir); test_html = test_html.AppendASCII("delete_frame.html"); test_shell_->LoadFile(test_html); test_shell_->WaitTestFinished(); WebKit::WebMouseEvent input; input.button = WebKit::WebMouseEvent::ButtonLeft; input.x = 50; input.y = 50; input.type = WebKit::WebInputEvent::MouseUp; test_shell_->webView()->handleInputEvent(input); // No crash means we passed. } // Tests that a forced reload of the plugin will not crash. TEST_F(PluginTest, ForceReload) { FilePath test_html = data_dir_; test_html = test_html.AppendASCII(kPluginsDir); test_html = test_html.AppendASCII("force_reload.html"); test_shell_->LoadFile(test_html); test_shell_->WaitTestFinished(); // No crash means we passed. } #if defined(OS_WIN) BOOL CALLBACK EnumChildProc(HWND hwnd, LPARAM lparam) { HWND* plugin_hwnd = reinterpret_cast(lparam); if (*plugin_hwnd) { // More than one child window found, unexpected. plugin_hwnd = NULL; return FALSE; } *plugin_hwnd = hwnd; return TRUE; } // Tests that hiding/showing the parent frame hides/shows the plugin. TEST_F(PluginTest, PluginVisibilty) { FilePath test_html = data_dir_; test_html = test_html.AppendASCII(kPluginsDir); test_html = test_html.AppendASCII("plugin_visibility.html"); test_shell_->LoadFile(test_html); test_shell_->WaitTestFinished(); WebFrame* main_frame = test_shell_->webView()->mainFrame(); HWND frame_hwnd = test_shell_->webViewWnd(); HWND plugin_hwnd = NULL; EnumChildWindows(frame_hwnd, EnumChildProc, reinterpret_cast(&plugin_hwnd)); ASSERT_TRUE(plugin_hwnd != NULL); ASSERT_FALSE(IsWindowVisible(plugin_hwnd)); main_frame->executeScript(WebString::fromUTF8("showPlugin(true)")); ASSERT_TRUE(IsWindowVisible(plugin_hwnd)); main_frame->executeScript(WebString::fromUTF8("showFrame(false)")); ASSERT_FALSE(IsWindowVisible(plugin_hwnd)); main_frame->executeScript(WebString::fromUTF8("showFrame(true)")); ASSERT_TRUE(IsWindowVisible(plugin_hwnd)); } #endif #endif //!ARCH_CPU_64_BITS