https://bugs.webkit.org/show_bug.cgi?id=109560
Patch by Tien-Ren Chen <trchen@chromium.org> on 2013-02-26
Reviewed by James Robinson.
Source/WebCore:
This patch obsoletes ScrollingCoordinatorPrivate for the Chromium
implementation. Also removes the concept of a single main scrolling
layer. Should use HashMap to keep track resources for multiple
scrollable objects.
Many of the callbacks are extended to support ScrollableArea instead
of just FrameView. Now ScrollingCoordinatorChromium coordinates
scrollbars for both subframes and overflow:scroll.
Some drive-by change:
1. Remove the GraphicsLayer parameter for layer change callbacks.
Should be able to get the latest layer from the ScrollableArea anyway.
2. Should start from main frame document when updating touch event target rects.
New chromium test: ScrollingCoordinatorChromiumTest.iframeScrolling
* page/Frame.cpp:
(WebCore::Frame::willDetachPage):
* page/FrameView.cpp:
(WebCore::FrameView::prepareForDetach):
(WebCore::FrameView::layerForScrolling):
(WebCore):
* page/FrameView.h:
(FrameView):
* page/scrolling/ScrollingCoordinator.cpp:
(WebCore::ScrollingCoordinator::scrollLayerForScrollableArea):
(WebCore):
(WebCore::ScrollingCoordinator::horizontalScrollbarLayerForScrollableArea):
(WebCore::ScrollingCoordinator::verticalScrollbarLayerForScrollableArea):
* page/scrolling/ScrollingCoordinator.h:
(WebCore::ScrollingCoordinator::willDestroyScrollableArea):
(WebCore::ScrollingCoordinator::scrollableAreaScrollLayerDidChange):
(WebCore::ScrollingCoordinator::scrollableAreaScrollbarLayerDidChange):
(ScrollingCoordinator):
* page/scrolling/chromium/ScrollingCoordinatorChromium.cpp:
(WebCore::scrollingWebLayerForGraphicsLayer):
(WebCore::ScrollingCoordinatorChromium::scrollingWebLayerForScrollableArea):
(WebCore::ScrollingCoordinatorChromium::ScrollingCoordinatorChromium):
(WebCore::ScrollingCoordinatorChromium::~ScrollingCoordinatorChromium):
(WebCore::ScrollingCoordinatorChromium::frameViewLayoutUpdated):
(WebCore::ScrollingCoordinatorChromium::touchEventTargetRectsDidChange):
(WebCore::createScrollbarLayer):
(WebCore::detachScrollbarLayer):
(WebCore::setupScrollbarLayer):
(WebCore::ScrollingCoordinatorChromium::willDestroyScrollableArea):
(WebCore::ScrollingCoordinatorChromium::scrollableAreaScrollbarLayerDidChange):
(WebCore::ScrollingCoordinatorChromium::setNonFastScrollableRegion):
(WebCore::ScrollingCoordinatorChromium::setTouchEventTargetRects):
(WebCore::ScrollingCoordinatorChromium::setWheelEventHandlerCount):
(WebCore::ScrollingCoordinatorChromium::setShouldUpdateScrollLayerPositionOnMainThread):
(WebCore::ScrollingCoordinatorChromium::setLayerIsContainerForFixedPositionLayers):
(WebCore::ScrollingCoordinatorChromium::setLayerIsFixedToContainerLayer):
(WebCore::ScrollingCoordinatorChromium::scrollableAreaScrollLayerDidChange):
(WebCore::ScrollingCoordinatorChromium::addWebScrollbarLayer):
(WebCore):
(WebCore::ScrollingCoordinatorChromium::getWebScrollbarLayer):
(WebCore::ScrollingCoordinatorChromium::removeWebScrollbarLayer):
* page/scrolling/chromium/ScrollingCoordinatorChromium.h:
(WebCore):
(ScrollingCoordinatorChromium):
* page/scrolling/mac/ScrollingCoordinatorMac.h:
(ScrollingCoordinatorMac):
* page/scrolling/mac/ScrollingCoordinatorMac.mm:
(WebCore::ScrollingCoordinatorMac::scrollableAreaScrollbarLayerDidChange):
* platform/ScrollableArea.h:
(ScrollableArea):
(WebCore::ScrollableArea::layerForScrolling):
* platform/graphics/GraphicsLayer.h:
(GraphicsLayer):
(WebCore::GraphicsLayer::setContentsToPlatformLayer):
* rendering/RenderLayer.cpp:
(WebCore::RenderLayer::~RenderLayer):
(WebCore::RenderLayer::layerForScrolling):
(WebCore):
* rendering/RenderLayer.h:
(RenderLayer):
* rendering/RenderLayerBacking.cpp:
(WebCore::RenderLayerBacking::updateOverflowControlsLayers):
(WebCore::RenderLayerBacking::positionOverflowControlsLayers):
(WebCore::RenderLayerBacking::updateScrollingLayers):
* rendering/RenderLayerCompositor.cpp:
(WebCore::RenderLayerCompositor::frameViewDidScroll):
(WebCore::RenderLayerCompositor::scrollingLayerDidChange):
(WebCore::RenderLayerCompositor::updateOverflowControlsLayers):
Source/WebKit/chromium:
Added ScrollingCoordinatorChromiumTest.iframeScrolling to verify
impl-side scrolling and impl-side scrollbars for frames.
Update ScrollingCoordinatorChromiumTest.overflowScrolling to verify
impl-side scrollbars.
* tests/ScrollingCoordinatorChromiumTest.cpp:
(WebKit::ScrollingCoordinatorChromiumTest::ScrollingCoordinatorChromiumTest):
(WebKit::TEST_F):
(WebKit):
* tests/data/iframe-scrolling-inner.html: Added.
* tests/data/iframe-scrolling.html: Added.
LayoutTests:
Coordinated scrollbars changes drawsContent flag on scrollbar GraphicsLayers,
test expectation are updated.
* platform/chromium-linux/compositing/iframes/become-overlapped-iframe-expected.txt: Added.
* platform/chromium-linux/compositing/iframes/composited-parent-iframe-expected.txt: Added.
* platform/chromium-linux/compositing/iframes/connect-compositing-iframe-delayed-expected.txt: Added.
* platform/chromium-linux/compositing/iframes/connect-compositing-iframe-expected.txt: Added.
* platform/chromium-linux/compositing/iframes/connect-compositing-iframe2-expected.txt: Added.
* platform/chromium-linux/compositing/iframes/connect-compositing-iframe3-expected.txt: Added.
* platform/chromium-linux/compositing/iframes/enter-compositing-iframe-expected.txt: Added.
* platform/chromium-linux/compositing/iframes/iframe-resize-expected.txt: Added.
* platform/chromium-linux/compositing/iframes/iframe-size-from-zero-expected.txt: Added.
* platform/chromium-linux/compositing/iframes/invisible-nested-iframe-show-expected.txt: Added.
* platform/chromium-linux/compositing/iframes/overlapped-iframe-expected.txt: Added.
* platform/chromium-linux/compositing/iframes/resizer-expected.txt: Added.
* platform/chromium-linux/compositing/iframes/scrolling-iframe-expected.txt: Added.
* platform/chromium-linux/compositing/overflow/composited-scrolling-creates-a-stacking-container-expected.txt: Copied from LayoutTests/platform/chromium-linux/compositing/overflow/scrolling-without-painting-expected.txt.
* platform/chromium-linux/compositing/overflow/scrolling-content-clip-to-viewport-expected.txt: Copied from LayoutTests/platform/chromium-linux/compositing/overflow/scrolling-without-painting-expected.txt.
* platform/chromium-linux/compositing/overflow/scrolling-without-painting-expected.txt:
* platform/chromium-linux/compositing/overflow/textarea-scroll-touch-expected.txt: Added.
* platform/chromium-linux/compositing/overflow/updating-scrolling-content-expected.txt:
* platform/chromium-linux/compositing/rtl/rtl-iframe-absolute-overflow-expected.txt: Added.
* platform/chromium-linux/compositing/rtl/rtl-iframe-absolute-overflow-scrolled-expected.txt: Added.
* platform/chromium-linux/compositing/rtl/rtl-iframe-fixed-overflow-expected.txt: Added.
* platform/chromium-linux/compositing/rtl/rtl-iframe-fixed-overflow-scrolled-expected.txt: Added.
* platform/chromium-linux/platform/chromium/compositing/force-compositing-mode/overflow-iframe-enter-compositing-expected.txt: Added.
* platform/chromium-linux/platform/chromium/virtual/gpu/compositedscrolling/overflow/composited-scrolling-creates-a-stacking-container-expected.txt: Copied from LayoutTests/platform/chromium-linux/compositing/overflow/scrolling-without-painting-expected.txt.
* platform/chromium-linux/platform/chromium/virtual/gpu/compositedscrolling/overflow/overflow-auto-with-touch-expected.txt: Copied from LayoutTests/platform/chromium-linux/compositing/overflow/scrolling-without-painting-expected.txt.
* platform/chromium-linux/platform/chromium/virtual/gpu/compositedscrolling/overflow/overflow-auto-with-touch-toggle-expected.txt: Copied from LayoutTests/platform/chromium-linux/compositing/overflow/scrolling-without-painting-expected.txt.
* platform/chromium-linux/platform/chromium/virtual/gpu/compositedscrolling/overflow/overflow-overlay-with-touch-expected.txt: Copied from LayoutTests/platform/chromium-linux/compositing/overflow/scrolling-without-painting-expected.txt.
* platform/chromium-linux/platform/chromium/virtual/gpu/compositedscrolling/overflow/scrolling-content-clip-to-viewport-expected.txt: Copied from LayoutTests/platform/chromium-linux/compositing/overflow/scrolling-without-painting-expected.txt.
* platform/chromium-linux/platform/chromium/virtual/gpu/compositedscrolling/overflow/scrolling-without-painting-expected.txt:
* platform/chromium-linux/platform/chromium/virtual/gpu/compositedscrolling/overflow/textarea-scroll-touch-expected.txt: Added.
* platform/chromium-linux/platform/chromium/virtual/gpu/compositedscrolling/overflow/updating-scrolling-content-expected.txt:
* platform/chromium-linux/platform/chromium/virtual/softwarecompositing/iframes/become-overlapped-iframe-expected.txt: Added.
* platform/chromium-linux/platform/chromium/virtual/softwarecompositing/iframes/composited-parent-iframe-expected.txt: Added.
* platform/chromium-linux/platform/chromium/virtual/softwarecompositing/iframes/connect-compositing-iframe-delayed-expected.txt: Added.
* platform/chromium-linux/platform/chromium/virtual/softwarecompositing/iframes/connect-compositing-iframe-expected.txt: Added.
* platform/chromium-linux/platform/chromium/virtual/softwarecompositing/iframes/connect-compositing-iframe2-expected.txt: Added.
* platform/chromium-linux/platform/chromium/virtual/softwarecompositing/iframes/connect-compositing-iframe3-expected.txt: Added.
* platform/chromium-linux/platform/chromium/virtual/softwarecompositing/iframes/enter-compositing-iframe-expected.txt: Added.
* platform/chromium-linux/platform/chromium/virtual/softwarecompositing/iframes/iframe-resize-expected.txt: Added.
* platform/chromium-linux/platform/chromium/virtual/softwarecompositing/iframes/iframe-size-from-zero-expected.txt: Added.
* platform/chromium-linux/platform/chromium/virtual/softwarecompositing/iframes/invisible-nested-iframe-show-expected.txt: Added.
* platform/chromium-linux/platform/chromium/virtual/softwarecompositing/iframes/overlapped-iframe-expected.txt: Added.
* platform/chromium-linux/platform/chromium/virtual/softwarecompositing/iframes/resizer-expected.txt: Added.
* platform/chromium-linux/platform/chromium/virtual/softwarecompositing/iframes/scrolling-iframe-expected.txt: Added.
* platform/chromium-linux/platform/chromium/virtual/softwarecompositing/overflow/composited-scrolling-creates-a-stacking-container-expected.txt: Copied from LayoutTests/platform/chromium-linux/compositing/overflow/scrolling-without-painting-expected.txt.
* platform/chromium-linux/platform/chromium/virtual/softwarecompositing/overflow/scrolling-content-clip-to-viewport-expected.txt: Copied from LayoutTests/platform/chromium-linux/compositing/overflow/scrolling-without-painting-expected.txt.
* platform/chromium-linux/platform/chromium/virtual/softwarecompositing/overflow/scrolling-without-painting-expected.txt:
* platform/chromium-linux/platform/chromium/virtual/softwarecompositing/overflow/textarea-scroll-touch-expected.txt: Added.
* platform/chromium-linux/platform/chromium/virtual/softwarecompositing/overflow/updating-scrolling-content-expected.txt:
* platform/chromium-linux/platform/chromium/virtual/softwarecompositing/rtl/rtl-iframe-absolute-overflow-expected.txt: Added.
* platform/chromium-linux/platform/chromium/virtual/softwarecompositing/rtl/rtl-iframe-absolute-overflow-scrolled-expected.txt: Added.
* platform/chromium-linux/platform/chromium/virtual/softwarecompositing/rtl/rtl-iframe-fixed-overflow-expected.txt: Added.
* platform/chromium-linux/platform/chromium/virtual/softwarecompositing/rtl/rtl-iframe-fixed-overflow-scrolled-expected.txt: Added.
* platform/chromium/TestExpectations:
git-svn-id: https://svn.webkit.org/repository/webkit/trunk@144024
268f45cc-cd09-0410-ab3c-
d52691b4dbfc
+2013-02-26 Tien-Ren Chen <trchen@chromium.org>
+
+ Implement coordinated scrollbar for subframes and overflow:scroll
+ https://bugs.webkit.org/show_bug.cgi?id=109560
+
+ Reviewed by James Robinson.
+
+ Coordinated scrollbars changes drawsContent flag on scrollbar GraphicsLayers,
+ test expectation are updated.
+
+ * platform/chromium-linux/compositing/iframes/become-overlapped-iframe-expected.txt: Added.
+ * platform/chromium-linux/compositing/iframes/composited-parent-iframe-expected.txt: Added.
+ * platform/chromium-linux/compositing/iframes/connect-compositing-iframe-delayed-expected.txt: Added.
+ * platform/chromium-linux/compositing/iframes/connect-compositing-iframe-expected.txt: Added.
+ * platform/chromium-linux/compositing/iframes/connect-compositing-iframe2-expected.txt: Added.
+ * platform/chromium-linux/compositing/iframes/connect-compositing-iframe3-expected.txt: Added.
+ * platform/chromium-linux/compositing/iframes/enter-compositing-iframe-expected.txt: Added.
+ * platform/chromium-linux/compositing/iframes/iframe-resize-expected.txt: Added.
+ * platform/chromium-linux/compositing/iframes/iframe-size-from-zero-expected.txt: Added.
+ * platform/chromium-linux/compositing/iframes/invisible-nested-iframe-show-expected.txt: Added.
+ * platform/chromium-linux/compositing/iframes/overlapped-iframe-expected.txt: Added.
+ * platform/chromium-linux/compositing/iframes/resizer-expected.txt: Added.
+ * platform/chromium-linux/compositing/iframes/scrolling-iframe-expected.txt: Added.
+ * platform/chromium-linux/compositing/overflow/composited-scrolling-creates-a-stacking-container-expected.txt: Copied from LayoutTests/platform/chromium-linux/compositing/overflow/scrolling-without-painting-expected.txt.
+ * platform/chromium-linux/compositing/overflow/scrolling-content-clip-to-viewport-expected.txt: Copied from LayoutTests/platform/chromium-linux/compositing/overflow/scrolling-without-painting-expected.txt.
+ * platform/chromium-linux/compositing/overflow/scrolling-without-painting-expected.txt:
+ * platform/chromium-linux/compositing/overflow/textarea-scroll-touch-expected.txt: Added.
+ * platform/chromium-linux/compositing/overflow/updating-scrolling-content-expected.txt:
+ * platform/chromium-linux/compositing/rtl/rtl-iframe-absolute-overflow-expected.txt: Added.
+ * platform/chromium-linux/compositing/rtl/rtl-iframe-absolute-overflow-scrolled-expected.txt: Added.
+ * platform/chromium-linux/compositing/rtl/rtl-iframe-fixed-overflow-expected.txt: Added.
+ * platform/chromium-linux/compositing/rtl/rtl-iframe-fixed-overflow-scrolled-expected.txt: Added.
+ * platform/chromium-linux/platform/chromium/compositing/force-compositing-mode/overflow-iframe-enter-compositing-expected.txt: Added.
+ * platform/chromium-linux/platform/chromium/virtual/gpu/compositedscrolling/overflow/composited-scrolling-creates-a-stacking-container-expected.txt: Copied from LayoutTests/platform/chromium-linux/compositing/overflow/scrolling-without-painting-expected.txt.
+ * platform/chromium-linux/platform/chromium/virtual/gpu/compositedscrolling/overflow/overflow-auto-with-touch-expected.txt: Copied from LayoutTests/platform/chromium-linux/compositing/overflow/scrolling-without-painting-expected.txt.
+ * platform/chromium-linux/platform/chromium/virtual/gpu/compositedscrolling/overflow/overflow-auto-with-touch-toggle-expected.txt: Copied from LayoutTests/platform/chromium-linux/compositing/overflow/scrolling-without-painting-expected.txt.
+ * platform/chromium-linux/platform/chromium/virtual/gpu/compositedscrolling/overflow/overflow-overlay-with-touch-expected.txt: Copied from LayoutTests/platform/chromium-linux/compositing/overflow/scrolling-without-painting-expected.txt.
+ * platform/chromium-linux/platform/chromium/virtual/gpu/compositedscrolling/overflow/scrolling-content-clip-to-viewport-expected.txt: Copied from LayoutTests/platform/chromium-linux/compositing/overflow/scrolling-without-painting-expected.txt.
+ * platform/chromium-linux/platform/chromium/virtual/gpu/compositedscrolling/overflow/scrolling-without-painting-expected.txt:
+ * platform/chromium-linux/platform/chromium/virtual/gpu/compositedscrolling/overflow/textarea-scroll-touch-expected.txt: Added.
+ * platform/chromium-linux/platform/chromium/virtual/gpu/compositedscrolling/overflow/updating-scrolling-content-expected.txt:
+ * platform/chromium-linux/platform/chromium/virtual/softwarecompositing/iframes/become-overlapped-iframe-expected.txt: Added.
+ * platform/chromium-linux/platform/chromium/virtual/softwarecompositing/iframes/composited-parent-iframe-expected.txt: Added.
+ * platform/chromium-linux/platform/chromium/virtual/softwarecompositing/iframes/connect-compositing-iframe-delayed-expected.txt: Added.
+ * platform/chromium-linux/platform/chromium/virtual/softwarecompositing/iframes/connect-compositing-iframe-expected.txt: Added.
+ * platform/chromium-linux/platform/chromium/virtual/softwarecompositing/iframes/connect-compositing-iframe2-expected.txt: Added.
+ * platform/chromium-linux/platform/chromium/virtual/softwarecompositing/iframes/connect-compositing-iframe3-expected.txt: Added.
+ * platform/chromium-linux/platform/chromium/virtual/softwarecompositing/iframes/enter-compositing-iframe-expected.txt: Added.
+ * platform/chromium-linux/platform/chromium/virtual/softwarecompositing/iframes/iframe-resize-expected.txt: Added.
+ * platform/chromium-linux/platform/chromium/virtual/softwarecompositing/iframes/iframe-size-from-zero-expected.txt: Added.
+ * platform/chromium-linux/platform/chromium/virtual/softwarecompositing/iframes/invisible-nested-iframe-show-expected.txt: Added.
+ * platform/chromium-linux/platform/chromium/virtual/softwarecompositing/iframes/overlapped-iframe-expected.txt: Added.
+ * platform/chromium-linux/platform/chromium/virtual/softwarecompositing/iframes/resizer-expected.txt: Added.
+ * platform/chromium-linux/platform/chromium/virtual/softwarecompositing/iframes/scrolling-iframe-expected.txt: Added.
+ * platform/chromium-linux/platform/chromium/virtual/softwarecompositing/overflow/composited-scrolling-creates-a-stacking-container-expected.txt: Copied from LayoutTests/platform/chromium-linux/compositing/overflow/scrolling-without-painting-expected.txt.
+ * platform/chromium-linux/platform/chromium/virtual/softwarecompositing/overflow/scrolling-content-clip-to-viewport-expected.txt: Copied from LayoutTests/platform/chromium-linux/compositing/overflow/scrolling-without-painting-expected.txt.
+ * platform/chromium-linux/platform/chromium/virtual/softwarecompositing/overflow/scrolling-without-painting-expected.txt:
+ * platform/chromium-linux/platform/chromium/virtual/softwarecompositing/overflow/textarea-scroll-touch-expected.txt: Added.
+ * platform/chromium-linux/platform/chromium/virtual/softwarecompositing/overflow/updating-scrolling-content-expected.txt:
+ * platform/chromium-linux/platform/chromium/virtual/softwarecompositing/rtl/rtl-iframe-absolute-overflow-expected.txt: Added.
+ * platform/chromium-linux/platform/chromium/virtual/softwarecompositing/rtl/rtl-iframe-absolute-overflow-scrolled-expected.txt: Added.
+ * platform/chromium-linux/platform/chromium/virtual/softwarecompositing/rtl/rtl-iframe-fixed-overflow-expected.txt: Added.
+ * platform/chromium-linux/platform/chromium/virtual/softwarecompositing/rtl/rtl-iframe-fixed-overflow-scrolled-expected.txt: Added.
+ * platform/chromium/TestExpectations:
+
2013-02-26 Glenn Adams <glenn@skynav.com>
CSS3: line-break property support
--- /dev/null
+
+(GraphicsLayer
+ (bounds 800.00 600.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 800.00 600.00)
+ (contentsOpaque 1)
+ (children 2
+ (GraphicsLayer
+ (position 58.00 58.00)
+ (bounds 350.00 200.00)
+ (drawsContent 1)
+ (children 1
+ (GraphicsLayer
+ (position 15.00 15.00)
+ (children 2
+ (GraphicsLayer
+ (bounds 305.00 170.00)
+ (children 1
+ (GraphicsLayer
+ (children 1
+ (GraphicsLayer
+ (bounds 305.00 230.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 305.00 230.00)
+ (drawsContent 1)
+ (children 1
+ (GraphicsLayer
+ (position 18.00 10.00)
+ (bounds 210.00 210.00)
+ (contentsOpaque 1)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ (GraphicsLayer
+ (position 305.00 0.00)
+ (bounds 15.00 170.00)
+ )
+ )
+ )
+ )
+ )
+ (GraphicsLayer
+ (position 5.00 5.00)
+ (bounds 150.00 150.00)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+)
+
--- /dev/null
+
+(GraphicsLayer
+ (bounds 800.00 600.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 800.00 600.00)
+ (contentsOpaque 1)
+ (children 1
+ (GraphicsLayer
+ (position -12.00 -12.00)
+ (bounds 370.00 220.00)
+ (drawsContent 1)
+ (children 1
+ (GraphicsLayer
+ (position 35.00 35.00)
+ (children 2
+ (GraphicsLayer
+ (bounds 285.00 150.00)
+ (children 1
+ (GraphicsLayer
+ (children 1
+ (GraphicsLayer
+ (bounds 285.00 230.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 285.00 230.00)
+ (drawsContent 1)
+ (children 1
+ (GraphicsLayer
+ (position 18.00 10.00)
+ (bounds 210.00 210.00)
+ (contentsOpaque 1)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ (GraphicsLayer
+ (position 285.00 0.00)
+ (bounds 15.00 150.00)
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+)
+
--- /dev/null
+
+When the parent document becomes composited, the layer trees should get connected together.
+
+(GraphicsLayer
+ (bounds 800.00 600.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 800.00 600.00)
+ (contentsOpaque 1)
+ (children 2
+ (GraphicsLayer
+ (position 8.00 108.00)
+ (bounds 370.00 220.00)
+ (drawsContent 1)
+ (children 1
+ (GraphicsLayer
+ (position 35.00 35.00)
+ (children 2
+ (GraphicsLayer
+ (bounds 285.00 150.00)
+ (children 1
+ (GraphicsLayer
+ (children 1
+ (GraphicsLayer
+ (bounds 285.00 230.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 285.00 230.00)
+ (drawsContent 1)
+ (children 1
+ (GraphicsLayer
+ (position 18.00 10.00)
+ (bounds 210.00 210.00)
+ (contentsOpaque 1)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ (GraphicsLayer
+ (position 285.00 0.00)
+ (bounds 15.00 150.00)
+ )
+ )
+ )
+ )
+ )
+ (GraphicsLayer
+ (position 8.00 8.00)
+ (bounds 100.00 100.00)
+ (contentsOpaque 1)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+)
+
--- /dev/null
+
+(GraphicsLayer
+ (bounds 800.00 600.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 800.00 600.00)
+ (contentsOpaque 1)
+ (children 2
+ (GraphicsLayer
+ (position 8.00 8.00)
+ (bounds 370.00 220.00)
+ (drawsContent 1)
+ (children 1
+ (GraphicsLayer
+ (position 35.00 35.00)
+ (children 2
+ (GraphicsLayer
+ (bounds 285.00 150.00)
+ (children 1
+ (GraphicsLayer
+ (children 1
+ (GraphicsLayer
+ (bounds 285.00 230.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 285.00 230.00)
+ (drawsContent 1)
+ (children 1
+ (GraphicsLayer
+ (position 18.00 10.00)
+ (bounds 210.00 210.00)
+ (contentsOpaque 1)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ (GraphicsLayer
+ (position 285.00 0.00)
+ (bounds 15.00 150.00)
+ )
+ )
+ )
+ )
+ )
+ (GraphicsLayer
+ (position 5.00 5.00)
+ (bounds 50.00 50.00)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+)
+
--- /dev/null
+
+(GraphicsLayer
+ (bounds 800.00 600.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 800.00 600.00)
+ (contentsOpaque 1)
+ (children 2
+ (GraphicsLayer
+ (position 8.00 8.00)
+ (bounds 370.00 220.00)
+ (drawsContent 1)
+ (children 1
+ (GraphicsLayer
+ (position 35.00 35.00)
+ (children 2
+ (GraphicsLayer
+ (bounds 285.00 150.00)
+ (children 1
+ (GraphicsLayer
+ (children 1
+ (GraphicsLayer
+ (bounds 285.00 230.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 285.00 230.00)
+ (drawsContent 1)
+ (children 1
+ (GraphicsLayer
+ (position 18.00 10.00)
+ (bounds 210.00 210.00)
+ (contentsOpaque 1)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ (GraphicsLayer
+ (position 285.00 0.00)
+ (bounds 15.00 150.00)
+ )
+ )
+ )
+ )
+ )
+ (GraphicsLayer
+ (position 5.00 5.00)
+ (bounds 50.00 50.00)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+)
+
--- /dev/null
+
+(GraphicsLayer
+ (bounds 800.00 600.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 800.00 600.00)
+ (contentsOpaque 1)
+ (children 1
+ (GraphicsLayer
+ (position 8.00 8.00)
+ (bounds 370.00 220.00)
+ (drawsContent 1)
+ (children 1
+ (GraphicsLayer
+ (position 35.00 35.00)
+ (children 2
+ (GraphicsLayer
+ (bounds 285.00 150.00)
+ (children 1
+ (GraphicsLayer
+ (children 1
+ (GraphicsLayer
+ (bounds 285.00 230.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 285.00 230.00)
+ (drawsContent 1)
+ (children 1
+ (GraphicsLayer
+ (position 18.00 10.00)
+ (bounds 210.00 210.00)
+ (contentsOpaque 1)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ (GraphicsLayer
+ (position 285.00 0.00)
+ (bounds 15.00 150.00)
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+)
+
--- /dev/null
+
+(GraphicsLayer
+ (bounds 800.00 600.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 800.00 600.00)
+ (contentsOpaque 1)
+ (children 2
+ (GraphicsLayer
+ (position 8.00 8.00)
+ (bounds 370.00 220.00)
+ (drawsContent 1)
+ (children 1
+ (GraphicsLayer
+ (position 35.00 35.00)
+ (children 2
+ (GraphicsLayer
+ (bounds 285.00 150.00)
+ (children 1
+ (GraphicsLayer
+ (children 1
+ (GraphicsLayer
+ (bounds 285.00 230.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 285.00 230.00)
+ (drawsContent 1)
+ (children 1
+ (GraphicsLayer
+ (position 18.00 10.00)
+ (bounds 210.00 210.00)
+ (contentsOpaque 1)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ (GraphicsLayer
+ (position 285.00 0.00)
+ (bounds 15.00 150.00)
+ )
+ )
+ )
+ )
+ )
+ (GraphicsLayer
+ (position 5.00 5.00)
+ (bounds 50.00 50.00)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+)
+
--- /dev/null
+
+(GraphicsLayer
+ (bounds 800.00 600.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 800.00 600.00)
+ (contentsOpaque 1)
+ (children 2
+ (GraphicsLayer
+ (position 8.00 8.00)
+ (bounds 470.00 190.00)
+ (drawsContent 1)
+ (children 1
+ (GraphicsLayer
+ (position 35.00 35.00)
+ (children 2
+ (GraphicsLayer
+ (bounds 385.00 120.00)
+ (children 1
+ (GraphicsLayer
+ (children 1
+ (GraphicsLayer
+ (bounds 385.00 230.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 385.00 230.00)
+ (drawsContent 1)
+ (children 1
+ (GraphicsLayer
+ (position 18.00 10.00)
+ (bounds 210.00 210.00)
+ (contentsOpaque 1)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ (GraphicsLayer
+ (position 385.00 0.00)
+ (bounds 15.00 120.00)
+ )
+ )
+ )
+ )
+ )
+ (GraphicsLayer
+ (position 5.00 5.00)
+ (bounds 50.00 50.00)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+)
+
--- /dev/null
+
+(GraphicsLayer
+ (bounds 800.00 600.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 800.00 600.00)
+ (contentsOpaque 1)
+ (children 2
+ (GraphicsLayer
+ (position 28.00 28.00)
+ (bounds 330.00 180.00)
+ (drawsContent 1)
+ (children 1
+ (GraphicsLayer
+ (position 15.00 15.00)
+ (children 2
+ (GraphicsLayer
+ (bounds 285.00 150.00)
+ (children 1
+ (GraphicsLayer
+ (children 1
+ (GraphicsLayer
+ (bounds 285.00 230.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 285.00 230.00)
+ (drawsContent 1)
+ (children 1
+ (GraphicsLayer
+ (position 18.00 10.00)
+ (bounds 210.00 210.00)
+ (contentsOpaque 1)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ (GraphicsLayer
+ (position 285.00 0.00)
+ (bounds 15.00 150.00)
+ )
+ )
+ )
+ )
+ )
+ (GraphicsLayer
+ (position 5.00 5.00)
+ (bounds 50.00 50.00)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+)
+
--- /dev/null
+
+(GraphicsLayer
+ (bounds 800.00 600.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 800.00 600.00)
+ (contentsOpaque 1)
+ (children 2
+ (GraphicsLayer
+ (bounds 358.00 208.00)
+ (drawsContent 1)
+ (children 1
+ (GraphicsLayer
+ (position 23.00 23.00)
+ (children 2
+ (GraphicsLayer
+ (bounds 285.00 150.00)
+ (children 1
+ (GraphicsLayer
+ (children 1
+ (GraphicsLayer
+ (bounds 285.00 193.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 285.00 193.00)
+ (drawsContent 1)
+ (children 1
+ (GraphicsLayer
+ (position 8.00 8.00)
+ (bounds 252.00 172.00)
+ (drawsContent 1)
+ (children 1
+ (GraphicsLayer
+ (position 1.00 1.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 250.00 170.00)
+ (children 1
+ (GraphicsLayer
+ (children 1
+ (GraphicsLayer
+ (bounds 250.00 230.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 250.00 230.00)
+ (drawsContent 1)
+ (children 1
+ (GraphicsLayer
+ (position 18.00 10.00)
+ (bounds 210.00 210.00)
+ (contentsOpaque 1)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ (GraphicsLayer
+ (position 285.00 0.00)
+ (bounds 15.00 150.00)
+ )
+ )
+ )
+ )
+ )
+ (GraphicsLayer
+ (position 18.00 203.00)
+ (bounds 210.00 210.00)
+ (contentsOpaque 1)
+ (drawsContent 1)
+ (transform [1.00 0.00 0.00 0.00] [0.00 1.00 0.00 0.00] [0.00 0.00 1.00 0.00] [0.00 0.00 1.00 1.00])
+ )
+ )
+ )
+ )
+)
+
--- /dev/null
+
+(GraphicsLayer
+ (bounds 800.00 600.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 800.00 600.00)
+ (contentsOpaque 1)
+ (children 2
+ (GraphicsLayer
+ (position 8.00 8.00)
+ (bounds 370.00 220.00)
+ (drawsContent 1)
+ (children 1
+ (GraphicsLayer
+ (position 35.00 35.00)
+ (children 2
+ (GraphicsLayer
+ (bounds 285.00 150.00)
+ (children 1
+ (GraphicsLayer
+ (children 1
+ (GraphicsLayer
+ (bounds 285.00 230.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 285.00 230.00)
+ (drawsContent 1)
+ (children 1
+ (GraphicsLayer
+ (position 18.00 10.00)
+ (bounds 210.00 210.00)
+ (contentsOpaque 1)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ (GraphicsLayer
+ (position 285.00 0.00)
+ (bounds 15.00 150.00)
+ )
+ )
+ )
+ )
+ )
+ (GraphicsLayer
+ (position 5.00 5.00)
+ (bounds 50.00 50.00)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+)
+
--- /dev/null
+
+(GraphicsLayer
+ (bounds 800.00 600.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 800.00 600.00)
+ (contentsOpaque 1)
+ (children 1
+ (GraphicsLayer
+ (position 8.00 8.00)
+ (bounds 304.00 154.00)
+ (drawsContent 1)
+ (children 2
+ (GraphicsLayer
+ (position 2.00 2.00)
+ (children 2
+ (GraphicsLayer
+ (bounds 285.00 150.00)
+ (children 1
+ (GraphicsLayer
+ (children 1
+ (GraphicsLayer
+ (bounds 285.00 230.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 285.00 230.00)
+ (drawsContent 1)
+ (children 1
+ (GraphicsLayer
+ (position 18.00 10.00)
+ (bounds 210.00 210.00)
+ (contentsOpaque 1)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ (GraphicsLayer
+ (position 285.00 0.00)
+ (bounds 15.00 150.00)
+ )
+ )
+ )
+ (GraphicsLayer
+ (position 287.00 137.00)
+ (bounds 15.00 15.00)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+ )
+ )
+)
+
--- /dev/null
+
+(GraphicsLayer
+ (bounds 800.00 600.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 800.00 600.00)
+ (contentsOpaque 1)
+ (children 2
+ (GraphicsLayer
+ (position 8.00 8.00)
+ (bounds 370.00 220.00)
+ (drawsContent 1)
+ (children 1
+ (GraphicsLayer
+ (position 35.00 35.00)
+ (children 4
+ (GraphicsLayer
+ (bounds 285.00 135.00)
+ (children 1
+ (GraphicsLayer
+ (position -80.00 -80.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 508.00 608.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 508.00 608.00)
+ (drawsContent 1)
+ (children 1
+ (GraphicsLayer
+ (position 108.00 100.00)
+ (bounds 200.00 200.00)
+ (contentsOpaque 1)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ (GraphicsLayer
+ (position 285.00 0.00)
+ (bounds 15.00 135.00)
+ )
+ (GraphicsLayer
+ (position 0.00 135.00)
+ (bounds 285.00 15.00)
+ )
+ (GraphicsLayer
+ (position 285.00 135.00)
+ (bounds 15.00 15.00)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+ )
+ (GraphicsLayer
+ (position 5.00 5.00)
+ (bounds 50.00 50.00)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+)
+
--- /dev/null
+(GraphicsLayer
+ (bounds 800.00 600.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 800.00 600.00)
+ (contentsOpaque 1)
+ (children 1
+ (GraphicsLayer
+ (position 28.00 20.00)
+ (bounds 202.00 202.00)
+ (drawsContent 1)
+ (children 4
+ (GraphicsLayer
+ (position 1.00 1.00)
+ (bounds 200.00 200.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 200.00 300.00)
+ (drawsContent 1)
+ (children 2
+ (GraphicsLayer
+ (bounds 202.00 202.00)
+ (drawsContent 1)
+ )
+ (GraphicsLayer
+ (bounds 200.00 150.00)
+ (contentsOpaque 1)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+ )
+ (GraphicsLayer
+ (position 1.00 186.00)
+ (bounds 185.00 15.00)
+ )
+ (GraphicsLayer
+ (position 186.00 1.00)
+ (bounds 15.00 185.00)
+ )
+ (GraphicsLayer
+ (position 186.00 186.00)
+ (bounds 15.00 15.00)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+ )
+ )
+)
+
+
--- /dev/null
+(GraphicsLayer
+ (bounds 800.00 600.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 800.00 600.00)
+ (contentsOpaque 1)
+ (children 1
+ (GraphicsLayer
+ (bounds 320.00 340.00)
+ (children 4
+ (GraphicsLayer
+ (bounds 320.00 340.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 305.00 1224.00)
+ (drawsContent 1)
+ )
+ )
+ )
+ (GraphicsLayer
+ (position 0.00 325.00)
+ (bounds 305.00 15.00)
+ )
+ (GraphicsLayer
+ (position 305.00 0.00)
+ (bounds 15.00 325.00)
+ )
+ (GraphicsLayer
+ (position 305.00 325.00)
+ (bounds 15.00 15.00)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+ )
+ )
+)
+
(GraphicsLayer
(position 1.00 186.00)
(bounds 185.00 15.00)
- (drawsContent 1)
)
(GraphicsLayer
(position 186.00 1.00)
(bounds 15.00 185.00)
- (drawsContent 1)
(repaint rects
(rect 0.00 0.00 15.00 185.00)
)
--- /dev/null
+
+(GraphicsLayer
+ (bounds 800.00 600.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 800.00 600.00)
+ (contentsOpaque 1)
+ (children 2
+ (GraphicsLayer
+ (position 18.00 18.00)
+ (bounds 206.00 126.00)
+ (contentsOpaque 1)
+ (drawsContent 1)
+ (children 3
+ (GraphicsLayer
+ (position 1.00 1.00)
+ (bounds 204.00 124.00)
+ (children 1
+ (GraphicsLayer
+ (position 0.00 -50.00)
+ (bounds 189.00 328.00)
+ (drawsContent 1)
+ )
+ )
+ )
+ (GraphicsLayer
+ (position 190.00 1.00)
+ (bounds 15.00 109.00)
+ )
+ (GraphicsLayer
+ (position 190.00 110.00)
+ (bounds 15.00 15.00)
+ (drawsContent 1)
+ )
+ )
+ )
+ (GraphicsLayer
+ (position 248.00 18.00)
+ (bounds 206.00 126.00)
+ (contentsOpaque 1)
+ (drawsContent 1)
+ (children 3
+ (GraphicsLayer
+ (position 1.00 1.00)
+ (bounds 204.00 124.00)
+ (children 1
+ (GraphicsLayer
+ (position 0.00 -50.00)
+ (bounds 189.00 328.00)
+ (drawsContent 1)
+ )
+ )
+ )
+ (GraphicsLayer
+ (position 190.00 1.00)
+ (bounds 15.00 109.00)
+ )
+ (GraphicsLayer
+ (position 190.00 110.00)
+ (bounds 15.00 15.00)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+ )
+ )
+)
+
(GraphicsLayer
(position 0.00 185.00)
(bounds 185.00 15.00)
- (drawsContent 1)
)
(GraphicsLayer
(position 185.00 0.00)
(bounds 15.00 185.00)
- (drawsContent 1)
(repaint rects
(rect 0.00 0.00 15.00 185.00)
)
--- /dev/null
+(GraphicsLayer
+ (bounds 800.00 600.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 800.00 600.00)
+ (contentsOpaque 1)
+ (children 1
+ (GraphicsLayer
+ (bounds 400.00 400.00)
+ (drawsContent 1)
+ (children 1
+ (GraphicsLayer
+ (children 4
+ (GraphicsLayer
+ (bounds 385.00 385.00)
+ (children 1
+ (GraphicsLayer
+ (children 1
+ (GraphicsLayer
+ (position -615.00 0.00)
+ (bounds 1000.00 1000.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 1000.00 1000.00)
+ (drawsContent 1)
+ (children 1
+ (GraphicsLayer
+ (position 665.00 50.00)
+ (bounds 100.00 100.00)
+ (contentsOpaque 1)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ (GraphicsLayer
+ (position 385.00 0.00)
+ (bounds 15.00 385.00)
+ )
+ (GraphicsLayer
+ (position 0.00 385.00)
+ (bounds 385.00 15.00)
+ )
+ (GraphicsLayer
+ (position 385.00 385.00)
+ (bounds 15.00 15.00)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+)
+
--- /dev/null
+(GraphicsLayer
+ (bounds 800.00 600.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 800.00 600.00)
+ (contentsOpaque 1)
+ (children 1
+ (GraphicsLayer
+ (bounds 400.00 400.00)
+ (drawsContent 1)
+ (children 1
+ (GraphicsLayer
+ (children 4
+ (GraphicsLayer
+ (bounds 385.00 385.00)
+ (children 1
+ (GraphicsLayer
+ (children 1
+ (GraphicsLayer
+ (position -615.00 0.00)
+ (bounds 1000.00 1000.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 1000.00 1000.00)
+ (drawsContent 1)
+ (children 1
+ (GraphicsLayer
+ (position 51.00 50.00)
+ (bounds 100.00 100.00)
+ (contentsOpaque 1)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ (GraphicsLayer
+ (position 385.00 0.00)
+ (bounds 15.00 385.00)
+ )
+ (GraphicsLayer
+ (position 0.00 385.00)
+ (bounds 385.00 15.00)
+ )
+ (GraphicsLayer
+ (position 385.00 385.00)
+ (bounds 15.00 15.00)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+)
+
--- /dev/null
+(GraphicsLayer
+ (bounds 800.00 600.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 800.00 600.00)
+ (contentsOpaque 1)
+ (children 1
+ (GraphicsLayer
+ (bounds 400.00 400.00)
+ (drawsContent 1)
+ (children 1
+ (GraphicsLayer
+ (children 4
+ (GraphicsLayer
+ (bounds 385.00 385.00)
+ (children 1
+ (GraphicsLayer
+ (children 1
+ (GraphicsLayer
+ (position -615.00 0.00)
+ (bounds 1000.00 1000.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 1000.00 1000.00)
+ (drawsContent 1)
+ (children 1
+ (GraphicsLayer
+ (position 665.00 50.00)
+ (bounds 100.00 100.00)
+ (contentsOpaque 1)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ (GraphicsLayer
+ (position 385.00 0.00)
+ (bounds 15.00 385.00)
+ )
+ (GraphicsLayer
+ (position 0.00 385.00)
+ (bounds 385.00 15.00)
+ )
+ (GraphicsLayer
+ (position 385.00 385.00)
+ (bounds 15.00 15.00)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+)
+
--- /dev/null
+(GraphicsLayer
+ (bounds 800.00 600.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 800.00 600.00)
+ (contentsOpaque 1)
+ (children 1
+ (GraphicsLayer
+ (bounds 400.00 400.00)
+ (drawsContent 1)
+ (children 1
+ (GraphicsLayer
+ (children 4
+ (GraphicsLayer
+ (bounds 385.00 385.00)
+ (children 1
+ (GraphicsLayer
+ (children 1
+ (GraphicsLayer
+ (position -615.00 0.00)
+ (bounds 1000.00 1000.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 1000.00 1000.00)
+ (drawsContent 1)
+ (children 1
+ (GraphicsLayer
+ (position 665.00 50.00)
+ (bounds 100.00 100.00)
+ (contentsOpaque 1)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ (GraphicsLayer
+ (position 385.00 0.00)
+ (bounds 15.00 385.00)
+ )
+ (GraphicsLayer
+ (position 0.00 385.00)
+ (bounds 385.00 15.00)
+ )
+ (GraphicsLayer
+ (position 385.00 385.00)
+ (bounds 15.00 15.00)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+)
+
--- /dev/null
+
+(GraphicsLayer
+ (bounds 800.00 600.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 800.00 600.00)
+ (contentsOpaque 1)
+ (children 1
+ (GraphicsLayer
+ (position 8.00 8.00)
+ (bounds 154.00 154.00)
+ (drawsContent 1)
+ (children 1
+ (GraphicsLayer
+ (position 2.00 2.00)
+ (children 4
+ (GraphicsLayer
+ (bounds 135.00 135.00)
+ (children 1
+ (GraphicsLayer
+ (children 1
+ (GraphicsLayer
+ (bounds 508.00 516.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 508.00 516.00)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ (GraphicsLayer
+ (position 0.00 135.00)
+ (bounds 135.00 15.00)
+ )
+ (GraphicsLayer
+ (position 135.00 0.00)
+ (bounds 15.00 135.00)
+ )
+ (GraphicsLayer
+ (position 135.00 135.00)
+ (bounds 15.00 15.00)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+)
+
--- /dev/null
+(GraphicsLayer
+ (bounds 800.00 600.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 800.00 600.00)
+ (contentsOpaque 1)
+ (children 1
+ (GraphicsLayer
+ (position 28.00 20.00)
+ (bounds 202.00 202.00)
+ (drawsContent 1)
+ (children 4
+ (GraphicsLayer
+ (position 1.00 1.00)
+ (bounds 200.00 200.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 200.00 300.00)
+ (drawsContent 1)
+ (children 2
+ (GraphicsLayer
+ (bounds 202.00 202.00)
+ (drawsContent 1)
+ )
+ (GraphicsLayer
+ (bounds 200.00 150.00)
+ (contentsOpaque 1)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+ )
+ (GraphicsLayer
+ (position 1.00 186.00)
+ (bounds 185.00 15.00)
+ )
+ (GraphicsLayer
+ (position 186.00 1.00)
+ (bounds 15.00 185.00)
+ )
+ (GraphicsLayer
+ (position 186.00 186.00)
+ (bounds 15.00 15.00)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+ )
+ )
+)
+
+
--- /dev/null
+(GraphicsLayer
+ (bounds 800.00 600.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 800.00 600.00)
+ (contentsOpaque 1)
+ (children 1
+ (GraphicsLayer
+ (position 8.00 8.00)
+ (bounds 300.00 300.00)
+ (children 4
+ (GraphicsLayer
+ (bounds 300.00 300.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 1000.00 1000.00)
+ (drawsContent 1)
+ )
+ )
+ )
+ (GraphicsLayer
+ (position 0.00 285.00)
+ (bounds 285.00 15.00)
+ )
+ (GraphicsLayer
+ (position 285.00 0.00)
+ (bounds 15.00 285.00)
+ )
+ (GraphicsLayer
+ (position 285.00 285.00)
+ (bounds 15.00 15.00)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+ )
+ )
+)
+
--- /dev/null
+(GraphicsLayer
+ (bounds 800.00 600.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 800.00 600.00)
+ (contentsOpaque 1)
+ (children 1
+ (GraphicsLayer
+ (position 8.00 8.00)
+ (bounds 300.00 300.00)
+ (children 4
+ (GraphicsLayer
+ (bounds 300.00 300.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 1000.00 1000.00)
+ (drawsContent 1)
+ )
+ )
+ )
+ (GraphicsLayer
+ (position 0.00 285.00)
+ (bounds 285.00 15.00)
+ )
+ (GraphicsLayer
+ (position 285.00 0.00)
+ (bounds 15.00 285.00)
+ )
+ (GraphicsLayer
+ (position 285.00 285.00)
+ (bounds 15.00 15.00)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+ )
+ )
+)
+
--- /dev/null
+(GraphicsLayer
+ (bounds 800.00 600.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 800.00 600.00)
+ (contentsOpaque 1)
+ (children 1
+ (GraphicsLayer
+ (position 8.00 8.00)
+ (bounds 300.00 300.00)
+ (children 4
+ (GraphicsLayer
+ (bounds 300.00 300.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 1000.00 1000.00)
+ (drawsContent 1)
+ )
+ )
+ )
+ (GraphicsLayer
+ (position 0.00 285.00)
+ (bounds 285.00 15.00)
+ )
+ (GraphicsLayer
+ (position 285.00 0.00)
+ (bounds 15.00 285.00)
+ )
+ (GraphicsLayer
+ (position 285.00 285.00)
+ (bounds 15.00 15.00)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+ )
+ )
+)
+
--- /dev/null
+(GraphicsLayer
+ (bounds 800.00 600.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 800.00 600.00)
+ (contentsOpaque 1)
+ (children 1
+ (GraphicsLayer
+ (bounds 320.00 340.00)
+ (children 4
+ (GraphicsLayer
+ (bounds 320.00 340.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 305.00 1224.00)
+ (drawsContent 1)
+ )
+ )
+ )
+ (GraphicsLayer
+ (position 0.00 325.00)
+ (bounds 305.00 15.00)
+ )
+ (GraphicsLayer
+ (position 305.00 0.00)
+ (bounds 15.00 325.00)
+ )
+ (GraphicsLayer
+ (position 305.00 325.00)
+ (bounds 15.00 15.00)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+ )
+ )
+)
+
(GraphicsLayer
(position 1.00 186.00)
(bounds 185.00 15.00)
- (drawsContent 1)
)
(GraphicsLayer
(position 186.00 1.00)
(bounds 15.00 185.00)
- (drawsContent 1)
(repaint rects
(rect 0.00 0.00 15.00 185.00)
)
--- /dev/null
+
+(GraphicsLayer
+ (bounds 800.00 600.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 800.00 600.00)
+ (contentsOpaque 1)
+ (children 2
+ (GraphicsLayer
+ (position 18.00 18.00)
+ (bounds 206.00 126.00)
+ (contentsOpaque 1)
+ (drawsContent 1)
+ (children 3
+ (GraphicsLayer
+ (position 1.00 1.00)
+ (bounds 204.00 124.00)
+ (children 1
+ (GraphicsLayer
+ (position 0.00 -50.00)
+ (bounds 189.00 328.00)
+ (drawsContent 1)
+ )
+ )
+ )
+ (GraphicsLayer
+ (position 190.00 1.00)
+ (bounds 15.00 109.00)
+ )
+ (GraphicsLayer
+ (position 190.00 110.00)
+ (bounds 15.00 15.00)
+ (drawsContent 1)
+ )
+ )
+ )
+ (GraphicsLayer
+ (position 248.00 18.00)
+ (bounds 206.00 126.00)
+ (contentsOpaque 1)
+ (drawsContent 1)
+ (children 3
+ (GraphicsLayer
+ (position 1.00 1.00)
+ (bounds 204.00 124.00)
+ (children 1
+ (GraphicsLayer
+ (position 0.00 -50.00)
+ (bounds 189.00 328.00)
+ (drawsContent 1)
+ )
+ )
+ )
+ (GraphicsLayer
+ (position 190.00 1.00)
+ (bounds 15.00 109.00)
+ )
+ (GraphicsLayer
+ (position 190.00 110.00)
+ (bounds 15.00 15.00)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+ )
+ )
+)
+
(GraphicsLayer
(position 0.00 185.00)
(bounds 185.00 15.00)
- (drawsContent 1)
)
(GraphicsLayer
(position 185.00 0.00)
(bounds 15.00 185.00)
- (drawsContent 1)
(repaint rects
(rect 0.00 0.00 15.00 185.00)
)
--- /dev/null
+
+(GraphicsLayer
+ (bounds 800.00 600.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 800.00 600.00)
+ (contentsOpaque 1)
+ (children 2
+ (GraphicsLayer
+ (position 58.00 58.00)
+ (bounds 350.00 200.00)
+ (drawsContent 1)
+ (children 1
+ (GraphicsLayer
+ (position 15.00 15.00)
+ (children 2
+ (GraphicsLayer
+ (bounds 305.00 170.00)
+ (children 1
+ (GraphicsLayer
+ (children 1
+ (GraphicsLayer
+ (bounds 305.00 230.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 305.00 230.00)
+ (drawsContent 1)
+ (children 1
+ (GraphicsLayer
+ (position 18.00 10.00)
+ (bounds 210.00 210.00)
+ (contentsOpaque 1)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ (GraphicsLayer
+ (position 305.00 0.00)
+ (bounds 15.00 170.00)
+ )
+ )
+ )
+ )
+ )
+ (GraphicsLayer
+ (position 5.00 5.00)
+ (bounds 150.00 150.00)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+)
+
--- /dev/null
+
+(GraphicsLayer
+ (bounds 800.00 600.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 800.00 600.00)
+ (contentsOpaque 1)
+ (children 1
+ (GraphicsLayer
+ (position -12.00 -12.00)
+ (bounds 370.00 220.00)
+ (drawsContent 1)
+ (children 1
+ (GraphicsLayer
+ (position 35.00 35.00)
+ (children 2
+ (GraphicsLayer
+ (bounds 285.00 150.00)
+ (children 1
+ (GraphicsLayer
+ (children 1
+ (GraphicsLayer
+ (bounds 285.00 230.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 285.00 230.00)
+ (drawsContent 1)
+ (children 1
+ (GraphicsLayer
+ (position 18.00 10.00)
+ (bounds 210.00 210.00)
+ (contentsOpaque 1)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ (GraphicsLayer
+ (position 285.00 0.00)
+ (bounds 15.00 150.00)
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+)
+
--- /dev/null
+
+When the parent document becomes composited, the layer trees should get connected together.
+
+(GraphicsLayer
+ (bounds 800.00 600.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 800.00 600.00)
+ (contentsOpaque 1)
+ (children 2
+ (GraphicsLayer
+ (position 8.00 108.00)
+ (bounds 370.00 220.00)
+ (drawsContent 1)
+ (children 1
+ (GraphicsLayer
+ (position 35.00 35.00)
+ (children 2
+ (GraphicsLayer
+ (bounds 285.00 150.00)
+ (children 1
+ (GraphicsLayer
+ (children 1
+ (GraphicsLayer
+ (bounds 285.00 230.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 285.00 230.00)
+ (drawsContent 1)
+ (children 1
+ (GraphicsLayer
+ (position 18.00 10.00)
+ (bounds 210.00 210.00)
+ (contentsOpaque 1)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ (GraphicsLayer
+ (position 285.00 0.00)
+ (bounds 15.00 150.00)
+ )
+ )
+ )
+ )
+ )
+ (GraphicsLayer
+ (position 8.00 8.00)
+ (bounds 100.00 100.00)
+ (contentsOpaque 1)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+)
+
--- /dev/null
+
+(GraphicsLayer
+ (bounds 800.00 600.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 800.00 600.00)
+ (contentsOpaque 1)
+ (children 2
+ (GraphicsLayer
+ (position 8.00 8.00)
+ (bounds 370.00 220.00)
+ (drawsContent 1)
+ (children 1
+ (GraphicsLayer
+ (position 35.00 35.00)
+ (children 2
+ (GraphicsLayer
+ (bounds 285.00 150.00)
+ (children 1
+ (GraphicsLayer
+ (children 1
+ (GraphicsLayer
+ (bounds 285.00 230.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 285.00 230.00)
+ (drawsContent 1)
+ (children 1
+ (GraphicsLayer
+ (position 18.00 10.00)
+ (bounds 210.00 210.00)
+ (contentsOpaque 1)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ (GraphicsLayer
+ (position 285.00 0.00)
+ (bounds 15.00 150.00)
+ )
+ )
+ )
+ )
+ )
+ (GraphicsLayer
+ (position 5.00 5.00)
+ (bounds 50.00 50.00)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+)
+
--- /dev/null
+
+(GraphicsLayer
+ (bounds 800.00 600.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 800.00 600.00)
+ (contentsOpaque 1)
+ (children 2
+ (GraphicsLayer
+ (position 8.00 8.00)
+ (bounds 370.00 220.00)
+ (drawsContent 1)
+ (children 1
+ (GraphicsLayer
+ (position 35.00 35.00)
+ (children 2
+ (GraphicsLayer
+ (bounds 285.00 150.00)
+ (children 1
+ (GraphicsLayer
+ (children 1
+ (GraphicsLayer
+ (bounds 285.00 230.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 285.00 230.00)
+ (drawsContent 1)
+ (children 1
+ (GraphicsLayer
+ (position 18.00 10.00)
+ (bounds 210.00 210.00)
+ (contentsOpaque 1)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ (GraphicsLayer
+ (position 285.00 0.00)
+ (bounds 15.00 150.00)
+ )
+ )
+ )
+ )
+ )
+ (GraphicsLayer
+ (position 5.00 5.00)
+ (bounds 50.00 50.00)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+)
+
--- /dev/null
+
+(GraphicsLayer
+ (bounds 800.00 600.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 800.00 600.00)
+ (contentsOpaque 1)
+ (children 1
+ (GraphicsLayer
+ (position 8.00 8.00)
+ (bounds 370.00 220.00)
+ (drawsContent 1)
+ (children 1
+ (GraphicsLayer
+ (position 35.00 35.00)
+ (children 2
+ (GraphicsLayer
+ (bounds 285.00 150.00)
+ (children 1
+ (GraphicsLayer
+ (children 1
+ (GraphicsLayer
+ (bounds 285.00 230.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 285.00 230.00)
+ (drawsContent 1)
+ (children 1
+ (GraphicsLayer
+ (position 18.00 10.00)
+ (bounds 210.00 210.00)
+ (contentsOpaque 1)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ (GraphicsLayer
+ (position 285.00 0.00)
+ (bounds 15.00 150.00)
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+)
+
--- /dev/null
+
+(GraphicsLayer
+ (bounds 800.00 600.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 800.00 600.00)
+ (contentsOpaque 1)
+ (children 2
+ (GraphicsLayer
+ (position 8.00 8.00)
+ (bounds 370.00 220.00)
+ (drawsContent 1)
+ (children 1
+ (GraphicsLayer
+ (position 35.00 35.00)
+ (children 2
+ (GraphicsLayer
+ (bounds 285.00 150.00)
+ (children 1
+ (GraphicsLayer
+ (children 1
+ (GraphicsLayer
+ (bounds 285.00 230.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 285.00 230.00)
+ (drawsContent 1)
+ (children 1
+ (GraphicsLayer
+ (position 18.00 10.00)
+ (bounds 210.00 210.00)
+ (contentsOpaque 1)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ (GraphicsLayer
+ (position 285.00 0.00)
+ (bounds 15.00 150.00)
+ )
+ )
+ )
+ )
+ )
+ (GraphicsLayer
+ (position 5.00 5.00)
+ (bounds 50.00 50.00)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+)
+
--- /dev/null
+
+(GraphicsLayer
+ (bounds 800.00 600.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 800.00 600.00)
+ (contentsOpaque 1)
+ (children 2
+ (GraphicsLayer
+ (position 8.00 8.00)
+ (bounds 470.00 190.00)
+ (drawsContent 1)
+ (children 1
+ (GraphicsLayer
+ (position 35.00 35.00)
+ (children 2
+ (GraphicsLayer
+ (bounds 385.00 120.00)
+ (children 1
+ (GraphicsLayer
+ (children 1
+ (GraphicsLayer
+ (bounds 385.00 230.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 385.00 230.00)
+ (drawsContent 1)
+ (children 1
+ (GraphicsLayer
+ (position 18.00 10.00)
+ (bounds 210.00 210.00)
+ (contentsOpaque 1)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ (GraphicsLayer
+ (position 385.00 0.00)
+ (bounds 15.00 120.00)
+ )
+ )
+ )
+ )
+ )
+ (GraphicsLayer
+ (position 5.00 5.00)
+ (bounds 50.00 50.00)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+)
+
--- /dev/null
+
+(GraphicsLayer
+ (bounds 800.00 600.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 800.00 600.00)
+ (contentsOpaque 1)
+ (children 2
+ (GraphicsLayer
+ (position 28.00 28.00)
+ (bounds 330.00 180.00)
+ (drawsContent 1)
+ (children 1
+ (GraphicsLayer
+ (position 15.00 15.00)
+ (children 2
+ (GraphicsLayer
+ (bounds 285.00 150.00)
+ (children 1
+ (GraphicsLayer
+ (children 1
+ (GraphicsLayer
+ (bounds 285.00 230.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 285.00 230.00)
+ (drawsContent 1)
+ (children 1
+ (GraphicsLayer
+ (position 18.00 10.00)
+ (bounds 210.00 210.00)
+ (contentsOpaque 1)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ (GraphicsLayer
+ (position 285.00 0.00)
+ (bounds 15.00 150.00)
+ )
+ )
+ )
+ )
+ )
+ (GraphicsLayer
+ (position 5.00 5.00)
+ (bounds 50.00 50.00)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+)
+
--- /dev/null
+
+(GraphicsLayer
+ (bounds 800.00 600.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 800.00 600.00)
+ (contentsOpaque 1)
+ (children 2
+ (GraphicsLayer
+ (bounds 358.00 208.00)
+ (drawsContent 1)
+ (children 1
+ (GraphicsLayer
+ (position 23.00 23.00)
+ (children 2
+ (GraphicsLayer
+ (bounds 285.00 150.00)
+ (children 1
+ (GraphicsLayer
+ (children 1
+ (GraphicsLayer
+ (bounds 285.00 193.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 285.00 193.00)
+ (drawsContent 1)
+ (children 1
+ (GraphicsLayer
+ (position 8.00 8.00)
+ (bounds 252.00 172.00)
+ (drawsContent 1)
+ (children 1
+ (GraphicsLayer
+ (position 1.00 1.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 250.00 170.00)
+ (children 1
+ (GraphicsLayer
+ (children 1
+ (GraphicsLayer
+ (bounds 250.00 230.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 250.00 230.00)
+ (drawsContent 1)
+ (children 1
+ (GraphicsLayer
+ (position 18.00 10.00)
+ (bounds 210.00 210.00)
+ (contentsOpaque 1)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ (GraphicsLayer
+ (position 285.00 0.00)
+ (bounds 15.00 150.00)
+ )
+ )
+ )
+ )
+ )
+ (GraphicsLayer
+ (position 18.00 203.00)
+ (bounds 210.00 210.00)
+ (contentsOpaque 1)
+ (drawsContent 1)
+ (transform [1.00 0.00 0.00 0.00] [0.00 1.00 0.00 0.00] [0.00 0.00 1.00 0.00] [0.00 0.00 1.00 1.00])
+ )
+ )
+ )
+ )
+)
+
--- /dev/null
+
+(GraphicsLayer
+ (bounds 800.00 600.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 800.00 600.00)
+ (contentsOpaque 1)
+ (children 2
+ (GraphicsLayer
+ (position 8.00 8.00)
+ (bounds 370.00 220.00)
+ (drawsContent 1)
+ (children 1
+ (GraphicsLayer
+ (position 35.00 35.00)
+ (children 2
+ (GraphicsLayer
+ (bounds 285.00 150.00)
+ (children 1
+ (GraphicsLayer
+ (children 1
+ (GraphicsLayer
+ (bounds 285.00 230.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 285.00 230.00)
+ (drawsContent 1)
+ (children 1
+ (GraphicsLayer
+ (position 18.00 10.00)
+ (bounds 210.00 210.00)
+ (contentsOpaque 1)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ (GraphicsLayer
+ (position 285.00 0.00)
+ (bounds 15.00 150.00)
+ )
+ )
+ )
+ )
+ )
+ (GraphicsLayer
+ (position 5.00 5.00)
+ (bounds 50.00 50.00)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+)
+
--- /dev/null
+
+(GraphicsLayer
+ (bounds 800.00 600.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 800.00 600.00)
+ (contentsOpaque 1)
+ (children 1
+ (GraphicsLayer
+ (position 8.00 8.00)
+ (bounds 304.00 154.00)
+ (drawsContent 1)
+ (children 2
+ (GraphicsLayer
+ (position 2.00 2.00)
+ (children 2
+ (GraphicsLayer
+ (bounds 285.00 150.00)
+ (children 1
+ (GraphicsLayer
+ (children 1
+ (GraphicsLayer
+ (bounds 285.00 230.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 285.00 230.00)
+ (drawsContent 1)
+ (children 1
+ (GraphicsLayer
+ (position 18.00 10.00)
+ (bounds 210.00 210.00)
+ (contentsOpaque 1)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ (GraphicsLayer
+ (position 285.00 0.00)
+ (bounds 15.00 150.00)
+ )
+ )
+ )
+ (GraphicsLayer
+ (position 287.00 137.00)
+ (bounds 15.00 15.00)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+ )
+ )
+)
+
--- /dev/null
+
+(GraphicsLayer
+ (bounds 800.00 600.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 800.00 600.00)
+ (contentsOpaque 1)
+ (children 2
+ (GraphicsLayer
+ (position 8.00 8.00)
+ (bounds 370.00 220.00)
+ (drawsContent 1)
+ (children 1
+ (GraphicsLayer
+ (position 35.00 35.00)
+ (children 4
+ (GraphicsLayer
+ (bounds 285.00 135.00)
+ (children 1
+ (GraphicsLayer
+ (position -80.00 -80.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 508.00 608.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 508.00 608.00)
+ (drawsContent 1)
+ (children 1
+ (GraphicsLayer
+ (position 108.00 100.00)
+ (bounds 200.00 200.00)
+ (contentsOpaque 1)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ (GraphicsLayer
+ (position 285.00 0.00)
+ (bounds 15.00 135.00)
+ )
+ (GraphicsLayer
+ (position 0.00 135.00)
+ (bounds 285.00 15.00)
+ )
+ (GraphicsLayer
+ (position 285.00 135.00)
+ (bounds 15.00 15.00)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+ )
+ (GraphicsLayer
+ (position 5.00 5.00)
+ (bounds 50.00 50.00)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+)
+
--- /dev/null
+(GraphicsLayer
+ (bounds 800.00 600.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 800.00 600.00)
+ (contentsOpaque 1)
+ (children 1
+ (GraphicsLayer
+ (position 28.00 20.00)
+ (bounds 202.00 202.00)
+ (drawsContent 1)
+ (children 4
+ (GraphicsLayer
+ (position 1.00 1.00)
+ (bounds 200.00 200.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 200.00 300.00)
+ (drawsContent 1)
+ (children 2
+ (GraphicsLayer
+ (bounds 202.00 202.00)
+ (drawsContent 1)
+ )
+ (GraphicsLayer
+ (bounds 200.00 150.00)
+ (contentsOpaque 1)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+ )
+ (GraphicsLayer
+ (position 1.00 186.00)
+ (bounds 185.00 15.00)
+ )
+ (GraphicsLayer
+ (position 186.00 1.00)
+ (bounds 15.00 185.00)
+ )
+ (GraphicsLayer
+ (position 186.00 186.00)
+ (bounds 15.00 15.00)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+ )
+ )
+)
+
+
--- /dev/null
+(GraphicsLayer
+ (bounds 800.00 600.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 800.00 600.00)
+ (contentsOpaque 1)
+ (children 1
+ (GraphicsLayer
+ (bounds 320.00 340.00)
+ (children 4
+ (GraphicsLayer
+ (bounds 320.00 340.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 305.00 1224.00)
+ (drawsContent 1)
+ )
+ )
+ )
+ (GraphicsLayer
+ (position 0.00 325.00)
+ (bounds 305.00 15.00)
+ )
+ (GraphicsLayer
+ (position 305.00 0.00)
+ (bounds 15.00 325.00)
+ )
+ (GraphicsLayer
+ (position 305.00 325.00)
+ (bounds 15.00 15.00)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+ )
+ )
+)
+
(GraphicsLayer
(position 1.00 186.00)
(bounds 185.00 15.00)
- (drawsContent 1)
)
(GraphicsLayer
(position 186.00 1.00)
(bounds 15.00 185.00)
- (drawsContent 1)
(repaint rects
(rect 0.00 0.00 15.00 185.00)
)
--- /dev/null
+
+(GraphicsLayer
+ (bounds 800.00 600.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 800.00 600.00)
+ (contentsOpaque 1)
+ (children 2
+ (GraphicsLayer
+ (position 18.00 18.00)
+ (bounds 206.00 126.00)
+ (contentsOpaque 1)
+ (drawsContent 1)
+ (children 3
+ (GraphicsLayer
+ (position 1.00 1.00)
+ (bounds 204.00 124.00)
+ (children 1
+ (GraphicsLayer
+ (position 0.00 -50.00)
+ (bounds 189.00 328.00)
+ (drawsContent 1)
+ )
+ )
+ )
+ (GraphicsLayer
+ (position 190.00 1.00)
+ (bounds 15.00 109.00)
+ )
+ (GraphicsLayer
+ (position 190.00 110.00)
+ (bounds 15.00 15.00)
+ (drawsContent 1)
+ )
+ )
+ )
+ (GraphicsLayer
+ (position 248.00 18.00)
+ (bounds 206.00 126.00)
+ (contentsOpaque 1)
+ (drawsContent 1)
+ (children 3
+ (GraphicsLayer
+ (position 1.00 1.00)
+ (bounds 204.00 124.00)
+ (children 1
+ (GraphicsLayer
+ (position 0.00 -50.00)
+ (bounds 189.00 328.00)
+ (drawsContent 1)
+ )
+ )
+ )
+ (GraphicsLayer
+ (position 190.00 1.00)
+ (bounds 15.00 109.00)
+ )
+ (GraphicsLayer
+ (position 190.00 110.00)
+ (bounds 15.00 15.00)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+ )
+ )
+)
+
(GraphicsLayer
(position 0.00 185.00)
(bounds 185.00 15.00)
- (drawsContent 1)
)
(GraphicsLayer
(position 185.00 0.00)
(bounds 15.00 185.00)
- (drawsContent 1)
(repaint rects
(rect 0.00 0.00 15.00 185.00)
)
--- /dev/null
+(GraphicsLayer
+ (bounds 800.00 600.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 800.00 600.00)
+ (contentsOpaque 1)
+ (children 1
+ (GraphicsLayer
+ (bounds 400.00 400.00)
+ (drawsContent 1)
+ (children 1
+ (GraphicsLayer
+ (children 4
+ (GraphicsLayer
+ (bounds 385.00 385.00)
+ (children 1
+ (GraphicsLayer
+ (children 1
+ (GraphicsLayer
+ (position -615.00 0.00)
+ (bounds 1000.00 1000.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 1000.00 1000.00)
+ (drawsContent 1)
+ (children 1
+ (GraphicsLayer
+ (position 665.00 50.00)
+ (bounds 100.00 100.00)
+ (contentsOpaque 1)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ (GraphicsLayer
+ (position 385.00 0.00)
+ (bounds 15.00 385.00)
+ )
+ (GraphicsLayer
+ (position 0.00 385.00)
+ (bounds 385.00 15.00)
+ )
+ (GraphicsLayer
+ (position 385.00 385.00)
+ (bounds 15.00 15.00)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+)
+
--- /dev/null
+(GraphicsLayer
+ (bounds 800.00 600.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 800.00 600.00)
+ (contentsOpaque 1)
+ (children 1
+ (GraphicsLayer
+ (bounds 400.00 400.00)
+ (drawsContent 1)
+ (children 1
+ (GraphicsLayer
+ (children 4
+ (GraphicsLayer
+ (bounds 385.00 385.00)
+ (children 1
+ (GraphicsLayer
+ (children 1
+ (GraphicsLayer
+ (position -615.00 0.00)
+ (bounds 1000.00 1000.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 1000.00 1000.00)
+ (drawsContent 1)
+ (children 1
+ (GraphicsLayer
+ (position 51.00 50.00)
+ (bounds 100.00 100.00)
+ (contentsOpaque 1)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ (GraphicsLayer
+ (position 385.00 0.00)
+ (bounds 15.00 385.00)
+ )
+ (GraphicsLayer
+ (position 0.00 385.00)
+ (bounds 385.00 15.00)
+ )
+ (GraphicsLayer
+ (position 385.00 385.00)
+ (bounds 15.00 15.00)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+)
+
--- /dev/null
+(GraphicsLayer
+ (bounds 800.00 600.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 800.00 600.00)
+ (contentsOpaque 1)
+ (children 1
+ (GraphicsLayer
+ (bounds 400.00 400.00)
+ (drawsContent 1)
+ (children 1
+ (GraphicsLayer
+ (children 4
+ (GraphicsLayer
+ (bounds 385.00 385.00)
+ (children 1
+ (GraphicsLayer
+ (children 1
+ (GraphicsLayer
+ (position -615.00 0.00)
+ (bounds 1000.00 1000.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 1000.00 1000.00)
+ (drawsContent 1)
+ (children 1
+ (GraphicsLayer
+ (position 665.00 50.00)
+ (bounds 100.00 100.00)
+ (contentsOpaque 1)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ (GraphicsLayer
+ (position 385.00 0.00)
+ (bounds 15.00 385.00)
+ )
+ (GraphicsLayer
+ (position 0.00 385.00)
+ (bounds 385.00 15.00)
+ )
+ (GraphicsLayer
+ (position 385.00 385.00)
+ (bounds 15.00 15.00)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+)
+
--- /dev/null
+(GraphicsLayer
+ (bounds 800.00 600.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 800.00 600.00)
+ (contentsOpaque 1)
+ (children 1
+ (GraphicsLayer
+ (bounds 400.00 400.00)
+ (drawsContent 1)
+ (children 1
+ (GraphicsLayer
+ (children 4
+ (GraphicsLayer
+ (bounds 385.00 385.00)
+ (children 1
+ (GraphicsLayer
+ (children 1
+ (GraphicsLayer
+ (position -615.00 0.00)
+ (bounds 1000.00 1000.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 1000.00 1000.00)
+ (drawsContent 1)
+ (children 1
+ (GraphicsLayer
+ (position 665.00 50.00)
+ (bounds 100.00 100.00)
+ (contentsOpaque 1)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ (GraphicsLayer
+ (position 385.00 0.00)
+ (bounds 15.00 385.00)
+ )
+ (GraphicsLayer
+ (position 0.00 385.00)
+ (bounds 385.00 15.00)
+ )
+ (GraphicsLayer
+ (position 385.00 385.00)
+ (bounds 15.00 15.00)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+)
+
webkit.org/b/110851 platform/chromium/virtual/softwarecompositing/overflow/overflow-scaled-descendant-overlapping.html [ ImageOnlyFailure ]
webkit.org/b/110851 platform/chromium/virtual/softwarecompositing/repaint/page-scale-repaint.html [ ImageOnlyFailure ]
+# Impl-side scrolling is broken for RTL. Causing impl-side scrollbar artifacts.
+crbug.com/175926 [ Linux ] compositing/rtl/rtl-iframe-absolute-overflow-scrolled.html [ ImageOnlyFailure ]
+crbug.com/175926 [ Linux ] compositing/rtl/rtl-iframe-absolute-overflow.html [ ImageOnlyFailure ]
+crbug.com/175926 [ Linux ] compositing/rtl/rtl-iframe-fixed-overflow-scrolled.html [ ImageOnlyFailure ]
+crbug.com/175926 [ Linux ] compositing/rtl/rtl-iframe-fixed-overflow.html [ ImageOnlyFailure ]
+crbug.com/175926 [ Linux ] platform/chromium/virtual/softwarecompositing/rtl/rtl-iframe-absolute-overflow-scrolled.html [ ImageOnlyFailure ]
+crbug.com/175926 [ Linux ] platform/chromium/virtual/softwarecompositing/rtl/rtl-iframe-absolute-overflow.html [ ImageOnlyFailure ]
+crbug.com/175926 [ Linux ] platform/chromium/virtual/softwarecompositing/rtl/rtl-iframe-fixed-overflow-scrolled.html [ ImageOnlyFailure ]
+crbug.com/175926 [ Linux ] platform/chromium/virtual/softwarecompositing/rtl/rtl-iframe-fixed-overflow.html [ ImageOnlyFailure ]
+2013-02-26 Tien-Ren Chen <trchen@chromium.org>
+
+ Implement coordinated scrollbar for subframes and overflow:scroll
+ https://bugs.webkit.org/show_bug.cgi?id=109560
+
+ Reviewed by James Robinson.
+
+ This patch obsoletes ScrollingCoordinatorPrivate for the Chromium
+ implementation. Also removes the concept of a single main scrolling
+ layer. Should use HashMap to keep track resources for multiple
+ scrollable objects.
+
+ Many of the callbacks are extended to support ScrollableArea instead
+ of just FrameView. Now ScrollingCoordinatorChromium coordinates
+ scrollbars for both subframes and overflow:scroll.
+
+ Some drive-by change:
+ 1. Remove the GraphicsLayer parameter for layer change callbacks.
+ Should be able to get the latest layer from the ScrollableArea anyway.
+ 2. Should start from main frame document when updating touch event target rects.
+
+ New chromium test: ScrollingCoordinatorChromiumTest.iframeScrolling
+
+ * page/Frame.cpp:
+ (WebCore::Frame::willDetachPage):
+ * page/FrameView.cpp:
+ (WebCore::FrameView::prepareForDetach):
+ (WebCore::FrameView::layerForScrolling):
+ (WebCore):
+ * page/FrameView.h:
+ (FrameView):
+ * page/scrolling/ScrollingCoordinator.cpp:
+ (WebCore::ScrollingCoordinator::scrollLayerForScrollableArea):
+ (WebCore):
+ (WebCore::ScrollingCoordinator::horizontalScrollbarLayerForScrollableArea):
+ (WebCore::ScrollingCoordinator::verticalScrollbarLayerForScrollableArea):
+ * page/scrolling/ScrollingCoordinator.h:
+ (WebCore::ScrollingCoordinator::willDestroyScrollableArea):
+ (WebCore::ScrollingCoordinator::scrollableAreaScrollLayerDidChange):
+ (WebCore::ScrollingCoordinator::scrollableAreaScrollbarLayerDidChange):
+ (ScrollingCoordinator):
+ * page/scrolling/chromium/ScrollingCoordinatorChromium.cpp:
+ (WebCore::scrollingWebLayerForGraphicsLayer):
+ (WebCore::ScrollingCoordinatorChromium::scrollingWebLayerForScrollableArea):
+ (WebCore::ScrollingCoordinatorChromium::ScrollingCoordinatorChromium):
+ (WebCore::ScrollingCoordinatorChromium::~ScrollingCoordinatorChromium):
+ (WebCore::ScrollingCoordinatorChromium::frameViewLayoutUpdated):
+ (WebCore::ScrollingCoordinatorChromium::touchEventTargetRectsDidChange):
+ (WebCore::createScrollbarLayer):
+ (WebCore::detachScrollbarLayer):
+ (WebCore::setupScrollbarLayer):
+ (WebCore::ScrollingCoordinatorChromium::willDestroyScrollableArea):
+ (WebCore::ScrollingCoordinatorChromium::scrollableAreaScrollbarLayerDidChange):
+ (WebCore::ScrollingCoordinatorChromium::setNonFastScrollableRegion):
+ (WebCore::ScrollingCoordinatorChromium::setTouchEventTargetRects):
+ (WebCore::ScrollingCoordinatorChromium::setWheelEventHandlerCount):
+ (WebCore::ScrollingCoordinatorChromium::setShouldUpdateScrollLayerPositionOnMainThread):
+ (WebCore::ScrollingCoordinatorChromium::setLayerIsContainerForFixedPositionLayers):
+ (WebCore::ScrollingCoordinatorChromium::setLayerIsFixedToContainerLayer):
+ (WebCore::ScrollingCoordinatorChromium::scrollableAreaScrollLayerDidChange):
+ (WebCore::ScrollingCoordinatorChromium::addWebScrollbarLayer):
+ (WebCore):
+ (WebCore::ScrollingCoordinatorChromium::getWebScrollbarLayer):
+ (WebCore::ScrollingCoordinatorChromium::removeWebScrollbarLayer):
+ * page/scrolling/chromium/ScrollingCoordinatorChromium.h:
+ (WebCore):
+ (ScrollingCoordinatorChromium):
+ * page/scrolling/mac/ScrollingCoordinatorMac.h:
+ (ScrollingCoordinatorMac):
+ * page/scrolling/mac/ScrollingCoordinatorMac.mm:
+ (WebCore::ScrollingCoordinatorMac::scrollableAreaScrollbarLayerDidChange):
+ * platform/ScrollableArea.h:
+ (ScrollableArea):
+ (WebCore::ScrollableArea::layerForScrolling):
+ * platform/graphics/GraphicsLayer.h:
+ (GraphicsLayer):
+ (WebCore::GraphicsLayer::setContentsToPlatformLayer):
+ * rendering/RenderLayer.cpp:
+ (WebCore::RenderLayer::~RenderLayer):
+ (WebCore::RenderLayer::layerForScrolling):
+ (WebCore):
+ * rendering/RenderLayer.h:
+ (RenderLayer):
+ * rendering/RenderLayerBacking.cpp:
+ (WebCore::RenderLayerBacking::updateOverflowControlsLayers):
+ (WebCore::RenderLayerBacking::positionOverflowControlsLayers):
+ (WebCore::RenderLayerBacking::updateScrollingLayers):
+ * rendering/RenderLayerCompositor.cpp:
+ (WebCore::RenderLayerCompositor::frameViewDidScroll):
+ (WebCore::RenderLayerCompositor::scrollingLayerDidChange):
+ (WebCore::RenderLayerCompositor::updateOverflowControlsLayers):
+
2013-02-26 Kentaro Hara <haraken@chromium.org>
[V8] Overloaded constructors don't need header declarations
#include "ScriptController.h"
#include "ScriptSourceCode.h"
#include "ScriptValue.h"
+#include "ScrollingCoordinator.h"
#include "Settings.h"
#include "StylePropertySet.h"
#include "TextIterator.h"
if (page() && page()->focusController()->focusedFrame() == this)
page()->focusController()->setFocusedFrame(0);
+ if (page() && page()->scrollingCoordinator() && m_view)
+ page()->scrollingCoordinator()->willDestroyScrollableArea(m_view.get());
+
script()->clearScriptObjects();
script()->updatePlatformScriptObjects();
}
// When the view is no longer associated with a frame, it needs to be removed from the ax object cache
// right now, otherwise it won't be able to reach the topDocument()'s axObject cache later.
removeFromAXObjectCache();
+
+ if (m_frame && m_frame->page()) {
+ if (ScrollingCoordinator* scrollingCoordinator = m_frame->page()->scrollingCoordinator())
+ scrollingCoordinator->willDestroyScrollableArea(this);
+ }
}
void FrameView::detachCustomScrollbars()
return false;
}
+GraphicsLayer* FrameView::layerForScrolling() const
+{
+ RenderView* renderView = this->renderView();
+ if (!renderView)
+ return 0;
+ return renderView->compositor()->scrollLayer();
+}
+
GraphicsLayer* FrameView::layerForHorizontalScrollbar() const
{
RenderView* renderView = this->renderView();
virtual bool scrollAnimatorEnabled() const OVERRIDE;
#if USE(ACCELERATED_COMPOSITING)
virtual bool usesCompositedScrolling() const OVERRIDE;
+ virtual GraphicsLayer* layerForScrolling() const OVERRIDE;
virtual GraphicsLayer* layerForHorizontalScrollbar() const OVERRIDE;
virtual GraphicsLayer* layerForVerticalScrollbar() const OVERRIDE;
virtual GraphicsLayer* layerForScrollCorner() const OVERRIDE;
updateShouldUpdateScrollLayerPositionOnMainThread();
}
+GraphicsLayer* ScrollingCoordinator::scrollLayerForScrollableArea(ScrollableArea* scrollableArea)
+{
+ return scrollableArea->layerForScrolling();
+}
+
+GraphicsLayer* ScrollingCoordinator::horizontalScrollbarLayerForScrollableArea(ScrollableArea* scrollableArea)
+{
+ return scrollableArea->layerForHorizontalScrollbar();
+}
+
+GraphicsLayer* ScrollingCoordinator::verticalScrollbarLayerForScrollableArea(ScrollableArea* scrollableArea)
+{
+ return scrollableArea->layerForVerticalScrollbar();
+}
+
GraphicsLayer* ScrollingCoordinator::scrollLayerForFrameView(FrameView* frameView)
{
#if USE(ACCELERATED_COMPOSITING)
// These virtual functions are currently unique to Chromium's WebLayer approach. Their meaningful
// implementations are in ScrollingCoordinatorChromium.
- virtual void frameViewHorizontalScrollbarLayerDidChange(FrameView*, GraphicsLayer*) { }
- virtual void frameViewVerticalScrollbarLayerDidChange(FrameView*, GraphicsLayer*) { }
- virtual void scrollableAreaScrollLayerDidChange(ScrollableArea*, GraphicsLayer*) { }
+ virtual void willDestroyScrollableArea(ScrollableArea*) { }
+ virtual void scrollableAreaScrollLayerDidChange(ScrollableArea*) { }
+ virtual void scrollableAreaScrollbarLayerDidChange(ScrollableArea*, ScrollbarOrientation) { }
virtual void setLayerIsContainerForFixedPositionLayers(GraphicsLayer*, bool) { }
virtual void setLayerIsFixedToContainerLayer(GraphicsLayer*, bool) { }
virtual void touchEventTargetRectsDidChange(const Document*) { }
protected:
explicit ScrollingCoordinator(Page*);
+ static GraphicsLayer* scrollLayerForScrollableArea(ScrollableArea*);
+ static GraphicsLayer* horizontalScrollbarLayerForScrollableArea(ScrollableArea*);
+ static GraphicsLayer* verticalScrollbarLayerForScrollableArea(ScrollableArea*);
+
unsigned computeCurrentWheelEventHandlerCount();
GraphicsLayer* scrollLayerForFrameView(FrameView*);
GraphicsLayer* counterScrollingLayerForFrameView(FrameView*);
namespace WebCore {
-class ScrollingCoordinatorPrivate {
-WTF_MAKE_NONCOPYABLE(ScrollingCoordinatorPrivate);
-public:
- ScrollingCoordinatorPrivate()
- : m_scrollLayer(0)
- {
- }
-
- ~ScrollingCoordinatorPrivate()
- {
- if (m_horizontalScrollbarLayer)
- GraphicsLayerChromium::unregisterContentsLayer(m_horizontalScrollbarLayer->layer());
- if (m_verticalScrollbarLayer)
- GraphicsLayerChromium::unregisterContentsLayer(m_verticalScrollbarLayer->layer());
- }
-
- void setScrollLayer(WebLayer* layer)
- {
- m_scrollLayer = layer;
-
- if (m_horizontalScrollbarLayer)
- m_horizontalScrollbarLayer->setScrollLayer(layer);
- if (m_verticalScrollbarLayer)
- m_verticalScrollbarLayer->setScrollLayer(layer);
- }
-
- void setHorizontalScrollbarLayer(PassOwnPtr<WebScrollbarLayer> layer)
- {
- m_horizontalScrollbarLayer = layer;
- }
-
- void setVerticalScrollbarLayer(PassOwnPtr<WebScrollbarLayer> layer)
- {
- m_verticalScrollbarLayer = layer;
- }
-
- WebLayer* scrollLayer() const { return m_scrollLayer; }
+static WebLayer* scrollingWebLayerForGraphicsLayer(GraphicsLayer* layer)
+{
+ return layer->platformLayer();
+}
-private:
- WebLayer* m_scrollLayer;
- OwnPtr<WebScrollbarLayer> m_horizontalScrollbarLayer;
- OwnPtr<WebScrollbarLayer> m_verticalScrollbarLayer;
-};
+WebLayer* ScrollingCoordinatorChromium::scrollingWebLayerForScrollableArea(ScrollableArea* scrollableArea)
+{
+ GraphicsLayer* graphicsLayer = scrollLayerForScrollableArea(scrollableArea);
+ return graphicsLayer ? scrollingWebLayerForGraphicsLayer(graphicsLayer) : 0;
+}
ScrollingCoordinatorChromium::ScrollingCoordinatorChromium(Page* page)
: ScrollingCoordinator(page)
- , m_private(new ScrollingCoordinatorPrivate)
{
}
ScrollingCoordinatorChromium::~ScrollingCoordinatorChromium()
{
- delete m_private;
+ 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)
computeAbsoluteTouchEventTargetRects(m_page->mainFrame()->document(), touchEventTargetRects);
setTouchEventTargetRects(touchEventTargetRects);
#endif
- if (m_private->scrollLayer())
- m_private->scrollLayer()->setBounds(frameView->contentsSize());
+ if (WebLayer* scrollLayer = scrollingWebLayerForScrollableArea(frameView))
+ scrollLayer->setBounds(frameView->contentsSize());
}
-void ScrollingCoordinatorChromium::touchEventTargetRectsDidChange(const Document* document)
+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 (m_page->mainFrame()->view()->needsLayout())
+ if (frameView->needsLayout() || !document)
return;
- // We won't necessarily get a setScrollLayer() call before this one, so grab the root ourselves.
- setScrollLayer(scrollLayerForFrameView(m_page->mainFrame()->view()));
- if (m_private->scrollLayer()) {
- Vector<IntRect> touchEventTargetRects;
- computeAbsoluteTouchEventTargetRects(document, touchEventTargetRects);
- setTouchEventTargetRects(touchEventTargetRects);
- }
-#else
- UNUSED_PARAM(document);
+ Vector<IntRect> touchEventTargetRects;
+ computeAbsoluteTouchEventTargetRects(document, touchEventTargetRects);
+ setTouchEventTargetRects(touchEventTargetRects);
#endif
}
-void ScrollingCoordinatorChromium::frameViewRootLayerDidChange(FrameView* frameView)
+static PassOwnPtr<WebScrollbarLayer> createScrollbarLayer(Scrollbar* scrollbar)
{
- ScrollingCoordinator::frameViewRootLayerDidChange(frameView);
- setScrollLayer(scrollLayerForFrameView(frameView));
+ // 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 WebLayer* scrollableLayerForGraphicsLayer(GraphicsLayer* layer)
+static void detachScrollbarLayer(GraphicsLayer* scrollbarGraphicsLayer)
{
- return layer->platformLayer();
+ ASSERT(scrollbarGraphicsLayer);
+
+ scrollbarGraphicsLayer->setContentsToPlatformLayer(0);
+ scrollbarGraphicsLayer->setDrawsContent(true);
}
-PassOwnPtr<WebScrollbarLayer> ScrollingCoordinatorChromium::createScrollbarLayer(Scrollbar* scrollbar, WebLayer* scrollLayer, GraphicsLayer* scrollbarGraphicsLayer, FrameView* frameView)
+static void setupScrollbarLayer(GraphicsLayer* scrollbarGraphicsLayer, WebScrollbarLayer* scrollbarLayer, WebLayer* scrollLayer)
{
- ASSERT(scrollbar);
ASSERT(scrollbarGraphicsLayer);
+ ASSERT(scrollbarLayer);
if (!scrollLayer) {
- // FIXME: sometimes we get called before setScrollLayer, workaround by finding the scroll layout ourselves.
- scrollLayer = scrollableLayerForGraphicsLayer(scrollLayerForFrameView(frameView));
- ASSERT(scrollLayer);
- }
-
- // Root layer non-overlay scrollbars should be marked opaque to disable
- // blending.
- bool isOpaqueRootScrollbar = !frameView->parent() && !scrollbar->isOverlayScrollbar();
- if (!scrollbarGraphicsLayer->contentsOpaque())
- scrollbarGraphicsLayer->setContentsOpaque(isOpaqueRootScrollbar);
-
- // FIXME: Mac scrollbar themes are not thread-safe to paint.
- bool platformSupported = true;
-#if OS(DARWIN)
- platformSupported = false;
-#endif
-
- if (!platformSupported || scrollbar->isCustomScrollbar()) {
- scrollbarGraphicsLayer->setContentsToMedia(0);
- scrollbarGraphicsLayer->setDrawsContent(true);
- return nullptr;
+ detachScrollbarLayer(scrollbarGraphicsLayer);
+ return;
}
-
- // 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()));
scrollbarLayer->setScrollLayer(scrollLayer);
-
- GraphicsLayerChromium::registerContentsLayer(scrollbarLayer->layer());
- scrollbarGraphicsLayer->setContentsToMedia(scrollbarLayer->layer());
+ scrollbarGraphicsLayer->setContentsToPlatformLayer(scrollbarLayer->layer());
scrollbarGraphicsLayer->setDrawsContent(false);
- scrollbarLayer->layer()->setOpaque(scrollbarGraphicsLayer->contentsOpaque());
-
- return scrollbarLayer.release();
}
-void ScrollingCoordinatorChromium::frameViewHorizontalScrollbarLayerDidChange(FrameView* frameView, GraphicsLayer* horizontalScrollbarLayer)
+void ScrollingCoordinatorChromium::willDestroyScrollableArea(ScrollableArea* scrollableArea)
{
- if (!horizontalScrollbarLayer || !coordinatesScrollingForFrameView(frameView))
- return;
-
- setScrollLayer(scrollLayerForFrameView(m_page->mainFrame()->view()));
- m_private->setHorizontalScrollbarLayer(createScrollbarLayer(frameView->horizontalScrollbar(), m_private->scrollLayer(), horizontalScrollbarLayer, frameView));
+ removeWebScrollbarLayer(scrollableArea, HorizontalScrollbar);
+ removeWebScrollbarLayer(scrollableArea, VerticalScrollbar);
}
-void ScrollingCoordinatorChromium::frameViewVerticalScrollbarLayerDidChange(FrameView* frameView, GraphicsLayer* verticalScrollbarLayer)
+void ScrollingCoordinatorChromium::scrollableAreaScrollbarLayerDidChange(ScrollableArea* scrollableArea, ScrollbarOrientation orientation)
{
- if (!verticalScrollbarLayer || !coordinatesScrollingForFrameView(frameView))
+#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;
- setScrollLayer(scrollLayerForFrameView(m_page->mainFrame()->view()));
- m_private->setVerticalScrollbarLayer(createScrollbarLayer(frameView->verticalScrollbar(), m_private->scrollLayer(), verticalScrollbarLayer, frameView));
-}
+ bool isMainFrame = (scrollableArea == static_cast<ScrollableArea*>(m_page->mainFrame()->view()));
+ if (!isMainFrame && platformSupportsMainFrameOnly)
+ return;
-void ScrollingCoordinatorChromium::setScrollLayer(GraphicsLayer* scrollLayer)
-{
- m_private->setScrollLayer(scrollLayer ? scrollableLayerForGraphicsLayer(scrollLayer) : 0);
+ 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)
{
- // We won't necessarily get a setScrollLayer() call before this one, so grab the root ourselves.
- setScrollLayer(scrollLayerForFrameView(m_page->mainFrame()->view()));
- if (m_private->scrollLayer()) {
+ 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];
- m_private->scrollLayer()->setNonFastScrollableRegion(webRects);
+ scrollLayer->setNonFastScrollableRegion(webRects);
}
}
void ScrollingCoordinatorChromium::setTouchEventTargetRects(const Vector<IntRect>& absoluteHitTestRects)
{
- // We won't necessarily get a setScrollLayer() call before this one, so grab the root ourselves.
- setScrollLayer(scrollLayerForFrameView(m_page->mainFrame()->view()));
- if (m_private->scrollLayer()) {
+ 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];
- m_private->scrollLayer()->setTouchEventHandlerRegion(webRects);
+ scrollLayer->setTouchEventHandlerRegion(webRects);
}
}
void ScrollingCoordinatorChromium::setWheelEventHandlerCount(unsigned wheelEventHandlerCount)
{
- // We won't necessarily get a setScrollLayer() call before this one, so grab the root ourselves.
- setScrollLayer(scrollLayerForFrameView(m_page->mainFrame()->view()));
- if (m_private->scrollLayer())
- m_private->scrollLayer()->setHaveWheelEventHandlers(wheelEventHandlerCount > 0);
+ if (WebLayer* scrollLayer = scrollingWebLayerForScrollableArea(m_page->mainFrame()->view()))
+ scrollLayer->setHaveWheelEventHandlers(wheelEventHandlerCount > 0);
}
void ScrollingCoordinatorChromium::setShouldUpdateScrollLayerPositionOnMainThread(MainThreadScrollingReasons reasons)
{
- // We won't necessarily get a setScrollLayer() call before this one, so grab the root ourselves.
- setScrollLayer(scrollLayerForFrameView(m_page->mainFrame()->view()));
- if (m_private->scrollLayer())
- m_private->scrollLayer()->setShouldScrollOnMainThread(reasons);
+ if (WebLayer* scrollLayer = scrollingWebLayerForScrollableArea(m_page->mainFrame()->view()))
+ scrollLayer->setShouldScrollOnMainThread(reasons);
}
void ScrollingCoordinatorChromium::setLayerIsContainerForFixedPositionLayers(GraphicsLayer* layer, bool enable)
{
- if (WebLayer* scrollableLayer = scrollableLayerForGraphicsLayer(layer))
+ if (WebLayer* scrollableLayer = scrollingWebLayerForGraphicsLayer(layer))
scrollableLayer->setIsContainerForFixedPositionLayers(enable);
}
void ScrollingCoordinatorChromium::setLayerIsFixedToContainerLayer(GraphicsLayer* layer, bool enable)
{
- if (WebLayer* scrollableLayer = scrollableLayerForGraphicsLayer(layer))
+ if (WebLayer* scrollableLayer = scrollingWebLayerForGraphicsLayer(layer))
scrollableLayer->setFixedToContainerLayer(enable);
}
-void ScrollingCoordinatorChromium::scrollableAreaScrollLayerDidChange(ScrollableArea* scrollableArea, GraphicsLayer* scrollLayer)
+void ScrollingCoordinatorChromium::scrollableAreaScrollLayerDidChange(ScrollableArea* scrollableArea)
{
- if (!scrollLayer)
- return;
- GraphicsLayerChromium* layer = static_cast<GraphicsLayerChromium*>(scrollLayer);
- layer->setScrollableArea(scrollableArea);
+ GraphicsLayerChromium* scrollLayer = static_cast<GraphicsLayerChromium*>(scrollLayerForScrollableArea(scrollableArea));
+ if (scrollLayer)
+ scrollLayer->setScrollableArea(scrollableArea);
- if (WebLayer* webLayer = scrollLayer->platformLayer()) {
+ WebLayer* webLayer = scrollingWebLayerForScrollableArea(scrollableArea);
+ if (webLayer) {
webLayer->setScrollable(true);
webLayer->setScrollPosition(scrollableArea->scrollPosition());
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)
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());
+}
+
}
namespace WebCore {
class Scrollbar;
-class ScrollingCoordinatorPrivate;
class ScrollingCoordinatorChromium : public ScrollingCoordinator {
public:
// Should be called whenever the given frame view has been laid out.
virtual void frameViewLayoutUpdated(FrameView*);
- // Should be called whenever the root layer for the given frame view changes.
- virtual void frameViewRootLayerDidChange(FrameView*);
-
- // Should be called whenever the horizontal scrollbar layer for the given frame view changes.
- virtual void frameViewHorizontalScrollbarLayerDidChange(FrameView*, GraphicsLayer*);
-
- // Should be called whenever the vertical scrollbar layer for the given frame view changes.
- virtual void frameViewVerticalScrollbarLayerDidChange(FrameView*, GraphicsLayer*);
-
// Return whether this scrolling coordinator can keep fixed position layers fixed to their
// containers while scrolling.
virtual bool supportsFixedPositionLayers() const { return true; }
// Attach/detach layer position to ancestor fixed position container.
virtual void setLayerIsFixedToContainerLayer(GraphicsLayer*, bool);
+ // Should be called when a ScrollableArea is getting destroyed.
+ virtual void willDestroyScrollableArea(ScrollableArea*);
+
// Should be called whenever the scrollable layer for the given scroll area changes.
- virtual void scrollableAreaScrollLayerDidChange(ScrollableArea*, GraphicsLayer*);
+ virtual void scrollableAreaScrollLayerDidChange(ScrollableArea*);
+
+ // Should be called whenever the scrollbar layer for the given scrollable area changes.
+ virtual void scrollableAreaScrollbarLayerDidChange(ScrollableArea*, ScrollbarOrientation);
// Should be called whenever touch handlers are registered, removed, or moved.
virtual void touchEventTargetRectsDidChange(const Document*) OVERRIDE;
virtual void recomputeWheelEventHandlerCountForFrameView(FrameView*);
virtual void setShouldUpdateScrollLayerPositionOnMainThread(MainThreadScrollingReasons);
- void setScrollLayer(GraphicsLayer*);
+ static WebKit::WebLayer* scrollingWebLayerForScrollableArea(ScrollableArea*);
+
void setNonFastScrollableRegion(const Region&);
void setTouchEventTargetRects(const Vector<IntRect>&);
void setWheelEventHandlerCount(unsigned);
- PassOwnPtr<WebKit::WebScrollbarLayer> createScrollbarLayer(Scrollbar*, WebKit::WebLayer* scrollLayer, GraphicsLayer* scrollbarGraphicsLayer, FrameView*);
- ScrollingCoordinatorPrivate* m_private;
+ WebKit::WebScrollbarLayer* addWebScrollbarLayer(ScrollableArea*, ScrollbarOrientation, PassOwnPtr<WebKit::WebScrollbarLayer>);
+ WebKit::WebScrollbarLayer* getWebScrollbarLayer(ScrollableArea*, ScrollbarOrientation);
+ void removeWebScrollbarLayer(ScrollableArea*, ScrollbarOrientation);
+
+ typedef HashMap<ScrollableArea*, OwnPtr<WebKit::WebScrollbarLayer> > ScrollbarMap;
+ ScrollbarMap m_horizontalScrollbars;
+ ScrollbarMap m_verticalScrollbars;
};
} // namespace WebCore
// Should be called whenever the root layer for the given frame view changes.
virtual void frameViewRootLayerDidChange(FrameView*);
- // Should be called whenever the horizontal scrollbar layer for the given frame view changes.
- virtual void frameViewHorizontalScrollbarLayerDidChange(FrameView*, GraphicsLayer* horizontalScrollbarLayer);
-
- // Should be called whenever the vertical scrollbar layer for the given frame view changes.
- virtual void frameViewVerticalScrollbarLayerDidChange(FrameView*, GraphicsLayer* verticalScrollbarLayer);
+ // Should be called whenever the scrollbar layer for the given scrollable area changes.
+ virtual void scrollableAreaScrollbarLayerDidChange(ScrollableArea*, ScrollbarOrientation);
// Requests that the scrolling coordinator updates the scroll position of the given frame view. If this function returns true, it means that the
// position will be updated asynchronously. If it returns false, the caller should update the scrolling position itself.
setCounterScrollingLayerForNode(counterScrollingLayerForFrameView(frameView), node);
}
-void ScrollingCoordinatorMac::frameViewHorizontalScrollbarLayerDidChange(FrameView* frameView, GraphicsLayer*)
+void ScrollingCoordinatorMac::scrollableAreaScrollbarLayerDidChange(ScrollableArea* scrollableArea, ScrollbarOrientation)
{
ASSERT(isMainThread());
ASSERT(m_page);
- if (frameView->frame() != m_page->mainFrame())
- return;
-
- // FIXME: Implement.
-}
-
-void ScrollingCoordinatorMac::frameViewVerticalScrollbarLayerDidChange(FrameView* frameView, GraphicsLayer*)
-{
- ASSERT(isMainThread());
- ASSERT(m_page);
-
- if (frameView->frame() != m_page->mainFrame())
+ if (scrollableArea != static_cast<ScrollableArea*>(m_page->mainFrame()->view()))
return;
// FIXME: Implement.
virtual void invalidateScrollCornerRect(const IntRect&) = 0;
#if USE(ACCELERATED_COMPOSITING)
+ friend class ScrollingCoordinator;
+ virtual GraphicsLayer* layerForScrolling() const { return 0; }
virtual GraphicsLayer* layerForHorizontalScrollbar() const { return 0; }
virtual GraphicsLayer* layerForVerticalScrollbar() const { return 0; }
virtual GraphicsLayer* layerForScrollCorner() const { return 0; }
// Pass an invalid color to remove the contents layer.
virtual void setContentsToSolidColor(const Color&) { }
virtual void setContentsToCanvas(PlatformLayer*) { }
+ // FIXME: webkit.org/b/109658
+ // Should unify setContentsToMedia and setContentsToCanvas
+ virtual void setContentsToPlatformLayer(PlatformLayer* layer) { setContentsToMedia(layer); }
virtual bool hasContentsLayer() const { return false; }
// Callback from the underlying graphics system to draw layer contents.
destroyScrollbar(HorizontalScrollbar);
destroyScrollbar(VerticalScrollbar);
+ if (renderer()->frame() && renderer()->frame()->page()) {
+ if (ScrollingCoordinator* scrollingCoordinator = renderer()->frame()->page()->scrollingCoordinator())
+ scrollingCoordinator->willDestroyScrollableArea(this);
+ }
+
if (m_reflection)
removeReflection();
return m_backing && m_backing->hasMaskLayer();
}
+GraphicsLayer* RenderLayer::layerForScrolling() const
+{
+ return m_backing ? m_backing->scrollingContentsLayer() : 0;
+}
+
GraphicsLayer* RenderLayer::layerForHorizontalScrollbar() const
{
return m_backing ? m_backing->layerForHorizontalScrollbar() : 0;
RenderLayerBacking* backing() const { return m_backing.get(); }
RenderLayerBacking* ensureBacking();
void clearBacking(bool layerBeingDestroyed = false);
+ virtual GraphicsLayer* layerForScrolling() const;
virtual GraphicsLayer* layerForHorizontalScrollbar() const;
virtual GraphicsLayer* layerForVerticalScrollbar() const;
virtual GraphicsLayer* layerForScrollCorner() const;
bool RenderLayerBacking::updateOverflowControlsLayers(bool needsHorizontalScrollbarLayer, bool needsVerticalScrollbarLayer, bool needsScrollCornerLayer)
{
- bool layersChanged = false;
+ bool horizontalScrollbarLayerChanged = false;
if (needsHorizontalScrollbarLayer) {
if (!m_layerForHorizontalScrollbar) {
m_layerForHorizontalScrollbar = createGraphicsLayer("horizontal scrollbar");
- layersChanged = true;
+ horizontalScrollbarLayerChanged = true;
}
} else if (m_layerForHorizontalScrollbar) {
m_layerForHorizontalScrollbar.clear();
- layersChanged = true;
+ horizontalScrollbarLayerChanged = true;
}
+ bool verticalScrollbarLayerChanged = false;
if (needsVerticalScrollbarLayer) {
if (!m_layerForVerticalScrollbar) {
m_layerForVerticalScrollbar = createGraphicsLayer("vertical scrollbar");
- layersChanged = true;
+ verticalScrollbarLayerChanged = true;
}
} else if (m_layerForVerticalScrollbar) {
m_layerForVerticalScrollbar.clear();
- layersChanged = true;
+ verticalScrollbarLayerChanged = true;
}
+ bool scrollCornerLayerChanged = false;
if (needsScrollCornerLayer) {
if (!m_layerForScrollCorner) {
m_layerForScrollCorner = createGraphicsLayer("scroll corner");
- layersChanged = true;
+ scrollCornerLayerChanged = true;
}
} else if (m_layerForScrollCorner) {
m_layerForScrollCorner.clear();
- layersChanged = true;
+ scrollCornerLayerChanged = true;
}
- return layersChanged;
+ if (ScrollingCoordinator* scrollingCoordinator = scrollingCoordinatorFromLayer(m_owningLayer)) {
+ if (horizontalScrollbarLayerChanged)
+ scrollingCoordinator->scrollableAreaScrollbarLayerDidChange(m_owningLayer, HorizontalScrollbar);
+ if (verticalScrollbarLayerChanged)
+ scrollingCoordinator->scrollableAreaScrollbarLayerDidChange(m_owningLayer, VerticalScrollbar);
+ }
+
+ return horizontalScrollbarLayerChanged || verticalScrollbarLayerChanged || scrollCornerLayerChanged;
}
void RenderLayerBacking::positionOverflowControlsLayers(const IntSize& offsetFromRoot)
if (hBar) {
layer->setPosition(hBar->frameRect().location() - offsetFromRoot - offsetFromRenderer);
layer->setSize(hBar->frameRect().size());
+ if (layer->hasContentsLayer())
+ layer->setContentsRect(IntRect(IntPoint(), hBar->frameRect().size()));
}
- layer->setDrawsContent(hBar);
+ layer->setDrawsContent(hBar && !layer->hasContentsLayer());
}
if (GraphicsLayer* layer = layerForVerticalScrollbar()) {
if (vBar) {
layer->setPosition(vBar->frameRect().location() - offsetFromRoot - offsetFromRenderer);
layer->setSize(vBar->frameRect().size());
+ if (layer->hasContentsLayer())
+ layer->setContentsRect(IntRect(IntPoint(), vBar->frameRect().size()));
}
- layer->setDrawsContent(vBar);
+ layer->setDrawsContent(vBar && !layer->hasContentsLayer());
}
if (GraphicsLayer* layer = layerForScrollCorner()) {
bool RenderLayerBacking::updateScrollingLayers(bool needsScrollingLayers)
{
+ ScrollingCoordinator* scrollingCoordinator = scrollingCoordinatorFromLayer(m_owningLayer);
+
bool layerChanged = false;
if (needsScrollingLayers) {
if (!m_scrollingLayer) {
m_scrollingLayer->addChild(m_scrollingContentsLayer.get());
layerChanged = true;
+ if (scrollingCoordinator)
+ scrollingCoordinator->scrollableAreaScrollLayerDidChange(m_owningLayer);
}
} else if (m_scrollingLayer) {
m_scrollingLayer = nullptr;
m_scrollingContentsLayer = nullptr;
layerChanged = true;
+ if (scrollingCoordinator)
+ scrollingCoordinator->scrollableAreaScrollLayerDidChange(m_owningLayer);
}
if (layerChanged) {
return;
if (Settings* settings = m_renderView->document()->settings())
if (settings->compositedScrollingForFramesEnabled())
- scrollingCoordinator->scrollableAreaScrollLayerDidChange(frameView, m_scrollLayer.get());
+ scrollingCoordinator->scrollableAreaScrollLayerDidChange(frameView);
}
m_scrollLayer->setPosition(FloatPoint(-scrollPosition.x(), -scrollPosition.y()));
void RenderLayerCompositor::scrollingLayerDidChange(RenderLayer* layer)
{
- RenderLayerBacking* backing = layer->backing();
if (ScrollingCoordinator* scrollingCoordinator = this->scrollingCoordinator())
- scrollingCoordinator->scrollableAreaScrollLayerDidChange(layer, backing ? backing->scrollingContentsLayer() : 0);
+ scrollingCoordinator->scrollableAreaScrollLayerDidChange(layer);
}
void RenderLayerCompositor::fixedRootBackgroundLayerChanged()
m_overflowControlsHostLayer->addChild(m_layerForHorizontalScrollbar.get());
if (ScrollingCoordinator* scrollingCoordinator = this->scrollingCoordinator())
- scrollingCoordinator->frameViewHorizontalScrollbarLayerDidChange(m_renderView->frameView(), m_layerForHorizontalScrollbar.get());
+ scrollingCoordinator->scrollableAreaScrollbarLayerDidChange(m_renderView->frameView(), HorizontalScrollbar);
}
} else if (m_layerForHorizontalScrollbar) {
m_layerForHorizontalScrollbar->removeFromParent();
m_layerForHorizontalScrollbar = nullptr;
if (ScrollingCoordinator* scrollingCoordinator = this->scrollingCoordinator())
- scrollingCoordinator->frameViewHorizontalScrollbarLayerDidChange(m_renderView->frameView(), 0);
+ scrollingCoordinator->scrollableAreaScrollbarLayerDidChange(m_renderView->frameView(), HorizontalScrollbar);
}
if (requiresVerticalScrollbarLayer()) {
m_overflowControlsHostLayer->addChild(m_layerForVerticalScrollbar.get());
if (ScrollingCoordinator* scrollingCoordinator = this->scrollingCoordinator())
- scrollingCoordinator->frameViewVerticalScrollbarLayerDidChange(m_renderView->frameView(), m_layerForVerticalScrollbar.get());
+ scrollingCoordinator->scrollableAreaScrollbarLayerDidChange(m_renderView->frameView(), VerticalScrollbar);
}
} else if (m_layerForVerticalScrollbar) {
m_layerForVerticalScrollbar->removeFromParent();
m_layerForVerticalScrollbar = nullptr;
if (ScrollingCoordinator* scrollingCoordinator = this->scrollingCoordinator())
- scrollingCoordinator->frameViewVerticalScrollbarLayerDidChange(m_renderView->frameView(), 0);
+ scrollingCoordinator->scrollableAreaScrollbarLayerDidChange(m_renderView->frameView(), VerticalScrollbar);
}
if (requiresScrollCornerLayer()) {
+2013-02-26 Tien-Ren Chen <trchen@chromium.org>
+
+ Implement coordinated scrollbar for subframes and overflow:scroll
+ https://bugs.webkit.org/show_bug.cgi?id=109560
+
+ Reviewed by James Robinson.
+
+ Added ScrollingCoordinatorChromiumTest.iframeScrolling to verify
+ impl-side scrolling and impl-side scrollbars for frames.
+
+ Update ScrollingCoordinatorChromiumTest.overflowScrolling to verify
+ impl-side scrollbars.
+
+ * tests/ScrollingCoordinatorChromiumTest.cpp:
+ (WebKit::ScrollingCoordinatorChromiumTest::ScrollingCoordinatorChromiumTest):
+ (WebKit::TEST_F):
+ (WebKit):
+ * tests/data/iframe-scrolling-inner.html: Added.
+ * tests/data/iframe-scrolling.html: Added.
+
2013-02-26 Sheriff Bot <webkit.review.bot@gmail.com>
Unreviewed, rolling out r144016.
m_webViewImpl->settings()->setAcceleratedCompositingEnabled(true);
m_webViewImpl->settings()->setAcceleratedCompositingForFixedPositionEnabled(true);
m_webViewImpl->settings()->setAcceleratedCompositingForOverflowScrollEnabled(true);
+ m_webViewImpl->settings()->setAcceleratedCompositingForScrollableFramesEnabled(true);
+ m_webViewImpl->settings()->setCompositedScrollingForFramesEnabled(true);
m_webViewImpl->settings()->setFixedPositionCreatesStackingContext(true);
m_webViewImpl->initializeMainFrame(&m_mockWebFrameClient);
m_webViewImpl->resize(IntSize(320, 240));
WebLayer* webScrollLayer = static_cast<WebLayer*>(layerBacking->scrollingContentsLayer()->platformLayer());
ASSERT_TRUE(webScrollLayer->scrollable());
+
+#if !OS(DARWIN) && !OS(WINDOWS)
+ // Now verify we've attached impl-side scrollbars onto the scrollbar layers
+ ASSERT_TRUE(layerBacking->layerForHorizontalScrollbar());
+ ASSERT_TRUE(layerBacking->layerForHorizontalScrollbar()->hasContentsLayer());
+ ASSERT_TRUE(layerBacking->layerForVerticalScrollbar());
+ ASSERT_TRUE(layerBacking->layerForVerticalScrollbar()->hasContentsLayer());
+#endif
+}
+
+TEST_F(ScrollingCoordinatorChromiumTest, iframeScrolling)
+{
+ registerMockedHttpURLLoad("iframe-scrolling.html");
+ registerMockedHttpURLLoad("iframe-scrolling-inner.html");
+ navigateTo(m_baseURL + "iframe-scrolling.html");
+
+ // Verify the properties of the accelerated scrolling element starting from the RenderObject
+ // all the way to the WebLayer.
+ Element* scrollableFrame = m_webViewImpl->mainFrameImpl()->frame()->document()->getElementById("scrollable");
+ ASSERT_TRUE(scrollableFrame);
+
+ RenderObject* renderer = scrollableFrame->renderer();
+ ASSERT_TRUE(renderer);
+ ASSERT_TRUE(renderer->isWidget());
+
+ RenderWidget* renderWidget = toRenderWidget(renderer);
+ ASSERT_TRUE(renderWidget);
+ ASSERT_TRUE(renderWidget->widget());
+ ASSERT_TRUE(renderWidget->widget()->isFrameView());
+
+ FrameView* innerFrameView = static_cast<FrameView*>(renderWidget->widget());
+ RenderView* innerRenderView = innerFrameView->renderView();
+ ASSERT_TRUE(innerRenderView);
+
+ RenderLayerCompositor* innerCompositor = innerRenderView->compositor();
+ ASSERT_TRUE(innerCompositor->inCompositingMode());
+ ASSERT_TRUE(innerCompositor->scrollLayer());
+
+ GraphicsLayerChromium* scrollLayer = static_cast<GraphicsLayerChromium*>(innerCompositor->scrollLayer());
+ ASSERT_EQ(innerFrameView, scrollLayer->scrollableArea());
+
+ WebLayer* webScrollLayer = static_cast<WebLayer*>(scrollLayer->platformLayer());
+ ASSERT_TRUE(webScrollLayer->scrollable());
+
+#if !OS(DARWIN) && !OS(WINDOWS)
+ // Now verify we've attached impl-side scrollbars onto the scrollbar layers
+ ASSERT_TRUE(innerCompositor->layerForHorizontalScrollbar());
+ ASSERT_TRUE(innerCompositor->layerForHorizontalScrollbar()->hasContentsLayer());
+ ASSERT_TRUE(innerCompositor->layerForVerticalScrollbar());
+ ASSERT_TRUE(innerCompositor->layerForVerticalScrollbar()->hasContentsLayer());
+#endif
}
} // namespace
--- /dev/null
+<!DOCTYPE HTML>
+<html>
+<body style="width:100px;height:100px;">
+</body>
+</html>
--- /dev/null
+<!DOCTYPE html>
+<html>
+<head>
+ <style type="text/css">
+ #scrollable {
+ width: 50px;
+ height: 50px;
+ }
+ </style>
+</head>
+<body>
+<iframe src="iframe-scrolling-inner.html" id="scrollable"/>
+</body>
+</html>