Title: [101758] trunk/Source/WebKit/chromium
Revision
101758
Author
[email protected]
Date
2011-12-02 00:55:48 -0800 (Fri, 02 Dec 2011)

Log Message

[Chromium] Support adding/removing page overlay to WebView
https://bugs.webkit.org/show_bug.cgi?id=73235

Patch by Xiyuan Xia <[email protected]> on 2011-12-02
Reviewed by James Robinson.

* WebKit.gyp:
* public/WebPageOverlay.h: Added.
(WebKit::WebPageOverlay::~WebPageOverlay):
* public/WebView.h:
* src/PageOverlay.cpp:
(WebKit::PageOverlay::create):
(WebKit::PageOverlay::PageOverlay):
(WebKit::OverlayGraphicsLayerClientImpl::create):
(WebKit::OverlayGraphicsLayerClientImpl::paintContents):
(WebKit::OverlayGraphicsLayerClientImpl::OverlayGraphicsLayerClientImpl):
(WebKit::PageOverlay::update):
(WebKit::PageOverlay::paintWebFrame):
(WebKit::PageOverlay::invalidateWebFrame):
* src/PageOverlay.h:
(WebKit::PageOverlay::overlay):
(WebKit::PageOverlay::setOverlay):
(WebKit::PageOverlay::zOrder):
(WebKit::PageOverlay::setZOrder):
* src/PageOverlayList.cpp: Added.
(WebKit::PageOverlayList::create):
(WebKit::PageOverlayList::PageOverlayList):
(WebKit::PageOverlayList::~PageOverlayList):
(WebKit::PageOverlayList::add):
(WebKit::PageOverlayList::remove):
(WebKit::PageOverlayList::update):
(WebKit::PageOverlayList::paintWebFrame):
(WebKit::PageOverlayList::find):
* src/PageOverlayList.h: Added.
(WebKit::PageOverlayList::empty):
* src/WebDevToolsAgentImpl.cpp:
(WebKit::WebDevToolsAgentImpl::paintPageOverlay):
(WebKit::WebDevToolsAgentImpl::highlight):
(WebKit::WebDevToolsAgentImpl::hideHighlight):
* src/WebDevToolsAgentImpl.h:
* src/WebFrameImpl.cpp:
(WebKit::WebFrameImpl::paintWithContext):
* src/WebViewImpl.cpp:
(WebKit::WebViewImpl::composite):
(WebKit::WebViewImpl::addPageOverlay):
(WebKit::WebViewImpl::removePageOverlay):
(WebKit::WebViewImpl::setIsAcceleratedCompositingActive):
(WebKit::WebViewImpl::didRecreateGraphicsContext):
* src/WebViewImpl.h:
(WebKit::WebViewImpl::pageOverlays):

Modified Paths

Added Paths

Diff

Modified: trunk/Source/WebKit/chromium/ChangeLog (101757 => 101758)


--- trunk/Source/WebKit/chromium/ChangeLog	2011-12-02 08:44:20 UTC (rev 101757)
+++ trunk/Source/WebKit/chromium/ChangeLog	2011-12-02 08:55:48 UTC (rev 101758)
@@ -1,3 +1,55 @@
+2011-12-02  Xiyuan Xia  <[email protected]>
+
+        [Chromium] Support adding/removing page overlay to WebView
+        https://bugs.webkit.org/show_bug.cgi?id=73235
+
+        Reviewed by James Robinson.
+
+        * WebKit.gyp:
+        * public/WebPageOverlay.h: Added.
+        (WebKit::WebPageOverlay::~WebPageOverlay):
+        * public/WebView.h:
+        * src/PageOverlay.cpp:
+        (WebKit::PageOverlay::create):
+        (WebKit::PageOverlay::PageOverlay):
+        (WebKit::OverlayGraphicsLayerClientImpl::create):
+        (WebKit::OverlayGraphicsLayerClientImpl::paintContents):
+        (WebKit::OverlayGraphicsLayerClientImpl::OverlayGraphicsLayerClientImpl):
+        (WebKit::PageOverlay::update):
+        (WebKit::PageOverlay::paintWebFrame):
+        (WebKit::PageOverlay::invalidateWebFrame):
+        * src/PageOverlay.h:
+        (WebKit::PageOverlay::overlay):
+        (WebKit::PageOverlay::setOverlay):
+        (WebKit::PageOverlay::zOrder):
+        (WebKit::PageOverlay::setZOrder):
+        * src/PageOverlayList.cpp: Added.
+        (WebKit::PageOverlayList::create):
+        (WebKit::PageOverlayList::PageOverlayList):
+        (WebKit::PageOverlayList::~PageOverlayList):
+        (WebKit::PageOverlayList::add):
+        (WebKit::PageOverlayList::remove):
+        (WebKit::PageOverlayList::update):
+        (WebKit::PageOverlayList::paintWebFrame):
+        (WebKit::PageOverlayList::find):
+        * src/PageOverlayList.h: Added.
+        (WebKit::PageOverlayList::empty):
+        * src/WebDevToolsAgentImpl.cpp:
+        (WebKit::WebDevToolsAgentImpl::paintPageOverlay):
+        (WebKit::WebDevToolsAgentImpl::highlight):
+        (WebKit::WebDevToolsAgentImpl::hideHighlight):
+        * src/WebDevToolsAgentImpl.h:
+        * src/WebFrameImpl.cpp:
+        (WebKit::WebFrameImpl::paintWithContext):
+        * src/WebViewImpl.cpp:
+        (WebKit::WebViewImpl::composite):
+        (WebKit::WebViewImpl::addPageOverlay):
+        (WebKit::WebViewImpl::removePageOverlay):
+        (WebKit::WebViewImpl::setIsAcceleratedCompositingActive):
+        (WebKit::WebViewImpl::didRecreateGraphicsContext):
+        * src/WebViewImpl.h:
+        (WebKit::WebViewImpl::pageOverlays):
+
 2011-12-01  Jochen Eisinger  <[email protected]>
 
         [chromium] add referrer policy to WebContextMenuData

Modified: trunk/Source/WebKit/chromium/WebKit.gyp (101757 => 101758)


--- trunk/Source/WebKit/chromium/WebKit.gyp	2011-12-02 08:44:20 UTC (rev 101757)
+++ trunk/Source/WebKit/chromium/WebKit.gyp	2011-12-02 08:55:48 UTC (rev 101758)
@@ -260,6 +260,7 @@
                 'public/WebNotificationPresenter.h',
                 'public/WebNotificationPermissionCallback.h',
                 'public/WebOptionElement.h',
+                'public/WebPageOverlay.h',
                 'public/WebPageSerializer.h',
                 'public/WebPageSerializerClient.h',
                 'public/WebPageVisibilityState.h',
@@ -437,6 +438,8 @@
                 'src/painting/GraphicsContextBuilder.h',
                 'src/PageOverlay.cpp',
                 'src/PageOverlay.h',
+                'src/PageOverlayList.cpp',
+                'src/PageOverlayList.h',
                 'src/PlatformMessagePortChannel.cpp',
                 'src/PlatformMessagePortChannel.h',
                 'src/PlatformSupport.cpp',

Copied: trunk/Source/WebKit/chromium/public/WebPageOverlay.h (from rev 101757, trunk/Source/WebKit/chromium/src/PageOverlay.h) (0 => 101758)


--- trunk/Source/WebKit/chromium/public/WebPageOverlay.h	                        (rev 0)
+++ trunk/Source/WebKit/chromium/public/WebPageOverlay.h	2011-12-02 08:55:48 UTC (rev 101758)
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY GOOGLE INC. AND ITS CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GOOGLE INC.
+ * OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef WebPageOverlay_h
+#define WebPageOverlay_h
+
+#include "WebCanvas.h"
+#include "WebRect.h"
+
+namespace WebKit {
+
+class WebPageOverlay {
+public:
+    // Paints page overlay contents.
+    virtual void paintPageOverlay(WebCanvas*) = 0;
+
+protected:
+    virtual ~WebPageOverlay() { }
+};
+
+} // namespace WebKit
+
+#endif // WebPageOverlay_h

Modified: trunk/Source/WebKit/chromium/public/WebView.h (101757 => 101758)


--- trunk/Source/WebKit/chromium/public/WebView.h	2011-12-02 08:44:20 UTC (rev 101757)
+++ trunk/Source/WebKit/chromium/public/WebView.h	2011-12-02 08:55:48 UTC (rev 101758)
@@ -48,6 +48,7 @@
 class WebFrameClient;
 class WebGraphicsContext3D;
 class WebNode;
+class WebPageOverlay;
 class WebPermissionClient;
 class WebSettings;
 class WebSpellCheckClient;
@@ -409,7 +410,19 @@
     virtual void setVisibilityState(WebPageVisibilityState visibilityState,
                                     bool isInitialState) { }
 
+    // PageOverlay ----------------------------------------------------------
 
+    // Adds/removes page overlay to this WebView. These functions change the
+    // graphical appearance of the WebView. WebPageOverlay paints the
+    // contents of the page overlay. It also provides an z-order number for
+    // the page overlay. The z-order number defines the paint order the page
+    // overlays. Page overlays with larger z-order number will be painted after
+    // page overlays with smaller z-order number. That is, they appear above
+    // the page overlays with smaller z-order number. If two page overlays have
+    // the same z-order number, the later added one will be on top.
+    virtual void addPageOverlay(WebPageOverlay*, int /*z-order*/) = 0;
+    virtual void removePageOverlay(WebPageOverlay*) = 0;
+
     // Testing functionality for LayoutTestController -----------------------
 
     // Simulates a compositor lost context.

Modified: trunk/Source/WebKit/chromium/src/PageOverlay.cpp (101757 => 101758)


--- trunk/Source/WebKit/chromium/src/PageOverlay.cpp	2011-12-02 08:44:20 UTC (rev 101757)
+++ trunk/Source/WebKit/chromium/src/PageOverlay.cpp	2011-12-02 08:55:48 UTC (rev 101758)
@@ -32,7 +32,9 @@
 #include "GraphicsLayer.h"
 #include "GraphicsLayerClient.h"
 #include "Page.h"
+#include "PlatformContextSkia.h"
 #include "Settings.h"
+#include "WebPageOverlay.h"
 #include "WebViewClient.h"
 #include "WebViewImpl.h"
 
@@ -40,23 +42,37 @@
 
 namespace WebKit {
 
-PassOwnPtr<PageOverlay> PageOverlay::create(WebViewImpl* viewImpl, PageOverlayClient* client)
+namespace {
+
+WebCanvas* ToWebCanvas(GraphicsContext* gc)
 {
-    return adoptPtr(new PageOverlay(viewImpl, client));
+#if WEBKIT_USING_SKIA
+    return gc->platformContext()->canvas();
+#elif WEBKIT_USING_CG
+    return gc->platformContext();
+#endif
 }
 
-PageOverlay::PageOverlay(WebViewImpl* viewImpl, PageOverlayClient* client)
+} // namespace
+
+PassOwnPtr<PageOverlay> PageOverlay::create(WebViewImpl* viewImpl, WebPageOverlay* overlay)
+{
+    return adoptPtr(new PageOverlay(viewImpl, overlay));
+}
+
+PageOverlay::PageOverlay(WebViewImpl* viewImpl, WebPageOverlay* overlay)
     : m_viewImpl(viewImpl)
-    , m_client(client)
+    , m_overlay(overlay)
+    , m_zOrder(0)
 {
 }
 
 #if USE(ACCELERATED_COMPOSITING)
 class OverlayGraphicsLayerClientImpl : public WebCore::GraphicsLayerClient {
 public:
-    static PassOwnPtr<OverlayGraphicsLayerClientImpl*> create(WebViewImpl* webViewImpl, PageOverlay::PageOverlayClient* pageOverlayClient)
+    static PassOwnPtr<OverlayGraphicsLayerClientImpl*> create(WebViewImpl* webViewImpl, WebPageOverlay* overlay)
     {
-        return adoptPtr(new OverlayGraphicsLayerClientImpl(webViewImpl, pageOverlayClient));
+        return adoptPtr(new OverlayGraphicsLayerClientImpl(webViewImpl, overlay));
     }
 
     virtual ~OverlayGraphicsLayerClientImpl() { }
@@ -65,9 +81,11 @@
 
     virtual void notifySyncRequired(const GraphicsLayer*) { }
 
-    virtual void paintContents(const GraphicsLayer*, GraphicsContext& context, GraphicsLayerPaintingPhase, const IntRect& inClip)
+    virtual void paintContents(const GraphicsLayer*, GraphicsContext& gc, GraphicsLayerPaintingPhase, const IntRect& inClip)
     {
-        m_pageOverlayClient->paintPageOverlay(context);
+        gc.save();
+        m_overlay->paintPageOverlay(ToWebCanvas(&gc));
+        gc.restore();
     }
 
     virtual float deviceScaleFactor() const
@@ -91,13 +109,13 @@
     }
 
 private:
-    explicit OverlayGraphicsLayerClientImpl(WebViewImpl* webViewImpl, PageOverlay::PageOverlayClient* pageOverlayClient)
-        : m_pageOverlayClient(pageOverlayClient)
+    OverlayGraphicsLayerClientImpl(WebViewImpl* webViewImpl, WebPageOverlay* overlay)
+        : m_overlay(overlay)
         , m_webViewImpl(webViewImpl)
     {
     }
 
-    PageOverlay::PageOverlayClient* m_pageOverlayClient;
+    WebPageOverlay* m_overlay;
     WebViewImpl* m_webViewImpl;
 };
 #endif
@@ -121,13 +139,20 @@
 
 #if USE(ACCELERATED_COMPOSITING)
     if (!m_layer) {
-        m_layerClient = OverlayGraphicsLayerClientImpl::create(m_viewImpl, m_client);
+        m_layerClient = OverlayGraphicsLayerClientImpl::create(m_viewImpl, m_overlay);
         m_layer = GraphicsLayer::create(m_layerClient.get());
         m_layer->setName("WebViewImpl page overlay content");
         m_layer->setDrawsContent(true);
-        const WebSize& size = m_viewImpl->size();
-        m_layer->setSize(IntSize(size.width, size.height));
     }
+
+    FloatSize size(m_viewImpl->size());
+    if (size != m_layer->size()) {
+        // Triggers re-adding to root layer to ensure that we are on top of
+        // scrollbars.
+        m_layer->removeFromParent();
+        m_layer->setSize(size);
+    }
+
     m_viewImpl->setOverlayLayer(m_layer.get());
     m_layer->setNeedsDisplay();
 #endif
@@ -135,13 +160,16 @@
 
 void PageOverlay::paintWebFrame(GraphicsContext& gc)
 {
-    if (!m_viewImpl->isAcceleratedCompositingActive())
-        m_client->paintPageOverlay(gc);
+    if (!m_viewImpl->isAcceleratedCompositingActive()) {
+        gc.save();
+        m_overlay->paintPageOverlay(ToWebCanvas(&gc));
+        gc.restore();
+    }
 }
 
 void PageOverlay::invalidateWebFrame()
 {
-    // PageOverlayClient does the actual painting of the overlay.
+    // WebPageOverlay does the actual painting of the overlay.
     // Here we just make sure to invalidate.
     if (!m_viewImpl->isAcceleratedCompositingActive()) {
         // FIXME: able to invalidate a smaller rect.

Modified: trunk/Source/WebKit/chromium/src/PageOverlay.h (101757 => 101758)


--- trunk/Source/WebKit/chromium/src/PageOverlay.h	2011-12-02 08:44:20 UTC (rev 101757)
+++ trunk/Source/WebKit/chromium/src/PageOverlay.h	2011-12-02 08:55:48 UTC (rev 101758)
@@ -39,33 +39,35 @@
 }
 
 namespace WebKit {
+class WebPageOverlay;
 class WebViewImpl;
+struct WebRect;
 
 class PageOverlay {
 public:
-    class PageOverlayClient {
-    public:
-        virtual void paintPageOverlay(WebCore::GraphicsContext&) = 0;
-    };
+    static PassOwnPtr<PageOverlay> create(WebViewImpl*, WebPageOverlay*);
 
-    static PassOwnPtr<PageOverlay> create(WebViewImpl*, PageOverlayClient*);
-
     ~PageOverlay() { }
 
-    void setClient(PageOverlayClient* client) { m_client = client; }
+    WebPageOverlay* overlay() const { return m_overlay; }
+    void setOverlay(WebPageOverlay* overlay) { m_overlay = overlay; }
 
+    int zOrder() const { return m_zOrder; }
+    void setZOrder(int zOrder) { m_zOrder = zOrder; }
+
     void clear();
     void update();
     void paintWebFrame(WebCore::GraphicsContext&);
 
 private:
-    PageOverlay(WebViewImpl*, PageOverlayClient*);
+    PageOverlay(WebViewImpl*, WebPageOverlay*);
     void invalidateWebFrame();
 
     WebViewImpl* m_viewImpl;
-    PageOverlayClient* m_client;
+    WebPageOverlay* m_overlay;
     OwnPtr<WebCore::GraphicsLayer> m_layer;
     OwnPtr<WebCore::GraphicsLayerClient> m_layerClient;
+    int m_zOrder;
 };
 
 } // namespace WebKit

Added: trunk/Source/WebKit/chromium/src/PageOverlayList.cpp (0 => 101758)


--- trunk/Source/WebKit/chromium/src/PageOverlayList.cpp	                        (rev 0)
+++ trunk/Source/WebKit/chromium/src/PageOverlayList.cpp	2011-12-02 08:55:48 UTC (rev 101758)
@@ -0,0 +1,130 @@
+/*
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY GOOGLE INC. AND ITS CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GOOGLE INC.
+ * OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "PageOverlayList.h"
+
+#include "PageOverlay.h"
+#include "WebPageOverlay.h"
+#include "WebViewImpl.h"
+
+namespace WebKit {
+
+PassOwnPtr<PageOverlayList> PageOverlayList::create(WebViewImpl* viewImpl)
+{
+    return adoptPtr(new PageOverlayList(viewImpl));
+}
+
+PageOverlayList::PageOverlayList(WebViewImpl* viewImpl)
+    : m_viewImpl(viewImpl)
+{
+}
+
+PageOverlayList::~PageOverlayList()
+{
+}
+
+bool PageOverlayList::add(WebPageOverlay* overlay, int zOrder)
+{
+    bool added = false;
+    size_t index = find(overlay);
+    if (index == WTF::notFound) {
+        OwnPtr<PageOverlay> pageOverlay = PageOverlay::create(m_viewImpl, overlay);
+        m_pageOverlays.append(pageOverlay.release());
+        index = m_pageOverlays.size() - 1;
+        added = true;
+    }
+
+    PageOverlay* pageOverlay = m_pageOverlays[index].get();
+    pageOverlay->setZOrder(zOrder);
+
+    // Adjust page overlay list order based on their z-order numbers. We first
+    // check if we need to move the overlay up and do so if needed. Otherwise,
+    // check if we need to move it down.
+    bool zOrderChanged = false;
+    for (size_t i = index; i + 1 < m_pageOverlays.size(); ++i) {
+        if (m_pageOverlays[i]->zOrder() >= m_pageOverlays[i + 1]->zOrder()) {
+            m_pageOverlays[i].swap(m_pageOverlays[i + 1]);
+            zOrderChanged = true;
+        }
+    }
+
+    if (!zOrderChanged) {
+        for (size_t i = index; i >= 1; --i) {
+            if (m_pageOverlays[i]->zOrder() < m_pageOverlays[i - 1]->zOrder()) {
+                m_pageOverlays[i].swap(m_pageOverlays[i - 1]);
+                zOrderChanged = true;
+            }
+        }
+    }
+
+    // If we did move the overlay, that means z-order is changed and we need to
+    // update overlay layers' z-order. Otherwise, just update current overlay.
+    if (zOrderChanged) {
+        for (size_t i = 0; i < m_pageOverlays.size(); ++i)
+            m_pageOverlays[i]->clear();
+        update();
+    } else
+        pageOverlay->update();
+
+    return added;
+}
+
+bool PageOverlayList::remove(WebPageOverlay* overlay)
+{
+    size_t index = find(overlay);
+    if (index == WTF::notFound)
+        return false;
+
+    m_pageOverlays[index]->clear();
+    m_pageOverlays.remove(index);
+    return true;
+}
+
+void PageOverlayList::update()
+{
+    for (size_t i = 0; i < m_pageOverlays.size(); ++i)
+        m_pageOverlays[i]->update();
+}
+
+void PageOverlayList::paintWebFrame(WebCore::GraphicsContext& gc)
+{
+    for (size_t i = 0; i < m_pageOverlays.size(); ++i)
+        m_pageOverlays[i]->paintWebFrame(gc);
+}
+
+size_t PageOverlayList::find(WebPageOverlay* overlay)
+{
+    for (size_t i = 0; i < m_pageOverlays.size(); ++i) {
+        if (m_pageOverlays[i]->overlay() == overlay)
+            return i;
+    }
+    return WTF::notFound;
+}
+
+} // namespace WebKit

Copied: trunk/Source/WebKit/chromium/src/PageOverlayList.h (from rev 101757, trunk/Source/WebKit/chromium/src/PageOverlay.h) (0 => 101758)


--- trunk/Source/WebKit/chromium/src/PageOverlayList.h	                        (rev 0)
+++ trunk/Source/WebKit/chromium/src/PageOverlayList.h	2011-12-02 08:55:48 UTC (rev 101758)
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY GOOGLE INC. AND ITS CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GOOGLE INC.
+ * OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef PageOverlayList_h
+#define PageOverlayList_h
+
+#include <wtf/OwnPtr.h>
+#include <wtf/PassOwnPtr.h>
+#include <wtf/Vector.h>
+
+namespace WebCore {
+class GraphicsContext;
+}
+
+namespace WebKit {
+class PageOverlay;
+class WebPageOverlay;
+class WebViewImpl;
+
+class PageOverlayList {
+public:
+    static PassOwnPtr<PageOverlayList> create(WebViewImpl*);
+
+    ~PageOverlayList();
+
+    bool empty() const { return !m_pageOverlays.size(); }
+
+    // Adds/removes a PageOverlay for given client.
+    // Returns true if a PageOverlay is added/removed.
+    bool add(WebPageOverlay*, int /* zOrder */);
+    bool remove(WebPageOverlay*);
+
+    void update();
+    void paintWebFrame(WebCore::GraphicsContext&);
+
+private:
+    typedef Vector<OwnPtr<PageOverlay>, 2> PageOverlays;
+
+    explicit PageOverlayList(WebViewImpl*);
+
+    // Returns the index of the client found. Otherwise, returns WTF::notFound.
+    size_t find(WebPageOverlay*);
+
+    WebViewImpl* m_viewImpl;
+    PageOverlays m_pageOverlays;
+};
+
+} // namespace WebKit
+
+#endif // PageOverlayList_h

Modified: trunk/Source/WebKit/chromium/src/WebDevToolsAgentImpl.cpp (101757 => 101758)


--- trunk/Source/WebKit/chromium/src/WebDevToolsAgentImpl.cpp	2011-12-02 08:44:20 UTC (rev 101757)
+++ trunk/Source/WebKit/chromium/src/WebDevToolsAgentImpl.cpp	2011-12-02 08:55:48 UTC (rev 101758)
@@ -42,8 +42,8 @@
 #include "MemoryCache.h"
 #include "Page.h"
 #include "PageGroup.h"
-#include "PageOverlay.h"
 #include "PageScriptDebugServer.h"
+#include "painting/GraphicsContextBuilder.h"
 #include "PlatformString.h"
 #include "ResourceError.h"
 #include "ResourceRequest.h"
@@ -272,22 +272,23 @@
 {
 }
 
-// PageOverlayClient
-void WebDevToolsAgentImpl::paintPageOverlay(GraphicsContext& gc)
+// WebPageOverlay
+void WebDevToolsAgentImpl::paintPageOverlay(WebCanvas* canvas)
 {
     InspectorController* ic = inspectorController();
     if (ic)
-        ic->drawHighlight(gc);
+        ic->drawHighlight(GraphicsContextBuilder(canvas).context());
 }
 
 void WebDevToolsAgentImpl::highlight()
 {
-    m_webViewImpl->setPageOverlayClient(this);
+    // Use 99 as a big z-order number so that highlight is above other overlays.
+    m_webViewImpl->addPageOverlay(this, 99);
 }
 
 void WebDevToolsAgentImpl::hideHighlight()
 {
-    m_webViewImpl->setPageOverlayClient(0);
+    m_webViewImpl->removePageOverlay(this);
 }
 
 bool WebDevToolsAgentImpl::sendMessageToFrontend(const String& message)

Modified: trunk/Source/WebKit/chromium/src/WebDevToolsAgentImpl.h (101757 => 101758)


--- trunk/Source/WebKit/chromium/src/WebDevToolsAgentImpl.h	2011-12-02 08:44:20 UTC (rev 101757)
+++ trunk/Source/WebKit/chromium/src/WebDevToolsAgentImpl.h	2011-12-02 08:55:48 UTC (rev 101758)
@@ -33,8 +33,8 @@
 
 #include "InspectorClient.h"
 
-#include "PageOverlay.h"
 #include "WebDevToolsAgentPrivate.h"
+#include "WebPageOverlay.h"
 
 #include <wtf/Forward.h>
 #include <wtf/OwnPtr.h>
@@ -62,7 +62,7 @@
 
 class WebDevToolsAgentImpl : public WebDevToolsAgentPrivate,
                              public WebCore::InspectorClient,
-                             public PageOverlay::PageOverlayClient {
+                             public WebPageOverlay {
 public:
     WebDevToolsAgentImpl(WebViewImpl* webViewImpl, WebDevToolsAgentClient* client);
     virtual ~WebDevToolsAgentImpl();
@@ -97,8 +97,8 @@
 
     int hostId() { return m_hostId; }
 
-    // PageOverlayClient
-    virtual void paintPageOverlay(WebCore::GraphicsContext&);
+    // WebPageOverlay
+    virtual void paintPageOverlay(WebCanvas*);
 
 private:
     WebCore::InspectorController* inspectorController();

Modified: trunk/Source/WebKit/chromium/src/WebFrameImpl.cpp (101757 => 101758)


--- trunk/Source/WebKit/chromium/src/WebFrameImpl.cpp	2011-12-02 08:44:20 UTC (rev 101757)
+++ trunk/Source/WebKit/chromium/src/WebFrameImpl.cpp	2011-12-02 08:55:48 UTC (rev 101758)
@@ -2063,8 +2063,8 @@
     if (m_frame->document() && frameView()) {
         gc.clip(dirtyRect);
         frameView()->paint(&gc, dirtyRect);
-        if (viewImpl()->pageOverlay())
-            viewImpl()->pageOverlay()->paintWebFrame(gc);
+        if (viewImpl()->pageOverlays())
+            viewImpl()->pageOverlays()->paintWebFrame(gc);
     } else
         gc.fillRect(dirtyRect, Color::white, ColorSpaceDeviceRGB);
     gc.restore();

Modified: trunk/Source/WebKit/chromium/src/WebViewImpl.cpp (101757 => 101758)


--- trunk/Source/WebKit/chromium/src/WebViewImpl.cpp	2011-12-02 08:44:20 UTC (rev 101757)
+++ trunk/Source/WebKit/chromium/src/WebViewImpl.cpp	2011-12-02 08:55:48 UTC (rev 101758)
@@ -1256,8 +1256,8 @@
         if (!page())
             return;
 
-        if (m_pageOverlay)
-            m_pageOverlay->update();
+        if (m_pageOverlays)
+            m_pageOverlays->update();
 
         m_layerTreeHost->composite();
     }
@@ -2610,21 +2610,22 @@
     m_ignoreInputEvents = newValue;
 }
 
-void WebViewImpl::setPageOverlayClient(PageOverlay::PageOverlayClient* pageOverlayClient)
+void WebViewImpl::addPageOverlay(WebPageOverlay* overlay, int zOrder)
 {
-    if (pageOverlayClient) {
-        if (!m_pageOverlay)
-            m_pageOverlay = PageOverlay::create(this, pageOverlayClient);
-        else
-            m_pageOverlay->setClient(pageOverlayClient);
-        m_pageOverlay->update();
+    if (!m_pageOverlays)
+        m_pageOverlays = PageOverlayList::create(this);
+
+    m_pageOverlays->add(overlay, zOrder);
+    setRootLayerNeedsDisplay();
+}
+
+void WebViewImpl::removePageOverlay(WebPageOverlay* overlay)
+{
+    if (m_pageOverlays && m_pageOverlays->remove(overlay)) {
         setRootLayerNeedsDisplay();
-    } else {
-        if (m_pageOverlay) {
-            m_pageOverlay->clear();
-            m_pageOverlay = nullptr;
-            setRootLayerNeedsDisplay();
-        }
+
+        if (m_pageOverlays->empty())
+            m_pageOverlays = nullptr;
     }
 }
 
@@ -2870,8 +2871,8 @@
             m_client->didActivateCompositor(m_layerTreeHost->compositorIdentifier());
             m_isAcceleratedCompositingActive = true;
             m_compositorCreationFailed = false;
-            if (m_pageOverlay)
-                m_pageOverlay->update();
+            if (m_pageOverlays)
+                m_pageOverlays->update();
         } else {
             m_layerTreeHost.clear();
             m_nonCompositedContentHost.clear();
@@ -2952,8 +2953,8 @@
         return;
     }
 
-    if (m_pageOverlay)
-        m_pageOverlay->update();
+    if (m_pageOverlays)
+        m_pageOverlays->update();
 }
 
 void WebViewImpl::scheduleComposite()

Modified: trunk/Source/WebKit/chromium/src/WebViewImpl.h (101757 => 101758)


--- trunk/Source/WebKit/chromium/src/WebViewImpl.h	2011-12-02 08:44:20 UTC (rev 101757)
+++ trunk/Source/WebKit/chromium/src/WebViewImpl.h	2011-12-02 08:55:48 UTC (rev 101758)
@@ -47,7 +47,7 @@
 #include "InspectorClientImpl.h"
 #include "IntRect.h"
 #include "NotificationPresenterImpl.h"
-#include "PageOverlay.h"
+#include "PageOverlayList.h"
 #include "UserMediaClientImpl.h"
 #include "cc/CCLayerTreeHost.h"
 #include <wtf/OwnPtr.h>
@@ -227,6 +227,8 @@
                                     unsigned inactiveBackgroundColor,
                                     unsigned inactiveForegroundColor);
     virtual void performCustomContextMenuAction(unsigned action);
+    virtual void addPageOverlay(WebPageOverlay*, int /* zOrder */);
+    virtual void removePageOverlay(WebPageOverlay*);
 
     // CCLayerTreeHostClient
     virtual void animateAndLayout(double frameBeginTime);
@@ -242,8 +244,7 @@
     void setIgnoreInputEvents(bool newValue);
     WebDevToolsAgentPrivate* devToolsAgentPrivate() { return m_devToolsAgent.get(); }
 
-    PageOverlay* pageOverlay() const { return m_pageOverlay.get(); }
-    void setPageOverlayClient(PageOverlay::PageOverlayClient*);
+    PageOverlayList* pageOverlays() const { return m_pageOverlays.get(); }
 
     void setOverlayLayer(WebCore::GraphicsLayer*);
 
@@ -579,7 +580,7 @@
     RefPtr<WebCore::PopupContainer> m_selectPopup;
 
     OwnPtr<WebDevToolsAgentPrivate> m_devToolsAgent;
-    OwnPtr<PageOverlay> m_pageOverlay;
+    OwnPtr<PageOverlayList> m_pageOverlays;
 
     // Whether the webview is rendering transparently.
     bool m_isTransparent;
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to