| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc. All rights
reserved. | 2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc. All rights
reserved. |
| 3 * | 3 * |
| 4 * Portions are Copyright (C) 1998 Netscape Communications Corporation. | 4 * Portions are Copyright (C) 1998 Netscape Communications Corporation. |
| 5 * | 5 * |
| 6 * Other contributors: | 6 * Other contributors: |
| 7 * Robert O'Callahan <roc+@cs.cmu.edu> | 7 * Robert O'Callahan <roc+@cs.cmu.edu> |
| 8 * David Baron <dbaron@fas.harvard.edu> | 8 * David Baron <dbaron@fas.harvard.edu> |
| 9 * Christian Biesinger <cbiesinger@web.de> | 9 * Christian Biesinger <cbiesinger@web.de> |
| 10 * Randall Jesup <rjesup@wgate.com> | 10 * Randall Jesup <rjesup@wgate.com> |
| (...skipping 277 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 288 } | 288 } |
| 289 | 289 |
| 290 // The caret rect needs to be invalidated after scrolling | 290 // The caret rect needs to be invalidated after scrolling |
| 291 frame->selection().setCaretRectNeedsUpdate(); | 291 frame->selection().setCaretRectNeedsUpdate(); |
| 292 | 292 |
| 293 FloatQuad quadForFakeMouseMoveEvent = FloatQuad(layer()->renderer()->previou
sPaintInvalidationRect()); | 293 FloatQuad quadForFakeMouseMoveEvent = FloatQuad(layer()->renderer()->previou
sPaintInvalidationRect()); |
| 294 | 294 |
| 295 quadForFakeMouseMoveEvent = paintInvalidationContainer->localToAbsoluteQuad(
quadForFakeMouseMoveEvent); | 295 quadForFakeMouseMoveEvent = paintInvalidationContainer->localToAbsoluteQuad(
quadForFakeMouseMoveEvent); |
| 296 frame->eventHandler().dispatchFakeMouseMoveEventSoonInQuad(quadForFakeMouseM
oveEvent); | 296 frame->eventHandler().dispatchFakeMouseMoveEventSoonInQuad(quadForFakeMouseM
oveEvent); |
| 297 | 297 |
| 298 bool requiresPaintInvalidation = true; | 298 // For querying RenderLayer::compositingState() |
| 299 | 299 // This code appears correct, since scrolling outside of layout happens duri
ng activities that do not dirty compositing state. |
| 300 if (box().view()->compositor()->inCompositingMode()) { | 300 DisableCompositingQueryAsserts disabler; |
| 301 // Hits in virtual/gpu/fast/canvas/canvas-scroll-path-into-view.html. | 301 if (box().frameView()->isInPerformLayout()) |
| 302 DisableCompositingQueryAsserts disabler; | 302 box().setShouldDoFullPaintInvalidation(true); |
| 303 bool onlyScrolledCompositedLayers = scrollsOverflow() | 303 else |
| 304 && !layer()->hasVisibleNonLayerContent() | 304 box().invalidatePaintUsingContainer(paintInvalidationContainer, layer()-
>renderer()->previousPaintInvalidationRect(), InvalidationScroll); |
| 305 && !layer()->hasNonCompositedChild() | |
| 306 && !layer()->hasBlockSelectionGapBounds() | |
| 307 && box().style()->backgroundLayers().attachment() != LocalBackground
Attachment; | |
| 308 | |
| 309 if (usesCompositedScrolling() || onlyScrolledCompositedLayers) | |
| 310 requiresPaintInvalidation = false; | |
| 311 } | |
| 312 | |
| 313 // Just schedule a full paint invalidation of our object. | |
| 314 if (requiresPaintInvalidation) { | |
| 315 // For querying RenderLayer::compositingState() | |
| 316 // This code appears correct, since scrolling outside of layout happens
during activities that do not dirty compositing state. | |
| 317 DisableCompositingQueryAsserts disabler; | |
| 318 if (box().frameView()->isInPerformLayout()) | |
| 319 box().setShouldDoFullPaintInvalidation(true); | |
| 320 else | |
| 321 box().invalidatePaintUsingContainer(paintInvalidationContainer, laye
r()->renderer()->previousPaintInvalidationRect(), InvalidationScroll); | |
| 322 } | |
| 323 | 305 |
| 324 // Schedule the scroll DOM event. | 306 // Schedule the scroll DOM event. |
| 325 if (box().node()) | 307 if (box().node()) |
| 326 box().node()->document().enqueueScrollEventForNode(box().node()); | 308 box().node()->document().enqueueScrollEventForNode(box().node()); |
| 327 } | 309 } |
| 328 | 310 |
| 329 IntPoint RenderLayerScrollableArea::scrollPosition() const | 311 IntPoint RenderLayerScrollableArea::scrollPosition() const |
| 330 { | 312 { |
| 331 return IntPoint(m_scrollOffset); | 313 return IntPoint(m_scrollOffset); |
| 332 } | 314 } |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 381 return box().frame() ? box().frame()->eventHandler().lastKnownMousePosition(
) : IntPoint(); | 363 return box().frame() ? box().frame()->eventHandler().lastKnownMousePosition(
) : IntPoint(); |
| 382 } | 364 } |
| 383 | 365 |
| 384 IntRect RenderLayerScrollableArea::scrollableAreaBoundingBox() const | 366 IntRect RenderLayerScrollableArea::scrollableAreaBoundingBox() const |
| 385 { | 367 { |
| 386 return box().absoluteBoundingBoxRect(); | 368 return box().absoluteBoundingBoxRect(); |
| 387 } | 369 } |
| 388 | 370 |
| 389 bool RenderLayerScrollableArea::userInputScrollable(ScrollbarOrientation orienta
tion) const | 371 bool RenderLayerScrollableArea::userInputScrollable(ScrollbarOrientation orienta
tion) const |
| 390 { | 372 { |
| 391 if (box().isIntristicallyScrollable(orientation)) | |
| 392 return true; | |
| 393 | |
| 394 EOverflow overflowStyle = (orientation == HorizontalScrollbar) ? | 373 EOverflow overflowStyle = (orientation == HorizontalScrollbar) ? |
| 395 box().style()->overflowX() : box().style()->overflowY(); | 374 box().style()->overflowX() : box().style()->overflowY(); |
| 396 return (overflowStyle == OSCROLL || overflowStyle == OAUTO || overflowStyle
== OOVERLAY); | 375 return (overflowStyle == OSCROLL || overflowStyle == OAUTO || overflowStyle
== OOVERLAY); |
| 397 } | 376 } |
| 398 | 377 |
| 399 bool RenderLayerScrollableArea::shouldPlaceVerticalScrollbarOnLeft() const | 378 bool RenderLayerScrollableArea::shouldPlaceVerticalScrollbarOnLeft() const |
| 400 { | 379 { |
| 401 return box().style()->shouldPlaceBlockDirectionScrollbarOnLogicalLeft(); | 380 return box().style()->shouldPlaceBlockDirectionScrollbarOnLogicalLeft(); |
| 402 } | 381 } |
| 403 | 382 |
| (...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 616 } | 595 } |
| 617 | 596 |
| 618 if (needsVerticalScrollbar && oldStyle && oldStyle->overflowY() == OSCROLL &
& overflowY != OSCROLL) { | 597 if (needsVerticalScrollbar && oldStyle && oldStyle->overflowY() == OSCROLL &
& overflowY != OSCROLL) { |
| 619 ASSERT(hasVerticalScrollbar()); | 598 ASSERT(hasVerticalScrollbar()); |
| 620 m_vBar->setEnabled(true); | 599 m_vBar->setEnabled(true); |
| 621 } | 600 } |
| 622 } | 601 } |
| 623 | 602 |
| 624 bool RenderLayerScrollableArea::updateAfterCompositingChange() | 603 bool RenderLayerScrollableArea::updateAfterCompositingChange() |
| 625 { | 604 { |
| 626 layer()->updateScrollingStateAfterCompositingChange(); | |
| 627 const bool layersChanged = m_topmostScrollChild != m_nextTopmostScrollChild; | 605 const bool layersChanged = m_topmostScrollChild != m_nextTopmostScrollChild; |
| 628 m_topmostScrollChild = m_nextTopmostScrollChild; | 606 m_topmostScrollChild = m_nextTopmostScrollChild; |
| 629 m_nextTopmostScrollChild = nullptr; | 607 m_nextTopmostScrollChild = nullptr; |
| 630 return layersChanged; | 608 return layersChanged; |
| 631 } | 609 } |
| 632 | 610 |
| 633 void RenderLayerScrollableArea::updateAfterOverflowRecalc() | 611 void RenderLayerScrollableArea::updateAfterOverflowRecalc() |
| 634 { | 612 { |
| 635 computeScrollDimensions(); | 613 computeScrollDimensions(); |
| 636 if (Scrollbar* horizontalScrollbar = this->horizontalScrollbar()) { | 614 if (Scrollbar* horizontalScrollbar = this->horizontalScrollbar()) { |
| (...skipping 266 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 903 if (m_scrollsOverflow) | 881 if (m_scrollsOverflow) |
| 904 frameView->addScrollableArea(this); | 882 frameView->addScrollableArea(this); |
| 905 else | 883 else |
| 906 frameView->removeScrollableArea(this); | 884 frameView->removeScrollableArea(this); |
| 907 } | 885 } |
| 908 | 886 |
| 909 void RenderLayerScrollableArea::updateCompositingLayersAfterScroll() | 887 void RenderLayerScrollableArea::updateCompositingLayersAfterScroll() |
| 910 { | 888 { |
| 911 RenderLayerCompositor* compositor = box().view()->compositor(); | 889 RenderLayerCompositor* compositor = box().view()->compositor(); |
| 912 if (compositor->inCompositingMode()) { | 890 if (compositor->inCompositingMode()) { |
| 913 if (usesCompositedScrolling()) { | 891 layer()->setNeedsCompositingInputsUpdate(); |
| 914 DisableCompositingQueryAsserts disabler; | |
| 915 ASSERT(layer()->hasCompositedLayerMapping()); | |
| 916 layer()->compositedLayerMapping()->setNeedsGraphicsLayerUpdate(Graph
icsLayerUpdateSubtree); | |
| 917 compositor->setNeedsCompositingUpdate(CompositingUpdateAfterGeometry
Change); | |
| 918 } else { | |
| 919 layer()->setNeedsCompositingInputsUpdate(); | |
| 920 } | |
| 921 } | 892 } |
| 922 } | 893 } |
| 923 | 894 |
| 924 bool RenderLayerScrollableArea::usesCompositedScrolling() const | |
| 925 { | |
| 926 // Scroll form controls on the main thread so they exhibit correct touch scr
oll event bubbling | |
| 927 if (box().isIntristicallyScrollable(VerticalScrollbar) || box().isIntristica
llyScrollable(HorizontalScrollbar)) | |
| 928 return false; | |
| 929 | |
| 930 // See https://codereview.chromium.org/176633003/ for the tests that fail wi
thout this disabler. | |
| 931 DisableCompositingQueryAsserts disabler; | |
| 932 return layer()->hasCompositedLayerMapping() && layer()->compositedLayerMappi
ng()->scrollingLayer(); | |
| 933 } | |
| 934 | |
| 935 static bool layerNeedsCompositedScrolling(const RenderLayer* layer) | 895 static bool layerNeedsCompositedScrolling(const RenderLayer* layer) |
| 936 { | 896 { |
| 937 return layer->scrollsOverflow() | 897 return layer->scrollsOverflow() |
| 938 && layer->compositor()->preferCompositingToLCDTextEnabled() | 898 && layer->compositor()->preferCompositingToLCDTextEnabled() |
| 939 && !layer->hasDescendantWithClipPath() | 899 && !layer->hasDescendantWithClipPath() |
| 940 && !layer->hasAncestorWithClipPath(); | 900 && !layer->hasAncestorWithClipPath(); |
| 941 } | 901 } |
| 942 | 902 |
| 943 void RenderLayerScrollableArea::updateNeedsCompositedScrolling() | 903 void RenderLayerScrollableArea::updateNeedsCompositedScrolling() |
| 944 { | 904 { |
| 945 const bool needsCompositedScrolling = layerNeedsCompositedScrolling(layer())
; | 905 const bool needsCompositedScrolling = layerNeedsCompositedScrolling(layer())
; |
| 946 if (static_cast<bool>(m_needsCompositedScrolling) != needsCompositedScrollin
g) { | 906 if (static_cast<bool>(m_needsCompositedScrolling) != needsCompositedScrollin
g) { |
| 947 m_needsCompositedScrolling = needsCompositedScrolling; | 907 m_needsCompositedScrolling = needsCompositedScrolling; |
| 948 layer()->didUpdateNeedsCompositedScrolling(); | 908 layer()->didUpdateNeedsCompositedScrolling(); |
| 949 } | 909 } |
| 950 } | 910 } |
| 951 | 911 |
| 952 void RenderLayerScrollableArea::setTopmostScrollChild(RenderLayer* scrollChild) | 912 void RenderLayerScrollableArea::setTopmostScrollChild(RenderLayer* scrollChild) |
| 953 { | 913 { |
| 954 // We only want to track the topmost scroll child for scrollable areas with | 914 // We only want to track the topmost scroll child for scrollable areas with |
| 955 // overlay scrollbars. | 915 // overlay scrollbars. |
| 956 if (!hasOverlayScrollbars()) | 916 if (!hasOverlayScrollbars()) |
| 957 return; | 917 return; |
| 958 m_nextTopmostScrollChild = scrollChild; | 918 m_nextTopmostScrollChild = scrollChild; |
| 959 } | 919 } |
| 960 | 920 |
| 961 } // namespace blink | 921 } // namespace blink |
| OLD | NEW |