18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2006, 2007, 2008 Apple Inc. All rights reserved.
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2008 Collabora Ltd. All rights reserved.
40bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * Copyright (C) 2008-2009 Torch Mobile, Inc. All rights reserved.
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met:
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1. Redistributions of source code must retain the above copyright
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    notice, this list of conditions and the following disclaimer.
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    notice, this list of conditions and the following disclaimer in the
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    documentation and/or other materials provided with the distribution.
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h"
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PluginView.h"
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
31231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "BitmapImage.h"
3253733164eb6cabab5a1eddcabb42e4ce27eb0e44Ben Murdoch#include "BridgeJSC.h"
33967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch#include "Chrome.h"
34967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch#include "ChromeClient.h"
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Document.h"
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "DocumentLoader.h"
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Element.h"
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "EventNames.h"
39dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "FocusController.h"
40dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "Frame.h"
418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FrameLoadRequest.h"
42dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "FrameLoader.h"
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FrameTree.h"
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FrameView.h"
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "GraphicsContext.h"
468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HTMLNames.h"
478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HTMLPlugInElement.h"
48dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "HostWindow.h"
49dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "Image.h"
50dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "JSDOMBinding.h"
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "JSDOMWindow.h"
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "KeyboardEvent.h"
535abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#include "LocalWindowsContext.h"
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "MIMETypeRegistry.h"
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "MouseEvent.h"
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Page.h"
578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PlatformMouseEvent.h"
58dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "PluginDatabase.h"
59dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "PluginDebug.h"
60dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "PluginMainThreadScheduler.h"
618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PluginMessageThrottlerWin.h"
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PluginPackage.h"
63231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "RenderWidget.h"
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ScriptController.h"
651325a8463a7f9bc2ec969c7728aba33e3de91a17Steve Block#include "Settings.h"
66dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "WebCoreInstanceHandle.h"
678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "c_instance.h"
688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "npruntime_impl.h"
698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "runtime_root.h"
708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <runtime/JSLock.h>
718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <runtime/JSValue.h>
728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wtf/ASCIICType.h>
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
74dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#if !PLATFORM(WX)
75dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "BitmapInfo.h"
76dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif
77dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
78d0825bca7fe65beaee391d30da42e937db621564Steve Block#if OS(WINCE)
790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#undef LOG_NPERROR
800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#define LOG_NPERROR(x)
810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#undef LOG_PLUGIN_NET_ERROR
820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#define LOG_PLUGIN_NET_ERROR()
830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif
840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
852daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if USE(CAIRO)
862bde8e466a4451c7319e3a072d118917957d6554Steve Block#include "PlatformContextCairo.h"
87d0825bca7fe65beaee391d30da42e937db621564Steve Block#include <cairo-win32.h>
88d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif
89d0825bca7fe65beaee391d30da42e937db621564Steve Block
908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if PLATFORM(QT)
91231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "QWebPageClient.h"
92cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block#include <QWidget>
938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
95643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#if PLATFORM(WX)
96643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include <wx/defs.h>
97643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include <wx/window.h>
98643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#endif
99643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
100231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockstatic inline HWND windowHandleForPageClient(PlatformPageClient client)
1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if PLATFORM(QT)
103231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (!client)
1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
105d0825bca7fe65beaee391d30da42e937db621564Steve Block    if (QWidget* pluginParent = qobject_cast<QWidget*>(client->pluginParent()))
106d0825bca7fe65beaee391d30da42e937db621564Steve Block        return pluginParent->winId();
107d0825bca7fe65beaee391d30da42e937db621564Steve Block    return 0;
108643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#elif PLATFORM(WX)
109643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (!client)
110643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return 0;
111643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return (HWND)client->GetHandle();
1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#else
113231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    return client;
1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing JSC::ExecState;
1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing JSC::JSLock;
1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing JSC::JSObject;
1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing JSC::UString;
1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing std::min;
1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing namespace WTF;
1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore {
1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing namespace HTMLNames;
1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectconst LPCWSTR kWebPluginViewdowClassName = L"WebPluginView";
1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectconst LPCWSTR kWebPluginViewProperty = L"WebPluginViewProperty";
1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
133d0825bca7fe65beaee391d30da42e937db621564Steve Block#if !OS(WINCE)
134635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project// The code used to hook BeginPaint/EndPaint originally came from
135635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project// <http://www.fengyuan.com/article/wmprint.html>.
136635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project// Copyright (C) 2000 by Feng Yuan (www.fengyuan.com).
137635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
138635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectstatic unsigned beginPaintSysCall;
139635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectstatic BYTE* beginPaint;
140635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
141635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectstatic unsigned endPaintSysCall;
142635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectstatic BYTE* endPaint;
143635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
144231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blocktypedef HDC (WINAPI *PtrBeginPaint)(HWND, PAINTSTRUCT*);
145231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blocktypedef BOOL (WINAPI *PtrEndPaint)(HWND, const PAINTSTRUCT*);
146231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
14721939df44de1705786c545cd1bf519d47250322dBen Murdoch#if OS(WINDOWS) && CPU(X86_64) && COMPILER(MSVC)
148231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockextern "C" HDC __stdcall _HBeginPaint(HWND hWnd, LPPAINTSTRUCT lpPaint);
149231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockextern "C" BOOL __stdcall _HEndPaint(HWND hWnd, const PAINTSTRUCT* lpPaint);
150231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif
151231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
152635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectHDC WINAPI PluginView::hookedBeginPaint(HWND hWnd, PAINTSTRUCT* lpPaint)
153635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
154635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    PluginView* pluginView = reinterpret_cast<PluginView*>(GetProp(hWnd, kWebPluginViewProperty));
155635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (pluginView && pluginView->m_wmPrintHDC) {
156635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // We're secretly handling WM_PRINTCLIENT, so set up the PAINTSTRUCT so
157635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // that the plugin will paint into the HDC we provide.
158635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        memset(lpPaint, 0, sizeof(PAINTSTRUCT));
159635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        lpPaint->hdc = pluginView->m_wmPrintHDC;
160635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        GetClientRect(hWnd, &lpPaint->rcPaint);
161635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return pluginView->m_wmPrintHDC;
162635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
163635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
1640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#if COMPILER(GCC)
1650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    HDC result;
1660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    asm ("push    %2\n"
1670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch         "push    %3\n"
1680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch         "call    *%4\n"
1690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch         : "=a" (result)
170643ca7872b450ea4efacab6188849e5aac2ba161Steve Block         : "a" (beginPaintSysCall), "g" (lpPaint), "g" (hWnd), "m" (beginPaint)
1710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch         : "memory"
1720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        );
1730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return result;
174231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#elif defined(_M_IX86)
175635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Call through to the original BeginPaint.
176635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    __asm   mov     eax, beginPaintSysCall
177635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    __asm   push    lpPaint
178635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    __asm   push    hWnd
179635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    __asm   call    beginPaint
180231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#else
181231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    return _HBeginPaint(hWnd, lpPaint);
1820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif
183635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
184635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
185635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectBOOL WINAPI PluginView::hookedEndPaint(HWND hWnd, const PAINTSTRUCT* lpPaint)
186635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
187635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    PluginView* pluginView = reinterpret_cast<PluginView*>(GetProp(hWnd, kWebPluginViewProperty));
188635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (pluginView && pluginView->m_wmPrintHDC) {
189635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // We're secretly handling WM_PRINTCLIENT, so we don't have to do any
190635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // cleanup.
191635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return TRUE;
192635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
193635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
1940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#if COMPILER(GCC)
1950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    BOOL result;
1960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    asm ("push   %2\n"
1970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch         "push   %3\n"
1980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch         "call   *%4\n"
1990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch         : "=a" (result)
200643ca7872b450ea4efacab6188849e5aac2ba161Steve Block         : "a" (endPaintSysCall), "g" (lpPaint), "g" (hWnd), "m" (endPaint)
2010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        );
2020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return result;
203231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#elif defined (_M_IX86)
204635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Call through to the original EndPaint.
205635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    __asm   mov     eax, endPaintSysCall
206635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    __asm   push    lpPaint
207635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    __asm   push    hWnd
208635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    __asm   call    endPaint
209231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#else
210231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    return _HEndPaint(hWnd, lpPaint);
2110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif
212635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
213635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
214635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectstatic void hook(const char* module, const char* proc, unsigned& sysCallID, BYTE*& pProc, const void* pNewProc)
215635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
216635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // See <http://www.fengyuan.com/article/wmprint.html> for an explanation of
217635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // how this function works.
218635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
219635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    HINSTANCE hMod = GetModuleHandleA(module);
220635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
2210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    pProc = reinterpret_cast<BYTE*>(reinterpret_cast<ptrdiff_t>(GetProcAddress(hMod, proc)));
222635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
223231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if COMPILER(GCC) || defined(_M_IX86)
224635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (pProc[0] != 0xB8)
225635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return;
226635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
227635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // FIXME: Should we be reading the bytes one-by-one instead of doing an
228635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // unaligned read?
229635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    sysCallID = *reinterpret_cast<unsigned*>(pProc + 1);
230635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
231635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DWORD flOldProtect;
232635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (!VirtualProtect(pProc, 5, PAGE_EXECUTE_READWRITE, &flOldProtect))
233635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return;
234635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
235635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    pProc[0] = 0xE9;
236635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    *reinterpret_cast<unsigned*>(pProc + 1) = reinterpret_cast<intptr_t>(pNewProc) - reinterpret_cast<intptr_t>(pProc + 5);
237635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
238635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    pProc += 5;
239231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#else
240231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    /* Disassembly of BeginPaint()
241231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    00000000779FC5B0 4C 8B D1         mov         r10,rcx
242231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    00000000779FC5B3 B8 17 10 00 00   mov         eax,1017h
243231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    00000000779FC5B8 0F 05            syscall
244231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    00000000779FC5BA C3               ret
245231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    00000000779FC5BB 90               nop
246231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    00000000779FC5BC 90               nop
247231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    00000000779FC5BD 90               nop
248231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    00000000779FC5BE 90               nop
249231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    00000000779FC5BF 90               nop
250231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    00000000779FC5C0 90               nop
251231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    00000000779FC5C1 90               nop
252231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    00000000779FC5C2 90               nop
253231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    00000000779FC5C3 90               nop
254231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    */
255231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // Check for the signature as in the above disassembly
256231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    DWORD guard = 0xB8D18B4C;
257231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (*reinterpret_cast<DWORD*>(pProc) != guard)
258231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return;
259231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
260231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    DWORD flOldProtect;
261231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    VirtualProtect(pProc, 12, PAGE_EXECUTE_READWRITE, & flOldProtect);
262231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    pProc[0] = 0x48;    // mov rax, this
263231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    pProc[1] = 0xb8;
264231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    *(__int64*)(pProc+2) = (__int64)pNewProc;
265231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    pProc[10] = 0xff;   // jmp rax
266231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    pProc[11] = 0xe0;
267231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif
268635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
269635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
270635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectstatic void setUpOffscreenPaintingHooks(HDC (WINAPI*hookedBeginPaint)(HWND, PAINTSTRUCT*), BOOL (WINAPI*hookedEndPaint)(HWND, const PAINTSTRUCT*))
271635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
272635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    static bool haveHooked = false;
273635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (haveHooked)
274635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return;
275635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    haveHooked = true;
276635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
277635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Most (all?) windowed plugins don't seem to respond to WM_PRINTCLIENT, so
278635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // we hook into BeginPaint/EndPaint to allow their normal WM_PAINT handling
279635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // to draw into a given HDC. Note that this hooking affects the entire
280635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // process.
2810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    hook("user32.dll", "BeginPaint", beginPaintSysCall, beginPaint, reinterpret_cast<const void *>(reinterpret_cast<ptrdiff_t>(hookedBeginPaint)));
2820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    hook("user32.dll", "EndPaint", endPaintSysCall, endPaint, reinterpret_cast<const void *>(reinterpret_cast<ptrdiff_t>(hookedEndPaint)));
2830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
284635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
2850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif
286635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
2878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic bool registerPluginView()
2888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    static bool haveRegisteredWindowClass = false;
2908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (haveRegisteredWindowClass)
2918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
2928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    haveRegisteredWindowClass = true;
2948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if PLATFORM(QT)
296dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    WebCore::setInstanceHandle((HINSTANCE)(qWinAppInst()));
2978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
2988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
299dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    ASSERT(WebCore::instanceHandle());
3008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
301d0825bca7fe65beaee391d30da42e937db621564Steve Block#if OS(WINCE)
3020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    WNDCLASS wcex = { 0 };
3030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#else
3048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WNDCLASSEX wcex;
3058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    wcex.cbSize = sizeof(WNDCLASSEX);
3060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    wcex.hIconSm        = 0;
3070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif
3088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    wcex.style          = CS_DBLCLKS;
310d0825bca7fe65beaee391d30da42e937db621564Steve Block#if OS(WINCE)
3110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    wcex.style          |= CS_PARENTDC;
3120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif
3138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    wcex.lpfnWndProc    = DefWindowProc;
3148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    wcex.cbClsExtra     = 0;
3158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    wcex.cbWndExtra     = 0;
316dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    wcex.hInstance      = WebCore::instanceHandle();
3178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    wcex.hIcon          = 0;
3188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    wcex.hCursor        = LoadCursor(0, IDC_ARROW);
3198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    wcex.hbrBackground  = (HBRUSH)COLOR_WINDOW;
3208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    wcex.lpszMenuName   = 0;
3218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    wcex.lpszClassName  = kWebPluginViewdowClassName;
3228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
323d0825bca7fe65beaee391d30da42e937db621564Steve Block#if OS(WINCE)
3240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return !!RegisterClass(&wcex);
3250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#else
3268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return !!RegisterClassEx(&wcex);
3270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif
3288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectLRESULT CALLBACK PluginView::PluginViewWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
3318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    PluginView* pluginView = reinterpret_cast<PluginView*>(GetProp(hWnd, kWebPluginViewProperty));
3338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return pluginView->wndProc(hWnd, message, wParam, lParam);
3358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic bool isWindowsMessageUserGesture(UINT message)
3388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    switch (message) {
3408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case WM_LBUTTONUP:
3418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case WM_MBUTTONUP:
3428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case WM_RBUTTONUP:
3438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case WM_KEYUP:
3448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return true;
3458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        default:
3468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
3478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectLRESULT
3518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectPluginView::wndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
3528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // <rdar://5711136> Sometimes Flash will call SetCapture before creating
3548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // a full-screen window and will not release it, which causes the
3558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // full-screen window to never receive mouse events. We set/release capture
3568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // on mouse down/up before sending the event to the plug-in to prevent that.
3578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    switch (message) {
3588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case WM_LBUTTONDOWN:
3598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case WM_MBUTTONDOWN:
3608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case WM_RBUTTONDOWN:
3618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ::SetCapture(hWnd);
3628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
3638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case WM_LBUTTONUP:
3648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case WM_MBUTTONUP:
3658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case WM_RBUTTONUP:
3668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ::ReleaseCapture();
3678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
3688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (message == m_lastMessage &&
3718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_plugin->quirks().contains(PluginQuirkDontCallWndProcForSameMessageRecursively) &&
3728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_isCallingPluginWndProc)
3738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 1;
3748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (message == WM_USER + 1 &&
3768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_plugin->quirks().contains(PluginQuirkThrottleWMUserPlusOneMessages)) {
3778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!m_messageThrottler)
3788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_messageThrottler.set(new PluginMessageThrottlerWin(this));
3798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_messageThrottler->appendMessage(hWnd, message, wParam, lParam);
3818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
3828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_lastMessage = message;
3858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_isCallingPluginWndProc = true;
3868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // If the plug-in doesn't explicitly support changing the pop-up state, we enable
3888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // popups for all user gestures.
3898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Note that we need to pop the state in a timer, because the Flash plug-in
3908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // pops up windows in response to a posted message.
3918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_plugin->pluginFuncs()->version < NPVERS_HAS_POPUPS_ENABLED_STATE &&
3928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        isWindowsMessageUserGesture(message) && !m_popPopupsStateTimer.isActive()) {
3938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        pushPopupsEnabledState(true);
3958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_popPopupsStateTimer.startOneShot(0);
3978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
399d0825bca7fe65beaee391d30da42e937db621564Steve Block#if !OS(WINCE)
400635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (message == WM_PRINTCLIENT) {
401635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // Most (all?) windowed plugins don't respond to WM_PRINTCLIENT, so we
402635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // change the message to WM_PAINT and rely on our hooked versions of
403635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // BeginPaint/EndPaint to make the plugin draw into the given HDC.
404635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        message = WM_PAINT;
405635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        m_wmPrintHDC = reinterpret_cast<HDC>(wParam);
406635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
4070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif
408635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
4098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Call the plug-in's window proc.
4108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LRESULT result = ::CallWindowProc(m_pluginWndProc, hWnd, message, wParam, lParam);
4118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
412635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    m_wmPrintHDC = 0;
413635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
4148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_isCallingPluginWndProc = false;
4158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return result;
4178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
419635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid PluginView::updatePluginWidget()
4208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!parent())
4228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
4238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(parent()->isFrameView());
4258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    FrameView* frameView = static_cast<FrameView*>(parent());
4268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    IntRect oldWindowRect = m_windowRect;
4288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    IntRect oldClipRect = m_clipRect;
4298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
430d0825bca7fe65beaee391d30da42e937db621564Steve Block#if OS(WINCE)
4310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    m_windowRect = frameView->contentsToWindow(frameRect());
4320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#else
4338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_windowRect = IntRect(frameView->contentsToWindow(frameRect().location()), frameRect().size());
4340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif
4358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_clipRect = windowClipRect();
4368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_clipRect.move(-m_windowRect.x(), -m_windowRect.y());
4378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (platformPluginWidget() && (!m_haveUpdatedPluginWidget || m_windowRect != oldWindowRect || m_clipRect != oldClipRect)) {
4398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HRGN rgn;
4408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        setCallingPlugin(true);
4428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // To prevent flashes while scrolling, we disable drawing during the window
4448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // update process by clipping the window to the zero rect.
4458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        bool clipToZeroRect = !m_plugin->quirks().contains(PluginQuirkDontClipToZeroRectWhenScrolling);
4478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (clipToZeroRect) {
4498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            rgn = ::CreateRectRgn(0, 0, 0, 0);
4508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ::SetWindowRgn(platformPluginWidget(), rgn, FALSE);
4518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else {
4522fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            rgn = ::CreateRectRgn(m_clipRect.x(), m_clipRect.y(), m_clipRect.maxX(), m_clipRect.maxY());
4538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ::SetWindowRgn(platformPluginWidget(), rgn, TRUE);
4548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
4558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (!m_haveUpdatedPluginWidget || m_windowRect != oldWindowRect)
4578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ::MoveWindow(platformPluginWidget(), m_windowRect.x(), m_windowRect.y(), m_windowRect.width(), m_windowRect.height(), TRUE);
4588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (clipToZeroRect) {
4602fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            rgn = ::CreateRectRgn(m_clipRect.x(), m_clipRect.y(), m_clipRect.maxX(), m_clipRect.maxY());
4618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ::SetWindowRgn(platformPluginWidget(), rgn, TRUE);
4628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
4638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        setCallingPlugin(false);
4650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
4660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        m_haveUpdatedPluginWidget = true;
4678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
47021939df44de1705786c545cd1bf519d47250322dBen Murdochvoid PluginView::setFocus(bool focused)
4718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
47221939df44de1705786c545cd1bf519d47250322dBen Murdoch    if (focused && platformPluginWidget())
4738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        SetFocus(platformPluginWidget());
4748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
47521939df44de1705786c545cd1bf519d47250322dBen Murdoch    Widget::setFocus(focused);
4768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid PluginView::show()
4798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    setSelfVisible(true);
4818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (isParentVisible() && platformPluginWidget())
4838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ShowWindow(platformPluginWidget(), SW_SHOWNA);
4848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Widget::show();
4868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid PluginView::hide()
4898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    setSelfVisible(false);
4918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (isParentVisible() && platformPluginWidget())
4938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ShowWindow(platformPluginWidget(), SW_HIDE);
4948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Widget::hide();
4968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool PluginView::dispatchNPEvent(NPEvent& npEvent)
4998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!m_plugin->pluginFuncs()->event)
5018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
5028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool shouldPop = false;
5048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_plugin->pluginFuncs()->version < NPVERS_HAS_POPUPS_ENABLED_STATE && isWindowsMessageUserGesture(npEvent.event)) {
5068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        pushPopupsEnabledState(true);
5078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        shouldPop = true;
5088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
5098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    JSC::JSLock::DropAllLocks dropAllLocks(JSC::SilenceAssertionsOnly);
5118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    setCallingPlugin(true);
5128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool result = m_plugin->pluginFuncs()->event(m_instance, &npEvent);
5138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    setCallingPlugin(false);
5148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (shouldPop)
5168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        popPopupsEnabledState();
5178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return result;
5198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
521cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Blockvoid PluginView::paintIntoTransformedContext(HDC hdc)
522cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block{
523cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    if (m_isWindowed) {
52468513a70bcd92384395513322f1b801e7bf9c729Steve Block#if !OS(WINCE)
525cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        SendMessage(platformPluginWidget(), WM_PRINTCLIENT, reinterpret_cast<WPARAM>(hdc), PRF_CLIENT | PRF_CHILDREN | PRF_OWNED);
52668513a70bcd92384395513322f1b801e7bf9c729Steve Block#endif
527cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        return;
528cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    }
529cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
530cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    m_npWindow.type = NPWindowTypeDrawable;
531cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    m_npWindow.window = hdc;
532cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
533e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    WINDOWPOS windowpos = { 0, 0, 0, 0, 0, 0, 0 };
534cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
535cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    IntRect r = static_cast<FrameView*>(parent())->contentsToWindow(frameRect());
536cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
537cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    windowpos.x = r.x();
538cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    windowpos.y = r.y();
539cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    windowpos.cx = r.width();
540cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    windowpos.cy = r.height();
541cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
542cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    NPEvent npEvent;
543cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    npEvent.event = WM_WINDOWPOSCHANGED;
54421939df44de1705786c545cd1bf519d47250322dBen Murdoch    npEvent.lParam = reinterpret_cast<uintptr_t>(&windowpos);
545cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    npEvent.wParam = 0;
546cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
547cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    dispatchNPEvent(npEvent);
548cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
549cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    setNPWindowRect(frameRect());
550cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
551cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    npEvent.event = WM_PAINT;
55221939df44de1705786c545cd1bf519d47250322dBen Murdoch    npEvent.wParam = reinterpret_cast<uintptr_t>(hdc);
553cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
554cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    // This is supposed to be a pointer to the dirty rect, but it seems that the Flash plugin
555cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    // ignores it so we just pass null.
556cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    npEvent.lParam = 0;
557cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
558cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    dispatchNPEvent(npEvent);
559cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block}
560cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
561cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Blockvoid PluginView::paintWindowedPluginIntoContext(GraphicsContext* context, const IntRect& rect)
562635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
563d0825bca7fe65beaee391d30da42e937db621564Steve Block#if !OS(WINCE)
564635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    ASSERT(m_isWindowed);
565635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    ASSERT(context->shouldIncludeChildWindows());
566635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
567635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    ASSERT(parent()->isFrameView());
568635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    IntPoint locationInWindow = static_cast<FrameView*>(parent())->contentsToWindow(frameRect().location());
569635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
5705abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    LocalWindowsContext windowsContext(context, frameRect(), false);
571635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
5722daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if USE(CAIRO)
573d0825bca7fe65beaee391d30da42e937db621564Steve Block    // Must flush drawings up to this point to the backing metafile, otherwise the
574d0825bca7fe65beaee391d30da42e937db621564Steve Block    // plugin region will be overwritten with any clear regions specified in the
575d0825bca7fe65beaee391d30da42e937db621564Steve Block    // cairo-controlled portions of the rendering.
5762bde8e466a4451c7319e3a072d118917957d6554Steve Block    cairo_show_page(context->platformContext()->cr());
577d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif
578d0825bca7fe65beaee391d30da42e937db621564Steve Block
5795abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    HDC hdc = windowsContext.hdc();
580635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    XFORM originalTransform;
581635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    GetWorldTransform(hdc, &originalTransform);
582635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
583635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // The plugin expects the DC to be in client coordinates, so we translate
584635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // the DC to make that so.
5858a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    AffineTransform ctm = context->getCTM();
586d0825bca7fe65beaee391d30da42e937db621564Steve Block    ctm.translate(locationInWindow.x(), locationInWindow.y());
5878a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    XFORM transform = static_cast<XFORM>(ctm.toTransformationMatrix());
588635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
589635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    SetWorldTransform(hdc, &transform);
590635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
591cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    paintIntoTransformedContext(hdc);
592635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
593635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    SetWorldTransform(hdc, &originalTransform);
5940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif
595635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
596635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
5978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid PluginView::paint(GraphicsContext* context, const IntRect& rect)
5988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!m_isStarted) {
6008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Draw the "missing plugin" image
6018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        paintMissingPluginIcon(context, rect);
6028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
6038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
6048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
605635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (context->paintingDisabled())
6068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
6078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
608e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    // Ensure that we have called SetWindow before we try to paint.
609e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    if (!m_haveCalledSetWindow)
610e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        setNPWindowRect(frameRect());
611e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
612635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (m_isWindowed) {
613d0825bca7fe65beaee391d30da42e937db621564Steve Block#if !OS(WINCE)
614635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (context->shouldIncludeChildWindows())
615635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            paintWindowedPluginIntoContext(context, rect);
6160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif
617635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return;
618635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
619635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
6208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(parent()->isFrameView());
6218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    IntRect rectInWindow = static_cast<FrameView*>(parent())->contentsToWindow(frameRect());
6225abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    LocalWindowsContext windowsContext(context, rectInWindow, m_isTransparent);
6238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // On Safari/Windows without transparency layers the GraphicsContext returns the HDC
6258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // of the window and the plugin expects that the passed in DC has window coordinates.
6268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // In the Qt port we always draw in an offscreen buffer and therefore need to preserve
6278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // the translation set in getWindowsContext.
628d0825bca7fe65beaee391d30da42e937db621564Steve Block#if !PLATFORM(QT) && !OS(WINCE)
6298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!context->inTransparencyLayer()) {
6308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        XFORM transform;
6315abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        GetWorldTransform(windowsContext.hdc(), &transform);
6328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        transform.eDx = 0;
6338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        transform.eDy = 0;
6345abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        SetWorldTransform(windowsContext.hdc(), &transform);
6358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
6368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
6378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6385abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    paintIntoTransformedContext(windowsContext.hdc());
6398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid PluginView::handleKeyboardEvent(KeyboardEvent* event)
6428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NPEvent npEvent;
6448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    npEvent.wParam = event->keyCode();
6468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (event->type() == eventNames().keydownEvent) {
6488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        npEvent.event = WM_KEYDOWN;
6498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        npEvent.lParam = 0;
6508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else if (event->type() == eventNames().keyupEvent) {
6518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        npEvent.event = WM_KEYUP;
6528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        npEvent.lParam = 0x8000;
6538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
6548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    JSC::JSLock::DropAllLocks dropAllLocks(JSC::SilenceAssertionsOnly);
6568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!dispatchNPEvent(npEvent))
6578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        event->setDefaultHandled();
6588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
660d0825bca7fe65beaee391d30da42e937db621564Steve Block#if !OS(WINCE)
6618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectextern bool ignoreNextSetCursor;
6620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif
6638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid PluginView::handleMouseEvent(MouseEvent* event)
6658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NPEvent npEvent;
6678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    IntPoint p = static_cast<FrameView*>(parent())->contentsToWindow(IntPoint(event->pageX(), event->pageY()));
6698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    npEvent.lParam = MAKELPARAM(p.x(), p.y());
6718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    npEvent.wParam = 0;
6728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (event->ctrlKey())
6748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        npEvent.wParam |= MK_CONTROL;
6758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (event->shiftKey())
6768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        npEvent.wParam |= MK_SHIFT;
6778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (event->type() == eventNames().mousemoveEvent ||
6798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        event->type() == eventNames().mouseoutEvent ||
6808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        event->type() == eventNames().mouseoverEvent) {
6818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        npEvent.event = WM_MOUSEMOVE;
6828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (event->buttonDown())
6838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            switch (event->button()) {
6848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case LeftButton:
6858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    npEvent.wParam |= MK_LBUTTON;
6868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
6878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case MiddleButton:
6888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    npEvent.wParam |= MK_MBUTTON;
6898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
6908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case RightButton:
6918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    npEvent.wParam |= MK_RBUTTON;
6928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
6938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
6948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
6958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else if (event->type() == eventNames().mousedownEvent) {
6965f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        focusPluginElement();
6978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        switch (event->button()) {
6988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case 0:
6998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                npEvent.event = WM_LBUTTONDOWN;
7008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
7018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case 1:
7028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                npEvent.event = WM_MBUTTONDOWN;
7038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
7048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case 2:
7058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                npEvent.event = WM_RBUTTONDOWN;
7068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
7078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
7088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else if (event->type() == eventNames().mouseupEvent) {
7098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        switch (event->button()) {
7108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case 0:
7118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                npEvent.event = WM_LBUTTONUP;
7128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
7138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case 1:
7148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                npEvent.event = WM_MBUTTONUP;
7158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
7168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case 2:
7178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                npEvent.event = WM_RBUTTONUP;
7188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
7198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
7208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else
7218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
7228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    JSC::JSLock::DropAllLocks dropAllLocks(JSC::SilenceAssertionsOnly);
7248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!dispatchNPEvent(npEvent))
7258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        event->setDefaultHandled();
7268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
727d0825bca7fe65beaee391d30da42e937db621564Steve Block#if !PLATFORM(QT) && !PLATFORM(WX) && !OS(WINCE)
7288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Currently, Widget::setCursor is always called after this function in EventHandler.cpp
7298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // and since we don't want that we set ignoreNextSetCursor to true here to prevent that.
7305f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    ignoreNextSetCursor = true;
731967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    if (Page* page = m_parentFrame->page())
732967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        page->chrome()->client()->setLastSetCursorToCurrentCursor();
7338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
7348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid PluginView::setParent(ScrollView* parent)
7378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Widget::setParent(parent);
7398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
740d0825bca7fe65beaee391d30da42e937db621564Steve Block#if OS(WINCE)
7410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (parent) {
7420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        init();
7430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (parent->isVisible())
7440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            show();
7450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        else
7460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            hide();
7470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
7480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#else
7498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (parent)
7508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        init();
7518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else {
7528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!platformPluginWidget())
7538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
7548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // If the plug-in window or one of its children have the focus, we need to
7568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // clear it to prevent the web view window from being focused because that can
7578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // trigger a layout while the plugin element is being detached.
7588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HWND focusedWindow = ::GetFocus();
7598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (platformPluginWidget() == focusedWindow || ::IsChild(platformPluginWidget(), focusedWindow))
7608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ::SetFocus(0);
7618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
7620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif
7638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid PluginView::setParentVisible(bool visible)
7668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (isParentVisible() == visible)
7688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
7698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Widget::setParentVisible(visible);
7718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (isSelfVisible() && platformPluginWidget()) {
7738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (visible)
7748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ShowWindow(platformPluginWidget(), SW_SHOWNA);
7758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
7768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ShowWindow(platformPluginWidget(), SW_HIDE);
7778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
7788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid PluginView::setNPWindowRect(const IntRect& rect)
7818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!m_isStarted)
7838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
7848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
785d0825bca7fe65beaee391d30da42e937db621564Steve Block#if OS(WINCE)
7860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    IntRect r = static_cast<FrameView*>(parent())->contentsToWindow(rect);
7870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    m_npWindow.x = r.x();
7880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    m_npWindow.y = r.y();
7890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
7900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    m_npWindow.width = r.width();
7910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    m_npWindow.height = r.height();
7920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
7930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    m_npWindow.clipRect.right = r.width();
7940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    m_npWindow.clipRect.bottom = r.height();
7950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#else
7968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    IntPoint p = static_cast<FrameView*>(parent())->contentsToWindow(rect.location());
7978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_npWindow.x = p.x();
7988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_npWindow.y = p.y();
7998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_npWindow.width = rect.width();
8018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_npWindow.height = rect.height();
8028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_npWindow.clipRect.right = rect.width();
8048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_npWindow.clipRect.bottom = rect.height();
8050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif
8060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    m_npWindow.clipRect.left = 0;
8070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    m_npWindow.clipRect.top = 0;
8088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_plugin->pluginFuncs()->setwindow) {
8100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSC::JSLock::DropAllLocks dropAllLocks(JSC::SilenceAssertionsOnly);
8118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        setCallingPlugin(true);
8128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_plugin->pluginFuncs()->setwindow(m_instance, &m_npWindow);
8138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        setCallingPlugin(false);
8148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
815e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        m_haveCalledSetWindow = true;
816e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
8178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!m_isWindowed)
8188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
8198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ASSERT(platformPluginWidget());
8218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
822d0825bca7fe65beaee391d30da42e937db621564Steve Block#if OS(WINCE)
8230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (!m_pluginWndProc) {
8240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            WNDPROC currentWndProc = (WNDPROC)GetWindowLong(platformPluginWidget(), GWL_WNDPROC);
8250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            if (currentWndProc != PluginViewWndProc)
8260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                m_pluginWndProc = (WNDPROC)SetWindowLong(platformPluginWidget(), GWL_WNDPROC, (LONG)PluginViewWndProc);
8270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        }
8280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#else
8298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        WNDPROC currentWndProc = (WNDPROC)GetWindowLongPtr(platformPluginWidget(), GWLP_WNDPROC);
8308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (currentWndProc != PluginViewWndProc)
83121939df44de1705786c545cd1bf519d47250322dBen Murdoch            m_pluginWndProc = (WNDPROC)SetWindowLongPtr(platformPluginWidget(), GWLP_WNDPROC, (LONG_PTR)PluginViewWndProc);
8320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif
8338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
8348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
83621939df44de1705786c545cd1bf519d47250322dBen MurdochNPError PluginView::handlePostReadFile(Vector<char>& buffer, uint32_t len, const char* buf)
8378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
8388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    String filename(buf, len);
8398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (filename.startsWith("file:///"))
8418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        filename = filename.substring(8);
8428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Get file info
8448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WIN32_FILE_ATTRIBUTE_DATA attrs;
8458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (GetFileAttributesExW(filename.charactersWithNullTermination(), GetFileExInfoStandard, &attrs) == 0)
8468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return NPERR_FILE_NOT_FOUND;
8478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (attrs.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
8498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return NPERR_FILE_NOT_FOUND;
8508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    HANDLE fileHandle = CreateFileW(filename.charactersWithNullTermination(), FILE_READ_DATA, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);
8528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (fileHandle == INVALID_HANDLE_VALUE)
8548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return NPERR_FILE_NOT_FOUND;
8558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    buffer.resize(attrs.nFileSizeLow);
8578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    DWORD bytesRead;
8598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int retval = ReadFile(fileHandle, buffer.data(), attrs.nFileSizeLow, &bytesRead, 0);
8608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CloseHandle(fileHandle);
8628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (retval == 0 || bytesRead != attrs.nFileSizeLow)
8648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return NPERR_FILE_NOT_FOUND;
8658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return NPERR_NO_ERROR;
8678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
869dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockbool PluginView::platformGetValueStatic(NPNVariable, void*, NPError*)
8708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
871dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return false;
8728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
874dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockbool PluginView::platformGetValue(NPNVariable variable, void* value, NPError* result)
8758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
8768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    switch (variable) {
8778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case NPNVnetscapeWindow: {
8788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HWND* w = reinterpret_cast<HWND*>(value);
879231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            *w = windowHandleForPageClient(parent() ? parent()->hostWindow()->platformPageClient() : 0);
880dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            *result = NPERR_NO_ERROR;
881dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            return true;
8828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
8838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case NPNVSupportsWindowless: {
885dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            NPBool* flag = reinterpret_cast<NPBool*>(value);
886dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            *flag = TRUE;
887dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            *result = NPERR_NO_ERROR;
888dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            return true;
8898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
8908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
891dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    default:
892dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return false;
8938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
8948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid PluginView::invalidateRect(const IntRect& rect)
8978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
8988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_isWindowed) {
8992fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        RECT invalidRect = { rect.x(), rect.y(), rect.maxX(), rect.maxY() };
9008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ::InvalidateRect(platformPluginWidget(), &invalidRect, false);
9018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
9028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
9038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    invalidateWindowlessPluginRect(rect);
9058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
9068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid PluginView::invalidateRect(NPRect* rect)
9088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
9098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!rect) {
9108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        invalidate();
9118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
9128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
9138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    IntRect r(rect->left, rect->top, rect->right - rect->left, rect->bottom - rect->top);
9158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_isWindowed) {
9172fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        RECT invalidRect = { r.x(), r.y(), r.maxX(), r.maxY() };
9188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        InvalidateRect(platformPluginWidget(), &invalidRect, FALSE);
9198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else {
9208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (m_plugin->quirks().contains(PluginQuirkThrottleInvalidate)) {
9218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_invalidRects.append(r);
9228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!m_invalidateTimer.isActive())
9238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_invalidateTimer.startOneShot(0.001);
9248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else
9258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            invalidateRect(r);
9268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
9278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
9288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid PluginView::invalidateRegion(NPRegion region)
9308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
9318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_isWindowed)
9328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
9338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RECT r;
9358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (GetRgnBox(region, &r) == 0) {
9378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        invalidate();
9388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
9398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
9408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    IntRect rect(IntPoint(r.left, r.top), IntSize(r.right-r.left, r.bottom-r.top));
9428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    invalidateRect(rect);
9438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
9448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid PluginView::forceRedraw()
9468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
9478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_isWindowed)
9488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ::UpdateWindow(platformPluginWidget());
9498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
950231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        ::UpdateWindow(windowHandleForPageClient(parent() ? parent()->hostWindow()->platformPageClient() : 0));
9518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
9528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
953231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockbool PluginView::platformStart()
9540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
9550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    ASSERT(m_isStarted);
9560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    ASSERT(m_status == PluginStatusLoadedSuccessfully);
9570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
9588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_isWindowed) {
9598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        registerPluginView();
960d0825bca7fe65beaee391d30da42e937db621564Steve Block#if !OS(WINCE)
961635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        setUpOffscreenPaintingHooks(hookedBeginPaint, hookedEndPaint);
9620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif
9638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        DWORD flags = WS_CHILD;
9658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isSelfVisible())
9668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            flags |= WS_VISIBLE;
9678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
968231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        HWND parentWindowHandle = windowHandleForPageClient(m_parentFrame->view()->hostWindow()->platformPageClient());
9698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HWND window = ::CreateWindowEx(0, kWebPluginViewdowClassName, 0, flags,
970dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                                       0, 0, 0, 0, parentWindowHandle, 0, WebCore::instanceHandle(), 0);
9710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
972d0825bca7fe65beaee391d30da42e937db621564Steve Block#if OS(WINDOWS) && (PLATFORM(QT) || PLATFORM(WX))
9738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_window = window;
9748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#else
9758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        setPlatformWidget(window);
9768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
9778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Calling SetWindowLongPtrA here makes the window proc ASCII, which is required by at least
9798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // the Shockwave Director plug-in.
98021939df44de1705786c545cd1bf519d47250322dBen Murdoch#if OS(WINDOWS) && CPU(X86_64)
9818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ::SetWindowLongPtrA(platformPluginWidget(), GWLP_WNDPROC, (LONG_PTR)DefWindowProcA);
982d0825bca7fe65beaee391d30da42e937db621564Steve Block#elif OS(WINCE)
9830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        ::SetWindowLong(platformPluginWidget(), GWL_WNDPROC, (LONG)DefWindowProc);
9848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#else
9858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ::SetWindowLongPtrA(platformPluginWidget(), GWL_WNDPROC, (LONG)DefWindowProcA);
9868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
9878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        SetProp(platformPluginWidget(), kWebPluginViewProperty, this);
9888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_npWindow.type = NPWindowTypeWindow;
9908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_npWindow.window = platformPluginWidget();
9918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else {
9928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_npWindow.type = NPWindowTypeDrawable;
9938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_npWindow.window = 0;
9948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
9958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    updatePluginWidget();
9970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
9988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!m_plugin->quirks().contains(PluginQuirkDeferFirstSetWindowCall))
9998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        setNPWindowRect(frameRect());
1000231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
1001231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    return true;
1002231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
1003231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
1004231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid PluginView::platformDestroy()
1005231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
1006231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (!platformPluginWidget())
1007231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return;
1008231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
1009231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    DestroyWindow(platformPluginWidget());
1010231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    setPlatformPluginWidget(0);
1011231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
1012231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
1013cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve BlockPassRefPtr<Image> PluginView::snapshot()
1014cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block{
101568513a70bcd92384395513322f1b801e7bf9c729Steve Block#if !PLATFORM(WX) && !OS(WINCE)
1016cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    OwnPtr<HDC> hdc(CreateCompatibleDC(0));
1017cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1018cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    if (!m_isWindowed) {
1019cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        // Enable world transforms.
1020cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        SetGraphicsMode(hdc.get(), GM_ADVANCED);
1021cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1022cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        XFORM transform;
1023cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        GetWorldTransform(hdc.get(), &transform);
1024cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1025cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        // Windowless plug-ins assume that they're drawing onto the view's DC.
1026cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        // Translate the context so that the plug-in draws at (0, 0).
1027cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        ASSERT(parent()->isFrameView());
1028cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        IntPoint position = static_cast<FrameView*>(parent())->contentsToWindow(frameRect()).location();
1029cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        transform.eDx = -position.x();
1030cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        transform.eDy = -position.y();
1031cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        SetWorldTransform(hdc.get(), &transform);
1032cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    }
1033cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1034cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    void* bits;
1035cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    BitmapInfo bmp = BitmapInfo::createBottomUp(frameRect().size());
1036cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    OwnPtr<HBITMAP> hbmp(CreateDIBSection(0, &bmp, DIB_RGB_COLORS, &bits, 0, 0));
1037cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1038cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    HBITMAP hbmpOld = static_cast<HBITMAP>(SelectObject(hdc.get(), hbmp.get()));
1039cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1040cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    paintIntoTransformedContext(hdc.get());
1041cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1042cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    SelectObject(hdc.get(), hbmpOld);
1043cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1044cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    return BitmapImage::create(hbmp.get());
1045643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#else
1046643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return 0;
1047643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#endif
1048cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block}
1049cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1050231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid PluginView::halt()
1051231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
1052cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    ASSERT(!m_isHalted);
1053cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    ASSERT(m_isStarted);
1054cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1055231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if !PLATFORM(QT)
1056231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // Show a screenshot of the plug-in.
1057cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    toRenderWidget(m_element->renderer())->showSubstituteImage(snapshot());
1058231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif
1059231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
1060cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    m_isHalted = true;
1061cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    m_hasBeenHalted = true;
1062cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1063231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    stop();
1064231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    platformDestroy();
1065231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
1066231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
1067231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid PluginView::restart()
1068231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
1069231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    ASSERT(!m_isStarted);
1070cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    ASSERT(m_isHalted);
1071231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
1072231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // Clear any substitute image.
1073231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    toRenderWidget(m_element->renderer())->showSubstituteImage(0);
1074231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
1075cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    m_isHalted = false;
1076231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    m_haveUpdatedPluginWidget = false;
1077231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    start();
10788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
10798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace WebCore
1081