WebNodeHighlight.cpp revision 0bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5
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" 338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#pragma warning(push, 0) 340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include <WebCore/BitmapInfo.h> 358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <WebCore/Color.h> 368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <WebCore/GraphicsContext.h> 378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <WebCore/InspectorController.h> 388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <WebCore/Page.h> 398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <WebCore/WindowMessageBroadcaster.h> 408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#pragma warning(pop) 418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wtf/OwnPtr.h> 428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wtf/HashSet.h> 438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing namespace WebCore; 458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic LPCTSTR kOverlayWindowClassName = TEXT("WebNodeHighlightWindowClass"); 478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic ATOM registerOverlayClass(); 488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic LPCTSTR kWebNodeHighlightPointerProp = TEXT("WebNodeHighlightPointer"); 498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectWebNodeHighlight::WebNodeHighlight(WebView* webView) 518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project : m_inspectedWebView(webView) 528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_overlay(0) 538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_observedWindow(0) 548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_showsWhileWebViewIsVisible(false) 558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_inspectedWebView->viewWindow(reinterpret_cast<OLE_HANDLE*>(&m_inspectedWebViewWindow)); 578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectWebNodeHighlight::~WebNodeHighlight() 608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_observedWindow) 628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WindowMessageBroadcaster::removeListener(m_observedWindow, this); 638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_inspectedWebViewWindow) 648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WindowMessageBroadcaster::removeListener(m_inspectedWebViewWindow, this); 658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_overlay) 678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ::DestroyWindow(m_overlay); 688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebNodeHighlight::setShowsWhileWebViewIsVisible(bool shows) 718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_showsWhileWebViewIsVisible == shows) 738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_showsWhileWebViewIsVisible = shows; 758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_showsWhileWebViewIsVisible) { 778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project hide(); 788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool webViewVisible = isWebViewVisible(); 828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (isShowing() == webViewVisible) 848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (webViewVisible) 878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project show(); 888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project hide(); 908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool WebNodeHighlight::isWebViewVisible() const 938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_inspectedWebViewWindow) 958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return IsWindowVisible(m_inspectedWebViewWindow); 988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebNodeHighlight::show() 1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_overlay) { 1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project registerOverlayClass(); 1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_overlay = ::CreateWindowEx(WS_EX_LAYERED | WS_EX_TOOLWINDOW | WS_EX_TRANSPARENT, kOverlayWindowClassName, 0, WS_POPUP, 1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 0, 0, 0, 0, 1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_inspectedWebViewWindow, 0, 0, 0); 1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_overlay) 1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ::SetProp(m_overlay, kWebNodeHighlightPointerProp, reinterpret_cast<HANDLE>(this)); 1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_observedWindow = GetAncestor(m_inspectedWebViewWindow, GA_ROOT); 1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WindowMessageBroadcaster::addListener(m_observedWindow, this); 1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WindowMessageBroadcaster::addListener(m_inspectedWebViewWindow, this); 1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_showsWhileWebViewIsVisible); 1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project update(); 1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SetWindowPos(m_overlay, 0, 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE); 1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebNodeHighlight::hide() 1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_overlay) 1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ::ShowWindow(m_overlay, SW_HIDE); 1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool WebNodeHighlight::isShowing() const 1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_overlay && ::IsWindowVisible(m_overlay); 1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebNodeHighlight::update() 1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_overlay); 1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HDC hdc = ::CreateCompatibleDC(::GetDC(m_overlay)); 1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!hdc) 1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RECT webViewRect; 1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ::GetWindowRect(m_inspectedWebViewWindow, &webViewRect); 1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SIZE size; 1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project size.cx = webViewRect.right - webViewRect.left; 1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project size.cy = webViewRect.bottom - webViewRect.top; 1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch BitmapInfo bitmapInfo = BitmapInfo::createBottomUp(IntSize(size)); 1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void* pixels = 0; 1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project OwnPtr<HBITMAP> hbmp(::CreateDIBSection(hdc, &bitmapInfo, DIB_RGB_COLORS, &pixels, 0, 0)); 1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ::SelectObject(hdc, hbmp.get()); 1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project GraphicsContext context(hdc); 1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_inspectedWebView->page()->inspectorController()->drawNodeHighlight(context); 1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project BLENDFUNCTION bf; 1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bf.BlendOp = AC_SRC_OVER; 1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bf.BlendFlags = 0; 1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bf.SourceConstantAlpha = 255; 1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bf.AlphaFormat = AC_SRC_ALPHA; 1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project POINT srcPoint; 1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project srcPoint.x = 0; 1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project srcPoint.y = 0; 1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project POINT dstPoint; 1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project dstPoint.x = webViewRect.left; 1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project dstPoint.y = webViewRect.top; 1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ::UpdateLayeredWindow(m_overlay, ::GetDC(0), &dstPoint, &size, hdc, &srcPoint, 0, &bf, ULW_ALPHA); 1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ::DeleteDC(hdc); 1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebNodeHighlight::placeBehindWindow(HWND window) 1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_overlay); 1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SetWindowPos(m_overlay, window, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE); 1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic ATOM registerOverlayClass() 1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project static bool haveRegisteredWindowClass = false; 1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (haveRegisteredWindowClass) 1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WNDCLASSEX wcex; 1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project wcex.cbSize = sizeof(WNDCLASSEX); 1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project wcex.style = 0; 1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project wcex.lpfnWndProc = OverlayWndProc; 1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project wcex.cbClsExtra = 0; 2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project wcex.cbWndExtra = 0; 2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project wcex.hInstance = 0; 2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project wcex.hIcon = 0; 2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project wcex.hCursor = LoadCursor(0, IDC_ARROW); 2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project wcex.hbrBackground = 0; 2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project wcex.lpszMenuName = 0; 2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project wcex.lpszClassName = kOverlayWindowClassName; 2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project wcex.hIconSm = 0; 2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project haveRegisteredWindowClass = true; 2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ::RegisterClassEx(&wcex); 2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectLRESULT CALLBACK OverlayWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) 2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebNodeHighlight* highlight = reinterpret_cast<WebNodeHighlight*>(::GetProp(hwnd, kWebNodeHighlightPointerProp)); 2178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!highlight) 2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ::DefWindowProc(hwnd, msg, wParam, lParam); 2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ::DefWindowProc(hwnd, msg, wParam, lParam); 2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebNodeHighlight::onWebViewShowWindow(bool showing) 2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_showsWhileWebViewIsVisible) 2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (isShowing() == showing) 2298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 2308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (showing) 2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project show(); 2338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project hide(); 2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebNodeHighlight::onWebViewWindowPosChanged(WINDOWPOS* windowPos) 2388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool sizing = !(windowPos->flags & SWP_NOSIZE); 2408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!sizing) 2428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 2438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!isShowing()) 2458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 2468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project update(); 2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebNodeHighlight::onRootWindowPosChanged(WINDOWPOS* windowPos) 2518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool moving = !(windowPos->flags & SWP_NOMOVE); 2538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool sizing = !(windowPos->flags & SWP_NOSIZE); 2548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!moving) 2568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 2578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Size changes are handled by onWebViewWindowPosChanged. 2598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (sizing) 2608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 2618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!isShowing()) 2638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 2648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project update(); 2668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebNodeHighlight::windowReceivedMessage(HWND window, UINT msg, WPARAM wParam, LPARAM lParam) 2698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (window == m_inspectedWebViewWindow) { 2718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project switch (msg) { 2728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case WM_SHOWWINDOW: 2738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project onWebViewShowWindow(wParam); 2748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 2758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case WM_WINDOWPOSCHANGED: 2768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project onWebViewWindowPosChanged(reinterpret_cast<WINDOWPOS*>(lParam)); 2778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 2788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project default: 2798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 2808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 2838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(window == m_observedWindow); 2868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project switch (msg) { 2878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case WM_WINDOWPOSCHANGED: 2888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project onRootWindowPosChanged(reinterpret_cast<WINDOWPOS*>(lParam)); 2898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 2908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project default: 2918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 2928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 294