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