OLD | NEW |
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) 2007 David Smith (catfish.man@gmail.com) | 4 * (C) 2007 David Smith (catfish.man@gmail.com) |
5 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc.
All rights reserved. | 5 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc.
All rights reserved. |
6 * Copyright (C) Research In Motion Limited 2010. All rights reserved. | 6 * Copyright (C) Research In Motion Limited 2010. All rights reserved. |
7 * | 7 * |
8 * This library is free software; you can redistribute it and/or | 8 * This library is free software; you can redistribute it and/or |
9 * modify it under the terms of the GNU Library General Public | 9 * modify it under the terms of the GNU Library General Public |
10 * License as published by the Free Software Foundation; either | 10 * License as published by the Free Software Foundation; either |
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
147 | 147 |
148 LayoutBlock::LayoutBlock(ContainerNode* node) | 148 LayoutBlock::LayoutBlock(ContainerNode* node) |
149 : LayoutBox(node) | 149 : LayoutBox(node) |
150 , m_hasMarginBeforeQuirk(false) | 150 , m_hasMarginBeforeQuirk(false) |
151 , m_hasMarginAfterQuirk(false) | 151 , m_hasMarginAfterQuirk(false) |
152 , m_beingDestroyed(false) | 152 , m_beingDestroyed(false) |
153 , m_hasMarkupTruncation(false) | 153 , m_hasMarkupTruncation(false) |
154 , m_widthAvailableToChildrenChanged(false) | 154 , m_widthAvailableToChildrenChanged(false) |
155 , m_hasOnlySelfCollapsingChildren(false) | 155 , m_hasOnlySelfCollapsingChildren(false) |
156 , m_descendantsWithFloatsMarkedForLayout(false) | 156 , m_descendantsWithFloatsMarkedForLayout(false) |
| 157 , m_needsRecalcLogicalWidthAfterLayoutChildren(false) |
157 { | 158 { |
158 // LayoutBlockFlow calls setChildrenInline(true). | 159 // LayoutBlockFlow calls setChildrenInline(true). |
159 // By default, subclasses do not have inline children. | 160 // By default, subclasses do not have inline children. |
160 } | 161 } |
161 | 162 |
162 static void removeBlockFromDescendantAndContainerMaps(LayoutBlock* block, Tracke
dDescendantsMap*& descendantMap, TrackedContainerMap*& containerMap) | 163 static void removeBlockFromDescendantAndContainerMaps(LayoutBlock* block, Tracke
dDescendantsMap*& descendantMap, TrackedContainerMap*& containerMap) |
163 { | 164 { |
164 if (OwnPtr<TrackedLayoutBoxListHashSet> descendantSet = descendantMap->take(
block)) { | 165 if (OwnPtr<TrackedLayoutBoxListHashSet> descendantSet = descendantMap->take(
block)) { |
165 for (auto& descendant : *descendantSet) { | 166 for (auto& descendant : *descendantSet) { |
166 TrackedContainerMap::iterator it = containerMap->find(descendant); | 167 TrackedContainerMap::iterator it = containerMap->find(descendant); |
(...skipping 2889 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3056 LayoutUnit margin = 0; | 3057 LayoutUnit margin = 0; |
3057 LayoutUnit marginStart = 0; | 3058 LayoutUnit marginStart = 0; |
3058 LayoutUnit marginEnd = 0; | 3059 LayoutUnit marginEnd = 0; |
3059 if (startMarginLength.isFixed()) | 3060 if (startMarginLength.isFixed()) |
3060 marginStart += startMarginLength.value(); | 3061 marginStart += startMarginLength.value(); |
3061 if (endMarginLength.isFixed()) | 3062 if (endMarginLength.isFixed()) |
3062 marginEnd += endMarginLength.value(); | 3063 marginEnd += endMarginLength.value(); |
3063 margin = marginStart + marginEnd; | 3064 margin = marginStart + marginEnd; |
3064 | 3065 |
3065 LayoutUnit childMinPreferredLogicalWidth, childMaxPreferredLogicalWidth; | 3066 LayoutUnit childMinPreferredLogicalWidth, childMaxPreferredLogicalWidth; |
3066 if (child->isBox() && child->isHorizontalWritingMode() != isHorizontalWr
itingMode()) { | 3067 minMaxPreferredLogicalWidthOfChild(*child, childMinPreferredLogicalWidth
, childMaxPreferredLogicalWidth); |
3067 childMinPreferredLogicalWidth = childMaxPreferredLogicalWidth = toLa
youtBox(child)->computeLogicalHeightWithoutLayout(); | |
3068 } else { | |
3069 childMinPreferredLogicalWidth = child->minPreferredLogicalWidth(); | |
3070 childMaxPreferredLogicalWidth = child->maxPreferredLogicalWidth(); | |
3071 } | |
3072 | 3068 |
3073 LayoutUnit w = childMinPreferredLogicalWidth + margin; | 3069 LayoutUnit w = childMinPreferredLogicalWidth + margin; |
3074 minLogicalWidth = std::max(w, minLogicalWidth); | 3070 minLogicalWidth = std::max(w, minLogicalWidth); |
3075 | 3071 |
3076 // IE ignores tables for calculation of nowrap. Makes some sense. | 3072 // IE ignores tables for calculation of nowrap. Makes some sense. |
3077 if (nowrap && !child->isTable()) | 3073 if (nowrap && !child->isTable()) |
3078 maxLogicalWidth = std::max(w, maxLogicalWidth); | 3074 maxLogicalWidth = std::max(w, maxLogicalWidth); |
3079 | 3075 |
3080 w = childMaxPreferredLogicalWidth + margin; | 3076 w = childMaxPreferredLogicalWidth + margin; |
3081 | 3077 |
(...skipping 27 matching lines...) Expand all Loading... |
3109 child = child->nextSibling(); | 3105 child = child->nextSibling(); |
3110 } | 3106 } |
3111 | 3107 |
3112 // Always make sure these values are non-negative. | 3108 // Always make sure these values are non-negative. |
3113 minLogicalWidth = std::max<LayoutUnit>(0, minLogicalWidth); | 3109 minLogicalWidth = std::max<LayoutUnit>(0, minLogicalWidth); |
3114 maxLogicalWidth = std::max<LayoutUnit>(0, maxLogicalWidth); | 3110 maxLogicalWidth = std::max<LayoutUnit>(0, maxLogicalWidth); |
3115 | 3111 |
3116 maxLogicalWidth = std::max(floatLeftWidth + floatRightWidth, maxLogicalWidth
); | 3112 maxLogicalWidth = std::max(floatLeftWidth + floatRightWidth, maxLogicalWidth
); |
3117 } | 3113 } |
3118 | 3114 |
| 3115 void LayoutBlock::minMaxPreferredLogicalWidthOfChild(LayoutObject& child, Layout
Unit& minPreferredLogicalWidth, LayoutUnit& maxPreferredLogicalWidth) const |
| 3116 { |
| 3117 ASSERT(child.parent() == this); |
| 3118 |
| 3119 if (!(child.isBox() && toLayoutBox(child).isWritingModeOrthogonalToParent())
) { |
| 3120 minPreferredLogicalWidth = child.minPreferredLogicalWidth(); |
| 3121 maxPreferredLogicalWidth = child.maxPreferredLogicalWidth(); |
| 3122 return; |
| 3123 } |
| 3124 |
| 3125 #ifdef CRBUG410320_APPROACH_1 |
| 3126 child.layoutIfNeeded(); |
| 3127 #else |
| 3128 // If the child is an orthogonal flow, child's height determines the width,
but the height is not available until layout. |
| 3129 // http://dev.w3.org/csswg/css-writing-modes-3/#orthogonal-shrink-to-fit |
| 3130 if (child.needsLayout()) { |
| 3131 minPreferredLogicalWidth = maxPreferredLogicalWidth = toLayoutBox(child)
.computeLogicalHeightWithoutLayout(); |
| 3132 m_needsRecalcLogicalWidthAfterLayoutChildren = true; |
| 3133 return; |
| 3134 } |
| 3135 #endif |
| 3136 minPreferredLogicalWidth = maxPreferredLogicalWidth = toLayoutBox(child).log
icalHeight(); |
| 3137 } |
| 3138 |
3119 bool LayoutBlock::hasLineIfEmpty() const | 3139 bool LayoutBlock::hasLineIfEmpty() const |
3120 { | 3140 { |
3121 if (!node()) | 3141 if (!node()) |
3122 return false; | 3142 return false; |
3123 | 3143 |
3124 if (node()->isRootEditableElement()) | 3144 if (node()->isRootEditableElement()) |
3125 return true; | 3145 return true; |
3126 | 3146 |
3127 if (node()->isShadowRoot() && isHTMLInputElement(*toShadowRoot(node())->host
())) | 3147 if (node()->isShadowRoot() && isHTMLInputElement(*toShadowRoot(node())->host
())) |
3128 return true; | 3148 return true; |
(...skipping 791 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3920 void LayoutBlock::showLineTreeAndMark(const InlineBox* markedBox1, const char* m
arkedLabel1, const InlineBox* markedBox2, const char* markedLabel2, const Layout
Object* obj) const | 3940 void LayoutBlock::showLineTreeAndMark(const InlineBox* markedBox1, const char* m
arkedLabel1, const InlineBox* markedBox2, const char* markedLabel2, const Layout
Object* obj) const |
3921 { | 3941 { |
3922 showLayoutObject(); | 3942 showLayoutObject(); |
3923 for (const RootInlineBox* root = firstRootBox(); root; root = root->nextRoot
Box()) | 3943 for (const RootInlineBox* root = firstRootBox(); root; root = root->nextRoot
Box()) |
3924 root->showLineTreeAndMark(markedBox1, markedLabel1, markedBox2, markedLa
bel2, obj, 1); | 3944 root->showLineTreeAndMark(markedBox1, markedLabel1, markedBox2, markedLa
bel2, obj, 1); |
3925 } | 3945 } |
3926 | 3946 |
3927 #endif | 3947 #endif |
3928 | 3948 |
3929 } // namespace blink | 3949 } // namespace blink |
OLD | NEW |