diff options
Diffstat (limited to 'Tools/DumpRenderTree/TestNetscapePlugIn/win/WindowGeometryTest.cpp')
| -rw-r--r-- | Tools/DumpRenderTree/TestNetscapePlugIn/win/WindowGeometryTest.cpp | 130 |
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; +} |
