Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(305)

Side by Side Diff: third_party/WebKit/Source/core/layout/LayoutBox.cpp

Issue 2650343008: Implement Element.scrollIntoView for scroll-behavior: smooth. (Closed)
Patch Set: Added SimTest. Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3 * (C) 1999 Antti Koivisto (koivisto@kde.org) 3 * (C) 1999 Antti Koivisto (koivisto@kde.org)
4 * (C) 2005 Allan Sandfeld Jensen (kde@carewolf.com) 4 * (C) 2005 Allan Sandfeld Jensen (kde@carewolf.com)
5 * (C) 2005, 2006 Samuel Weinig (sam.weinig@gmail.com) 5 * (C) 2005, 2006 Samuel Weinig (sam.weinig@gmail.com)
6 * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Apple Inc. 6 * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Apple Inc.
7 * All rights reserved. 7 * All rights reserved.
8 * Copyright (C) 2013 Adobe Systems Incorporated. All rights reserved. 8 * Copyright (C) 2013 Adobe Systems Incorporated. All rights reserved.
9 * 9 *
10 * This library is free software; you can redistribute it and/or 10 * This library is free software; you can redistribute it and/or
(...skipping 621 matching lines...) Expand 10 before | Expand all | Expand 10 after
632 frameElementBase->scrollingMode() == ScrollbarAlwaysOff; 632 frameElementBase->scrollingMode() == ScrollbarAlwaysOff;
633 } 633 }
634 } 634 }
635 return false; 635 return false;
636 } 636 }
637 637
638 void LayoutBox::scrollRectToVisible(const LayoutRect& rect, 638 void LayoutBox::scrollRectToVisible(const LayoutRect& rect,
639 const ScrollAlignment& alignX, 639 const ScrollAlignment& alignX,
640 const ScrollAlignment& alignY, 640 const ScrollAlignment& alignY,
641 ScrollType scrollType, 641 ScrollType scrollType,
642 bool makeVisibleInVisualViewport) { 642 bool makeVisibleInVisualViewport,
643 ScrollBehavior scrollBehavior) {
643 ASSERT(scrollType == ProgrammaticScroll || scrollType == UserScroll); 644 ASSERT(scrollType == ProgrammaticScroll || scrollType == UserScroll);
644 // Presumably the same issue as in setScrollTop. See crbug.com/343132. 645 // Presumably the same issue as in setScrollTop. See crbug.com/343132.
645 DisableCompositingQueryAsserts disabler; 646 DisableCompositingQueryAsserts disabler;
646 647
647 LayoutRect rectToScroll = rect; 648 LayoutRect rectToScroll = rect;
648 if (rectToScroll.width() <= 0) 649 if (rectToScroll.width() <= 0)
649 rectToScroll.setWidth(LayoutUnit(1)); 650 rectToScroll.setWidth(LayoutUnit(1));
650 if (rectToScroll.height() <= 0) 651 if (rectToScroll.height() <= 0)
651 rectToScroll.setHeight(LayoutUnit(1)); 652 rectToScroll.setHeight(LayoutUnit(1));
652 653
653 LayoutBox* parentBox = nullptr; 654 LayoutBox* parentBox = nullptr;
654 LayoutRect newRect = rectToScroll; 655 LayoutRect newRect = rectToScroll;
655 656
656 bool restrictedByLineClamp = false; 657 bool restrictedByLineClamp = false;
657 if (containingBlock()) { 658 if (containingBlock()) {
658 parentBox = containingBlock(); 659 parentBox = containingBlock();
659 restrictedByLineClamp = !containingBlock()->style()->lineClamp().isNone(); 660 restrictedByLineClamp = !containingBlock()->style()->lineClamp().isNone();
660 } 661 }
661 662
663 bool isSmooth = false;
664 if (scrollBehavior == ScrollBehaviorSmooth ||
665 (scrollBehavior == ScrollBehaviorAuto &&
666 style()->getScrollBehavior() == ScrollBehaviorSmooth)) {
667 isSmooth = true;
668 }
669
662 if (hasOverflowClip() && !restrictedByLineClamp) { 670 if (hasOverflowClip() && !restrictedByLineClamp) {
663 // Don't scroll to reveal an overflow layer that is restricted by the 671 // Don't scroll to reveal an overflow layer that is restricted by the
664 // -webkit-line-clamp property. This will prevent us from revealing text 672 // -webkit-line-clamp property. This will prevent us from revealing text
665 // hidden by the slider in Safari RSS. 673 // hidden by the slider in Safari RSS.
666 // TODO(eae): We probably don't need this any more as we don't share any 674 // TODO(eae): We probably don't need this any more as we don't share any
667 // code with the Safari RSS reeder. 675 // code with the Safari RSS reeder.
668 newRect = getScrollableArea()->scrollIntoView(rectToScroll, alignX, alignY, 676 newRect = getScrollableArea()->scrollIntoView(rectToScroll, alignX, alignY,
669 scrollType); 677 scrollType, isSmooth);
670 if (newRect.isEmpty()) 678 if (newRect.isEmpty())
671 return; 679 return;
672 } else if (!parentBox && canBeProgramaticallyScrolled()) { 680 } else if (!parentBox && canBeProgramaticallyScrolled()) {
673 if (FrameView* frameView = this->frameView()) { 681 if (FrameView* frameView = this->frameView()) {
674 HTMLFrameOwnerElement* ownerElement = document().localOwner(); 682 HTMLFrameOwnerElement* ownerElement = document().localOwner();
675 if (!isDisallowedAutoscroll(ownerElement, frameView)) { 683 if (!isDisallowedAutoscroll(ownerElement, frameView)) {
676 if (makeVisibleInVisualViewport) { 684 if (makeVisibleInVisualViewport) {
677 frameView->getScrollableArea()->scrollIntoView(rectToScroll, alignX, 685 frameView->getScrollableArea()->scrollIntoView(
678 alignY, scrollType); 686 rectToScroll, alignX, alignY, scrollType, isSmooth);
679 } else { 687 } else {
680 frameView->layoutViewportScrollableArea()->scrollIntoView( 688 frameView->layoutViewportScrollableArea()->scrollIntoView(
681 rectToScroll, alignX, alignY, scrollType); 689 rectToScroll, alignX, alignY, scrollType, isSmooth);
682 } 690 }
683 if (ownerElement && ownerElement->layoutObject()) { 691 if (ownerElement && ownerElement->layoutObject()) {
684 if (frameView->safeToPropagateScrollToParent()) { 692 if (frameView->safeToPropagateScrollToParent()) {
685 parentBox = ownerElement->layoutObject()->enclosingBox(); 693 parentBox = ownerElement->layoutObject()->enclosingBox();
686 LayoutView* parentView = ownerElement->layoutObject()->view(); 694 LayoutView* parentView = ownerElement->layoutObject()->view();
687 newRect = enclosingLayoutRect( 695 newRect = enclosingLayoutRect(
688 view() 696 view()
689 ->localToAncestorQuad( 697 ->localToAncestorQuad(
690 FloatRect(rectToScroll), parentView, 698 FloatRect(rectToScroll), parentView,
691 UseTransforms | TraverseDocumentBoundaries) 699 UseTransforms | TraverseDocumentBoundaries)
692 .boundingBox()); 700 .boundingBox());
693 } else { 701 } else {
694 parentBox = nullptr; 702 parentBox = nullptr;
695 } 703 }
696 } 704 }
697 } 705 }
698 } 706 }
699 } 707 }
700 708
701 // If we are fixed-position and stick to the viewport, it is useless to 709 // If we are fixed-position and stick to the viewport, it is useless to
702 // scroll the parent. 710 // scroll the parent.
703 if (style()->position() == EPosition::kFixed && 711 if (style()->position() == EPosition::kFixed &&
704 containerForFixedPosition() == view()) { 712 containerForFixedPosition() == view()) {
705 return; 713 return;
706 } 714 }
707 715
708 if (frame()->page()->autoscrollController().autoscrollInProgress()) 716 if (frame()->page()->autoscrollController().autoscrollInProgress())
709 parentBox = enclosingScrollableBox(); 717 parentBox = enclosingScrollableBox();
710 718
711 if (parentBox) 719 if (parentBox) {
712 parentBox->scrollRectToVisible(newRect, alignX, alignY, scrollType, 720 parentBox->scrollRectToVisible(newRect, alignX, alignY, scrollType,
713 makeVisibleInVisualViewport); 721 makeVisibleInVisualViewport, scrollBehavior);
722 }
714 } 723 }
715 724
716 void LayoutBox::absoluteRects(Vector<IntRect>& rects, 725 void LayoutBox::absoluteRects(Vector<IntRect>& rects,
717 const LayoutPoint& accumulatedOffset) const { 726 const LayoutPoint& accumulatedOffset) const {
718 rects.push_back(pixelSnappedIntRect(accumulatedOffset, size())); 727 rects.push_back(pixelSnappedIntRect(accumulatedOffset, size()));
719 } 728 }
720 729
721 void LayoutBox::absoluteQuads(Vector<FloatQuad>& quads, 730 void LayoutBox::absoluteQuads(Vector<FloatQuad>& quads,
722 MapCoordinatesFlags mode) const { 731 MapCoordinatesFlags mode) const {
723 if (LayoutFlowThread* flowThread = flowThreadContainingBlock()) { 732 if (LayoutFlowThread* flowThread = flowThreadContainingBlock()) {
(...skipping 4991 matching lines...) Expand 10 before | Expand all | Expand 10 after
5715 block->adjustChildDebugRect(rect); 5724 block->adjustChildDebugRect(rect);
5716 5725
5717 return rect; 5726 return rect;
5718 } 5727 }
5719 5728
5720 bool LayoutBox::shouldClipOverflow() const { 5729 bool LayoutBox::shouldClipOverflow() const {
5721 return hasOverflowClip() || styleRef().containsPaint() || hasControlClip(); 5730 return hasOverflowClip() || styleRef().containsPaint() || hasControlClip();
5722 } 5731 }
5723 5732
5724 } // namespace blink 5733 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698