summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorananta@chromium.org <ananta@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2008-10-29 00:35:32 +0000
committerananta@chromium.org <ananta@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2008-10-29 00:35:32 +0000
commitfce8e2fccb2fdb9ed1f52ab9701e5299cec63677 (patch)
tree83dbf1e38ae5eb063e7757e9ce21d6636563f503
parent7c2dbdd0bec7444f895082aed1b4d7b939867a17 (diff)
downloadchromium_src-fce8e2fccb2fdb9ed1f52ab9701e5299cec63677.zip
chromium_src-fce8e2fccb2fdb9ed1f52ab9701e5299cec63677.tar.gz
chromium_src-fce8e2fccb2fdb9ed1f52ab9701e5299cec63677.tar.bz2
Moved the SelfDeletePluginInvokeInSynchronousMouseMove to interactive ui tests
as we need to simulate mousemoves here. ui tests run on machines which are locked, causing this test to fail. Moved the NPAPITester and NPAPIVisiblePluginTester classes to a common file npapi_test_helper.cc so it can be used from both tests. Relanding the SetCursor patch. It has already been approved by John. Description below:- Proposed fix for http://b/issue?id=1362948, which is a crash in the rendererwhen we invoke the setCursor call on the parent view in WebPluginImpl::handleEvent. This crash occurs because the plugin is deleted in the context of a mouse down event. This could occur by invoking a javascript function via NPN_Evaluate. On return from the HandleEvent sync call we attempt to retreive the parent frame, which returns NULL and hence the crash. The fix is to retreive the parent frameview at the start of the WebPluginImpl::handleMouseEvent function and use it whereever needed. Added a unit test which deletes the plugin instance in a mousemove event. R=jam Bug=1362948 Review URL: http://codereview.chromium.org/8691 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@4115 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/SConscript.ui_tests1
-rw-r--r--chrome/test/data/npapi/execute_script_delete_in_mouse_move.html39
-rw-r--r--chrome/test/interactive_ui/SConscript2
-rw-r--r--chrome/test/interactive_ui/interactive_ui.vcproj16
-rw-r--r--chrome/test/interactive_ui/npapi_interactive_test.cc78
-rw-r--r--chrome/test/ui/npapi_test_helper.cc61
-rw-r--r--chrome/test/ui/npapi_test_helper.h48
-rw-r--r--chrome/test/ui/npapi_uitest.cpp42
-rw-r--r--chrome/test/ui/ui_tests.vcproj8
-rw-r--r--webkit/glue/plugins/test/plugin_client.cc7
-rw-r--r--webkit/glue/plugins/test/plugin_execute_script_delete_test.cc52
-rw-r--r--webkit/glue/plugins/test/plugin_execute_script_delete_test.h6
-rw-r--r--webkit/glue/webplugin_impl.cc10
13 files changed, 310 insertions, 60 deletions
diff --git a/chrome/SConscript.ui_tests b/chrome/SConscript.ui_tests
index 0c587b1..0443a4d 100644
--- a/chrome/SConscript.ui_tests
+++ b/chrome/SConscript.ui_tests
@@ -129,6 +129,7 @@ ui_test_files = [
'test/ui/ui_test.cc',
'test/ui/ui_test_suite.cc',
'test/ui/history_uitest.cc',
+ 'test/ui/npapi_test_helper.cc',
'$CHROME_DIR/test/test_file_util$OBJSUFFIX',
'$NET_DIR/url_request/url_request_test_job$OBJSUFFIX',
]
diff --git a/chrome/test/data/npapi/execute_script_delete_in_mouse_move.html b/chrome/test/data/npapi/execute_script_delete_in_mouse_move.html
new file mode 100644
index 0000000..a82cde7
--- /dev/null
+++ b/chrome/test/data/npapi/execute_script_delete_in_mouse_move.html
@@ -0,0 +1,39 @@
+<html>
+
+<head>
+<script src="npapi.js"></script>
+
+<script>
+function DeletePluginWithinScript() {
+ var plugin_div = document.getElementById("PluginDiv");
+ plugin_div.innerHTML = "Object Deleted";
+ onSuccess("execute_script_delete_in_mouse_move", 1);
+}
+</script>
+</head>
+
+<body>
+<div id="statusPanel" style="border: 1px solid red; width: 100%">
+Test running....
+</div>
+
+
+NPObject Proxy Test<p>
+
+Tests the case where a plugin instance is deleted in the context
+of a synchronous mouse event.
+
+<DIV ID=PluginDiv>
+<embed type="application/vnd.npapi-test"
+ src="foo"
+ name="execute_script_delete_in_mouse_move"
+ id="1"
+ mode="np_embed"
+>
+</DIV>
+<script>
+ var height = document.body.offsetHeight;
+</script>
+
+</body>
+</html>
diff --git a/chrome/test/interactive_ui/SConscript b/chrome/test/interactive_ui/SConscript
index 3e79dde..603a25a 100644
--- a/chrome/test/interactive_ui/SConscript
+++ b/chrome/test/interactive_ui/SConscript
@@ -79,6 +79,8 @@ input_files = [
'$CHROME_DIR/test/ui/ui_test_suite$OBJSUFFIX',
'$CHROME_DIR/test/test_file_util$OBJSUFFIX',
'view_event_test_base.cc',
+ '$CHROME_DIR/test/ui/npapi_test_helper.cc',
+ '$CHROME_DIR/test/interactive_ui/npapi_interactive_test.cc',
]
exe = env_test.ChromeTestProgram('interactive_ui_tests', input_files)
diff --git a/chrome/test/interactive_ui/interactive_ui.vcproj b/chrome/test/interactive_ui/interactive_ui.vcproj
index adb9663..4d96759 100644
--- a/chrome/test/interactive_ui/interactive_ui.vcproj
+++ b/chrome/test/interactive_ui/interactive_ui.vcproj
@@ -143,6 +143,14 @@
Name="Common"
>
<File
+ RelativePath="..\ui\npapi_test_helper.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\ui\npapi_test_helper.h"
+ >
+ </File>
+ <File
RelativePath="..\..\tools\build\win\precompiled_wtl.cc"
>
<FileConfiguration
@@ -231,6 +239,14 @@
>
</File>
</Filter>
+ <Filter
+ Name="TestNPAPI"
+ >
+ <File
+ RelativePath=".\npapi_interactive_test.cc"
+ >
+ </File>
+ </Filter>
</Files>
<Globals>
</Globals>
diff --git a/chrome/test/interactive_ui/npapi_interactive_test.cc b/chrome/test/interactive_ui/npapi_interactive_test.cc
new file mode 100644
index 0000000..62b30f4
--- /dev/null
+++ b/chrome/test/interactive_ui/npapi_interactive_test.cc
@@ -0,0 +1,78 @@
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+//
+// NPAPI interactive UI tests.
+//
+
+#include "base/file_util.h"
+#include "chrome/common/chrome_paths.h"
+#include "chrome/test/automation/tab_proxy.h"
+#include "chrome/test/ui/npapi_test_helper.h"
+#include "net/base/net_util.h"
+
+const char kTestCompleteCookie[] = "status";
+const char kTestCompleteSuccess[] = "OK";
+const int kShortWaitTimeout = 5 * 1000;
+
+// Tests if a plugin executing a self deleting script in the context of
+// a synchronous mousemove works correctly
+TEST_F(NPAPIVisiblePluginTester, SelfDeletePluginInvokeInSynchronousMouseMove) {
+ if (!UITest::in_process_plugins() && !UITest::in_process_renderer()) {
+ scoped_ptr<TabProxy> tab_proxy(GetActiveTab());
+ HWND tab_window = NULL;
+ tab_proxy->GetHWND(&tab_window);
+
+ EXPECT_TRUE(IsWindow(tab_window));
+
+ show_window_ = true;
+ std::wstring test_case = L"execute_script_delete_in_mouse_move.html";
+ GURL url = GetTestUrl(L"npapi", test_case);
+ NavigateToURL(url);
+
+ POINT cursor_position = {130, 130};
+ ClientToScreen(tab_window, &cursor_position);
+
+ double screen_width = ::GetSystemMetrics( SM_CXSCREEN ) - 1;
+ double screen_height = ::GetSystemMetrics( SM_CYSCREEN ) - 1;
+ double location_x = cursor_position.x * (65535.0f / screen_width);
+ double location_y = cursor_position.y * (65535.0f / screen_height);
+
+ INPUT input_info = {0};
+ input_info.type = INPUT_MOUSE;
+ input_info.mi.dwFlags = MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE;
+ input_info.mi.dx = static_cast<long>(location_x);
+ input_info.mi.dy = static_cast<long>(location_y);
+ ::SendInput(1, &input_info, sizeof(INPUT));
+
+ WaitForFinish("execute_script_delete_in_mouse_move", "1", url,
+ kTestCompleteCookie, kTestCompleteSuccess,
+ kShortWaitTimeout);
+ }
+}
diff --git a/chrome/test/ui/npapi_test_helper.cc b/chrome/test/ui/npapi_test_helper.cc
new file mode 100644
index 0000000..83e3c5b
--- /dev/null
+++ b/chrome/test/ui/npapi_test_helper.cc
@@ -0,0 +1,61 @@
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// NPAPI test helper classes.
+
+#include "chrome/test/ui/npapi_test_helper.h"
+
+NPAPITester::NPAPITester()
+ : UITest() {
+}
+
+void NPAPITester::SetUp() {
+ // We need to copy our test-plugin into the plugins directory so that
+ // the browser can load it.
+ std::wstring plugins_directory = browser_directory_ + L"\\plugins";
+ std::wstring plugin_src = browser_directory_ + L"\\npapi_test_plugin.dll";
+ plugin_dll_ = plugins_directory + L"\\npapi_test_plugin.dll";
+
+ CreateDirectory(plugins_directory.c_str(), NULL);
+ CopyFile(plugin_src.c_str(), plugin_dll_.c_str(), FALSE);
+
+ UITest::SetUp();
+}
+
+void NPAPITester::TearDown() {
+ DeleteFile(plugin_dll_.c_str());
+ UITest::TearDown();
+}
+
+
+// NPAPIVisiblePluginTester members.
+void NPAPIVisiblePluginTester::SetUp() {
+ show_window_ = true;
+ NPAPITester::SetUp();
+}
diff --git a/chrome/test/ui/npapi_test_helper.h b/chrome/test/ui/npapi_test_helper.h
new file mode 100644
index 0000000..26f4c67
--- /dev/null
+++ b/chrome/test/ui/npapi_test_helper.h
@@ -0,0 +1,48 @@
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#include "chrome/test/ui/ui_test.h"
+
+// Helper class for NPAPI plugin UI tests.
+class NPAPITester : public UITest {
+ protected:
+ NPAPITester();
+ virtual void SetUp();
+ virtual void TearDown();
+
+private:
+ std::wstring plugin_dll_;
+};
+
+// Helper class for NPAPI plugin UI tests, which need the browser window
+// to be visible.
+class NPAPIVisiblePluginTester : public NPAPITester {
+ protected:
+ virtual void SetUp();
+};
diff --git a/chrome/test/ui/npapi_uitest.cpp b/chrome/test/ui/npapi_uitest.cpp
index bce1497..2657220 100644
--- a/chrome/test/ui/npapi_uitest.cpp
+++ b/chrome/test/ui/npapi_uitest.cpp
@@ -48,7 +48,7 @@
#include "base/file_util.h"
#include "chrome/common/chrome_paths.h"
#include "chrome/test/automation/tab_proxy.h"
-#include "chrome/test/ui/ui_test.h"
+#include "chrome/test/ui/npapi_test_helper.h"
#include "net/base/net_util.h"
const char kTestCompleteCookie[] = "status";
@@ -66,44 +66,6 @@ std::ostream& operator<<(std::ostream& out, const CComBSTR &str)
return out << szFinal;
}
-class NPAPITester : public UITest {
- protected:
- NPAPITester() : UITest()
- {
- }
-
- virtual void SetUp()
- {
- // We need to copy our test-plugin into the plugins directory so that
- // the browser can load it.
- std::wstring plugins_directory = browser_directory_ + L"\\plugins";
- std::wstring plugin_src = browser_directory_ + L"\\npapi_test_plugin.dll";
- plugin_dll_ = plugins_directory + L"\\npapi_test_plugin.dll";
-
- CreateDirectory(plugins_directory.c_str(), NULL);
- CopyFile(plugin_src.c_str(), plugin_dll_.c_str(), FALSE);
-
- UITest::SetUp();
- }
-
- virtual void TearDown()
- {
- DeleteFile(plugin_dll_.c_str());
- UITest::TearDown();
- }
-
-private:
- std::wstring plugin_dll_;
-};
-
-class NPAPIVisiblePluginTester : public NPAPITester {
- protected:
- virtual void SetUp() {
- show_window_ = true;
- NPAPITester::SetUp();
- }
-};
-
// Test passing arguments to a plugin.
TEST_F(NPAPITester, Arguments) {
std::wstring test_case = L"arguments.html";
@@ -279,4 +241,4 @@ TEST_F(NPAPIVisiblePluginTester, OpenPopupWindowWithPlugin) {
WaitForFinish("plugin_popup_with_plugin_target", "1", url,
kTestCompleteCookie, kTestCompleteSuccess,
kShortWaitTimeout);
-} \ No newline at end of file
+}
diff --git a/chrome/test/ui/ui_tests.vcproj b/chrome/test/ui/ui_tests.vcproj
index f89d52d..5bfe40e 100644
--- a/chrome/test/ui/ui_tests.vcproj
+++ b/chrome/test/ui/ui_tests.vcproj
@@ -146,6 +146,14 @@
Name="Common"
>
<File
+ RelativePath=".\npapi_test_helper.cc"
+ >
+ </File>
+ <File
+ RelativePath=".\npapi_test_helper.h"
+ >
+ </File>
+ <File
RelativePath="..\..\tools\build\win\precompiled_wtl.cc"
>
<FileConfiguration
diff --git a/webkit/glue/plugins/test/plugin_client.cc b/webkit/glue/plugins/test/plugin_client.cc
index 868810e..b0e7e91 100644
--- a/webkit/glue/plugins/test/plugin_client.cc
+++ b/webkit/glue/plugins/test/plugin_client.cc
@@ -102,7 +102,7 @@ NPError NPP_New(NPMIMEType pluginType, NPP instance, uint16 mode,
} else if (base::strcasecmp(argv[name_index],
"execute_script_delete_in_paint") == 0) {
new_test = new NPAPIClient::ExecuteScriptDeleteTest(instance,
- NPAPIClient::PluginClient::HostFunctions());
+ NPAPIClient::PluginClient::HostFunctions(), argv[name_index]);
windowless_plugin = true;
} else if (base::strcasecmp(argv[name_index], "getjavascripturl") == 0) {
new_test = new NPAPIClient::ExecuteGetJavascriptUrlTest(instance,
@@ -137,6 +137,11 @@ NPError NPP_New(NPMIMEType pluginType, NPP instance, uint16 mode,
"plugin_popup_with_plugin_target") == 0) {
new_test = new NPAPIClient::ExecuteJavascriptPopupWindowTargetPluginTest(
instance, NPAPIClient::PluginClient::HostFunctions());
+ } else if (base::strcasecmp(argv[name_index],
+ "execute_script_delete_in_mouse_move") == 0) {
+ new_test = new NPAPIClient::ExecuteScriptDeleteTest(instance,
+ NPAPIClient::PluginClient::HostFunctions(), argv[name_index]);
+ windowless_plugin = true;
} else {
// If we don't have a test case for this, create a
// generic one which basically never fails.
diff --git a/webkit/glue/plugins/test/plugin_execute_script_delete_test.cc b/webkit/glue/plugins/test/plugin_execute_script_delete_test.cc
index 7137ceb..3f1d0e1 100644
--- a/webkit/glue/plugins/test/plugin_execute_script_delete_test.cc
+++ b/webkit/glue/plugins/test/plugin_execute_script_delete_test.cc
@@ -8,25 +8,47 @@
namespace NPAPIClient {
-ExecuteScriptDeleteTest::ExecuteScriptDeleteTest(NPP id, NPNetscapeFuncs *host_functions)
- : PluginTest(id, host_functions) {
+ExecuteScriptDeleteTest::ExecuteScriptDeleteTest(
+ NPP id, NPNetscapeFuncs *host_functions, const std::string& test_name)
+ : PluginTest(id, host_functions),
+ test_name_(test_name) {
}
int16 ExecuteScriptDeleteTest::HandleEvent(void* event) {
+
+ NPNetscapeFuncs* browser = NPAPIClient::PluginClient::HostFunctions();
+
+ NPBool supports_windowless = 0;
+ NPError result = browser->getvalue(id(), NPNVSupportsWindowless,
+ &supports_windowless);
+ if ((result != NPERR_NO_ERROR) || (supports_windowless != TRUE)) {
+ SetError("Failed to read NPNVSupportsWindowless value");
+ SignalTestCompleted();
+ return PluginTest::HandleEvent(event);
+ }
+
NPEvent* np_event = reinterpret_cast<NPEvent*>(event);
- if (WM_PAINT == np_event->event ) {
- NPNetscapeFuncs* browser = NPAPIClient::PluginClient::HostFunctions();
-
- NPBool supports_windowless = 0;
- NPError result = browser->getvalue(id(), NPNVSupportsWindowless,
- &supports_windowless);
- if ((result != NPERR_NO_ERROR) || (supports_windowless != TRUE)) {
- SetError("Failed to read NPNVSupportsWindowless value");
- } else {
- NPUTF8* urlString = "javascript:DeletePluginWithinScript()";
- NPUTF8* targetString = NULL;
- browser->geturl(id(), urlString, targetString);
- }
+ if (WM_PAINT == np_event->event &&
+ base::strcasecmp(test_name_.c_str(),
+ "execute_script_delete_in_paint") == 0) {
+ NPUTF8* urlString = "javascript:DeletePluginWithinScript()";
+ NPUTF8* targetString = NULL;
+ browser->geturl(id(), urlString, targetString);
+ SignalTestCompleted();
+ } else if (WM_MOUSEMOVE == np_event->event &&
+ base::strcasecmp(test_name_.c_str(),
+ "execute_script_delete_in_mouse_move") == 0) {
+ std::string script = "javascript:DeletePluginWithinScript()";
+ NPString script_string;
+ script_string.UTF8Characters = script.c_str();
+ script_string.UTF8Length =
+ static_cast<unsigned int>(script.length());
+
+ NPObject *window_obj = NULL;
+ browser->getvalue(id(), NPNVWindowNPObject, &window_obj);
+ NPVariant result_var;
+ NPError result = browser->evaluate(id(), window_obj,
+ &script_string, &result_var);
SignalTestCompleted();
}
// If this test failed, then we'd have crashed by now.
diff --git a/webkit/glue/plugins/test/plugin_execute_script_delete_test.h b/webkit/glue/plugins/test/plugin_execute_script_delete_test.h
index 5266d6d..92a1d04 100644
--- a/webkit/glue/plugins/test/plugin_execute_script_delete_test.h
+++ b/webkit/glue/plugins/test/plugin_execute_script_delete_test.h
@@ -14,9 +14,13 @@ namespace NPAPIClient {
class ExecuteScriptDeleteTest : public PluginTest {
public:
// Constructor.
- ExecuteScriptDeleteTest(NPP id, NPNetscapeFuncs *host_functions);
+ ExecuteScriptDeleteTest(NPP id, NPNetscapeFuncs *host_functions,
+ const std::string& test_name);
// NPAPI HandleEvent handler
virtual int16 HandleEvent(void* event);
+
+ private:
+ std::string test_name_;
};
} // namespace NPAPIClient
diff --git a/webkit/glue/webplugin_impl.cc b/webkit/glue/webplugin_impl.cc
index 496de7f..36d7fc6 100644
--- a/webkit/glue/webplugin_impl.cc
+++ b/webkit/glue/webplugin_impl.cc
@@ -786,9 +786,13 @@ void WebPluginImpl::handleEvent(WebCore::Event* event) {
void WebPluginImpl::handleMouseEvent(WebCore::MouseEvent* event) {
#if defined(OS_WIN)
DCHECK(parent()->isFrameView());
+ // We cache the parent FrameView here as the plugin widget could be deleted
+ // in the call to HandleEvent. See http://b/issue?id=1362948
+ WebCore::FrameView* parent_view = static_cast<WebCore::FrameView*>(parent());
+
WebCore::IntPoint p =
- static_cast<WebCore::FrameView*>(parent())->contentsToWindow(
- WebCore::IntPoint(event->pageX(), event->pageY()));
+ parent_view->contentsToWindow(WebCore::IntPoint(event->pageX(),
+ event->pageY()));
NPEvent np_event;
np_event.lParam = static_cast<uint32>(MAKELPARAM(p.x(), p.y()));
np_event.wParam = 0;
@@ -867,7 +871,7 @@ void WebPluginImpl::handleMouseEvent(WebCore::MouseEvent* event) {
// A windowless plugin can change the cursor in response to the WM_MOUSEMOVE
// event. We need to reflect the changed cursor in the frame view as the
// the mouse is moved in the boundaries of the windowless plugin.
- parent()->setCursor(WebCore::PlatformCursor(current_web_cursor));
+ parent_view->setCursor(WebCore::PlatformCursor(current_web_cursor));
#else
NOTIMPLEMENTED();
#endif