15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2011 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) * 1. Redistributions of source code must retain the above copyright 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer. 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * copyright notice, this list of conditions and the following disclaimer 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * in the documentation and/or other materials provided with the 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * distribution. 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY GOOGLE INC. AND ITS CONTRIBUTORS 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GOOGLE INC. 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h" 30f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/PageOverlay.h" 315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/frame/Settings.h" 33f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "core/page/Page.h" 345d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "platform/graphics/GraphicsContext.h" 35a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/graphics/GraphicsLayer.h" 36a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/graphics/GraphicsLayerClient.h" 375267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "public/platform/WebLayer.h" 38f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebPageOverlay.h" 39f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebViewClient.h" 40f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/WebViewImpl.h" 415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using namespace WebCore; 435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)namespace blink { 455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace { 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebCanvas* ToWebCanvas(GraphicsContext* gc) 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 5081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) return gc->canvas(); 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // namespace 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PassOwnPtr<PageOverlay> PageOverlay::create(WebViewImpl* viewImpl, WebPageOverlay* overlay) 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return adoptPtr(new PageOverlay(viewImpl, overlay)); 585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PageOverlay::PageOverlay(WebViewImpl* viewImpl, WebPageOverlay* overlay) 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : m_viewImpl(viewImpl) 625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_overlay(overlay) 635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_zOrder(0) 645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class OverlayGraphicsLayerClientImpl : public WebCore::GraphicsLayerClient { 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public: 698abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) static PassOwnPtr<OverlayGraphicsLayerClientImpl> create(WebPageOverlay* overlay) 705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 71e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles) return adoptPtr(new OverlayGraphicsLayerClientImpl(overlay)); 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual ~OverlayGraphicsLayerClientImpl() { } 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 76d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) virtual void notifyAnimationStarted(const GraphicsLayer*, double monotonicTime) OVERRIDE { } 775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual void paintContents(const GraphicsLayer*, GraphicsContext& gc, GraphicsLayerPaintingPhase, const IntRect& inClip) 795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 8010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch if (gc.paintingDisabled()) 8110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch return; 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) gc.save(); 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_overlay->paintPageOverlay(ToWebCanvas(&gc)); 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) gc.restore(); 855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 87e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) virtual String debugName(const GraphicsLayer* graphicsLayer) OVERRIDE 88e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) { 89e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) return String("WebViewImpl Page Overlay Content Layer"); 90e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) } 91e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private: 93e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles) explicit OverlayGraphicsLayerClientImpl(WebPageOverlay* overlay) 945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : m_overlay(overlay) 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WebPageOverlay* m_overlay; 995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void PageOverlay::clear() 1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) invalidateWebFrame(); 1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_layer) { 1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_layer->removeFromParent(); 107d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (WebCore::Page* page = m_viewImpl->page()) 108d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) page->inspectorController().didRemovePageOverlay(m_layer.get()); 1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_layer = nullptr; 1108abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) m_layerClient = nullptr; 1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void PageOverlay::update() 1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) invalidateWebFrame(); 1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_layer) { 1198abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) m_layerClient = OverlayGraphicsLayerClientImpl::create(m_overlay); 1208abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) m_layer = GraphicsLayer::create(m_viewImpl->graphicsLayerFactory(), m_layerClient.get()); 1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_layer->setDrawsContent(true); 122e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) 123d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (WebCore::Page* page = m_viewImpl->page()) 124d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) page->inspectorController().willAddPageOverlay(m_layer.get()); 125d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 126f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) // This is required for contents of overlay to stay in sync with the page while scrolling. 127e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) WebLayer* platformLayer = m_layer->platformLayer(); 128e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) platformLayer->setShouldScrollOnMainThread(true); 1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) FloatSize size(m_viewImpl->size()); 1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (size != m_layer->size()) { 1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Triggers re-adding to root layer to ensure that we are on top of 1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // scrollbars. 1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_layer->removeFromParent(); 1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_layer->setSize(size); 1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_viewImpl->setOverlayLayer(m_layer.get()); 1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_layer->setNeedsDisplay(); 1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void PageOverlay::paintWebFrame(GraphicsContext& gc) 1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 14510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch if (!m_viewImpl->isAcceleratedCompositingActive() && !gc.paintingDisabled()) { 1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) gc.save(); 1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_overlay->paintPageOverlay(ToWebCanvas(&gc)); 1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) gc.restore(); 1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void PageOverlay::invalidateWebFrame() 1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // WebPageOverlay does the actual painting of the overlay. 1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Here we just make sure to invalidate. 1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_viewImpl->isAcceleratedCompositingActive()) { 1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: able to invalidate a smaller rect. 1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: Is it important to just invalidate a smaller rect given that 1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // this is not on a critical codepath? In order to do so, we'd 1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // have to take scrolling into account. 1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const WebSize& size = m_viewImpl->size(); 1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WebRect damagedRect(0, 0, size.width, size.height); 1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_viewImpl->client()) 1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_viewImpl->client()->didInvalidateRect(damagedRect); 1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 16851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)} // namespace blink 169