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

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

Issue 1308273010: Adapt and reland old position sticky implementation (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Force main thread scrolling, set experimental status, and address review comments. Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2012 Apple Inc. All rights reserved. 2 * Copyright (C) 2012 Apple Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are met:
7 * 1. Redistributions of source code must retain the above copyright 7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer. 8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright 9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the 10 * notice, this list of conditions and the following disclaimer in the
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
91 if (currentStep.m_transform) 91 if (currentStep.m_transform)
92 transformState.applyTransform(*currentStep.m_transform.get(), ac cumulate); 92 transformState.applyTransform(*currentStep.m_transform.get(), ac cumulate);
93 else 93 else
94 transformState.move(currentStep.m_offset.width(), currentStep.m_ offset.height(), accumulate); 94 transformState.move(currentStep.m_offset.width(), currentStep.m_ offset.height(), accumulate);
95 } 95 }
96 96
97 if (inFixed && !currentStep.m_offsetForFixedPosition.isZero()) { 97 if (inFixed && !currentStep.m_offsetForFixedPosition.isZero()) {
98 ASSERT(currentStep.m_layoutObject->isLayoutView()); 98 ASSERT(currentStep.m_layoutObject->isLayoutView());
99 transformState.move(currentStep.m_offsetForFixedPosition); 99 transformState.move(currentStep.m_offsetForFixedPosition);
100 } 100 }
101 if (!currentStep.m_offsetForStickyPosition.isZero()) {
102 ASSERT(currentStep.m_layoutObject->style()->position() == StickyPosi tion);
103 transformState.move(currentStep.m_offsetForStickyPosition);
104 }
101 } 105 }
102 106
103 ASSERT(foundContainer); 107 ASSERT(foundContainer);
104 transformState.flatten(); 108 transformState.flatten();
105 } 109 }
106 110
107 #ifndef NDEBUG 111 #ifndef NDEBUG
108 // Handy function to call from gdb while debugging mismatched point/rect errors. 112 // Handy function to call from gdb while debugging mismatched point/rect errors.
109 void LayoutGeometryMap::dumpSteps() const 113 void LayoutGeometryMap::dumpSteps() const
110 { 114 {
111 fprintf(stderr, "LayoutGeometryMap::dumpSteps accumulatedOffset=%d,%d\n", m_ accumulatedOffset.width().toInt(), m_accumulatedOffset.height().toInt()); 115 fprintf(stderr, "LayoutGeometryMap::dumpSteps accumulatedOffset=%d,%d\n", m_ accumulatedOffset.width().toInt(), m_accumulatedOffset.height().toInt());
112 for (int i = m_mapping.size() - 1; i >= 0; --i) { 116 for (int i = m_mapping.size() - 1; i >= 0; --i) {
113 fprintf(stderr, " [%d] %s: offset=%d,%d", i, 117 fprintf(stderr, " [%d] %s: offset=%d,%d", i,
114 m_mapping[i].m_layoutObject->debugName().ascii().data(), 118 m_mapping[i].m_layoutObject->debugName().ascii().data(),
115 m_mapping[i].m_offset.width().toInt(), 119 m_mapping[i].m_offset.width().toInt(),
116 m_mapping[i].m_offset.height().toInt()); 120 m_mapping[i].m_offset.height().toInt());
117 if (m_mapping[i].m_hasTransform) 121 if (m_mapping[i].m_hasTransform)
118 fprintf(stderr, " hasTransform"); 122 fprintf(stderr, " hasTransform");
119 fprintf(stderr, "\n"); 123 fprintf(stderr, "\n");
120 } 124 }
121 } 125 }
122 #endif 126 #endif
123 127
124 FloatQuad LayoutGeometryMap::mapToContainer(const FloatRect& rect, const LayoutB oxModelObject* container) const 128 FloatQuad LayoutGeometryMap::mapToContainer(const FloatRect& rect, const LayoutB oxModelObject* container) const
125 { 129 {
126 FloatQuad result; 130 FloatQuad result;
127
128 if (!hasFixedPositionStep() && !hasTransformStep() && !hasNonUniformStep() & & (!container || (m_mapping.size() && container == m_mapping[0].m_layoutObject)) ) { 131 if (!hasFixedPositionStep() && !hasTransformStep() && !hasNonUniformStep() & & (!container || (m_mapping.size() && container == m_mapping[0].m_layoutObject)) ) {
129 result = rect; 132 result = rect;
130 result.move(m_accumulatedOffset); 133 result.move(m_accumulatedOffset);
131 } else { 134 } else {
132 TransformState transformState(TransformState::ApplyTransformDirection, r ect.center(), rect); 135 TransformState transformState(TransformState::ApplyTransformDirection, r ect.center(), rect);
133 mapToContainer(transformState, container); 136 mapToContainer(transformState, container);
134 result = transformState.lastPlanarQuad(); 137 result = transformState.lastPlanarQuad();
135 } 138 }
136 139
137 #if ENABLE(ASSERT) 140 #if ENABLE(ASSERT)
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
210 213
211 TemporaryChange<size_t> positionChange(m_insertionPosition, m_mapping.si ze()); 214 TemporaryChange<size_t> positionChange(m_insertionPosition, m_mapping.si ze());
212 bool accumulatingTransform = layer->layoutObject()->style()->preserves3D () || ancestorLayer->layoutObject()->style()->preserves3D(); 215 bool accumulatingTransform = layer->layoutObject()->style()->preserves3D () || ancestorLayer->layoutObject()->style()->preserves3D();
213 push(layoutObject, toLayoutSize(layerOffset), accumulatingTransform, /*i sNonUniform*/ false, /*isFixedPosition*/ false, /*hasTransform*/ false); 216 push(layoutObject, toLayoutSize(layerOffset), accumulatingTransform, /*i sNonUniform*/ false, /*isFixedPosition*/ false, /*hasTransform*/ false);
214 return; 217 return;
215 } 218 }
216 const LayoutBoxModelObject* ancestorLayoutObject = ancestorLayer ? ancestorL ayer->layoutObject() : 0; 219 const LayoutBoxModelObject* ancestorLayoutObject = ancestorLayer ? ancestorL ayer->layoutObject() : 0;
217 pushMappingsToAncestor(layoutObject, ancestorLayoutObject); 220 pushMappingsToAncestor(layoutObject, ancestorLayoutObject);
218 } 221 }
219 222
220 void LayoutGeometryMap::push(const LayoutObject* layoutObject, const LayoutSize& offsetFromContainer, bool accumulatingTransform, bool isNonUniform, bool isFixe dPosition, bool hasTransform, LayoutSize offsetForFixedPosition) 223 void LayoutGeometryMap::push(const LayoutObject* layoutObject, const LayoutSize& offsetFromContainer, bool accumulatingTransform, bool isNonUniform, bool isFixe dPosition, bool hasTransform, LayoutSize offsetForFixedPosition, LayoutSize offs etForStickyPosition)
221 { 224 {
222 // fprintf(stderr, "LayoutGeometryMap::push %p %d,%d isNonUniform=%d\n", layo utObject, offsetFromContainer.width().toInt(), offsetFromContainer.height().toIn t(), isNonUniform); 225 // fprintf(stderr, "LayoutGeometryMap::push %p %d,%d isNonUniform=%d\n", layo utObject, offsetFromContainer.width().toInt(), offsetFromContainer.height().toIn t(), isNonUniform);
223 226
224 ASSERT(m_insertionPosition != kNotFound); 227 ASSERT(m_insertionPosition != kNotFound);
225 ASSERT(!layoutObject->isLayoutView() || !m_insertionPosition || m_mapCoordin atesFlags & TraverseDocumentBoundaries); 228 ASSERT(!layoutObject->isLayoutView() || !m_insertionPosition || m_mapCoordin atesFlags & TraverseDocumentBoundaries);
226 ASSERT(offsetForFixedPosition.isZero() || layoutObject->isLayoutView()); 229 ASSERT(offsetForFixedPosition.isZero() || layoutObject->isLayoutView());
230 ASSERT(offsetForStickyPosition.isZero() || layoutObject->style()->position() == StickyPosition);
227 231
228 m_mapping.insert(m_insertionPosition, LayoutGeometryMapStep(layoutObject, ac cumulatingTransform, isNonUniform, isFixedPosition, hasTransform)); 232 m_mapping.insert(m_insertionPosition, LayoutGeometryMapStep(layoutObject, ac cumulatingTransform, isNonUniform, isFixedPosition, hasTransform));
229 233
230 LayoutGeometryMapStep& step = m_mapping[m_insertionPosition]; 234 LayoutGeometryMapStep& step = m_mapping[m_insertionPosition];
231 step.m_offset = offsetFromContainer; 235 step.m_offset = offsetFromContainer;
232 step.m_offsetForFixedPosition = offsetForFixedPosition; 236 step.m_offsetForFixedPosition = offsetForFixedPosition;
237 step.m_offsetForStickyPosition = offsetForStickyPosition;
233 238
234 stepInserted(step); 239 stepInserted(step);
235 } 240 }
236 241
237 void LayoutGeometryMap::push(const LayoutObject* layoutObject, const Transformat ionMatrix& t, bool accumulatingTransform, bool isNonUniform, bool isFixedPositio n, bool hasTransform, LayoutSize offsetForFixedPosition) 242 void LayoutGeometryMap::push(const LayoutObject* layoutObject, const Transformat ionMatrix& t, bool accumulatingTransform, bool isNonUniform, bool isFixedPositio n, bool hasTransform, LayoutSize offsetForFixedPosition, LayoutSize offsetForSti ckyPosition)
238 { 243 {
239 ASSERT(m_insertionPosition != kNotFound); 244 ASSERT(m_insertionPosition != kNotFound);
240 ASSERT(!layoutObject->isLayoutView() || !m_insertionPosition || m_mapCoordin atesFlags & TraverseDocumentBoundaries); 245 ASSERT(!layoutObject->isLayoutView() || !m_insertionPosition || m_mapCoordin atesFlags & TraverseDocumentBoundaries);
241 ASSERT(offsetForFixedPosition.isZero() || layoutObject->isLayoutView()); 246 ASSERT(offsetForFixedPosition.isZero() || layoutObject->isLayoutView());
247 ASSERT(offsetForStickyPosition.isZero() || layoutObject->style()->position() == StickyPosition);
242 248
243 m_mapping.insert(m_insertionPosition, LayoutGeometryMapStep(layoutObject, ac cumulatingTransform, isNonUniform, isFixedPosition, hasTransform)); 249 m_mapping.insert(m_insertionPosition, LayoutGeometryMapStep(layoutObject, ac cumulatingTransform, isNonUniform, isFixedPosition, hasTransform));
244 250
245 LayoutGeometryMapStep& step = m_mapping[m_insertionPosition]; 251 LayoutGeometryMapStep& step = m_mapping[m_insertionPosition];
246 step.m_offsetForFixedPosition = offsetForFixedPosition; 252 step.m_offsetForFixedPosition = offsetForFixedPosition;
253 step.m_offsetForStickyPosition = offsetForStickyPosition;
247 254
248 if (!t.isIntegerTranslation()) 255 if (!t.isIntegerTranslation())
249 step.m_transform = adoptPtr(new TransformationMatrix(t)); 256 step.m_transform = adoptPtr(new TransformationMatrix(t));
250 else 257 else
251 step.m_offset = LayoutSize(t.e(), t.f()); 258 step.m_offset = LayoutSize(t.e(), t.f());
252 259
253 stepInserted(step); 260 stepInserted(step);
254 } 261 }
255 262
256 void LayoutGeometryMap::popMappingsToAncestor(const LayoutBoxModelObject* ancest orLayoutObject) 263 void LayoutGeometryMap::popMappingsToAncestor(const LayoutBoxModelObject* ancest orLayoutObject)
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
312 // If we're not working with multiple LayoutViews, then any view is consider ed 319 // If we're not working with multiple LayoutViews, then any view is consider ed
313 // "topmost" (to preserve original behavior). 320 // "topmost" (to preserve original behavior).
314 if (!(m_mapCoordinatesFlags & TraverseDocumentBoundaries)) 321 if (!(m_mapCoordinatesFlags & TraverseDocumentBoundaries))
315 return true; 322 return true;
316 323
317 return layoutObject->frame()->isMainFrame(); 324 return layoutObject->frame()->isMainFrame();
318 } 325 }
319 #endif 326 #endif
320 327
321 } // namespace blink 328 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698