Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "core/paint/PaintPropertyTreeBuilder.h" | 5 #include "core/paint/PaintPropertyTreeBuilder.h" |
| 6 | 6 |
| 7 #include <memory> | 7 #include <memory> |
| 8 #include "core/dom/DOMNodeIds.h" | 8 #include "core/dom/DOMNodeIds.h" |
| 9 #include "core/frame/FrameView.h" | 9 #include "core/frame/FrameView.h" |
| 10 #include "core/frame/LocalFrame.h" | 10 #include "core/frame/LocalFrame.h" |
| (...skipping 732 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 743 } else { | 743 } else { |
| 744 PropertyTreeState local_border_box = | 744 PropertyTreeState local_border_box = |
| 745 PropertyTreeState(context.current.transform, context.current.clip, | 745 PropertyTreeState(context.current.transform, context.current.clip, |
| 746 context.current_effect); | 746 context.current_effect); |
| 747 object.GetMutableForPainting().SetLocalBorderBoxProperties( | 747 object.GetMutableForPainting().SetLocalBorderBoxProperties( |
| 748 local_border_box); | 748 local_border_box); |
| 749 } | 749 } |
| 750 } | 750 } |
| 751 | 751 |
| 752 static bool NeedsScrollbarPaintOffset(const LayoutObject& object) { | 752 static bool NeedsScrollbarPaintOffset(const LayoutObject& object) { |
| 753 if (object.IsBoxModelObject()) { | 753 if (!object.IsBoxModelObject()) |
| 754 if (auto* area = ToLayoutBoxModelObject(object).GetScrollableArea()) { | 754 return false; |
| 755 if (area->HorizontalScrollbar() || area->VerticalScrollbar()) | 755 if (auto* area = ToLayoutBoxModelObject(object).GetScrollableArea()) { |
| 756 return true; | 756 if (area->HorizontalScrollbar() || area->VerticalScrollbar()) |
| 757 } | 757 return true; |
| 758 } | 758 } |
| 759 return false; | 759 return false; |
| 760 } | 760 } |
| 761 | 761 |
| 762 // TODO(trchen): Remove this once we bake the paint offset into frameRect. | 762 // TODO(trchen): Remove this once we bake the paint offset into frameRect. |
| 763 void PaintPropertyTreeBuilder::UpdateScrollbarPaintOffset( | 763 void PaintPropertyTreeBuilder::UpdateScrollbarPaintOffset( |
| 764 const LayoutObject& object, | 764 const LayoutObject& object, |
| 765 ObjectPaintProperties& properties, | 765 ObjectPaintProperties& properties, |
| 766 PaintPropertyTreeBuilderFragmentContext& context, | 766 PaintPropertyTreeBuilderFragmentContext& context, |
| 767 bool& force_subtree_update) { | 767 bool& force_subtree_update) { |
| (...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 908 // reasons at frame boundaries, so we can early-out when not at a LayoutView. | 908 // reasons at frame boundaries, so we can early-out when not at a LayoutView. |
| 909 // TODO(pdr): Need to find a solution to the style-related main thread | 909 // TODO(pdr): Need to find a solution to the style-related main thread |
| 910 // scrolling reasons such as opacity and transform which violate this. | 910 // scrolling reasons such as opacity and transform which violate this. |
| 911 if (!object.IsLayoutView()) | 911 if (!object.IsLayoutView()) |
| 912 return ancestor_reasons; | 912 return ancestor_reasons; |
| 913 return GetMainThreadScrollingReasons(*object.GetFrameView(), | 913 return GetMainThreadScrollingReasons(*object.GetFrameView(), |
| 914 ancestor_reasons); | 914 ancestor_reasons); |
| 915 } | 915 } |
| 916 | 916 |
| 917 static bool NeedsScrollTranslation(const LayoutObject& object) { | 917 static bool NeedsScrollTranslation(const LayoutObject& object) { |
| 918 if (object.HasOverflowClip()) { | 918 if (!object.HasOverflowClip()) |
| 919 const LayoutBox& box = ToLayoutBox(object); | 919 return false; |
| 920 auto* scrollable_area = box.GetScrollableArea(); | 920 const LayoutBox& box = ToLayoutBox(object); |
| 921 IntSize scroll_offset = box.ScrolledContentOffset(); | 921 auto* scrollable_area = box.GetScrollableArea(); |
| 922 if (!scroll_offset.IsZero() || scrollable_area->ScrollsOverflow()) | 922 IntSize scroll_offset = box.ScrolledContentOffset(); |
| 923 return true; | 923 return !scroll_offset.IsZero() || scrollable_area->ScrollsOverflow(); |
|
wkorman
2017/05/18 23:47:22
Can scrollable area ever be null? Should we null-
chrishtr
2017/05/19 00:21:35
No, because HasOverflowClip ensures it. I don't kn
| |
| 924 } | |
| 925 return false; | |
| 926 } | 924 } |
| 927 | 925 |
| 928 void PaintPropertyTreeBuilder::UpdateScrollAndScrollTranslation( | 926 void PaintPropertyTreeBuilder::UpdateScrollAndScrollTranslation( |
| 929 const LayoutObject& object, | 927 const LayoutObject& object, |
| 930 ObjectPaintProperties& properties, | 928 ObjectPaintProperties& properties, |
| 931 PaintPropertyTreeBuilderFragmentContext& context, | 929 PaintPropertyTreeBuilderFragmentContext& context, |
| 932 bool& force_subtree_update) { | 930 bool& force_subtree_update) { |
| 933 if (object.NeedsPaintPropertyUpdate() || force_subtree_update) { | 931 if (object.NeedsPaintPropertyUpdate() || force_subtree_update) { |
| 934 if (NeedsScrollTranslation(object)) { | 932 if (NeedsScrollTranslation(object)) { |
| 935 const LayoutBox& box = ToLayoutBox(object); | 933 const LayoutBox& box = ToLayoutBox(object); |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 970 } | 968 } |
| 971 } | 969 } |
| 972 | 970 |
| 973 if (properties.ScrollTranslation()) { | 971 if (properties.ScrollTranslation()) { |
| 974 context.current.transform = properties.ScrollTranslation(); | 972 context.current.transform = properties.ScrollTranslation(); |
| 975 context.current.scroll = context.current.transform->ScrollNode(); | 973 context.current.scroll = context.current.transform->ScrollNode(); |
| 976 context.current.should_flatten_inherited_transform = false; | 974 context.current.should_flatten_inherited_transform = false; |
| 977 } | 975 } |
| 978 } | 976 } |
| 979 | 977 |
| 980 static bool NeedsCssClipFixedPosition(const LayoutObject& object) { | |
| 981 return !object.IsLayoutView() && !object.CanContainFixedPositionObjects() && | |
|
wkorman
2017/05/18 23:47:21
NeedsCssClip is obviously redundant with the one c
chrishtr
2017/05/19 00:21:35
The logic in UpdatePaintProperties looks like:
bo
wkorman
2017/05/19 00:32:30
Ah. LOL.
| |
| 982 NeedsCssClip(object); | |
| 983 } | |
| 984 | |
| 985 void PaintPropertyTreeBuilder::UpdateOutOfFlowContext( | 978 void PaintPropertyTreeBuilder::UpdateOutOfFlowContext( |
| 986 const LayoutObject& object, | 979 const LayoutObject& object, |
| 987 PaintPropertyTreeBuilderFragmentContext& context, | 980 PaintPropertyTreeBuilderFragmentContext& context, |
| 988 bool& force_subtree_update) { | 981 bool& force_subtree_update) { |
| 989 if (!object.IsBoxModelObject() && !object.PaintProperties()) | 982 if (!object.IsBoxModelObject() && !object.PaintProperties()) |
| 990 return; | 983 return; |
| 991 | 984 |
| 992 if (object.IsLayoutBlock()) | 985 if (object.IsLayoutBlock()) |
| 993 context.paint_offset_for_float = context.current.paint_offset; | 986 context.paint_offset_for_float = context.current.paint_offset; |
| 994 | 987 |
| (...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1163 | 1156 |
| 1164 void PaintPropertyTreeBuilder::UpdatePaintProperties( | 1157 void PaintPropertyTreeBuilder::UpdatePaintProperties( |
| 1165 const LayoutObject& object, | 1158 const LayoutObject& object, |
| 1166 PaintPropertyTreeBuilderContext& full_context) { | 1159 PaintPropertyTreeBuilderContext& full_context) { |
| 1167 bool needs_paint_properties = | 1160 bool needs_paint_properties = |
| 1168 NeedsPaintOffsetTranslation(object) || NeedsTransform(object) || | 1161 NeedsPaintOffsetTranslation(object) || NeedsTransform(object) || |
| 1169 NeedsEffect(object) || NeedsTransformForNonRootSVG(object) || | 1162 NeedsEffect(object) || NeedsTransformForNonRootSVG(object) || |
| 1170 NeedsFilter(object) || NeedsCssClip(object) || | 1163 NeedsFilter(object) || NeedsCssClip(object) || |
| 1171 NeedsScrollbarPaintOffset(object) || NeedsOverflowClip(object) || | 1164 NeedsScrollbarPaintOffset(object) || NeedsOverflowClip(object) || |
| 1172 NeedsPerspective(object) || NeedsSVGLocalToBorderBoxTransform(object) || | 1165 NeedsPerspective(object) || NeedsSVGLocalToBorderBoxTransform(object) || |
| 1173 NeedsScrollTranslation(object) || NeedsCssClipFixedPosition(object); | 1166 NeedsScrollTranslation(object); |
| 1167 | |
| 1174 bool had_paint_properties = object.PaintProperties(); | 1168 bool had_paint_properties = object.PaintProperties(); |
| 1175 | 1169 |
| 1176 if (needs_paint_properties && !had_paint_properties) { | 1170 if (needs_paint_properties && !had_paint_properties) { |
| 1177 ObjectPaintProperties& paint_properties = | 1171 ObjectPaintProperties& paint_properties = |
| 1178 object.GetMutableForPainting().EnsurePaintProperties(); | 1172 object.GetMutableForPainting().EnsurePaintProperties(); |
| 1179 if (RuntimeEnabledFeatures::slimmingPaintV2Enabled()) { | 1173 if (RuntimeEnabledFeatures::slimmingPaintV2Enabled()) { |
| 1180 paint_properties.SetCompositorElementId( | 1174 paint_properties.SetCompositorElementId( |
| 1181 CreateDomNodeBasedCompositorElementId(object)); | 1175 CreateDomNodeBasedCompositorElementId(object)); |
| 1182 } | 1176 } |
| 1183 } else if (!needs_paint_properties && had_paint_properties) { | 1177 } else if (!needs_paint_properties && had_paint_properties) { |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1276 context.force_subtree_update); | 1270 context.force_subtree_update); |
| 1277 | 1271 |
| 1278 context.force_subtree_update |= object.SubtreeNeedsPaintPropertyUpdate(); | 1272 context.force_subtree_update |= object.SubtreeNeedsPaintPropertyUpdate(); |
| 1279 } | 1273 } |
| 1280 | 1274 |
| 1281 if (object.CanContainAbsolutePositionObjects()) | 1275 if (object.CanContainAbsolutePositionObjects()) |
| 1282 context.container_for_absolute_position = &object; | 1276 context.container_for_absolute_position = &object; |
| 1283 } | 1277 } |
| 1284 | 1278 |
| 1285 } // namespace blink | 1279 } // namespace blink |
| OLD | NEW |