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

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

Issue 1643663002: Conditionally create PaintLayer's scrollable area object (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@PaintLayerClipper
Patch Set: Created 4 years, 9 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 237 matching lines...) Expand 10 before | Expand all | Expand 10 after
248 markOrthogonalWritingModeRoot(); 248 markOrthogonalWritingModeRoot();
249 else 249 else
250 unmarkOrthogonalWritingModeRoot(); 250 unmarkOrthogonalWritingModeRoot();
251 } 251 }
252 252
253 clearPercentHeightDescendants(); 253 clearPercentHeightDescendants();
254 } 254 }
255 255
256 // If our zoom factor changes and we have a defined scrollLeft/Top, we need to adjust that value into the 256 // If our zoom factor changes and we have a defined scrollLeft/Top, we need to adjust that value into the
257 // new zoomed coordinate space. 257 // new zoomed coordinate space.
258 if (hasOverflowClip() && oldStyle && oldStyle->effectiveZoom() != newStyle.e ffectiveZoom() && layer()) { 258 if (hasOverflowClip() && oldStyle && oldStyle->effectiveZoom() != newStyle.e ffectiveZoom()) {
259 if (int left = layer()->scrollableArea()->scrollXOffset()) { 259 PaintLayerScrollableArea* scrollableArea = this->scrollableArea();
chrishtr 2016/02/26 19:07:42 Here and in the various places below, why is the s
Xianzhu 2016/02/26 19:09:54 We always create scrollable area if hasOverflowCli
260 ASSERT(scrollableArea);
261 if (int left = scrollableArea->scrollXOffset()) {
260 left = (left / oldStyle->effectiveZoom()) * newStyle.effectiveZoom() ; 262 left = (left / oldStyle->effectiveZoom()) * newStyle.effectiveZoom() ;
261 layer()->scrollableArea()->scrollToXOffset(left); 263 scrollableArea->scrollToXOffset(left);
262 } 264 }
263 if (int top = layer()->scrollableArea()->scrollYOffset()) { 265 if (int top = scrollableArea->scrollYOffset()) {
264 top = (top / oldStyle->effectiveZoom()) * newStyle.effectiveZoom(); 266 top = (top / oldStyle->effectiveZoom()) * newStyle.effectiveZoom();
265 layer()->scrollableArea()->scrollToYOffset(top); 267 scrollableArea->scrollToYOffset(top);
266 } 268 }
267 } 269 }
268 270
269 // Our opaqueness might have changed without triggering layout. 271 // Our opaqueness might have changed without triggering layout.
270 if (diff.needsPaintInvalidation()) { 272 if (diff.needsPaintInvalidation()) {
271 LayoutObject* parentToInvalidate = parent(); 273 LayoutObject* parentToInvalidate = parent();
272 for (unsigned i = 0; i < backgroundObscurationTestMaxDepth && parentToIn validate; ++i) { 274 for (unsigned i = 0; i < backgroundObscurationTestMaxDepth && parentToIn validate; ++i) {
273 parentToInvalidate->invalidateBackgroundObscurationStatus(); 275 parentToInvalidate->invalidateBackgroundObscurationStatus();
274 parentToInvalidate = parentToInvalidate->parent(); 276 parentToInvalidate = parentToInvalidate->parent();
275 } 277 }
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
370 // For now, it's more simple to just always recompute the grid. 372 // For now, it's more simple to just always recompute the grid.
371 toLayoutGrid(parent())->dirtyGrid(); 373 toLayoutGrid(parent())->dirtyGrid();
372 } 374 }
373 375
374 void LayoutBox::updateFromStyle() 376 void LayoutBox::updateFromStyle()
375 { 377 {
376 LayoutBoxModelObject::updateFromStyle(); 378 LayoutBoxModelObject::updateFromStyle();
377 379
378 const ComputedStyle& styleToUse = styleRef(); 380 const ComputedStyle& styleToUse = styleRef();
379 bool isViewObject = isLayoutView(); 381 bool isViewObject = isLayoutView();
380 bool rootLayerScrolls = document().settings() && document().settings()->root LayerScrolls();
381 382
382 // LayoutView of the main frame is resposible from painting base background. 383 // LayoutView of the main frame is resposible from painting base background.
383 if (isViewObject && !document().ownerElement()) 384 if (isViewObject && !document().ownerElement())
384 setHasBoxDecorationBackground(true); 385 setHasBoxDecorationBackground(true);
385 386
386 setFloating(!isOutOfFlowPositioned() && styleToUse.isFloating()); 387 setFloating(!isOutOfFlowPositioned() && styleToUse.isFloating());
387
388 bool boxHasOverflowClip = false;
Xianzhu 2016/02/25 19:57:51 This part is moved into LayoutBlock::updateFromSty
389 if (!styleToUse.isOverflowVisible() && isLayoutBlock() && (rootLayerScrolls || !isViewObject)) {
390 // If overflow has been propagated to the viewport, it has no effect her e.
391 if (node() != document().viewportDefiningElement())
392 boxHasOverflowClip = true;
393 }
394
395 if (boxHasOverflowClip != hasOverflowClip()) {
396 // FIXME: This shouldn't be required if we tracked the visual overflow
397 // generated by positioned children or self painting layers. crbug.com/3 45403
398 for (LayoutObject* child = slowFirstChild(); child; child = child->nextS ibling())
399 child->setMayNeedPaintInvalidation();
400 }
401
402 setHasOverflowClip(boxHasOverflowClip);
403
404 setHasTransformRelatedProperty(styleToUse.hasTransformRelatedProperty()); 388 setHasTransformRelatedProperty(styleToUse.hasTransformRelatedProperty());
405 setHasReflection(styleToUse.boxReflect()); 389 setHasReflection(styleToUse.boxReflect());
406 } 390 }
407 391
408 void LayoutBox::layout() 392 void LayoutBox::layout()
409 { 393 {
410 ASSERT(needsLayout()); 394 ASSERT(needsLayout());
411 LayoutAnalyzer::Scope analyzer(*this); 395 LayoutAnalyzer::Scope analyzer(*this);
412 396
413 LayoutObject* child = slowFirstChild(); 397 LayoutObject* child = slowFirstChild();
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
454 } 438 }
455 439
456 int LayoutBox::pixelSnappedOffsetHeight() const 440 int LayoutBox::pixelSnappedOffsetHeight() const
457 { 441 {
458 return snapSizeToPixel(offsetHeight(), location().y() + clientTop()); 442 return snapSizeToPixel(offsetHeight(), location().y() + clientTop());
459 } 443 }
460 444
461 LayoutUnit LayoutBox::scrollWidth() const 445 LayoutUnit LayoutBox::scrollWidth() const
462 { 446 {
463 if (hasOverflowClip()) 447 if (hasOverflowClip())
464 return layer()->scrollableArea()->scrollWidth(); 448 return scrollableArea()->scrollWidth();
465 // For objects with visible overflow, this matches IE. 449 // For objects with visible overflow, this matches IE.
466 // FIXME: Need to work right with writing modes. 450 // FIXME: Need to work right with writing modes.
467 if (style()->isLeftToRightDirection()) 451 if (style()->isLeftToRightDirection())
468 return std::max(clientWidth(), layoutOverflowRect().maxX() - borderLeft( )); 452 return std::max(clientWidth(), layoutOverflowRect().maxX() - borderLeft( ));
469 return clientWidth() - std::min(LayoutUnit(), layoutOverflowRect().x() - bor derLeft()); 453 return clientWidth() - std::min(LayoutUnit(), layoutOverflowRect().x() - bor derLeft());
470 } 454 }
471 455
472 LayoutUnit LayoutBox::scrollHeight() const 456 LayoutUnit LayoutBox::scrollHeight() const
473 { 457 {
474 if (hasOverflowClip()) 458 if (hasOverflowClip())
475 return layer()->scrollableArea()->scrollHeight(); 459 return scrollableArea()->scrollHeight();
476 // For objects with visible overflow, this matches IE. 460 // For objects with visible overflow, this matches IE.
477 // FIXME: Need to work right with writing modes. 461 // FIXME: Need to work right with writing modes.
478 return std::max(clientHeight(), layoutOverflowRect().maxY() - borderTop()); 462 return std::max(clientHeight(), layoutOverflowRect().maxY() - borderTop());
479 } 463 }
480 464
481 LayoutUnit LayoutBox::scrollLeft() const 465 LayoutUnit LayoutBox::scrollLeft() const
482 { 466 {
483 return hasOverflowClip() ? LayoutUnit(layer()->scrollableArea()->scrollXOffs et()) : LayoutUnit(); 467 return hasOverflowClip() ? LayoutUnit(scrollableArea()->scrollXOffset()) : L ayoutUnit();
484 } 468 }
485 469
486 LayoutUnit LayoutBox::scrollTop() const 470 LayoutUnit LayoutBox::scrollTop() const
487 { 471 {
488 return hasOverflowClip() ? LayoutUnit(layer()->scrollableArea()->scrollYOffs et()) : LayoutUnit(); 472 return hasOverflowClip() ? LayoutUnit(scrollableArea()->scrollYOffset()) : L ayoutUnit();
489 } 473 }
490 474
491 int LayoutBox::pixelSnappedScrollWidth() const 475 int LayoutBox::pixelSnappedScrollWidth() const
492 { 476 {
493 return snapSizeToPixel(scrollWidth(), location().x() + clientLeft()); 477 return snapSizeToPixel(scrollWidth(), location().x() + clientLeft());
494 } 478 }
495 479
496 int LayoutBox::pixelSnappedScrollHeight() const 480 int LayoutBox::pixelSnappedScrollHeight() const
497 { 481 {
498 if (hasOverflowClip()) 482 if (hasOverflowClip())
499 return snapSizeToPixel(layer()->scrollableArea()->scrollHeight(), locati on().y() + clientTop()); 483 return snapSizeToPixel(scrollableArea()->scrollHeight(), location().y() + clientTop());
500 // For objects with visible overflow, this matches IE. 484 // For objects with visible overflow, this matches IE.
501 // FIXME: Need to work right with writing modes. 485 // FIXME: Need to work right with writing modes.
502 return snapSizeToPixel(scrollHeight(), location().y() + clientTop()); 486 return snapSizeToPixel(scrollHeight(), location().y() + clientTop());
503 } 487 }
504 488
505 void LayoutBox::setScrollLeft(LayoutUnit newLeft) 489 void LayoutBox::setScrollLeft(LayoutUnit newLeft)
506 { 490 {
507 // This doesn't hit in any tests, but since the equivalent code in setScroll Top 491 // This doesn't hit in any tests, but since the equivalent code in setScroll Top
508 // does, presumably this code does as well. 492 // does, presumably this code does as well.
509 DisableCompositingQueryAsserts disabler; 493 DisableCompositingQueryAsserts disabler;
510 494
511 if (hasOverflowClip()) 495 if (hasOverflowClip())
512 layer()->scrollableArea()->scrollToXOffset(newLeft, ScrollOffsetClamped, ScrollBehaviorAuto); 496 scrollableArea()->scrollToXOffset(newLeft, ScrollOffsetClamped, ScrollBe haviorAuto);
513 } 497 }
514 498
515 void LayoutBox::setScrollTop(LayoutUnit newTop) 499 void LayoutBox::setScrollTop(LayoutUnit newTop)
516 { 500 {
517 // Hits in compositing/overflow/do-not-assert-on-invisible-composited-layers .html 501 // Hits in compositing/overflow/do-not-assert-on-invisible-composited-layers .html
518 DisableCompositingQueryAsserts disabler; 502 DisableCompositingQueryAsserts disabler;
519 503
520 if (hasOverflowClip()) 504 if (hasOverflowClip())
521 layer()->scrollableArea()->scrollToYOffset(newTop, ScrollOffsetClamped, ScrollBehaviorAuto); 505 scrollableArea()->scrollToYOffset(newTop, ScrollOffsetClamped, ScrollBeh aviorAuto);
522 } 506 }
523 507
524 void LayoutBox::scrollToOffset(const DoubleSize& offset, ScrollBehavior scrollBe havior) 508 void LayoutBox::scrollToOffset(const DoubleSize& offset, ScrollBehavior scrollBe havior)
525 { 509 {
526 // This doesn't hit in any tests, but since the equivalent code in setScroll Top 510 // This doesn't hit in any tests, but since the equivalent code in setScroll Top
527 // does, presumably this code does as well. 511 // does, presumably this code does as well.
528 DisableCompositingQueryAsserts disabler; 512 DisableCompositingQueryAsserts disabler;
529 513
530 if (hasOverflowClip()) 514 if (hasOverflowClip())
531 layer()->scrollableArea()->scrollToOffset(offset, ScrollOffsetClamped, s crollBehavior); 515 scrollableArea()->scrollToOffset(offset, ScrollOffsetClamped, scrollBeha vior);
532 } 516 }
533 517
534 // Returns true iff we are attempting an autoscroll inside an iframe with scroll ing="no". 518 // Returns true iff we are attempting an autoscroll inside an iframe with scroll ing="no".
535 static bool isDisallowedAutoscroll(HTMLFrameOwnerElement* ownerElement, FrameVie w* frameView) 519 static bool isDisallowedAutoscroll(HTMLFrameOwnerElement* ownerElement, FrameVie w* frameView)
536 { 520 {
537 if (ownerElement && isHTMLFrameElementBase(*ownerElement)) { 521 if (ownerElement && isHTMLFrameElementBase(*ownerElement)) {
538 HTMLFrameElementBase* frameElementBase = toHTMLFrameElementBase(ownerEle ment); 522 HTMLFrameElementBase* frameElementBase = toHTMLFrameElementBase(ownerEle ment);
539 if (Page* page = frameView->frame().page()) { 523 if (Page* page = frameView->frame().page()) {
540 return page->autoscrollController().autoscrollInProgress() 524 return page->autoscrollController().autoscrollInProgress()
541 && frameElementBase->scrollingMode() == ScrollbarAlwaysOff; 525 && frameElementBase->scrollingMode() == ScrollbarAlwaysOff;
(...skipping 13 matching lines...) Expand all
555 539
556 bool restrictedByLineClamp = false; 540 bool restrictedByLineClamp = false;
557 if (parent()) { 541 if (parent()) {
558 parentBox = parent()->enclosingBox(); 542 parentBox = parent()->enclosingBox();
559 restrictedByLineClamp = !parent()->style()->lineClamp().isNone(); 543 restrictedByLineClamp = !parent()->style()->lineClamp().isNone();
560 } 544 }
561 545
562 if (hasOverflowClip() && !restrictedByLineClamp) { 546 if (hasOverflowClip() && !restrictedByLineClamp) {
563 // Don't scroll to reveal an overflow layer that is restricted by the -w ebkit-line-clamp property. 547 // Don't scroll to reveal an overflow layer that is restricted by the -w ebkit-line-clamp property.
564 // This will prevent us from revealing text hidden by the slider in Safa ri RSS. 548 // This will prevent us from revealing text hidden by the slider in Safa ri RSS.
565 newRect = layer()->scrollableArea()->scrollIntoView(rect, alignX, alignY , scrollType); 549 newRect = scrollableArea()->scrollIntoView(rect, alignX, alignY, scrollT ype);
566 } else if (!parentBox && canBeProgramaticallyScrolled()) { 550 } else if (!parentBox && canBeProgramaticallyScrolled()) {
567 if (FrameView* frameView = this->frameView()) { 551 if (FrameView* frameView = this->frameView()) {
568 HTMLFrameOwnerElement* ownerElement = document().ownerElement(); 552 HTMLFrameOwnerElement* ownerElement = document().ownerElement();
569 if (!isDisallowedAutoscroll(ownerElement, frameView)) { 553 if (!isDisallowedAutoscroll(ownerElement, frameView)) {
570 if (makeVisibleInVisualViewport) { 554 if (makeVisibleInVisualViewport) {
571 frameView->scrollableArea()->scrollIntoView(rect, alignX, al ignY, scrollType); 555 frameView->scrollableArea()->scrollIntoView(rect, alignX, al ignY, scrollType);
572 } else { 556 } else {
573 frameView->layoutViewportScrollableArea()->scrollIntoView(re ct, alignX, alignY, scrollType); 557 frameView->layoutViewportScrollableArea()->scrollIntoView(re ct, alignX, alignY, scrollType);
574 } 558 }
575 if (ownerElement && ownerElement->layoutObject()) { 559 if (ownerElement && ownerElement->layoutObject()) {
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after
752 break; 736 break;
753 } 737 }
754 return result; 738 return result;
755 } 739 }
756 740
757 int LayoutBox::verticalScrollbarWidth() const 741 int LayoutBox::verticalScrollbarWidth() const
758 { 742 {
759 if (!hasOverflowClip() || style()->overflowY() == OOVERLAY) 743 if (!hasOverflowClip() || style()->overflowY() == OOVERLAY)
760 return 0; 744 return 0;
761 745
762 return layer()->scrollableArea()->verticalScrollbarWidth(); 746 return scrollableArea()->verticalScrollbarWidth();
763 } 747 }
764 748
765 int LayoutBox::horizontalScrollbarHeight() const 749 int LayoutBox::horizontalScrollbarHeight() const
766 { 750 {
767 if (!hasOverflowClip() || style()->overflowX() == OOVERLAY) 751 if (!hasOverflowClip() || style()->overflowX() == OOVERLAY)
768 return 0; 752 return 0;
769 753
770 return layer()->scrollableArea()->horizontalScrollbarHeight(); 754 return scrollableArea()->horizontalScrollbarHeight();
771 } 755 }
772 756
773 int LayoutBox::intrinsicScrollbarLogicalWidth() const 757 int LayoutBox::intrinsicScrollbarLogicalWidth() const
774 { 758 {
775 if (!hasOverflowClip()) 759 if (!hasOverflowClip())
776 return 0; 760 return 0;
777 761
762 ASSERT(scrollableArea());
763
778 if (isHorizontalWritingMode() && style()->overflowY() == OSCROLL) { 764 if (isHorizontalWritingMode() && style()->overflowY() == OSCROLL) {
779 ASSERT(layer()->scrollableArea());
780 // Even with OSCROLL, the scrollbar may not exist (crbug.com/415031). 765 // Even with OSCROLL, the scrollbar may not exist (crbug.com/415031).
781 return layer()->scrollableArea()->hasVerticalScrollbar() ? verticalScrol lbarWidth() : 0; 766 return scrollableArea()->hasVerticalScrollbar() ? verticalScrollbarWidth () : 0;
782 } 767 }
783 768
784 if (!isHorizontalWritingMode() && style()->overflowX() == OSCROLL) { 769 if (!isHorizontalWritingMode() && style()->overflowX() == OSCROLL) {
785 ASSERT(layer()->scrollableArea());
786 // Even with OSCROLL, the scrollbar may not exist (crbug.com/415031). 770 // Even with OSCROLL, the scrollbar may not exist (crbug.com/415031).
787 return layer()->scrollableArea()->hasHorizontalScrollbar() ? horizontalS crollbarHeight() : 0; 771 return scrollableArea()->hasHorizontalScrollbar() ? horizontalScrollbarH eight() : 0;
788 } 772 }
789 773
790 return 0; 774 return 0;
791 } 775 }
792 776
793 ScrollResultOneDimensional LayoutBox::scroll(ScrollDirectionPhysical direction, ScrollGranularity granularity, float delta) 777 ScrollResultOneDimensional LayoutBox::scroll(ScrollDirectionPhysical direction, ScrollGranularity granularity, float delta)
794 { 778 {
795 // Presumably the same issue as in setScrollTop. See crbug.com/343132. 779 // Presumably the same issue as in setScrollTop. See crbug.com/343132.
796 DisableCompositingQueryAsserts disabler; 780 DisableCompositingQueryAsserts disabler;
797 781
798 if (!layer() || !layer()->scrollableArea()) 782 if (!scrollableArea())
799 return ScrollResultOneDimensional(false); 783 return ScrollResultOneDimensional(false);
800 784
801 return layer()->scrollableArea()->userScroll(direction, granularity, delta); 785 return scrollableArea()->userScroll(direction, granularity, delta);
802 } 786 }
803 787
804 bool LayoutBox::canBeScrolledAndHasScrollableArea() const 788 bool LayoutBox::canBeScrolledAndHasScrollableArea() const
805 { 789 {
806 return canBeProgramaticallyScrolled() && (pixelSnappedScrollHeight() != pixe lSnappedClientHeight() || pixelSnappedScrollWidth() != pixelSnappedClientWidth() ); 790 return canBeProgramaticallyScrolled() && (pixelSnappedScrollHeight() != pixe lSnappedClientHeight() || pixelSnappedScrollWidth() != pixelSnappedClientWidth() );
807 } 791 }
808 792
809 bool LayoutBox::canBeProgramaticallyScrolled() const 793 bool LayoutBox::canBeProgramaticallyScrolled() const
810 { 794 {
811 Node* node = this->node(); 795 Node* node = this->node();
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
935 void LayoutBox::scrollByRecursively(const DoubleSize& delta, ScrollOffsetClampin g clamp) 919 void LayoutBox::scrollByRecursively(const DoubleSize& delta, ScrollOffsetClampin g clamp)
936 { 920 {
937 if (delta.isZero()) 921 if (delta.isZero())
938 return; 922 return;
939 923
940 bool restrictedByLineClamp = false; 924 bool restrictedByLineClamp = false;
941 if (parent()) 925 if (parent())
942 restrictedByLineClamp = !parent()->style()->lineClamp().isNone(); 926 restrictedByLineClamp = !parent()->style()->lineClamp().isNone();
943 927
944 if (hasOverflowClip() && !restrictedByLineClamp) { 928 if (hasOverflowClip() && !restrictedByLineClamp) {
945 DoubleSize newScrollOffset = layer()->scrollableArea()->adjustedScrollOf fset() + delta; 929 PaintLayerScrollableArea* scrollableArea = this->scrollableArea();
946 layer()->scrollableArea()->scrollToOffset(newScrollOffset, clamp); 930 ASSERT(scrollableArea);
931
932 DoubleSize newScrollOffset = scrollableArea->adjustedScrollOffset() + de lta;
933 scrollableArea->scrollToOffset(newScrollOffset, clamp);
947 934
948 // If this layer can't do the scroll we ask the next layer up that can s croll to try 935 // If this layer can't do the scroll we ask the next layer up that can s croll to try
949 DoubleSize remainingScrollOffset = newScrollOffset - layer()->scrollable Area()->adjustedScrollOffset(); 936 DoubleSize remainingScrollOffset = newScrollOffset - scrollableArea->adj ustedScrollOffset();
950 if (!remainingScrollOffset.isZero() && parent()) { 937 if (!remainingScrollOffset.isZero() && parent()) {
951 if (LayoutBox* scrollableBox = enclosingScrollableBox()) 938 if (LayoutBox* scrollableBox = enclosingScrollableBox())
952 scrollableBox->scrollByRecursively(remainingScrollOffset, clamp) ; 939 scrollableBox->scrollByRecursively(remainingScrollOffset, clamp) ;
953 940
954 LocalFrame* frame = this->frame(); 941 LocalFrame* frame = this->frame();
955 if (frame && frame->page()) 942 if (frame && frame->page())
956 frame->page()->autoscrollController().updateAutoscrollLayoutObje ct(); 943 frame->page()->autoscrollController().updateAutoscrollLayoutObje ct();
957 } 944 }
958 } else if (view()->frameView()) { 945 } else if (view()->frameView()) {
959 // If we are here, we were called on a layoutObject that can be programm atically scrolled, but doesn't 946 // If we are here, we were called on a layoutObject that can be programm atically scrolled, but doesn't
960 // have an overflow clip. Which means that it is a document node that ca n be scrolled. 947 // have an overflow clip. Which means that it is a document node that ca n be scrolled.
961 // FIXME: Pass in DoubleSize. crbug.com/414283. 948 // FIXME: Pass in DoubleSize. crbug.com/414283.
962 view()->frameView()->scrollBy(flooredIntSize(delta), UserScroll); 949 view()->frameView()->scrollBy(flooredIntSize(delta), UserScroll);
963 950
964 // FIXME: If we didn't scroll the whole way, do we want to try looking a t the frames ownerElement? 951 // FIXME: If we didn't scroll the whole way, do we want to try looking a t the frames ownerElement?
965 // https://bugs.webkit.org/show_bug.cgi?id=28237 952 // https://bugs.webkit.org/show_bug.cgi?id=28237
966 } 953 }
967 } 954 }
968 955
969 bool LayoutBox::needsPreferredWidthsRecalculation() const 956 bool LayoutBox::needsPreferredWidthsRecalculation() const
970 { 957 {
971 return style()->paddingStart().hasPercent() || style()->paddingEnd().hasPerc ent(); 958 return style()->paddingStart().hasPercent() || style()->paddingEnd().hasPerc ent();
972 } 959 }
973 960
974 IntSize LayoutBox::scrolledContentOffset() const 961 IntSize LayoutBox::scrolledContentOffset() const
975 { 962 {
976 ASSERT(hasOverflowClip()); 963 ASSERT(hasOverflowClip());
977 ASSERT(hasLayer()); 964 ASSERT(hasLayer());
978 // FIXME: Return DoubleSize here. crbug.com/414283. 965 // FIXME: Return DoubleSize here. crbug.com/414283.
979 return flooredIntSize(layer()->scrollableArea()->scrollOffset()); 966 return flooredIntSize(scrollableArea()->scrollOffset());
980 } 967 }
981 968
982 void LayoutBox::mapScrollingContentsRectToBoxSpace(LayoutRect& rect) const 969 void LayoutBox::mapScrollingContentsRectToBoxSpace(LayoutRect& rect) const
983 { 970 {
984 ASSERT(hasLayer()); 971 ASSERT(hasLayer());
985 ASSERT(hasOverflowClip()); 972 ASSERT(hasOverflowClip());
986 973
987 LayoutSize offset = LayoutSize(-scrolledContentOffset()); 974 LayoutSize offset = LayoutSize(-scrolledContentOffset());
988 if (UNLIKELY(hasFlippedBlocksWritingMode())) { 975 if (UNLIKELY(hasFlippedBlocksWritingMode())) {
989 if (isHorizontalWritingMode()) 976 if (isHorizontalWritingMode())
(...skipping 565 matching lines...) Expand 10 before | Expand all | Expand 10 after
1555 clipRect.setLocation(location + clipRect.location() + LayoutSize(borderLeft( ), borderTop())); 1542 clipRect.setLocation(location + clipRect.location() + LayoutSize(borderLeft( ), borderTop()));
1556 clipRect.setSize(clipRect.size() - LayoutSize(borderLeft() + borderRight(), borderTop() + borderBottom())); 1543 clipRect.setSize(clipRect.size() - LayoutSize(borderLeft() + borderRight(), borderTop() + borderBottom()));
1557 1544
1558 if (hasOverflowClip()) 1545 if (hasOverflowClip())
1559 excludeScrollbars(clipRect, relevancy); 1546 excludeScrollbars(clipRect, relevancy);
1560 return clipRect; 1547 return clipRect;
1561 } 1548 }
1562 1549
1563 void LayoutBox::excludeScrollbars(LayoutRect& rect, OverlayScrollbarSizeRelevanc y relevancy) const 1550 void LayoutBox::excludeScrollbars(LayoutRect& rect, OverlayScrollbarSizeRelevanc y relevancy) const
1564 { 1551 {
1565 if (shouldPlaceBlockDirectionScrollbarOnLogicalLeft()) 1552 if (PaintLayerScrollableArea* scrollableArea = this->scrollableArea()) {
1566 rect.move(layer()->scrollableArea()->verticalScrollbarWidth(relevancy), 0); 1553 if (shouldPlaceBlockDirectionScrollbarOnLogicalLeft())
1567 rect.contract(layer()->scrollableArea()->verticalScrollbarWidth(relevancy), layer()->scrollableArea()->horizontalScrollbarHeight(relevancy)); 1554 rect.move(scrollableArea->verticalScrollbarWidth(relevancy), 0);
1555 rect.contract(scrollableArea->verticalScrollbarWidth(relevancy), scrolla bleArea->horizontalScrollbarHeight(relevancy));
1556 }
1568 } 1557 }
1569 1558
1570 LayoutRect LayoutBox::clipRect(const LayoutPoint& location) const 1559 LayoutRect LayoutBox::clipRect(const LayoutPoint& location) const
1571 { 1560 {
1572 LayoutRect borderBoxRect = this->borderBoxRect(); 1561 LayoutRect borderBoxRect = this->borderBoxRect();
1573 LayoutRect clipRect = LayoutRect(borderBoxRect.location() + location, border BoxRect.size()); 1562 LayoutRect clipRect = LayoutRect(borderBoxRect.location() + location, border BoxRect.size());
1574 1563
1575 if (!style()->clipLeft().isAuto()) { 1564 if (!style()->clipLeft().isAuto()) {
1576 LayoutUnit c = valueForLength(style()->clipLeft(), borderBoxRect.width() ); 1565 LayoutUnit c = valueForLength(style()->clipLeft(), borderBoxRect.width() );
1577 clipRect.move(c, LayoutUnit()); 1566 clipRect.move(c, LayoutUnit());
(...skipping 2176 matching lines...) Expand 10 before | Expand all | Expand 10 after
3754 return node && node->isElementNode() && (toElement(node)->isFormControlEleme nt() || isHTMLImageElement(toElement(node))); 3743 return node && node->isElementNode() && (toElement(node)->isFormControlEleme nt() || isHTMLImageElement(toElement(node)));
3755 } 3744 }
3756 3745
3757 bool LayoutBox::avoidsFloats() const 3746 bool LayoutBox::avoidsFloats() const
3758 { 3747 {
3759 return isAtomicInlineLevel() || shouldBeConsideredAsReplaced(node()) || hasO verflowClip() || isHR() || isLegend() || isWritingModeRoot() || isFlexItemInclud ingDeprecated() || style()->containsPaint(); 3748 return isAtomicInlineLevel() || shouldBeConsideredAsReplaced(node()) || hasO verflowClip() || isHR() || isLegend() || isWritingModeRoot() || isFlexItemInclud ingDeprecated() || style()->containsPaint();
3760 } 3749 }
3761 3750
3762 bool LayoutBox::hasNonCompositedScrollbars() const 3751 bool LayoutBox::hasNonCompositedScrollbars() const
3763 { 3752 {
3764 if (PaintLayer* layer = this->layer()) { 3753 if (PaintLayerScrollableArea* scrollableArea = this->scrollableArea()) {
3765 if (PaintLayerScrollableArea* scrollableArea = layer->scrollableArea()) { 3754 if (scrollableArea->hasHorizontalScrollbar() && !scrollableArea->layerFo rHorizontalScrollbar())
3766 if (scrollableArea->hasHorizontalScrollbar() && !scrollableArea->lay erForHorizontalScrollbar()) 3755 return true;
3767 return true; 3756 if (scrollableArea->hasVerticalScrollbar() && !scrollableArea->layerForV erticalScrollbar())
3768 if (scrollableArea->hasVerticalScrollbar() && !scrollableArea->layer ForVerticalScrollbar()) 3757 return true;
3769 return true;
3770 }
3771 } 3758 }
3772 return false; 3759 return false;
3773 } 3760 }
3774 3761
3775 PaintInvalidationReason LayoutBox::paintInvalidationReason(const LayoutBoxModelO bject& paintInvalidationContainer, 3762 PaintInvalidationReason LayoutBox::paintInvalidationReason(const LayoutBoxModelO bject& paintInvalidationContainer,
3776 const LayoutRect& oldBounds, const LayoutPoint& oldLocation, const LayoutRec t& newBounds, const LayoutPoint& newLocation) const 3763 const LayoutRect& oldBounds, const LayoutPoint& oldLocation, const LayoutRec t& newBounds, const LayoutPoint& newLocation) const
3777 { 3764 {
3778 PaintInvalidationReason invalidationReason = LayoutBoxModelObject::paintInva lidationReason(paintInvalidationContainer, oldBounds, oldLocation, newBounds, ne wLocation); 3765 PaintInvalidationReason invalidationReason = LayoutBoxModelObject::paintInva lidationReason(paintInvalidationContainer, oldBounds, oldLocation, newBounds, ne wLocation);
3779 if (isFullPaintInvalidationReason(invalidationReason)) 3766 if (isFullPaintInvalidationReason(invalidationReason))
3780 return invalidationReason; 3767 return invalidationReason;
(...skipping 901 matching lines...) Expand 10 before | Expand all | Expand 10 after
4682 } 4669 }
4683 4670
4684 void LayoutBox::IntrinsicSizingInfo::transpose() 4671 void LayoutBox::IntrinsicSizingInfo::transpose()
4685 { 4672 {
4686 size = size.transposedSize(); 4673 size = size.transposedSize();
4687 aspectRatio = aspectRatio.transposedSize(); 4674 aspectRatio = aspectRatio.transposedSize();
4688 std::swap(hasWidth, hasHeight); 4675 std::swap(hasWidth, hasHeight);
4689 } 4676 }
4690 4677
4691 } // namespace blink 4678 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698