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

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

Issue 1826853007: LayoutBox::mapContentsRectToVisibleRectInBorderBoxSpace() (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@pi
Patch Set: Enable comparison, DO NOT CQ Created 4 years, 8 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) 2000 Dirk Mueller (mueller@kde.org) 4 * (C) 2000 Dirk Mueller (mueller@kde.org)
5 * (C) 2004 Allan Sandfeld Jensen (kde@carewolf.com) 5 * (C) 2004 Allan Sandfeld Jensen (kde@carewolf.com)
6 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2011 Apple Inc. All rights reserv ed. 6 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2011 Apple Inc. All rights reserv ed.
7 * Copyright (C) 2009 Google Inc. All rights reserved. 7 * Copyright (C) 2009 Google Inc. All rights reserved.
8 * Copyright (C) 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmo bile.com/) 8 * Copyright (C) 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmo bile.com/)
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 863 matching lines...) Expand 10 before | Expand all | Expand 10 after
874 o->m_bitfields.setPreferredLogicalWidthsDirty(true); 874 o->m_bitfields.setPreferredLogicalWidthsDirty(true);
875 if (o->style()->hasOutOfFlowPosition()) { 875 if (o->style()->hasOutOfFlowPosition()) {
876 // A positioned object has no effect on the min/max width of its con taining block ever. 876 // A positioned object has no effect on the min/max width of its con taining block ever.
877 // We can optimize this case and not go up any further. 877 // We can optimize this case and not go up any further.
878 break; 878 break;
879 } 879 }
880 o = container; 880 o = container;
881 } 881 }
882 } 882 }
883 883
884 LayoutObject* LayoutObject::containerForAbsolutePosition(const LayoutBoxModelObj ect* paintInvalidationContainer, bool* paintInvalidationContainerSkipped) const 884 LayoutObject* LayoutObject::containerForAbsolutePosition(const LayoutBoxModelObj ect* ancestor, bool* ancestorSkipped) const
885 { 885 {
886 // We technically just want our containing block, but 886 // We technically just want our containing block, but
887 // we may not have one if we're part of an uninstalled 887 // we may not have one if we're part of an uninstalled
888 // subtree. We'll climb as high as we can though. 888 // subtree. We'll climb as high as we can though.
889 for (LayoutObject* object = parent(); object; object = object->parent()) { 889 for (LayoutObject* object = parent(); object; object = object->parent()) {
890 if (object->canContainAbsolutePositionObjects()) 890 if (object->canContainAbsolutePositionObjects())
891 return object; 891 return object;
892 892
893 if (paintInvalidationContainerSkipped && object == paintInvalidationCont ainer) 893 if (ancestorSkipped && object == ancestor)
894 *paintInvalidationContainerSkipped = true; 894 *ancestorSkipped = true;
895 } 895 }
896 return nullptr; 896 return nullptr;
897 } 897 }
898 898
899 LayoutBlock* LayoutObject::containerForFixedPosition(const LayoutBoxModelObject* paintInvalidationContainer, bool* paintInvalidationContainerSkipped) const 899 LayoutBlock* LayoutObject::containerForFixedPosition(const LayoutBoxModelObject* ancestor, bool* ancestorSkipped) const
900 { 900 {
901 ASSERT(!paintInvalidationContainerSkipped || !*paintInvalidationContainerSki pped); 901 ASSERT(!ancestorSkipped || !*ancestorSkipped);
902 ASSERT(!isText()); 902 ASSERT(!isText());
903 903
904 LayoutObject* ancestor = parent(); 904 LayoutObject* object = parent();
905 for (; ancestor && !ancestor->canContainFixedPositionObjects(); ancestor = a ncestor->parent()) { 905 for (; object && !object->canContainFixedPositionObjects(); object = object- >parent()) {
906 if (paintInvalidationContainerSkipped && ancestor == paintInvalidationCo ntainer) 906 if (ancestorSkipped && object == ancestor)
907 *paintInvalidationContainerSkipped = true; 907 *ancestorSkipped = true;
908 } 908 }
909 909
910 ASSERT(!ancestor || !ancestor->isAnonymousBlock()); 910 ASSERT(!object || !object->isAnonymousBlock());
911 return toLayoutBlock(ancestor); 911 return toLayoutBlock(object);
912 } 912 }
913 913
914 LayoutBlock* LayoutObject::containingBlockForAbsolutePosition() const 914 LayoutBlock* LayoutObject::containingBlockForAbsolutePosition() const
915 { 915 {
916 LayoutObject* o = containerForAbsolutePosition(); 916 LayoutObject* o = containerForAbsolutePosition();
917 917
918 // For relpositioned inlines, we return the nearest non-anonymous enclosing block. We don't try 918 // For relpositioned inlines, we return the nearest non-anonymous enclosing block. We don't try
919 // to return the inline itself. This allows us to avoid having a positioned objects 919 // to return the inline itself. This allows us to avoid having a positioned objects
920 // list in all LayoutInlines and lets us return a strongly-typed LayoutBlock * result 920 // list in all LayoutInlines and lets us return a strongly-typed LayoutBlock * result
921 // from this method. The container() method can actually be used to obtain the 921 // from this method. The container() method can actually be used to obtain the
(...skipping 712 matching lines...) Expand 10 before | Expand all | Expand 10 after
1634 1634
1635 LayoutRect LayoutObject::localOverflowRectForPaintInvalidation() const 1635 LayoutRect LayoutObject::localOverflowRectForPaintInvalidation() const
1636 { 1636 {
1637 ASSERT_NOT_REACHED(); 1637 ASSERT_NOT_REACHED();
1638 return LayoutRect(); 1638 return LayoutRect();
1639 } 1639 }
1640 1640
1641 bool LayoutObject::mapToVisibleRectInAncestorSpace(const LayoutBoxModelObject* a ncestor, LayoutRect& rect, VisibleRectFlags visibleRectFlags) const 1641 bool LayoutObject::mapToVisibleRectInAncestorSpace(const LayoutBoxModelObject* a ncestor, LayoutRect& rect, VisibleRectFlags visibleRectFlags) const
1642 { 1642 {
1643 // For any layout object that doesn't override this method (the main example is LayoutText), 1643 // For any layout object that doesn't override this method (the main example is LayoutText),
1644 // the rect is assumed to be in the coordinate space of the object's parent. 1644 // the rect is assumed to be in the contents coordinate space of the object' s parent.
1645 1645
1646 if (ancestor == this) 1646 if (ancestor == this)
1647 return true; 1647 return true;
1648 1648
1649 if (LayoutObject* parent = this->parent()) { 1649 if (LayoutObject* parent = this->parent()) {
1650 if (parent->hasOverflowClip()) { 1650 if (parent->isBox()) {
1651 LayoutBox* parentBox = toLayoutBox(parent); 1651 LayoutBox* parentBox = toLayoutBox(parent);
1652 parentBox->mapScrollingContentsRectToBoxSpace(rect); 1652 if (!parentBox->mapContentsRectToVisibleRectInBorderBoxSpace(rect, v isibleRectFlags))
1653 if (parent != ancestor && !parentBox->applyOverflowClip(rect, visibl eRectFlags))
1654 return false; 1653 return false;
1654
1655 if (parentBox == ancestor || parentBox->isWritingModeRoot())
1656 parentBox->flipForWritingMode(rect);
1655 } 1657 }
1656 1658
1657 return parent->mapToVisibleRectInAncestorSpace(ancestor, rect, visibleRe ctFlags); 1659 return parent->mapToVisibleRectInAncestorSpace(ancestor, rect, visibleRe ctFlags);
1658 } 1660 }
1659 return true; 1661 return true;
1660 } 1662 }
1661 1663
1662 void LayoutObject::dirtyLinesFromChangedChild(LayoutObject*) 1664 void LayoutObject::dirtyLinesFromChangedChild(LayoutObject*)
1663 { 1665 {
1664 } 1666 }
(...skipping 916 matching lines...) Expand 10 before | Expand all | Expand 10 after
2581 2583
2582 if (layoutObject->document().settings() && layoutObject->document().settings ()->shouldRespectImageOrientation()) 2584 if (layoutObject->document().settings() && layoutObject->document().settings ()->shouldRespectImageOrientation())
2583 return RespectImageOrientation; 2585 return RespectImageOrientation;
2584 2586
2585 if (layoutObject->style() && layoutObject->style()->respectImageOrientation( ) == RespectImageOrientation) 2587 if (layoutObject->style() && layoutObject->style()->respectImageOrientation( ) == RespectImageOrientation)
2586 return RespectImageOrientation; 2588 return RespectImageOrientation;
2587 2589
2588 return DoNotRespectImageOrientation; 2590 return DoNotRespectImageOrientation;
2589 } 2591 }
2590 2592
2591 LayoutObject* LayoutObject::container(const LayoutBoxModelObject* paintInvalidat ionContainer, bool* paintInvalidationContainerSkipped) const 2593 LayoutObject* LayoutObject::container(const LayoutBoxModelObject* ancestor, bool * ancestorSkipped) const
2592 { 2594 {
2593 if (paintInvalidationContainerSkipped) 2595 if (ancestorSkipped)
2594 *paintInvalidationContainerSkipped = false; 2596 *ancestorSkipped = false;
2595 2597
2596 LayoutObject* o = parent(); 2598 LayoutObject* o = parent();
2597 2599
2598 if (isTextOrSVGChild()) 2600 if (isTextOrSVGChild())
2599 return o; 2601 return o;
2600 2602
2601 EPosition pos = m_style->position(); 2603 EPosition pos = m_style->position();
2602 if (pos == FixedPosition) 2604 if (pos == FixedPosition)
2603 return containerForFixedPosition(paintInvalidationContainer, paintInvali dationContainerSkipped); 2605 return containerForFixedPosition(ancestor, ancestorSkipped);
2604 2606
2605 if (pos == AbsolutePosition) 2607 if (pos == AbsolutePosition)
2606 return containerForAbsolutePosition(paintInvalidationContainer, paintInv alidationContainerSkipped); 2608 return containerForAbsolutePosition(ancestor, ancestorSkipped);
2607 2609
2608 if (isColumnSpanAll()) { 2610 if (isColumnSpanAll()) {
2609 LayoutObject* multicolContainer = spannerPlaceholder()->container(); 2611 LayoutObject* multicolContainer = spannerPlaceholder()->container();
2610 if (paintInvalidationContainerSkipped && paintInvalidationContainer) { 2612 if (ancestorSkipped && ancestor) {
2611 // We jumped directly from the spanner to the multicol container. Ne ed to check if 2613 // We jumped directly from the spanner to the multicol container. Ne ed to check if
2612 // we skipped |paintInvalidationContainer| on the way. 2614 // we skipped |paintInvalidationContainer| on the way.
2613 for (LayoutObject* walker = parent(); walker && walker != multicolCo ntainer; walker = walker->parent()) { 2615 for (LayoutObject* walker = parent(); walker && walker != multicolCo ntainer; walker = walker->parent()) {
2614 if (walker == paintInvalidationContainer) { 2616 if (walker == ancestor) {
2615 *paintInvalidationContainerSkipped = true; 2617 *ancestorSkipped = true;
2616 break; 2618 break;
2617 } 2619 }
2618 } 2620 }
2619 } 2621 }
2620 return multicolContainer; 2622 return multicolContainer;
2621 } 2623 }
2622 2624
2623 return o; 2625 return o;
2624 } 2626 }
2625 2627
(...skipping 1088 matching lines...) Expand 10 before | Expand all | Expand 10 after
3714 const blink::LayoutObject* root = object1; 3716 const blink::LayoutObject* root = object1;
3715 while (root->parent()) 3717 while (root->parent())
3716 root = root->parent(); 3718 root = root->parent();
3717 root->showLayoutTreeAndMark(object1, "*", object2, "-", 0); 3719 root->showLayoutTreeAndMark(object1, "*", object2, "-", 0);
3718 } else { 3720 } else {
3719 fprintf(stderr, "Cannot showLayoutTree. Root is (nil)\n"); 3721 fprintf(stderr, "Cannot showLayoutTree. Root is (nil)\n");
3720 } 3722 }
3721 } 3723 }
3722 3724
3723 #endif 3725 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698