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) 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 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
68 #include "platform/geometry/DoubleRect.h" | 68 #include "platform/geometry/DoubleRect.h" |
69 #include "platform/geometry/FloatQuad.h" | 69 #include "platform/geometry/FloatQuad.h" |
70 #include "platform/geometry/FloatRoundedRect.h" | 70 #include "platform/geometry/FloatRoundedRect.h" |
71 #include "platform/wtf/PtrUtil.h" | 71 #include "platform/wtf/PtrUtil.h" |
72 | 72 |
73 namespace blink { | 73 namespace blink { |
74 | 74 |
75 // Used by flexible boxes when flexing this element and by table cells. | 75 // Used by flexible boxes when flexing this element and by table cells. |
76 typedef WTF::HashMap<const LayoutBox*, LayoutUnit> OverrideSizeMap; | 76 typedef WTF::HashMap<const LayoutBox*, LayoutUnit> OverrideSizeMap; |
77 | 77 |
78 static OverrideSizeMap* g_extra_inline_offset_map = nullptr; | |
79 static OverrideSizeMap* g_extra_block_offset_map = nullptr; | |
80 | |
81 // Size of border belt for autoscroll. When mouse pointer in border belt, | 78 // Size of border belt for autoscroll. When mouse pointer in border belt, |
82 // autoscroll is started. | 79 // autoscroll is started. |
83 static const int kAutoscrollBeltSize = 20; | 80 static const int kAutoscrollBeltSize = 20; |
84 static const unsigned kBackgroundObscurationTestMaxDepth = 4; | 81 static const unsigned kBackgroundObscurationTestMaxDepth = 4; |
85 | 82 |
86 struct SameSizeAsLayoutBox : public LayoutBoxModelObject { | 83 struct SameSizeAsLayoutBox : public LayoutBoxModelObject { |
87 LayoutRect frame_rect; | 84 LayoutRect frame_rect; |
88 LayoutSize previous_size; | 85 LayoutSize previous_size; |
89 LayoutUnit intrinsic_content_logical_height; | 86 LayoutUnit intrinsic_content_logical_height; |
90 LayoutRectOutsets margin_box_outsets; | 87 LayoutRectOutsets margin_box_outsets; |
(...skipping 26 matching lines...) Expand all Loading... |
117 | 114 |
118 if (HasOverflowClip()) | 115 if (HasOverflowClip()) |
119 return kOverflowClipPaintLayer; | 116 return kOverflowClipPaintLayer; |
120 | 117 |
121 return kNoPaintLayer; | 118 return kNoPaintLayer; |
122 } | 119 } |
123 | 120 |
124 void LayoutBox::WillBeDestroyed() { | 121 void LayoutBox::WillBeDestroyed() { |
125 ClearOverrideSize(); | 122 ClearOverrideSize(); |
126 ClearContainingBlockOverrideSize(); | 123 ClearContainingBlockOverrideSize(); |
127 ClearExtraInlineAndBlockOffests(); | |
128 | 124 |
129 if (IsOutOfFlowPositioned()) | 125 if (IsOutOfFlowPositioned()) |
130 LayoutBlock::RemovePositionedObject(this); | 126 LayoutBlock::RemovePositionedObject(this); |
131 RemoveFromPercentHeightContainer(); | 127 RemoveFromPercentHeightContainer(); |
132 if (IsOrthogonalWritingModeRoot() && !DocumentBeingDestroyed()) | 128 if (IsOrthogonalWritingModeRoot() && !DocumentBeingDestroyed()) |
133 UnmarkOrthogonalWritingModeRoot(); | 129 UnmarkOrthogonalWritingModeRoot(); |
134 | 130 |
135 ShapeOutsideInfo::RemoveInfo(*this); | 131 ShapeOutsideInfo::RemoveInfo(*this); |
136 | 132 |
137 LayoutBoxModelObject::WillBeDestroyed(); | 133 LayoutBoxModelObject::WillBeDestroyed(); |
(...skipping 1300 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1438 | 1434 |
1439 // TODO (lajava) Shouldn't we implement these functions based on physical | 1435 // TODO (lajava) Shouldn't we implement these functions based on physical |
1440 // direction ?. | 1436 // direction ?. |
1441 void LayoutBox::ClearOverrideContainingBlockContentLogicalHeight() { | 1437 void LayoutBox::ClearOverrideContainingBlockContentLogicalHeight() { |
1442 if (!rare_data_) | 1438 if (!rare_data_) |
1443 return; | 1439 return; |
1444 EnsureRareData().has_override_containing_block_content_logical_height_ = | 1440 EnsureRareData().has_override_containing_block_content_logical_height_ = |
1445 false; | 1441 false; |
1446 } | 1442 } |
1447 | 1443 |
1448 LayoutUnit LayoutBox::ExtraInlineOffset() const { | |
1449 return g_extra_inline_offset_map ? g_extra_inline_offset_map->at(this) | |
1450 : LayoutUnit(); | |
1451 } | |
1452 | |
1453 LayoutUnit LayoutBox::ExtraBlockOffset() const { | |
1454 return g_extra_block_offset_map ? g_extra_block_offset_map->at(this) | |
1455 : LayoutUnit(); | |
1456 } | |
1457 | |
1458 void LayoutBox::SetExtraInlineOffset(LayoutUnit inline_offest) { | |
1459 if (!g_extra_inline_offset_map) | |
1460 g_extra_inline_offset_map = new OverrideSizeMap; | |
1461 g_extra_inline_offset_map->Set(this, inline_offest); | |
1462 } | |
1463 | |
1464 void LayoutBox::SetExtraBlockOffset(LayoutUnit block_offest) { | |
1465 if (!g_extra_block_offset_map) | |
1466 g_extra_block_offset_map = new OverrideSizeMap; | |
1467 g_extra_block_offset_map->Set(this, block_offest); | |
1468 } | |
1469 | |
1470 void LayoutBox::ClearExtraInlineAndBlockOffests() { | |
1471 if (g_extra_inline_offset_map) | |
1472 g_extra_inline_offset_map->erase(this); | |
1473 if (g_extra_block_offset_map) | |
1474 g_extra_block_offset_map->erase(this); | |
1475 } | |
1476 | |
1477 LayoutUnit LayoutBox::AdjustBorderBoxLogicalWidthForBoxSizing( | 1444 LayoutUnit LayoutBox::AdjustBorderBoxLogicalWidthForBoxSizing( |
1478 float width) const { | 1445 float width) const { |
1479 LayoutUnit borders_plus_padding = CollapsedBorderAndCSSPaddingLogicalWidth(); | 1446 LayoutUnit borders_plus_padding = CollapsedBorderAndCSSPaddingLogicalWidth(); |
1480 LayoutUnit result(width); | 1447 LayoutUnit result(width); |
1481 if (Style()->BoxSizing() == EBoxSizing::kContentBox) | 1448 if (Style()->BoxSizing() == EBoxSizing::kContentBox) |
1482 return result + borders_plus_padding; | 1449 return result + borders_plus_padding; |
1483 return std::max(result, borders_plus_padding); | 1450 return std::max(result, borders_plus_padding); |
1484 } | 1451 } |
1485 | 1452 |
1486 LayoutUnit LayoutBox::AdjustBorderBoxLogicalHeightForBoxSizing( | 1453 LayoutUnit LayoutBox::AdjustBorderBoxLogicalHeightForBoxSizing( |
(...skipping 2402 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3889 | 3856 |
3890 void LayoutBox::ComputeInlineStaticDistance( | 3857 void LayoutBox::ComputeInlineStaticDistance( |
3891 Length& logical_left, | 3858 Length& logical_left, |
3892 Length& logical_right, | 3859 Length& logical_right, |
3893 const LayoutBox* child, | 3860 const LayoutBox* child, |
3894 const LayoutBoxModelObject* container_block, | 3861 const LayoutBoxModelObject* container_block, |
3895 LayoutUnit container_logical_width) { | 3862 LayoutUnit container_logical_width) { |
3896 if (!logical_left.IsAuto() || !logical_right.IsAuto()) | 3863 if (!logical_left.IsAuto() || !logical_right.IsAuto()) |
3897 return; | 3864 return; |
3898 | 3865 |
| 3866 LayoutObject* parent = child->Parent(); |
| 3867 TextDirection parent_direction = parent->Style()->Direction(); |
| 3868 |
| 3869 // This method is using EnclosingBox() which is wrong for absolutely |
| 3870 // positioned grid items, as they rely on the grid area. So for grid items if |
| 3871 // both "left" and "right" properties are "auto", we can consider that one of |
| 3872 // them (depending on the direction) is simply "0". |
| 3873 if (parent->IsLayoutGrid() && parent == child->ContainingBlock()) { |
| 3874 if (parent_direction == TextDirection::kLtr) |
| 3875 logical_left.SetValue(kFixed, 0); |
| 3876 else |
| 3877 logical_right.SetValue(kFixed, 0); |
| 3878 return; |
| 3879 } |
| 3880 |
3899 // For multicol we also need to keep track of the block position, since that | 3881 // For multicol we also need to keep track of the block position, since that |
3900 // determines which column we're in and thus affects the inline position. | 3882 // determines which column we're in and thus affects the inline position. |
3901 LayoutUnit static_block_position = child->Layer()->StaticBlockPosition(); | 3883 LayoutUnit static_block_position = child->Layer()->StaticBlockPosition(); |
3902 | 3884 |
3903 // FIXME: The static distance computation has not been patched for mixed | 3885 // FIXME: The static distance computation has not been patched for mixed |
3904 // writing modes yet. | 3886 // writing modes yet. |
3905 if (child->Parent()->Style()->Direction() == TextDirection::kLtr) { | 3887 if (parent_direction == TextDirection::kLtr) { |
3906 LayoutUnit static_position = child->Layer()->StaticInlinePosition() - | 3888 LayoutUnit static_position = child->Layer()->StaticInlinePosition() - |
3907 container_block->BorderLogicalLeft(); | 3889 container_block->BorderLogicalLeft(); |
3908 for (LayoutObject* curr = child->Parent(); curr && curr != container_block; | 3890 for (LayoutObject* curr = child->Parent(); curr && curr != container_block; |
3909 curr = curr->Container()) { | 3891 curr = curr->Container()) { |
3910 if (curr->IsBox()) { | 3892 if (curr->IsBox()) { |
3911 static_position += ToLayoutBox(curr)->LogicalLeft(); | 3893 static_position += ToLayoutBox(curr)->LogicalLeft(); |
3912 if (ToLayoutBox(curr)->IsInFlowPositioned()) | 3894 if (ToLayoutBox(curr)->IsInFlowPositioned()) |
3913 static_position += | 3895 static_position += |
3914 ToLayoutBox(curr)->OffsetForInFlowPosition().Width(); | 3896 ToLayoutBox(curr)->OffsetForInFlowPosition().Width(); |
3915 if (curr->IsInsideFlowThread()) | 3897 if (curr->IsInsideFlowThread()) |
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4071 margin_logical_right, min_values); | 4053 margin_logical_right, min_values); |
4072 | 4054 |
4073 if (computed_values.extent_ < min_values.extent_) { | 4055 if (computed_values.extent_ < min_values.extent_) { |
4074 computed_values.extent_ = min_values.extent_; | 4056 computed_values.extent_ = min_values.extent_; |
4075 computed_values.position_ = min_values.position_; | 4057 computed_values.position_ = min_values.position_; |
4076 computed_values.margins_.start_ = min_values.margins_.start_; | 4058 computed_values.margins_.start_ = min_values.margins_.start_; |
4077 computed_values.margins_.end_ = min_values.margins_.end_; | 4059 computed_values.margins_.end_ = min_values.margins_.end_; |
4078 } | 4060 } |
4079 } | 4061 } |
4080 | 4062 |
4081 if (!Style()->HasStaticInlinePosition(is_horizontal)) | |
4082 computed_values.position_ += ExtraInlineOffset(); | |
4083 | |
4084 computed_values.extent_ += borders_plus_padding; | 4063 computed_values.extent_ += borders_plus_padding; |
4085 } | 4064 } |
4086 | 4065 |
4087 void LayoutBox::ComputeLogicalLeftPositionedOffset( | 4066 void LayoutBox::ComputeLogicalLeftPositionedOffset( |
4088 LayoutUnit& logical_left_pos, | 4067 LayoutUnit& logical_left_pos, |
4089 const LayoutBox* child, | 4068 const LayoutBox* child, |
4090 LayoutUnit logical_width_value, | 4069 LayoutUnit logical_width_value, |
4091 const LayoutBoxModelObject* container_block, | 4070 const LayoutBoxModelObject* container_block, |
4092 LayoutUnit container_logical_width) { | 4071 LayoutUnit container_logical_width) { |
4093 // Deal with differing writing modes here. Our offset needs to be in the | 4072 // Deal with differing writing modes here. Our offset needs to be in the |
(...skipping 385 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4479 min_values); | 4458 min_values); |
4480 | 4459 |
4481 if (computed_values.extent_ < min_values.extent_) { | 4460 if (computed_values.extent_ < min_values.extent_) { |
4482 computed_values.extent_ = min_values.extent_; | 4461 computed_values.extent_ = min_values.extent_; |
4483 computed_values.position_ = min_values.position_; | 4462 computed_values.position_ = min_values.position_; |
4484 computed_values.margins_.before_ = min_values.margins_.before_; | 4463 computed_values.margins_.before_ = min_values.margins_.before_; |
4485 computed_values.margins_.after_ = min_values.margins_.after_; | 4464 computed_values.margins_.after_ = min_values.margins_.after_; |
4486 } | 4465 } |
4487 } | 4466 } |
4488 | 4467 |
4489 if (!Style()->HasStaticBlockPosition(IsHorizontalWritingMode())) | |
4490 computed_values.position_ += ExtraBlockOffset(); | |
4491 | |
4492 // Set final height value. | 4468 // Set final height value. |
4493 computed_values.extent_ += borders_plus_padding; | 4469 computed_values.extent_ += borders_plus_padding; |
4494 } | 4470 } |
4495 | 4471 |
4496 void LayoutBox::ComputeLogicalTopPositionedOffset( | 4472 void LayoutBox::ComputeLogicalTopPositionedOffset( |
4497 LayoutUnit& logical_top_pos, | 4473 LayoutUnit& logical_top_pos, |
4498 const LayoutBox* child, | 4474 const LayoutBox* child, |
4499 LayoutUnit logical_height_value, | 4475 LayoutUnit logical_height_value, |
4500 const LayoutBoxModelObject* container_block, | 4476 const LayoutBoxModelObject* container_block, |
4501 LayoutUnit container_logical_height) { | 4477 LayoutUnit container_logical_height) { |
(...skipping 1398 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5900 void LayoutBox::MutableForPainting:: | 5876 void LayoutBox::MutableForPainting:: |
5901 SavePreviousContentBoxSizeAndLayoutOverflowRect() { | 5877 SavePreviousContentBoxSizeAndLayoutOverflowRect() { |
5902 auto& rare_data = GetLayoutBox().EnsureRareData(); | 5878 auto& rare_data = GetLayoutBox().EnsureRareData(); |
5903 rare_data.has_previous_content_box_size_and_layout_overflow_rect_ = true; | 5879 rare_data.has_previous_content_box_size_and_layout_overflow_rect_ = true; |
5904 rare_data.previous_content_box_size_ = GetLayoutBox().ContentBoxRect().Size(); | 5880 rare_data.previous_content_box_size_ = GetLayoutBox().ContentBoxRect().Size(); |
5905 rare_data.previous_layout_overflow_rect_ = | 5881 rare_data.previous_layout_overflow_rect_ = |
5906 GetLayoutBox().LayoutOverflowRect(); | 5882 GetLayoutBox().LayoutOverflowRect(); |
5907 } | 5883 } |
5908 | 5884 |
5909 } // namespace blink | 5885 } // namespace blink |
OLD | NEW |