15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2012 Google Inc. All rights reserved. 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions are 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * met: 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * * Redistributions of source code must retain the above copyright 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer. 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * * Redistributions in binary form must reproduce the above 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * copyright notice, this list of conditions and the following disclaimer 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * in the documentation and/or other materials provided with the 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * distribution. 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * * Neither the name of Google Inc. nor the names of its 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * contributors may be used to endorse or promote products derived from 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * this software without specific prior written permission. 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h" 32f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/WebPagePopupImpl.h" 335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/ContextFeatures.h" 35d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/frame/FrameView.h" 36d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/frame/LocalFrame.h" 37f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "core/frame/Settings.h" 3853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/loader/EmptyClients.h" 3909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/loader/FrameLoadRequest.h" 4053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/Chrome.h" 4153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/DOMWindowPagePopup.h" 4253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/EventHandler.h" 4353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/FocusController.h" 4453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/Page.h" 4553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/PagePopupClient.h" 465d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "platform/TraceEvent.h" 477242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "platform/heap/Handle.h" 487242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "public/platform/WebCompositeAndReadbackAsyncCallback.h" 4951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "public/platform/WebCursorInfo.h" 507242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "public/web/WebAXObject.h" 517242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "public/web/WebFrameClient.h" 52f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebViewClient.h" 53f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebWidgetClient.h" 54f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/WebInputEventConversion.h" 557242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "web/WebLocalFrameImpl.h" 56f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/WebSettingsImpl.h" 57f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/WebViewImpl.h" 585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)namespace blink { 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)class PagePopupChromeClient : public EmptyChromeClient { 625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WTF_MAKE_NONCOPYABLE(PagePopupChromeClient); 635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WTF_MAKE_FAST_ALLOCATED; 645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public: 665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) explicit PagePopupChromeClient(WebPagePopupImpl* popup) 675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : m_popup(popup) 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(m_popup->widgetClient()); 705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private: 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual void closeWindowSoon() OVERRIDE 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_popup->closePopup(); 765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual FloatRect windowRect() OVERRIDE 795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return FloatRect(m_popup->m_windowRectInScreen.x, m_popup->m_windowRectInScreen.y, m_popup->m_windowRectInScreen.width, m_popup->m_windowRectInScreen.height); 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual void setWindowRect(const FloatRect& rect) OVERRIDE 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_popup->m_windowRectInScreen = IntRect(rect); 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_popup->widgetClient()->setWindowRect(m_popup->m_windowRectInScreen); 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 897242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci virtual IntRect rootViewToScreen(const IntRect& rect) const OVERRIDE 907242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci { 917242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci IntRect rectInScreen(rect); 927242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci rectInScreen.move(m_popup->m_windowRectInScreen.x, m_popup->m_windowRectInScreen.y); 937242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return rectInScreen; 947242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } 957242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 966f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch virtual void addMessageToConsole(LocalFrame*, MessageSource, MessageLevel, const String& message, unsigned lineNumber, const String&, const String&) OVERRIDE 975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef NDEBUG 995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) fprintf(stderr, "CONSOLE MESSSAGE:%u: %s\n", lineNumber, message.utf8().data()); 1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 10353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) virtual void invalidateContentsAndRootView(const IntRect& paintRect) OVERRIDE 1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (paintRect.isEmpty()) 1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_popup->widgetClient()->didInvalidateRect(paintRect); 1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) virtual void invalidateContentsForSlowScroll(const IntRect& updateRect) OVERRIDE 1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 11253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) invalidateContentsAndRootView(updateRect); 1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual void scheduleAnimation() OVERRIDE 1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 117d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) if (m_popup->isAcceleratedCompositingActive()) { 118d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) ASSERT(m_popup->m_layerTreeView); 119d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) m_popup->m_layerTreeView->setNeedsAnimate(); 120d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) return; 121d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) } 1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_popup->widgetClient()->scheduleAnimation(); 1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 12553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) virtual WebScreenInfo screenInfo() const OVERRIDE 12653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) { 12753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) return m_popup->m_webView->client() ? m_popup->m_webView->client()->screenInfo() : WebScreenInfo(); 12853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) } 12953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual void* webView() const OVERRIDE 1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_popup->m_webView; 1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual FloatSize minimumWindowSize() const OVERRIDE 1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return FloatSize(0, 0); 1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 140e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) virtual void setCursor(const Cursor& cursor) OVERRIDE 141926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) { 142926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (m_popup->m_webView->client()) 143926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_popup->m_webView->client()->didChangeCursor(WebCursorInfo(cursor)); 144926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 145926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 14653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) virtual void needTouchEvents(bool needsTouchEvents) OVERRIDE 1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 14853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) m_popup->widgetClient()->hasTouchEventHandlers(needsTouchEvents); 1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 151d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) virtual GraphicsLayerFactory* graphicsLayerFactory() const OVERRIDE 152d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) { 153d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return m_popup->m_webView->graphicsLayerFactory(); 154d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) } 155d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 156d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) virtual void attachRootGraphicsLayer(GraphicsLayer* graphicsLayer) OVERRIDE 157d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) { 158d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) m_popup->setRootGraphicsLayer(graphicsLayer); 159d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) } 160d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 1617242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci virtual void postAccessibilityNotification(AXObject* obj, AXObjectCache::AXNotification notification) OVERRIDE 1627242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci { 1637242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci WebLocalFrameImpl* frame = WebLocalFrameImpl::fromFrame(m_popup->m_popupClient->ownerElement().document().frame()); 1647242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (obj && frame && frame->client()) 1657242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci frame->client()->postAccessibilityEvent(WebAXObject(obj), static_cast<WebAXEvent>(notification)); 1667242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 1677242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // FIXME: Delete these lines once Chromium only uses the frame client interface, above. 1687242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (obj && m_popup->m_webView->client()) 1697242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_popup->m_webView->client()->postAccessibilityEvent(WebAXObject(obj), static_cast<WebAXEvent>(notification)); 1707242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } 1717242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WebPagePopupImpl* m_popup; 1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class PagePopupFeaturesClient : public ContextFeaturesClient { 1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual bool isEnabled(Document*, ContextFeatures::FeatureType, bool) OVERRIDE; 1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool PagePopupFeaturesClient::isEnabled(Document*, ContextFeatures::FeatureType type, bool defaultValue) 1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (type == ContextFeatures::PagePopup) 1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return defaultValue; 1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// WebPagePopupImpl ---------------------------------------------------------------- 1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebPagePopupImpl::WebPagePopupImpl(WebWidgetClient* client) 1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : m_widgetClient(client) 1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_closing(false) 191d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) , m_layerTreeView(0) 192d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) , m_rootLayer(0) 193d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) , m_rootGraphicsLayer(0) 194d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) , m_isAcceleratedCompositingActive(false) 1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(client); 1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebPagePopupImpl::~WebPagePopupImpl() 2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(!m_page); 2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 204926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool WebPagePopupImpl::initialize(WebViewImpl* webView, PagePopupClient* popupClient, const IntRect&) 2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(webView); 2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(popupClient); 2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_webView = webView; 2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_popupClient = popupClient; 2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) resize(m_popupClient->contentSize()); 2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 213197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (!m_widgetClient || !initializePage()) 2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_widgetClient->show(WebNavigationPolicy()); 2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) setFocus(true); 2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 221926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool WebPagePopupImpl::initializePage() 2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Page::PageClients pageClients; 2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) fillWithEmptyClients(pageClients); 2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_chromeClient = adoptPtr(new PagePopupChromeClient(this)); 2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) pageClients.chromeClient = m_chromeClient.get(); 2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2286f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch m_page = adoptPtrWillBeNoop(new Page(pageClients)); 229e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) m_page->settings().setScriptEnabled(true); 230e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) m_page->settings().setAllowScriptsToCloseWindows(true); 2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_page->setDeviceScaleFactor(m_webView->deviceScaleFactor()); 232e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) m_page->settings().setDeviceSupportsTouch(m_webView->page()->settings().deviceSupportsTouch()); 2337242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // FIXME: Should we support enabling a11y while a popup is shown? 2347242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_page->settings().setAccessibilityEnabled(m_webView->page()->settings().accessibilityEnabled()); 2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 236a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch provideContextFeaturesTo(*m_page, adoptPtr(new PagePopupFeaturesClient())); 2377242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci static FrameLoaderClient* emptyFrameLoaderClient = new EmptyFrameLoaderClient(); 2387242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci RefPtrWillBeRawPtr<LocalFrame> frame = LocalFrame::create(emptyFrameLoaderClient, &m_page->frameHost(), 0); 2397242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci frame->setPagePopupOwner(m_popupClient->ownerElement()); 2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) frame->setView(FrameView::create(frame.get())); 2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) frame->init(); 2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) frame->view()->resize(m_popupClient->contentSize()); 2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) frame->view()->setTransparent(false); 2447242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (AXObjectCache* cache = m_popupClient->ownerElement().document().existingAXObjectCache()) 2457242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci cache->childrenChanged(&m_popupClient->ownerElement()); 2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 247d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) ASSERT(frame->domWindow()); 248d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) DOMWindowPagePopup::install(*frame->domWindow(), m_popupClient); 2497242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci ASSERT(m_popupClient->ownerElement().document().existingAXObjectCache() == frame->document()->existingAXObjectCache()); 2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 25109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) RefPtr<SharedBuffer> data = SharedBuffer::create(); 25209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) m_popupClient->writeDocument(data.get()); 25309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) frame->loader().load(FrameLoadRequest(0, blankURL(), SubstituteData(data, "text/html", "UTF-8", KURL(), ForceSynchronousLoad))); 2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 257926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void WebPagePopupImpl::destroyPage() 2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 259926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!m_page) 260926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return; 2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2626f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch m_page->willBeDestroyed(); 263926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_page.clear(); 2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2667242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciAXObject* WebPagePopupImpl::rootAXObject() 2677242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{ 2687242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (!m_page || !m_page->mainFrame()) 2697242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return 0; 2707242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci Document* document = toLocalFrame(m_page->mainFrame())->document(); 2717242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (!document) 2727242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return 0; 2737242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci AXObjectCache* cache = document->axObjectCache(); 2747242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci ASSERT(cache); 2757242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return cache->getOrCreate(document->view()); 2767242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci} 2777242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 278d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebPagePopupImpl::setRootGraphicsLayer(GraphicsLayer* layer) 279d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){ 280d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) m_rootGraphicsLayer = layer; 281d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) m_rootLayer = layer ? layer->platformLayer() : 0; 282d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 283d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) setIsAcceleratedCompositingActive(layer); 284d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (m_layerTreeView) { 285d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (m_rootLayer) { 286d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) m_layerTreeView->setRootLayer(*m_rootLayer); 287d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) } else { 288d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) m_layerTreeView->clearRootLayer(); 289d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) } 290d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) } 291d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)} 292d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 293d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebPagePopupImpl::setIsAcceleratedCompositingActive(bool enter) 294d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){ 295d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (m_isAcceleratedCompositingActive == enter) 296d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return; 297d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 298d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (!enter) { 299d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) m_isAcceleratedCompositingActive = false; 300d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) } else if (m_layerTreeView) { 301d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) m_isAcceleratedCompositingActive = true; 302d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) } else { 303197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch TRACE_EVENT0("blink", "WebPagePopupImpl::setIsAcceleratedCompositingActive(true)"); 304d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 305d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) m_widgetClient->initializeLayerTreeView(); 306d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) m_layerTreeView = m_widgetClient->layerTreeView(); 307d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (m_layerTreeView) { 308d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) m_layerTreeView->setVisible(true); 309d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) m_isAcceleratedCompositingActive = true; 310d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) m_layerTreeView->setDeviceScaleFactor(m_widgetClient->deviceScaleFactor()); 311d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) } else { 312d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) m_isAcceleratedCompositingActive = false; 313d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) } 314d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) } 315d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)} 316d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 317926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)WebSize WebPagePopupImpl::size() 3185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 319926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return m_popupClient->contentSize(); 3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 322c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)void WebPagePopupImpl::beginFrame(const WebBeginFrameArgs& frameTime) 3235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 324c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) // FIXME: This should use frameTime.lastFrameTimeMonotonic but doing so 325c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) // breaks tests. 3262fb29a03d7c71253319f61b77edc6c1e3a8fc8e2Torne (Richard Coles) PageWidgetDelegate::animate(m_page.get(), monotonicallyIncreasingTime()); 3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 329d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebPagePopupImpl::willCloseLayerTreeView() 330d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){ 331d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) setIsAcceleratedCompositingActive(false); 332d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) m_layerTreeView = 0; 333d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)} 334d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 3355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebPagePopupImpl::layout() 3365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3372fb29a03d7c71253319f61b77edc6c1e3a8fc8e2Torne (Richard Coles) PageWidgetDelegate::layout(m_page.get()); 3385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 340d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)void WebPagePopupImpl::paint(WebCanvas* canvas, const WebRect& rect) 3415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 342926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!m_closing) 3432fb29a03d7c71253319f61b77edc6c1e3a8fc8e2Torne (Richard Coles) PageWidgetDelegate::paint(m_page.get(), 0, canvas, rect, PageWidgetDelegate::Opaque); 3445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebPagePopupImpl::resize(const WebSize& newSize) 3475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_windowRectInScreen = WebRect(m_windowRectInScreen.x, m_windowRectInScreen.y, newSize.width, newSize.height); 3495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_widgetClient->setWindowRect(m_windowRectInScreen); 3505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_page) 3525d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) toLocalFrame(m_page->mainFrame())->view()->resize(newSize); 3535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_widgetClient->didInvalidateRect(WebRect(0, 0, newSize.width, newSize.height)); 3545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebPagePopupImpl::handleKeyEvent(const WebKeyboardEvent&) 3575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The main WebView receives key events and forward them to this via handleKeyEvent(). 3595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT_NOT_REACHED(); 3605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 3615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebPagePopupImpl::handleCharEvent(const WebKeyboardEvent&) 3645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The main WebView receives key events and forward them to this via handleKeyEvent(). 3665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT_NOT_REACHED(); 3675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 3685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebPagePopupImpl::handleGestureEvent(const WebGestureEvent& event) 3715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3725d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (m_closing || !m_page || !m_page->mainFrame() || !toLocalFrame(m_page->mainFrame())->view()) 3735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 3745d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) LocalFrame& frame = *toLocalFrame(m_page->mainFrame()); 375f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) return frame.eventHandler().handleGestureEvent(PlatformGestureEventBuilder(frame.view(), event)); 3765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebPagePopupImpl::handleInputEvent(const WebInputEvent& event) 3795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_closing) 3815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 3822fb29a03d7c71253319f61b77edc6c1e3a8fc8e2Torne (Richard Coles) return PageWidgetDelegate::handleInputEvent(m_page.get(), *this, event); 3835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebPagePopupImpl::handleKeyEvent(const PlatformKeyboardEvent& event) 3865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3875d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (m_closing || !m_page->mainFrame() || !toLocalFrame(m_page->mainFrame())->view()) 3885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 3895d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) return toLocalFrame(m_page->mainFrame())->eventHandler().keyEvent(event); 3905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebPagePopupImpl::setFocus(bool enable) 3935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_page) 3955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 3963c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch m_page->focusController().setFocused(enable); 3975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (enable) 3983c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch m_page->focusController().setActive(true); 3995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebPagePopupImpl::close() 4025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_closing = true; 404926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) destroyPage(); // In case closePopup() was not called. 4055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_widgetClient = 0; 4065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) deref(); 4075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebPagePopupImpl::closePopup() 4105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_page) { 4125d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) toLocalFrame(m_page->mainFrame())->loader().stopAllLoaders(); 413d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) ASSERT(m_page->mainFrame()->domWindow()); 414d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) DOMWindowPagePopup::uninstall(*m_page->mainFrame()->domWindow()); 4155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_closing = true; 417926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 418926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) destroyPage(); 419926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 4205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // m_widgetClient might be 0 because this widget might be already closed. 4215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_widgetClient) { 4225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // closeWidgetSoon() will call this->close() later. 4235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_widgetClient->closeWidgetSoon(); 4245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_popupClient->didClosePopup(); 4275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4297242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid WebPagePopupImpl::compositeAndReadbackAsync(WebCompositeAndReadbackAsyncCallback* callback) 4307242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{ 4317242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci ASSERT(isAcceleratedCompositingActive()); 4327242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_layerTreeView->compositeAndReadbackAsync(callback); 4337242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci} 4347242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 4357242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciWebPoint WebPagePopupImpl::positionRelativeToOwner() 4367242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{ 4377242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci WebRect windowRect = m_webView->client()->rootWindowRect(); 4387242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return WebPoint(m_windowRectInScreen.x - windowRect.x, m_windowRectInScreen.y - windowRect.y); 4397242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci} 4407242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 4415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// WebPagePopup ---------------------------------------------------------------- 4425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebPagePopup* WebPagePopup::create(WebWidgetClient* client) 4445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!client) 4465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) CRASH(); 4475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // A WebPagePopupImpl instance usually has two references. 4485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // - One owned by the instance itself. It represents the visible widget. 4495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // - One owned by a WebViewImpl. It's released when the WebViewImpl ask the 4505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // WebPagePopupImpl to close. 4515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // We need them because the closing operation is asynchronous and the widget 4525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // can be closed while the WebViewImpl is unaware of it. 4535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return adoptRef(new WebPagePopupImpl(client)).leakRef(); 4545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 45651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)} // namespace blink 457