Index: Source/WebCore/page/scrolling/chromium/ScrollingCoordinatorChromium.cpp |
diff --git a/Source/WebCore/page/scrolling/chromium/ScrollingCoordinatorChromium.cpp b/Source/WebCore/page/scrolling/chromium/ScrollingCoordinatorChromium.cpp |
deleted file mode 100644 |
index bce85cd1e8a1ba00f32d49a32004fb7415152eb2..0000000000000000000000000000000000000000 |
--- a/Source/WebCore/page/scrolling/chromium/ScrollingCoordinatorChromium.cpp |
+++ /dev/null |
@@ -1,319 +0,0 @@ |
-/* |
- * Copyright (C) 2012 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 APPLE 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 APPLE 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 "ScrollingCoordinatorChromium.h" |
- |
-#include "Frame.h" |
-#include "FrameView.h" |
-#include "GraphicsLayerChromium.h" |
-#include "Page.h" |
-#include "Region.h" |
-#include "RenderLayerBacking.h" |
-#include "RenderLayerCompositor.h" |
-#include "RenderView.h" |
-#include "ScrollbarThemeComposite.h" |
-#include "WebScrollbarImpl.h" |
-#include "WebScrollbarThemeGeometryNative.h" |
-#include <public/Platform.h> |
-#include <public/WebCompositorSupport.h> |
-#include <public/WebLayerPositionConstraint.h> |
-#include <public/WebScrollbar.h> |
-#include <public/WebScrollbarLayer.h> |
-#include <public/WebScrollbarThemeGeometry.h> |
-#include <public/WebScrollbarThemePainter.h> |
- |
-using WebKit::WebLayer; |
-using WebKit::WebLayerPositionConstraint; |
-using WebKit::WebRect; |
-using WebKit::WebScrollbarLayer; |
-using WebKit::WebVector; |
- |
-namespace WebCore { |
- |
-static WebLayer* scrollingWebLayerForGraphicsLayer(GraphicsLayer* layer) |
-{ |
- return layer->platformLayer(); |
-} |
- |
-WebLayer* ScrollingCoordinatorChromium::scrollingWebLayerForScrollableArea(ScrollableArea* scrollableArea) |
-{ |
- GraphicsLayer* graphicsLayer = scrollLayerForScrollableArea(scrollableArea); |
- return graphicsLayer ? scrollingWebLayerForGraphicsLayer(graphicsLayer) : 0; |
-} |
- |
-ScrollingCoordinatorChromium::ScrollingCoordinatorChromium(Page* page) |
- : ScrollingCoordinator(page) |
-{ |
-} |
- |
-ScrollingCoordinatorChromium::~ScrollingCoordinatorChromium() |
-{ |
- for (ScrollbarMap::iterator it = m_horizontalScrollbars.begin(); it != m_horizontalScrollbars.end(); ++it) |
- GraphicsLayerChromium::unregisterContentsLayer(it->value->layer()); |
- for (ScrollbarMap::iterator it = m_verticalScrollbars.begin(); it != m_verticalScrollbars.end(); ++it) |
- GraphicsLayerChromium::unregisterContentsLayer(it->value->layer()); |
-} |
- |
-void ScrollingCoordinatorChromium::frameViewLayoutUpdated(FrameView* frameView) |
-{ |
- ASSERT(m_page); |
- |
- // Compute the region of the page that we can't do fast scrolling for. This currently includes |
- // all scrollable areas, such as subframes, overflow divs and list boxes, whose composited |
- // scrolling are not enabled. We need to do this even if the frame view whose layout was updated |
- // is not the main frame. |
- Region nonFastScrollableRegion = computeNonFastScrollableRegion(m_page->mainFrame(), IntPoint()); |
- setNonFastScrollableRegion(nonFastScrollableRegion); |
-#if ENABLE(TOUCH_EVENT_TRACKING) |
- Vector<IntRect> touchEventTargetRects; |
- computeAbsoluteTouchEventTargetRects(m_page->mainFrame()->document(), touchEventTargetRects); |
- setTouchEventTargetRects(touchEventTargetRects); |
-#endif |
- if (WebLayer* scrollLayer = scrollingWebLayerForScrollableArea(frameView)) |
- scrollLayer->setBounds(frameView->contentsSize()); |
-} |
- |
-void ScrollingCoordinatorChromium::touchEventTargetRectsDidChange(const Document*) |
-{ |
-#if ENABLE(TOUCH_EVENT_TRACKING) |
- // The rects are always evaluated and used in the main frame coordinates. |
- FrameView* frameView = m_page->mainFrame()->view(); |
- Document* document = m_page->mainFrame()->document(); |
- |
- // Wait until after layout to update. |
- if (frameView->needsLayout() || !document) |
- return; |
- |
- Vector<IntRect> touchEventTargetRects; |
- computeAbsoluteTouchEventTargetRects(document, touchEventTargetRects); |
- setTouchEventTargetRects(touchEventTargetRects); |
-#endif |
-} |
- |
-static PassOwnPtr<WebScrollbarLayer> createScrollbarLayer(Scrollbar* scrollbar) |
-{ |
- // All Chromium scrollbar themes derive from ScrollbarThemeComposite. |
- ScrollbarThemeComposite* themeComposite = static_cast<ScrollbarThemeComposite*>(scrollbar->theme()); |
- WebKit::WebScrollbarThemePainter painter(themeComposite, scrollbar); |
- OwnPtr<WebKit::WebScrollbarThemeGeometry> geometry(WebKit::WebScrollbarThemeGeometryNative::create(themeComposite)); |
- |
- OwnPtr<WebScrollbarLayer> scrollbarLayer = adoptPtr(WebKit::Platform::current()->compositorSupport()->createScrollbarLayer(new WebKit::WebScrollbarImpl(scrollbar), painter, geometry.leakPtr())); |
- GraphicsLayerChromium::registerContentsLayer(scrollbarLayer->layer()); |
- return scrollbarLayer.release(); |
-} |
- |
-static void detachScrollbarLayer(GraphicsLayer* scrollbarGraphicsLayer) |
-{ |
- ASSERT(scrollbarGraphicsLayer); |
- |
- scrollbarGraphicsLayer->setContentsToPlatformLayer(0); |
- scrollbarGraphicsLayer->setDrawsContent(true); |
-} |
- |
-static void setupScrollbarLayer(GraphicsLayer* scrollbarGraphicsLayer, WebScrollbarLayer* scrollbarLayer, WebLayer* scrollLayer) |
-{ |
- ASSERT(scrollbarGraphicsLayer); |
- ASSERT(scrollbarLayer); |
- |
- if (!scrollLayer) { |
- detachScrollbarLayer(scrollbarGraphicsLayer); |
- return; |
- } |
- scrollbarLayer->setScrollLayer(scrollLayer); |
- scrollbarGraphicsLayer->setContentsToPlatformLayer(scrollbarLayer->layer()); |
- scrollbarGraphicsLayer->setDrawsContent(false); |
-} |
- |
-void ScrollingCoordinatorChromium::willDestroyScrollableArea(ScrollableArea* scrollableArea) |
-{ |
- removeWebScrollbarLayer(scrollableArea, HorizontalScrollbar); |
- removeWebScrollbarLayer(scrollableArea, VerticalScrollbar); |
-} |
- |
-void ScrollingCoordinatorChromium::scrollableAreaScrollbarLayerDidChange(ScrollableArea* scrollableArea, ScrollbarOrientation orientation) |
-{ |
-#if OS(DARWIN) |
- static const bool platformSupportsCoordinatedScrollbar = false; |
- static const bool platformSupportsMainFrameOnly = false; // Don't care. |
-#elif OS(WINDOWS) |
- static const bool platformSupportsCoordinatedScrollbar = true; |
- static const bool platformSupportsMainFrameOnly = true; |
-#else |
- static const bool platformSupportsCoordinatedScrollbar = true; |
- static const bool platformSupportsMainFrameOnly = false; |
-#endif |
- if (!platformSupportsCoordinatedScrollbar) |
- return; |
- |
- bool isMainFrame = (scrollableArea == static_cast<ScrollableArea*>(m_page->mainFrame()->view())); |
- if (!isMainFrame && platformSupportsMainFrameOnly) |
- return; |
- |
- GraphicsLayer* scrollbarGraphicsLayer = orientation == HorizontalScrollbar ? horizontalScrollbarLayerForScrollableArea(scrollableArea) : verticalScrollbarLayerForScrollableArea(scrollableArea); |
- if (scrollbarGraphicsLayer) { |
- Scrollbar* scrollbar = orientation == HorizontalScrollbar ? scrollableArea->horizontalScrollbar() : scrollableArea->verticalScrollbar(); |
- if (scrollbar->isCustomScrollbar()) { |
- detachScrollbarLayer(scrollbarGraphicsLayer); |
- return; |
- } |
- |
- WebScrollbarLayer* scrollbarLayer = getWebScrollbarLayer(scrollableArea, orientation); |
- if (!scrollbarLayer) |
- scrollbarLayer = addWebScrollbarLayer(scrollableArea, orientation, createScrollbarLayer(scrollbar)); |
- |
- // Root layer non-overlay scrollbars should be marked opaque to disable |
- // blending. |
- bool isOpaqueScrollbar = !scrollbar->isOverlayScrollbar(); |
- if (!scrollbarGraphicsLayer->contentsOpaque()) |
- scrollbarGraphicsLayer->setContentsOpaque(isMainFrame && isOpaqueScrollbar); |
- scrollbarLayer->layer()->setOpaque(scrollbarGraphicsLayer->contentsOpaque()); |
- |
- setupScrollbarLayer(scrollbarGraphicsLayer, scrollbarLayer, scrollingWebLayerForScrollableArea(scrollableArea)); |
- } else |
- removeWebScrollbarLayer(scrollableArea, orientation); |
-} |
- |
-void ScrollingCoordinatorChromium::setNonFastScrollableRegion(const Region& region) |
-{ |
- if (WebLayer* scrollLayer = scrollingWebLayerForScrollableArea(m_page->mainFrame()->view())) { |
- Vector<IntRect> rects = region.rects(); |
- WebVector<WebRect> webRects(rects.size()); |
- for (size_t i = 0; i < rects.size(); ++i) |
- webRects[i] = rects[i]; |
- scrollLayer->setNonFastScrollableRegion(webRects); |
- } |
-} |
- |
-void ScrollingCoordinatorChromium::setTouchEventTargetRects(const Vector<IntRect>& absoluteHitTestRects) |
-{ |
- if (WebLayer* scrollLayer = scrollingWebLayerForScrollableArea(m_page->mainFrame()->view())) { |
- WebVector<WebRect> webRects(absoluteHitTestRects.size()); |
- for (size_t i = 0; i < absoluteHitTestRects.size(); ++i) |
- webRects[i] = absoluteHitTestRects[i]; |
- scrollLayer->setTouchEventHandlerRegion(webRects); |
- } |
-} |
- |
-void ScrollingCoordinatorChromium::setWheelEventHandlerCount(unsigned wheelEventHandlerCount) |
-{ |
- if (WebLayer* scrollLayer = scrollingWebLayerForScrollableArea(m_page->mainFrame()->view())) |
- scrollLayer->setHaveWheelEventHandlers(wheelEventHandlerCount > 0); |
-} |
- |
-void ScrollingCoordinatorChromium::setShouldUpdateScrollLayerPositionOnMainThread(MainThreadScrollingReasons reasons) |
-{ |
- if (WebLayer* scrollLayer = scrollingWebLayerForScrollableArea(m_page->mainFrame()->view())) |
- scrollLayer->setShouldScrollOnMainThread(reasons); |
-} |
- |
-void ScrollingCoordinatorChromium::setLayerIsContainerForFixedPositionLayers(GraphicsLayer* layer, bool enable) |
-{ |
- if (WebLayer* scrollableLayer = scrollingWebLayerForGraphicsLayer(layer)) |
- scrollableLayer->setIsContainerForFixedPositionLayers(enable); |
-} |
- |
-static void clearPositionConstraintExceptForLayer(GraphicsLayer* layer, GraphicsLayer* except) |
-{ |
- if (layer && layer != except && scrollingWebLayerForGraphicsLayer(layer)) |
- scrollingWebLayerForGraphicsLayer(layer)->setPositionConstraint(WebLayerPositionConstraint()); |
-} |
- |
-static WebLayerPositionConstraint computePositionConstraint(const RenderLayer* layer) |
-{ |
- ASSERT(layer->isComposited()); |
- do { |
- if (layer->renderer()->style()->position() == FixedPosition) { |
- const RenderObject* fixedPositionObject = layer->renderer(); |
- bool fixedToRight = !fixedPositionObject->style()->right().isAuto(); |
- bool fixedToBottom = !fixedPositionObject->style()->bottom().isAuto(); |
- return WebLayerPositionConstraint::fixedPosition(fixedToRight, fixedToBottom); |
- } |
- |
- layer = layer->parent(); |
- } while (layer && !layer->isComposited()); |
- return WebLayerPositionConstraint(); |
-} |
- |
-void ScrollingCoordinatorChromium::updateLayerPositionConstraint(RenderLayer* layer) |
-{ |
- ASSERT(layer->backing()); |
- RenderLayerBacking* backing = layer->backing(); |
- GraphicsLayer* mainLayer = backing->childForSuperlayers(); |
- |
- // Avoid unnecessary commits |
- clearPositionConstraintExceptForLayer(backing->ancestorClippingLayer(), mainLayer); |
- clearPositionConstraintExceptForLayer(backing->contentsContainmentLayer(), mainLayer); |
- clearPositionConstraintExceptForLayer(backing->graphicsLayer(), mainLayer); |
- |
- if (WebLayer* scrollableLayer = scrollingWebLayerForGraphicsLayer(mainLayer)) |
- scrollableLayer->setPositionConstraint(computePositionConstraint(layer)); |
-} |
- |
-void ScrollingCoordinatorChromium::scrollableAreaScrollLayerDidChange(ScrollableArea* scrollableArea) |
-{ |
- GraphicsLayerChromium* scrollLayer = static_cast<GraphicsLayerChromium*>(scrollLayerForScrollableArea(scrollableArea)); |
- if (scrollLayer) |
- scrollLayer->setScrollableArea(scrollableArea); |
- |
- WebLayer* webLayer = scrollingWebLayerForScrollableArea(scrollableArea); |
- if (webLayer) { |
- webLayer->setScrollable(true); |
- webLayer->setScrollPosition(IntPoint(scrollableArea->scrollPosition() - scrollableArea->minimumScrollPosition())); |
- webLayer->setMaxScrollPosition(IntSize(scrollableArea->scrollSize(HorizontalScrollbar), scrollableArea->scrollSize(VerticalScrollbar))); |
- } |
- if (WebScrollbarLayer* scrollbarLayer = getWebScrollbarLayer(scrollableArea, HorizontalScrollbar)) |
- setupScrollbarLayer(horizontalScrollbarLayerForScrollableArea(scrollableArea), scrollbarLayer, webLayer); |
- if (WebScrollbarLayer* scrollbarLayer = getWebScrollbarLayer(scrollableArea, VerticalScrollbar)) |
- setupScrollbarLayer(verticalScrollbarLayerForScrollableArea(scrollableArea), scrollbarLayer, webLayer); |
-} |
- |
-void ScrollingCoordinatorChromium::recomputeWheelEventHandlerCountForFrameView(FrameView* frameView) |
-{ |
- UNUSED_PARAM(frameView); |
- setWheelEventHandlerCount(computeCurrentWheelEventHandlerCount()); |
-} |
- |
-WebScrollbarLayer* ScrollingCoordinatorChromium::addWebScrollbarLayer(ScrollableArea* scrollableArea, ScrollbarOrientation orientation, PassOwnPtr<WebKit::WebScrollbarLayer> scrollbarLayer) |
-{ |
- ScrollbarMap& scrollbars = orientation == HorizontalScrollbar ? m_horizontalScrollbars : m_verticalScrollbars; |
- return scrollbars.add(scrollableArea, scrollbarLayer).iterator->value.get(); |
-} |
- |
-WebScrollbarLayer* ScrollingCoordinatorChromium::getWebScrollbarLayer(ScrollableArea* scrollableArea, ScrollbarOrientation orientation) |
-{ |
- ScrollbarMap& scrollbars = orientation == HorizontalScrollbar ? m_horizontalScrollbars : m_verticalScrollbars; |
- return scrollbars.get(scrollableArea); |
-} |
- |
-void ScrollingCoordinatorChromium::removeWebScrollbarLayer(ScrollableArea* scrollableArea, ScrollbarOrientation orientation) |
-{ |
- ScrollbarMap& scrollbars = orientation == HorizontalScrollbar ? m_horizontalScrollbars : m_verticalScrollbars; |
- if (OwnPtr<WebScrollbarLayer> scrollbarLayer = scrollbars.take(scrollableArea)) |
- GraphicsLayerChromium::unregisterContentsLayer(scrollbarLayer->layer()); |
-} |
- |
-} |