OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc. All rights
reserved. | 2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc. All rights
reserved. |
3 * | 3 * |
4 * Portions are Copyright (C) 1998 Netscape Communications Corporation. | 4 * Portions are Copyright (C) 1998 Netscape Communications Corporation. |
5 * | 5 * |
6 * Other contributors: | 6 * Other contributors: |
7 * Robert O'Callahan <roc+@cs.cmu.edu> | 7 * Robert O'Callahan <roc+@cs.cmu.edu> |
8 * David Baron <dbaron@fas.harvard.edu> | 8 * David Baron <dbaron@fas.harvard.edu> |
9 * Christian Biesinger <cbiesinger@web.de> | 9 * Christian Biesinger <cbiesinger@web.de> |
10 * Randall Jesup <rjesup@wgate.com> | 10 * Randall Jesup <rjesup@wgate.com> |
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
141 RenderLayer::RenderLayer(RenderLayerModelObject* renderer) | 141 RenderLayer::RenderLayer(RenderLayerModelObject* renderer) |
142 : m_inResizeMode(false) | 142 : m_inResizeMode(false) |
143 , m_scrollDimensionsDirty(true) | 143 , m_scrollDimensionsDirty(true) |
144 , m_normalFlowListDirty(true) | 144 , m_normalFlowListDirty(true) |
145 , m_hasSelfPaintingLayerDescendant(false) | 145 , m_hasSelfPaintingLayerDescendant(false) |
146 , m_hasSelfPaintingLayerDescendantDirty(false) | 146 , m_hasSelfPaintingLayerDescendantDirty(false) |
147 , m_hasOutOfFlowPositionedDescendant(false) | 147 , m_hasOutOfFlowPositionedDescendant(false) |
148 , m_hasOutOfFlowPositionedDescendantDirty(true) | 148 , m_hasOutOfFlowPositionedDescendantDirty(true) |
149 , m_needsCompositedScrolling(false) | 149 , m_needsCompositedScrolling(false) |
150 , m_descendantsAreContiguousInStackingOrder(false) | 150 , m_descendantsAreContiguousInStackingOrder(false) |
| 151 , m_descendantsAreContiguousInStackingOrderDirty(true) |
151 , m_isRootLayer(renderer->isRenderView()) | 152 , m_isRootLayer(renderer->isRenderView()) |
152 , m_usedTransparency(false) | 153 , m_usedTransparency(false) |
153 , m_paintingInsideReflection(false) | 154 , m_paintingInsideReflection(false) |
154 , m_inOverflowRelayout(false) | 155 , m_inOverflowRelayout(false) |
155 , m_repaintStatus(NeedsNormalRepaint) | 156 , m_repaintStatus(NeedsNormalRepaint) |
156 , m_visibleContentStatusDirty(true) | 157 , m_visibleContentStatusDirty(true) |
157 , m_hasVisibleContent(false) | 158 , m_hasVisibleContent(false) |
158 , m_visibleDescendantStatusDirty(false) | 159 , m_visibleDescendantStatusDirty(false) |
159 , m_hasVisibleDescendant(false) | 160 , m_hasVisibleDescendant(false) |
160 , m_isPaginated(false) | 161 , m_isPaginated(false) |
(...skipping 397 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
558 // numSCDecendants = 3 | 559 // numSCDecendants = 3 |
559 // | 560 // |
560 // and so, | 561 // and so, |
561 // maxStackIndex - minStackIndex == numSCDescendants | 562 // maxStackIndex - minStackIndex == numSCDescendants |
562 // ===> 3 - 0 == 3 | 563 // ===> 3 - 0 == 3 |
563 // ===> 3 == 3 | 564 // ===> 3 == 3 |
564 // | 565 // |
565 // And we would conclude that C could be promoted. | 566 // And we would conclude that C could be promoted. |
566 void RenderLayer::updateDescendantsAreContiguousInStackingOrder() | 567 void RenderLayer::updateDescendantsAreContiguousInStackingOrder() |
567 { | 568 { |
568 if (!isStackingContext() || !acceleratedCompositingForOverflowScrollEnabled(
)) | 569 if (!m_descendantsAreContiguousInStackingOrderDirty || !isStackingContext()
|| !acceleratedCompositingForOverflowScrollEnabled()) |
569 return; | 570 return; |
570 | 571 |
571 ASSERT(!m_normalFlowListDirty); | 572 ASSERT(!m_normalFlowListDirty); |
572 ASSERT(!m_zOrderListsDirty); | 573 ASSERT(!m_zOrderListsDirty); |
573 | 574 |
574 OwnPtr<Vector<RenderLayer*> > posZOrderList; | 575 OwnPtr<Vector<RenderLayer*> > posZOrderList; |
575 OwnPtr<Vector<RenderLayer*> > negZOrderList; | 576 OwnPtr<Vector<RenderLayer*> > negZOrderList; |
576 rebuildZOrderLists(StopAtStackingContexts, posZOrderList, negZOrderList); | 577 rebuildZOrderLists(StopAtStackingContexts, posZOrderList, negZOrderList); |
577 | 578 |
578 // Create a reverse lookup. | 579 // Create a reverse lookup. |
(...skipping 19 matching lines...) Expand all Loading... |
598 continue; | 599 continue; |
599 lookup.set(currentLayer, stackingOrderIndex++); | 600 lookup.set(currentLayer, stackingOrderIndex++); |
600 } | 601 } |
601 } | 602 } |
602 | 603 |
603 int minIndex = 0; | 604 int minIndex = 0; |
604 int maxIndex = 0; | 605 int maxIndex = 0; |
605 int count = 0; | 606 int count = 0; |
606 bool firstIteration = true; | 607 bool firstIteration = true; |
607 updateDescendantsAreContiguousInStackingOrderRecursive(lookup, minIndex, max
Index, count, firstIteration); | 608 updateDescendantsAreContiguousInStackingOrderRecursive(lookup, minIndex, max
Index, count, firstIteration); |
| 609 |
| 610 m_descendantsAreContiguousInStackingOrderDirty = false; |
608 } | 611 } |
609 | 612 |
610 void RenderLayer::updateDescendantsAreContiguousInStackingOrderRecursive(const H
ashMap<const RenderLayer*, int>& lookup, int& minIndex, int& maxIndex, int& coun
t, bool firstIteration) | 613 void RenderLayer::updateDescendantsAreContiguousInStackingOrderRecursive(const H
ashMap<const RenderLayer*, int>& lookup, int& minIndex, int& maxIndex, int& coun
t, bool firstIteration) |
611 { | 614 { |
612 if (isStackingContext() && !firstIteration) { | 615 if (isStackingContext() && !firstIteration) { |
613 if (lookup.contains(this)) { | 616 if (lookup.contains(this)) { |
614 minIndex = std::min(minIndex, lookup.get(this)); | 617 minIndex = std::min(minIndex, lookup.get(this)); |
615 maxIndex = std::max(maxIndex, lookup.get(this)); | 618 maxIndex = std::max(maxIndex, lookup.get(this)); |
616 count++; | 619 count++; |
617 } | 620 } |
(...skipping 300 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
918 m_enclosingPaginationLayer = containingBlock->layer()->enclosing
PaginationLayer(); | 921 m_enclosingPaginationLayer = containingBlock->layer()->enclosing
PaginationLayer(); |
919 if (m_enclosingPaginationLayer && m_enclosingPaginationLayer->ha
sTransform()) | 922 if (m_enclosingPaginationLayer && m_enclosingPaginationLayer->ha
sTransform()) |
920 m_enclosingPaginationLayer = 0; | 923 m_enclosingPaginationLayer = 0; |
921 return; | 924 return; |
922 } | 925 } |
923 } | 926 } |
924 return; | 927 return; |
925 } | 928 } |
926 | 929 |
927 // If we're not normal flow, then we need to look for a multi-column object
between us and our stacking container. | 930 // If we're not normal flow, then we need to look for a multi-column object
between us and our stacking container. |
928 RenderLayer* ancestorStackingContainer = stackingContainer(); | 931 RenderLayer* ancestorStackingContainer = this->ancestorStackingContainer(); |
929 for (RenderLayer* curr = parent(); curr; curr = curr->parent()) { | 932 for (RenderLayer* curr = parent(); curr; curr = curr->parent()) { |
930 if (curr->renderer()->hasColumns()) { | 933 if (curr->renderer()->hasColumns()) { |
931 m_isPaginated = checkContainingBlockChainForPagination(renderer(), c
urr->renderBox()); | 934 m_isPaginated = checkContainingBlockChainForPagination(renderer(), c
urr->renderBox()); |
932 return; | 935 return; |
933 } | 936 } |
934 if (curr == ancestorStackingContainer) | 937 if (curr == ancestorStackingContainer) |
935 return; | 938 return; |
936 } | 939 } |
937 } | 940 } |
938 | 941 |
939 bool RenderLayer::canBeStackingContainer() const | 942 bool RenderLayer::canBeStackingContainer() const |
940 { | 943 { |
941 if (isStackingContext() || !stackingContainer()) | 944 if (isStackingContext() || !ancestorStackingContainer()) |
942 return true; | 945 return true; |
943 | 946 |
944 return m_descendantsAreContiguousInStackingOrder; | 947 return m_descendantsAreContiguousInStackingOrder; |
945 } | 948 } |
946 | 949 |
947 void RenderLayer::setHasVisibleContent() | 950 void RenderLayer::setHasVisibleContent() |
948 { | 951 { |
949 if (m_hasVisibleContent && !m_visibleContentStatusDirty) { | 952 if (m_hasVisibleContent && !m_visibleContentStatusDirty) { |
950 ASSERT(!parent() || parent()->hasVisibleDescendant()); | 953 ASSERT(!parent() || parent()->hasVisibleDescendant()); |
951 return; | 954 return; |
952 } | 955 } |
953 | 956 |
954 m_visibleContentStatusDirty = false; | 957 m_visibleContentStatusDirty = false; |
955 m_hasVisibleContent = true; | 958 m_hasVisibleContent = true; |
956 computeRepaintRects(renderer()->containerForRepaint()); | 959 computeRepaintRects(renderer()->containerForRepaint()); |
957 if (!isNormalFlowOnly()) { | 960 if (!isNormalFlowOnly()) { |
958 // We don't collect invisible layers in z-order lists if we are not in c
ompositing mode. | 961 // We don't collect invisible layers in z-order lists if we are not in c
ompositing mode. |
959 // As we became visible, we need to dirty our stacking containers ancest
ors to be properly | 962 // As we became visible, we need to dirty our stacking containers ancest
ors to be properly |
960 // collected. FIXME: When compositing, we could skip this dirtying phase
. | 963 // collected. FIXME: When compositing, we could skip this dirtying phase
. |
961 for (RenderLayer* sc = stackingContainer(); sc; sc = sc->stackingContain
er()) { | 964 for (RenderLayer* sc = ancestorStackingContainer(); sc; sc = sc->ancesto
rStackingContainer()) { |
962 sc->dirtyZOrderLists(); | 965 sc->dirtyZOrderLists(); |
963 if (sc->hasVisibleContent()) | 966 if (sc->hasVisibleContent()) |
964 break; | 967 break; |
965 } | 968 } |
966 } | 969 } |
967 | 970 |
968 if (parent()) | 971 if (parent()) |
969 parent()->setAncestorChainHasVisibleDescendant(); | 972 parent()->setAncestorChainHasVisibleDescendant(); |
970 } | 973 } |
971 | 974 |
(...skipping 21 matching lines...) Expand all Loading... |
993 break; | 996 break; |
994 | 997 |
995 layer->m_hasVisibleDescendant = true; | 998 layer->m_hasVisibleDescendant = true; |
996 layer->m_visibleDescendantStatusDirty = false; | 999 layer->m_visibleDescendantStatusDirty = false; |
997 } | 1000 } |
998 } | 1001 } |
999 | 1002 |
1000 void RenderLayer::updateDescendantDependentFlags(HashSet<const RenderObject*>* o
utOfFlowDescendantContainingBlocks) | 1003 void RenderLayer::updateDescendantDependentFlags(HashSet<const RenderObject*>* o
utOfFlowDescendantContainingBlocks) |
1001 { | 1004 { |
1002 if (m_visibleDescendantStatusDirty || m_hasSelfPaintingLayerDescendantDirty
|| m_hasOutOfFlowPositionedDescendantDirty) { | 1005 if (m_visibleDescendantStatusDirty || m_hasSelfPaintingLayerDescendantDirty
|| m_hasOutOfFlowPositionedDescendantDirty) { |
| 1006 const bool hadVisibleDescendant = m_hasVisibleDescendant; |
| 1007 const bool hadOutOfFlowPositionedDescendant = m_hasOutOfFlowPositionedDe
scendant; |
| 1008 |
1003 m_hasVisibleDescendant = false; | 1009 m_hasVisibleDescendant = false; |
1004 m_hasSelfPaintingLayerDescendant = false; | 1010 m_hasSelfPaintingLayerDescendant = false; |
1005 m_hasOutOfFlowPositionedDescendant = false; | 1011 m_hasOutOfFlowPositionedDescendant = false; |
1006 | 1012 |
1007 HashSet<const RenderObject*> childOutOfFlowDescendantContainingBlocks; | 1013 HashSet<const RenderObject*> childOutOfFlowDescendantContainingBlocks; |
1008 for (RenderLayer* child = firstChild(); child; child = child->nextSiblin
g()) { | 1014 for (RenderLayer* child = firstChild(); child; child = child->nextSiblin
g()) { |
1009 childOutOfFlowDescendantContainingBlocks.clear(); | 1015 childOutOfFlowDescendantContainingBlocks.clear(); |
1010 child->updateDescendantDependentFlags(&childOutOfFlowDescendantConta
iningBlocks); | 1016 child->updateDescendantDependentFlags(&childOutOfFlowDescendantConta
iningBlocks); |
1011 | 1017 |
1012 bool childIsOutOfFlowPositioned = child->renderer() && child->render
er()->isOutOfFlowPositioned(); | 1018 bool childIsOutOfFlowPositioned = child->renderer() && child->render
er()->isOutOfFlowPositioned(); |
1013 if (childIsOutOfFlowPositioned) | 1019 if (childIsOutOfFlowPositioned) |
1014 childOutOfFlowDescendantContainingBlocks.add(child->renderer()->
containingBlock()); | 1020 childOutOfFlowDescendantContainingBlocks.add(child->renderer()->
containingBlock()); |
1015 | 1021 |
1016 if (outOfFlowDescendantContainingBlocks) { | 1022 if (outOfFlowDescendantContainingBlocks) { |
1017 HashSet<const RenderObject*>::const_iterator it = childOutOfFlow
DescendantContainingBlocks.begin(); | 1023 HashSet<const RenderObject*>::const_iterator it = childOutOfFlow
DescendantContainingBlocks.begin(); |
1018 for (; it != childOutOfFlowDescendantContainingBlocks.end(); ++i
t) | 1024 for (; it != childOutOfFlowDescendantContainingBlocks.end(); ++i
t) |
1019 outOfFlowDescendantContainingBlocks->add(*it); | 1025 outOfFlowDescendantContainingBlocks->add(*it); |
1020 } | 1026 } |
1021 | 1027 |
1022 bool hasVisibleDescendant = child->m_hasVisibleContent || child->m_h
asVisibleDescendant; | 1028 bool hasVisibleDescendant = child->m_hasVisibleContent || child->m_h
asVisibleDescendant; |
1023 bool hasSelfPaintingLayerDescendant = child->isSelfPaintingLayer() |
| child->hasSelfPaintingLayerDescendant(); | 1029 bool hasSelfPaintingLayerDescendant = child->isSelfPaintingLayer() |
| child->hasSelfPaintingLayerDescendant(); |
1024 bool hasOutOfFlowPositionedDescendant = !childOutOfFlowDescendantCon
tainingBlocks.isEmpty(); | 1030 bool hasOutOfFlowPositionedDescendant = hasVisibleDescendant && (!ch
ildOutOfFlowDescendantContainingBlocks.isEmpty() || child->hasOutOfFlowPositione
dDescendant()); |
1025 | 1031 |
1026 m_hasVisibleDescendant |= hasVisibleDescendant; | 1032 m_hasVisibleDescendant |= hasVisibleDescendant; |
1027 m_hasSelfPaintingLayerDescendant |= hasSelfPaintingLayerDescendant; | 1033 m_hasSelfPaintingLayerDescendant |= hasSelfPaintingLayerDescendant; |
1028 m_hasOutOfFlowPositionedDescendant |= hasOutOfFlowPositionedDescenda
nt; | 1034 m_hasOutOfFlowPositionedDescendant |= hasOutOfFlowPositionedDescenda
nt; |
1029 | 1035 |
1030 if (m_hasVisibleDescendant && m_hasSelfPaintingLayerDescendant && m_
hasOutOfFlowPositionedDescendant) | 1036 if (m_hasVisibleDescendant && m_hasSelfPaintingLayerDescendant && m_
hasOutOfFlowPositionedDescendant) |
1031 break; | 1037 break; |
1032 } | 1038 } |
1033 | 1039 |
1034 if (outOfFlowDescendantContainingBlocks && renderer()) | 1040 if (outOfFlowDescendantContainingBlocks && renderer()) |
1035 outOfFlowDescendantContainingBlocks->remove(renderer()); | 1041 outOfFlowDescendantContainingBlocks->remove(renderer()); |
1036 | 1042 |
1037 m_visibleDescendantStatusDirty = false; | 1043 m_visibleDescendantStatusDirty = false; |
1038 m_hasSelfPaintingLayerDescendantDirty = false; | 1044 m_hasSelfPaintingLayerDescendantDirty = false; |
| 1045 m_hasOutOfFlowPositionedDescendantDirty = false; |
1039 | 1046 |
1040 if (m_hasOutOfFlowPositionedDescendantDirty) | 1047 if (m_hasVisibleDescendant != hadVisibleDescendant || m_hasOutOfFlowPosi
tionedDescendant != hadOutOfFlowPositionedDescendant) |
1041 updateNeedsCompositedScrolling(); | 1048 updateNeedsCompositedScrolling(); |
1042 | |
1043 m_hasOutOfFlowPositionedDescendantDirty = false; | |
1044 } | 1049 } |
1045 | 1050 |
1046 if (m_visibleContentStatusDirty) { | 1051 if (m_visibleContentStatusDirty) { |
| 1052 const bool hadVisibleContent = m_hasVisibleContent; |
1047 if (renderer()->style()->visibility() == VISIBLE) | 1053 if (renderer()->style()->visibility() == VISIBLE) |
1048 m_hasVisibleContent = true; | 1054 m_hasVisibleContent = true; |
1049 else { | 1055 else { |
1050 // layer may be hidden but still have some visible content, check fo
r this | 1056 // layer may be hidden but still have some visible content, check fo
r this |
1051 m_hasVisibleContent = false; | 1057 m_hasVisibleContent = false; |
1052 RenderObject* r = renderer()->firstChild(); | 1058 RenderObject* r = renderer()->firstChild(); |
1053 while (r) { | 1059 while (r) { |
1054 if (r->style()->visibility() == VISIBLE && !r->hasLayer()) { | 1060 if (r->style()->visibility() == VISIBLE && !r->hasLayer()) { |
1055 m_hasVisibleContent = true; | 1061 m_hasVisibleContent = true; |
1056 break; | 1062 break; |
1057 } | 1063 } |
1058 if (r->firstChild() && !r->hasLayer()) | 1064 if (r->firstChild() && !r->hasLayer()) |
1059 r = r->firstChild(); | 1065 r = r->firstChild(); |
1060 else if (r->nextSibling()) | 1066 else if (r->nextSibling()) |
1061 r = r->nextSibling(); | 1067 r = r->nextSibling(); |
1062 else { | 1068 else { |
1063 do { | 1069 do { |
1064 r = r->parent(); | 1070 r = r->parent(); |
1065 if (r == renderer()) | 1071 if (r == renderer()) |
1066 r = 0; | 1072 r = 0; |
1067 } while (r && !r->nextSibling()); | 1073 } while (r && !r->nextSibling()); |
1068 if (r) | 1074 if (r) |
1069 r = r->nextSibling(); | 1075 r = r->nextSibling(); |
1070 } | 1076 } |
1071 } | 1077 } |
1072 } | 1078 } |
1073 m_visibleContentStatusDirty = false; | 1079 m_visibleContentStatusDirty = false; |
| 1080 if (hadVisibleContent != m_hasVisibleContent) |
| 1081 updateNeedsCompositedScrolling(); |
1074 } | 1082 } |
1075 } | 1083 } |
1076 | 1084 |
1077 void RenderLayer::dirty3DTransformedDescendantStatus() | 1085 void RenderLayer::dirty3DTransformedDescendantStatus() |
1078 { | 1086 { |
1079 RenderLayer* curr = stackingContainer(); | 1087 RenderLayer* curr = ancestorStackingContainer(); |
1080 if (curr) | 1088 if (curr) |
1081 curr->m_3DTransformedDescendantStatusDirty = true; | 1089 curr->m_3DTransformedDescendantStatusDirty = true; |
1082 | 1090 |
1083 // This propagates up through preserve-3d hierarchies to the enclosing flatt
ening layer. | 1091 // This propagates up through preserve-3d hierarchies to the enclosing flatt
ening layer. |
1084 // Note that preserves3D() creates stacking context, so we can just run up t
he stacking containers. | 1092 // Note that preserves3D() creates stacking context, so we can just run up t
he stacking containers. |
1085 while (curr && curr->preserves3D()) { | 1093 while (curr && curr->preserves3D()) { |
1086 curr->m_3DTransformedDescendantStatusDirty = true; | 1094 curr->m_3DTransformedDescendantStatusDirty = true; |
1087 curr = curr->stackingContainer(); | 1095 curr = curr->ancestorStackingContainer(); |
1088 } | 1096 } |
1089 } | 1097 } |
1090 | 1098 |
1091 // Return true if this layer or any preserve-3d descendants have 3d. | 1099 // Return true if this layer or any preserve-3d descendants have 3d. |
1092 bool RenderLayer::update3DTransformedDescendantStatus() | 1100 bool RenderLayer::update3DTransformedDescendantStatus() |
1093 { | 1101 { |
1094 if (m_3DTransformedDescendantStatusDirty) { | 1102 if (m_3DTransformedDescendantStatusDirty) { |
1095 m_has3DTransformedDescendant = false; | 1103 m_has3DTransformedDescendant = false; |
1096 | 1104 |
1097 updateZOrderLists(); | 1105 updateZOrderLists(); |
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1240 if (!renderer()->hasTransform()) | 1248 if (!renderer()->hasTransform()) |
1241 return FloatPoint(); | 1249 return FloatPoint(); |
1242 | 1250 |
1243 const LayoutRect borderBox = toRenderBox(renderer())->borderBoxRect(); | 1251 const LayoutRect borderBox = toRenderBox(renderer())->borderBoxRect(); |
1244 RenderStyle* style = renderer()->style(); | 1252 RenderStyle* style = renderer()->style(); |
1245 | 1253 |
1246 return FloatPoint(floatValueForLength(style->perspectiveOriginX(), borderBox
.width()), | 1254 return FloatPoint(floatValueForLength(style->perspectiveOriginX(), borderBox
.width()), |
1247 floatValueForLength(style->perspectiveOriginY(), borderBox
.height())); | 1255 floatValueForLength(style->perspectiveOriginY(), borderBox
.height())); |
1248 } | 1256 } |
1249 | 1257 |
1250 RenderLayer* RenderLayer::stackingContainer() const | 1258 RenderLayer* RenderLayer::ancestorStackingContainer() const |
1251 { | 1259 { |
1252 RenderLayer* layer = parent(); | 1260 RenderLayer* ancestor = parent(); |
1253 while (layer && !layer->isStackingContainer()) | 1261 while (ancestor && !ancestor->isStackingContainer()) |
1254 layer = layer->parent(); | 1262 ancestor = ancestor->parent(); |
| 1263 return ancestor; |
| 1264 } |
1255 | 1265 |
1256 ASSERT(!layer || layer->isStackingContainer()); | 1266 RenderLayer* RenderLayer::ancestorStackingContext() const |
1257 return layer; | 1267 { |
| 1268 RenderLayer* ancestor = parent(); |
| 1269 while (ancestor && !ancestor->isStackingContext()) |
| 1270 ancestor = ancestor->parent(); |
| 1271 return ancestor; |
1258 } | 1272 } |
1259 | 1273 |
1260 static inline bool isPositionedContainer(RenderLayer* layer) | 1274 static inline bool isPositionedContainer(RenderLayer* layer) |
1261 { | 1275 { |
1262 RenderLayerModelObject* layerRenderer = layer->renderer(); | 1276 RenderLayerModelObject* layerRenderer = layer->renderer(); |
1263 return layer->isRootLayer() || layerRenderer->isPositioned() || layer->hasTr
ansform(); | 1277 return layer->isRootLayer() || layerRenderer->isPositioned() || layer->hasTr
ansform(); |
1264 } | 1278 } |
1265 | 1279 |
1266 static inline bool isFixedPositionedContainer(RenderLayer* layer) | 1280 static inline bool isFixedPositionedContainer(RenderLayer* layer) |
1267 { | 1281 { |
(...skipping 28 matching lines...) Expand all Loading... |
1296 { | 1310 { |
1297 RenderLayer* curr = parent(); | 1311 RenderLayer* curr = parent(); |
1298 while (curr && !curr->isRootLayer() && !curr->transform()) | 1312 while (curr && !curr->isRootLayer() && !curr->transform()) |
1299 curr = curr->parent(); | 1313 curr = curr->parent(); |
1300 | 1314 |
1301 return curr; | 1315 return curr; |
1302 } | 1316 } |
1303 | 1317 |
1304 static inline const RenderLayer* compositingContainer(const RenderLayer* layer) | 1318 static inline const RenderLayer* compositingContainer(const RenderLayer* layer) |
1305 { | 1319 { |
1306 return layer->isNormalFlowOnly() ? layer->parent() : layer->stackingContaine
r(); | 1320 return layer->isNormalFlowOnly() ? layer->parent() : layer->ancestorStacking
Container(); |
1307 } | 1321 } |
1308 | 1322 |
1309 inline bool RenderLayer::shouldRepaintAfterLayout() const | 1323 inline bool RenderLayer::shouldRepaintAfterLayout() const |
1310 { | 1324 { |
1311 if (m_repaintStatus == NeedsNormalRepaint) | 1325 if (m_repaintStatus == NeedsNormalRepaint) |
1312 return true; | 1326 return true; |
1313 | 1327 |
1314 // Composited layers that were moved during a positioned movement only | 1328 // Composited layers that were moved during a positioned movement only |
1315 // layout, don't need to be repainted. They just need to be recomposited. | 1329 // layout, don't need to be repainted. They just need to be recomposited. |
1316 ASSERT(m_repaintStatus == NeedsFullRepaintForPositionedMovementLayout); | 1330 ASSERT(m_repaintStatus == NeedsFullRepaintForPositionedMovementLayout); |
(...skipping 313 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1630 ASSERT(beforeChild != child); | 1644 ASSERT(beforeChild != child); |
1631 } else | 1645 } else |
1632 setLastChild(child); | 1646 setLastChild(child); |
1633 | 1647 |
1634 child->setParent(this); | 1648 child->setParent(this); |
1635 | 1649 |
1636 if (child->isNormalFlowOnly()) | 1650 if (child->isNormalFlowOnly()) |
1637 dirtyNormalFlowList(); | 1651 dirtyNormalFlowList(); |
1638 | 1652 |
1639 if (!child->isNormalFlowOnly() || child->firstChild()) { | 1653 if (!child->isNormalFlowOnly() || child->firstChild()) { |
1640 // Dirty the z-order list in which we are contained. The stackingContain
er() can be null in the | 1654 // Dirty the z-order list in which we are contained. The ancestorStackin
gContainer() can be null in the |
1641 // case where we're building up generated content layers. This is ok, si
nce the lists will start | 1655 // case where we're building up generated content layers. This is ok, si
nce the lists will start |
1642 // off dirty in that case anyway. | 1656 // off dirty in that case anyway. |
1643 child->dirtyStackingContainerZOrderLists(); | 1657 child->dirtyStackingContainerZOrderLists(); |
| 1658 |
| 1659 // Adding an out of flow positioned descendant can only affect |
| 1660 // the opt-in decision for layers beneath and including our |
| 1661 // containing block. |
| 1662 RenderObject* containingBlock = child->renderer()->containingBlock(); |
| 1663 for (RenderLayer* layer = child; layer; layer = layer->parent()) { |
| 1664 layer->updateNeedsCompositedScrolling(); |
| 1665 if (layer->renderer() == containingBlock) |
| 1666 break; |
| 1667 } |
1644 } | 1668 } |
1645 | 1669 |
1646 child->updateDescendantDependentFlags(); | 1670 child->updateDescendantDependentFlags(); |
1647 if (child->m_hasVisibleContent || child->m_hasVisibleDescendant) | 1671 if (child->m_hasVisibleContent || child->m_hasVisibleDescendant) |
1648 setAncestorChainHasVisibleDescendant(); | 1672 setAncestorChainHasVisibleDescendant(); |
1649 | 1673 |
1650 if (child->isSelfPaintingLayer() || child->hasSelfPaintingLayerDescendant()) | 1674 if (child->isSelfPaintingLayer() || child->hasSelfPaintingLayerDescendant()) |
1651 setAncestorChainHasSelfPaintingLayerDescendant(); | 1675 setAncestorChainHasSelfPaintingLayerDescendant(); |
1652 | 1676 |
1653 if (child->renderer() && (child->renderer()->isOutOfFlowPositioned() || chil
d->hasOutOfFlowPositionedDescendant())) | 1677 if (child->renderer() && (child->renderer()->isOutOfFlowPositioned() || chil
d->hasOutOfFlowPositionedDescendant())) |
(...skipping 13 matching lines...) Expand all Loading... |
1667 if (oldChild->nextSibling()) | 1691 if (oldChild->nextSibling()) |
1668 oldChild->nextSibling()->setPreviousSibling(oldChild->previousSibling())
; | 1692 oldChild->nextSibling()->setPreviousSibling(oldChild->previousSibling())
; |
1669 | 1693 |
1670 if (m_first == oldChild) | 1694 if (m_first == oldChild) |
1671 m_first = oldChild->nextSibling(); | 1695 m_first = oldChild->nextSibling(); |
1672 if (m_last == oldChild) | 1696 if (m_last == oldChild) |
1673 m_last = oldChild->previousSibling(); | 1697 m_last = oldChild->previousSibling(); |
1674 | 1698 |
1675 if (oldChild->isNormalFlowOnly()) | 1699 if (oldChild->isNormalFlowOnly()) |
1676 dirtyNormalFlowList(); | 1700 dirtyNormalFlowList(); |
1677 if (!oldChild->isNormalFlowOnly() || oldChild->firstChild()) { | 1701 if (!oldChild->isNormalFlowOnly() || oldChild->firstChild()) { |
1678 // Dirty the z-order list in which we are contained. When called via th
e | 1702 // Dirty the z-order list in which we are contained. When called via th
e |
1679 // reattachment process in removeOnlyThisLayer, the layer may already be
disconnected | 1703 // reattachment process in removeOnlyThisLayer, the layer may already be
disconnected |
1680 // from the main layer tree, so we need to null-check the |stackingConta
iner| value. | 1704 // from the main layer tree, so we need to null-check the |stackingConta
iner| value. |
1681 oldChild->dirtyStackingContainerZOrderLists(); | 1705 oldChild->dirtyStackingContainerZOrderLists(); |
| 1706 |
| 1707 // This could affect whether or not a layer has an out of flow |
| 1708 // positioned descendant so we need to schedule some updates. |
| 1709 // Removing an out of flow positioned descendant can only affect |
| 1710 // the opt-in decision for layers beneath and including the old child's |
| 1711 // containing block. |
| 1712 RenderObject* containingBlock = oldChild->renderer()->containingBlock(); |
| 1713 for (RenderLayer* layer = this; layer; layer = layer->parent()) { |
| 1714 layer->updateNeedsCompositedScrolling(); |
| 1715 if (layer->renderer() == containingBlock) |
| 1716 break; |
| 1717 } |
1682 } | 1718 } |
1683 | 1719 |
1684 if ((oldChild->renderer() && oldChild->renderer()->isOutOfFlowPositioned())
|| oldChild->hasOutOfFlowPositionedDescendant()) | 1720 if ((oldChild->renderer() && oldChild->renderer()->isOutOfFlowPositioned())
|| oldChild->hasOutOfFlowPositionedDescendant()) |
1685 dirtyAncestorChainHasOutOfFlowPositionedDescendantStatus(); | 1721 dirtyAncestorChainHasOutOfFlowPositionedDescendantStatus(); |
1686 | 1722 |
1687 oldChild->setPreviousSibling(0); | 1723 oldChild->setPreviousSibling(0); |
1688 oldChild->setNextSibling(0); | 1724 oldChild->setNextSibling(0); |
1689 oldChild->setParent(0); | 1725 oldChild->setParent(0); |
1690 | 1726 |
1691 oldChild->updateDescendantDependentFlags(); | 1727 oldChild->updateDescendantDependentFlags(); |
1692 if (oldChild->m_hasVisibleContent || oldChild->m_hasVisibleDescendant) | 1728 if (oldChild->m_hasVisibleContent || oldChild->m_hasVisibleDescendant) |
1693 dirtyAncestorChainVisibleDescendantStatus(); | 1729 dirtyAncestorChainVisibleDescendantStatus(); |
1694 | 1730 |
1695 if (oldChild->isSelfPaintingLayer() || oldChild->hasSelfPaintingLayerDescend
ant()) | 1731 if (oldChild->isSelfPaintingLayer() || oldChild->hasSelfPaintingLayerDescend
ant()) |
1696 dirtyAncestorChainHasSelfPaintingLayerDescendantStatus(); | 1732 dirtyAncestorChainHasSelfPaintingLayerDescendantStatus(); |
1697 | 1733 |
1698 return oldChild; | 1734 return oldChild; |
1699 } | 1735 } |
1700 | 1736 |
(...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1901 return isComposited() && backing()->scrollingLayer(); | 1937 return isComposited() && backing()->scrollingLayer(); |
1902 } | 1938 } |
1903 | 1939 |
1904 bool RenderLayer::needsCompositedScrolling() const | 1940 bool RenderLayer::needsCompositedScrolling() const |
1905 { | 1941 { |
1906 return m_needsCompositedScrolling; | 1942 return m_needsCompositedScrolling; |
1907 } | 1943 } |
1908 | 1944 |
1909 void RenderLayer::updateNeedsCompositedScrolling() | 1945 void RenderLayer::updateNeedsCompositedScrolling() |
1910 { | 1946 { |
1911 bool oldNeedsCompositedScrolling = m_needsCompositedScrolling; | 1947 bool needsCompositedScrolling = false; |
1912 | 1948 |
1913 FrameView* frameView = renderer()->view()->frameView(); | 1949 FrameView* frameView = renderer()->view()->frameView(); |
1914 if (!frameView || !frameView->containsScrollableArea(this)) | 1950 if (frameView && frameView->containsScrollableArea(this)) { |
1915 m_needsCompositedScrolling = false; | 1951 updateDescendantDependentFlags(); |
1916 else { | 1952 |
1917 bool forceUseCompositedScrolling = acceleratedCompositingForOverflowScro
llEnabled() | 1953 bool forceUseCompositedScrolling = acceleratedCompositingForOverflowScro
llEnabled() |
1918 && canBeStackingContainer() | 1954 && canBeStackingContainer() |
1919 && !hasOutOfFlowPositionedDescendant(); | 1955 && !hasOutOfFlowPositionedDescendant(); |
1920 | 1956 |
1921 #if ENABLE(ACCELERATED_OVERFLOW_SCROLLING) | 1957 #if ENABLE(ACCELERATED_OVERFLOW_SCROLLING) |
1922 m_needsCompositedScrolling = forceUseCompositedScrolling || renderer()->
style()->useTouchOverflowScrolling(); | 1958 needsCompositedScrolling = forceUseCompositedScrolling || renderer()->st
yle()->useTouchOverflowScrolling(); |
1923 #else | 1959 #else |
1924 m_needsCompositedScrolling = forceUseCompositedScrolling; | 1960 needsCompositedScrolling = forceUseCompositedScrolling; |
1925 #endif | 1961 #endif |
1926 // We gather a boolean value for use with Google UMA histograms to | 1962 // We gather a boolean value for use with Google UMA histograms to |
1927 // quantify the actual effects of a set of patches attempting to | 1963 // quantify the actual effects of a set of patches attempting to |
1928 // relax composited scrolling requirements, thereby increasing the | 1964 // relax composited scrolling requirements, thereby increasing the |
1929 // number of composited overflow divs. | 1965 // number of composited overflow divs. |
1930 if (acceleratedCompositingForOverflowScrollEnabled()) | 1966 if (acceleratedCompositingForOverflowScrollEnabled()) |
1931 HistogramSupport::histogramEnumeration("Renderer.NeedsCompositedScro
lling", m_needsCompositedScrolling, 2); | 1967 HistogramSupport::histogramEnumeration("Renderer.NeedsCompositedScro
lling", needsCompositedScrolling, 2); |
1932 } | 1968 } |
1933 | 1969 |
1934 if (oldNeedsCompositedScrolling != m_needsCompositedScrolling) { | 1970 if (m_needsCompositedScrolling == needsCompositedScrolling) |
1935 updateSelfPaintingLayer(); | 1971 return; |
1936 if (isStackingContainer()) | |
1937 dirtyZOrderLists(); | |
1938 else | |
1939 clearZOrderLists(); | |
1940 | 1972 |
1941 dirtyStackingContainerZOrderLists(); | 1973 m_needsCompositedScrolling = needsCompositedScrolling; |
1942 | 1974 |
1943 compositor()->setShouldReevaluateCompositingAfterLayout(); | 1975 updateIsNormalFlowOnly(); |
1944 compositor()->setCompositingLayersNeedRebuild(); | 1976 updateSelfPaintingLayer(); |
1945 } | 1977 |
| 1978 if (isStackingContainer()) |
| 1979 dirtyZOrderLists(); |
| 1980 else |
| 1981 clearZOrderLists(); |
| 1982 |
| 1983 dirtyStackingContainerZOrderLists(); |
| 1984 |
| 1985 compositor()->setShouldReevaluateCompositingAfterLayout(); |
| 1986 compositor()->setCompositingLayersNeedRebuild(); |
1946 } | 1987 } |
1947 | 1988 |
1948 static inline int adjustedScrollDelta(int beginningDelta) { | 1989 static inline int adjustedScrollDelta(int beginningDelta) { |
1949 // This implemention matches Firefox's. | 1990 // This implemention matches Firefox's. |
1950 // http://mxr.mozilla.org/firefox/source/toolkit/content/widgets/browser.xml
#856. | 1991 // http://mxr.mozilla.org/firefox/source/toolkit/content/widgets/browser.xml
#856. |
1951 const int speedReducer = 12; | 1992 const int speedReducer = 12; |
1952 | 1993 |
1953 int adjustedDelta = beginningDelta / speedReducer; | 1994 int adjustedDelta = beginningDelta / speedReducer; |
1954 if (adjustedDelta > 1) | 1995 if (adjustedDelta > 1) |
1955 adjustedDelta = static_cast<int>(adjustedDelta * sqrt(static_cast<double
>(adjustedDelta))) - 1; | 1996 adjustedDelta = static_cast<int>(adjustedDelta * sqrt(static_cast<double
>(adjustedDelta))) - 1; |
(...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2226 | 2267 |
2227 if (frameView) | 2268 if (frameView) |
2228 frameView->resumeScheduledEvents(); | 2269 frameView->resumeScheduledEvents(); |
2229 } | 2270 } |
2230 | 2271 |
2231 void RenderLayer::updateCompositingLayersAfterScroll() | 2272 void RenderLayer::updateCompositingLayersAfterScroll() |
2232 { | 2273 { |
2233 if (compositor()->inCompositingMode()) { | 2274 if (compositor()->inCompositingMode()) { |
2234 // Our stacking container is guaranteed to contain all of our descendant
s that may need | 2275 // Our stacking container is guaranteed to contain all of our descendant
s that may need |
2235 // repositioning, so update compositing layers from there. | 2276 // repositioning, so update compositing layers from there. |
2236 if (RenderLayer* compositingAncestor = stackingContainer()->enclosingCom
positingLayer()) { | 2277 if (RenderLayer* compositingAncestor = ancestorStackingContainer()->encl
osingCompositingLayer()) { |
2237 if (usesCompositedScrolling() && !hasOutOfFlowPositionedDescendant()
) | 2278 if (usesCompositedScrolling()) |
2238 compositor()->updateCompositingLayers(CompositingUpdateOnComposi
tedScroll, compositingAncestor); | 2279 compositor()->updateCompositingLayers(CompositingUpdateOnComposi
tedScroll, compositingAncestor); |
2239 else | 2280 else |
2240 compositor()->updateCompositingLayers(CompositingUpdateOnScroll,
compositingAncestor); | 2281 compositor()->updateCompositingLayers(CompositingUpdateOnScroll,
compositingAncestor); |
2241 } | 2282 } |
2242 } | 2283 } |
2243 } | 2284 } |
2244 | 2285 |
2245 LayoutRect RenderLayer::getRectToExpose(const LayoutRect &visibleRect, const Lay
outRect &exposeRect, const ScrollAlignment& alignX, const ScrollAlignment& align
Y) | 2286 LayoutRect RenderLayer::getRectToExpose(const LayoutRect &visibleRect, const Lay
outRect &exposeRect, const ScrollAlignment& alignX, const ScrollAlignment& align
Y) |
2246 { | 2287 { |
2247 // Determine the appropriate X behavior. | 2288 // Determine the appropriate X behavior. |
(...skipping 1788 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4036 paintOverflowControls(context, roundedIntPoint(toPoint(fragment.layerBou
nds.location() - renderBoxLocation() + localPaintingInfo.subPixelAccumulation)), | 4077 paintOverflowControls(context, roundedIntPoint(toPoint(fragment.layerBou
nds.location() - renderBoxLocation() + localPaintingInfo.subPixelAccumulation)), |
4037 pixelSnappedIntRect(fragment.backgroundRect.rect()), true); | 4078 pixelSnappedIntRect(fragment.backgroundRect.rect()), true); |
4038 restoreClip(context, localPaintingInfo.paintDirtyRect, fragment.backgrou
ndRect); | 4079 restoreClip(context, localPaintingInfo.paintDirtyRect, fragment.backgrou
ndRect); |
4039 } | 4080 } |
4040 } | 4081 } |
4041 | 4082 |
4042 void RenderLayer::paintPaginatedChildLayer(RenderLayer* childLayer, GraphicsCont
ext* context, const LayerPaintingInfo& paintingInfo, PaintLayerFlags paintFlags) | 4083 void RenderLayer::paintPaginatedChildLayer(RenderLayer* childLayer, GraphicsCont
ext* context, const LayerPaintingInfo& paintingInfo, PaintLayerFlags paintFlags) |
4043 { | 4084 { |
4044 // We need to do multiple passes, breaking up our child layer into strips. | 4085 // We need to do multiple passes, breaking up our child layer into strips. |
4045 Vector<RenderLayer*> columnLayers; | 4086 Vector<RenderLayer*> columnLayers; |
4046 RenderLayer* ancestorLayer = isNormalFlowOnly() ? parent() : stackingContain
er(); | 4087 RenderLayer* ancestorLayer = isNormalFlowOnly() ? parent() : ancestorStackin
gContainer(); |
4047 for (RenderLayer* curr = childLayer->parent(); curr; curr = curr->parent())
{ | 4088 for (RenderLayer* curr = childLayer->parent(); curr; curr = curr->parent())
{ |
4048 if (curr->renderer()->hasColumns() && checkContainingBlockChainForPagina
tion(childLayer->renderer(), curr->renderBox())) | 4089 if (curr->renderer()->hasColumns() && checkContainingBlockChainForPagina
tion(childLayer->renderer(), curr->renderBox())) |
4049 columnLayers.append(curr); | 4090 columnLayers.append(curr); |
4050 if (curr == ancestorLayer) | 4091 if (curr == ancestorLayer) |
4051 break; | 4092 break; |
4052 } | 4093 } |
4053 | 4094 |
4054 // It is possible for paintLayer() to be called after the child layer ceases
to be paginated but before | 4095 // It is possible for paintLayer() to be called after the child layer ceases
to be paginated but before |
4055 // updateLayerPositions() is called and resets the isPaginated() flag, see <
rdar://problem/10098679>. | 4096 // updateLayerPositions() is called and resets the isPaginated() flag, see <
rdar://problem/10098679>. |
4056 // If this is the case, just bail out, since the upcoming call to updateLaye
rPositions() will repaint the layer. | 4097 // If this is the case, just bail out, since the upcoming call to updateLaye
rPositions() will repaint the layer. |
(...skipping 577 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4634 } | 4675 } |
4635 } | 4676 } |
4636 | 4677 |
4637 return resultLayer; | 4678 return resultLayer; |
4638 } | 4679 } |
4639 | 4680 |
4640 RenderLayer* RenderLayer::hitTestPaginatedChildLayer(RenderLayer* childLayer, Re
nderLayer* rootLayer, const HitTestRequest& request, HitTestResult& result, | 4681 RenderLayer* RenderLayer::hitTestPaginatedChildLayer(RenderLayer* childLayer, Re
nderLayer* rootLayer, const HitTestRequest& request, HitTestResult& result, |
4641 const LayoutRect& hitTestRe
ct, const HitTestLocation& hitTestLocation, const HitTestingTransformState* tran
sformState, double* zOffset) | 4682 const LayoutRect& hitTestRe
ct, const HitTestLocation& hitTestLocation, const HitTestingTransformState* tran
sformState, double* zOffset) |
4642 { | 4683 { |
4643 Vector<RenderLayer*> columnLayers; | 4684 Vector<RenderLayer*> columnLayers; |
4644 RenderLayer* ancestorLayer = isNormalFlowOnly() ? parent() : stackingContain
er(); | 4685 RenderLayer* ancestorLayer = isNormalFlowOnly() ? parent() : ancestorStackin
gContainer(); |
4645 for (RenderLayer* curr = childLayer->parent(); curr; curr = curr->parent())
{ | 4686 for (RenderLayer* curr = childLayer->parent(); curr; curr = curr->parent())
{ |
4646 if (curr->renderer()->hasColumns() && checkContainingBlockChainForPagina
tion(childLayer->renderer(), curr->renderBox())) | 4687 if (curr->renderer()->hasColumns() && checkContainingBlockChainForPagina
tion(childLayer->renderer(), curr->renderBox())) |
4647 columnLayers.append(curr); | 4688 columnLayers.append(curr); |
4648 if (curr == ancestorLayer) | 4689 if (curr == ancestorLayer) |
4649 break; | 4690 break; |
4650 } | 4691 } |
4651 | 4692 |
4652 ASSERT(columnLayers.size()); | 4693 ASSERT(columnLayers.size()); |
4653 return hitTestChildLayerColumns(childLayer, rootLayer, request, result, hitT
estRect, hitTestLocation, transformState, zOffset, | 4694 return hitTestChildLayerColumns(childLayer, rootLayer, request, result, hitT
estRect, hitTestLocation, transformState, zOffset, |
4654 columnLayers, columnLayers.size() - 1); | 4695 columnLayers, columnLayers.size() - 1); |
(...skipping 792 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5447 { | 5488 { |
5448 ASSERT(m_layerListMutationAllowed); | 5489 ASSERT(m_layerListMutationAllowed); |
5449 ASSERT(isStackingContainer()); | 5490 ASSERT(isStackingContainer()); |
5450 | 5491 |
5451 if (m_posZOrderList) | 5492 if (m_posZOrderList) |
5452 m_posZOrderList->clear(); | 5493 m_posZOrderList->clear(); |
5453 if (m_negZOrderList) | 5494 if (m_negZOrderList) |
5454 m_negZOrderList->clear(); | 5495 m_negZOrderList->clear(); |
5455 m_zOrderListsDirty = true; | 5496 m_zOrderListsDirty = true; |
5456 | 5497 |
| 5498 m_descendantsAreContiguousInStackingOrderDirty = true; |
| 5499 |
5457 if (!renderer()->documentBeingDestroyed()) { | 5500 if (!renderer()->documentBeingDestroyed()) { |
5458 compositor()->setCompositingLayersNeedRebuild(); | 5501 compositor()->setCompositingLayersNeedRebuild(); |
5459 if (acceleratedCompositingForOverflowScrollEnabled()) | 5502 if (acceleratedCompositingForOverflowScrollEnabled()) |
5460 compositor()->setShouldReevaluateCompositingAfterLayout(); | 5503 compositor()->setShouldReevaluateCompositingAfterLayout(); |
5461 } | 5504 } |
5462 } | 5505 } |
5463 | 5506 |
5464 void RenderLayer::dirtyStackingContainerZOrderLists() | 5507 void RenderLayer::dirtyStackingContainerZOrderLists() |
5465 { | 5508 { |
5466 RenderLayer* sc = stackingContainer(); | 5509 RenderLayer* stackingContainer = this->ancestorStackingContainer(); |
5467 if (sc) | 5510 if (stackingContainer) |
5468 sc->dirtyZOrderLists(); | 5511 stackingContainer->dirtyZOrderLists(); |
| 5512 |
| 5513 // Any change that could affect our stacking container's z-order list could |
| 5514 // cause other RenderLayers in our stacking context to either opt in or out |
| 5515 // of composited scrolling. It is important that we make our stacking |
| 5516 // context aware of these z-order changes so the appropriate updating can |
| 5517 // happen. |
| 5518 RenderLayer* stackingContext = this->ancestorStackingContext(); |
| 5519 if (stackingContext && stackingContext != stackingContainer) |
| 5520 stackingContext->dirtyZOrderLists(); |
5469 } | 5521 } |
5470 | 5522 |
5471 void RenderLayer::dirtyNormalFlowList() | 5523 void RenderLayer::dirtyNormalFlowList() |
5472 { | 5524 { |
5473 ASSERT(m_layerListMutationAllowed); | 5525 ASSERT(m_layerListMutationAllowed); |
5474 | 5526 |
5475 if (m_normalFlowList) | 5527 if (m_normalFlowList) |
5476 m_normalFlowList->clear(); | 5528 m_normalFlowList->clear(); |
5477 m_normalFlowListDirty = true; | 5529 m_normalFlowListDirty = true; |
5478 | 5530 |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5571 for (RenderLayer* child = firstChild(); child; child = child->nextSiblin
g()) { | 5623 for (RenderLayer* child = firstChild(); child; child = child->nextSiblin
g()) { |
5572 // Ignore reflections. | 5624 // Ignore reflections. |
5573 if (!m_reflection || reflectionLayer() != child) | 5625 if (!m_reflection || reflectionLayer() != child) |
5574 child->collectLayers(includeHiddenLayers, behavior, posBuffer, n
egBuffer); | 5626 child->collectLayers(includeHiddenLayers, behavior, posBuffer, n
egBuffer); |
5575 } | 5627 } |
5576 } | 5628 } |
5577 } | 5629 } |
5578 | 5630 |
5579 void RenderLayer::updateLayerListsIfNeeded() | 5631 void RenderLayer::updateLayerListsIfNeeded() |
5580 { | 5632 { |
5581 bool shouldUpdateDescendantsAreContiguousInStackingOrder = isStackingContext
() && (m_zOrderListsDirty || m_normalFlowListDirty); | 5633 bool shouldUpdateDescendantsAreContiguousInStackingOrder = acceleratedCompos
itingForOverflowScrollEnabled() && isStackingContext() && (m_zOrderListsDirty ||
m_normalFlowListDirty) && m_descendantsAreContiguousInStackingOrderDirty; |
5582 updateZOrderLists(); | 5634 updateZOrderLists(); |
5583 updateNormalFlowList(); | 5635 updateNormalFlowList(); |
5584 | 5636 |
5585 if (RenderLayer* reflectionLayer = this->reflectionLayer()) { | 5637 if (RenderLayer* reflectionLayer = this->reflectionLayer()) { |
5586 reflectionLayer->updateZOrderLists(); | 5638 reflectionLayer->updateZOrderLists(); |
5587 reflectionLayer->updateNormalFlowList(); | 5639 reflectionLayer->updateNormalFlowList(); |
5588 } | 5640 } |
5589 | 5641 |
5590 if (shouldUpdateDescendantsAreContiguousInStackingOrder) { | 5642 if (shouldUpdateDescendantsAreContiguousInStackingOrder) { |
5591 updateDescendantsAreContiguousInStackingOrder(); | 5643 updateDescendantsAreContiguousInStackingOrder(); |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5665 && !renderer()->hasBlendMode() | 5717 && !renderer()->hasBlendMode() |
5666 #endif | 5718 #endif |
5667 && !isTransparent() | 5719 && !isTransparent() |
5668 && !needsCompositedScrolling() | 5720 && !needsCompositedScrolling() |
5669 #if ENABLE(CSS_EXCLUSIONS) | 5721 #if ENABLE(CSS_EXCLUSIONS) |
5670 && !renderer()->isFloatingWithShapeOutside() | 5722 && !renderer()->isFloatingWithShapeOutside() |
5671 #endif | 5723 #endif |
5672 ; | 5724 ; |
5673 } | 5725 } |
5674 | 5726 |
| 5727 void RenderLayer::updateIsNormalFlowOnly() |
| 5728 { |
| 5729 bool isNormalFlowOnly = shouldBeNormalFlowOnly(); |
| 5730 if (isNormalFlowOnly == m_isNormalFlowOnly) |
| 5731 return; |
| 5732 |
| 5733 m_isNormalFlowOnly = isNormalFlowOnly; |
| 5734 if (RenderLayer* p = parent()) |
| 5735 p->dirtyNormalFlowList(); |
| 5736 dirtyStackingContainerZOrderLists(); |
| 5737 } |
| 5738 |
5675 bool RenderLayer::shouldBeSelfPaintingLayer() const | 5739 bool RenderLayer::shouldBeSelfPaintingLayer() const |
5676 { | 5740 { |
5677 return !isNormalFlowOnly() | 5741 return !isNormalFlowOnly() |
5678 || hasOverlayScrollbars() | 5742 || hasOverlayScrollbars() |
5679 || needsCompositedScrolling() | 5743 || needsCompositedScrolling() |
5680 || renderer()->hasReflection() | 5744 || renderer()->hasReflection() |
5681 || renderer()->hasMask() | 5745 || renderer()->hasMask() |
5682 || renderer()->isTableRow() | 5746 || renderer()->isTableRow() |
5683 || renderer()->isCanvas() | 5747 || renderer()->isCanvas() |
5684 || renderer()->isVideo() | 5748 || renderer()->isVideo() |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5747 | 5811 |
5748 if (renderer()->isReplaced() || renderer()->hasMask()) | 5812 if (renderer()->isReplaced() || renderer()->hasMask()) |
5749 return true; | 5813 return true; |
5750 | 5814 |
5751 if (hasVisibleBoxDecorations()) | 5815 if (hasVisibleBoxDecorations()) |
5752 return true; | 5816 return true; |
5753 | 5817 |
5754 return false; | 5818 return false; |
5755 } | 5819 } |
5756 | 5820 |
| 5821 void RenderLayer::updateVisibilityAfterStyleChange(const RenderStyle* oldStyle) |
| 5822 { |
| 5823 EVisibility oldVisibility = oldStyle ? oldStyle->visibility() : VISIBLE; |
| 5824 if (oldVisibility == renderer()->style()->visibility() || !renderer()->isOut
OfFlowPositioned()) |
| 5825 return; |
| 5826 |
| 5827 if (renderer()->style()->visibility() == VISIBLE) |
| 5828 setAncestorChainHasOutOfFlowPositionedDescendant(renderer()->containingB
lock()); |
| 5829 else |
| 5830 dirtyAncestorChainHasOutOfFlowPositionedDescendantStatus(); |
| 5831 } |
| 5832 |
5757 void RenderLayer::updateStackingContextsAfterStyleChange(const RenderStyle* oldS
tyle) | 5833 void RenderLayer::updateStackingContextsAfterStyleChange(const RenderStyle* oldS
tyle) |
5758 { | 5834 { |
5759 if (!oldStyle) | 5835 bool wasStackingContext = oldStyle ? isStackingContext(oldStyle) : false; |
5760 return; | 5836 EVisibility oldVisibility = oldStyle ? oldStyle->visibility() : VISIBLE; |
5761 | 5837 int oldZIndex = oldStyle ? oldStyle->zIndex() : 0; |
5762 bool wasStackingContext = isStackingContext(oldStyle); | |
5763 bool isStackingContext = this->isStackingContext(); | |
5764 if (isStackingContext != wasStackingContext) { | |
5765 dirtyStackingContainerZOrderLists(); | |
5766 if (isStackingContext) | |
5767 dirtyZOrderLists(); | |
5768 else | |
5769 clearZOrderLists(); | |
5770 return; | |
5771 } | |
5772 | 5838 |
5773 // FIXME: RenderLayer already handles visibility changes through our visibli
ty dirty bits. This logic could | 5839 // FIXME: RenderLayer already handles visibility changes through our visibli
ty dirty bits. This logic could |
5774 // likely be folded along with the rest. | 5840 // likely be folded along with the rest. |
5775 if (oldStyle->zIndex() != renderer()->style()->zIndex() || oldStyle->visibil
ity() != renderer()->style()->visibility()) { | 5841 bool isStackingContext = this->isStackingContext(); |
5776 dirtyStackingContainerZOrderLists(); | 5842 if (isStackingContext == wasStackingContext && oldVisibility == renderer()->
style()->visibility() && oldZIndex == renderer()->style()->zIndex()) |
5777 if (isStackingContext) | 5843 return; |
5778 dirtyZOrderLists(); | 5844 |
5779 } | 5845 dirtyStackingContainerZOrderLists(); |
| 5846 |
| 5847 if (isStackingContainer()) |
| 5848 dirtyZOrderLists(); |
| 5849 else |
| 5850 clearZOrderLists(); |
| 5851 |
| 5852 updateNeedsCompositedScrolling(); |
5780 } | 5853 } |
5781 | 5854 |
5782 static bool overflowRequiresScrollbar(EOverflow overflow) | 5855 static bool overflowRequiresScrollbar(EOverflow overflow) |
5783 { | 5856 { |
5784 return overflow == OSCROLL; | 5857 return overflow == OSCROLL; |
5785 } | 5858 } |
5786 | 5859 |
5787 static bool overflowDefinesAutomaticScrollbar(EOverflow overflow) | 5860 static bool overflowDefinesAutomaticScrollbar(EOverflow overflow) |
5788 { | 5861 { |
5789 return overflow == OAUTO || overflow == OOVERLAY; | 5862 return overflow == OAUTO || overflow == OOVERLAY; |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5835 layer->m_hasOutOfFlowPositionedDescendant = true; | 5908 layer->m_hasOutOfFlowPositionedDescendant = true; |
5836 layer->updateNeedsCompositedScrolling(); | 5909 layer->updateNeedsCompositedScrolling(); |
5837 | 5910 |
5838 if (layer->renderer() && layer->renderer() == containingBlock) | 5911 if (layer->renderer() && layer->renderer() == containingBlock) |
5839 break; | 5912 break; |
5840 } | 5913 } |
5841 } | 5914 } |
5842 | 5915 |
5843 void RenderLayer::dirtyAncestorChainHasOutOfFlowPositionedDescendantStatus() | 5916 void RenderLayer::dirtyAncestorChainHasOutOfFlowPositionedDescendantStatus() |
5844 { | 5917 { |
5845 m_hasOutOfFlowPositionedDescendantDirty = true; | 5918 if (m_hasOutOfFlowPositionedDescendant) { |
| 5919 m_hasOutOfFlowPositionedDescendantDirty = true; |
| 5920 // FIXME It would be nice to avoid this when we clean up render layer |
| 5921 // updating. We shouldn't have to update the composited scrolling state |
| 5922 // nearly as frequently if all the updates happen in a single, well |
| 5923 // defined phase. |
| 5924 updateNeedsCompositedScrolling(); |
| 5925 } |
| 5926 |
5846 if (parent()) | 5927 if (parent()) |
5847 parent()->dirtyAncestorChainHasOutOfFlowPositionedDescendantStatus(); | 5928 parent()->dirtyAncestorChainHasOutOfFlowPositionedDescendantStatus(); |
5848 } | 5929 } |
5849 | 5930 |
5850 void RenderLayer::updateOutOfFlowPositioned(const RenderStyle* oldStyle) | 5931 void RenderLayer::updateOutOfFlowPositioned(const RenderStyle* oldStyle) |
5851 { | 5932 { |
5852 bool wasOutOfFlowPositioned = oldStyle && (oldStyle->position() == AbsoluteP
osition || oldStyle->position() == FixedPosition); | 5933 bool wasOutOfFlowPositioned = oldStyle && (oldStyle->position() == AbsoluteP
osition || oldStyle->position() == FixedPosition); |
5853 if (parent() && ((renderer() && renderer()->isOutOfFlowPositioned()) != wasO
utOfFlowPositioned)) { | 5934 bool isOutOfFlowPositioned = renderer()->isOutOfFlowPositioned(); |
5854 parent()->dirtyAncestorChainHasOutOfFlowPositionedDescendantStatus(); | 5935 if (parent() && isOutOfFlowPositioned != wasOutOfFlowPositioned) { |
5855 if (!renderer()->documentBeingDestroyed() && acceleratedCompositingForOv
erflowScrollEnabled()) | 5936 if (isOutOfFlowPositioned) |
5856 compositor()->setShouldReevaluateCompositingAfterLayout(); | 5937 parent()->setAncestorChainHasOutOfFlowPositionedDescendant(renderer(
)->containingBlock()); |
| 5938 else |
| 5939 parent()->dirtyAncestorChainHasOutOfFlowPositionedDescendantStatus()
; |
5857 } | 5940 } |
5858 } | 5941 } |
5859 | 5942 |
5860 static bool hasOrHadFilters(const RenderStyle* oldStyle, const RenderStyle* newS
tyle) | 5943 static bool hasOrHadFilters(const RenderStyle* oldStyle, const RenderStyle* newS
tyle) |
5861 { | 5944 { |
5862 ASSERT(newStyle); | 5945 ASSERT(newStyle); |
5863 return (oldStyle && oldStyle->hasFilter()) || newStyle->hasFilter(); | 5946 return (oldStyle && oldStyle->hasFilter()) || newStyle->hasFilter(); |
5864 } | 5947 } |
5865 | 5948 |
5866 inline bool RenderLayer::needsCompositingLayersRebuiltForClip(const RenderStyle*
oldStyle, const RenderStyle* newStyle) const | 5949 inline bool RenderLayer::needsCompositingLayersRebuiltForClip(const RenderStyle*
oldStyle, const RenderStyle* newStyle) const |
5867 { | 5950 { |
5868 ASSERT(newStyle); | 5951 ASSERT(newStyle); |
5869 return oldStyle && (oldStyle->clip() != newStyle->clip() || oldStyle->hasCli
p() != newStyle->hasClip()); | 5952 return oldStyle && (oldStyle->clip() != newStyle->clip() || oldStyle->hasCli
p() != newStyle->hasClip()); |
5870 } | 5953 } |
5871 | 5954 |
5872 inline bool RenderLayer::needsCompositingLayersRebuiltForOverflow(const RenderSt
yle* oldStyle, const RenderStyle* newStyle) const | 5955 inline bool RenderLayer::needsCompositingLayersRebuiltForOverflow(const RenderSt
yle* oldStyle, const RenderStyle* newStyle) const |
5873 { | 5956 { |
5874 ASSERT(newStyle); | 5957 ASSERT(newStyle); |
5875 return !isComposited() && oldStyle && (oldStyle->overflowX() != newStyle->ov
erflowX()) && stackingContainer()->hasCompositingDescendant(); | 5958 return !isComposited() && oldStyle && (oldStyle->overflowX() != newStyle->ov
erflowX()) && ancestorStackingContainer()->hasCompositingDescendant(); |
5876 } | 5959 } |
5877 | 5960 |
5878 inline bool RenderLayer::needsCompositingLayersRebuiltForFilters(const RenderSty
le* oldStyle, const RenderStyle* newStyle, bool didPaintWithFilters) const | 5961 inline bool RenderLayer::needsCompositingLayersRebuiltForFilters(const RenderSty
le* oldStyle, const RenderStyle* newStyle, bool didPaintWithFilters) const |
5879 { | 5962 { |
5880 if (!hasOrHadFilters(oldStyle, newStyle)) | 5963 if (!hasOrHadFilters(oldStyle, newStyle)) |
5881 return false; | 5964 return false; |
5882 | 5965 |
5883 if (renderer()->animation()->isRunningAcceleratedAnimationOnRenderer(rendere
r(), CSSPropertyWebkitFilter)) { | 5966 if (renderer()->animation()->isRunningAcceleratedAnimationOnRenderer(rendere
r(), CSSPropertyWebkitFilter)) { |
5884 // When the compositor is performing the filter animation, we shouldn't
touch the compositing layers. | 5967 // When the compositor is performing the filter animation, we shouldn't
touch the compositing layers. |
5885 // All of the layers above us should have been promoted to compositing l
ayers already. | 5968 // All of the layers above us should have been promoted to compositing l
ayers already. |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5924 // Thus, we have to call updateFilters again, after we have a FilterEffectRe
nderer. | 6007 // Thus, we have to call updateFilters again, after we have a FilterEffectRe
nderer. |
5925 // FilterEffectRenderer is intended to render software filters and shouldn't
be needed for accelerated filters. | 6008 // FilterEffectRenderer is intended to render software filters and shouldn't
be needed for accelerated filters. |
5926 // We should extract the SVG graph building functionality out of FilterEffec
tRenderer, and it should happen in RenderLayer::computeFilterOperations. | 6009 // We should extract the SVG graph building functionality out of FilterEffec
tRenderer, and it should happen in RenderLayer::computeFilterOperations. |
5927 // https://bugs.webkit.org/show_bug.cgi?id=114051 | 6010 // https://bugs.webkit.org/show_bug.cgi?id=114051 |
5928 if (shouldUpdateFilters && newStyle->filter().hasReferenceFilter()) | 6011 if (shouldUpdateFilters && newStyle->filter().hasReferenceFilter()) |
5929 backing()->updateFilters(renderer()->style()); | 6012 backing()->updateFilters(renderer()->style()); |
5930 } | 6013 } |
5931 | 6014 |
5932 void RenderLayer::styleChanged(StyleDifference, const RenderStyle* oldStyle) | 6015 void RenderLayer::styleChanged(StyleDifference, const RenderStyle* oldStyle) |
5933 { | 6016 { |
5934 bool isNormalFlowOnly = shouldBeNormalFlowOnly(); | |
5935 if (isNormalFlowOnly != m_isNormalFlowOnly) { | |
5936 m_isNormalFlowOnly = isNormalFlowOnly; | |
5937 RenderLayer* p = parent(); | |
5938 if (p) | |
5939 p->dirtyNormalFlowList(); | |
5940 dirtyStackingContainerZOrderLists(); | |
5941 } | |
5942 | |
5943 if (renderer()->style()->overflowX() == OMARQUEE && renderer()->style()->mar
queeBehavior() != MNONE && renderer()->isBox()) { | 6017 if (renderer()->style()->overflowX() == OMARQUEE && renderer()->style()->mar
queeBehavior() != MNONE && renderer()->isBox()) { |
5944 if (!m_marquee) | 6018 if (!m_marquee) |
5945 m_marquee = adoptPtr(new RenderMarquee(this)); | 6019 m_marquee = adoptPtr(new RenderMarquee(this)); |
5946 UseCounter::observe(renderer()->document(), renderer()->isHTMLMarquee()
? UseCounter::HTMLMarqueeElement : UseCounter::CSSOverflowMarquee); | 6020 UseCounter::observe(renderer()->document(), renderer()->isHTMLMarquee()
? UseCounter::HTMLMarqueeElement : UseCounter::CSSOverflowMarquee); |
5947 m_marquee->updateMarqueeStyle(); | 6021 m_marquee->updateMarqueeStyle(); |
5948 } | 6022 } |
5949 else if (m_marquee) { | 6023 else if (m_marquee) { |
5950 m_marquee.clear(); | 6024 m_marquee.clear(); |
5951 } | 6025 } |
5952 | 6026 |
5953 updateScrollbarsAfterStyleChange(oldStyle); | 6027 updateScrollbarsAfterStyleChange(oldStyle); |
5954 updateStackingContextsAfterStyleChange(oldStyle); | 6028 updateStackingContextsAfterStyleChange(oldStyle); |
| 6029 updateVisibilityAfterStyleChange(oldStyle); |
5955 // Overlay scrollbars can make this layer self-painting so we need | 6030 // Overlay scrollbars can make this layer self-painting so we need |
5956 // to recompute the bit once scrollbars have been updated. | 6031 // to recompute the bit once scrollbars have been updated. |
5957 updateSelfPaintingLayer(); | 6032 updateSelfPaintingLayer(); |
5958 updateOutOfFlowPositioned(oldStyle); | 6033 updateOutOfFlowPositioned(oldStyle); |
5959 | 6034 |
5960 if (!hasReflection() && m_reflection) | 6035 if (!hasReflection() && m_reflection) |
5961 removeReflection(); | 6036 removeReflection(); |
5962 else if (hasReflection()) { | 6037 else if (hasReflection()) { |
5963 if (!m_reflection) | 6038 if (!m_reflection) |
5964 createReflection(); | 6039 createReflection(); |
(...skipping 15 matching lines...) Expand all Loading... |
5980 #if ENABLE(CSS_COMPOSITING) | 6055 #if ENABLE(CSS_COMPOSITING) |
5981 updateBlendMode(); | 6056 updateBlendMode(); |
5982 #endif | 6057 #endif |
5983 | 6058 |
5984 bool didPaintWithFilters = false; | 6059 bool didPaintWithFilters = false; |
5985 | 6060 |
5986 if (paintsWithFilters()) | 6061 if (paintsWithFilters()) |
5987 didPaintWithFilters = true; | 6062 didPaintWithFilters = true; |
5988 updateFilters(oldStyle, renderer()->style()); | 6063 updateFilters(oldStyle, renderer()->style()); |
5989 | 6064 |
5990 updateNeedsCompositedScrolling(); | |
5991 | |
5992 const RenderStyle* newStyle = renderer()->style(); | 6065 const RenderStyle* newStyle = renderer()->style(); |
5993 if (compositor()->updateLayerCompositingState(this) | 6066 if (compositor()->updateLayerCompositingState(this) |
5994 || needsCompositingLayersRebuiltForClip(oldStyle, newStyle) | 6067 || needsCompositingLayersRebuiltForClip(oldStyle, newStyle) |
5995 || needsCompositingLayersRebuiltForOverflow(oldStyle, newStyle) | 6068 || needsCompositingLayersRebuiltForOverflow(oldStyle, newStyle) |
5996 || needsCompositingLayersRebuiltForFilters(oldStyle, newStyle, didPaintW
ithFilters)) | 6069 || needsCompositingLayersRebuiltForFilters(oldStyle, newStyle, didPaintW
ithFilters)) |
5997 compositor()->setCompositingLayersNeedRebuild(); | 6070 compositor()->setCompositingLayersNeedRebuild(); |
5998 else if (isComposited()) | 6071 else if (isComposited()) |
5999 backing()->updateGraphicsLayerGeometry(); | 6072 backing()->updateGraphicsLayerGeometry(); |
6000 } | 6073 } |
6001 | 6074 |
6002 void RenderLayer::updateScrollableAreaSet(bool hasOverflow) | 6075 void RenderLayer::updateScrollableAreaSet(bool hasOverflow) |
6003 { | 6076 { |
6004 Frame* frame = renderer()->frame(); | 6077 Frame* frame = renderer()->frame(); |
6005 if (!frame) | 6078 if (!frame) |
6006 return; | 6079 return; |
6007 | 6080 |
6008 FrameView* frameView = frame->view(); | 6081 FrameView* frameView = frame->view(); |
6009 if (!frameView) | 6082 if (!frameView) |
6010 return; | 6083 return; |
6011 | 6084 |
6012 bool isVisibleToHitTest = renderer()->visibleToHitTesting(); | 6085 bool isVisibleToHitTest = renderer()->visibleToHitTesting(); |
6013 if (HTMLFrameOwnerElement* owner = frame->ownerElement()) | 6086 if (HTMLFrameOwnerElement* owner = frame->ownerElement()) |
6014 isVisibleToHitTest &= owner->renderer() && owner->renderer()->visibleToH
itTesting(); | 6087 isVisibleToHitTest &= owner->renderer() && owner->renderer()->visibleToH
itTesting(); |
6015 | 6088 |
6016 if (hasOverflow && isVisibleToHitTest ? frameView->addScrollableArea(this) :
frameView->removeScrollableArea(this)) | 6089 bool updatedScrollableAreaSet = false; |
| 6090 if (hasOverflow && isVisibleToHitTest) |
| 6091 updatedScrollableAreaSet = frameView->addScrollableArea(this); |
| 6092 else |
| 6093 updatedScrollableAreaSet = frameView->removeScrollableArea(this); |
| 6094 |
| 6095 if (updatedScrollableAreaSet) |
6017 updateNeedsCompositedScrolling(); | 6096 updateNeedsCompositedScrolling(); |
6018 } | 6097 } |
6019 | 6098 |
6020 void RenderLayer::updateScrollCornerStyle() | 6099 void RenderLayer::updateScrollCornerStyle() |
6021 { | 6100 { |
6022 RenderObject* actualRenderer = rendererForScrollbar(renderer()); | 6101 RenderObject* actualRenderer = rendererForScrollbar(renderer()); |
6023 RefPtr<RenderStyle> corner = renderer()->hasOverflowClip() ? actualRenderer-
>getUncachedPseudoStyle(PseudoStyleRequest(SCROLLBAR_CORNER), actualRenderer->st
yle()) : PassRefPtr<RenderStyle>(0); | 6102 RefPtr<RenderStyle> corner = renderer()->hasOverflowClip() ? actualRenderer-
>getUncachedPseudoStyle(PseudoStyleRequest(SCROLLBAR_CORNER), actualRenderer->st
yle()) : PassRefPtr<RenderStyle>(0); |
6024 if (corner) { | 6103 if (corner) { |
6025 if (!m_scrollCorner) { | 6104 if (!m_scrollCorner) { |
6026 m_scrollCorner = RenderScrollbarPart::createAnonymous(renderer()->do
cument()); | 6105 m_scrollCorner = RenderScrollbarPart::createAnonymous(renderer()->do
cument()); |
(...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6258 } | 6337 } |
6259 } | 6338 } |
6260 | 6339 |
6261 void showLayerTree(const WebCore::RenderObject* renderer) | 6340 void showLayerTree(const WebCore::RenderObject* renderer) |
6262 { | 6341 { |
6263 if (!renderer) | 6342 if (!renderer) |
6264 return; | 6343 return; |
6265 showLayerTree(renderer->enclosingLayer()); | 6344 showLayerTree(renderer->enclosingLayer()); |
6266 } | 6345 } |
6267 #endif | 6346 #endif |
OLD | NEW |