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

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

Issue 1365853003: LayoutBox::scrollRectToVisible doesn't respect overflow:hidden property. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Handle case when overflow-x:hidden and y:scroll Created 5 years, 3 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. All rights reserv ed. 6 * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserv ed.
7 * Copyright (C) 2013 Adobe Systems Incorporated. All rights reserved. 7 * Copyright (C) 2013 Adobe Systems Incorporated. All rights reserved.
8 * 8 *
9 * This library is free software; you can redistribute it and/or 9 * This library is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Library General Public 10 * modify it under the terms of the GNU Library General Public
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
81 static OverrideSizeMap* gOverrideContainingBlockLogicalHeightMap = nullptr; 81 static OverrideSizeMap* gOverrideContainingBlockLogicalHeightMap = nullptr;
82 static OverrideSizeMap* gOverrideContainingBlockLogicalWidthMap = nullptr; 82 static OverrideSizeMap* gOverrideContainingBlockLogicalWidthMap = nullptr;
83 static OverrideSizeMap* gExtraInlineOffsetMap = nullptr; 83 static OverrideSizeMap* gExtraInlineOffsetMap = nullptr;
84 static OverrideSizeMap* gExtraBlockOffsetMap = nullptr; 84 static OverrideSizeMap* gExtraBlockOffsetMap = nullptr;
85 85
86 86
87 // Size of border belt for autoscroll. When mouse pointer in border belt, 87 // Size of border belt for autoscroll. When mouse pointer in border belt,
88 // autoscroll is started. 88 // autoscroll is started.
89 static const int autoscrollBeltSize = 20; 89 static const int autoscrollBeltSize = 20;
90 static const unsigned backgroundObscurationTestMaxDepth = 4; 90 static const unsigned backgroundObscurationTestMaxDepth = 4;
91 static const ScrollAlignment alignNoScroll = { ScrollAlignmentNoScroll, ScrollAl ignmentNoScroll, ScrollAlignmentNoScroll };
91 92
92 LayoutBox::LayoutBox(ContainerNode* node) 93 LayoutBox::LayoutBox(ContainerNode* node)
93 : LayoutBoxModelObject(node) 94 : LayoutBoxModelObject(node)
94 , m_intrinsicContentLogicalHeight(-1) 95 , m_intrinsicContentLogicalHeight(-1)
95 , m_minPreferredLogicalWidth(-1) 96 , m_minPreferredLogicalWidth(-1)
96 , m_maxPreferredLogicalWidth(-1) 97 , m_maxPreferredLogicalWidth(-1)
97 { 98 {
98 setIsBox(); 99 setIsBox();
99 } 100 }
100 101
(...skipping 395 matching lines...) Expand 10 before | Expand all | Expand 10 after
496 if (ownerElement && isHTMLFrameElementBase(*ownerElement)) { 497 if (ownerElement && isHTMLFrameElementBase(*ownerElement)) {
497 HTMLFrameElementBase* frameElementBase = toHTMLFrameElementBase(ownerEle ment); 498 HTMLFrameElementBase* frameElementBase = toHTMLFrameElementBase(ownerEle ment);
498 if (Page* page = frameView->frame().page()) { 499 if (Page* page = frameView->frame().page()) {
499 return page->autoscrollController().autoscrollInProgress() 500 return page->autoscrollController().autoscrollInProgress()
500 && frameElementBase->scrollingMode() == ScrollbarAlwaysOff; 501 && frameElementBase->scrollingMode() == ScrollbarAlwaysOff;
501 } 502 }
502 } 503 }
503 return false; 504 return false;
504 } 505 }
505 506
506 void LayoutBox::scrollRectToVisible(const LayoutRect& rect, const ScrollAlignmen t& alignX, const ScrollAlignment& alignY) 507 bool LayoutBox::scrollRestrictedByLineClamp() const
508 {
509 return parent() ? !parent()->style()->lineClamp().isNone() : false;
510 }
511
512 void LayoutBox::scrollRectToVisible(const LayoutRect& rect, const ScrollAlignmen t& alignX, const ScrollAlignment& alignY, bool programmaticScroll)
507 { 513 {
508 // Presumably the same issue as in setScrollTop. See crbug.com/343132. 514 // Presumably the same issue as in setScrollTop. See crbug.com/343132.
509 DisableCompositingQueryAsserts disabler; 515 DisableCompositingQueryAsserts disabler;
510 516
511 LayoutBox* parentBox = nullptr; 517 LayoutBox* parentBox = nullptr;
512 LayoutRect newRect = rect; 518 LayoutRect newRect = rect;
513 519
514 bool restrictedByLineClamp = false;
515 if (parent()) { 520 if (parent()) {
516 parentBox = parent()->enclosingBox(); 521 parentBox = parent()->enclosingBox();
517 restrictedByLineClamp = !parent()->style()->lineClamp().isNone();
518 } 522 }
519 523
520 if (hasOverflowClip() && !restrictedByLineClamp) { 524 // If the computed style has overflowX/Y set to hidden, we shouldn't scroll
521 // Don't scroll to reveal an overflow layer that is restricted by the -w ebkit-line-clamp property. 525 // into view unless its a programmatic scroll. Note that some LayoutObjects
522 // This will prevent us from revealing text hidden by the slider in Safa ri RSS. 526 // have overflow:hidden set by default (input fields), and so we need to
523 newRect = layer()->scrollableArea()->scrollIntoView(rect, alignX, alignY ); 527 // override this behavior subclasses.
524 } else if (!parentBox && canBeProgramaticallyScrolled()) { 528 if (programmaticScroll || style()->overflowX() != OHIDDEN || style()->overfl owY() != OHIDDEN) {
bokan 2015/09/25 22:26:26 Hmm...I don't like that the knowledge of when scro
525 if (FrameView* frameView = this->frameView()) { 529 ScrollAlignment newAlignX, newAlignY;
526 HTMLFrameOwnerElement* ownerElement = document().ownerElement(); 530 newAlignX = !programmaticScroll && style()->overflowX() == OHIDDEN ? ali gnNoScroll : alignX;
527 if (!isDisallowedAutoscroll(ownerElement, frameView)) { 531 newAlignY = !programmaticScroll && style()->overflowY() == OHIDDEN ? ali gnNoScroll : alignY;
528 frameView->scrollableArea()->scrollIntoView(rect, alignX, alignY ); 532 if (hasOverflowClip() && !scrollRestrictedByLineClamp()) {
533 // Don't scroll to reveal an overflow layer that is restricted by th e -webkit-line-clamp property.
534 // This will prevent us from revealing text hidden by the slider in Safari RSS.
535 newRect = layer()->scrollableArea()->scrollIntoView(rect, newAlignX, newAlignY);
536 } else if (!parentBox && canBeProgramaticallyScrolled()) {
bokan 2015/09/25 22:26:26 canBeProgrammaticallyScrolled seems like it should
537 if (FrameView* frameView = this->frameView()) {
538 HTMLFrameOwnerElement* ownerElement = document().ownerElement();
539 if (!isDisallowedAutoscroll(ownerElement, frameView)) {
540 frameView->scrollableArea()->scrollIntoView(rect, newAlignX, newAlignY);
529 541
530 if (ownerElement && ownerElement->layoutObject()) { 542 if (ownerElement && ownerElement->layoutObject()) {
531 if (frameView->safeToPropagateScrollToParent()) { 543 if (frameView->safeToPropagateScrollToParent()) {
532 parentBox = ownerElement->layoutObject()->enclosingBox() ; 544 parentBox = ownerElement->layoutObject()->enclosingB ox();
533 // FIXME: This doesn't correctly convert the rect to 545 // FIXME: This doesn't correctly convert the rect to
534 // absolute coordinates in the parent. 546 // absolute coordinates in the parent.
535 newRect.setX(rect.x() - frameView->scrollX() + frameView ->x()); 547 newRect.setX(rect.x() - frameView->scrollX() + frame View->x());
536 newRect.setY(rect.y() - frameView->scrollY() + frameView ->y()); 548 newRect.setY(rect.y() - frameView->scrollY() + frame View->y());
537 } else { 549 } else {
538 parentBox = nullptr; 550 parentBox = nullptr;
551 }
539 } 552 }
540 } 553 }
541 } 554 }
542 } 555 }
543 } 556 }
544 557
545 // If we are fixed-position, it is useless to scroll the parent. 558 // If we are fixed-position, it is useless to scroll the parent.
546 if (hasLayer() && layer()->scrollsWithViewport()) 559 if (hasLayer() && layer()->scrollsWithViewport())
547 return; 560 return;
548 561
549 if (frame()->page()->autoscrollController().autoscrollInProgress()) 562 if (frame()->page()->autoscrollController().autoscrollInProgress())
550 parentBox = enclosingScrollableBox(); 563 parentBox = enclosingScrollableBox();
551 564
552 if (parentBox) 565 if (parentBox)
553 parentBox->scrollRectToVisible(newRect, alignX, alignY); 566 parentBox->scrollRectToVisible(newRect, alignX, alignY, programmaticScro ll);
554 } 567 }
555 568
556 void LayoutBox::absoluteRects(Vector<IntRect>& rects, const LayoutPoint& accumul atedOffset) const 569 void LayoutBox::absoluteRects(Vector<IntRect>& rects, const LayoutPoint& accumul atedOffset) const
557 { 570 {
558 rects.append(pixelSnappedIntRect(accumulatedOffset, size())); 571 rects.append(pixelSnappedIntRect(accumulatedOffset, size()));
559 } 572 }
560 573
561 void LayoutBox::absoluteQuads(Vector<FloatQuad>& quads, bool* wasFixed) const 574 void LayoutBox::absoluteQuads(Vector<FloatQuad>& quads, bool* wasFixed) const
562 { 575 {
563 quads.append(localToAbsoluteQuad(FloatRect(0, 0, m_frameRect.width().toFloat (), m_frameRect.height().toFloat()), 0 /* mode */, wasFixed)); 576 quads.append(localToAbsoluteQuad(FloatRect(0, 0, m_frameRect.width().toFloat (), m_frameRect.height().toFloat()), 0 /* mode */, wasFixed));
(...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after
766 { 779 {
767 LocalFrame* frame = this->frame(); 780 LocalFrame* frame = this->frame();
768 if (!frame) 781 if (!frame)
769 return; 782 return;
770 783
771 FrameView* frameView = frame->view(); 784 FrameView* frameView = frame->view();
772 if (!frameView) 785 if (!frameView)
773 return; 786 return;
774 787
775 IntPoint positionInContent = frameView->rootFrameToContents(positionInRootFr ame); 788 IntPoint positionInContent = frameView->rootFrameToContents(positionInRootFr ame);
776 scrollRectToVisible(LayoutRect(positionInContent, LayoutSize(1, 1)), ScrollA lignment::alignToEdgeIfNeeded, ScrollAlignment::alignToEdgeIfNeeded); 789 scrollRectToVisible(LayoutRect(positionInContent, LayoutSize(1, 1)), ScrollA lignment::alignToEdgeIfNeeded, ScrollAlignment::alignToEdgeIfNeeded, false);
777 } 790 }
778 791
779 // There are two kinds of layoutObject that can autoscroll. 792 // There are two kinds of layoutObject that can autoscroll.
780 bool LayoutBox::canAutoscroll() const 793 bool LayoutBox::canAutoscroll() const
781 { 794 {
782 if (node() && node()->isDocumentNode()) 795 if (node() && node()->isDocumentNode())
783 return view()->frameView()->isScrollable(); 796 return view()->frameView()->isScrollable();
784 797
785 // Check for a box that can be scrolled in its own right. 798 // Check for a box that can be scrolled in its own right.
786 return canBeScrolledAndHasScrollableArea(); 799 return canBeScrolledAndHasScrollableArea();
(...skipping 3961 matching lines...) Expand 10 before | Expand all | Expand 10 after
4748 StyleImage* borderImage = style()->borderImage().image(); 4761 StyleImage* borderImage = style()->borderImage().image();
4749 return borderImage && borderImage->canRender(*this, style()->effectiveZoom() ) && borderImage->isLoaded(); 4762 return borderImage && borderImage->canRender(*this, style()->effectiveZoom() ) && borderImage->isLoaded();
4750 } 4763 }
4751 4764
4752 ShapeOutsideInfo* LayoutBox::shapeOutsideInfo() const 4765 ShapeOutsideInfo* LayoutBox::shapeOutsideInfo() const
4753 { 4766 {
4754 return ShapeOutsideInfo::isEnabledFor(*this) ? ShapeOutsideInfo::info(*this) : nullptr; 4767 return ShapeOutsideInfo::isEnabledFor(*this) ? ShapeOutsideInfo::info(*this) : nullptr;
4755 } 4768 }
4756 4769
4757 } // namespace blink 4770 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698