summaryrefslogtreecommitdiff
path: root/Tools/DumpRenderTree/TestNetscapePlugIn/win/WindowGeometryTest.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Tools/DumpRenderTree/TestNetscapePlugIn/win/WindowGeometryTest.cpp')
-rw-r--r--Tools/DumpRenderTree/TestNetscapePlugIn/win/WindowGeometryTest.cpp130
1 files changed, 130 insertions, 0 deletions
diff --git a/Tools/DumpRenderTree/TestNetscapePlugIn/win/WindowGeometryTest.cpp b/Tools/DumpRenderTree/TestNetscapePlugIn/win/WindowGeometryTest.cpp
new file mode 100644
index 000000000..be7bfb31c
--- /dev/null
+++ b/Tools/DumpRenderTree/TestNetscapePlugIn/win/WindowGeometryTest.cpp
@@ -0,0 +1,130 @@
+/*
+ * Copyright (C) 2010, 2011 Apple 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:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS 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 APPLE INC. OR ITS 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 "WindowGeometryTest.h"
+
+#include "PluginObject.h"
+
+using namespace std;
+
+WindowGeometryTest::WindowGeometryTest(NPP npp, const string& identifier)
+ : WindowedPluginTest(npp, identifier)
+ , m_testHarnessWindowWasVisible(false)
+{
+}
+
+void WindowGeometryTest::startTest()
+{
+ // In WebKit1, our window's window region will be set immediately. In WebKit2, it won't be set
+ // until the UI process paints. Since the UI process will also show our window when it paints,
+ // we can detect when the paint occurs (and thus when our window region should be set) by
+ // starting with our plugin element hidden, then making it visible and waiting for a
+ // WM_WINDOWPOSCHANGED event to tell us our window has been shown.
+
+ waitUntilDone();
+
+ // If the test harness window isn't visible, we might not receive a WM_WINDOWPOSCHANGED message
+ // when our window is made visible. So we temporarily show the test harness window during this test.
+ showTestHarnessWindowIfNeeded();
+
+ // Make our window visible. (In WebKit2, this won't take effect immediately.)
+ executeScript("document.getElementsByTagName('embed')[0].style.visibility = 'visible';");
+
+ // We trigger a UI process paint after a slight delay to ensure that the UI process has
+ // received the "make the plugin window visible" message before it paints.
+ // FIXME: It would be nice to have a way to guarantee that the UI process had received that
+ // message before we triggered a paint. Hopefully that would let us get rid of this semi-
+ // arbitrary timeout.
+ ::SetTimer(window(), triggerPaintTimerID, 250, 0);
+}
+
+void WindowGeometryTest::finishTest()
+{
+ performWindowGeometryTest();
+ hideTestHarnessWindowIfNeeded();
+ notifyDone();
+}
+
+void WindowGeometryTest::showTestHarnessWindowIfNeeded()
+{
+ HWND testHarnessWindow = this->testHarnessWindow();
+ m_testHarnessWindowWasVisible = ::IsWindowVisible(testHarnessWindow);
+ if (m_testHarnessWindowWasVisible)
+ return;
+ ::ShowWindow(testHarnessWindow, SW_SHOWNA);
+}
+
+void WindowGeometryTest::hideTestHarnessWindowIfNeeded()
+{
+ if (m_testHarnessWindowWasVisible)
+ return;
+ ::ShowWindow(testHarnessWindow(), SW_HIDE);
+}
+
+LRESULT WindowGeometryTest::wndProc(UINT message, WPARAM wParam, LPARAM lParam, bool& handled)
+{
+ switch (message) {
+ case WM_TIMER:
+ if (wParam != triggerPaintTimerID)
+ break;
+ handled = true;
+ ::KillTimer(window(), wParam);
+ // Tell the UI process to paint.
+ ::PostMessageW(::GetParent(window()), WM_PAINT, 0, 0);
+ break;
+ case WM_WINDOWPOSCHANGED: {
+ WINDOWPOS* windowPos = reinterpret_cast<WINDOWPOS*>(lParam);
+ if (!(windowPos->flags & SWP_SHOWWINDOW))
+ break;
+ finishTest();
+ break;
+ }
+
+ }
+
+ return 0;
+}
+
+NPError WindowGeometryTest::NPP_GetValue(NPPVariable variable, void* value)
+{
+ if (variable != NPPVpluginScriptableNPObject)
+ return NPERR_GENERIC_ERROR;
+
+ *static_cast<NPObject**>(value) = ScriptObject::create(this);
+
+ return NPERR_NO_ERROR;
+}
+
+bool WindowGeometryTest::ScriptObject::hasMethod(NPIdentifier methodName)
+{
+ return methodName == pluginTest()->NPN_GetStringIdentifier("startTest");
+}
+
+bool WindowGeometryTest::ScriptObject::invoke(NPIdentifier identifier, const NPVariant*, uint32_t, NPVariant*)
+{
+ assert(identifier == pluginTest()->NPN_GetStringIdentifier("startTest"));
+ static_cast<WindowGeometryTest*>(pluginTest())->startTest();
+ return true;
+}