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

Side by Side Diff: Source/core/layout/Layer.cpp

Issue 898783003: Move rendering/RenderLayer* to layout/ (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 5 years, 10 months 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 | Annotate | Revision Log
« no previous file with comments | « Source/core/layout/Layer.h ('k') | Source/core/layout/LayerClipper.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 24 matching lines...) Expand all
35 * version of this file only under the terms of one of those two 35 * version of this file only under the terms of one of those two
36 * licenses (the MPL or the GPL) and not to allow others to use your 36 * licenses (the MPL or the GPL) and not to allow others to use your
37 * version of this file under the LGPL, indicate your decision by 37 * version of this file under the LGPL, indicate your decision by
38 * deletingthe provisions above and replace them with the notice and 38 * deletingthe provisions above and replace them with the notice and
39 * other provisions required by the MPL or the GPL, as the case may be. 39 * other provisions required by the MPL or the GPL, as the case may be.
40 * If you do not delete the provisions above, a recipient may use your 40 * If you do not delete the provisions above, a recipient may use your
41 * version of this file under any of the LGPL, the MPL or the GPL. 41 * version of this file under any of the LGPL, the MPL or the GPL.
42 */ 42 */
43 43
44 #include "config.h" 44 #include "config.h"
45 #include "core/rendering/RenderLayer.h" 45 #include "core/layout/Layer.h"
46 46
47 #include "core/CSSPropertyNames.h" 47 #include "core/CSSPropertyNames.h"
48 #include "core/HTMLNames.h" 48 #include "core/HTMLNames.h"
49 #include "core/css/PseudoStyleRequest.h" 49 #include "core/css/PseudoStyleRequest.h"
50 #include "core/dom/Document.h" 50 #include "core/dom/Document.h"
51 #include "core/dom/shadow/ShadowRoot.h" 51 #include "core/dom/shadow/ShadowRoot.h"
52 #include "core/frame/DeprecatedScheduleStyleRecalcDuringLayout.h" 52 #include "core/frame/DeprecatedScheduleStyleRecalcDuringLayout.h"
53 #include "core/frame/FrameView.h" 53 #include "core/frame/FrameView.h"
54 #include "core/frame/LocalFrame.h" 54 #include "core/frame/LocalFrame.h"
55 #include "core/html/HTMLFrameElement.h" 55 #include "core/html/HTMLFrameElement.h"
56 #include "core/layout/HitTestRequest.h" 56 #include "core/layout/HitTestRequest.h"
57 #include "core/layout/HitTestResult.h" 57 #include "core/layout/HitTestResult.h"
58 #include "core/layout/HitTestingTransformState.h" 58 #include "core/layout/HitTestingTransformState.h"
59 #include "core/layout/LayoutTreeAsText.h" 59 #include "core/layout/LayoutTreeAsText.h"
60 #include "core/layout/compositing/CompositedLayerMapping.h" 60 #include "core/layout/compositing/CompositedLayerMapping.h"
61 #include "core/layout/compositing/RenderLayerCompositor.h" 61 #include "core/layout/compositing/LayerCompositor.h"
62 #include "core/page/Page.h" 62 #include "core/page/Page.h"
63 #include "core/page/scrolling/ScrollingCoordinator.h" 63 #include "core/page/scrolling/ScrollingCoordinator.h"
64 #include "core/rendering/ColumnInfo.h" 64 #include "core/rendering/ColumnInfo.h"
65 #include "core/rendering/FilterEffectRenderer.h" 65 #include "core/rendering/FilterEffectRenderer.h"
66 #include "core/rendering/RenderFlowThread.h" 66 #include "core/rendering/RenderFlowThread.h"
67 #include "core/rendering/RenderGeometryMap.h" 67 #include "core/rendering/RenderGeometryMap.h"
68 #include "core/rendering/RenderInline.h" 68 #include "core/rendering/RenderInline.h"
69 #include "core/rendering/RenderPart.h" 69 #include "core/rendering/RenderPart.h"
70 #include "core/rendering/RenderReplica.h" 70 #include "core/rendering/RenderReplica.h"
71 #include "core/rendering/RenderScrollbar.h" 71 #include "core/rendering/RenderScrollbar.h"
(...skipping 21 matching lines...) Expand all
93 93
94 namespace { 94 namespace {
95 95
96 static CompositingQueryMode gCompositingQueryMode = 96 static CompositingQueryMode gCompositingQueryMode =
97 CompositingQueriesAreOnlyAllowedInCertainDocumentLifecyclePhases; 97 CompositingQueriesAreOnlyAllowedInCertainDocumentLifecyclePhases;
98 98
99 } // namespace 99 } // namespace
100 100
101 using namespace HTMLNames; 101 using namespace HTMLNames;
102 102
103 RenderLayer::RenderLayer(RenderLayerModelObject* renderer, LayerType type) 103 Layer::Layer(LayoutLayerModelObject* renderer, LayerType type)
104 : m_layerType(type) 104 : m_layerType(type)
105 , m_hasSelfPaintingLayerDescendant(false) 105 , m_hasSelfPaintingLayerDescendant(false)
106 , m_hasSelfPaintingLayerDescendantDirty(false) 106 , m_hasSelfPaintingLayerDescendantDirty(false)
107 , m_isRootLayer(renderer->isRenderView()) 107 , m_isRootLayer(renderer->isRenderView())
108 , m_visibleContentStatusDirty(true) 108 , m_visibleContentStatusDirty(true)
109 , m_hasVisibleContent(false) 109 , m_hasVisibleContent(false)
110 , m_visibleDescendantStatusDirty(false) 110 , m_visibleDescendantStatusDirty(false)
111 , m_hasVisibleDescendant(false) 111 , m_hasVisibleDescendant(false)
112 , m_hasVisibleNonLayerContent(false) 112 , m_hasVisibleNonLayerContent(false)
113 , m_isPaginated(false) 113 , m_isPaginated(false)
(...skipping 30 matching lines...) Expand all
144 m_isSelfPaintingLayer = shouldBeSelfPaintingLayer(); 144 m_isSelfPaintingLayer = shouldBeSelfPaintingLayer();
145 145
146 if (!renderer->slowFirstChild() && renderer->style()) { 146 if (!renderer->slowFirstChild() && renderer->style()) {
147 m_visibleContentStatusDirty = false; 147 m_visibleContentStatusDirty = false;
148 m_hasVisibleContent = renderer->style()->visibility() == VISIBLE; 148 m_hasVisibleContent = renderer->style()->visibility() == VISIBLE;
149 } 149 }
150 150
151 updateScrollableArea(); 151 updateScrollableArea();
152 } 152 }
153 153
154 RenderLayer::~RenderLayer() 154 Layer::~Layer()
155 { 155 {
156 if (renderer()->frame() && renderer()->frame()->page()) { 156 if (renderer()->frame() && renderer()->frame()->page()) {
157 if (ScrollingCoordinator* scrollingCoordinator = renderer()->frame()->pa ge()->scrollingCoordinator()) 157 if (ScrollingCoordinator* scrollingCoordinator = renderer()->frame()->pa ge()->scrollingCoordinator())
158 scrollingCoordinator->willDestroyRenderLayer(this); 158 scrollingCoordinator->willDestroyLayer(this);
159 } 159 }
160 160
161 removeFilterInfoIfNeeded(); 161 removeFilterInfoIfNeeded();
162 162
163 if (groupedMapping()) { 163 if (groupedMapping()) {
164 DisableCompositingQueryAsserts disabler; 164 DisableCompositingQueryAsserts disabler;
165 groupedMapping()->removeRenderLayerFromSquashingGraphicsLayer(this); 165 groupedMapping()->removeLayerFromSquashingGraphicsLayer(this);
166 setGroupedMapping(0); 166 setGroupedMapping(0);
167 } 167 }
168 168
169 // Child layers will be deleted by their corresponding render objects, so 169 // Child layers will be deleted by their corresponding render objects, so
170 // we don't need to delete them ourselves. 170 // we don't need to delete them ourselves.
171 171
172 clearCompositedLayerMapping(true); 172 clearCompositedLayerMapping(true);
173 173
174 if (m_reflectionInfo) 174 if (m_reflectionInfo)
175 m_reflectionInfo->destroy(); 175 m_reflectionInfo->destroy();
176 } 176 }
177 177
178 String RenderLayer::debugName() const 178 String Layer::debugName() const
179 { 179 {
180 if (isReflection()) { 180 if (isReflection()) {
181 return renderer()->parent()->debugName() + " (reflection)"; 181 return renderer()->parent()->debugName() + " (reflection)";
182 } 182 }
183 return renderer()->debugName(); 183 return renderer()->debugName();
184 } 184 }
185 185
186 RenderLayerCompositor* RenderLayer::compositor() const 186 LayerCompositor* Layer::compositor() const
187 { 187 {
188 if (!renderer()->view()) 188 if (!renderer()->view())
189 return 0; 189 return 0;
190 return renderer()->view()->compositor(); 190 return renderer()->view()->compositor();
191 } 191 }
192 192
193 void RenderLayer::contentChanged(ContentChangeType changeType) 193 void Layer::contentChanged(ContentChangeType changeType)
194 { 194 {
195 // updateLayerCompositingState will query compositingReasons for accelerated overflow scrolling. 195 // updateLayerCompositingState will query compositingReasons for accelerated overflow scrolling.
196 // This is tripped by LayoutTests/compositing/content-changed-chicken-egg.ht ml 196 // This is tripped by LayoutTests/compositing/content-changed-chicken-egg.ht ml
197 DisableCompositingQueryAsserts disabler; 197 DisableCompositingQueryAsserts disabler;
198 198
199 if (changeType == CanvasChanged) 199 if (changeType == CanvasChanged)
200 compositor()->setNeedsCompositingUpdate(CompositingUpdateAfterCompositin gInputChange); 200 compositor()->setNeedsCompositingUpdate(CompositingUpdateAfterCompositin gInputChange);
201 201
202 if (changeType == CanvasContextChanged) { 202 if (changeType == CanvasContextChanged) {
203 compositor()->setNeedsCompositingUpdate(CompositingUpdateAfterCompositin gInputChange); 203 compositor()->setNeedsCompositingUpdate(CompositingUpdateAfterCompositin gInputChange);
204 204
205 // Although we're missing test coverage, we need to call 205 // Although we're missing test coverage, we need to call
206 // GraphicsLayer::setContentsToPlatformLayer with the new platform 206 // GraphicsLayer::setContentsToPlatformLayer with the new platform
207 // layer for this canvas. 207 // layer for this canvas.
208 // See http://crbug.com/349195 208 // See http://crbug.com/349195
209 if (hasCompositedLayerMapping()) 209 if (hasCompositedLayerMapping())
210 compositedLayerMapping()->setNeedsGraphicsLayerUpdate(GraphicsLayerU pdateSubtree); 210 compositedLayerMapping()->setNeedsGraphicsLayerUpdate(GraphicsLayerU pdateSubtree);
211 } 211 }
212 212
213 if (m_compositedLayerMapping) 213 if (m_compositedLayerMapping)
214 m_compositedLayerMapping->contentChanged(changeType); 214 m_compositedLayerMapping->contentChanged(changeType);
215 } 215 }
216 216
217 bool RenderLayer::paintsWithFilters() const 217 bool Layer::paintsWithFilters() const
218 { 218 {
219 if (!renderer()->hasFilter()) 219 if (!renderer()->hasFilter())
220 return false; 220 return false;
221 221
222 // https://code.google.com/p/chromium/issues/detail?id=343759 222 // https://code.google.com/p/chromium/issues/detail?id=343759
223 DisableCompositingQueryAsserts disabler; 223 DisableCompositingQueryAsserts disabler;
224 return !m_compositedLayerMapping || compositingState() != PaintsIntoOwnBacki ng; 224 return !m_compositedLayerMapping || compositingState() != PaintsIntoOwnBacki ng;
225 } 225 }
226 226
227 LayoutSize RenderLayer::subpixelAccumulation() const 227 LayoutSize Layer::subpixelAccumulation() const
228 { 228 {
229 return m_subpixelAccumulation; 229 return m_subpixelAccumulation;
230 } 230 }
231 231
232 void RenderLayer::setSubpixelAccumulation(const LayoutSize& size) 232 void Layer::setSubpixelAccumulation(const LayoutSize& size)
233 { 233 {
234 m_subpixelAccumulation = size; 234 m_subpixelAccumulation = size;
235 } 235 }
236 236
237 void RenderLayer::updateLayerPositionsAfterLayout() 237 void Layer::updateLayerPositionsAfterLayout()
238 { 238 {
239 TRACE_EVENT0("blink,benchmark", "RenderLayer::updateLayerPositionsAfterLayou t"); 239 TRACE_EVENT0("blink,benchmark", "Layer::updateLayerPositionsAfterLayout");
240 240
241 m_clipper.clearClipRectsIncludingDescendants(); 241 m_clipper.clearClipRectsIncludingDescendants();
242 updateLayerPositionRecursive(); 242 updateLayerPositionRecursive();
243 243
244 { 244 {
245 // FIXME: Remove incremental compositing updates after fixing the chicke n/egg issues 245 // FIXME: Remove incremental compositing updates after fixing the chicke n/egg issues
246 // https://code.google.com/p/chromium/issues/detail?id=343756 246 // https://code.google.com/p/chromium/issues/detail?id=343756
247 DisableCompositingQueryAsserts disabler; 247 DisableCompositingQueryAsserts disabler;
248 bool needsPaginationUpdate = isPaginated() || enclosingPaginationLayer() ; 248 bool needsPaginationUpdate = isPaginated() || enclosingPaginationLayer() ;
249 updatePaginationRecursive(needsPaginationUpdate); 249 updatePaginationRecursive(needsPaginationUpdate);
250 } 250 }
251 } 251 }
252 252
253 void RenderLayer::updateLayerPositionRecursive() 253 void Layer::updateLayerPositionRecursive()
254 { 254 {
255 updateLayerPosition(); 255 updateLayerPosition();
256 256
257 if (m_reflectionInfo) 257 if (m_reflectionInfo)
258 m_reflectionInfo->reflection()->layout(); 258 m_reflectionInfo->reflection()->layout();
259 259
260 // FIXME: We should be able to remove this call because we don't care about 260 // FIXME: We should be able to remove this call because we don't care about
261 // any descendant-dependent flags, but code somewhere else is reading these 261 // any descendant-dependent flags, but code somewhere else is reading these
262 // flags and depending on us to update them. 262 // flags and depending on us to update them.
263 updateDescendantDependentFlags(); 263 updateDescendantDependentFlags();
264 264
265 for (RenderLayer* child = firstChild(); child; child = child->nextSibling()) 265 for (Layer* child = firstChild(); child; child = child->nextSibling())
266 child->updateLayerPositionRecursive(); 266 child->updateLayerPositionRecursive();
267 } 267 }
268 268
269 void RenderLayer::updateHasSelfPaintingLayerDescendant() const 269 void Layer::updateHasSelfPaintingLayerDescendant() const
270 { 270 {
271 ASSERT(m_hasSelfPaintingLayerDescendantDirty); 271 ASSERT(m_hasSelfPaintingLayerDescendantDirty);
272 272
273 m_hasSelfPaintingLayerDescendant = false; 273 m_hasSelfPaintingLayerDescendant = false;
274 274
275 for (RenderLayer* child = firstChild(); child; child = child->nextSibling()) { 275 for (Layer* child = firstChild(); child; child = child->nextSibling()) {
276 if (child->isSelfPaintingLayer() || child->hasSelfPaintingLayerDescendan t()) { 276 if (child->isSelfPaintingLayer() || child->hasSelfPaintingLayerDescendan t()) {
277 m_hasSelfPaintingLayerDescendant = true; 277 m_hasSelfPaintingLayerDescendant = true;
278 break; 278 break;
279 } 279 }
280 } 280 }
281 281
282 m_hasSelfPaintingLayerDescendantDirty = false; 282 m_hasSelfPaintingLayerDescendantDirty = false;
283 } 283 }
284 284
285 void RenderLayer::dirtyAncestorChainHasSelfPaintingLayerDescendantStatus() 285 void Layer::dirtyAncestorChainHasSelfPaintingLayerDescendantStatus()
286 { 286 {
287 for (RenderLayer* layer = this; layer; layer = layer->parent()) { 287 for (Layer* layer = this; layer; layer = layer->parent()) {
288 layer->m_hasSelfPaintingLayerDescendantDirty = true; 288 layer->m_hasSelfPaintingLayerDescendantDirty = true;
289 // If we have reached a self-painting layer, we know our parent should h ave a self-painting descendant 289 // If we have reached a self-painting layer, we know our parent should h ave a self-painting descendant
290 // in this case, there is no need to dirty our ancestors further. 290 // in this case, there is no need to dirty our ancestors further.
291 if (layer->isSelfPaintingLayer()) { 291 if (layer->isSelfPaintingLayer()) {
292 ASSERT(!parent() || parent()->m_hasSelfPaintingLayerDescendantDirty || parent()->m_hasSelfPaintingLayerDescendant); 292 ASSERT(!parent() || parent()->m_hasSelfPaintingLayerDescendantDirty || parent()->m_hasSelfPaintingLayerDescendant);
293 break; 293 break;
294 } 294 }
295 } 295 }
296 } 296 }
297 297
298 bool RenderLayer::scrollsWithViewport() const 298 bool Layer::scrollsWithViewport() const
299 { 299 {
300 return renderer()->style()->position() == FixedPosition && renderer()->conta inerForFixedPosition() == renderer()->view(); 300 return renderer()->style()->position() == FixedPosition && renderer()->conta inerForFixedPosition() == renderer()->view();
301 } 301 }
302 302
303 bool RenderLayer::scrollsWithRespectTo(const RenderLayer* other) const 303 bool Layer::scrollsWithRespectTo(const Layer* other) const
304 { 304 {
305 if (scrollsWithViewport() != other->scrollsWithViewport()) 305 if (scrollsWithViewport() != other->scrollsWithViewport())
306 return true; 306 return true;
307 return ancestorScrollingLayer() != other->ancestorScrollingLayer(); 307 return ancestorScrollingLayer() != other->ancestorScrollingLayer();
308 } 308 }
309 309
310 void RenderLayer::updateLayerPositionsAfterOverflowScroll() 310 void Layer::updateLayerPositionsAfterOverflowScroll()
311 { 311 {
312 m_clipper.clearClipRectsIncludingDescendants(); 312 m_clipper.clearClipRectsIncludingDescendants();
313 updateLayerPositionsAfterScrollRecursive(); 313 updateLayerPositionsAfterScrollRecursive();
314 } 314 }
315 315
316 void RenderLayer::updateLayerPositionsAfterScrollRecursive() 316 void Layer::updateLayerPositionsAfterScrollRecursive()
317 { 317 {
318 if (updateLayerPosition()) 318 if (updateLayerPosition())
319 m_renderer->setPreviousPaintInvalidationRect(m_renderer->boundsRectForPa intInvalidation(m_renderer->containerForPaintInvalidation())); 319 m_renderer->setPreviousPaintInvalidationRect(m_renderer->boundsRectForPa intInvalidation(m_renderer->containerForPaintInvalidation()));
320 320
321 for (RenderLayer* child = firstChild(); child; child = child->nextSibling()) 321 for (Layer* child = firstChild(); child; child = child->nextSibling())
322 child->updateLayerPositionsAfterScrollRecursive(); 322 child->updateLayerPositionsAfterScrollRecursive();
323 } 323 }
324 324
325 void RenderLayer::updateTransformationMatrix() 325 void Layer::updateTransformationMatrix()
326 { 326 {
327 if (m_transform) { 327 if (m_transform) {
328 RenderBox* box = renderBox(); 328 RenderBox* box = renderBox();
329 ASSERT(box); 329 ASSERT(box);
330 m_transform->makeIdentity(); 330 m_transform->makeIdentity();
331 box->style()->applyTransform(*m_transform, LayoutSize(box->pixelSnappedS ize()), RenderStyle::IncludeTransformOrigin); 331 box->style()->applyTransform(*m_transform, LayoutSize(box->pixelSnappedS ize()), RenderStyle::IncludeTransformOrigin);
332 makeMatrixRenderable(*m_transform, compositor()->hasAcceleratedCompositi ng()); 332 makeMatrixRenderable(*m_transform, compositor()->hasAcceleratedCompositi ng());
333 } 333 }
334 } 334 }
335 335
336 void RenderLayer::updateTransform(const RenderStyle* oldStyle, RenderStyle* newS tyle) 336 void Layer::updateTransform(const RenderStyle* oldStyle, RenderStyle* newStyle)
337 { 337 {
338 if (oldStyle && newStyle->transformDataEquivalent(*oldStyle)) 338 if (oldStyle && newStyle->transformDataEquivalent(*oldStyle))
339 return; 339 return;
340 340
341 // hasTransform() on the renderer is also true when there is transform-style : preserve-3d or perspective set, 341 // hasTransform() on the renderer is also true when there is transform-style : preserve-3d or perspective set,
342 // so check style too. 342 // so check style too.
343 bool hasTransform = renderer()->hasTransformRelatedProperty() && newStyle->h asTransform(); 343 bool hasTransform = renderer()->hasTransformRelatedProperty() && newStyle->h asTransform();
344 bool had3DTransform = has3DTransform(); 344 bool had3DTransform = has3DTransform();
345 345
346 bool hadTransform = m_transform; 346 bool hadTransform = m_transform;
347 if (hasTransform != hadTransform) { 347 if (hasTransform != hadTransform) {
348 if (hasTransform) 348 if (hasTransform)
349 m_transform = adoptPtr(new TransformationMatrix); 349 m_transform = adoptPtr(new TransformationMatrix);
350 else 350 else
351 m_transform.clear(); 351 m_transform.clear();
352 352
353 // Layers with transforms act as clip rects roots, so clear the cached c lip rects here. 353 // Layers with transforms act as clip rects roots, so clear the cached c lip rects here.
354 m_clipper.clearClipRectsIncludingDescendants(); 354 m_clipper.clearClipRectsIncludingDescendants();
355 } else if (hasTransform) { 355 } else if (hasTransform) {
356 m_clipper.clearClipRectsIncludingDescendants(AbsoluteClipRects); 356 m_clipper.clearClipRectsIncludingDescendants(AbsoluteClipRects);
357 } 357 }
358 358
359 updateTransformationMatrix(); 359 updateTransformationMatrix();
360 360
361 if (had3DTransform != has3DTransform()) 361 if (had3DTransform != has3DTransform())
362 dirty3DTransformedDescendantStatus(); 362 dirty3DTransformedDescendantStatus();
363 } 363 }
364 364
365 static RenderLayer* enclosingLayerForContainingBlock(RenderLayer* layer) 365 static Layer* enclosingLayerForContainingBlock(Layer* layer)
366 { 366 {
367 if (RenderObject* containingBlock = layer->renderer()->containingBlock()) 367 if (RenderObject* containingBlock = layer->renderer()->containingBlock())
368 return containingBlock->enclosingLayer(); 368 return containingBlock->enclosingLayer();
369 return 0; 369 return 0;
370 } 370 }
371 371
372 RenderLayer* RenderLayer::renderingContextRoot() 372 Layer* Layer::renderingContextRoot()
373 { 373 {
374 RenderLayer* renderingContext = 0; 374 Layer* renderingContext = 0;
375 375
376 if (shouldPreserve3D()) 376 if (shouldPreserve3D())
377 renderingContext = this; 377 renderingContext = this;
378 378
379 for (RenderLayer* current = enclosingLayerForContainingBlock(this); current && current->shouldPreserve3D(); current = enclosingLayerForContainingBlock(curre nt)) 379 for (Layer* current = enclosingLayerForContainingBlock(this); current && cur rent->shouldPreserve3D(); current = enclosingLayerForContainingBlock(current))
380 renderingContext = current; 380 renderingContext = current;
381 381
382 return renderingContext; 382 return renderingContext;
383 } 383 }
384 384
385 TransformationMatrix RenderLayer::currentTransform(RenderStyle::ApplyTransformOr igin applyOrigin) const 385 TransformationMatrix Layer::currentTransform(RenderStyle::ApplyTransformOrigin a pplyOrigin) const
386 { 386 {
387 if (!m_transform) 387 if (!m_transform)
388 return TransformationMatrix(); 388 return TransformationMatrix();
389 389
390 // m_transform includes transform-origin, so we need to recompute the transf orm here. 390 // m_transform includes transform-origin, so we need to recompute the transf orm here.
391 if (applyOrigin == RenderStyle::ExcludeTransformOrigin) { 391 if (applyOrigin == RenderStyle::ExcludeTransformOrigin) {
392 RenderBox* box = renderBox(); 392 RenderBox* box = renderBox();
393 TransformationMatrix currTransform; 393 TransformationMatrix currTransform;
394 box->style()->applyTransform(currTransform, LayoutSize(box->pixelSnapped Size()), RenderStyle::ExcludeTransformOrigin); 394 box->style()->applyTransform(currTransform, LayoutSize(box->pixelSnapped Size()), RenderStyle::ExcludeTransformOrigin);
395 makeMatrixRenderable(currTransform, compositor()->hasAcceleratedComposit ing()); 395 makeMatrixRenderable(currTransform, compositor()->hasAcceleratedComposit ing());
396 return currTransform; 396 return currTransform;
397 } 397 }
398 398
399 return *m_transform; 399 return *m_transform;
400 } 400 }
401 401
402 TransformationMatrix RenderLayer::renderableTransform(PaintBehavior paintBehavio r) const 402 TransformationMatrix Layer::renderableTransform(PaintBehavior paintBehavior) con st
403 { 403 {
404 if (!m_transform) 404 if (!m_transform)
405 return TransformationMatrix(); 405 return TransformationMatrix();
406 406
407 if (paintBehavior & PaintBehaviorFlattenCompositingLayers) { 407 if (paintBehavior & PaintBehaviorFlattenCompositingLayers) {
408 TransformationMatrix matrix = *m_transform; 408 TransformationMatrix matrix = *m_transform;
409 makeMatrixRenderable(matrix, false /* flatten 3d */); 409 makeMatrixRenderable(matrix, false /* flatten 3d */);
410 return matrix; 410 return matrix;
411 } 411 }
412 412
413 return *m_transform; 413 return *m_transform;
414 } 414 }
415 415
416 static bool checkContainingBlockChainForPagination(RenderLayerModelObject* rende rer, RenderBox* ancestorColumnsRenderer) 416 static bool checkContainingBlockChainForPagination(LayoutLayerModelObject* rende rer, RenderBox* ancestorColumnsRenderer)
417 { 417 {
418 RenderView* view = renderer->view(); 418 RenderView* view = renderer->view();
419 RenderLayerModelObject* prevBlock = renderer; 419 LayoutLayerModelObject* prevBlock = renderer;
420 RenderBlock* containingBlock; 420 RenderBlock* containingBlock;
421 for (containingBlock = renderer->containingBlock(); 421 for (containingBlock = renderer->containingBlock();
422 containingBlock && containingBlock != view && containingBlock != ancest orColumnsRenderer; 422 containingBlock && containingBlock != view && containingBlock != ancesto rColumnsRenderer;
423 containingBlock = containingBlock->containingBlock()) 423 containingBlock = containingBlock->containingBlock())
424 prevBlock = containingBlock; 424 prevBlock = containingBlock;
425 425
426 // If the columns block wasn't in our containing block chain, then we aren't paginated by it. 426 // If the columns block wasn't in our containing block chain, then we aren't paginated by it.
427 if (containingBlock != ancestorColumnsRenderer) 427 if (containingBlock != ancestorColumnsRenderer)
428 return false; 428 return false;
429 429
430 // If the previous block is absolutely positioned, then we can't be paginate d by the columns block. 430 // If the previous block is absolutely positioned, then we can't be paginate d by the columns block.
431 if (prevBlock->isOutOfFlowPositioned()) 431 if (prevBlock->isOutOfFlowPositioned())
432 return false; 432 return false;
433 433
434 // Otherwise we are paginated by the columns block. 434 // Otherwise we are paginated by the columns block.
435 return true; 435 return true;
436 } 436 }
437 437
438 // Convert a bounding box from flow thread coordinates, relative to |layer|, to visual coordinates, relative to |ancestorLayer|. 438 // Convert a bounding box from flow thread coordinates, relative to |layer|, to visual coordinates, relative to |ancestorLayer|.
439 // See http://www.chromium.org/developers/design-documents/multi-column-layout f or more info on these coordinate types. 439 // See http://www.chromium.org/developers/design-documents/multi-column-layout f or more info on these coordinate types.
440 static void convertFromFlowThreadToVisualBoundingBoxInAncestor(const RenderLayer * layer, const RenderLayer* ancestorLayer, LayoutRect& rect) 440 static void convertFromFlowThreadToVisualBoundingBoxInAncestor(const Layer* laye r, const Layer* ancestorLayer, LayoutRect& rect)
441 { 441 {
442 RenderLayer* paginationLayer = layer->enclosingPaginationLayer(); 442 Layer* paginationLayer = layer->enclosingPaginationLayer();
443 ASSERT(paginationLayer); 443 ASSERT(paginationLayer);
444 RenderFlowThread* flowThread = toRenderFlowThread(paginationLayer->renderer( )); 444 RenderFlowThread* flowThread = toRenderFlowThread(paginationLayer->renderer( ));
445 445
446 // First make the flow thread rectangle relative to the flow thread, not to |layer|. 446 // First make the flow thread rectangle relative to the flow thread, not to |layer|.
447 LayoutPoint offsetWithinPaginationLayer; 447 LayoutPoint offsetWithinPaginationLayer;
448 layer->convertToLayerCoords(paginationLayer, offsetWithinPaginationLayer); 448 layer->convertToLayerCoords(paginationLayer, offsetWithinPaginationLayer);
449 rect.moveBy(offsetWithinPaginationLayer); 449 rect.moveBy(offsetWithinPaginationLayer);
450 450
451 // Then make the rectangle visual, relative to the fragmentation context. Sp lit our box up into 451 // Then make the rectangle visual, relative to the fragmentation context. Sp lit our box up into
452 // the actual fragment boxes that render in the columns/pages and unite thos e together to get 452 // the actual fragment boxes that render in the columns/pages and unite thos e together to get
453 // our true bounding box. 453 // our true bounding box.
454 rect = flowThread->fragmentsBoundingBox(rect); 454 rect = flowThread->fragmentsBoundingBox(rect);
455 455
456 // Finally, make the visual rectangle relative to |ancestorLayer|. 456 // Finally, make the visual rectangle relative to |ancestorLayer|.
457 if (ancestorLayer->enclosingPaginationLayer() != paginationLayer) { 457 if (ancestorLayer->enclosingPaginationLayer() != paginationLayer) {
458 rect.moveBy(paginationLayer->visualOffsetFromAncestor(ancestorLayer)); 458 rect.moveBy(paginationLayer->visualOffsetFromAncestor(ancestorLayer));
459 return; 459 return;
460 } 460 }
461 // The ancestor layer is inside the same pagination layer as |layer|, so we need to subtract 461 // The ancestor layer is inside the same pagination layer as |layer|, so we need to subtract
462 // the visual distance from the ancestor layer to the pagination layer. 462 // the visual distance from the ancestor layer to the pagination layer.
463 rect.moveBy(-ancestorLayer->visualOffsetFromAncestor(paginationLayer)); 463 rect.moveBy(-ancestorLayer->visualOffsetFromAncestor(paginationLayer));
464 } 464 }
465 465
466 bool RenderLayer::useRegionBasedColumns() const 466 bool Layer::useRegionBasedColumns() const
467 { 467 {
468 return renderer()->document().regionBasedColumnsEnabled(); 468 return renderer()->document().regionBasedColumnsEnabled();
469 } 469 }
470 470
471 void RenderLayer::updatePaginationRecursive(bool needsPaginationUpdate) 471 void Layer::updatePaginationRecursive(bool needsPaginationUpdate)
472 { 472 {
473 m_isPaginated = false; 473 m_isPaginated = false;
474 m_enclosingPaginationLayer = 0; 474 m_enclosingPaginationLayer = 0;
475 475
476 if (useRegionBasedColumns() && renderer()->isRenderFlowThread()) 476 if (useRegionBasedColumns() && renderer()->isRenderFlowThread())
477 needsPaginationUpdate = true; 477 needsPaginationUpdate = true;
478 478
479 if (needsPaginationUpdate) 479 if (needsPaginationUpdate)
480 updatePagination(); 480 updatePagination();
481 481
482 if (renderer()->hasColumns()) 482 if (renderer()->hasColumns())
483 needsPaginationUpdate = true; 483 needsPaginationUpdate = true;
484 484
485 for (RenderLayer* child = firstChild(); child; child = child->nextSibling()) 485 for (Layer* child = firstChild(); child; child = child->nextSibling())
486 child->updatePaginationRecursive(needsPaginationUpdate); 486 child->updatePaginationRecursive(needsPaginationUpdate);
487 } 487 }
488 488
489 void RenderLayer::updatePagination() 489 void Layer::updatePagination()
490 { 490 {
491 bool usesRegionBasedColumns = useRegionBasedColumns(); 491 bool usesRegionBasedColumns = useRegionBasedColumns();
492 if ((!usesRegionBasedColumns && compositingState() != NotComposited) || !par ent()) 492 if ((!usesRegionBasedColumns && compositingState() != NotComposited) || !par ent())
493 return; // FIXME: For now the RenderView can't be paginated. Eventually printing will move to a model where it is though. 493 return; // FIXME: For now the RenderView can't be paginated. Eventually printing will move to a model where it is though.
494 494
495 // The main difference between the paginated booleans for the old column cod e and the new column code 495 // The main difference between the paginated booleans for the old column cod e and the new column code
496 // is that each paginated layer has to paint on its own with the new code. T here is no 496 // is that each paginated layer has to paint on its own with the new code. T here is no
497 // recurring into child layers. This means that the m_isPaginated bits for t he new column code can't just be set on 497 // recurring into child layers. This means that the m_isPaginated bits for t he new column code can't just be set on
498 // "roots" that get split and paint all their descendants. Instead each laye r has to be checked individually and 498 // "roots" that get split and paint all their descendants. Instead each laye r has to be checked individually and
499 // genuinely know if it is going to have to split itself up when painting on ly its contents (and not any other descendant 499 // genuinely know if it is going to have to split itself up when painting on ly its contents (and not any other descendant
(...skipping 17 matching lines...) Expand all
517 } 517 }
518 return; 518 return;
519 } 519 }
520 520
521 // For the new columns code, we want to walk up our containing block chain l ooking for an enclosing layer. Once 521 // For the new columns code, we want to walk up our containing block chain l ooking for an enclosing layer. Once
522 // we find one, then we just check its pagination status. 522 // we find one, then we just check its pagination status.
523 if (usesRegionBasedColumns) { 523 if (usesRegionBasedColumns) {
524 RenderView* view = renderer()->view(); 524 RenderView* view = renderer()->view();
525 RenderBlock* containingBlock; 525 RenderBlock* containingBlock;
526 for (containingBlock = renderer()->containingBlock(); 526 for (containingBlock = renderer()->containingBlock();
527 containingBlock && containingBlock != view; 527 containingBlock && containingBlock != view;
528 containingBlock = containingBlock->containingBlock()) { 528 containingBlock = containingBlock->containingBlock()) {
529 if (containingBlock->hasLayer()) { 529 if (containingBlock->hasLayer()) {
530 // Content inside a transform is not considered to be paginated, since we simply 530 // Content inside a transform is not considered to be paginated, since we simply
531 // paint the transform multiple times in each column, so we don' t have to use 531 // paint the transform multiple times in each column, so we don' t have to use
532 // fragments for the transformed content. 532 // fragments for the transformed content.
533 m_enclosingPaginationLayer = containingBlock->layer()->enclosing PaginationLayer(); 533 m_enclosingPaginationLayer = containingBlock->layer()->enclosing PaginationLayer();
534 if (m_enclosingPaginationLayer && m_enclosingPaginationLayer->ha sTransformRelatedProperty()) 534 if (m_enclosingPaginationLayer && m_enclosingPaginationLayer->ha sTransformRelatedProperty())
535 m_enclosingPaginationLayer = 0; 535 m_enclosingPaginationLayer = 0;
536 return; 536 return;
537 } 537 }
538 } 538 }
539 return; 539 return;
540 } 540 }
541 541
542 // If we're not normal flow, then we need to look for a multi-column object between us and our stacking container. 542 // If we're not normal flow, then we need to look for a multi-column object between us and our stacking container.
543 RenderLayerStackingNode* ancestorStackingContextNode = m_stackingNode->ances torStackingContextNode(); 543 LayerStackingNode* ancestorStackingContextNode = m_stackingNode->ancestorSta ckingContextNode();
544 for (RenderLayer* curr = parent(); curr; curr = curr->parent()) { 544 for (Layer* curr = parent(); curr; curr = curr->parent()) {
545 if (curr->renderer()->hasColumns()) { 545 if (curr->renderer()->hasColumns()) {
546 m_isPaginated = checkContainingBlockChainForPagination(renderer(), c urr->renderBox()); 546 m_isPaginated = checkContainingBlockChainForPagination(renderer(), c urr->renderBox());
547 return; 547 return;
548 } 548 }
549 if (curr->stackingNode() == ancestorStackingContextNode) 549 if (curr->stackingNode() == ancestorStackingContextNode)
550 return; 550 return;
551 } 551 }
552 } 552 }
553 553
554 void RenderLayer::clearPaginationRecursive() 554 void Layer::clearPaginationRecursive()
555 { 555 {
556 m_enclosingPaginationLayer = 0; 556 m_enclosingPaginationLayer = 0;
557 for (RenderLayer* child = firstChild(); child; child = child->nextSibling()) 557 for (Layer* child = firstChild(); child; child = child->nextSibling())
558 child->clearPaginationRecursive(); 558 child->clearPaginationRecursive();
559 } 559 }
560 560
561 LayoutPoint RenderLayer::positionFromPaintInvalidationBacking(const RenderObject * renderObject, const RenderLayerModelObject* paintInvalidationContainer, const PaintInvalidationState* paintInvalidationState) 561 LayoutPoint Layer::positionFromPaintInvalidationBacking(const RenderObject* rend erObject, const LayoutLayerModelObject* paintInvalidationContainer, const PaintI nvalidationState* paintInvalidationState)
562 { 562 {
563 FloatPoint point = renderObject->localToContainerPoint(FloatPoint(), paintIn validationContainer, 0, 0, paintInvalidationState); 563 FloatPoint point = renderObject->localToContainerPoint(FloatPoint(), paintIn validationContainer, 0, 0, paintInvalidationState);
564 564
565 // FIXME: Eventually we are going to unify coordinates in GraphicsLayer spac e. 565 // FIXME: Eventually we are going to unify coordinates in GraphicsLayer spac e.
566 if (paintInvalidationContainer && paintInvalidationContainer->layer()->group edMapping()) 566 if (paintInvalidationContainer && paintInvalidationContainer->layer()->group edMapping())
567 mapPointToPaintBackingCoordinates(paintInvalidationContainer, point); 567 mapPointToPaintBackingCoordinates(paintInvalidationContainer, point);
568 568
569 return LayoutPoint(point); 569 return LayoutPoint(point);
570 } 570 }
571 571
572 void RenderLayer::mapPointToPaintBackingCoordinates(const RenderLayerModelObject * paintInvalidationContainer, FloatPoint& point) 572 void Layer::mapPointToPaintBackingCoordinates(const LayoutLayerModelObject* pain tInvalidationContainer, FloatPoint& point)
573 { 573 {
574 RenderLayer* paintInvalidationLayer = paintInvalidationContainer->layer(); 574 Layer* paintInvalidationLayer = paintInvalidationContainer->layer();
575 if (!paintInvalidationLayer->groupedMapping()) { 575 if (!paintInvalidationLayer->groupedMapping()) {
576 point.move(paintInvalidationLayer->compositedLayerMapping()->contentOffs etInCompositingLayer()); 576 point.move(paintInvalidationLayer->compositedLayerMapping()->contentOffs etInCompositingLayer());
577 return; 577 return;
578 } 578 }
579 579
580 RenderLayerModelObject* transformedAncestor = paintInvalidationLayer->enclos ingTransformedAncestor()->renderer(); 580 LayoutLayerModelObject* transformedAncestor = paintInvalidationLayer->enclos ingTransformedAncestor()->renderer();
581 if (!transformedAncestor) 581 if (!transformedAncestor)
582 return; 582 return;
583 583
584 // |paintInvalidationContainer| may have a local 2D transform on it, so take that into account when mapping into the space of the 584 // |paintInvalidationContainer| may have a local 2D transform on it, so take that into account when mapping into the space of the
585 // transformed ancestor. 585 // transformed ancestor.
586 point = paintInvalidationContainer->localToContainerPoint(point, transformed Ancestor); 586 point = paintInvalidationContainer->localToContainerPoint(point, transformed Ancestor);
587 587
588 point.moveBy(-paintInvalidationLayer->groupedMapping()->squashingOffsetFromT ransformedAncestor()); 588 point.moveBy(-paintInvalidationLayer->groupedMapping()->squashingOffsetFromT ransformedAncestor());
589 } 589 }
590 590
591 void RenderLayer::mapRectToPaintBackingCoordinates(const RenderLayerModelObject* paintInvalidationContainer, LayoutRect& rect) 591 void Layer::mapRectToPaintBackingCoordinates(const LayoutLayerModelObject* paint InvalidationContainer, LayoutRect& rect)
592 { 592 {
593 RenderLayer* paintInvalidationLayer = paintInvalidationContainer->layer(); 593 Layer* paintInvalidationLayer = paintInvalidationContainer->layer();
594 if (!paintInvalidationLayer->groupedMapping()) { 594 if (!paintInvalidationLayer->groupedMapping()) {
595 rect.move(paintInvalidationLayer->compositedLayerMapping()->contentOffse tInCompositingLayer()); 595 rect.move(paintInvalidationLayer->compositedLayerMapping()->contentOffse tInCompositingLayer());
596 return; 596 return;
597 } 597 }
598 598
599 RenderLayerModelObject* transformedAncestor = paintInvalidationLayer->enclos ingTransformedAncestor()->renderer(); 599 LayoutLayerModelObject* transformedAncestor = paintInvalidationLayer->enclos ingTransformedAncestor()->renderer();
600 if (!transformedAncestor) 600 if (!transformedAncestor)
601 return; 601 return;
602 602
603 // |paintInvalidationContainer| may have a local 2D transform on it, so take that into account when mapping into the space of the 603 // |paintInvalidationContainer| may have a local 2D transform on it, so take that into account when mapping into the space of the
604 // transformed ancestor. 604 // transformed ancestor.
605 rect = LayoutRect(paintInvalidationContainer->localToContainerQuad(FloatRect (rect), transformedAncestor).boundingBox()); 605 rect = LayoutRect(paintInvalidationContainer->localToContainerQuad(FloatRect (rect), transformedAncestor).boundingBox());
606 606
607 rect.moveBy(-paintInvalidationLayer->groupedMapping()->squashingOffsetFromTr ansformedAncestor()); 607 rect.moveBy(-paintInvalidationLayer->groupedMapping()->squashingOffsetFromTr ansformedAncestor());
608 } 608 }
609 609
610 void RenderLayer::mapRectToPaintInvalidationBacking(const RenderObject* renderOb ject, const RenderLayerModelObject* paintInvalidationContainer, LayoutRect& rect , const PaintInvalidationState* paintInvalidationState) 610 void Layer::mapRectToPaintInvalidationBacking(const RenderObject* renderObject, const LayoutLayerModelObject* paintInvalidationContainer, LayoutRect& rect, cons t PaintInvalidationState* paintInvalidationState)
611 { 611 {
612 if (!paintInvalidationContainer->layer()->groupedMapping()) { 612 if (!paintInvalidationContainer->layer()->groupedMapping()) {
613 renderObject->mapRectToPaintInvalidationBacking(paintInvalidationContain er, rect, paintInvalidationState); 613 renderObject->mapRectToPaintInvalidationBacking(paintInvalidationContain er, rect, paintInvalidationState);
614 return; 614 return;
615 } 615 }
616 616
617 // This code adjusts the paint invalidation rectangle to be in the space of the transformed ancestor of the grouped (i.e. squashed) 617 // This code adjusts the paint invalidation rectangle to be in the space of the transformed ancestor of the grouped (i.e. squashed)
618 // layer. This is because all layers that squash together need to issue pain t invalidations w.r.t. a single container that is 618 // layer. This is because all layers that squash together need to issue pain t invalidations w.r.t. a single container that is
619 // an ancestor of all of them, in order to properly take into account any lo cal transforms etc. 619 // an ancestor of all of them, in order to properly take into account any lo cal transforms etc.
620 // FIXME: remove this special-case code that works around the paint invalida tion code structure. 620 // FIXME: remove this special-case code that works around the paint invalida tion code structure.
621 renderObject->mapRectToPaintInvalidationBacking(paintInvalidationContainer, rect, paintInvalidationState); 621 renderObject->mapRectToPaintInvalidationBacking(paintInvalidationContainer, rect, paintInvalidationState);
622 622
623 mapRectToPaintBackingCoordinates(paintInvalidationContainer, rect); 623 mapRectToPaintBackingCoordinates(paintInvalidationContainer, rect);
624 } 624 }
625 625
626 LayoutRect RenderLayer::computePaintInvalidationRect(const RenderObject* renderO bject, const RenderLayer* paintInvalidationContainer, const PaintInvalidationSta te* paintInvalidationState) 626 LayoutRect Layer::computePaintInvalidationRect(const RenderObject* renderObject, const Layer* paintInvalidationContainer, const PaintInvalidationState* paintInv alidationState)
627 { 627 {
628 if (!paintInvalidationContainer->groupedMapping()) 628 if (!paintInvalidationContainer->groupedMapping())
629 return renderObject->computePaintInvalidationRect(paintInvalidationConta iner->renderer(), paintInvalidationState); 629 return renderObject->computePaintInvalidationRect(paintInvalidationConta iner->renderer(), paintInvalidationState);
630 630
631 LayoutRect rect = renderObject->clippedOverflowRectForPaintInvalidation(pain tInvalidationContainer->renderer(), paintInvalidationState); 631 LayoutRect rect = renderObject->clippedOverflowRectForPaintInvalidation(pain tInvalidationContainer->renderer(), paintInvalidationState);
632 mapRectToPaintBackingCoordinates(paintInvalidationContainer->renderer(), rec t); 632 mapRectToPaintBackingCoordinates(paintInvalidationContainer->renderer(), rec t);
633 return rect; 633 return rect;
634 } 634 }
635 635
636 void RenderLayer::dirtyVisibleContentStatus() 636 void Layer::dirtyVisibleContentStatus()
637 { 637 {
638 m_visibleContentStatusDirty = true; 638 m_visibleContentStatusDirty = true;
639 if (parent()) 639 if (parent())
640 parent()->dirtyAncestorChainVisibleDescendantStatus(); 640 parent()->dirtyAncestorChainVisibleDescendantStatus();
641 } 641 }
642 642
643 void RenderLayer::potentiallyDirtyVisibleContentStatus(EVisibility visibility) 643 void Layer::potentiallyDirtyVisibleContentStatus(EVisibility visibility)
644 { 644 {
645 if (m_visibleContentStatusDirty) 645 if (m_visibleContentStatusDirty)
646 return; 646 return;
647 if (hasVisibleContent() == (visibility == VISIBLE)) 647 if (hasVisibleContent() == (visibility == VISIBLE))
648 return; 648 return;
649 dirtyVisibleContentStatus(); 649 dirtyVisibleContentStatus();
650 } 650 }
651 651
652 void RenderLayer::dirtyAncestorChainVisibleDescendantStatus() 652 void Layer::dirtyAncestorChainVisibleDescendantStatus()
653 { 653 {
654 for (RenderLayer* layer = this; layer; layer = layer->parent()) { 654 for (Layer* layer = this; layer; layer = layer->parent()) {
655 if (layer->m_visibleDescendantStatusDirty) 655 if (layer->m_visibleDescendantStatusDirty)
656 break; 656 break;
657 657
658 layer->m_visibleDescendantStatusDirty = true; 658 layer->m_visibleDescendantStatusDirty = true;
659 } 659 }
660 } 660 }
661 661
662 // FIXME: this is quite brute-force. We could be more efficient if we were to 662 // FIXME: this is quite brute-force. We could be more efficient if we were to
663 // track state and update it as appropriate as changes are made in the Render tr ee. 663 // track state and update it as appropriate as changes are made in the Render tr ee.
664 void RenderLayer::updateScrollingStateAfterCompositingChange() 664 void Layer::updateScrollingStateAfterCompositingChange()
665 { 665 {
666 TRACE_EVENT0("blink", "RenderLayer::updateScrollingStateAfterCompositingChan ge"); 666 TRACE_EVENT0("blink", "Layer::updateScrollingStateAfterCompositingChange");
667 m_hasVisibleNonLayerContent = false; 667 m_hasVisibleNonLayerContent = false;
668 for (RenderObject* r = renderer()->slowFirstChild(); r; r = r->nextSibling() ) { 668 for (RenderObject* r = renderer()->slowFirstChild(); r; r = r->nextSibling() ) {
669 if (!r->hasLayer()) { 669 if (!r->hasLayer()) {
670 m_hasVisibleNonLayerContent = true; 670 m_hasVisibleNonLayerContent = true;
671 break; 671 break;
672 } 672 }
673 } 673 }
674 674
675 m_hasNonCompositedChild = false; 675 m_hasNonCompositedChild = false;
676 for (RenderLayer* child = firstChild(); child; child = child->nextSibling()) { 676 for (Layer* child = firstChild(); child; child = child->nextSibling()) {
677 if (child->compositingState() == NotComposited) { 677 if (child->compositingState() == NotComposited) {
678 m_hasNonCompositedChild = true; 678 m_hasNonCompositedChild = true;
679 return; 679 return;
680 } 680 }
681 } 681 }
682 } 682 }
683 683
684 // The descendant-dependent flags system is badly broken because we clean dirty 684 // The descendant-dependent flags system is badly broken because we clean dirty
685 // bits in upward tree walks, which means we need to call updateDescendantDepend entFlags 685 // bits in upward tree walks, which means we need to call updateDescendantDepend entFlags
686 // at every node in the tree to fully clean all the dirty bits. While we'll in 686 // at every node in the tree to fully clean all the dirty bits. While we'll in
687 // the process of fixing this issue, updateDescendantDependentFlagsForEntireSubt ree 687 // the process of fixing this issue, updateDescendantDependentFlagsForEntireSubt ree
688 // provides a big hammer for actually cleaning all the dirty bits in a subtree. 688 // provides a big hammer for actually cleaning all the dirty bits in a subtree.
689 // 689 //
690 // FIXME: Remove this function once the descendant-dependent flags system keeps 690 // FIXME: Remove this function once the descendant-dependent flags system keeps
691 // its dirty bits scoped to subtrees. 691 // its dirty bits scoped to subtrees.
692 void RenderLayer::updateDescendantDependentFlagsForEntireSubtree() 692 void Layer::updateDescendantDependentFlagsForEntireSubtree()
693 { 693 {
694 updateDescendantDependentFlags(); 694 updateDescendantDependentFlags();
695 695
696 for (RenderLayer* child = firstChild(); child; child = child->nextSibling()) 696 for (Layer* child = firstChild(); child; child = child->nextSibling())
697 child->updateDescendantDependentFlagsForEntireSubtree(); 697 child->updateDescendantDependentFlagsForEntireSubtree();
698 } 698 }
699 699
700 void RenderLayer::updateDescendantDependentFlags() 700 void Layer::updateDescendantDependentFlags()
701 { 701 {
702 if (m_visibleDescendantStatusDirty) { 702 if (m_visibleDescendantStatusDirty) {
703 m_hasVisibleDescendant = false; 703 m_hasVisibleDescendant = false;
704 704
705 for (RenderLayer* child = firstChild(); child; child = child->nextSiblin g()) { 705 for (Layer* child = firstChild(); child; child = child->nextSibling()) {
706 child->updateDescendantDependentFlags(); 706 child->updateDescendantDependentFlags();
707 707
708 if (child->m_hasVisibleContent || child->m_hasVisibleDescendant) { 708 if (child->m_hasVisibleContent || child->m_hasVisibleDescendant) {
709 m_hasVisibleDescendant = true; 709 m_hasVisibleDescendant = true;
710 break; 710 break;
711 } 711 }
712 } 712 }
713 713
714 m_visibleDescendantStatusDirty = false; 714 m_visibleDescendantStatusDirty = false;
715 } 715 }
716 716
717 if (m_visibleContentStatusDirty) { 717 if (m_visibleContentStatusDirty) {
718 bool previouslyHasVisibleContent = m_hasVisibleContent; 718 bool previouslyHasVisibleContent = m_hasVisibleContent;
719 if (renderer()->style()->visibility() == VISIBLE) 719 if (renderer()->style()->visibility() == VISIBLE) {
720 m_hasVisibleContent = true; 720 m_hasVisibleContent = true;
721 else { 721 } else {
722 // layer may be hidden but still have some visible content, check fo r this 722 // layer may be hidden but still have some visible content, check fo r this
723 m_hasVisibleContent = false; 723 m_hasVisibleContent = false;
724 RenderObject* r = renderer()->slowFirstChild(); 724 RenderObject* r = renderer()->slowFirstChild();
725 while (r) { 725 while (r) {
726 if (r->style()->visibility() == VISIBLE && !r->hasLayer()) { 726 if (r->style()->visibility() == VISIBLE && !r->hasLayer()) {
727 m_hasVisibleContent = true; 727 m_hasVisibleContent = true;
728 break; 728 break;
729 } 729 }
730 RenderObject* rendererFirstChild = r->slowFirstChild(); 730 RenderObject* rendererFirstChild = r->slowFirstChild();
731 if (rendererFirstChild && !r->hasLayer()) 731 if (rendererFirstChild && !r->hasLayer()) {
732 r = rendererFirstChild; 732 r = rendererFirstChild;
733 else if (r->nextSibling()) 733 } else if (r->nextSibling()) {
734 r = r->nextSibling(); 734 r = r->nextSibling();
735 else { 735 } else {
736 do { 736 do {
737 r = r->parent(); 737 r = r->parent();
738 if (r == renderer()) 738 if (r == renderer())
739 r = 0; 739 r = 0;
740 } while (r && !r->nextSibling()); 740 } while (r && !r->nextSibling());
741 if (r) 741 if (r)
742 r = r->nextSibling(); 742 r = r->nextSibling();
743 } 743 }
744 } 744 }
745 } 745 }
746 m_visibleContentStatusDirty = false; 746 m_visibleContentStatusDirty = false;
747 747
748 if (hasVisibleContent() != previouslyHasVisibleContent) { 748 if (hasVisibleContent() != previouslyHasVisibleContent) {
749 setNeedsCompositingInputsUpdate(); 749 setNeedsCompositingInputsUpdate();
750 // We need to tell m_renderer to recheck its rect because we 750 // We need to tell m_renderer to recheck its rect because we
751 // pretend that invisible RenderObjects have 0x0 rects. Changing 751 // pretend that invisible RenderObjects have 0x0 rects. Changing
752 // visibility therefore changes our rect and we need to visit 752 // visibility therefore changes our rect and we need to visit
753 // this RenderObject during the invalidateTreeIfNeeded walk. 753 // this RenderObject during the invalidateTreeIfNeeded walk.
754 m_renderer->setMayNeedPaintInvalidation(); 754 m_renderer->setMayNeedPaintInvalidation();
755 } 755 }
756 } 756 }
757 } 757 }
758 758
759 void RenderLayer::dirty3DTransformedDescendantStatus() 759 void Layer::dirty3DTransformedDescendantStatus()
760 { 760 {
761 RenderLayerStackingNode* stackingNode = m_stackingNode->ancestorStackingCont extNode(); 761 LayerStackingNode* stackingNode = m_stackingNode->ancestorStackingContextNod e();
762 if (!stackingNode) 762 if (!stackingNode)
763 return; 763 return;
764 764
765 stackingNode->layer()->m_3DTransformedDescendantStatusDirty = true; 765 stackingNode->layer()->m_3DTransformedDescendantStatusDirty = true;
766 766
767 // This propagates up through preserve-3d hierarchies to the enclosing flatt ening layer. 767 // This propagates up through preserve-3d hierarchies to the enclosing flatt ening layer.
768 // Note that preserves3D() creates stacking context, so we can just run up t he stacking containers. 768 // Note that preserves3D() creates stacking context, so we can just run up t he stacking containers.
769 while (stackingNode && stackingNode->layer()->preserves3D()) { 769 while (stackingNode && stackingNode->layer()->preserves3D()) {
770 stackingNode->layer()->m_3DTransformedDescendantStatusDirty = true; 770 stackingNode->layer()->m_3DTransformedDescendantStatusDirty = true;
771 stackingNode = stackingNode->ancestorStackingContextNode(); 771 stackingNode = stackingNode->ancestorStackingContextNode();
772 } 772 }
773 } 773 }
774 774
775 // Return true if this layer or any preserve-3d descendants have 3d. 775 // Return true if this layer or any preserve-3d descendants have 3d.
776 bool RenderLayer::update3DTransformedDescendantStatus() 776 bool Layer::update3DTransformedDescendantStatus()
777 { 777 {
778 if (m_3DTransformedDescendantStatusDirty) { 778 if (m_3DTransformedDescendantStatusDirty) {
779 m_has3DTransformedDescendant = false; 779 m_has3DTransformedDescendant = false;
780 780
781 m_stackingNode->updateZOrderLists(); 781 m_stackingNode->updateZOrderLists();
782 782
783 // Transformed or preserve-3d descendants can only be in the z-order lis ts, not 783 // Transformed or preserve-3d descendants can only be in the z-order lis ts, not
784 // in the normal flow list, so we only need to check those. 784 // in the normal flow list, so we only need to check those.
785 RenderLayerStackingNodeIterator iterator(*m_stackingNode.get(), Positive ZOrderChildren | NegativeZOrderChildren); 785 LayerStackingNodeIterator iterator(*m_stackingNode.get(), PositiveZOrder Children | NegativeZOrderChildren);
786 while (RenderLayerStackingNode* node = iterator.next()) 786 while (LayerStackingNode* node = iterator.next())
787 m_has3DTransformedDescendant |= node->layer()->update3DTransformedDe scendantStatus(); 787 m_has3DTransformedDescendant |= node->layer()->update3DTransformedDe scendantStatus();
788 788
789 m_3DTransformedDescendantStatusDirty = false; 789 m_3DTransformedDescendantStatusDirty = false;
790 } 790 }
791 791
792 // If we live in a 3d hierarchy, then the layer at the root of that hierarch y needs 792 // If we live in a 3d hierarchy, then the layer at the root of that hierarch y needs
793 // the m_has3DTransformedDescendant set. 793 // the m_has3DTransformedDescendant set.
794 if (preserves3D()) 794 if (preserves3D())
795 return has3DTransform() || m_has3DTransformedDescendant; 795 return has3DTransform() || m_has3DTransformedDescendant;
796 796
797 return has3DTransform(); 797 return has3DTransform();
798 } 798 }
799 799
800 bool RenderLayer::updateLayerPosition() 800 bool Layer::updateLayerPosition()
801 { 801 {
802 LayoutPoint localPoint; 802 LayoutPoint localPoint;
803 LayoutPoint inlineBoundingBoxOffset; // We don't put this into the RenderLay er x/y for inlines, so we need to subtract it out when done. 803 LayoutPoint inlineBoundingBoxOffset; // We don't put this into the Layer x/y for inlines, so we need to subtract it out when done.
804 804
805 if (renderer()->isInline() && renderer()->isRenderInline()) { 805 if (renderer()->isInline() && renderer()->isRenderInline()) {
806 RenderInline* inlineFlow = toRenderInline(renderer()); 806 RenderInline* inlineFlow = toRenderInline(renderer());
807 IntRect lineBox = inlineFlow->linesBoundingBox(); 807 IntRect lineBox = inlineFlow->linesBoundingBox();
808 m_size = lineBox.size(); 808 m_size = lineBox.size();
809 inlineBoundingBoxOffset = lineBox.location(); 809 inlineBoundingBoxOffset = lineBox.location();
810 localPoint.moveBy(inlineBoundingBoxOffset); 810 localPoint.moveBy(inlineBoundingBoxOffset);
811 } else if (RenderBox* box = renderBox()) { 811 } else if (RenderBox* box = renderBox()) {
812 m_size = pixelSnappedIntSize(box->size(), box->location()); 812 m_size = pixelSnappedIntSize(box->size(), box->location());
813 localPoint.moveBy(box->topLeftLocation()); 813 localPoint.moveBy(box->topLeftLocation());
(...skipping 12 matching lines...) Expand all
826 curr = curr->parent(); 826 curr = curr->parent();
827 } 827 }
828 if (curr->isBox() && curr->isTableRow()) { 828 if (curr->isBox() && curr->isTableRow()) {
829 // Put ourselves into the row coordinate space. 829 // Put ourselves into the row coordinate space.
830 localPoint.moveBy(-toRenderBox(curr)->topLeftLocation()); 830 localPoint.moveBy(-toRenderBox(curr)->topLeftLocation());
831 } 831 }
832 } 832 }
833 833
834 // Subtract our parent's scroll offset. 834 // Subtract our parent's scroll offset.
835 if (renderer()->isOutOfFlowPositioned() && enclosingPositionedAncestor()) { 835 if (renderer()->isOutOfFlowPositioned() && enclosingPositionedAncestor()) {
836 RenderLayer* positionedParent = enclosingPositionedAncestor(); 836 Layer* positionedParent = enclosingPositionedAncestor();
837 837
838 // For positioned layers, we subtract out the enclosing positioned layer 's scroll offset. 838 // For positioned layers, we subtract out the enclosing positioned layer 's scroll offset.
839 if (positionedParent->renderer()->hasOverflowClip()) { 839 if (positionedParent->renderer()->hasOverflowClip()) {
840 IntSize offset = positionedParent->renderBox()->scrolledContentOffse t(); 840 IntSize offset = positionedParent->renderBox()->scrolledContentOffse t();
841 localPoint -= offset; 841 localPoint -= offset;
842 } 842 }
843 843
844 if (positionedParent->renderer()->isRelPositioned() && positionedParent- >renderer()->isRenderInline()) { 844 if (positionedParent->renderer()->isRelPositioned() && positionedParent- >renderer()->isRenderInline()) {
845 LayoutSize offset = toRenderInline(positionedParent->renderer())->of fsetForInFlowPositionedInline(*toRenderBox(renderer())); 845 LayoutSize offset = toRenderInline(positionedParent->renderer())->of fsetForInFlowPositionedInline(*toRenderBox(renderer()));
846 localPoint += offset; 846 localPoint += offset;
847 } 847 }
848 } else if (parent()) { 848 } else if (parent()) {
849 // FIXME: This code is very wrong, but luckily only needed in the old/cu rrent multicol 849 // FIXME: This code is very wrong, but luckily only needed in the old/cu rrent multicol
850 // implementation. The compositing system doesn't understand columns and we're hacking 850 // implementation. The compositing system doesn't understand columns and we're hacking
851 // around that fact by faking the position of the RenderLayers when we t hink we'll end up 851 // around that fact by faking the position of the Layers when we think w e'll end up
852 // being composited. 852 // being composited.
853 if (hasStyleDeterminedDirectCompositingReasons() && !useRegionBasedColum ns()) { 853 if (hasStyleDeterminedDirectCompositingReasons() && !useRegionBasedColum ns()) {
854 // FIXME: Composited layers ignore pagination, so about the best we can do is make sure they're offset into the appropriate column. 854 // FIXME: Composited layers ignore pagination, so about the best we can do is make sure they're offset into the appropriate column.
855 // They won't split across columns properly. 855 // They won't split across columns properly.
856 if (!parent()->renderer()->hasColumns() && parent()->renderer()->isD ocumentElement() && renderer()->view()->hasColumns()) 856 if (!parent()->renderer()->hasColumns() && parent()->renderer()->isD ocumentElement() && renderer()->view()->hasColumns())
857 localPoint += renderer()->view()->columnOffset(localPoint); 857 localPoint += renderer()->view()->columnOffset(localPoint);
858 else 858 else
859 localPoint += parent()->renderer()->columnOffset(localPoint); 859 localPoint += parent()->renderer()->columnOffset(localPoint);
860 } 860 }
861 861
(...skipping 19 matching lines...) Expand all
881 if (m_location != localPoint) 881 if (m_location != localPoint)
882 positionOrOffsetChanged = true; 882 positionOrOffsetChanged = true;
883 m_location = localPoint; 883 m_location = localPoint;
884 884
885 #if ENABLE(ASSERT) 885 #if ENABLE(ASSERT)
886 m_needsPositionUpdate = false; 886 m_needsPositionUpdate = false;
887 #endif 887 #endif
888 return positionOrOffsetChanged; 888 return positionOrOffsetChanged;
889 } 889 }
890 890
891 TransformationMatrix RenderLayer::perspectiveTransform() const 891 TransformationMatrix Layer::perspectiveTransform() const
892 { 892 {
893 if (!renderer()->hasTransformRelatedProperty()) 893 if (!renderer()->hasTransformRelatedProperty())
894 return TransformationMatrix(); 894 return TransformationMatrix();
895 895
896 RenderStyle* style = renderer()->style(); 896 RenderStyle* style = renderer()->style();
897 if (!style->hasPerspective()) 897 if (!style->hasPerspective())
898 return TransformationMatrix(); 898 return TransformationMatrix();
899 899
900 // Maybe fetch the perspective from the backing? 900 // Maybe fetch the perspective from the backing?
901 const IntRect borderBox = toRenderBox(renderer())->pixelSnappedBorderBoxRect (); 901 const IntRect borderBox = toRenderBox(renderer())->pixelSnappedBorderBoxRect ();
902 const float boxWidth = borderBox.width(); 902 const float boxWidth = borderBox.width();
903 const float boxHeight = borderBox.height(); 903 const float boxHeight = borderBox.height();
904 904
905 float perspectiveOriginX = floatValueForLength(style->perspectiveOriginX(), boxWidth); 905 float perspectiveOriginX = floatValueForLength(style->perspectiveOriginX(), boxWidth);
906 float perspectiveOriginY = floatValueForLength(style->perspectiveOriginY(), boxHeight); 906 float perspectiveOriginY = floatValueForLength(style->perspectiveOriginY(), boxHeight);
907 907
908 // A perspective origin of 0,0 makes the vanishing point in the center of th e element. 908 // A perspective origin of 0,0 makes the vanishing point in the center of th e element.
909 // We want it to be in the top-left, so subtract half the height and width. 909 // We want it to be in the top-left, so subtract half the height and width.
910 perspectiveOriginX -= boxWidth / 2.0f; 910 perspectiveOriginX -= boxWidth / 2.0f;
911 perspectiveOriginY -= boxHeight / 2.0f; 911 perspectiveOriginY -= boxHeight / 2.0f;
912 912
913 TransformationMatrix t; 913 TransformationMatrix t;
914 t.translate(perspectiveOriginX, perspectiveOriginY); 914 t.translate(perspectiveOriginX, perspectiveOriginY);
915 t.applyPerspective(style->perspective()); 915 t.applyPerspective(style->perspective());
916 t.translate(-perspectiveOriginX, -perspectiveOriginY); 916 t.translate(-perspectiveOriginX, -perspectiveOriginY);
917 917
918 return t; 918 return t;
919 } 919 }
920 920
921 FloatPoint RenderLayer::perspectiveOrigin() const 921 FloatPoint Layer::perspectiveOrigin() const
922 { 922 {
923 if (!renderer()->hasTransformRelatedProperty()) 923 if (!renderer()->hasTransformRelatedProperty())
924 return FloatPoint(); 924 return FloatPoint();
925 925
926 const LayoutRect borderBox = toRenderBox(renderer())->borderBoxRect(); 926 const LayoutRect borderBox = toRenderBox(renderer())->borderBoxRect();
927 RenderStyle* style = renderer()->style(); 927 RenderStyle* style = renderer()->style();
928 928
929 return FloatPoint(floatValueForLength(style->perspectiveOriginX(), borderBox .width().toFloat()), floatValueForLength(style->perspectiveOriginY(), borderBox. height().toFloat())); 929 return FloatPoint(floatValueForLength(style->perspectiveOriginX(), borderBox .width().toFloat()), floatValueForLength(style->perspectiveOriginY(), borderBox. height().toFloat()));
930 } 930 }
931 931
932 static inline bool isFixedPositionedContainer(RenderLayer* layer) 932 static inline bool isFixedPositionedContainer(Layer* layer)
933 { 933 {
934 return layer->isRootLayer() || layer->hasTransformRelatedProperty(); 934 return layer->isRootLayer() || layer->hasTransformRelatedProperty();
935 } 935 }
936 936
937 RenderLayer* RenderLayer::enclosingPositionedAncestor() const 937 Layer* Layer::enclosingPositionedAncestor() const
938 { 938 {
939 RenderLayer* curr = parent(); 939 Layer* curr = parent();
940 while (curr && !curr->isPositionedContainer()) 940 while (curr && !curr->isPositionedContainer())
941 curr = curr->parent(); 941 curr = curr->parent();
942 942
943 return curr; 943 return curr;
944 } 944 }
945 945
946 RenderLayer* RenderLayer::enclosingTransformedAncestor() const 946 Layer* Layer::enclosingTransformedAncestor() const
947 { 947 {
948 RenderLayer* curr = parent(); 948 Layer* curr = parent();
949 while (curr && !curr->isRootLayer() && !curr->renderer()->hasTransformRelate dProperty()) 949 while (curr && !curr->isRootLayer() && !curr->renderer()->hasTransformRelate dProperty())
950 curr = curr->parent(); 950 curr = curr->parent();
951 951
952 return curr; 952 return curr;
953 } 953 }
954 954
955 LayoutPoint RenderLayer::computeOffsetFromTransformedAncestor() const 955 LayoutPoint Layer::computeOffsetFromTransformedAncestor() const
956 { 956 {
957 const AncestorDependentCompositingInputs& properties = ancestorDependentComp ositingInputs(); 957 const AncestorDependentCompositingInputs& properties = ancestorDependentComp ositingInputs();
958 958
959 TransformState transformState(TransformState::ApplyTransformDirection, Float Point()); 959 TransformState transformState(TransformState::ApplyTransformDirection, Float Point());
960 // FIXME: add a test that checks flipped writing mode and ApplyContainerFlip are correct. 960 // FIXME: add a test that checks flipped writing mode and ApplyContainerFlip are correct.
961 renderer()->mapLocalToContainer(properties.transformAncestor ? properties.tr ansformAncestor->renderer() : 0, transformState, ApplyContainerFlip); 961 renderer()->mapLocalToContainer(properties.transformAncestor ? properties.tr ansformAncestor->renderer() : 0, transformState, ApplyContainerFlip);
962 transformState.flatten(); 962 transformState.flatten();
963 return LayoutPoint(transformState.lastPlanarPoint()); 963 return LayoutPoint(transformState.lastPlanarPoint());
964 } 964 }
965 965
966 const RenderLayer* RenderLayer::compositingContainer() const 966 const Layer* Layer::compositingContainer() const
967 { 967 {
968 if (stackingNode()->isNormalFlowOnly()) 968 if (stackingNode()->isNormalFlowOnly())
969 return parent(); 969 return parent();
970 if (RenderLayerStackingNode* ancestorStackingNode = stackingNode()->ancestor StackingContextNode()) 970 if (LayerStackingNode* ancestorStackingNode = stackingNode()->ancestorStacki ngContextNode())
971 return ancestorStackingNode->layer(); 971 return ancestorStackingNode->layer();
972 return 0; 972 return 0;
973 } 973 }
974 974
975 bool RenderLayer::isPaintInvalidationContainer() const 975 bool Layer::isPaintInvalidationContainer() const
976 { 976 {
977 return compositingState() == PaintsIntoOwnBacking || compositingState() == P aintsIntoGroupedBacking; 977 return compositingState() == PaintsIntoOwnBacking || compositingState() == P aintsIntoGroupedBacking;
978 } 978 }
979 979
980 // Note: enclosingCompositingLayer does not include squashed layers. Compositing stacking children of squashed layers 980 // Note: enclosingCompositingLayer does not include squashed layers. Compositing stacking children of squashed layers
981 // receive graphics layers that are parented to the compositing ancestor of the squashed layer. 981 // receive graphics layers that are parented to the compositing ancestor of the squashed layer.
982 RenderLayer* RenderLayer::enclosingLayerWithCompositedLayerMapping(IncludeSelfOr Not includeSelf) const 982 Layer* Layer::enclosingLayerWithCompositedLayerMapping(IncludeSelfOrNot includeS elf) const
983 { 983 {
984 ASSERT(isAllowedToQueryCompositingState()); 984 ASSERT(isAllowedToQueryCompositingState());
985 985
986 if ((includeSelf == IncludeSelf) && compositingState() != NotComposited && c ompositingState() != PaintsIntoGroupedBacking) 986 if ((includeSelf == IncludeSelf) && compositingState() != NotComposited && c ompositingState() != PaintsIntoGroupedBacking)
987 return const_cast<RenderLayer*>(this); 987 return const_cast<Layer*>(this);
988 988
989 for (const RenderLayer* curr = compositingContainer(); curr; curr = curr->co mpositingContainer()) { 989 for (const Layer* curr = compositingContainer(); curr; curr = curr->composit ingContainer()) {
990 if (curr->compositingState() != NotComposited && curr->compositingState( ) != PaintsIntoGroupedBacking) 990 if (curr->compositingState() != NotComposited && curr->compositingState( ) != PaintsIntoGroupedBacking)
991 return const_cast<RenderLayer*>(curr); 991 return const_cast<Layer*>(curr);
992 } 992 }
993 993
994 return 0; 994 return 0;
995 } 995 }
996 996
997 // Return the enclosingCompositedLayerForPaintInvalidation for the given RenderL ayer 997 // Return the enclosingCompositedLayerForPaintInvalidation for the given Layer
998 // including crossing frame boundaries. 998 // including crossing frame boundaries.
999 RenderLayer* RenderLayer::enclosingLayerForPaintInvalidationCrossingFrameBoundar ies() const 999 Layer* Layer::enclosingLayerForPaintInvalidationCrossingFrameBoundaries() const
1000 { 1000 {
1001 const RenderLayer* layer = this; 1001 const Layer* layer = this;
1002 RenderLayer* compositedLayer = 0; 1002 Layer* compositedLayer = 0;
1003 while (!compositedLayer) { 1003 while (!compositedLayer) {
1004 compositedLayer = layer->enclosingLayerForPaintInvalidation(); 1004 compositedLayer = layer->enclosingLayerForPaintInvalidation();
1005 if (!compositedLayer) { 1005 if (!compositedLayer) {
1006 RenderObject* owner = layer->renderer()->frame()->ownerRenderer(); 1006 RenderObject* owner = layer->renderer()->frame()->ownerRenderer();
1007 if (!owner) 1007 if (!owner)
1008 break; 1008 break;
1009 layer = owner->enclosingLayer(); 1009 layer = owner->enclosingLayer();
1010 } 1010 }
1011 } 1011 }
1012 return compositedLayer; 1012 return compositedLayer;
1013 } 1013 }
1014 1014
1015 RenderLayer* RenderLayer::enclosingLayerForPaintInvalidation() const 1015 Layer* Layer::enclosingLayerForPaintInvalidation() const
1016 { 1016 {
1017 ASSERT(isAllowedToQueryCompositingState()); 1017 ASSERT(isAllowedToQueryCompositingState());
1018 1018
1019 if (isPaintInvalidationContainer()) 1019 if (isPaintInvalidationContainer())
1020 return const_cast<RenderLayer*>(this); 1020 return const_cast<Layer*>(this);
1021 1021
1022 for (const RenderLayer* curr = compositingContainer(); curr; curr = curr->co mpositingContainer()) { 1022 for (const Layer* curr = compositingContainer(); curr; curr = curr->composit ingContainer()) {
1023 if (curr->isPaintInvalidationContainer()) 1023 if (curr->isPaintInvalidationContainer())
1024 return const_cast<RenderLayer*>(curr); 1024 return const_cast<Layer*>(curr);
1025 } 1025 }
1026 1026
1027 return 0; 1027 return 0;
1028 } 1028 }
1029 1029
1030 void RenderLayer::setNeedsCompositingInputsUpdate() 1030 void Layer::setNeedsCompositingInputsUpdate()
1031 { 1031 {
1032 m_needsAncestorDependentCompositingInputsUpdate = true; 1032 m_needsAncestorDependentCompositingInputsUpdate = true;
1033 m_needsDescendantDependentCompositingInputsUpdate = true; 1033 m_needsDescendantDependentCompositingInputsUpdate = true;
1034 1034
1035 for (RenderLayer* current = this; current && !current->m_childNeedsCompositi ngInputsUpdate; current = current->parent()) 1035 for (Layer* current = this; current && !current->m_childNeedsCompositingInpu tsUpdate; current = current->parent())
1036 current->m_childNeedsCompositingInputsUpdate = true; 1036 current->m_childNeedsCompositingInputsUpdate = true;
1037 1037
1038 compositor()->setNeedsCompositingUpdate(CompositingUpdateAfterCompositingInp utChange); 1038 compositor()->setNeedsCompositingUpdate(CompositingUpdateAfterCompositingInp utChange);
1039 } 1039 }
1040 1040
1041 void RenderLayer::updateAncestorDependentCompositingInputs(const AncestorDepende ntCompositingInputs& compositingInputs) 1041 void Layer::updateAncestorDependentCompositingInputs(const AncestorDependentComp ositingInputs& compositingInputs)
1042 { 1042 {
1043 m_ancestorDependentCompositingInputs = compositingInputs; 1043 m_ancestorDependentCompositingInputs = compositingInputs;
1044 m_needsAncestorDependentCompositingInputsUpdate = false; 1044 m_needsAncestorDependentCompositingInputsUpdate = false;
1045 } 1045 }
1046 1046
1047 void RenderLayer::updateDescendantDependentCompositingInputs(const DescendantDep endentCompositingInputs& compositingInputs) 1047 void Layer::updateDescendantDependentCompositingInputs(const DescendantDependent CompositingInputs& compositingInputs)
1048 { 1048 {
1049 m_descendantDependentCompositingInputs = compositingInputs; 1049 m_descendantDependentCompositingInputs = compositingInputs;
1050 m_needsDescendantDependentCompositingInputsUpdate = false; 1050 m_needsDescendantDependentCompositingInputsUpdate = false;
1051 } 1051 }
1052 1052
1053 void RenderLayer::didUpdateCompositingInputs() 1053 void Layer::didUpdateCompositingInputs()
1054 { 1054 {
1055 ASSERT(!needsCompositingInputsUpdate()); 1055 ASSERT(!needsCompositingInputsUpdate());
1056 m_childNeedsCompositingInputsUpdate = false; 1056 m_childNeedsCompositingInputsUpdate = false;
1057 if (m_scrollableArea) 1057 if (m_scrollableArea)
1058 m_scrollableArea->updateNeedsCompositedScrolling(); 1058 m_scrollableArea->updateNeedsCompositedScrolling();
1059 } 1059 }
1060 1060
1061 bool RenderLayer::hasNonIsolatedDescendantWithBlendMode() const 1061 bool Layer::hasNonIsolatedDescendantWithBlendMode() const
1062 { 1062 {
1063 if (descendantDependentCompositingInputs().hasNonIsolatedDescendantWithBlend Mode) 1063 if (descendantDependentCompositingInputs().hasNonIsolatedDescendantWithBlend Mode)
1064 return true; 1064 return true;
1065 if (renderer()->isSVGRoot()) 1065 if (renderer()->isSVGRoot())
1066 return toRenderSVGRoot(renderer())->hasNonIsolatedBlendingDescendants(); 1066 return toRenderSVGRoot(renderer())->hasNonIsolatedBlendingDescendants();
1067 return false; 1067 return false;
1068 } 1068 }
1069 1069
1070 void RenderLayer::setCompositingReasons(CompositingReasons reasons, CompositingR easons mask) 1070 void Layer::setCompositingReasons(CompositingReasons reasons, CompositingReasons mask)
1071 { 1071 {
1072 if ((compositingReasons() & mask) == (reasons & mask)) 1072 if ((compositingReasons() & mask) == (reasons & mask))
1073 return; 1073 return;
1074 m_compositingReasons = (reasons & mask) | (compositingReasons() & ~mask); 1074 m_compositingReasons = (reasons & mask) | (compositingReasons() & ~mask);
1075 } 1075 }
1076 1076
1077 void RenderLayer::setHasCompositingDescendant(bool hasCompositingDescendant) 1077 void Layer::setHasCompositingDescendant(bool hasCompositingDescendant)
1078 { 1078 {
1079 if (m_hasCompositingDescendant == static_cast<unsigned>(hasCompositingDescen dant)) 1079 if (m_hasCompositingDescendant == static_cast<unsigned>(hasCompositingDescen dant))
1080 return; 1080 return;
1081 1081
1082 m_hasCompositingDescendant = hasCompositingDescendant; 1082 m_hasCompositingDescendant = hasCompositingDescendant;
1083 1083
1084 if (hasCompositedLayerMapping()) 1084 if (hasCompositedLayerMapping())
1085 compositedLayerMapping()->setNeedsGraphicsLayerUpdate(GraphicsLayerUpdat eLocal); 1085 compositedLayerMapping()->setNeedsGraphicsLayerUpdate(GraphicsLayerUpdat eLocal);
1086 } 1086 }
1087 1087
1088 void RenderLayer::setShouldIsolateCompositedDescendants(bool shouldIsolateCompos itedDescendants) 1088 void Layer::setShouldIsolateCompositedDescendants(bool shouldIsolateCompositedDe scendants)
1089 { 1089 {
1090 if (m_shouldIsolateCompositedDescendants == static_cast<unsigned>(shouldIsol ateCompositedDescendants)) 1090 if (m_shouldIsolateCompositedDescendants == static_cast<unsigned>(shouldIsol ateCompositedDescendants))
1091 return; 1091 return;
1092 1092
1093 m_shouldIsolateCompositedDescendants = shouldIsolateCompositedDescendants; 1093 m_shouldIsolateCompositedDescendants = shouldIsolateCompositedDescendants;
1094 1094
1095 if (hasCompositedLayerMapping()) 1095 if (hasCompositedLayerMapping())
1096 compositedLayerMapping()->setNeedsGraphicsLayerUpdate(GraphicsLayerUpdat eLocal); 1096 compositedLayerMapping()->setNeedsGraphicsLayerUpdate(GraphicsLayerUpdat eLocal);
1097 } 1097 }
1098 1098
1099 bool RenderLayer::hasAncestorWithFilterOutsets() const 1099 bool Layer::hasAncestorWithFilterOutsets() const
1100 { 1100 {
1101 for (const RenderLayer* curr = this; curr; curr = curr->parent()) { 1101 for (const Layer* curr = this; curr; curr = curr->parent()) {
1102 RenderLayerModelObject* renderer = curr->renderer(); 1102 LayoutLayerModelObject* renderer = curr->renderer();
1103 if (renderer->style()->hasFilterOutsets()) 1103 if (renderer->style()->hasFilterOutsets())
1104 return true; 1104 return true;
1105 } 1105 }
1106 return false; 1106 return false;
1107 } 1107 }
1108 1108
1109 static void expandClipRectForDescendantsAndReflection(LayoutRect& clipRect, cons t RenderLayer* layer, const RenderLayer* rootLayer, 1109 static void expandClipRectForDescendantsAndReflection(LayoutRect& clipRect, cons t Layer* layer, const Layer* rootLayer,
1110 RenderLayer::TransparencyClipBoxBehavior transparencyBehavior, const LayoutS ize& subPixelAccumulation, PaintBehavior paintBehavior) 1110 Layer::TransparencyClipBoxBehavior transparencyBehavior, const LayoutSize& s ubPixelAccumulation, PaintBehavior paintBehavior)
1111 { 1111 {
1112 // If we have a mask, then the clip is limited to the border box area (and t here is 1112 // If we have a mask, then the clip is limited to the border box area (and t here is
1113 // no need to examine child layers). 1113 // no need to examine child layers).
1114 if (!layer->renderer()->hasMask()) { 1114 if (!layer->renderer()->hasMask()) {
1115 // Note: we don't have to walk z-order lists since transparent elements always establish 1115 // Note: we don't have to walk z-order lists since transparent elements always establish
1116 // a stacking container. This means we can just walk the layer tree dire ctly. 1116 // a stacking container. This means we can just walk the layer tree dire ctly.
1117 for (RenderLayer* curr = layer->firstChild(); curr; curr = curr->nextSib ling()) { 1117 for (Layer* curr = layer->firstChild(); curr; curr = curr->nextSibling() ) {
1118 if (!layer->reflectionInfo() || layer->reflectionInfo()->reflectionL ayer() != curr) 1118 if (!layer->reflectionInfo() || layer->reflectionInfo()->reflectionL ayer() != curr)
1119 clipRect.unite(RenderLayer::transparencyClipBox(curr, rootLayer, transparencyBehavior, RenderLayer::DescendantsOfTransparencyClipBox, subPixelAc cumulation, paintBehavior)); 1119 clipRect.unite(Layer::transparencyClipBox(curr, rootLayer, trans parencyBehavior, Layer::DescendantsOfTransparencyClipBox, subPixelAccumulation, paintBehavior));
1120 } 1120 }
1121 } 1121 }
1122 1122
1123 // If we have a reflection, then we need to account for that when we push th e clip. Reflect our entire 1123 // If we have a reflection, then we need to account for that when we push th e clip. Reflect our entire
1124 // current transparencyClipBox to catch all child layers. 1124 // current transparencyClipBox to catch all child layers.
1125 // FIXME: Accelerated compositing will eventually want to do something smart here to avoid incorporating this 1125 // FIXME: Accelerated compositing will eventually want to do something smart here to avoid incorporating this
1126 // size into the parent layer. 1126 // size into the parent layer.
1127 if (layer->renderer()->hasReflection()) { 1127 if (layer->renderer()->hasReflection()) {
1128 LayoutPoint delta; 1128 LayoutPoint delta;
1129 layer->convertToLayerCoords(rootLayer, delta); 1129 layer->convertToLayerCoords(rootLayer, delta);
1130 clipRect.move(-delta.x(), -delta.y()); 1130 clipRect.move(-delta.x(), -delta.y());
1131 clipRect.unite(layer->renderBox()->reflectedRect(clipRect)); 1131 clipRect.unite(layer->renderBox()->reflectedRect(clipRect));
1132 clipRect.moveBy(delta); 1132 clipRect.moveBy(delta);
1133 } 1133 }
1134 } 1134 }
1135 1135
1136 LayoutRect RenderLayer::transparencyClipBox(const RenderLayer* layer, const Rend erLayer* rootLayer, TransparencyClipBoxBehavior transparencyBehavior, 1136 LayoutRect Layer::transparencyClipBox(const Layer* layer, const Layer* rootLayer , TransparencyClipBoxBehavior transparencyBehavior,
1137 TransparencyClipBoxMode transparencyMode, const LayoutSize& subPixelAccumula tion, PaintBehavior paintBehavior) 1137 TransparencyClipBoxMode transparencyMode, const LayoutSize& subPixelAccumula tion, PaintBehavior paintBehavior)
1138 { 1138 {
1139 // FIXME: Although this function completely ignores CSS-imposed clipping, we did already intersect with the 1139 // FIXME: Although this function completely ignores CSS-imposed clipping, we did already intersect with the
1140 // paintDirtyRect, and that should cut down on the amount we have to paint. Still it 1140 // paintDirtyRect, and that should cut down on the amount we have to paint. Still it
1141 // would be better to respect clips. 1141 // would be better to respect clips.
1142 1142
1143 if (rootLayer != layer && ((transparencyBehavior == PaintingTransparencyClip Box && layer->paintsWithTransform(paintBehavior)) 1143 if (rootLayer != layer && ((transparencyBehavior == PaintingTransparencyClip Box && layer->paintsWithTransform(paintBehavior))
1144 || (transparencyBehavior == HitTestingTransparencyClipBox && layer->hasT ransformRelatedProperty()))) { 1144 || (transparencyBehavior == HitTestingTransparencyClipBox && layer->hasT ransformRelatedProperty()))) {
1145 // The best we can do here is to use enclosed bounding boxes to establis h a "fuzzy" enough clip to encompass 1145 // The best we can do here is to use enclosed bounding boxes to establis h a "fuzzy" enough clip to encompass
1146 // the transformed layer and all of its children. 1146 // the transformed layer and all of its children.
1147 const RenderLayer* paginationLayer = transparencyMode == DescendantsOfTr ansparencyClipBox ? layer->enclosingPaginationLayer() : 0; 1147 const Layer* paginationLayer = transparencyMode == DescendantsOfTranspar encyClipBox ? layer->enclosingPaginationLayer() : 0;
1148 const RenderLayer* rootLayerForTransform = paginationLayer ? paginationL ayer : rootLayer; 1148 const Layer* rootLayerForTransform = paginationLayer ? paginationLayer : rootLayer;
1149 LayoutPoint delta; 1149 LayoutPoint delta;
1150 layer->convertToLayerCoords(rootLayerForTransform, delta); 1150 layer->convertToLayerCoords(rootLayerForTransform, delta);
1151 1151
1152 delta.move(subPixelAccumulation); 1152 delta.move(subPixelAccumulation);
1153 IntPoint pixelSnappedDelta = roundedIntPoint(delta); 1153 IntPoint pixelSnappedDelta = roundedIntPoint(delta);
1154 TransformationMatrix transform; 1154 TransformationMatrix transform;
1155 transform.translate(pixelSnappedDelta.x(), pixelSnappedDelta.y()); 1155 transform.translate(pixelSnappedDelta.x(), pixelSnappedDelta.y());
1156 transform = transform * *layer->transform(); 1156 transform = transform * *layer->transform();
1157 1157
1158 // We don't use fragment boxes when collecting a transformed layer's bou nding box, since it always 1158 // We don't use fragment boxes when collecting a transformed layer's bou nding box, since it always
(...skipping 17 matching lines...) Expand all
1176 return result; 1176 return result;
1177 } 1177 }
1178 1178
1179 LayoutRect clipRect = layer->fragmentsBoundingBox(rootLayer); 1179 LayoutRect clipRect = layer->fragmentsBoundingBox(rootLayer);
1180 expandClipRectForDescendantsAndReflection(clipRect, layer, rootLayer, transp arencyBehavior, subPixelAccumulation, paintBehavior); 1180 expandClipRectForDescendantsAndReflection(clipRect, layer, rootLayer, transp arencyBehavior, subPixelAccumulation, paintBehavior);
1181 clipRect.expand(layer->renderer()->style()->filterOutsets()); 1181 clipRect.expand(layer->renderer()->style()->filterOutsets());
1182 clipRect.move(subPixelAccumulation); 1182 clipRect.move(subPixelAccumulation);
1183 return clipRect; 1183 return clipRect;
1184 } 1184 }
1185 1185
1186 LayoutRect RenderLayer::paintingExtent(const RenderLayer* rootLayer, const Layou tRect& paintDirtyRect, const LayoutSize& subPixelAccumulation, PaintBehavior pai ntBehavior) 1186 LayoutRect Layer::paintingExtent(const Layer* rootLayer, const LayoutRect& paint DirtyRect, const LayoutSize& subPixelAccumulation, PaintBehavior paintBehavior)
1187 { 1187 {
1188 return intersection(transparencyClipBox(this, rootLayer, PaintingTransparenc yClipBox, RootOfTransparencyClipBox, subPixelAccumulation, paintBehavior), paint DirtyRect); 1188 return intersection(transparencyClipBox(this, rootLayer, PaintingTransparenc yClipBox, RootOfTransparencyClipBox, subPixelAccumulation, paintBehavior), paint DirtyRect);
1189 } 1189 }
1190 1190
1191 void* RenderLayer::operator new(size_t sz) 1191 void* Layer::operator new(size_t sz)
1192 { 1192 {
1193 return partitionAlloc(Partitions::getRenderingPartition(), sz); 1193 return partitionAlloc(Partitions::getRenderingPartition(), sz);
1194 } 1194 }
1195 1195
1196 void RenderLayer::operator delete(void* ptr) 1196 void Layer::operator delete(void* ptr)
1197 { 1197 {
1198 partitionFree(ptr); 1198 partitionFree(ptr);
1199 } 1199 }
1200 1200
1201 void RenderLayer::addChild(RenderLayer* child, RenderLayer* beforeChild) 1201 void Layer::addChild(Layer* child, Layer* beforeChild)
1202 { 1202 {
1203 RenderLayer* prevSibling = beforeChild ? beforeChild->previousSibling() : la stChild(); 1203 Layer* prevSibling = beforeChild ? beforeChild->previousSibling() : lastChil d();
1204 if (prevSibling) { 1204 if (prevSibling) {
1205 child->setPreviousSibling(prevSibling); 1205 child->setPreviousSibling(prevSibling);
1206 prevSibling->setNextSibling(child); 1206 prevSibling->setNextSibling(child);
1207 ASSERT(prevSibling != child); 1207 ASSERT(prevSibling != child);
1208 } else 1208 } else {
1209 setFirstChild(child); 1209 setFirstChild(child);
1210 }
1210 1211
1211 if (beforeChild) { 1212 if (beforeChild) {
1212 beforeChild->setPreviousSibling(child); 1213 beforeChild->setPreviousSibling(child);
1213 child->setNextSibling(beforeChild); 1214 child->setNextSibling(beforeChild);
1214 ASSERT(beforeChild != child); 1215 ASSERT(beforeChild != child);
1215 } else 1216 } else {
1216 setLastChild(child); 1217 setLastChild(child);
1218 }
1217 1219
1218 child->m_parent = this; 1220 child->m_parent = this;
1219 1221
1220 setNeedsCompositingInputsUpdate(); 1222 setNeedsCompositingInputsUpdate();
1221 1223
1222 if (child->stackingNode()->isNormalFlowOnly()) 1224 if (child->stackingNode()->isNormalFlowOnly())
1223 m_stackingNode->dirtyNormalFlowList(); 1225 m_stackingNode->dirtyNormalFlowList();
1224 1226
1225 if (!child->stackingNode()->isNormalFlowOnly() || child->firstChild()) { 1227 if (!child->stackingNode()->isNormalFlowOnly() || child->firstChild()) {
1226 // Dirty the z-order list in which we are contained. The ancestorStackin gContextNode() can be null in the 1228 // Dirty the z-order list in which we are contained. The ancestorStackin gContextNode() can be null in the
1227 // case where we're building up generated content layers. This is ok, si nce the lists will start 1229 // case where we're building up generated content layers. This is ok, si nce the lists will start
1228 // off dirty in that case anyway. 1230 // off dirty in that case anyway.
1229 child->stackingNode()->dirtyStackingContextZOrderLists(); 1231 child->stackingNode()->dirtyStackingContextZOrderLists();
1230 } 1232 }
1231 1233
1232 dirtyAncestorChainVisibleDescendantStatus(); 1234 dirtyAncestorChainVisibleDescendantStatus();
1233 dirtyAncestorChainHasSelfPaintingLayerDescendantStatus(); 1235 dirtyAncestorChainHasSelfPaintingLayerDescendantStatus();
1234 1236
1235 child->updateDescendantDependentFlags(); 1237 child->updateDescendantDependentFlags();
1236 } 1238 }
1237 1239
1238 RenderLayer* RenderLayer::removeChild(RenderLayer* oldChild) 1240 Layer* Layer::removeChild(Layer* oldChild)
1239 { 1241 {
1240 if (oldChild->previousSibling()) 1242 if (oldChild->previousSibling())
1241 oldChild->previousSibling()->setNextSibling(oldChild->nextSibling()); 1243 oldChild->previousSibling()->setNextSibling(oldChild->nextSibling());
1242 if (oldChild->nextSibling()) 1244 if (oldChild->nextSibling())
1243 oldChild->nextSibling()->setPreviousSibling(oldChild->previousSibling()) ; 1245 oldChild->nextSibling()->setPreviousSibling(oldChild->previousSibling()) ;
1244 1246
1245 if (m_first == oldChild) 1247 if (m_first == oldChild)
1246 m_first = oldChild->nextSibling(); 1248 m_first = oldChild->nextSibling();
1247 if (m_last == oldChild) 1249 if (m_last == oldChild)
1248 m_last = oldChild->previousSibling(); 1250 m_last = oldChild->previousSibling();
(...skipping 21 matching lines...) Expand all
1270 1272
1271 if (oldChild->m_hasVisibleContent || oldChild->m_hasVisibleDescendant) 1273 if (oldChild->m_hasVisibleContent || oldChild->m_hasVisibleDescendant)
1272 dirtyAncestorChainVisibleDescendantStatus(); 1274 dirtyAncestorChainVisibleDescendantStatus();
1273 1275
1274 if (oldChild->enclosingPaginationLayer()) 1276 if (oldChild->enclosingPaginationLayer())
1275 oldChild->clearPaginationRecursive(); 1277 oldChild->clearPaginationRecursive();
1276 1278
1277 return oldChild; 1279 return oldChild;
1278 } 1280 }
1279 1281
1280 void RenderLayer::removeOnlyThisLayer() 1282 void Layer::removeOnlyThisLayer()
1281 { 1283 {
1282 if (!m_parent) 1284 if (!m_parent)
1283 return; 1285 return;
1284 1286
1285 { 1287 {
1286 DisableCompositingQueryAsserts disabler; // We need the current composit ing status. 1288 DisableCompositingQueryAsserts disabler; // We need the current composit ing status.
1287 if (isPaintInvalidationContainer()) { 1289 if (isPaintInvalidationContainer()) {
1288 // Our children will be reparented and contained by a new paint inva lidation container, 1290 // Our children will be reparented and contained by a new paint inva lidation container,
1289 // so need paint invalidation. CompositingUpdate can't see this laye r (which has been 1291 // so need paint invalidation. CompositingUpdate can't see this laye r (which has been
1290 // removed) so won't do this for us. 1292 // removed) so won't do this for us.
1291 setShouldDoFullPaintInvalidationIncludingNonCompositingDescendants() ; 1293 setShouldDoFullPaintInvalidationIncludingNonCompositingDescendants() ;
1292 } 1294 }
1293 } 1295 }
1294 1296
1295 m_clipper.clearClipRectsIncludingDescendants(); 1297 m_clipper.clearClipRectsIncludingDescendants();
1296 1298
1297 RenderLayer* nextSib = nextSibling(); 1299 Layer* nextSib = nextSibling();
1298 1300
1299 // Remove the child reflection layer before moving other child layers. 1301 // Remove the child reflection layer before moving other child layers.
1300 // The reflection layer should not be moved to the parent. 1302 // The reflection layer should not be moved to the parent.
1301 if (m_reflectionInfo) 1303 if (m_reflectionInfo)
1302 removeChild(m_reflectionInfo->reflectionLayer()); 1304 removeChild(m_reflectionInfo->reflectionLayer());
1303 1305
1304 // Now walk our kids and reattach them to our parent. 1306 // Now walk our kids and reattach them to our parent.
1305 RenderLayer* current = m_first; 1307 Layer* current = m_first;
1306 while (current) { 1308 while (current) {
1307 RenderLayer* next = current->nextSibling(); 1309 Layer* next = current->nextSibling();
1308 removeChild(current); 1310 removeChild(current);
1309 m_parent->addChild(current, nextSib); 1311 m_parent->addChild(current, nextSib);
1310 1312
1311 // FIXME: We should call a specialized version of this function. 1313 // FIXME: We should call a specialized version of this function.
1312 current->updateLayerPositionsAfterLayout(); 1314 current->updateLayerPositionsAfterLayout();
1313 current = next; 1315 current = next;
1314 } 1316 }
1315 1317
1316 // Remove us from the parent. 1318 // Remove us from the parent.
1317 m_parent->removeChild(this); 1319 m_parent->removeChild(this);
1318 m_renderer->destroyLayer(); 1320 m_renderer->destroyLayer();
1319 } 1321 }
1320 1322
1321 void RenderLayer::insertOnlyThisLayer() 1323 void Layer::insertOnlyThisLayer()
1322 { 1324 {
1323 if (!m_parent && renderer()->parent()) { 1325 if (!m_parent && renderer()->parent()) {
1324 // We need to connect ourselves when our renderer() has a parent. 1326 // We need to connect ourselves when our renderer() has a parent.
1325 // Find our enclosingLayer and add ourselves. 1327 // Find our enclosingLayer and add ourselves.
1326 RenderLayer* parentLayer = renderer()->parent()->enclosingLayer(); 1328 Layer* parentLayer = renderer()->parent()->enclosingLayer();
1327 ASSERT(parentLayer); 1329 ASSERT(parentLayer);
1328 RenderLayer* beforeChild = !parentLayer->reflectionInfo() || parentLayer ->reflectionInfo()->reflectionLayer() != this ? renderer()->parent()->findNextLa yer(parentLayer, renderer()) : 0; 1330 Layer* beforeChild = !parentLayer->reflectionInfo() || parentLayer->refl ectionInfo()->reflectionLayer() != this ? renderer()->parent()->findNextLayer(pa rentLayer, renderer()) : 0;
1329 parentLayer->addChild(this, beforeChild); 1331 parentLayer->addChild(this, beforeChild);
1330 } 1332 }
1331 1333
1332 // Remove all descendant layers from the hierarchy and add them to the new p osition. 1334 // Remove all descendant layers from the hierarchy and add them to the new p osition.
1333 for (RenderObject* curr = renderer()->slowFirstChild(); curr; curr = curr->n extSibling()) 1335 for (RenderObject* curr = renderer()->slowFirstChild(); curr; curr = curr->n extSibling())
1334 curr->moveLayers(m_parent, this); 1336 curr->moveLayers(m_parent, this);
1335 1337
1336 // Clear out all the clip rects. 1338 // Clear out all the clip rects.
1337 m_clipper.clearClipRectsIncludingDescendants(); 1339 m_clipper.clearClipRectsIncludingDescendants();
1338 } 1340 }
1339 1341
1340 // Returns the layer reached on the walk up towards the ancestor. 1342 // Returns the layer reached on the walk up towards the ancestor.
1341 static inline const RenderLayer* accumulateOffsetTowardsAncestor(const RenderLay er* layer, const RenderLayer* ancestorLayer, LayoutPoint& location) 1343 static inline const Layer* accumulateOffsetTowardsAncestor(const Layer* layer, c onst Layer* ancestorLayer, LayoutPoint& location)
1342 { 1344 {
1343 ASSERT(ancestorLayer != layer); 1345 ASSERT(ancestorLayer != layer);
1344 1346
1345 const RenderLayerModelObject* renderer = layer->renderer(); 1347 const LayoutLayerModelObject* renderer = layer->renderer();
1346 EPosition position = renderer->style()->position(); 1348 EPosition position = renderer->style()->position();
1347 1349
1348 // FIXME: Positioning of out-of-flow(fixed, absolute) elements collected in a RenderFlowThread 1350 // FIXME: Positioning of out-of-flow(fixed, absolute) elements collected in a RenderFlowThread
1349 // may need to be revisited in a future patch. 1351 // may need to be revisited in a future patch.
1350 // If the fixed renderer is inside a RenderFlowThread, we should not compute location using localToAbsolute, 1352 // If the fixed renderer is inside a RenderFlowThread, we should not compute location using localToAbsolute,
1351 // since localToAbsolute maps the coordinates from flow thread to regions co ordinates and regions can be 1353 // since localToAbsolute maps the coordinates from flow thread to regions co ordinates and regions can be
1352 // positioned in a completely different place in the viewport (RenderView). 1354 // positioned in a completely different place in the viewport (RenderView).
1353 if (position == FixedPosition && (!ancestorLayer || ancestorLayer == rendere r->view()->layer())) { 1355 if (position == FixedPosition && (!ancestorLayer || ancestorLayer == rendere r->view()->layer())) {
1354 // If the fixed layer's container is the root, just add in the offset of the view. We can obtain this by calling 1356 // If the fixed layer's container is the root, just add in the offset of the view. We can obtain this by calling
1355 // localToAbsolute() on the RenderView. 1357 // localToAbsolute() on the RenderView.
1356 FloatPoint absPos = renderer->localToAbsolute(FloatPoint(), IsFixed); 1358 FloatPoint absPos = renderer->localToAbsolute(FloatPoint(), IsFixed);
1357 location += LayoutSize(absPos.x(), absPos.y()); 1359 location += LayoutSize(absPos.x(), absPos.y());
1358 return ancestorLayer; 1360 return ancestorLayer;
1359 } 1361 }
1360 1362
1361 // For the fixed positioned elements inside a render flow thread, we should also skip the code path below 1363 // For the fixed positioned elements inside a render flow thread, we should also skip the code path below
1362 // Otherwise, for the case of ancestorLayer == rootLayer and fixed positione d element child of a transformed 1364 // Otherwise, for the case of ancestorLayer == rootLayer and fixed positione d element child of a transformed
1363 // element in render flow thread, we will hit the fixed positioned container before hitting the ancestor layer. 1365 // element in render flow thread, we will hit the fixed positioned container before hitting the ancestor layer.
1364 if (position == FixedPosition) { 1366 if (position == FixedPosition) {
1365 // For a fixed layers, we need to walk up to the root to see if there's a fixed position container 1367 // For a fixed layers, we need to walk up to the root to see if there's a fixed position container
1366 // (e.g. a transformed layer). It's an error to call convertToLayerCoord s() across a layer with a transform, 1368 // (e.g. a transformed layer). It's an error to call convertToLayerCoord s() across a layer with a transform,
1367 // so we should always find the ancestor at or before we find the fixed position container. 1369 // so we should always find the ancestor at or before we find the fixed position container.
1368 RenderLayer* fixedPositionContainerLayer = 0; 1370 Layer* fixedPositionContainerLayer = 0;
1369 bool foundAncestor = false; 1371 bool foundAncestor = false;
1370 for (RenderLayer* currLayer = layer->parent(); currLayer; currLayer = cu rrLayer->parent()) { 1372 for (Layer* currLayer = layer->parent(); currLayer; currLayer = currLaye r->parent()) {
1371 if (currLayer == ancestorLayer) 1373 if (currLayer == ancestorLayer)
1372 foundAncestor = true; 1374 foundAncestor = true;
1373 1375
1374 if (isFixedPositionedContainer(currLayer)) { 1376 if (isFixedPositionedContainer(currLayer)) {
1375 fixedPositionContainerLayer = currLayer; 1377 fixedPositionContainerLayer = currLayer;
1376 ASSERT_UNUSED(foundAncestor, foundAncestor); 1378 ASSERT_UNUSED(foundAncestor, foundAncestor);
1377 break; 1379 break;
1378 } 1380 }
1379 } 1381 }
1380 1382
(...skipping 10 matching lines...) Expand all
1391 } else { 1393 } else {
1392 // RenderView has been handled in the first top-level 'if' block abo ve. 1394 // RenderView has been handled in the first top-level 'if' block abo ve.
1393 ASSERT(ancestorLayer != renderer->view()->layer()); 1395 ASSERT(ancestorLayer != renderer->view()->layer());
1394 ASSERT(ancestorLayer->hasTransformRelatedProperty()); 1396 ASSERT(ancestorLayer->hasTransformRelatedProperty());
1395 1397
1396 location += layer->location(); 1398 location += layer->location();
1397 1399
1398 // The spec (http://dev.w3.org/csswg/css-transforms/#transform-rende ring) doesn't say if a 1400 // The spec (http://dev.w3.org/csswg/css-transforms/#transform-rende ring) doesn't say if a
1399 // fixed-position element under a scrollable transformed element sho uld scroll. However, 1401 // fixed-position element under a scrollable transformed element sho uld scroll. However,
1400 // other parts of blink scroll the fixed-position element, and the f ollowing keeps the consistency. 1402 // other parts of blink scroll the fixed-position element, and the f ollowing keeps the consistency.
1401 if (RenderLayerScrollableArea* scrollableArea = ancestorLayer->scrol lableArea()) 1403 if (LayerScrollableArea* scrollableArea = ancestorLayer->scrollableA rea())
1402 location -= LayoutSize(scrollableArea->scrollOffset()); 1404 location -= LayoutSize(scrollableArea->scrollOffset());
1403 } 1405 }
1404 return ancestorLayer; 1406 return ancestorLayer;
1405 } 1407 }
1406 1408
1407 RenderLayer* parentLayer; 1409 Layer* parentLayer;
1408 if (position == AbsolutePosition) { 1410 if (position == AbsolutePosition) {
1409 // Do what enclosingPositionedAncestor() does, but check for ancestorLay er along the way. 1411 // Do what enclosingPositionedAncestor() does, but check for ancestorLay er along the way.
1410 parentLayer = layer->parent(); 1412 parentLayer = layer->parent();
1411 bool foundAncestorFirst = false; 1413 bool foundAncestorFirst = false;
1412 while (parentLayer) { 1414 while (parentLayer) {
1413 // RenderFlowThread is a positioned container, child of RenderView, positioned at (0,0). 1415 // RenderFlowThread is a positioned container, child of RenderView, positioned at (0,0).
1414 // This implies that, for out-of-flow positioned elements inside a R enderFlowThread, 1416 // This implies that, for out-of-flow positioned elements inside a R enderFlowThread,
1415 // we are bailing out before reaching root layer. 1417 // we are bailing out before reaching root layer.
1416 if (parentLayer->isPositionedContainer()) 1418 if (parentLayer->isPositionedContainer())
1417 break; 1419 break;
1418 1420
1419 if (parentLayer == ancestorLayer) { 1421 if (parentLayer == ancestorLayer) {
1420 foundAncestorFirst = true; 1422 foundAncestorFirst = true;
1421 break; 1423 break;
1422 } 1424 }
1423 1425
1424 parentLayer = parentLayer->parent(); 1426 parentLayer = parentLayer->parent();
1425 } 1427 }
1426 1428
1427 // We should not reach RenderView layer past the RenderFlowThread layer for any 1429 // We should not reach RenderView layer past the RenderFlowThread layer for any
1428 // children of the RenderFlowThread. 1430 // children of the RenderFlowThread.
1429 ASSERT(!renderer->flowThreadContainingBlock() || parentLayer != renderer ->view()->layer()); 1431 ASSERT(!renderer->flowThreadContainingBlock() || parentLayer != renderer ->view()->layer());
1430 1432
1431 if (foundAncestorFirst) { 1433 if (foundAncestorFirst) {
1432 // Found ancestorLayer before the abs. positioned container, so comp ute offset of both relative 1434 // Found ancestorLayer before the abs. positioned container, so comp ute offset of both relative
1433 // to enclosingPositionedAncestor and subtract. 1435 // to enclosingPositionedAncestor and subtract.
1434 RenderLayer* positionedAncestor = parentLayer->enclosingPositionedAn cestor(); 1436 Layer* positionedAncestor = parentLayer->enclosingPositionedAncestor ();
1435 1437
1436 LayoutPoint thisCoords; 1438 LayoutPoint thisCoords;
1437 layer->convertToLayerCoords(positionedAncestor, thisCoords); 1439 layer->convertToLayerCoords(positionedAncestor, thisCoords);
1438 1440
1439 LayoutPoint ancestorCoords; 1441 LayoutPoint ancestorCoords;
1440 ancestorLayer->convertToLayerCoords(positionedAncestor, ancestorCoor ds); 1442 ancestorLayer->convertToLayerCoords(positionedAncestor, ancestorCoor ds);
1441 1443
1442 location += (thisCoords - ancestorCoords); 1444 location += (thisCoords - ancestorCoords);
1443 return ancestorLayer; 1445 return ancestorLayer;
1444 } 1446 }
1445 } else if (renderer->isColumnSpanAll()) { 1447 } else if (renderer->isColumnSpanAll()) {
1446 RenderBlock* multicolContainer = renderer->containingBlock(); 1448 RenderBlock* multicolContainer = renderer->containingBlock();
1447 ASSERT(toRenderBlockFlow(multicolContainer)->multiColumnFlowThread()); 1449 ASSERT(toRenderBlockFlow(multicolContainer)->multiColumnFlowThread());
1448 parentLayer = multicolContainer->layer(); 1450 parentLayer = multicolContainer->layer();
1449 ASSERT(parentLayer); 1451 ASSERT(parentLayer);
1450 } else { 1452 } else {
1451 parentLayer = layer->parent(); 1453 parentLayer = layer->parent();
1452 } 1454 }
1453 1455
1454 if (!parentLayer) 1456 if (!parentLayer)
1455 return 0; 1457 return 0;
1456 1458
1457 location += layer->location(); 1459 location += layer->location();
1458 return parentLayer; 1460 return parentLayer;
1459 } 1461 }
1460 1462
1461 void RenderLayer::convertToLayerCoords(const RenderLayer* ancestorLayer, LayoutP oint& location) const 1463 void Layer::convertToLayerCoords(const Layer* ancestorLayer, LayoutPoint& locati on) const
1462 { 1464 {
1463 if (ancestorLayer == this) 1465 if (ancestorLayer == this)
1464 return; 1466 return;
1465 1467
1466 const RenderLayer* currLayer = this; 1468 const Layer* currLayer = this;
1467 while (currLayer && currLayer != ancestorLayer) 1469 while (currLayer && currLayer != ancestorLayer)
1468 currLayer = accumulateOffsetTowardsAncestor(currLayer, ancestorLayer, lo cation); 1470 currLayer = accumulateOffsetTowardsAncestor(currLayer, ancestorLayer, lo cation);
1469 } 1471 }
1470 1472
1471 void RenderLayer::convertToLayerCoords(const RenderLayer* ancestorLayer, LayoutR ect& rect) const 1473 void Layer::convertToLayerCoords(const Layer* ancestorLayer, LayoutRect& rect) c onst
1472 { 1474 {
1473 LayoutPoint delta; 1475 LayoutPoint delta;
1474 convertToLayerCoords(ancestorLayer, delta); 1476 convertToLayerCoords(ancestorLayer, delta);
1475 rect.moveBy(delta); 1477 rect.moveBy(delta);
1476 } 1478 }
1477 1479
1478 LayoutPoint RenderLayer::visualOffsetFromAncestor(const RenderLayer* ancestorLay er) const 1480 LayoutPoint Layer::visualOffsetFromAncestor(const Layer* ancestorLayer) const
1479 { 1481 {
1480 LayoutPoint offset; 1482 LayoutPoint offset;
1481 if (ancestorLayer == this) 1483 if (ancestorLayer == this)
1482 return offset; 1484 return offset;
1483 RenderLayer* paginationLayer = enclosingPaginationLayer(); 1485 Layer* paginationLayer = enclosingPaginationLayer();
1484 if (paginationLayer == this) 1486 if (paginationLayer == this)
1485 paginationLayer = parent()->enclosingPaginationLayer(); 1487 paginationLayer = parent()->enclosingPaginationLayer();
1486 if (!paginationLayer) { 1488 if (!paginationLayer) {
1487 convertToLayerCoords(ancestorLayer, offset); 1489 convertToLayerCoords(ancestorLayer, offset);
1488 return offset; 1490 return offset;
1489 } 1491 }
1490 1492
1491 RenderFlowThread* flowThread = toRenderFlowThread(paginationLayer->renderer( )); 1493 RenderFlowThread* flowThread = toRenderFlowThread(paginationLayer->renderer( ));
1492 convertToLayerCoords(paginationLayer, offset); 1494 convertToLayerCoords(paginationLayer, offset);
1493 offset = flowThread->flowThreadPointToVisualPoint(offset); 1495 offset = flowThread->flowThreadPointToVisualPoint(offset);
1494 if (ancestorLayer == paginationLayer) 1496 if (ancestorLayer == paginationLayer)
1495 return offset; 1497 return offset;
1496 1498
1497 if (ancestorLayer->enclosingPaginationLayer() != paginationLayer) { 1499 if (ancestorLayer->enclosingPaginationLayer() != paginationLayer) {
1498 offset.moveBy(paginationLayer->visualOffsetFromAncestor(ancestorLayer)); 1500 offset.moveBy(paginationLayer->visualOffsetFromAncestor(ancestorLayer));
1499 } else { 1501 } else {
1500 // The ancestor layer is also inside the pagination layer, so we need to subtract the visual 1502 // The ancestor layer is also inside the pagination layer, so we need to subtract the visual
1501 // distance from the ancestor layer to the pagination layer. 1503 // distance from the ancestor layer to the pagination layer.
1502 offset.moveBy(-ancestorLayer->visualOffsetFromAncestor(paginationLayer)) ; 1504 offset.moveBy(-ancestorLayer->visualOffsetFromAncestor(paginationLayer)) ;
1503 } 1505 }
1504 return offset; 1506 return offset;
1505 } 1507 }
1506 1508
1507 void RenderLayer::didUpdateNeedsCompositedScrolling() 1509 void Layer::didUpdateNeedsCompositedScrolling()
1508 { 1510 {
1509 updateSelfPaintingLayer(); 1511 updateSelfPaintingLayer();
1510 } 1512 }
1511 1513
1512 void RenderLayer::updateReflectionInfo(const RenderStyle* oldStyle) 1514 void Layer::updateReflectionInfo(const RenderStyle* oldStyle)
1513 { 1515 {
1514 ASSERT(!oldStyle || !renderer()->style()->reflectionDataEquivalent(oldStyle) ); 1516 ASSERT(!oldStyle || !renderer()->style()->reflectionDataEquivalent(oldStyle) );
1515 if (renderer()->hasReflection()) { 1517 if (renderer()->hasReflection()) {
1516 if (!m_reflectionInfo) 1518 if (!m_reflectionInfo)
1517 m_reflectionInfo = adoptPtr(new RenderLayerReflectionInfo(*renderBox ())); 1519 m_reflectionInfo = adoptPtr(new LayerReflectionInfo(*renderBox()));
1518 m_reflectionInfo->updateAfterStyleChange(oldStyle); 1520 m_reflectionInfo->updateAfterStyleChange(oldStyle);
1519 } else if (m_reflectionInfo) { 1521 } else if (m_reflectionInfo) {
1520 m_reflectionInfo->destroy(); 1522 m_reflectionInfo->destroy();
1521 m_reflectionInfo = nullptr; 1523 m_reflectionInfo = nullptr;
1522 } 1524 }
1523 } 1525 }
1524 1526
1525 void RenderLayer::updateStackingNode() 1527 void Layer::updateStackingNode()
1526 { 1528 {
1527 if (requiresStackingNode()) 1529 if (requiresStackingNode())
1528 m_stackingNode = adoptPtr(new RenderLayerStackingNode(this)); 1530 m_stackingNode = adoptPtr(new LayerStackingNode(this));
1529 else 1531 else
1530 m_stackingNode = nullptr; 1532 m_stackingNode = nullptr;
1531 } 1533 }
1532 1534
1533 void RenderLayer::updateScrollableArea() 1535 void Layer::updateScrollableArea()
1534 { 1536 {
1535 if (requiresScrollableArea()) 1537 if (requiresScrollableArea())
1536 m_scrollableArea = adoptPtr(new RenderLayerScrollableArea(*this)); 1538 m_scrollableArea = adoptPtr(new LayerScrollableArea(*this));
1537 else 1539 else
1538 m_scrollableArea = nullptr; 1540 m_scrollableArea = nullptr;
1539 } 1541 }
1540 1542
1541 bool RenderLayer::hasOverflowControls() const 1543 bool Layer::hasOverflowControls() const
1542 { 1544 {
1543 return m_scrollableArea && (m_scrollableArea->hasScrollbar() || m_scrollable Area->scrollCorner() || renderer()->style()->resize() != RESIZE_NONE); 1545 return m_scrollableArea && (m_scrollableArea->hasScrollbar() || m_scrollable Area->scrollCorner() || renderer()->style()->resize() != RESIZE_NONE);
1544 } 1546 }
1545 1547
1546 void RenderLayer::collectFragments(LayerFragments& fragments, const RenderLayer* rootLayer, const LayoutRect& dirtyRect, 1548 void Layer::collectFragments(LayerFragments& fragments, const Layer* rootLayer, const LayoutRect& dirtyRect,
1547 ClipRectsCacheSlot clipRectsCacheSlot, OverlayScrollbarSizeRelevancy inOverl ayScrollbarSizeRelevancy, ShouldRespectOverflowClip respectOverflowClip, const L ayoutPoint* offsetFromRoot, 1549 ClipRectsCacheSlot clipRectsCacheSlot, OverlayScrollbarSizeRelevancy inOverl ayScrollbarSizeRelevancy, ShouldRespectOverflowClip respectOverflowClip, const L ayoutPoint* offsetFromRoot,
1548 const LayoutSize& subPixelAccumulation, const LayoutRect* layerBoundingBox) 1550 const LayoutSize& subPixelAccumulation, const LayoutRect* layerBoundingBox)
1549 { 1551 {
1550 if (!enclosingPaginationLayer() || hasTransformRelatedProperty()) { 1552 if (!enclosingPaginationLayer() || hasTransformRelatedProperty()) {
1551 // For unpaginated layers, there is only one fragment. 1553 // For unpaginated layers, there is only one fragment.
1552 LayerFragment fragment; 1554 LayerFragment fragment;
1553 ClipRectsContext clipRectsContext(rootLayer, clipRectsCacheSlot, inOverl ayScrollbarSizeRelevancy, subPixelAccumulation); 1555 ClipRectsContext clipRectsContext(rootLayer, clipRectsCacheSlot, inOverl ayScrollbarSizeRelevancy, subPixelAccumulation);
1554 if (respectOverflowClip == IgnoreOverflowClip) 1556 if (respectOverflowClip == IgnoreOverflowClip)
1555 clipRectsContext.setIgnoreOverflowClip(); 1557 clipRectsContext.setIgnoreOverflowClip();
1556 clipper().calculateRects(clipRectsContext, dirtyRect, fragment.layerBoun ds, fragment.backgroundRect, fragment.foregroundRect, fragment.outlineRect, offs etFromRoot); 1558 clipper().calculateRects(clipRectsContext, dirtyRect, fragment.layerBoun ds, fragment.backgroundRect, fragment.foregroundRect, fragment.outlineRect, offs etFromRoot);
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
1594 1596
1595 // Tell the flow thread to collect the fragments. We pass enough information to create a minimal number of fragments based off the pages/columns 1597 // Tell the flow thread to collect the fragments. We pass enough information to create a minimal number of fragments based off the pages/columns
1596 // that intersect the actual dirtyRect as well as the pages/columns that int ersect our layer's bounding box. 1598 // that intersect the actual dirtyRect as well as the pages/columns that int ersect our layer's bounding box.
1597 enclosingFlowThread->collectLayerFragments(fragments, layerBoundingBoxInFlow Thread, dirtyRectInFlowThread); 1599 enclosingFlowThread->collectLayerFragments(fragments, layerBoundingBoxInFlow Thread, dirtyRectInFlowThread);
1598 1600
1599 if (fragments.isEmpty()) 1601 if (fragments.isEmpty())
1600 return; 1602 return;
1601 1603
1602 // Get the parent clip rects of the pagination layer, since we need to inter sect with that when painting column contents. 1604 // Get the parent clip rects of the pagination layer, since we need to inter sect with that when painting column contents.
1603 ClipRect ancestorClipRect = dirtyRect; 1605 ClipRect ancestorClipRect = dirtyRect;
1604 if (const RenderLayer* paginationParentLayer = enclosingPaginationLayer()->p arent()) { 1606 if (const Layer* paginationParentLayer = enclosingPaginationLayer()->parent( )) {
1605 const RenderLayer* ancestorLayer = rootLayerIsInsidePaginationLayer ? pa ginationParentLayer : rootLayer; 1607 const Layer* ancestorLayer = rootLayerIsInsidePaginationLayer ? paginati onParentLayer : rootLayer;
1606 ClipRectsContext clipRectsContext(ancestorLayer, clipRectsCacheSlot, inO verlayScrollbarSizeRelevancy); 1608 ClipRectsContext clipRectsContext(ancestorLayer, clipRectsCacheSlot, inO verlayScrollbarSizeRelevancy);
1607 if (respectOverflowClip == IgnoreOverflowClip) 1609 if (respectOverflowClip == IgnoreOverflowClip)
1608 clipRectsContext.setIgnoreOverflowClip(); 1610 clipRectsContext.setIgnoreOverflowClip();
1609 ancestorClipRect = enclosingPaginationLayer()->clipper().backgroundClipR ect(clipRectsContext); 1611 ancestorClipRect = enclosingPaginationLayer()->clipper().backgroundClipR ect(clipRectsContext);
1610 if (rootLayerIsInsidePaginationLayer) 1612 if (rootLayerIsInsidePaginationLayer)
1611 ancestorClipRect.moveBy(-rootLayer->visualOffsetFromAncestor(ancesto rLayer)); 1613 ancestorClipRect.moveBy(-rootLayer->visualOffsetFromAncestor(ancesto rLayer));
1612 ancestorClipRect.intersect(dirtyRect); 1614 ancestorClipRect.intersect(dirtyRect);
1613 } 1615 }
1614 1616
1615 for (size_t i = 0; i < fragments.size(); ++i) { 1617 for (size_t i = 0; i < fragments.size(); ++i) {
(...skipping 17 matching lines...) Expand all
1633 1635
1634 static inline LayoutRect frameVisibleRect(RenderObject* renderer) 1636 static inline LayoutRect frameVisibleRect(RenderObject* renderer)
1635 { 1637 {
1636 FrameView* frameView = renderer->document().view(); 1638 FrameView* frameView = renderer->document().view();
1637 if (!frameView) 1639 if (!frameView)
1638 return LayoutRect(); 1640 return LayoutRect();
1639 1641
1640 return frameView->visibleContentRect(); 1642 return frameView->visibleContentRect();
1641 } 1643 }
1642 1644
1643 bool RenderLayer::hitTest(const HitTestRequest& request, HitTestResult& result) 1645 bool Layer::hitTest(const HitTestRequest& request, HitTestResult& result)
1644 { 1646 {
1645 return hitTest(request, result.hitTestLocation(), result); 1647 return hitTest(request, result.hitTestLocation(), result);
1646 } 1648 }
1647 1649
1648 bool RenderLayer::hitTest(const HitTestRequest& request, const HitTestLocation& hitTestLocation, HitTestResult& result) 1650 bool Layer::hitTest(const HitTestRequest& request, const HitTestLocation& hitTes tLocation, HitTestResult& result)
1649 { 1651 {
1650 ASSERT(isSelfPaintingLayer() || hasSelfPaintingLayerDescendant()); 1652 ASSERT(isSelfPaintingLayer() || hasSelfPaintingLayerDescendant());
1651 1653
1652 // RenderView should make sure to update layout before entering hit testing 1654 // RenderView should make sure to update layout before entering hit testing
1653 ASSERT(!renderer()->frame()->view()->layoutPending()); 1655 ASSERT(!renderer()->frame()->view()->layoutPending());
1654 ASSERT(!renderer()->document().renderView()->needsLayout()); 1656 ASSERT(!renderer()->document().renderView()->needsLayout());
1655 1657
1656 // Start with frameVisibleRect to ensure we include the scrollbars. 1658 // Start with frameVisibleRect to ensure we include the scrollbars.
1657 LayoutRect hitTestArea = frameVisibleRect(renderer()); 1659 LayoutRect hitTestArea = frameVisibleRect(renderer());
1658 if (request.ignoreClipping()) 1660 if (request.ignoreClipping())
1659 hitTestArea.unite(renderer()->view()->documentRect()); 1661 hitTestArea.unite(renderer()->view()->documentRect());
1660 1662
1661 RenderLayer* insideLayer = hitTestLayer(this, 0, request, result, hitTestAre a, hitTestLocation, false); 1663 Layer* insideLayer = hitTestLayer(this, 0, request, result, hitTestArea, hit TestLocation, false);
1662 if (!insideLayer) { 1664 if (!insideLayer) {
1663 // We didn't hit any layer. If we are the root layer and the mouse is -- or just was -- down, 1665 // We didn't hit any layer. If we are the root layer and the mouse is -- or just was -- down,
1664 // return ourselves. We do this so mouse events continue getting deliver ed after a drag has 1666 // return ourselves. We do this so mouse events continue getting deliver ed after a drag has
1665 // exited the WebView, and so hit testing over a scrollbar hits the cont ent document. 1667 // exited the WebView, and so hit testing over a scrollbar hits the cont ent document.
1666 // In addtion, it is possible for the mouse to stay in the document but there is no element. 1668 // In addtion, it is possible for the mouse to stay in the document but there is no element.
1667 // At that time, the events of the mouse should be fired. 1669 // At that time, the events of the mouse should be fired.
1668 LayoutPoint hitPoint = hitTestLocation.point(); 1670 LayoutPoint hitPoint = hitTestLocation.point();
1669 if (!request.isChildFrameHitTest() && ((request.active() || request.rele ase()) || (request.move() && hitTestArea.contains(hitPoint.x(), hitPoint.y()))) && isRootLayer()) { 1671 if (!request.isChildFrameHitTest() && ((request.active() || request.rele ase()) || (request.move() && hitTestArea.contains(hitPoint.x(), hitPoint.y()))) && isRootLayer()) {
1670 renderer()->updateHitTestResult(result, toRenderView(renderer())->fl ipForWritingMode(hitTestLocation.point())); 1672 renderer()->updateHitTestResult(result, toRenderView(renderer())->fl ipForWritingMode(hitTestLocation.point()));
1671 insideLayer = this; 1673 insideLayer = this;
1672 } 1674 }
1673 } 1675 }
1674 1676
1675 // Now determine if the result is inside an anchor - if the urlElement isn't already set. 1677 // Now determine if the result is inside an anchor - if the urlElement isn't already set.
1676 Node* node = result.innerNode(); 1678 Node* node = result.innerNode();
1677 if (node && !result.URLElement()) 1679 if (node && !result.URLElement())
1678 result.setURLElement(node->enclosingLinkEventParentOrSelf()); 1680 result.setURLElement(node->enclosingLinkEventParentOrSelf());
1679 1681
1680 // Now return whether we were inside this layer (this will always be true fo r the root 1682 // Now return whether we were inside this layer (this will always be true fo r the root
1681 // layer). 1683 // layer).
1682 return insideLayer; 1684 return insideLayer;
1683 } 1685 }
1684 1686
1685 Node* RenderLayer::enclosingElement() const 1687 Node* Layer::enclosingElement() const
1686 { 1688 {
1687 for (RenderObject* r = renderer(); r; r = r->parent()) { 1689 for (RenderObject* r = renderer(); r; r = r->parent()) {
1688 if (Node* e = r->node()) 1690 if (Node* e = r->node())
1689 return e; 1691 return e;
1690 } 1692 }
1691 ASSERT_NOT_REACHED(); 1693 ASSERT_NOT_REACHED();
1692 return 0; 1694 return 0;
1693 } 1695 }
1694 1696
1695 bool RenderLayer::isInTopLayer() const 1697 bool Layer::isInTopLayer() const
1696 { 1698 {
1697 Node* node = renderer()->node(); 1699 Node* node = renderer()->node();
1698 return node && node->isElementNode() && toElement(node)->isInTopLayer(); 1700 return node && node->isElementNode() && toElement(node)->isInTopLayer();
1699 } 1701 }
1700 1702
1701 // Compute the z-offset of the point in the transformState. 1703 // Compute the z-offset of the point in the transformState.
1702 // This is effectively projecting a ray normal to the plane of ancestor, finding where that 1704 // This is effectively projecting a ray normal to the plane of ancestor, finding where that
1703 // ray intersects target, and computing the z delta between those two points. 1705 // ray intersects target, and computing the z delta between those two points.
1704 static double computeZOffset(const HitTestingTransformState& transformState) 1706 static double computeZOffset(const HitTestingTransformState& transformState)
1705 { 1707 {
1706 // We got an affine transform, so no z-offset 1708 // We got an affine transform, so no z-offset
1707 if (transformState.m_accumulatedTransform.isAffine()) 1709 if (transformState.m_accumulatedTransform.isAffine())
1708 return 0; 1710 return 0;
1709 1711
1710 // Flatten the point into the target plane 1712 // Flatten the point into the target plane
1711 FloatPoint targetPoint = transformState.mappedPoint(); 1713 FloatPoint targetPoint = transformState.mappedPoint();
1712 1714
1713 // Now map the point back through the transform, which computes Z. 1715 // Now map the point back through the transform, which computes Z.
1714 FloatPoint3D backmappedPoint = transformState.m_accumulatedTransform.mapPoin t(FloatPoint3D(targetPoint)); 1716 FloatPoint3D backmappedPoint = transformState.m_accumulatedTransform.mapPoin t(FloatPoint3D(targetPoint));
1715 return backmappedPoint.z(); 1717 return backmappedPoint.z();
1716 } 1718 }
1717 1719
1718 PassRefPtr<HitTestingTransformState> RenderLayer::createLocalTransformState(Rend erLayer* rootLayer, RenderLayer* containerLayer, 1720 PassRefPtr<HitTestingTransformState> Layer::createLocalTransformState(Layer* roo tLayer, Layer* containerLayer,
1719 const LayoutRect& hitTestRect, const Hit TestLocation& hitTestLocation, 1721 const LayoutRect& hitTestRect, const HitTestLocation& hitTestLocation,
1720 const HitTestingTransformState* containe rTransformState, 1722 const HitTestingTransformState* containerTransformState,
1721 const LayoutPoint& translationOffset) co nst 1723 const LayoutPoint& translationOffset) const
1722 { 1724 {
1723 RefPtr<HitTestingTransformState> transformState; 1725 RefPtr<HitTestingTransformState> transformState;
1724 LayoutPoint offset; 1726 LayoutPoint offset;
1725 if (containerTransformState) { 1727 if (containerTransformState) {
1726 // If we're already computing transform state, then it's relative to the container (which we know is non-null). 1728 // If we're already computing transform state, then it's relative to the container (which we know is non-null).
1727 transformState = HitTestingTransformState::create(*containerTransformSta te); 1729 transformState = HitTestingTransformState::create(*containerTransformSta te);
1728 convertToLayerCoords(containerLayer, offset); 1730 convertToLayerCoords(containerLayer, offset);
1729 } else { 1731 } else {
1730 // If this is the first time we need to make transform state, then base it off of hitTestLocation, 1732 // If this is the first time we need to make transform state, then base it off of hitTestLocation,
1731 // which is relative to rootLayer. 1733 // which is relative to rootLayer.
1732 transformState = HitTestingTransformState::create(hitTestLocation.transf ormedPoint(), hitTestLocation.transformedRect(), FloatQuad(hitTestRect)); 1734 transformState = HitTestingTransformState::create(hitTestLocation.transf ormedPoint(), hitTestLocation.transformedRect(), FloatQuad(hitTestRect));
1733 convertToLayerCoords(rootLayer, offset); 1735 convertToLayerCoords(rootLayer, offset);
1734 } 1736 }
1735 offset.moveBy(translationOffset); 1737 offset.moveBy(translationOffset);
1736 1738
1737 RenderObject* containerRenderer = containerLayer ? containerLayer->renderer( ) : 0; 1739 RenderObject* containerRenderer = containerLayer ? containerLayer->renderer( ) : 0;
1738 if (renderer()->shouldUseTransformFromContainer(containerRenderer)) { 1740 if (renderer()->shouldUseTransformFromContainer(containerRenderer)) {
1739 TransformationMatrix containerTransform; 1741 TransformationMatrix containerTransform;
1740 renderer()->getTransformFromContainer(containerRenderer, toLayoutSize(of fset), containerTransform); 1742 renderer()->getTransformFromContainer(containerRenderer, toLayoutSize(of fset), containerTransform);
1741 transformState->applyTransform(containerTransform, HitTestingTransformSt ate::AccumulateTransform); 1743 transformState->applyTransform(containerTransform, HitTestingTransformSt ate::AccumulateTransform);
1742 } else { 1744 } else {
1743 transformState->translate(offset.x(), offset.y(), HitTestingTransformSta te::AccumulateTransform); 1745 transformState->translate(offset.x(), offset.y(), HitTestingTransformSta te::AccumulateTransform);
1744 } 1746 }
1745 1747
1746 return transformState; 1748 return transformState;
1747 } 1749 }
1748 1750
1749 1751
1750 static bool isHitCandidate(const RenderLayer* hitLayer, bool canDepthSort, doubl e* zOffset, const HitTestingTransformState* transformState) 1752 static bool isHitCandidate(const Layer* hitLayer, bool canDepthSort, double* zOf fset, const HitTestingTransformState* transformState)
1751 { 1753 {
1752 if (!hitLayer) 1754 if (!hitLayer)
1753 return false; 1755 return false;
1754 1756
1755 // The hit layer is depth-sorting with other layers, so just say that it was hit. 1757 // The hit layer is depth-sorting with other layers, so just say that it was hit.
1756 if (canDepthSort) 1758 if (canDepthSort)
1757 return true; 1759 return true;
1758 1760
1759 // We need to look at z-depth to decide if this layer was hit. 1761 // We need to look at z-depth to decide if this layer was hit.
1760 if (zOffset) { 1762 if (zOffset) {
(...skipping 11 matching lines...) Expand all
1772 } 1774 }
1773 1775
1774 // hitTestLocation and hitTestRect are relative to rootLayer. 1776 // hitTestLocation and hitTestRect are relative to rootLayer.
1775 // A 'flattening' layer is one preserves3D() == false. 1777 // A 'flattening' layer is one preserves3D() == false.
1776 // transformState.m_accumulatedTransform holds the transform from the containing flattening layer. 1778 // transformState.m_accumulatedTransform holds the transform from the containing flattening layer.
1777 // transformState.m_lastPlanarPoint is the hitTestLocation in the plane of the c ontaining flattening layer. 1779 // transformState.m_lastPlanarPoint is the hitTestLocation in the plane of the c ontaining flattening layer.
1778 // transformState.m_lastPlanarQuad is the hitTestRect as a quad in the plane of the containing flattening layer. 1780 // transformState.m_lastPlanarQuad is the hitTestRect as a quad in the plane of the containing flattening layer.
1779 // 1781 //
1780 // If zOffset is non-null (which indicates that the caller wants z offset inform ation), 1782 // If zOffset is non-null (which indicates that the caller wants z offset inform ation),
1781 // *zOffset on return is the z offset of the hit point relative to the containi ng flattening layer. 1783 // *zOffset on return is the z offset of the hit point relative to the containi ng flattening layer.
1782 RenderLayer* RenderLayer::hitTestLayer(RenderLayer* rootLayer, RenderLayer* cont ainerLayer, const HitTestRequest& request, HitTestResult& result, 1784 Layer* Layer::hitTestLayer(Layer* rootLayer, Layer* containerLayer, const HitTes tRequest& request, HitTestResult& result,
1783 const LayoutRect& hitTestRect, const HitT estLocation& hitTestLocation, bool appliedTransform, 1785 const LayoutRect& hitTestRect, const HitTestLocation& hitTestLocation, bool appliedTransform,
1784 const HitTestingTransformState* transform State, double* zOffset) 1786 const HitTestingTransformState* transformState, double* zOffset)
1785 { 1787 {
1786 if (!isSelfPaintingLayer() && !hasSelfPaintingLayerDescendant()) 1788 if (!isSelfPaintingLayer() && !hasSelfPaintingLayerDescendant())
1787 return 0; 1789 return 0;
1788 1790
1789 // The natural thing would be to keep HitTestingTransformState on the stack, but it's big, so we heap-allocate. 1791 // The natural thing would be to keep HitTestingTransformState on the stack, but it's big, so we heap-allocate.
1790 1792
1791 // Apply a transform if we have one. 1793 // Apply a transform if we have one.
1792 if (transform() && !appliedTransform) { 1794 if (transform() && !appliedTransform) {
1793 if (enclosingPaginationLayer()) 1795 if (enclosingPaginationLayer())
1794 return hitTestTransformedLayerInFragments(rootLayer, containerLayer, request, result, hitTestRect, hitTestLocation, transformState, zOffset); 1796 return hitTestTransformedLayerInFragments(rootLayer, containerLayer, request, result, hitTestRect, hitTestLocation, transformState, zOffset);
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
1846 // Our layers can depth-test with our container, so share the z depth po inter with the container, if it passed one down. 1848 // Our layers can depth-test with our container, so share the z depth po inter with the container, if it passed one down.
1847 zOffsetForDescendantsPtr = zOffset ? zOffset : &localZOffset; 1849 zOffsetForDescendantsPtr = zOffset ? zOffset : &localZOffset;
1848 zOffsetForContentsPtr = zOffset ? zOffset : &localZOffset; 1850 zOffsetForContentsPtr = zOffset ? zOffset : &localZOffset;
1849 } else if (zOffset) { 1851 } else if (zOffset) {
1850 zOffsetForDescendantsPtr = 0; 1852 zOffsetForDescendantsPtr = 0;
1851 // Container needs us to give back a z offset for the hit layer. 1853 // Container needs us to give back a z offset for the hit layer.
1852 zOffsetForContentsPtr = zOffset; 1854 zOffsetForContentsPtr = zOffset;
1853 } 1855 }
1854 1856
1855 // This variable tracks which layer the mouse ends up being inside. 1857 // This variable tracks which layer the mouse ends up being inside.
1856 RenderLayer* candidateLayer = 0; 1858 Layer* candidateLayer = 0;
1857 1859
1858 // Begin by walking our list of positive layers from highest z-index down to the lowest z-index. 1860 // Begin by walking our list of positive layers from highest z-index down to the lowest z-index.
1859 RenderLayer* hitLayer = hitTestChildren(PositiveZOrderChildren, rootLayer, r equest, result, hitTestRect, hitTestLocation, 1861 Layer* hitLayer = hitTestChildren(PositiveZOrderChildren, rootLayer, request , result, hitTestRect, hitTestLocation,
1860 localTransformState.get(), zOffsetForDes cendantsPtr, zOffset, unflattenedTransformState.get(), depthSortDescendants); 1862 localTransformState.get(), zOffsetForDescendantsPtr, zOffset, unflattene dTransformState.get(), depthSortDescendants);
1861 if (hitLayer) { 1863 if (hitLayer) {
1862 if (!depthSortDescendants) 1864 if (!depthSortDescendants)
1863 return hitLayer; 1865 return hitLayer;
1864 candidateLayer = hitLayer; 1866 candidateLayer = hitLayer;
1865 } 1867 }
1866 1868
1867 // Now check our overflow objects. 1869 // Now check our overflow objects.
1868 hitLayer = hitTestChildren(NormalFlowChildren, rootLayer, request, result, h itTestRect, hitTestLocation, 1870 hitLayer = hitTestChildren(NormalFlowChildren, rootLayer, request, result, h itTestRect, hitTestLocation,
1869 localTransformState.get(), zOffsetForDescendantsPtr, zOffset, unflattenedTransformState.get(), depthSortDescendants); 1871 localTransformState.get(), zOffsetForDescendantsPtr, zOffset, unflattene dTransformState.get(), depthSortDescendants);
1870 if (hitLayer) { 1872 if (hitLayer) {
1871 if (!depthSortDescendants) 1873 if (!depthSortDescendants)
1872 return hitLayer; 1874 return hitLayer;
1873 candidateLayer = hitLayer; 1875 candidateLayer = hitLayer;
1874 } 1876 }
1875 1877
1876 // Collect the fragments. This will compute the clip rectangles for each lay er fragment. 1878 // Collect the fragments. This will compute the clip rectangles for each lay er fragment.
1877 LayerFragments layerFragments; 1879 LayerFragments layerFragments;
1878 collectFragments(layerFragments, rootLayer, hitTestRect, RootRelativeClipRec ts, IncludeOverlayScrollbarSize); 1880 collectFragments(layerFragments, rootLayer, hitTestRect, RootRelativeClipRec ts, IncludeOverlayScrollbarSize);
1879 1881
(...skipping 11 matching lines...) Expand all
1891 if (hitTestContentsForFragments(layerFragments, request, tempResult, hit TestLocation, HitTestDescendants, insideFragmentForegroundRect) 1893 if (hitTestContentsForFragments(layerFragments, request, tempResult, hit TestLocation, HitTestDescendants, insideFragmentForegroundRect)
1892 && isHitCandidate(this, false, zOffsetForContentsPtr, unflattenedTra nsformState.get())) { 1894 && isHitCandidate(this, false, zOffsetForContentsPtr, unflattenedTra nsformState.get())) {
1893 if (result.isRectBasedTest()) 1895 if (result.isRectBasedTest())
1894 result.append(tempResult); 1896 result.append(tempResult);
1895 else 1897 else
1896 result = tempResult; 1898 result = tempResult;
1897 if (!depthSortDescendants) 1899 if (!depthSortDescendants)
1898 return this; 1900 return this;
1899 // Foreground can depth-sort with descendant layers, so keep this as a candidate. 1901 // Foreground can depth-sort with descendant layers, so keep this as a candidate.
1900 candidateLayer = this; 1902 candidateLayer = this;
1901 } else if (insideFragmentForegroundRect && result.isRectBasedTest()) 1903 } else if (insideFragmentForegroundRect && result.isRectBasedTest()) {
1902 result.append(tempResult); 1904 result.append(tempResult);
1905 }
1903 } 1906 }
1904 1907
1905 // Now check our negative z-index children. 1908 // Now check our negative z-index children.
1906 hitLayer = hitTestChildren(NegativeZOrderChildren, rootLayer, request, resul t, hitTestRect, hitTestLocation, 1909 hitLayer = hitTestChildren(NegativeZOrderChildren, rootLayer, request, resul t, hitTestRect, hitTestLocation,
1907 localTransformState.get(), zOffsetForDescendantsPtr, zOffset, unflattene dTransformState.get(), depthSortDescendants); 1910 localTransformState.get(), zOffsetForDescendantsPtr, zOffset, unflattene dTransformState.get(), depthSortDescendants);
1908 if (hitLayer) { 1911 if (hitLayer) {
1909 if (!depthSortDescendants) 1912 if (!depthSortDescendants)
1910 return hitLayer; 1913 return hitLayer;
1911 candidateLayer = hitLayer; 1914 candidateLayer = hitLayer;
1912 } 1915 }
(...skipping 13 matching lines...) Expand all
1926 result = tempResult; 1929 result = tempResult;
1927 return this; 1930 return this;
1928 } 1931 }
1929 if (insideFragmentBackgroundRect && result.isRectBasedTest()) 1932 if (insideFragmentBackgroundRect && result.isRectBasedTest())
1930 result.append(tempResult); 1933 result.append(tempResult);
1931 } 1934 }
1932 1935
1933 return 0; 1936 return 0;
1934 } 1937 }
1935 1938
1936 bool RenderLayer::hitTestContentsForFragments(const LayerFragments& layerFragmen ts, const HitTestRequest& request, HitTestResult& result, 1939 bool Layer::hitTestContentsForFragments(const LayerFragments& layerFragments, co nst HitTestRequest& request, HitTestResult& result,
1937 const HitTestLocation& hitTestLocation, HitTestFilter hitTestFilter, bool& i nsideClipRect) const 1940 const HitTestLocation& hitTestLocation, HitTestFilter hitTestFilter, bool& i nsideClipRect) const
1938 { 1941 {
1939 if (layerFragments.isEmpty()) 1942 if (layerFragments.isEmpty())
1940 return false; 1943 return false;
1941 1944
1942 for (int i = layerFragments.size() - 1; i >= 0; --i) { 1945 for (int i = layerFragments.size() - 1; i >= 0; --i) {
1943 const LayerFragment& fragment = layerFragments.at(i); 1946 const LayerFragment& fragment = layerFragments.at(i);
1944 if ((hitTestFilter == HitTestSelf && !fragment.backgroundRect.intersects (hitTestLocation)) 1947 if ((hitTestFilter == HitTestSelf && !fragment.backgroundRect.intersects (hitTestLocation))
1945 || (hitTestFilter == HitTestDescendants && !fragment.foregroundRect. intersects(hitTestLocation))) 1948 || (hitTestFilter == HitTestDescendants && !fragment.foregroundRect. intersects(hitTestLocation)))
1946 continue; 1949 continue;
1947 insideClipRect = true; 1950 insideClipRect = true;
1948 if (hitTestContents(request, result, fragment.layerBounds, hitTestLocati on, hitTestFilter)) 1951 if (hitTestContents(request, result, fragment.layerBounds, hitTestLocati on, hitTestFilter))
1949 return true; 1952 return true;
1950 } 1953 }
1951 1954
1952 return false; 1955 return false;
1953 } 1956 }
1954 1957
1955 RenderLayer* RenderLayer::hitTestTransformedLayerInFragments(RenderLayer* rootLa yer, RenderLayer* containerLayer, const HitTestRequest& request, HitTestResult& result, 1958 Layer* Layer::hitTestTransformedLayerInFragments(Layer* rootLayer, Layer* contai nerLayer, const HitTestRequest& request, HitTestResult& result,
1956 const LayoutRect& hitTestRect, const HitTestLocation& hitTestLocation, const HitTestingTransformState* transformState, double* zOffset) 1959 const LayoutRect& hitTestRect, const HitTestLocation& hitTestLocation, const HitTestingTransformState* transformState, double* zOffset)
1957 { 1960 {
1958 LayerFragments enclosingPaginationFragments; 1961 LayerFragments enclosingPaginationFragments;
1959 LayoutPoint offsetOfPaginationLayerFromRoot; 1962 LayoutPoint offsetOfPaginationLayerFromRoot;
1960 // FIXME: We're missing a sub-pixel offset here crbug.com/348728 1963 // FIXME: We're missing a sub-pixel offset here crbug.com/348728
1961 LayoutRect transformedExtent = transparencyClipBox(this, enclosingPagination Layer(), HitTestingTransparencyClipBox, RenderLayer::RootOfTransparencyClipBox, LayoutSize()); 1964 LayoutRect transformedExtent = transparencyClipBox(this, enclosingPagination Layer(), HitTestingTransparencyClipBox, Layer::RootOfTransparencyClipBox, Layout Size());
1962 enclosingPaginationLayer()->collectFragments(enclosingPaginationFragments, r ootLayer, hitTestRect, 1965 enclosingPaginationLayer()->collectFragments(enclosingPaginationFragments, r ootLayer, hitTestRect,
1963 RootRelativeClipRects, IncludeOverlayScrollbarSize, RespectOverflowClip, &offsetOfPaginationLayerFromRoot, LayoutSize(), &transformedExtent); 1966 RootRelativeClipRects, IncludeOverlayScrollbarSize, RespectOverflowClip, &offsetOfPaginationLayerFromRoot, LayoutSize(), &transformedExtent);
1964 1967
1965 for (int i = enclosingPaginationFragments.size() - 1; i >= 0; --i) { 1968 for (int i = enclosingPaginationFragments.size() - 1; i >= 0; --i) {
1966 const LayerFragment& fragment = enclosingPaginationFragments.at(i); 1969 const LayerFragment& fragment = enclosingPaginationFragments.at(i);
1967 1970
1968 // Apply the page/column clip for this fragment, as well as any clips es tablished by layers in between us and 1971 // Apply the page/column clip for this fragment, as well as any clips es tablished by layers in between us and
1969 // the enclosing pagination layer. 1972 // the enclosing pagination layer.
1970 LayoutRect clipRect = fragment.backgroundRect.rect(); 1973 LayoutRect clipRect = fragment.backgroundRect.rect();
1971 1974
1972 // Now compute the clips within a given fragment 1975 // Now compute the clips within a given fragment
1973 if (parent() != enclosingPaginationLayer()) { 1976 if (parent() != enclosingPaginationLayer()) {
1974 enclosingPaginationLayer()->convertToLayerCoords(rootLayer, offsetOf PaginationLayerFromRoot); 1977 enclosingPaginationLayer()->convertToLayerCoords(rootLayer, offsetOf PaginationLayerFromRoot);
1975 LayoutRect parentClipRect = clipper().backgroundClipRect(ClipRectsCo ntext(enclosingPaginationLayer(), RootRelativeClipRects, IncludeOverlayScrollbar Size)).rect(); 1978 LayoutRect parentClipRect = clipper().backgroundClipRect(ClipRectsCo ntext(enclosingPaginationLayer(), RootRelativeClipRects, IncludeOverlayScrollbar Size)).rect();
1976 parentClipRect.moveBy(fragment.paginationOffset + offsetOfPagination LayerFromRoot); 1979 parentClipRect.moveBy(fragment.paginationOffset + offsetOfPagination LayerFromRoot);
1977 clipRect.intersect(parentClipRect); 1980 clipRect.intersect(parentClipRect);
1978 } 1981 }
1979 1982
1980 if (!hitTestLocation.intersects(clipRect)) 1983 if (!hitTestLocation.intersects(clipRect))
1981 continue; 1984 continue;
1982 1985
1983 RenderLayer* hitLayer = hitTestLayerByApplyingTransform(rootLayer, conta inerLayer, request, result, hitTestRect, hitTestLocation, 1986 Layer* hitLayer = hitTestLayerByApplyingTransform(rootLayer, containerLa yer, request, result, hitTestRect, hitTestLocation,
1984 transformState, zOffset, fragment.paginationOffset); 1987 transformState, zOffset, fragment.paginationOffset);
1985 if (hitLayer) 1988 if (hitLayer)
1986 return hitLayer; 1989 return hitLayer;
1987 } 1990 }
1988 1991
1989 return 0; 1992 return 0;
1990 } 1993 }
1991 1994
1992 RenderLayer* RenderLayer::hitTestLayerByApplyingTransform(RenderLayer* rootLayer , RenderLayer* containerLayer, const HitTestRequest& request, HitTestResult& res ult, 1995 Layer* Layer::hitTestLayerByApplyingTransform(Layer* rootLayer, Layer* container Layer, const HitTestRequest& request, HitTestResult& result,
1993 const LayoutRect& hitTestRect, const HitTestLocation& hitTestLocation, const HitTestingTransformState* transformState, double* zOffset, 1996 const LayoutRect& hitTestRect, const HitTestLocation& hitTestLocation, const HitTestingTransformState* transformState, double* zOffset,
1994 const LayoutPoint& translationOffset) 1997 const LayoutPoint& translationOffset)
1995 { 1998 {
1996 // Create a transform state to accumulate this transform. 1999 // Create a transform state to accumulate this transform.
1997 RefPtr<HitTestingTransformState> newTransformState = createLocalTransformSta te(rootLayer, containerLayer, hitTestRect, hitTestLocation, transformState, tran slationOffset); 2000 RefPtr<HitTestingTransformState> newTransformState = createLocalTransformSta te(rootLayer, containerLayer, hitTestRect, hitTestLocation, transformState, tran slationOffset);
1998 2001
1999 // If the transform can't be inverted, then don't hit test this layer at all . 2002 // If the transform can't be inverted, then don't hit test this layer at all .
2000 if (!newTransformState->m_accumulatedTransform.isInvertible()) 2003 if (!newTransformState->m_accumulatedTransform.isInvertible())
2001 return 0; 2004 return 0;
2002 2005
2003 // Compute the point and the hit test rect in the coords of this layer by us ing the values 2006 // Compute the point and the hit test rect in the coords of this layer by us ing the values
2004 // from the transformState, which store the point and quad in the coords of the last flattened 2007 // from the transformState, which store the point and quad in the coords of the last flattened
2005 // layer, and the accumulated transform which lets up map through preserve-3 d layers. 2008 // layer, and the accumulated transform which lets up map through preserve-3 d layers.
2006 // 2009 //
2007 // We can't just map hitTestLocation and hitTestRect because they may have b een flattened (losing z) 2010 // We can't just map hitTestLocation and hitTestRect because they may have b een flattened (losing z)
2008 // by our container. 2011 // by our container.
2009 FloatPoint localPoint = newTransformState->mappedPoint(); 2012 FloatPoint localPoint = newTransformState->mappedPoint();
2010 FloatQuad localPointQuad = newTransformState->mappedQuad(); 2013 FloatQuad localPointQuad = newTransformState->mappedQuad();
2011 LayoutRect localHitTestRect = newTransformState->boundsOfMappedArea(); 2014 LayoutRect localHitTestRect = newTransformState->boundsOfMappedArea();
2012 HitTestLocation newHitTestLocation; 2015 HitTestLocation newHitTestLocation;
2013 if (hitTestLocation.isRectBasedTest()) 2016 if (hitTestLocation.isRectBasedTest())
2014 newHitTestLocation = HitTestLocation(localPoint, localPointQuad); 2017 newHitTestLocation = HitTestLocation(localPoint, localPointQuad);
2015 else 2018 else
2016 newHitTestLocation = HitTestLocation(localPoint); 2019 newHitTestLocation = HitTestLocation(localPoint);
2017 2020
2018 // Now do a hit test with the root layer shifted to be us. 2021 // Now do a hit test with the root layer shifted to be us.
2019 return hitTestLayer(this, containerLayer, request, result, localHitTestRect, newHitTestLocation, true, newTransformState.get(), zOffset); 2022 return hitTestLayer(this, containerLayer, request, result, localHitTestRect, newHitTestLocation, true, newTransformState.get(), zOffset);
2020 } 2023 }
2021 2024
2022 bool RenderLayer::hitTestContents(const HitTestRequest& request, HitTestResult& result, const LayoutRect& layerBounds, const HitTestLocation& hitTestLocation, H itTestFilter hitTestFilter) const 2025 bool Layer::hitTestContents(const HitTestRequest& request, HitTestResult& result , const LayoutRect& layerBounds, const HitTestLocation& hitTestLocation, HitTest Filter hitTestFilter) const
2023 { 2026 {
2024 ASSERT(isSelfPaintingLayer() || hasSelfPaintingLayerDescendant()); 2027 ASSERT(isSelfPaintingLayer() || hasSelfPaintingLayerDescendant());
2025 2028
2026 if (!renderer()->hitTest(request, result, hitTestLocation, toLayoutPoint(lay erBounds.location() - renderBoxLocation()), hitTestFilter)) { 2029 if (!renderer()->hitTest(request, result, hitTestLocation, toLayoutPoint(lay erBounds.location() - renderBoxLocation()), hitTestFilter)) {
2027 // It's wrong to set innerNode, but then claim that you didn't hit anyth ing, unless it is 2030 // It's wrong to set innerNode, but then claim that you didn't hit anyth ing, unless it is
2028 // a rect-based test. 2031 // a rect-based test.
2029 ASSERT(!result.innerNode() || (result.isRectBasedTest() && result.rectBa sedTestResult().size())); 2032 ASSERT(!result.innerNode() || (result.isRectBasedTest() && result.rectBa sedTestResult().size()));
2030 return false; 2033 return false;
2031 } 2034 }
2032 2035
2033 // For positioned generated content, we might still not have a 2036 // For positioned generated content, we might still not have a
2034 // node by the time we get to the layer level, since none of 2037 // node by the time we get to the layer level, since none of
2035 // the content in the layer has an element. So just walk up 2038 // the content in the layer has an element. So just walk up
2036 // the tree. 2039 // the tree.
2037 if (!result.innerNode() || !result.innerNonSharedNode()) { 2040 if (!result.innerNode() || !result.innerNonSharedNode()) {
2038 Node* e = enclosingElement(); 2041 Node* e = enclosingElement();
2039 if (!result.innerNode()) 2042 if (!result.innerNode())
2040 result.setInnerNode(e); 2043 result.setInnerNode(e);
2041 if (!result.innerNonSharedNode()) 2044 if (!result.innerNonSharedNode())
2042 result.setInnerNonSharedNode(e); 2045 result.setInnerNonSharedNode(e);
2043 } 2046 }
2044 2047
2045 return true; 2048 return true;
2046 } 2049 }
2047 2050
2048 RenderLayer* RenderLayer::hitTestChildren(ChildrenIteration childrentoVisit, Ren derLayer* rootLayer, 2051 Layer* Layer::hitTestChildren(ChildrenIteration childrentoVisit, Layer* rootLaye r,
2049 const HitTestRequest& request, HitTestResult& result, 2052 const HitTestRequest& request, HitTestResult& result,
2050 const LayoutRect& hitTestRect, const HitTestLocation& hitTestLocation, 2053 const LayoutRect& hitTestRect, const HitTestLocation& hitTestLocation,
2051 const HitTestingTransformState* transformState, 2054 const HitTestingTransformState* transformState,
2052 double* zOffsetForDescendants, double* zOffset, 2055 double* zOffsetForDescendants, double* zOffset,
2053 const HitTestingTransformState* unflattenedTransformState, 2056 const HitTestingTransformState* unflattenedTransformState,
2054 bool depthSortDescendants) 2057 bool depthSortDescendants)
2055 { 2058 {
2056 if (!hasSelfPaintingLayerDescendant()) 2059 if (!hasSelfPaintingLayerDescendant())
2057 return 0; 2060 return 0;
2058 2061
2059 RenderLayer* resultLayer = 0; 2062 Layer* resultLayer = 0;
2060 RenderLayerStackingNodeReverseIterator iterator(*m_stackingNode, childrentoV isit); 2063 LayerStackingNodeReverseIterator iterator(*m_stackingNode, childrentoVisit);
2061 while (RenderLayerStackingNode* child = iterator.next()) { 2064 while (LayerStackingNode* child = iterator.next()) {
2062 RenderLayer* childLayer = child->layer(); 2065 Layer* childLayer = child->layer();
2063 RenderLayer* hitLayer = 0; 2066 Layer* hitLayer = 0;
2064 HitTestResult tempResult(result.hitTestLocation()); 2067 HitTestResult tempResult(result.hitTestLocation());
2065 if (childLayer->isPaginated()) 2068 if (childLayer->isPaginated())
2066 hitLayer = hitTestPaginatedChildLayer(childLayer, rootLayer, request , tempResult, hitTestRect, hitTestLocation, transformState, zOffsetForDescendant s); 2069 hitLayer = hitTestPaginatedChildLayer(childLayer, rootLayer, request , tempResult, hitTestRect, hitTestLocation, transformState, zOffsetForDescendant s);
2067 else 2070 else
2068 hitLayer = childLayer->hitTestLayer(rootLayer, this, request, tempRe sult, hitTestRect, hitTestLocation, false, transformState, zOffsetForDescendants ); 2071 hitLayer = childLayer->hitTestLayer(rootLayer, this, request, tempRe sult, hitTestRect, hitTestLocation, false, transformState, zOffsetForDescendants );
2069 2072
2070 // If it a rect-based test, we can safely append the temporary result si nce it might had hit 2073 // If it a rect-based test, we can safely append the temporary result si nce it might had hit
2071 // nodes but not necesserily had hitLayer set. 2074 // nodes but not necesserily had hitLayer set.
2072 if (result.isRectBasedTest()) 2075 if (result.isRectBasedTest())
2073 result.append(tempResult); 2076 result.append(tempResult);
2074 2077
2075 if (isHitCandidate(hitLayer, depthSortDescendants, zOffset, unflattenedT ransformState)) { 2078 if (isHitCandidate(hitLayer, depthSortDescendants, zOffset, unflattenedT ransformState)) {
2076 resultLayer = hitLayer; 2079 resultLayer = hitLayer;
2077 if (!result.isRectBasedTest()) 2080 if (!result.isRectBasedTest())
2078 result = tempResult; 2081 result = tempResult;
2079 if (!depthSortDescendants) 2082 if (!depthSortDescendants)
2080 break; 2083 break;
2081 } 2084 }
2082 } 2085 }
2083 2086
2084 return resultLayer; 2087 return resultLayer;
2085 } 2088 }
2086 2089
2087 RenderLayer* RenderLayer::hitTestPaginatedChildLayer(RenderLayer* childLayer, Re nderLayer* rootLayer, const HitTestRequest& request, HitTestResult& result, 2090 Layer* Layer::hitTestPaginatedChildLayer(Layer* childLayer, Layer* rootLayer, co nst HitTestRequest& request, HitTestResult& result,
2088 const LayoutRect& hitTestRe ct, const HitTestLocation& hitTestLocation, const HitTestingTransformState* tran sformState, double* zOffset) 2091 const LayoutRect& hitTestRect, const HitTestLocation& hitTestLocation, const HitTestingTransformState* transformState, double* zOffset)
2089 { 2092 {
2090 Vector<RenderLayer*> columnLayers; 2093 Vector<Layer*> columnLayers;
2091 RenderLayerStackingNode* ancestorNode = m_stackingNode->isNormalFlowOnly() ? parent()->stackingNode() : m_stackingNode->ancestorStackingContextNode(); 2094 LayerStackingNode* ancestorNode = m_stackingNode->isNormalFlowOnly() ? paren t()->stackingNode() : m_stackingNode->ancestorStackingContextNode();
2092 for (RenderLayer* curr = childLayer->parent(); curr; curr = curr->parent()) { 2095 for (Layer* curr = childLayer->parent(); curr; curr = curr->parent()) {
2093 if (curr->renderer()->hasColumns() && checkContainingBlockChainForPagina tion(childLayer->renderer(), curr->renderBox())) 2096 if (curr->renderer()->hasColumns() && checkContainingBlockChainForPagina tion(childLayer->renderer(), curr->renderBox()))
2094 columnLayers.append(curr); 2097 columnLayers.append(curr);
2095 if (curr->stackingNode() == ancestorNode) 2098 if (curr->stackingNode() == ancestorNode)
2096 break; 2099 break;
2097 } 2100 }
2098 2101
2099 ASSERT(columnLayers.size()); 2102 ASSERT(columnLayers.size());
2100 return hitTestChildLayerColumns(childLayer, rootLayer, request, result, hitT estRect, hitTestLocation, transformState, zOffset, 2103 return hitTestChildLayerColumns(childLayer, rootLayer, request, result, hitT estRect, hitTestLocation, transformState, zOffset,
2101 columnLayers, columnLayers.size() - 1); 2104 columnLayers, columnLayers.size() - 1);
2102 } 2105 }
2103 2106
2104 RenderLayer* RenderLayer::hitTestChildLayerColumns(RenderLayer* childLayer, Rend erLayer* rootLayer, const HitTestRequest& request, HitTestResult& result, 2107 Layer* Layer::hitTestChildLayerColumns(Layer* childLayer, Layer* rootLayer, cons t HitTestRequest& request, HitTestResult& result,
2105 const LayoutRect& hitTestRect , const HitTestLocation& hitTestLocation, const HitTestingTransformState* transf ormState, double* zOffset, 2108 const LayoutRect& hitTestRect, const HitTestLocation& hitTestLocation, const HitTestingTransformState* transformState, double* zOffset,
2106 const Vector<RenderLayer*>& c olumnLayers, size_t columnIndex) 2109 const Vector<Layer*>& columnLayers, size_t columnIndex)
2107 { 2110 {
2108 RenderBlock* columnBlock = toRenderBlock(columnLayers[columnIndex]->renderer ()); 2111 RenderBlock* columnBlock = toRenderBlock(columnLayers[columnIndex]->renderer ());
2109 2112
2110 ASSERT(columnBlock && columnBlock->hasColumns()); 2113 ASSERT(columnBlock && columnBlock->hasColumns());
2111 if (!columnBlock || !columnBlock->hasColumns()) 2114 if (!columnBlock || !columnBlock->hasColumns())
2112 return 0; 2115 return 0;
2113 2116
2114 LayoutPoint layerOffset; 2117 LayoutPoint layerOffset;
2115 columnBlock->layer()->convertToLayerCoords(rootLayer, layerOffset); 2118 columnBlock->layer()->convertToLayerCoords(rootLayer, layerOffset);
2116 2119
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
2153 else 2156 else
2154 offset = LayoutSize(colRect.x() + currLogicalTopOffset - columnB lock->borderLeft() - columnBlock->paddingLeft(), 0); 2157 offset = LayoutSize(colRect.x() + currLogicalTopOffset - columnB lock->borderLeft() - columnBlock->paddingLeft(), 0);
2155 } 2158 }
2156 2159
2157 colRect.moveBy(layerOffset); 2160 colRect.moveBy(layerOffset);
2158 2161
2159 LayoutRect localClipRect(hitTestRect); 2162 LayoutRect localClipRect(hitTestRect);
2160 localClipRect.intersect(colRect); 2163 localClipRect.intersect(colRect);
2161 2164
2162 if (!localClipRect.isEmpty() && hitTestLocation.intersects(localClipRect )) { 2165 if (!localClipRect.isEmpty() && hitTestLocation.intersects(localClipRect )) {
2163 RenderLayer* hitLayer = 0; 2166 Layer* hitLayer = 0;
2164 if (!columnIndex) { 2167 if (!columnIndex) {
2165 // Apply a translation transform to change where the layer paint s. 2168 // Apply a translation transform to change where the layer paint s.
2166 TransformationMatrix oldTransform; 2169 TransformationMatrix oldTransform;
2167 bool oldHasTransform = childLayer->transform(); 2170 bool oldHasTransform = childLayer->transform();
2168 if (oldHasTransform) 2171 if (oldHasTransform)
2169 oldTransform = *childLayer->transform(); 2172 oldTransform = *childLayer->transform();
2170 TransformationMatrix newTransform(oldTransform); 2173 TransformationMatrix newTransform(oldTransform);
2171 newTransform.translateRight(offset.width(), offset.height()); 2174 newTransform.translateRight(offset.width(), offset.height());
2172 2175
2173 childLayer->m_transform = adoptPtr(new TransformationMatrix(newT ransform)); 2176 childLayer->m_transform = adoptPtr(new TransformationMatrix(newT ransform));
2174 hitLayer = childLayer->hitTestLayer(rootLayer, columnLayers[0], request, result, localClipRect, hitTestLocation, false, transformState, zOffset) ; 2177 hitLayer = childLayer->hitTestLayer(rootLayer, columnLayers[0], request, result, localClipRect, hitTestLocation, false, transformState, zOffset) ;
2175 if (oldHasTransform) 2178 if (oldHasTransform)
2176 childLayer->m_transform = adoptPtr(new TransformationMatrix( oldTransform)); 2179 childLayer->m_transform = adoptPtr(new TransformationMatrix( oldTransform));
2177 else 2180 else
2178 childLayer->m_transform.clear(); 2181 childLayer->m_transform.clear();
2179 } else { 2182 } else {
2180 // Adjust the transform such that the renderer's upper left corn er will be at (0,0) in user space. 2183 // Adjust the transform such that the renderer's upper left corn er will be at (0,0) in user space.
2181 // This involves subtracting out the position of the layer in ou r current coordinate space. 2184 // This involves subtracting out the position of the layer in ou r current coordinate space.
2182 RenderLayer* nextLayer = columnLayers[columnIndex - 1]; 2185 Layer* nextLayer = columnLayers[columnIndex - 1];
2183 RefPtr<HitTestingTransformState> newTransformState = nextLayer-> createLocalTransformState(rootLayer, nextLayer, localClipRect, hitTestLocation, transformState); 2186 RefPtr<HitTestingTransformState> newTransformState = nextLayer-> createLocalTransformState(rootLayer, nextLayer, localClipRect, hitTestLocation, transformState);
2184 newTransformState->translate(offset.width(), offset.height(), Hi tTestingTransformState::AccumulateTransform); 2187 newTransformState->translate(offset.width(), offset.height(), Hi tTestingTransformState::AccumulateTransform);
2185 FloatPoint localPoint = newTransformState->mappedPoint(); 2188 FloatPoint localPoint = newTransformState->mappedPoint();
2186 FloatQuad localPointQuad = newTransformState->mappedQuad(); 2189 FloatQuad localPointQuad = newTransformState->mappedQuad();
2187 LayoutRect localHitTestRect = newTransformState->mappedArea().en closingBoundingBox(); 2190 LayoutRect localHitTestRect = newTransformState->mappedArea().en closingBoundingBox();
2188 HitTestLocation newHitTestLocation; 2191 HitTestLocation newHitTestLocation;
2189 if (hitTestLocation.isRectBasedTest()) 2192 if (hitTestLocation.isRectBasedTest())
2190 newHitTestLocation = HitTestLocation(localPoint, localPointQ uad); 2193 newHitTestLocation = HitTestLocation(localPoint, localPointQ uad);
2191 else 2194 else
2192 newHitTestLocation = HitTestLocation(localPoint); 2195 newHitTestLocation = HitTestLocation(localPoint);
2193 newTransformState->flatten(); 2196 newTransformState->flatten();
2194 2197
2195 hitLayer = hitTestChildLayerColumns(childLayer, columnLayers[col umnIndex - 1], request, result, localHitTestRect, newHitTestLocation, 2198 hitLayer = hitTestChildLayerColumns(childLayer, columnLayers[col umnIndex - 1], request, result, localHitTestRect, newHitTestLocation,
2196 newTransformState.get(), zOf fset, columnLayers, columnIndex - 1); 2199 newTransformState.get(), zOffset, columnLayers, columnIndex - 1);
2197 } 2200 }
2198 2201
2199 if (hitLayer) 2202 if (hitLayer)
2200 return hitLayer; 2203 return hitLayer;
2201 } 2204 }
2202 } 2205 }
2203 2206
2204 return 0; 2207 return 0;
2205 } 2208 }
2206 2209
2207 void RenderLayer::blockSelectionGapsBoundsChanged() 2210 void Layer::blockSelectionGapsBoundsChanged()
2208 { 2211 {
2209 setNeedsCompositingInputsUpdate(); 2212 setNeedsCompositingInputsUpdate();
2210 } 2213 }
2211 2214
2212 void RenderLayer::addBlockSelectionGapsBounds(const LayoutRect& bounds) 2215 void Layer::addBlockSelectionGapsBounds(const LayoutRect& bounds)
2213 { 2216 {
2214 m_blockSelectionGapsBounds.unite(enclosingIntRect(bounds)); 2217 m_blockSelectionGapsBounds.unite(enclosingIntRect(bounds));
2215 blockSelectionGapsBoundsChanged(); 2218 blockSelectionGapsBoundsChanged();
2216 } 2219 }
2217 2220
2218 void RenderLayer::clearBlockSelectionGapsBounds() 2221 void Layer::clearBlockSelectionGapsBounds()
2219 { 2222 {
2220 m_blockSelectionGapsBounds = IntRect(); 2223 m_blockSelectionGapsBounds = IntRect();
2221 for (RenderLayer* child = firstChild(); child; child = child->nextSibling()) 2224 for (Layer* child = firstChild(); child; child = child->nextSibling())
2222 child->clearBlockSelectionGapsBounds(); 2225 child->clearBlockSelectionGapsBounds();
2223 blockSelectionGapsBoundsChanged(); 2226 blockSelectionGapsBoundsChanged();
2224 } 2227 }
2225 2228
2226 void RenderLayer::invalidatePaintForBlockSelectionGaps() 2229 void Layer::invalidatePaintForBlockSelectionGaps()
2227 { 2230 {
2228 for (RenderLayer* child = firstChild(); child; child = child->nextSibling()) 2231 for (Layer* child = firstChild(); child; child = child->nextSibling())
2229 child->invalidatePaintForBlockSelectionGaps(); 2232 child->invalidatePaintForBlockSelectionGaps();
2230 2233
2231 if (m_blockSelectionGapsBounds.isEmpty()) 2234 if (m_blockSelectionGapsBounds.isEmpty())
2232 return; 2235 return;
2233 2236
2234 LayoutRect rect = m_blockSelectionGapsBounds; 2237 LayoutRect rect = m_blockSelectionGapsBounds;
2235 if (renderer()->hasOverflowClip()) { 2238 if (renderer()->hasOverflowClip()) {
2236 RenderBox* box = renderBox(); 2239 RenderBox* box = renderBox();
2237 rect.move(-box->scrolledContentOffset()); 2240 rect.move(-box->scrolledContentOffset());
2238 if (!scrollableArea()->usesCompositedScrolling()) 2241 if (!scrollableArea()->usesCompositedScrolling())
2239 rect.intersect(box->overflowClipRect(LayoutPoint())); 2242 rect.intersect(box->overflowClipRect(LayoutPoint()));
2240 } 2243 }
2241 if (renderer()->hasClip()) 2244 if (renderer()->hasClip())
2242 rect.intersect(toRenderBox(renderer())->clipRect(LayoutPoint())); 2245 rect.intersect(toRenderBox(renderer())->clipRect(LayoutPoint()));
2243 if (!rect.isEmpty()) 2246 if (!rect.isEmpty())
2244 renderer()->invalidatePaintRectangle(rect); 2247 renderer()->invalidatePaintRectangle(rect);
2245 } 2248 }
2246 2249
2247 IntRect RenderLayer::blockSelectionGapsBounds() const 2250 IntRect Layer::blockSelectionGapsBounds() const
2248 { 2251 {
2249 if (!renderer()->isRenderBlockFlow()) 2252 if (!renderer()->isRenderBlockFlow())
2250 return IntRect(); 2253 return IntRect();
2251 2254
2252 RenderBlockFlow* renderBlockFlow = toRenderBlockFlow(renderer()); 2255 RenderBlockFlow* renderBlockFlow = toRenderBlockFlow(renderer());
2253 LayoutRect gapRects = renderBlockFlow->selectionGapRectsForPaintInvalidation (renderBlockFlow); 2256 LayoutRect gapRects = renderBlockFlow->selectionGapRectsForPaintInvalidation (renderBlockFlow);
2254 2257
2255 return pixelSnappedIntRect(gapRects); 2258 return pixelSnappedIntRect(gapRects);
2256 } 2259 }
2257 2260
2258 bool RenderLayer::hasBlockSelectionGapBounds() const 2261 bool Layer::hasBlockSelectionGapBounds() const
2259 { 2262 {
2260 // FIXME: it would be more accurate to return !blockSelectionGapsBounds().is Empty(), but this is impossible 2263 // FIXME: it would be more accurate to return !blockSelectionGapsBounds().is Empty(), but this is impossible
2261 // at the moment because it causes invalid queries to layout-dependent code (crbug.com/372802). 2264 // at the moment because it causes invalid queries to layout-dependent code (crbug.com/372802).
2262 // ASSERT(renderer()->document().lifecycle().state() >= DocumentLifecycle::L ayoutClean); 2265 // ASSERT(renderer()->document().lifecycle().state() >= DocumentLifecycle::L ayoutClean);
2263 2266
2264 if (!renderer()->isRenderBlock()) 2267 if (!renderer()->isRenderBlock())
2265 return false; 2268 return false;
2266 2269
2267 return toRenderBlock(renderer())->shouldPaintSelectionGaps(); 2270 return toRenderBlock(renderer())->shouldPaintSelectionGaps();
2268 } 2271 }
2269 2272
2270 bool RenderLayer::intersectsDamageRect(const LayoutRect& layerBounds, const Layo utRect& damageRect, const RenderLayer* rootLayer, const LayoutPoint* offsetFromR oot) const 2273 bool Layer::intersectsDamageRect(const LayoutRect& layerBounds, const LayoutRect & damageRect, const Layer* rootLayer, const LayoutPoint* offsetFromRoot) const
2271 { 2274 {
2272 // Always examine the canvas and the root. 2275 // Always examine the canvas and the root.
2273 // FIXME: Could eliminate the isDocumentElement() check if we fix background painting so that the RenderView 2276 // FIXME: Could eliminate the isDocumentElement() check if we fix background painting so that the RenderView
2274 // paints the root's background. 2277 // paints the root's background.
2275 if (isRootLayer() || renderer()->isDocumentElement()) 2278 if (isRootLayer() || renderer()->isDocumentElement())
2276 return true; 2279 return true;
2277 2280
2278 // If we aren't an inline flow, and our layer bounds do intersect the damage rect, then we 2281 // If we aren't an inline flow, and our layer bounds do intersect the damage rect, then we
2279 // can go ahead and return true. 2282 // can go ahead and return true.
2280 RenderView* view = renderer()->view(); 2283 RenderView* view = renderer()->view();
2281 ASSERT(view); 2284 ASSERT(view);
2282 if (view && !renderer()->isRenderInline()) { 2285 if (view && !renderer()->isRenderInline()) {
2283 if (layerBounds.intersects(damageRect)) 2286 if (layerBounds.intersects(damageRect))
2284 return true; 2287 return true;
2285 } 2288 }
2286 2289
2287 // Otherwise we need to compute the bounding box of this single layer and se e if it intersects 2290 // Otherwise we need to compute the bounding box of this single layer and se e if it intersects
2288 // the damage rect. 2291 // the damage rect.
2289 return physicalBoundingBox(rootLayer, offsetFromRoot).intersects(damageRect) ; 2292 return physicalBoundingBox(rootLayer, offsetFromRoot).intersects(damageRect) ;
2290 } 2293 }
2291 2294
2292 LayoutRect RenderLayer::logicalBoundingBox() const 2295 LayoutRect Layer::logicalBoundingBox() const
2293 { 2296 {
2294 // There are three special cases we need to consider. 2297 // There are three special cases we need to consider.
2295 // (1) Inline Flows. For inline flows we will create a bounding box that fu lly encompasses all of the lines occupied by the 2298 // (1) Inline Flows. For inline flows we will create a bounding box that fu lly encompasses all of the lines occupied by the
2296 // inline. In other words, if some <span> wraps to three lines, we'll creat e a bounding box that fully encloses the 2299 // inline. In other words, if some <span> wraps to three lines, we'll creat e a bounding box that fully encloses the
2297 // line boxes of all three lines (including overflow on those lines). 2300 // line boxes of all three lines (including overflow on those lines).
2298 // (2) Left/Top Overflow. The width/height of layers already includes right /bottom overflow. However, in the case of left/top 2301 // (2) Left/Top Overflow. The width/height of layers already includes right /bottom overflow. However, in the case of left/top
2299 // overflow, we have to create a bounding box that will extend to include th is overflow. 2302 // overflow, we have to create a bounding box that will extend to include th is overflow.
2300 // (3) Floats. When a layer has overhanging floats that it paints, we need to make sure to include these overhanging floats 2303 // (3) Floats. When a layer has overhanging floats that it paints, we need to make sure to include these overhanging floats
2301 // as part of our bounding box. We do this because we are the responsible l ayer for both hit testing and painting those 2304 // as part of our bounding box. We do this because we are the responsible l ayer for both hit testing and painting those
2302 // floats. 2305 // floats.
(...skipping 25 matching lines...) Expand all
2328 static inline LayoutRect flippedLogicalBoundingBox(LayoutRect boundingBox, Rende rObject* renderer) 2331 static inline LayoutRect flippedLogicalBoundingBox(LayoutRect boundingBox, Rende rObject* renderer)
2329 { 2332 {
2330 LayoutRect result = boundingBox; 2333 LayoutRect result = boundingBox;
2331 if (renderer->isBox()) 2334 if (renderer->isBox())
2332 toRenderBox(renderer)->flipForWritingMode(result); 2335 toRenderBox(renderer)->flipForWritingMode(result);
2333 else 2336 else
2334 renderer->containingBlock()->flipForWritingMode(result); 2337 renderer->containingBlock()->flipForWritingMode(result);
2335 return result; 2338 return result;
2336 } 2339 }
2337 2340
2338 LayoutRect RenderLayer::physicalBoundingBox(const RenderLayer* ancestorLayer, co nst LayoutPoint* offsetFromRoot) const 2341 LayoutRect Layer::physicalBoundingBox(const Layer* ancestorLayer, const LayoutPo int* offsetFromRoot) const
2339 { 2342 {
2340 LayoutRect result = flippedLogicalBoundingBox(logicalBoundingBox(), renderer ()); 2343 LayoutRect result = flippedLogicalBoundingBox(logicalBoundingBox(), renderer ());
2341 if (offsetFromRoot) 2344 if (offsetFromRoot)
2342 result.moveBy(*offsetFromRoot); 2345 result.moveBy(*offsetFromRoot);
2343 else 2346 else
2344 convertToLayerCoords(ancestorLayer, result); 2347 convertToLayerCoords(ancestorLayer, result);
2345 return result; 2348 return result;
2346 } 2349 }
2347 2350
2348 LayoutRect RenderLayer::fragmentsBoundingBox(const RenderLayer* ancestorLayer) c onst 2351 LayoutRect Layer::fragmentsBoundingBox(const Layer* ancestorLayer) const
2349 { 2352 {
2350 if (!enclosingPaginationLayer()) 2353 if (!enclosingPaginationLayer())
2351 return physicalBoundingBox(ancestorLayer); 2354 return physicalBoundingBox(ancestorLayer);
2352 2355
2353 LayoutRect result = flippedLogicalBoundingBox(logicalBoundingBox(), renderer ()); 2356 LayoutRect result = flippedLogicalBoundingBox(logicalBoundingBox(), renderer ());
2354 convertFromFlowThreadToVisualBoundingBoxInAncestor(this, ancestorLayer, resu lt); 2357 convertFromFlowThreadToVisualBoundingBoxInAncestor(this, ancestorLayer, resu lt);
2355 return result; 2358 return result;
2356 } 2359 }
2357 2360
2358 LayoutRect RenderLayer::boundingBoxForCompositingOverlapTest() const 2361 LayoutRect Layer::boundingBoxForCompositingOverlapTest() const
2359 { 2362 {
2360 return overlapBoundsIncludeChildren() ? boundingBoxForCompositing() : fragme ntsBoundingBox(this); 2363 return overlapBoundsIncludeChildren() ? boundingBoxForCompositing() : fragme ntsBoundingBox(this);
2361 } 2364 }
2362 2365
2363 static void expandRectForReflectionAndStackingChildren(const RenderLayer* ancest orLayer, RenderLayer::CalculateBoundsOptions options, LayoutRect& result) 2366 static void expandRectForReflectionAndStackingChildren(const Layer* ancestorLaye r, Layer::CalculateBoundsOptions options, LayoutRect& result)
2364 { 2367 {
2365 if (ancestorLayer->reflectionInfo() && !ancestorLayer->reflectionInfo()->ref lectionLayer()->hasCompositedLayerMapping()) 2368 if (ancestorLayer->reflectionInfo() && !ancestorLayer->reflectionInfo()->ref lectionLayer()->hasCompositedLayerMapping())
2366 result.unite(ancestorLayer->reflectionInfo()->reflectionLayer()->boundin gBoxForCompositing(ancestorLayer)); 2369 result.unite(ancestorLayer->reflectionInfo()->reflectionLayer()->boundin gBoxForCompositing(ancestorLayer));
2367 2370
2368 ASSERT(ancestorLayer->stackingNode()->isStackingContext() || !ancestorLayer- >stackingNode()->hasPositiveZOrderList()); 2371 ASSERT(ancestorLayer->stackingNode()->isStackingContext() || !ancestorLayer- >stackingNode()->hasPositiveZOrderList());
2369 2372
2370 #if ENABLE(ASSERT) 2373 #if ENABLE(ASSERT)
2371 LayerListMutationDetector mutationChecker(const_cast<RenderLayer*>(ancestorL ayer)->stackingNode()); 2374 LayerListMutationDetector mutationChecker(const_cast<Layer*>(ancestorLayer)- >stackingNode());
2372 #endif 2375 #endif
2373 2376
2374 RenderLayerStackingNodeIterator iterator(*ancestorLayer->stackingNode(), All Children); 2377 LayerStackingNodeIterator iterator(*ancestorLayer->stackingNode(), AllChildr en);
2375 while (RenderLayerStackingNode* node = iterator.next()) { 2378 while (LayerStackingNode* node = iterator.next()) {
2376 // Here we exclude both directly composited layers and squashing layers 2379 // Here we exclude both directly composited layers and squashing layers
2377 // because those RenderLayers don't paint into the graphics layer 2380 // because those Layers don't paint into the graphics layer
2378 // for this RenderLayer. For example, the bounds of squashed RenderLayer s 2381 // for this Layer. For example, the bounds of squashed Layers
2379 // will be included in the computation of the appropriate squashing 2382 // will be included in the computation of the appropriate squashing
2380 // GraphicsLayer. 2383 // GraphicsLayer.
2381 if (options != RenderLayer::ApplyBoundsChickenEggHacks && node->layer()- >compositingState() != NotComposited) 2384 if (options != Layer::ApplyBoundsChickenEggHacks && node->layer()->compo sitingState() != NotComposited)
2382 continue; 2385 continue;
2383 result.unite(node->layer()->boundingBoxForCompositing(ancestorLayer, opt ions)); 2386 result.unite(node->layer()->boundingBoxForCompositing(ancestorLayer, opt ions));
2384 } 2387 }
2385 } 2388 }
2386 2389
2387 LayoutRect RenderLayer::physicalBoundingBoxIncludingReflectionAndStackingChildre n(const RenderLayer* ancestorLayer, const LayoutPoint& offsetFromRoot) const 2390 LayoutRect Layer::physicalBoundingBoxIncludingReflectionAndStackingChildren(cons t Layer* ancestorLayer, const LayoutPoint& offsetFromRoot) const
2388 { 2391 {
2389 LayoutPoint origin; 2392 LayoutPoint origin;
2390 LayoutRect result = physicalBoundingBox(ancestorLayer, &origin); 2393 LayoutRect result = physicalBoundingBox(ancestorLayer, &origin);
2391 2394
2392 const_cast<RenderLayer*>(this)->stackingNode()->updateLayerListsIfNeeded(); 2395 const_cast<Layer*>(this)->stackingNode()->updateLayerListsIfNeeded();
2393 2396
2394 expandRectForReflectionAndStackingChildren(this, DoNotApplyBoundsChickenEggH acks, result); 2397 expandRectForReflectionAndStackingChildren(this, DoNotApplyBoundsChickenEggH acks, result);
2395 2398
2396 result.moveBy(offsetFromRoot); 2399 result.moveBy(offsetFromRoot);
2397 return result; 2400 return result;
2398 } 2401 }
2399 2402
2400 LayoutRect RenderLayer::boundingBoxForCompositing(const RenderLayer* ancestorLay er, CalculateBoundsOptions options) const 2403 LayoutRect Layer::boundingBoxForCompositing(const Layer* ancestorLayer, Calculat eBoundsOptions options) const
2401 { 2404 {
2402 if (!isSelfPaintingLayer()) 2405 if (!isSelfPaintingLayer())
2403 return LayoutRect(); 2406 return LayoutRect();
2404 2407
2405 if (!ancestorLayer) 2408 if (!ancestorLayer)
2406 ancestorLayer = this; 2409 ancestorLayer = this;
2407 2410
2408 // FIXME: This could be improved to do a check like hasVisibleNonCompositing DescendantLayers() (bug 92580). 2411 // FIXME: This could be improved to do a check like hasVisibleNonCompositing DescendantLayers() (bug 92580).
2409 if (this != ancestorLayer && !hasVisibleContent() && !hasVisibleDescendant() ) 2412 if (this != ancestorLayer && !hasVisibleContent() && !hasVisibleDescendant() )
2410 return LayoutRect(); 2413 return LayoutRect();
2411 2414
2412 // The root layer is always just the size of the document. 2415 // The root layer is always just the size of the document.
2413 if (isRootLayer()) 2416 if (isRootLayer())
2414 return m_renderer->view()->unscaledDocumentRect(); 2417 return m_renderer->view()->unscaledDocumentRect();
2415 2418
2416 // The layer created for the RenderFlowThread is just a helper for painting and hit-testing, 2419 // The layer created for the RenderFlowThread is just a helper for painting and hit-testing,
2417 // and should not contribute to the bounding box. The RenderMultiColumnSets will contribute 2420 // and should not contribute to the bounding box. The RenderMultiColumnSets will contribute
2418 // the correct size for the rendered content of the multicol container. 2421 // the correct size for the rendered content of the multicol container.
2419 if (useRegionBasedColumns() && renderer()->isRenderFlowThread()) 2422 if (useRegionBasedColumns() && renderer()->isRenderFlowThread())
2420 return LayoutRect(); 2423 return LayoutRect();
2421 2424
2422 LayoutRect result = clipper().localClipRect(); 2425 LayoutRect result = clipper().localClipRect();
2423 if (result == LayoutRect::infiniteIntRect()) { 2426 if (result == LayoutRect::infiniteIntRect()) {
2424 LayoutPoint origin; 2427 LayoutPoint origin;
2425 result = physicalBoundingBox(ancestorLayer, &origin); 2428 result = physicalBoundingBox(ancestorLayer, &origin);
2426 2429
2427 const_cast<RenderLayer*>(this)->stackingNode()->updateLayerListsIfNeeded (); 2430 const_cast<Layer*>(this)->stackingNode()->updateLayerListsIfNeeded();
2428 2431
2429 // Reflections are implemented with RenderLayers that hang off of the re flected layer. However, 2432 // Reflections are implemented with Layers that hang off of the reflecte d layer. However,
2430 // the reflection layer subtree does not include the subtree of the pare nt RenderLayer, so 2433 // the reflection layer subtree does not include the subtree of the pare nt Layer, so
2431 // a recursive computation of stacking children yields no results. This breaks cases when there are stacking 2434 // a recursive computation of stacking children yields no results. This breaks cases when there are stacking
2432 // children of the parent, that need to be included in reflected composi ted bounds. 2435 // children of the parent, that need to be included in reflected composi ted bounds.
2433 // Fix this by including composited bounds of stacking children of the r eflected RenderLayer. 2436 // Fix this by including composited bounds of stacking children of the r eflected Layer.
2434 if (hasCompositedLayerMapping() && parent() && parent()->reflectionInfo( ) && parent()->reflectionInfo()->reflectionLayer() == this) 2437 if (hasCompositedLayerMapping() && parent() && parent()->reflectionInfo( ) && parent()->reflectionInfo()->reflectionLayer() == this)
2435 expandRectForReflectionAndStackingChildren(parent(), options, result ); 2438 expandRectForReflectionAndStackingChildren(parent(), options, result );
2436 else 2439 else
2437 expandRectForReflectionAndStackingChildren(this, options, result); 2440 expandRectForReflectionAndStackingChildren(this, options, result);
2438 2441
2439 // FIXME: We can optimize the size of the composited layers, by not enla rging 2442 // FIXME: We can optimize the size of the composited layers, by not enla rging
2440 // filtered areas with the outsets if we know that the filter is going t o render in hardware. 2443 // filtered areas with the outsets if we know that the filter is going t o render in hardware.
2441 // https://bugs.webkit.org/show_bug.cgi?id=81239 2444 // https://bugs.webkit.org/show_bug.cgi?id=81239
2442 result.expand(m_renderer->style()->filterOutsets()); 2445 result.expand(m_renderer->style()->filterOutsets());
2443 } 2446 }
2444 2447
2445 if (paintsWithTransform(PaintBehaviorNormal) || (options == ApplyBoundsChick enEggHacks && transform())) 2448 if (paintsWithTransform(PaintBehaviorNormal) || (options == ApplyBoundsChick enEggHacks && transform()))
2446 result = transform()->mapRect(result); 2449 result = transform()->mapRect(result);
2447 2450
2448 if (enclosingPaginationLayer()) { 2451 if (enclosingPaginationLayer()) {
2449 convertFromFlowThreadToVisualBoundingBoxInAncestor(this, ancestorLayer, result); 2452 convertFromFlowThreadToVisualBoundingBoxInAncestor(this, ancestorLayer, result);
2450 return result; 2453 return result;
2451 } 2454 }
2452 LayoutPoint delta; 2455 LayoutPoint delta;
2453 convertToLayerCoords(ancestorLayer, delta); 2456 convertToLayerCoords(ancestorLayer, delta);
2454 result.moveBy(delta); 2457 result.moveBy(delta);
2455 return result; 2458 return result;
2456 } 2459 }
2457 2460
2458 CompositingState RenderLayer::compositingState() const 2461 CompositingState Layer::compositingState() const
2459 { 2462 {
2460 ASSERT(isAllowedToQueryCompositingState()); 2463 ASSERT(isAllowedToQueryCompositingState());
2461 2464
2462 // This is computed procedurally so there is no redundant state variable tha t 2465 // This is computed procedurally so there is no redundant state variable tha t
2463 // can get out of sync from the real actual compositing state. 2466 // can get out of sync from the real actual compositing state.
2464 2467
2465 if (m_groupedMapping) { 2468 if (m_groupedMapping) {
2466 ASSERT(!m_compositedLayerMapping); 2469 ASSERT(!m_compositedLayerMapping);
2467 return PaintsIntoGroupedBacking; 2470 return PaintsIntoGroupedBacking;
2468 } 2471 }
2469 2472
2470 if (!m_compositedLayerMapping) 2473 if (!m_compositedLayerMapping)
2471 return NotComposited; 2474 return NotComposited;
2472 2475
2473 return PaintsIntoOwnBacking; 2476 return PaintsIntoOwnBacking;
2474 } 2477 }
2475 2478
2476 bool RenderLayer::isAllowedToQueryCompositingState() const 2479 bool Layer::isAllowedToQueryCompositingState() const
2477 { 2480 {
2478 if (gCompositingQueryMode == CompositingQueriesAreAllowed) 2481 if (gCompositingQueryMode == CompositingQueriesAreAllowed)
2479 return true; 2482 return true;
2480 return renderer()->document().lifecycle().state() >= DocumentLifecycle::InCo mpositingUpdate; 2483 return renderer()->document().lifecycle().state() >= DocumentLifecycle::InCo mpositingUpdate;
2481 } 2484 }
2482 2485
2483 CompositedLayerMapping* RenderLayer::compositedLayerMapping() const 2486 CompositedLayerMapping* Layer::compositedLayerMapping() const
2484 { 2487 {
2485 ASSERT(isAllowedToQueryCompositingState()); 2488 ASSERT(isAllowedToQueryCompositingState());
2486 return m_compositedLayerMapping.get(); 2489 return m_compositedLayerMapping.get();
2487 } 2490 }
2488 2491
2489 GraphicsLayer* RenderLayer::graphicsLayerBacking() const 2492 GraphicsLayer* Layer::graphicsLayerBacking() const
2490 { 2493 {
2491 switch (compositingState()) { 2494 switch (compositingState()) {
2492 case NotComposited: 2495 case NotComposited:
2493 return 0; 2496 return 0;
2494 case PaintsIntoGroupedBacking: 2497 case PaintsIntoGroupedBacking:
2495 return groupedMapping()->squashingLayer(); 2498 return groupedMapping()->squashingLayer();
2496 default: 2499 default:
2497 return compositedLayerMapping()->mainGraphicsLayer(); 2500 return compositedLayerMapping()->mainGraphicsLayer();
2498 } 2501 }
2499 } 2502 }
2500 2503
2501 GraphicsLayer* RenderLayer::graphicsLayerBackingForScrolling() const 2504 GraphicsLayer* Layer::graphicsLayerBackingForScrolling() const
2502 { 2505 {
2503 switch (compositingState()) { 2506 switch (compositingState()) {
2504 case NotComposited: 2507 case NotComposited:
2505 return 0; 2508 return 0;
2506 case PaintsIntoGroupedBacking: 2509 case PaintsIntoGroupedBacking:
2507 return groupedMapping()->squashingLayer(); 2510 return groupedMapping()->squashingLayer();
2508 default: 2511 default:
2509 return compositedLayerMapping()->scrollingContentsLayer() ? compositedLa yerMapping()->scrollingContentsLayer() : compositedLayerMapping()->mainGraphicsL ayer(); 2512 return compositedLayerMapping()->scrollingContentsLayer() ? compositedLa yerMapping()->scrollingContentsLayer() : compositedLayerMapping()->mainGraphicsL ayer();
2510 } 2513 }
2511 } 2514 }
2512 2515
2513 void RenderLayer::ensureCompositedLayerMapping() 2516 void Layer::ensureCompositedLayerMapping()
2514 { 2517 {
2515 if (m_compositedLayerMapping) 2518 if (m_compositedLayerMapping)
2516 return; 2519 return;
2517 2520
2518 m_compositedLayerMapping = adoptPtr(new CompositedLayerMapping(*this)); 2521 m_compositedLayerMapping = adoptPtr(new CompositedLayerMapping(*this));
2519 m_compositedLayerMapping->setNeedsGraphicsLayerUpdate(GraphicsLayerUpdateSub tree); 2522 m_compositedLayerMapping->setNeedsGraphicsLayerUpdate(GraphicsLayerUpdateSub tree);
2520 2523
2521 updateOrRemoveFilterEffectRenderer(); 2524 updateOrRemoveFilterEffectRenderer();
2522 } 2525 }
2523 2526
2524 void RenderLayer::clearCompositedLayerMapping(bool layerBeingDestroyed) 2527 void Layer::clearCompositedLayerMapping(bool layerBeingDestroyed)
2525 { 2528 {
2526 if (!layerBeingDestroyed) { 2529 if (!layerBeingDestroyed) {
2527 // We need to make sure our decendants get a geometry update. In princip le, 2530 // We need to make sure our decendants get a geometry update. In princip le,
2528 // we could call setNeedsGraphicsLayerUpdate on our children, but that w ould 2531 // we could call setNeedsGraphicsLayerUpdate on our children, but that w ould
2529 // require walking the z-order lists to find them. Instead, we over-inva lidate 2532 // require walking the z-order lists to find them. Instead, we over-inva lidate
2530 // by marking our parent as needing a geometry update. 2533 // by marking our parent as needing a geometry update.
2531 if (RenderLayer* compositingParent = enclosingLayerWithCompositedLayerMa pping(ExcludeSelf)) 2534 if (Layer* compositingParent = enclosingLayerWithCompositedLayerMapping( ExcludeSelf))
2532 compositingParent->compositedLayerMapping()->setNeedsGraphicsLayerUp date(GraphicsLayerUpdateSubtree); 2535 compositingParent->compositedLayerMapping()->setNeedsGraphicsLayerUp date(GraphicsLayerUpdateSubtree);
2533 } 2536 }
2534 2537
2535 m_compositedLayerMapping.clear(); 2538 m_compositedLayerMapping.clear();
2536 2539
2537 if (!layerBeingDestroyed) 2540 if (!layerBeingDestroyed)
2538 updateOrRemoveFilterEffectRenderer(); 2541 updateOrRemoveFilterEffectRenderer();
2539 } 2542 }
2540 2543
2541 void RenderLayer::setGroupedMapping(CompositedLayerMapping* groupedMapping, bool layerBeingDestroyed) 2544 void Layer::setGroupedMapping(CompositedLayerMapping* groupedMapping, bool layer BeingDestroyed)
2542 { 2545 {
2543 if (groupedMapping == m_groupedMapping) 2546 if (groupedMapping == m_groupedMapping)
2544 return; 2547 return;
2545 2548
2546 if (!layerBeingDestroyed && m_groupedMapping) { 2549 if (!layerBeingDestroyed && m_groupedMapping) {
2547 m_groupedMapping->setNeedsGraphicsLayerUpdate(GraphicsLayerUpdateSubtree ); 2550 m_groupedMapping->setNeedsGraphicsLayerUpdate(GraphicsLayerUpdateSubtree );
2548 m_groupedMapping->removeRenderLayerFromSquashingGraphicsLayer(this); 2551 m_groupedMapping->removeLayerFromSquashingGraphicsLayer(this);
2549 } 2552 }
2550 m_groupedMapping = groupedMapping; 2553 m_groupedMapping = groupedMapping;
2551 if (!layerBeingDestroyed && m_groupedMapping) 2554 if (!layerBeingDestroyed && m_groupedMapping)
2552 m_groupedMapping->setNeedsGraphicsLayerUpdate(GraphicsLayerUpdateSubtree ); 2555 m_groupedMapping->setNeedsGraphicsLayerUpdate(GraphicsLayerUpdateSubtree );
2553 } 2556 }
2554 2557
2555 bool RenderLayer::hasCompositedMask() const 2558 bool Layer::hasCompositedMask() const
2556 { 2559 {
2557 return m_compositedLayerMapping && m_compositedLayerMapping->hasMaskLayer(); 2560 return m_compositedLayerMapping && m_compositedLayerMapping->hasMaskLayer();
2558 } 2561 }
2559 2562
2560 bool RenderLayer::hasCompositedClippingMask() const 2563 bool Layer::hasCompositedClippingMask() const
2561 { 2564 {
2562 return m_compositedLayerMapping && m_compositedLayerMapping->hasChildClippin gMaskLayer(); 2565 return m_compositedLayerMapping && m_compositedLayerMapping->hasChildClippin gMaskLayer();
2563 } 2566 }
2564 2567
2565 bool RenderLayer::paintsWithTransform(PaintBehavior paintBehavior) const 2568 bool Layer::paintsWithTransform(PaintBehavior paintBehavior) const
2566 { 2569 {
2567 return transform() && ((paintBehavior & PaintBehaviorFlattenCompositingLayer s) || compositingState() != PaintsIntoOwnBacking); 2570 return transform() && ((paintBehavior & PaintBehaviorFlattenCompositingLayer s) || compositingState() != PaintsIntoOwnBacking);
2568 } 2571 }
2569 2572
2570 bool RenderLayer::backgroundIsKnownToBeOpaqueInRect(const LayoutRect& localRect) const 2573 bool Layer::backgroundIsKnownToBeOpaqueInRect(const LayoutRect& localRect) const
2571 { 2574 {
2572 if (!isSelfPaintingLayer() && !hasSelfPaintingLayerDescendant()) 2575 if (!isSelfPaintingLayer() && !hasSelfPaintingLayerDescendant())
2573 return false; 2576 return false;
2574 2577
2575 if (paintsWithTransparency(PaintBehaviorNormal)) 2578 if (paintsWithTransparency(PaintBehaviorNormal))
2576 return false; 2579 return false;
2577 2580
2578 // We can't use hasVisibleContent(), because that will be true if our render er is hidden, but some child 2581 // We can't use hasVisibleContent(), because that will be true if our render er is hidden, but some child
2579 // is visible and that child doesn't cover the entire rect. 2582 // is visible and that child doesn't cover the entire rect.
2580 if (renderer()->style()->visibility() != VISIBLE) 2583 if (renderer()->style()->visibility() != VISIBLE)
(...skipping 18 matching lines...) Expand all
2599 return true; 2602 return true;
2600 2603
2601 // We can't consult child layers if we clip, since they might cover 2604 // We can't consult child layers if we clip, since they might cover
2602 // parts of the rect that are clipped out. 2605 // parts of the rect that are clipped out.
2603 if (renderer()->hasOverflowClip()) 2606 if (renderer()->hasOverflowClip())
2604 return false; 2607 return false;
2605 2608
2606 return childBackgroundIsKnownToBeOpaqueInRect(localRect); 2609 return childBackgroundIsKnownToBeOpaqueInRect(localRect);
2607 } 2610 }
2608 2611
2609 bool RenderLayer::childBackgroundIsKnownToBeOpaqueInRect(const LayoutRect& local Rect) const 2612 bool Layer::childBackgroundIsKnownToBeOpaqueInRect(const LayoutRect& localRect) const
2610 { 2613 {
2611 RenderLayerStackingNodeReverseIterator revertseIterator(*m_stackingNode, Pos itiveZOrderChildren | NormalFlowChildren | NegativeZOrderChildren); 2614 LayerStackingNodeReverseIterator revertseIterator(*m_stackingNode, PositiveZ OrderChildren | NormalFlowChildren | NegativeZOrderChildren);
2612 while (RenderLayerStackingNode* child = revertseIterator.next()) { 2615 while (LayerStackingNode* child = revertseIterator.next()) {
2613 const RenderLayer* childLayer = child->layer(); 2616 const Layer* childLayer = child->layer();
2614 // Stop at composited paint boundaries. 2617 // Stop at composited paint boundaries.
2615 if (childLayer->isPaintInvalidationContainer()) 2618 if (childLayer->isPaintInvalidationContainer())
2616 continue; 2619 continue;
2617 2620
2618 if (!childLayer->canUseConvertToLayerCoords()) 2621 if (!childLayer->canUseConvertToLayerCoords())
2619 continue; 2622 continue;
2620 2623
2621 LayoutPoint childOffset; 2624 LayoutPoint childOffset;
2622 LayoutRect childLocalRect(localRect); 2625 LayoutRect childLocalRect(localRect);
2623 childLayer->convertToLayerCoords(this, childOffset); 2626 childLayer->convertToLayerCoords(this, childOffset);
2624 childLocalRect.moveBy(-childOffset); 2627 childLocalRect.moveBy(-childOffset);
2625 2628
2626 if (childLayer->backgroundIsKnownToBeOpaqueInRect(childLocalRect)) 2629 if (childLayer->backgroundIsKnownToBeOpaqueInRect(childLocalRect))
2627 return true; 2630 return true;
2628 } 2631 }
2629 return false; 2632 return false;
2630 } 2633 }
2631 2634
2632 bool RenderLayer::shouldBeSelfPaintingLayer() const 2635 bool Layer::shouldBeSelfPaintingLayer() const
2633 { 2636 {
2634 if (renderer()->isRenderPart() && toRenderPart(renderer())->requiresAccelera tedCompositing()) 2637 if (renderer()->isRenderPart() && toRenderPart(renderer())->requiresAccelera tedCompositing())
2635 return true; 2638 return true;
2636 return m_layerType == NormalLayer 2639 return m_layerType == NormalLayer
2637 || (m_scrollableArea && m_scrollableArea->hasOverlayScrollbars()) 2640 || (m_scrollableArea && m_scrollableArea->hasOverlayScrollbars())
2638 || needsCompositedScrolling(); 2641 || needsCompositedScrolling();
2639 } 2642 }
2640 2643
2641 void RenderLayer::updateSelfPaintingLayer() 2644 void Layer::updateSelfPaintingLayer()
2642 { 2645 {
2643 bool isSelfPaintingLayer = shouldBeSelfPaintingLayer(); 2646 bool isSelfPaintingLayer = shouldBeSelfPaintingLayer();
2644 if (this->isSelfPaintingLayer() == isSelfPaintingLayer) 2647 if (this->isSelfPaintingLayer() == isSelfPaintingLayer)
2645 return; 2648 return;
2646 2649
2647 m_isSelfPaintingLayer = isSelfPaintingLayer; 2650 m_isSelfPaintingLayer = isSelfPaintingLayer;
2648 2651
2649 if (parent()) 2652 if (parent())
2650 parent()->dirtyAncestorChainHasSelfPaintingLayerDescendantStatus(); 2653 parent()->dirtyAncestorChainHasSelfPaintingLayerDescendantStatus();
2651 } 2654 }
2652 2655
2653 bool RenderLayer::hasNonEmptyChildRenderers() const 2656 bool Layer::hasNonEmptyChildRenderers() const
2654 { 2657 {
2655 // Some HTML can cause whitespace text nodes to have renderers, like: 2658 // Some HTML can cause whitespace text nodes to have renderers, like:
2656 // <div> 2659 // <div>
2657 // <img src=...> 2660 // <img src=...>
2658 // </div> 2661 // </div>
2659 // so test for 0x0 RenderTexts here 2662 // so test for 0x0 RenderTexts here
2660 for (RenderObject* child = renderer()->slowFirstChild(); child; child = chil d->nextSibling()) { 2663 for (RenderObject* child = renderer()->slowFirstChild(); child; child = chil d->nextSibling()) {
2661 if (!child->hasLayer()) { 2664 if (!child->hasLayer()) {
2662 if (child->isRenderInline() || !child->isBox()) 2665 if (child->isRenderInline() || !child->isBox())
2663 return true; 2666 return true;
2664 2667
2665 if (!toRenderBox(child)->size().isEmpty()) 2668 if (!toRenderBox(child)->size().isEmpty())
2666 return true; 2669 return true;
2667 } 2670 }
2668 } 2671 }
2669 return false; 2672 return false;
2670 } 2673 }
2671 2674
2672 bool RenderLayer::hasBoxDecorationsOrBackground() const 2675 bool Layer::hasBoxDecorationsOrBackground() const
2673 { 2676 {
2674 return renderer()->style()->hasBoxDecorations() || renderer()->style()->hasB ackground(); 2677 return renderer()->style()->hasBoxDecorations() || renderer()->style()->hasB ackground();
2675 } 2678 }
2676 2679
2677 bool RenderLayer::hasVisibleBoxDecorations() const 2680 bool Layer::hasVisibleBoxDecorations() const
2678 { 2681 {
2679 if (!hasVisibleContent()) 2682 if (!hasVisibleContent())
2680 return false; 2683 return false;
2681 2684
2682 return hasBoxDecorationsOrBackground() || hasOverflowControls(); 2685 return hasBoxDecorationsOrBackground() || hasOverflowControls();
2683 } 2686 }
2684 2687
2685 void RenderLayer::updateFilters(const RenderStyle* oldStyle, const RenderStyle* newStyle) 2688 void Layer::updateFilters(const RenderStyle* oldStyle, const RenderStyle* newSty le)
2686 { 2689 {
2687 if (!newStyle->hasFilter() && (!oldStyle || !oldStyle->hasFilter())) 2690 if (!newStyle->hasFilter() && (!oldStyle || !oldStyle->hasFilter()))
2688 return; 2691 return;
2689 2692
2690 updateOrRemoveFilterClients(); 2693 updateOrRemoveFilterClients();
2691 updateOrRemoveFilterEffectRenderer(); 2694 updateOrRemoveFilterEffectRenderer();
2692 } 2695 }
2693 2696
2694 bool RenderLayer::attemptDirectCompositingUpdate(StyleDifference diff, const Ren derStyle* oldStyle) 2697 bool Layer::attemptDirectCompositingUpdate(StyleDifference diff, const RenderSty le* oldStyle)
2695 { 2698 {
2696 CompositingReasons oldPotentialCompositingReasonsFromStyle = m_potentialComp ositingReasonsFromStyle; 2699 CompositingReasons oldPotentialCompositingReasonsFromStyle = m_potentialComp ositingReasonsFromStyle;
2697 compositor()->updatePotentialCompositingReasonsFromStyle(this); 2700 compositor()->updatePotentialCompositingReasonsFromStyle(this);
2698 2701
2699 // This function implements an optimization for transforms and opacity. 2702 // This function implements an optimization for transforms and opacity.
2700 // A common pattern is for a touchmove handler to update the transform 2703 // A common pattern is for a touchmove handler to update the transform
2701 // and/or an opacity of an element every frame while the user moves their 2704 // and/or an opacity of an element every frame while the user moves their
2702 // finger across the screen. The conditions below recognize when the 2705 // finger across the screen. The conditions below recognize when the
2703 // compositing state is set up to receive a direct transform or opacity 2706 // compositing state is set up to receive a direct transform or opacity
2704 // update. 2707 // update.
(...skipping 20 matching lines...) Expand all
2725 2728
2726 // To cut off almost all the work in the compositing update for 2729 // To cut off almost all the work in the compositing update for
2727 // this case, we treat inline transforms has having assumed overlap 2730 // this case, we treat inline transforms has having assumed overlap
2728 // (similar to how we treat animated transforms). Notice that we read 2731 // (similar to how we treat animated transforms). Notice that we read
2729 // CompositingReasonInlineTransform from the m_compositingReasons, which 2732 // CompositingReasonInlineTransform from the m_compositingReasons, which
2730 // means that the inline transform actually triggered assumed overlap in 2733 // means that the inline transform actually triggered assumed overlap in
2731 // the overlap map. 2734 // the overlap map.
2732 if (diff.transformChanged() && !(m_compositingReasons & CompositingReasonInl ineTransform)) 2735 if (diff.transformChanged() && !(m_compositingReasons & CompositingReasonInl ineTransform))
2733 return false; 2736 return false;
2734 2737
2735 // We composite transparent RenderLayers differently from non-transparent 2738 // We composite transparent Layers differently from non-transparent
2736 // RenderLayers even when the non-transparent RenderLayers are already a 2739 // Layers even when the non-transparent Layers are already a
2737 // stacking context. 2740 // stacking context.
2738 if (diff.opacityChanged() && m_renderer->style()->hasOpacity() != oldStyle-> hasOpacity()) 2741 if (diff.opacityChanged() && m_renderer->style()->hasOpacity() != oldStyle-> hasOpacity())
2739 return false; 2742 return false;
2740 2743
2741 updateTransform(oldStyle, renderer()->style()); 2744 updateTransform(oldStyle, renderer()->style());
2742 2745
2743 // FIXME: Consider introducing a smaller graphics layer update scope 2746 // FIXME: Consider introducing a smaller graphics layer update scope
2744 // that just handles transforms and opacity. GraphicsLayerUpdateLocal 2747 // that just handles transforms and opacity. GraphicsLayerUpdateLocal
2745 // will also program bounds, clips, and many other properties that could 2748 // will also program bounds, clips, and many other properties that could
2746 // not possibly have changed. 2749 // not possibly have changed.
2747 m_compositedLayerMapping->setNeedsGraphicsLayerUpdate(GraphicsLayerUpdateLoc al); 2750 m_compositedLayerMapping->setNeedsGraphicsLayerUpdate(GraphicsLayerUpdateLoc al);
2748 compositor()->setNeedsCompositingUpdate(CompositingUpdateAfterGeometryChange ); 2751 compositor()->setNeedsCompositingUpdate(CompositingUpdateAfterGeometryChange );
2749 return true; 2752 return true;
2750 } 2753 }
2751 2754
2752 void RenderLayer::styleChanged(StyleDifference diff, const RenderStyle* oldStyle ) 2755 void Layer::styleChanged(StyleDifference diff, const RenderStyle* oldStyle)
2753 { 2756 {
2754 if (attemptDirectCompositingUpdate(diff, oldStyle)) 2757 if (attemptDirectCompositingUpdate(diff, oldStyle))
2755 return; 2758 return;
2756 2759
2757 m_stackingNode->updateIsNormalFlowOnly(); 2760 m_stackingNode->updateIsNormalFlowOnly();
2758 m_stackingNode->updateStackingNodesAfterStyleChange(oldStyle); 2761 m_stackingNode->updateStackingNodesAfterStyleChange(oldStyle);
2759 2762
2760 if (m_scrollableArea) 2763 if (m_scrollableArea)
2761 m_scrollableArea->updateAfterStyleChange(oldStyle); 2764 m_scrollableArea->updateAfterStyleChange(oldStyle);
2762 2765
2763 // Overlay scrollbars can make this layer self-painting so we need 2766 // Overlay scrollbars can make this layer self-painting so we need
2764 // to recompute the bit once scrollbars have been updated. 2767 // to recompute the bit once scrollbars have been updated.
2765 updateSelfPaintingLayer(); 2768 updateSelfPaintingLayer();
2766 2769
2767 if (!oldStyle || !renderer()->style()->reflectionDataEquivalent(oldStyle)) { 2770 if (!oldStyle || !renderer()->style()->reflectionDataEquivalent(oldStyle)) {
2768 ASSERT(!oldStyle || diff.needsFullLayout()); 2771 ASSERT(!oldStyle || diff.needsFullLayout());
2769 updateReflectionInfo(oldStyle); 2772 updateReflectionInfo(oldStyle);
2770 } 2773 }
2771 2774
2772 updateDescendantDependentFlags(); 2775 updateDescendantDependentFlags();
2773 2776
2774 updateTransform(oldStyle, renderer()->style()); 2777 updateTransform(oldStyle, renderer()->style());
2775 updateFilters(oldStyle, renderer()->style()); 2778 updateFilters(oldStyle, renderer()->style());
2776 2779
2777 setNeedsCompositingInputsUpdate(); 2780 setNeedsCompositingInputsUpdate();
2778 } 2781 }
2779 2782
2780 bool RenderLayer::scrollsOverflow() const 2783 bool Layer::scrollsOverflow() const
2781 { 2784 {
2782 if (RenderLayerScrollableArea* scrollableArea = this->scrollableArea()) 2785 if (LayerScrollableArea* scrollableArea = this->scrollableArea())
2783 return scrollableArea->scrollsOverflow(); 2786 return scrollableArea->scrollsOverflow();
2784 2787
2785 return false; 2788 return false;
2786 } 2789 }
2787 2790
2788 FilterOperations RenderLayer::computeFilterOperations(const RenderStyle* style) 2791 FilterOperations Layer::computeFilterOperations(const RenderStyle* style)
2789 { 2792 {
2790 const FilterOperations& filters = style->filter(); 2793 const FilterOperations& filters = style->filter();
2791 if (filters.hasReferenceFilter()) { 2794 if (filters.hasReferenceFilter()) {
2792 for (size_t i = 0; i < filters.size(); ++i) { 2795 for (size_t i = 0; i < filters.size(); ++i) {
2793 FilterOperation* filterOperation = filters.operations().at(i).get(); 2796 FilterOperation* filterOperation = filters.operations().at(i).get();
2794 if (filterOperation->type() != FilterOperation::REFERENCE) 2797 if (filterOperation->type() != FilterOperation::REFERENCE)
2795 continue; 2798 continue;
2796 ReferenceFilterOperation* referenceOperation = toReferenceFilterOper ation(filterOperation); 2799 ReferenceFilterOperation* referenceOperation = toReferenceFilterOper ation(filterOperation);
2797 // FIXME: Cache the ReferenceFilter if it didn't change. 2800 // FIXME: Cache the ReferenceFilter if it didn't change.
2798 RefPtrWillBeRawPtr<ReferenceFilter> referenceFilter = ReferenceFilte r::create(style->effectiveZoom()); 2801 RefPtrWillBeRawPtr<ReferenceFilter> referenceFilter = ReferenceFilte r::create(style->effectiveZoom());
2799 referenceFilter->setLastEffect(ReferenceFilterBuilder::build(referen ceFilter.get(), renderer(), referenceFilter->sourceGraphic(), 2802 referenceFilter->setLastEffect(ReferenceFilterBuilder::build(referen ceFilter.get(), renderer(), referenceFilter->sourceGraphic(),
2800 referenceOperation)); 2803 referenceOperation));
2801 referenceOperation->setFilter(referenceFilter.release()); 2804 referenceOperation->setFilter(referenceFilter.release());
2802 } 2805 }
2803 } 2806 }
2804 2807
2805 return filters; 2808 return filters;
2806 } 2809 }
2807 2810
2808 void RenderLayer::updateOrRemoveFilterClients() 2811 void Layer::updateOrRemoveFilterClients()
2809 { 2812 {
2810 if (!hasFilter()) { 2813 if (!hasFilter()) {
2811 removeFilterInfoIfNeeded(); 2814 removeFilterInfoIfNeeded();
2812 return; 2815 return;
2813 } 2816 }
2814 2817
2815 if (renderer()->style()->filter().hasReferenceFilter()) 2818 if (renderer()->style()->filter().hasReferenceFilter())
2816 ensureFilterInfo()->updateReferenceFilterClients(renderer()->style()->fi lter()); 2819 ensureFilterInfo()->updateReferenceFilterClients(renderer()->style()->fi lter());
2817 else if (hasFilterInfo()) 2820 else if (hasFilterInfo())
2818 filterInfo()->removeReferenceFilterClients(); 2821 filterInfo()->removeReferenceFilterClients();
2819 } 2822 }
2820 2823
2821 void RenderLayer::updateOrRemoveFilterEffectRenderer() 2824 void Layer::updateOrRemoveFilterEffectRenderer()
2822 { 2825 {
2823 // FilterEffectRenderer is only used to render the filters in software mode, 2826 // FilterEffectRenderer is only used to render the filters in software mode,
2824 // so we always need to run updateOrRemoveFilterEffectRenderer after the com posited 2827 // so we always need to run updateOrRemoveFilterEffectRenderer after the com posited
2825 // mode might have changed for this layer. 2828 // mode might have changed for this layer.
2826 if (!paintsWithFilters()) { 2829 if (!paintsWithFilters()) {
2827 // Don't delete the whole filter info here, because we might use it 2830 // Don't delete the whole filter info here, because we might use it
2828 // for loading CSS shader files. 2831 // for loading CSS shader files.
2829 if (RenderLayerFilterInfo* filterInfo = this->filterInfo()) 2832 if (LayerFilterInfo* filterInfo = this->filterInfo())
2830 filterInfo->setRenderer(nullptr); 2833 filterInfo->setRenderer(nullptr);
2831 2834
2832 return; 2835 return;
2833 } 2836 }
2834 2837
2835 RenderLayerFilterInfo* filterInfo = ensureFilterInfo(); 2838 LayerFilterInfo* filterInfo = ensureFilterInfo();
2836 if (!filterInfo->renderer()) { 2839 if (!filterInfo->renderer()) {
2837 RefPtrWillBeRawPtr<FilterEffectRenderer> filterRenderer = FilterEffectRe nderer::create(); 2840 RefPtrWillBeRawPtr<FilterEffectRenderer> filterRenderer = FilterEffectRe nderer::create();
2838 filterInfo->setRenderer(filterRenderer.release()); 2841 filterInfo->setRenderer(filterRenderer.release());
2839 } 2842 }
2840 2843
2841 // If the filter fails to build, remove it from the layer. It will still att empt to 2844 // If the filter fails to build, remove it from the layer. It will still att empt to
2842 // go through regular processing (e.g. compositing), but never apply anythin g. 2845 // go through regular processing (e.g. compositing), but never apply anythin g.
2843 if (!filterInfo->renderer()->build(renderer(), computeFilterOperations(rende rer()->style()))) 2846 if (!filterInfo->renderer()->build(renderer(), computeFilterOperations(rende rer()->style())))
2844 filterInfo->setRenderer(nullptr); 2847 filterInfo->setRenderer(nullptr);
2845 } 2848 }
2846 2849
2847 void RenderLayer::filterNeedsPaintInvalidation() 2850 void Layer::filterNeedsPaintInvalidation()
2848 { 2851 {
2849 { 2852 {
2850 DeprecatedScheduleStyleRecalcDuringLayout marker(renderer()->document(). lifecycle()); 2853 DeprecatedScheduleStyleRecalcDuringLayout marker(renderer()->document(). lifecycle());
2851 // It's possible for scheduleSVGFilterLayerUpdateHack to schedule a styl e recalc, which 2854 // It's possible for scheduleSVGFilterLayerUpdateHack to schedule a styl e recalc, which
2852 // is a problem because this function can be called while performing lay out. 2855 // is a problem because this function can be called while performing lay out.
2853 // Presumably this represents an illegal data flow of layout or composit ing 2856 // Presumably this represents an illegal data flow of layout or composit ing
2854 // information into the style system. 2857 // information into the style system.
2855 toElement(renderer()->node())->scheduleSVGFilterLayerUpdateHack(); 2858 toElement(renderer()->node())->scheduleSVGFilterLayerUpdateHack();
2856 } 2859 }
2857 2860
2858 renderer()->setShouldDoFullPaintInvalidation(); 2861 renderer()->setShouldDoFullPaintInvalidation();
2859 } 2862 }
2860 2863
2861 void RenderLayer::addLayerHitTestRects(LayerHitTestRects& rects) const 2864 void Layer::addLayerHitTestRects(LayerHitTestRects& rects) const
2862 { 2865 {
2863 computeSelfHitTestRects(rects); 2866 computeSelfHitTestRects(rects);
2864 for (RenderLayer* child = firstChild(); child; child = child->nextSibling()) 2867 for (Layer* child = firstChild(); child; child = child->nextSibling())
2865 child->addLayerHitTestRects(rects); 2868 child->addLayerHitTestRects(rects);
2866 } 2869 }
2867 2870
2868 void RenderLayer::computeSelfHitTestRects(LayerHitTestRects& rects) const 2871 void Layer::computeSelfHitTestRects(LayerHitTestRects& rects) const
2869 { 2872 {
2870 if (!size().isEmpty()) { 2873 if (!size().isEmpty()) {
2871 Vector<LayoutRect> rect; 2874 Vector<LayoutRect> rect;
2872 2875
2873 if (renderBox() && renderBox()->scrollsOverflow()) { 2876 if (renderBox() && renderBox()->scrollsOverflow()) {
2874 // For scrolling layers, rects are taken to be in the space of the c ontents. 2877 // For scrolling layers, rects are taken to be in the space of the c ontents.
2875 // We need to include the bounding box of the layer in the space of its parent 2878 // We need to include the bounding box of the layer in the space of its parent
2876 // (eg. for border / scroll bars) and if it's composited then the en tire contents 2879 // (eg. for border / scroll bars) and if it's composited then the en tire contents
2877 // as well as they may be on another composited layer. Skip reportin g contents 2880 // as well as they may be on another composited layer. Skip reportin g contents
2878 // for non-composited layers as they'll get projected to the same la yer as the 2881 // for non-composited layers as they'll get projected to the same la yer as the
2879 // bounding box. 2882 // bounding box.
2880 if (compositingState() != NotComposited) 2883 if (compositingState() != NotComposited)
2881 rect.append(m_scrollableArea->overflowRect()); 2884 rect.append(m_scrollableArea->overflowRect());
2882 2885
2883 rects.set(this, rect); 2886 rects.set(this, rect);
2884 if (const RenderLayer* parentLayer = parent()) { 2887 if (const Layer* parentLayer = parent()) {
2885 LayerHitTestRects::iterator iter = rects.find(parentLayer); 2888 LayerHitTestRects::iterator iter = rects.find(parentLayer);
2886 if (iter == rects.end()) { 2889 if (iter == rects.end()) {
2887 rects.add(parentLayer, Vector<LayoutRect>()).storedValue->va lue.append(physicalBoundingBox(parentLayer)); 2890 rects.add(parentLayer, Vector<LayoutRect>()).storedValue->va lue.append(physicalBoundingBox(parentLayer));
2888 } else { 2891 } else {
2889 iter->value.append(physicalBoundingBox(parentLayer)); 2892 iter->value.append(physicalBoundingBox(parentLayer));
2890 } 2893 }
2891 } 2894 }
2892 } else { 2895 } else {
2893 rect.append(logicalBoundingBox()); 2896 rect.append(logicalBoundingBox());
2894 rects.set(this, rect); 2897 rects.set(this, rect);
2895 } 2898 }
2896 } 2899 }
2897 } 2900 }
2898 2901
2899 void RenderLayer::setShouldDoFullPaintInvalidationIncludingNonCompositingDescend ants() 2902 void Layer::setShouldDoFullPaintInvalidationIncludingNonCompositingDescendants()
2900 { 2903 {
2901 renderer()->setShouldDoFullPaintInvalidation(); 2904 renderer()->setShouldDoFullPaintInvalidation();
2902 2905
2903 // Disable for reading compositingState() in isPaintInvalidationContainer() below. 2906 // Disable for reading compositingState() in isPaintInvalidationContainer() below.
2904 DisableCompositingQueryAsserts disabler; 2907 DisableCompositingQueryAsserts disabler;
2905 2908
2906 for (RenderLayer* child = firstChild(); child; child = child->nextSibling()) { 2909 for (Layer* child = firstChild(); child; child = child->nextSibling()) {
2907 if (!child->isPaintInvalidationContainer()) 2910 if (!child->isPaintInvalidationContainer())
2908 child->setShouldDoFullPaintInvalidationIncludingNonCompositingDescen dants(); 2911 child->setShouldDoFullPaintInvalidationIncludingNonCompositingDescen dants();
2909 } 2912 }
2910 } 2913 }
2911 2914
2912 DisableCompositingQueryAsserts::DisableCompositingQueryAsserts() 2915 DisableCompositingQueryAsserts::DisableCompositingQueryAsserts()
2913 : m_disabler(gCompositingQueryMode, CompositingQueriesAreAllowed) { } 2916 : m_disabler(gCompositingQueryMode, CompositingQueriesAreAllowed) { }
2914 2917
2915 } // namespace blink 2918 } // namespace blink
2916 2919
2917 #ifndef NDEBUG 2920 #ifndef NDEBUG
2918 void showLayerTree(const blink::RenderLayer* layer) 2921 void showLayerTree(const blink::Layer* layer)
2919 { 2922 {
2920 if (!layer) 2923 if (!layer)
2921 return; 2924 return;
2922 2925
2923 if (blink::LocalFrame* frame = layer->renderer()->frame()) { 2926 if (blink::LocalFrame* frame = layer->renderer()->frame()) {
2924 WTF::String output = externalRepresentation(frame, blink::LayoutAsTextSh owAllLayers | blink::LayoutAsTextShowLayerNesting | blink::LayoutAsTextShowCompo sitedLayers | blink::LayoutAsTextShowAddresses | blink::LayoutAsTextShowIDAndCla ss | blink::LayoutAsTextDontUpdateLayout | blink::LayoutAsTextShowLayoutState); 2927 WTF::String output = externalRepresentation(frame, blink::LayoutAsTextSh owAllLayers | blink::LayoutAsTextShowLayerNesting | blink::LayoutAsTextShowCompo sitedLayers | blink::LayoutAsTextShowAddresses | blink::LayoutAsTextShowIDAndCla ss | blink::LayoutAsTextDontUpdateLayout | blink::LayoutAsTextShowLayoutState);
2925 fprintf(stderr, "%s\n", output.utf8().data()); 2928 fprintf(stderr, "%s\n", output.utf8().data());
2926 } 2929 }
2927 } 2930 }
2928 2931
2929 void showLayerTree(const blink::RenderObject* renderer) 2932 void showLayerTree(const blink::RenderObject* renderer)
2930 { 2933 {
2931 if (!renderer) 2934 if (!renderer)
2932 return; 2935 return;
2933 showLayerTree(renderer->enclosingLayer()); 2936 showLayerTree(renderer->enclosingLayer());
2934 } 2937 }
2935 #endif 2938 #endif
OLDNEW
« no previous file with comments | « Source/core/layout/Layer.h ('k') | Source/core/layout/LayerClipper.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698