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