18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2007 Apple Inc. All rights reserved. 38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without 58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions 68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met: 78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1. Redistributions of source code must retain the above copyright 98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer. 108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer in the 128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * documentation and/or other materials provided with the distribution. 138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of 148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * its contributors may be used to endorse or promote products derived 158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * from this software without specific prior written permission. 168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h" 308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WebNodeHighlight.h" 318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WebView.h" 330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include <WebCore/BitmapInfo.h> 348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <WebCore/Color.h> 358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <WebCore/GraphicsContext.h> 368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <WebCore/InspectorController.h> 378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <WebCore/Page.h> 388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <WebCore/WindowMessageBroadcaster.h> 398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wtf/OwnPtr.h> 408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wtf/HashSet.h> 418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing namespace WebCore; 438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic LPCTSTR kOverlayWindowClassName = TEXT("WebNodeHighlightWindowClass"); 458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic ATOM registerOverlayClass(); 468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic LPCTSTR kWebNodeHighlightPointerProp = TEXT("WebNodeHighlightPointer"); 478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectWebNodeHighlight::WebNodeHighlight(WebView* webView) 498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project : m_inspectedWebView(webView) 508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_overlay(0) 518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_observedWindow(0) 528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_showsWhileWebViewIsVisible(false) 538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_inspectedWebView->viewWindow(reinterpret_cast<OLE_HANDLE*>(&m_inspectedWebViewWindow)); 558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectWebNodeHighlight::~WebNodeHighlight() 588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_observedWindow) 608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WindowMessageBroadcaster::removeListener(m_observedWindow, this); 618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_inspectedWebViewWindow) 628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WindowMessageBroadcaster::removeListener(m_inspectedWebViewWindow, this); 638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_overlay) 658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ::DestroyWindow(m_overlay); 668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebNodeHighlight::setShowsWhileWebViewIsVisible(bool shows) 698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_showsWhileWebViewIsVisible == shows) 718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_showsWhileWebViewIsVisible = shows; 738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_showsWhileWebViewIsVisible) { 758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project hide(); 768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool webViewVisible = isWebViewVisible(); 808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (isShowing() == webViewVisible) 828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (webViewVisible) 858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project show(); 868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project hide(); 888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool WebNodeHighlight::isWebViewVisible() const 918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_inspectedWebViewWindow) 938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return IsWindowVisible(m_inspectedWebViewWindow); 968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebNodeHighlight::show() 998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_overlay) { 1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project registerOverlayClass(); 1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_overlay = ::CreateWindowEx(WS_EX_LAYERED | WS_EX_TOOLWINDOW | WS_EX_TRANSPARENT, kOverlayWindowClassName, 0, WS_POPUP, 1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 0, 0, 0, 0, 1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_inspectedWebViewWindow, 0, 0, 0); 1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_overlay) 1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ::SetProp(m_overlay, kWebNodeHighlightPointerProp, reinterpret_cast<HANDLE>(this)); 1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_observedWindow = GetAncestor(m_inspectedWebViewWindow, GA_ROOT); 1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WindowMessageBroadcaster::addListener(m_observedWindow, this); 1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WindowMessageBroadcaster::addListener(m_inspectedWebViewWindow, this); 1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_showsWhileWebViewIsVisible); 1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project update(); 1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SetWindowPos(m_overlay, 0, 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE); 1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebNodeHighlight::hide() 1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_overlay) 1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ::ShowWindow(m_overlay, SW_HIDE); 1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool WebNodeHighlight::isShowing() const 1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_overlay && ::IsWindowVisible(m_overlay); 1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebNodeHighlight::update() 1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_overlay); 1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HDC hdc = ::CreateCompatibleDC(::GetDC(m_overlay)); 1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!hdc) 1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RECT webViewRect; 1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ::GetWindowRect(m_inspectedWebViewWindow, &webViewRect); 1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SIZE size; 1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project size.cx = webViewRect.right - webViewRect.left; 1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project size.cy = webViewRect.bottom - webViewRect.top; 1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch BitmapInfo bitmapInfo = BitmapInfo::createBottomUp(IntSize(size)); 1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void* pixels = 0; 1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project OwnPtr<HBITMAP> hbmp(::CreateDIBSection(hdc, &bitmapInfo, DIB_RGB_COLORS, &pixels, 0, 0)); 1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ::SelectObject(hdc, hbmp.get()); 1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project GraphicsContext context(hdc); 1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_inspectedWebView->page()->inspectorController()->drawNodeHighlight(context); 1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project BLENDFUNCTION bf; 1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bf.BlendOp = AC_SRC_OVER; 1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bf.BlendFlags = 0; 1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bf.SourceConstantAlpha = 255; 1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bf.AlphaFormat = AC_SRC_ALPHA; 1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project POINT srcPoint; 1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project srcPoint.x = 0; 1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project srcPoint.y = 0; 1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project POINT dstPoint; 1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project dstPoint.x = webViewRect.left; 1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project dstPoint.y = webViewRect.top; 1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ::UpdateLayeredWindow(m_overlay, ::GetDC(0), &dstPoint, &size, hdc, &srcPoint, 0, &bf, ULW_ALPHA); 1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ::DeleteDC(hdc); 1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebNodeHighlight::placeBehindWindow(HWND window) 1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_overlay); 1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SetWindowPos(m_overlay, window, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE); 1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic ATOM registerOverlayClass() 1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project static bool haveRegisteredWindowClass = false; 1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (haveRegisteredWindowClass) 1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WNDCLASSEX wcex; 1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project wcex.cbSize = sizeof(WNDCLASSEX); 1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project wcex.style = 0; 1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project wcex.lpfnWndProc = OverlayWndProc; 1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project wcex.cbClsExtra = 0; 1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project wcex.cbWndExtra = 0; 1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project wcex.hInstance = 0; 2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project wcex.hIcon = 0; 2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project wcex.hCursor = LoadCursor(0, IDC_ARROW); 2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project wcex.hbrBackground = 0; 2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project wcex.lpszMenuName = 0; 2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project wcex.lpszClassName = kOverlayWindowClassName; 2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project wcex.hIconSm = 0; 2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project haveRegisteredWindowClass = true; 2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ::RegisterClassEx(&wcex); 2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectLRESULT CALLBACK OverlayWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) 2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebNodeHighlight* highlight = reinterpret_cast<WebNodeHighlight*>(::GetProp(hwnd, kWebNodeHighlightPointerProp)); 2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!highlight) 2168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ::DefWindowProc(hwnd, msg, wParam, lParam); 2178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ::DefWindowProc(hwnd, msg, wParam, lParam); 2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebNodeHighlight::onWebViewShowWindow(bool showing) 2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_showsWhileWebViewIsVisible) 2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (isShowing() == showing) 2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (showing) 2308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project show(); 2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project hide(); 2338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebNodeHighlight::onWebViewWindowPosChanged(WINDOWPOS* windowPos) 2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool sizing = !(windowPos->flags & SWP_NOSIZE); 2388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!sizing) 2408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 2418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!isShowing()) 2438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 2448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project update(); 2468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebNodeHighlight::onRootWindowPosChanged(WINDOWPOS* windowPos) 2498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool moving = !(windowPos->flags & SWP_NOMOVE); 2518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool sizing = !(windowPos->flags & SWP_NOSIZE); 2528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!moving) 2548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 2558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Size changes are handled by onWebViewWindowPosChanged. 2578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (sizing) 2588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 2598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!isShowing()) 2618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 2628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project update(); 2648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebNodeHighlight::windowReceivedMessage(HWND window, UINT msg, WPARAM wParam, LPARAM lParam) 2678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (window == m_inspectedWebViewWindow) { 2698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project switch (msg) { 2708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case WM_SHOWWINDOW: 2718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project onWebViewShowWindow(wParam); 2728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 2738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case WM_WINDOWPOSCHANGED: 2748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project onWebViewWindowPosChanged(reinterpret_cast<WINDOWPOS*>(lParam)); 2758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 2768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project default: 2778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 2788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 2818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(window == m_observedWindow); 2848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project switch (msg) { 2858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case WM_WINDOWPOSCHANGED: 2868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project onRootWindowPosChanged(reinterpret_cast<WINDOWPOS*>(lParam)); 2878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 2888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project default: 2898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 2908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 292