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

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

Issue 1095043003: Convert LayoutObject renderer names. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 5 years, 8 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/LayoutObject.h ('k') | Source/core/layout/LayoutView.cpp » ('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) 1999 Lars Knoll (knoll@kde.org) 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3 * (C) 1999 Antti Koivisto (koivisto@kde.org) 3 * (C) 1999 Antti Koivisto (koivisto@kde.org)
4 * (C) 2000 Dirk Mueller (mueller@kde.org) 4 * (C) 2000 Dirk Mueller (mueller@kde.org)
5 * (C) 2004 Allan Sandfeld Jensen (kde@carewolf.com) 5 * (C) 2004 Allan Sandfeld Jensen (kde@carewolf.com)
6 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2011 Apple Inc. All rights reserv ed. 6 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2011 Apple Inc. All rights reserv ed.
7 * Copyright (C) 2009 Google Inc. All rights reserved. 7 * Copyright (C) 2009 Google Inc. All rights reserved.
8 * Copyright (C) 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmo bile.com/) 8 * Copyright (C) 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmo bile.com/)
9 * 9 *
10 * This library is free software; you can redistribute it and/or 10 * This library is free software; you can redistribute it and/or
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
90 #include "wtf/text/WTFString.h" 90 #include "wtf/text/WTFString.h"
91 #include <algorithm> 91 #include <algorithm>
92 #ifndef NDEBUG 92 #ifndef NDEBUG
93 #include <stdio.h> 93 #include <stdio.h>
94 #endif 94 #endif
95 95
96 namespace blink { 96 namespace blink {
97 97
98 namespace { 98 namespace {
99 99
100 static bool gModifyRenderTreeStructureAnyState = false; 100 static bool gModifyLayoutTreeStructureAnyState = false;
101 101
102 static bool gDisablePaintInvalidationStateAsserts = false; 102 static bool gDisablePaintInvalidationStateAsserts = false;
103 103
104 } // namespace 104 } // namespace
105 105
106 using namespace HTMLNames; 106 using namespace HTMLNames;
107 107
108 #if ENABLE(ASSERT) 108 #if ENABLE(ASSERT)
109 109
110 LayoutObject::SetLayoutNeededForbiddenScope::SetLayoutNeededForbiddenScope(Layou tObject& layoutObject) 110 LayoutObject::SetLayoutNeededForbiddenScope::SetLayoutNeededForbiddenScope(Layou tObject& layoutObject)
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
146 } 146 }
147 147
148 void LayoutObject::operator delete(void* ptr) 148 void LayoutObject::operator delete(void* ptr)
149 { 149 {
150 ASSERT(isMainThread()); 150 ASSERT(isMainThread());
151 partitionFree(ptr); 151 partitionFree(ptr);
152 } 152 }
153 153
154 LayoutObject* LayoutObject::createObject(Element* element, const ComputedStyle& style) 154 LayoutObject* LayoutObject::createObject(Element* element, const ComputedStyle& style)
155 { 155 {
156 ASSERT(isAllowedToModifyRenderTreeStructure(element->document())); 156 ASSERT(isAllowedToModifyLayoutTreeStructure(element->document()));
157 157
158 // Minimal support for content properties replacing an entire element. 158 // Minimal support for content properties replacing an entire element.
159 // Works only if we have exactly one piece of content and it's a URL. 159 // Works only if we have exactly one piece of content and it's a URL.
160 // Otherwise acts as if we didn't support this feature. 160 // Otherwise acts as if we didn't support this feature.
161 const ContentData* contentData = style.contentData(); 161 const ContentData* contentData = style.contentData();
162 if (contentData && !contentData->next() && contentData->isImage() && !elemen t->isPseudoElement()) { 162 if (contentData && !contentData->next() && contentData->isImage() && !elemen t->isPseudoElement()) {
163 LayoutImage* image = new LayoutImage(element); 163 LayoutImage* image = new LayoutImage(element);
164 // LayoutImageResourceStyleImage requires a style being present on the i mage but we don't want to 164 // LayoutImageResourceStyleImage requires a style being present on the i mage but we don't want to
165 // trigger a style change now as the node is not fully attached. Moving this code to style change 165 // trigger a style change now as the node is not fully attached. Moving this code to style change
166 // doesn't make sense as it should be run once at renderer creation. 166 // doesn't make sense as it should be run once at layoutObject creation.
167 image->setStyleInternal(const_cast<ComputedStyle*>(&style)); 167 image->setStyleInternal(const_cast<ComputedStyle*>(&style));
168 if (const StyleImage* styleImage = toImageContentData(contentData)->imag e()) { 168 if (const StyleImage* styleImage = toImageContentData(contentData)->imag e()) {
169 image->setImageResource(LayoutImageResourceStyleImage::create(const_ cast<StyleImage*>(styleImage))); 169 image->setImageResource(LayoutImageResourceStyleImage::create(const_ cast<StyleImage*>(styleImage)));
170 image->setIsGeneratedContent(); 170 image->setIsGeneratedContent();
171 } else { 171 } else {
172 image->setImageResource(LayoutImageResource::create()); 172 image->setImageResource(LayoutImageResource::create());
173 } 173 }
174 image->setStyleInternal(nullptr); 174 image->setStyleInternal(nullptr);
175 return image; 175 return image;
176 } 176 }
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
296 return !isTable(); 296 return !isTable();
297 if (newChild->isTableRow()) 297 if (newChild->isTableRow())
298 return !isTableSection(); 298 return !isTableSection();
299 if (newChild->isTableCell()) 299 if (newChild->isTableCell())
300 return !isTableRow(); 300 return !isTableRow();
301 return false; 301 return false;
302 } 302 }
303 303
304 void LayoutObject::addChild(LayoutObject* newChild, LayoutObject* beforeChild) 304 void LayoutObject::addChild(LayoutObject* newChild, LayoutObject* beforeChild)
305 { 305 {
306 ASSERT(isAllowedToModifyRenderTreeStructure(document())); 306 ASSERT(isAllowedToModifyLayoutTreeStructure(document()));
307 307
308 LayoutObjectChildList* children = virtualChildren(); 308 LayoutObjectChildList* children = virtualChildren();
309 ASSERT(children); 309 ASSERT(children);
310 if (!children) 310 if (!children)
311 return; 311 return;
312 312
313 if (requiresAnonymousTableWrappers(newChild)) { 313 if (requiresAnonymousTableWrappers(newChild)) {
314 // Generate an anonymous table or reuse existing one from previous child 314 // Generate an anonymous table or reuse existing one from previous child
315 // Per: 17.2.1 Anonymous table objects 3. Generate missing parents 315 // Per: 17.2.1 Anonymous table objects 3. Generate missing parents
316 // http://www.w3.org/TR/CSS21/tables.html#anonymous-boxes 316 // http://www.w3.org/TR/CSS21/tables.html#anonymous-boxes
317 LayoutTable* table; 317 LayoutTable* table;
318 LayoutObject* afterChild = beforeChild ? beforeChild->previousSibling() : children->lastChild(); 318 LayoutObject* afterChild = beforeChild ? beforeChild->previousSibling() : children->lastChild();
319 if (afterChild && afterChild->isAnonymous() && afterChild->isTable() && !afterChild->isBeforeContent()) { 319 if (afterChild && afterChild->isAnonymous() && afterChild->isTable() && !afterChild->isBeforeContent()) {
320 table = toLayoutTable(afterChild); 320 table = toLayoutTable(afterChild);
321 } else { 321 } else {
322 table = LayoutTable::createAnonymousWithParent(this); 322 table = LayoutTable::createAnonymousWithParent(this);
323 addChild(table, beforeChild); 323 addChild(table, beforeChild);
324 } 324 }
325 table->addChild(newChild); 325 table->addChild(newChild);
326 } else { 326 } else {
327 children->insertChildNode(this, newChild, beforeChild); 327 children->insertChildNode(this, newChild, beforeChild);
328 } 328 }
329 329
330 if (newChild->isText() && newChild->style()->textTransform() == CAPITALIZE) 330 if (newChild->isText() && newChild->style()->textTransform() == CAPITALIZE)
331 toLayoutText(newChild)->transformText(); 331 toLayoutText(newChild)->transformText();
332 332
333 // SVG creates renderers for <g display="none">, as SVG requires children of hidden 333 // SVG creates layoutObjects for <g display="none">, as SVG requires childre n of hidden
334 // <g>s to have renderers - at least that's how our implementation works. Co nsider: 334 // <g>s to have layoutObjects - at least that's how our implementation works . Consider:
335 // <g display="none"><foreignObject><body style="position: relative">FOO... 335 // <g display="none"><foreignObject><body style="position: relative">FOO...
336 // - layerTypeRequired() would return true for the <body>, creating a new La yer 336 // - layerTypeRequired() would return true for the <body>, creating a new La yer
337 // - when the document is painted, both layers are painted. The <body> layer doesn't 337 // - when the document is painted, both layers are painted. The <body> layer doesn't
338 // know that it's inside a "hidden SVG subtree", and thus paints, even if it shouldn't. 338 // know that it's inside a "hidden SVG subtree", and thus paints, even if it shouldn't.
339 // To avoid the problem alltogether, detect early if we're inside a hidden S VG subtree 339 // To avoid the problem alltogether, detect early if we're inside a hidden S VG subtree
340 // and stop creating layers at all for these cases - they're not used anyway s. 340 // and stop creating layers at all for these cases - they're not used anyway s.
341 if (newChild->hasLayer() && !layerCreationAllowedForSubtree()) 341 if (newChild->hasLayer() && !layerCreationAllowedForSubtree())
342 toLayoutBoxModelObject(newChild)->layer()->removeOnlyThisLayer(); 342 toLayoutBoxModelObject(newChild)->layer()->removeOnlyThisLayer();
343 } 343 }
344 344
345 void LayoutObject::removeChild(LayoutObject* oldChild) 345 void LayoutObject::removeChild(LayoutObject* oldChild)
346 { 346 {
347 ASSERT(isAllowedToModifyRenderTreeStructure(document())); 347 ASSERT(isAllowedToModifyLayoutTreeStructure(document()));
348 348
349 LayoutObjectChildList* children = virtualChildren(); 349 LayoutObjectChildList* children = virtualChildren();
350 ASSERT(children); 350 ASSERT(children);
351 if (!children) 351 if (!children)
352 return; 352 return;
353 353
354 children->removeChildNode(this, oldChild); 354 children->removeChildNode(this, oldChild);
355 } 355 }
356 356
357 LayoutObject* LayoutObject::nextInPreOrder() const 357 LayoutObject* LayoutObject::nextInPreOrder() const
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after
534 534
535 return 0; 535 return 0;
536 } 536 }
537 537
538 DeprecatedPaintLayer* LayoutObject::enclosingLayer() const 538 DeprecatedPaintLayer* LayoutObject::enclosingLayer() const
539 { 539 {
540 for (const LayoutObject* current = this; current; current = current->parent( )) { 540 for (const LayoutObject* current = this; current; current = current->parent( )) {
541 if (current->hasLayer()) 541 if (current->hasLayer())
542 return toLayoutBoxModelObject(current)->layer(); 542 return toLayoutBoxModelObject(current)->layer();
543 } 543 }
544 // FIXME: we should get rid of detached render subtrees, at which point this code should 544 // FIXME: we should get rid of detached layout subtrees, at which point this code should
545 // not be reached. crbug.com/411429 545 // not be reached. crbug.com/411429
546 return 0; 546 return 0;
547 } 547 }
548 548
549 bool LayoutObject::scrollRectToVisible(const LayoutRect& rect, const ScrollAlign ment& alignX, const ScrollAlignment& alignY) 549 bool LayoutObject::scrollRectToVisible(const LayoutRect& rect, const ScrollAlign ment& alignX, const ScrollAlignment& alignY)
550 { 550 {
551 LayoutBox* enclosingBox = this->enclosingBox(); 551 LayoutBox* enclosingBox = this->enclosingBox();
552 if (!enclosingBox) 552 if (!enclosingBox)
553 return false; 553 return false;
554 554
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
609 // Not in the middle of layout so have to find the thread the slow way. 609 // Not in the middle of layout so have to find the thread the slow way.
610 LayoutObject* curr = const_cast<LayoutObject*>(this); 610 LayoutObject* curr = const_cast<LayoutObject*>(this);
611 while (curr) { 611 while (curr) {
612 if (curr->isLayoutFlowThread()) 612 if (curr->isLayoutFlowThread())
613 return toLayoutFlowThread(curr); 613 return toLayoutFlowThread(curr);
614 curr = curr->containingBlock(); 614 curr = curr->containingBlock();
615 } 615 }
616 return 0; 616 return 0;
617 } 617 }
618 618
619 // FIXME: This could be used when changing the size of a renderer without childr en to skip some invalidations. 619 // FIXME: This could be used when changing the size of a layoutObject without ch ildren to skip some invalidations.
620 // FIXME: This is incorrect for document element. Remove this when we enable sli mming paint. 620 // FIXME: This is incorrect for document element. Remove this when we enable sli mming paint.
621 static inline bool rendererHasNoBoxEffectObsolete(const LayoutObject& object) 621 static inline bool layoutObjectHasNoBoxEffectObsolete(const LayoutObject& object )
622 { 622 {
623 return !object.style()->hasVisualOverflowingEffect() && !object.style()->has Border() && !object.style()->hasBackground(); 623 return !object.style()->hasVisualOverflowingEffect() && !object.style()->has Border() && !object.style()->hasBackground();
624 } 624 }
625 625
626 bool LayoutObject::skipInvalidationWhenLaidOutChildren() const 626 bool LayoutObject::skipInvalidationWhenLaidOutChildren() const
627 { 627 {
628 if (!neededLayoutBecauseOfChildren()) 628 if (!neededLayoutBecauseOfChildren())
629 return false; 629 return false;
630 630
631 // SVG renderers need to be invalidated when their children are laid out. 631 // SVG layoutObjects need to be invalidated when their children are laid out .
632 // LayoutBlocks with line boxes are responsible to invalidate them so we can 't ignore them. 632 // LayoutBlocks with line boxes are responsible to invalidate them so we can 't ignore them.
633 if (isSVG() || (isLayoutBlockFlow() && toLayoutBlockFlow(this)->firstLineBox ())) 633 if (isSVG() || (isLayoutBlockFlow() && toLayoutBlockFlow(this)->firstLineBox ()))
634 return false; 634 return false;
635 635
636 // In case scrollbars got repositioned (which will typically happen if the l ayout object got 636 // In case scrollbars got repositioned (which will typically happen if the l ayout object got
637 // resized), we cannot skip invalidation. 637 // resized), we cannot skip invalidation.
638 if (hasNonCompositedScrollbars()) 638 if (hasNonCompositedScrollbars())
639 return false; 639 return false;
640 640
641 if (RuntimeEnabledFeatures::slimmingPaintEnabled() && isDocumentElement()) 641 if (RuntimeEnabledFeatures::slimmingPaintEnabled() && isDocumentElement())
642 return !hasBoxEffect(); 642 return !hasBoxEffect();
643 643
644 return rendererHasNoBoxEffectObsolete(*this); 644 return layoutObjectHasNoBoxEffectObsolete(*this);
645 } 645 }
646 646
647 LayoutBlock* LayoutObject::firstLineBlock() const 647 LayoutBlock* LayoutObject::firstLineBlock() const
648 { 648 {
649 return 0; 649 return 0;
650 } 650 }
651 651
652 static inline bool objectIsRelayoutBoundary(const LayoutObject* object) 652 static inline bool objectIsRelayoutBoundary(const LayoutObject* object)
653 { 653 {
654 // FIXME: In future it may be possible to broaden these conditions in order to improve performance. 654 // FIXME: In future it may be possible to broaden these conditions in order to improve performance.
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
718 object->setNeedsSimplifiedNormalFlowLayout(true); 718 object->setNeedsSimplifiedNormalFlowLayout(true);
719 ASSERT(!object->isSetNeedsLayoutForbidden()); 719 ASSERT(!object->isSetNeedsLayoutForbidden());
720 } else { 720 } else {
721 if (object->normalChildNeedsLayout()) 721 if (object->normalChildNeedsLayout())
722 return; 722 return;
723 object->setNormalChildNeedsLayout(true); 723 object->setNormalChildNeedsLayout(true);
724 ASSERT(!object->isSetNeedsLayoutForbidden()); 724 ASSERT(!object->isSetNeedsLayoutForbidden());
725 } 725 }
726 726
727 if (layouter) { 727 if (layouter) {
728 layouter->addRendererToLayout(object); 728 layouter->recordObjectMarkedForLayout(object);
729 if (object == layouter->root()) 729 if (object == layouter->root())
730 return; 730 return;
731 } 731 }
732 732
733 if (object == newRoot) 733 if (object == newRoot)
734 return; 734 return;
735 735
736 last = object; 736 last = object;
737 if (scheduleRelayout && objectIsRelayoutBoundary(last)) 737 if (scheduleRelayout && objectIsRelayoutBoundary(last))
738 break; 738 break;
(...skipping 595 matching lines...) Expand 10 before | Expand all | Expand 10 after
1334 setPreviousPositionFromPaintInvalidationBacking(newLocation); 1334 setPreviousPositionFromPaintInvalidationBacking(newLocation);
1335 1335
1336 PaintInvalidationReason invalidationReason = paintInvalidationReason(paintIn validationContainer, oldBounds, oldLocation, newBounds, newLocation); 1336 PaintInvalidationReason invalidationReason = paintInvalidationReason(paintIn validationContainer, oldBounds, oldLocation, newBounds, newLocation);
1337 1337
1338 // We need to invalidate the selection before checking for whether we are do ing a full invalidation. 1338 // We need to invalidate the selection before checking for whether we are do ing a full invalidation.
1339 // This is because we need to update the old rect regardless. 1339 // This is because we need to update the old rect regardless.
1340 invalidateSelectionIfNeeded(paintInvalidationContainer, invalidationReason); 1340 invalidateSelectionIfNeeded(paintInvalidationContainer, invalidationReason);
1341 1341
1342 // If we are set to do a full paint invalidation that means the LayoutView w ill issue 1342 // If we are set to do a full paint invalidation that means the LayoutView w ill issue
1343 // paint invalidations. We can then skip issuing of paint invalidations for the child 1343 // paint invalidations. We can then skip issuing of paint invalidations for the child
1344 // renderers as they'll be covered by the LayoutView. 1344 // layoutObjects as they'll be covered by the LayoutView.
1345 // However, slimming paint mode requires paint invalidation of the child ren derers. 1345 // However, slimming paint mode requires paint invalidation of the child lay outObjects.
1346 if (view()->doingFullPaintInvalidation() && !RuntimeEnabledFeatures::slimmin gPaintEnabled()) 1346 if (view()->doingFullPaintInvalidation() && !RuntimeEnabledFeatures::slimmin gPaintEnabled())
1347 return invalidationReason; 1347 return invalidationReason;
1348 1348
1349 TRACE_EVENT2(TRACE_DISABLED_BY_DEFAULT("blink.invalidation"), "LayoutObject: :invalidatePaintIfNeeded()", 1349 TRACE_EVENT2(TRACE_DISABLED_BY_DEFAULT("blink.invalidation"), "LayoutObject: :invalidatePaintIfNeeded()",
1350 "object", this->debugName().ascii(), 1350 "object", this->debugName().ascii(),
1351 "info", jsonObjectForOldAndNewRects(oldBounds, oldLocation, newBounds, n ewLocation)); 1351 "info", jsonObjectForOldAndNewRects(oldBounds, oldLocation, newBounds, n ewLocation));
1352 1352
1353 if (RuntimeEnabledFeatures::slimmingPaintEnabled()) { 1353 if (RuntimeEnabledFeatures::slimmingPaintEnabled()) {
1354 bool boxDecorationBackgroundObscured = boxDecorationBackgroundIsKnownToB eObscured(); 1354 bool boxDecorationBackgroundObscured = boxDecorationBackgroundIsKnownToB eObscured();
1355 if (!isFullPaintInvalidationReason(invalidationReason) && boxDecorationB ackgroundObscured != m_bitfields.lastBoxDecorationBackgroundObscured()) 1355 if (!isFullPaintInvalidationReason(invalidationReason) && boxDecorationB ackgroundObscured != m_bitfields.lastBoxDecorationBackgroundObscured())
(...skipping 29 matching lines...) Expand all
1385 if (shouldDoFullPaintInvalidation()) 1385 if (shouldDoFullPaintInvalidation())
1386 return m_bitfields.fullPaintInvalidationReason(); 1386 return m_bitfields.fullPaintInvalidationReason();
1387 1387
1388 // If the bounds are the same then we know that none of the statements below 1388 // If the bounds are the same then we know that none of the statements below
1389 // can match, so we can early out since we will not need to do any 1389 // can match, so we can early out since we will not need to do any
1390 // invalidation. 1390 // invalidation.
1391 if (oldBounds == newBounds) 1391 if (oldBounds == newBounds)
1392 return PaintInvalidationNone; 1392 return PaintInvalidationNone;
1393 1393
1394 // If we shifted, we don't know the exact reason so we are conservative and trigger a full invalidation. Shifting could 1394 // If we shifted, we don't know the exact reason so we are conservative and trigger a full invalidation. Shifting could
1395 // be caused by some layout property (left / top) or some in-flow renderer i nserted / removed before us in the tree. 1395 // be caused by some layout property (left / top) or some in-flow layoutObje ct inserted / removed before us in the tree.
1396 if (newBounds.location() != oldBounds.location()) 1396 if (newBounds.location() != oldBounds.location())
1397 return PaintInvalidationBoundsChange; 1397 return PaintInvalidationBoundsChange;
1398 1398
1399 // This covers the case where we mark containing blocks for layout 1399 // This covers the case where we mark containing blocks for layout
1400 // and they change size but don't have anything to paint. This is 1400 // and they change size but don't have anything to paint. This is
1401 // a pretty common case for <body> as we add / remove children 1401 // a pretty common case for <body> as we add / remove children
1402 // (and the default background is done by FrameView). 1402 // (and the default background is done by FrameView).
1403 if (skipInvalidationWhenLaidOutChildren()) 1403 if (skipInvalidationWhenLaidOutChildren())
1404 return PaintInvalidationNone; 1404 return PaintInvalidationNone;
1405 1405
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after
1604 { 1604 {
1605 return selectionColor(CSSPropertyWebkitTextEmphasisColor); 1605 return selectionColor(CSSPropertyWebkitTextEmphasisColor);
1606 } 1606 }
1607 1607
1608 void LayoutObject::selectionStartEnd(int& spos, int& epos) const 1608 void LayoutObject::selectionStartEnd(int& spos, int& epos) const
1609 { 1609 {
1610 view()->selectionStartEnd(spos, epos); 1610 view()->selectionStartEnd(spos, epos);
1611 } 1611 }
1612 1612
1613 // Called when an object that was floating or positioned becomes a normal flow o bject 1613 // Called when an object that was floating or positioned becomes a normal flow o bject
1614 // again. We have to make sure the render tree updates as needed to accommodate the new 1614 // again. We have to make sure the layout tree updates as needed to accommodate the new
1615 // normal flow object. 1615 // normal flow object.
1616 static inline void handleDynamicFloatPositionChange(LayoutObject* object) 1616 static inline void handleDynamicFloatPositionChange(LayoutObject* object)
1617 { 1617 {
1618 // We have gone from not affecting the inline status of the parent flow to s uddenly 1618 // We have gone from not affecting the inline status of the parent flow to s uddenly
1619 // having an impact. See if there is a mismatch between the parent flow's 1619 // having an impact. See if there is a mismatch between the parent flow's
1620 // childrenInline() state and our state. 1620 // childrenInline() state and our state.
1621 object->setInline(object->style()->isDisplayInlineType()); 1621 object->setInline(object->style()->isDisplayInlineType());
1622 if (object->isInline() != object->parent()->childrenInline()) { 1622 if (object->isInline() != object->parent()->childrenInline()) {
1623 if (!object->isInline()) { 1623 if (!object->isInline()) {
1624 toLayoutBoxModelObject(object->parent())->childBecameNonInline(objec t); 1624 toLayoutBoxModelObject(object->parent())->childBecameNonInline(objec t);
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after
1750 1750
1751 updateShapeImage(oldStyle ? oldStyle->shapeOutside() : 0, m_style->shapeOuts ide()); 1751 updateShapeImage(oldStyle ? oldStyle->shapeOutside() : 0, m_style->shapeOuts ide());
1752 1752
1753 bool doesNotNeedLayoutOrPaintInvalidation = !m_parent; 1753 bool doesNotNeedLayoutOrPaintInvalidation = !m_parent;
1754 1754
1755 styleDidChange(diff, oldStyle.get()); 1755 styleDidChange(diff, oldStyle.get());
1756 1756
1757 // FIXME: |this| might be destroyed here. This can currently happen for a La youtTextFragment when 1757 // FIXME: |this| might be destroyed here. This can currently happen for a La youtTextFragment when
1758 // its first-letter block gets an update in LayoutTextFragment::styleDidChan ge. For LayoutTextFragment(s), 1758 // its first-letter block gets an update in LayoutTextFragment::styleDidChan ge. For LayoutTextFragment(s),
1759 // we will safely bail out with the doesNotNeedLayoutOrPaintInvalidation fla g. We might want to broaden 1759 // we will safely bail out with the doesNotNeedLayoutOrPaintInvalidation fla g. We might want to broaden
1760 // this condition in the future as we move renderer changes out of layout an d into style changes. 1760 // this condition in the future as we move layoutObject changes out of layou t and into style changes.
1761 if (doesNotNeedLayoutOrPaintInvalidation) 1761 if (doesNotNeedLayoutOrPaintInvalidation)
1762 return; 1762 return;
1763 1763
1764 // Now that the layer (if any) has been updated, we need to adjust the diff again, 1764 // Now that the layer (if any) has been updated, we need to adjust the diff again,
1765 // check whether we should layout now, and decide if we need to invalidate p aints. 1765 // check whether we should layout now, and decide if we need to invalidate p aints.
1766 StyleDifference updatedDiff = adjustStyleDifference(diff); 1766 StyleDifference updatedDiff = adjustStyleDifference(diff);
1767 1767
1768 if (!diff.needsFullLayout()) { 1768 if (!diff.needsFullLayout()) {
1769 if (updatedDiff.needsFullLayout()) 1769 if (updatedDiff.needsFullLayout())
1770 setNeedsLayoutAndPrefWidthsRecalc(LayoutInvalidationReason::StyleCha nge); 1770 setNeedsLayoutAndPrefWidthsRecalc(LayoutInvalidationReason::StyleCha nge);
1771 else if (updatedDiff.needsPositionedMovementLayout()) 1771 else if (updatedDiff.needsPositionedMovementLayout())
1772 setNeedsPositionedMovementLayout(); 1772 setNeedsPositionedMovementLayout();
1773 } 1773 }
1774 1774
1775 if (diff.transformChanged() && !needsLayout()) { 1775 if (diff.transformChanged() && !needsLayout()) {
1776 if (LayoutBlock* container = containingBlock()) 1776 if (LayoutBlock* container = containingBlock())
1777 container->setNeedsOverflowRecalcAfterStyleChange(); 1777 container->setNeedsOverflowRecalcAfterStyleChange();
1778 } 1778 }
1779 1779
1780 if (updatedDiff.needsPaintInvalidationLayer()) 1780 if (updatedDiff.needsPaintInvalidationLayer())
1781 toLayoutBoxModelObject(this)->layer()->setShouldDoFullPaintInvalidationI ncludingNonCompositingDescendants(); 1781 toLayoutBoxModelObject(this)->layer()->setShouldDoFullPaintInvalidationI ncludingNonCompositingDescendants();
1782 else if (diff.needsPaintInvalidationObject() || updatedDiff.needsPaintInvali dationObject()) 1782 else if (diff.needsPaintInvalidationObject() || updatedDiff.needsPaintInvali dationObject())
1783 setShouldDoFullPaintInvalidation(); 1783 setShouldDoFullPaintInvalidation();
1784 } 1784 }
1785 1785
1786 static inline bool rendererHasBackground(const LayoutObject* renderer) 1786 static inline bool layoutObjectHasBackground(const LayoutObject* layoutObject)
1787 { 1787 {
1788 return renderer && renderer->hasBackground(); 1788 return layoutObject && layoutObject->hasBackground();
1789 } 1789 }
1790 1790
1791 void LayoutObject::styleWillChange(StyleDifference diff, const ComputedStyle& ne wStyle) 1791 void LayoutObject::styleWillChange(StyleDifference diff, const ComputedStyle& ne wStyle)
1792 { 1792 {
1793 if (m_style) { 1793 if (m_style) {
1794 // If our z-index changes value or our visibility changes, 1794 // If our z-index changes value or our visibility changes,
1795 // we need to dirty our stacking context's z-order list. 1795 // we need to dirty our stacking context's z-order list.
1796 bool visibilityChanged = m_style->visibility() != newStyle.visibility() 1796 bool visibilityChanged = m_style->visibility() != newStyle.visibility()
1797 || m_style->zIndex() != newStyle.zIndex() 1797 || m_style->zIndex() != newStyle.zIndex()
1798 || m_style->hasAutoZIndex() != newStyle.hasAutoZIndex(); 1798 || m_style->hasAutoZIndex() != newStyle.hasAutoZIndex();
(...skipping 17 matching lines...) Expand all
1816 } else if (isOutOfFlowPositioned() && (m_style->position() != newStyle.p osition())) { 1816 } else if (isOutOfFlowPositioned() && (m_style->position() != newStyle.p osition())) {
1817 // For changes in positioning styles, we need to conceivably remove ourselves 1817 // For changes in positioning styles, we need to conceivably remove ourselves
1818 // from the positioned objects list. 1818 // from the positioned objects list.
1819 toLayoutBox(this)->removeFloatingOrPositionedChildFromBlockLists(); 1819 toLayoutBox(this)->removeFloatingOrPositionedChildFromBlockLists();
1820 } 1820 }
1821 1821
1822 s_affectsParentBlock = isFloatingOrOutOfFlowPositioned() 1822 s_affectsParentBlock = isFloatingOrOutOfFlowPositioned()
1823 && (!newStyle.isFloating() && !newStyle.hasOutOfFlowPosition()) 1823 && (!newStyle.isFloating() && !newStyle.hasOutOfFlowPosition())
1824 && parent() && (parent()->isLayoutBlockFlow() || parent()->isLayoutI nline()); 1824 && parent() && (parent()->isLayoutBlockFlow() || parent()->isLayoutI nline());
1825 1825
1826 // Clearing these bits is required to avoid leaving stale renderers. 1826 // Clearing these bits is required to avoid leaving stale layoutObjects.
1827 // FIXME: We shouldn't need that hack if our logic was totally correct. 1827 // FIXME: We shouldn't need that hack if our logic was totally correct.
1828 if (diff.needsLayout()) { 1828 if (diff.needsLayout()) {
1829 setFloating(false); 1829 setFloating(false);
1830 clearPositionedState(); 1830 clearPositionedState();
1831 } 1831 }
1832 } else { 1832 } else {
1833 s_affectsParentBlock = false; 1833 s_affectsParentBlock = false;
1834 } 1834 }
1835 1835
1836 if (view()->frameView()) { 1836 if (view()->frameView()) {
1837 bool shouldBlitOnFixedBackgroundImage = false; 1837 bool shouldBlitOnFixedBackgroundImage = false;
1838 if (RuntimeEnabledFeatures::fastMobileScrollingEnabled()) { 1838 if (RuntimeEnabledFeatures::fastMobileScrollingEnabled()) {
1839 // On low-powered/mobile devices, preventing blitting on a scroll ca n cause noticeable delays 1839 // On low-powered/mobile devices, preventing blitting on a scroll ca n cause noticeable delays
1840 // when scrolling a page with a fixed background image. As an optimi zation, assuming there are 1840 // when scrolling a page with a fixed background image. As an optimi zation, assuming there are
1841 // no fixed positoned elements on the page, we can acclerate scrolli ng (via blitting) if we 1841 // no fixed positoned elements on the page, we can acclerate scrolli ng (via blitting) if we
1842 // ignore the CSS property "background-attachment: fixed". 1842 // ignore the CSS property "background-attachment: fixed".
1843 shouldBlitOnFixedBackgroundImage = true; 1843 shouldBlitOnFixedBackgroundImage = true;
1844 } 1844 }
1845 bool newStyleSlowScroll = !shouldBlitOnFixedBackgroundImage && newStyle. hasFixedBackgroundImage(); 1845 bool newStyleSlowScroll = !shouldBlitOnFixedBackgroundImage && newStyle. hasFixedBackgroundImage();
1846 bool oldStyleSlowScroll = m_style && !shouldBlitOnFixedBackgroundImage & & m_style->hasFixedBackgroundImage(); 1846 bool oldStyleSlowScroll = m_style && !shouldBlitOnFixedBackgroundImage & & m_style->hasFixedBackgroundImage();
1847 1847
1848 bool drawsRootBackground = isDocumentElement() || (isBody() && !renderer HasBackground(document().documentElement()->layoutObject())); 1848 bool drawsRootBackground = isDocumentElement() || (isBody() && !layoutOb jectHasBackground(document().documentElement()->layoutObject()));
1849 if (drawsRootBackground && !shouldBlitOnFixedBackgroundImage) { 1849 if (drawsRootBackground && !shouldBlitOnFixedBackgroundImage) {
1850 if (view()->compositor()->supportsFixedRootBackgroundCompositing()) { 1850 if (view()->compositor()->supportsFixedRootBackgroundCompositing()) {
1851 if (newStyleSlowScroll && newStyle.hasEntirelyFixedBackground()) 1851 if (newStyleSlowScroll && newStyle.hasEntirelyFixedBackground())
1852 newStyleSlowScroll = false; 1852 newStyleSlowScroll = false;
1853 1853
1854 if (oldStyleSlowScroll && m_style->hasEntirelyFixedBackground()) 1854 if (oldStyleSlowScroll && m_style->hasEntirelyFixedBackground())
1855 oldStyleSlowScroll = false; 1855 oldStyleSlowScroll = false;
1856 } 1856 }
1857 } 1857 }
1858 1858
(...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after
2133 FloatPoint LayoutObject::localToInvalidationBackingPoint(const LayoutPoint& loca lPoint, DeprecatedPaintLayer** backingLayer) 2133 FloatPoint LayoutObject::localToInvalidationBackingPoint(const LayoutPoint& loca lPoint, DeprecatedPaintLayer** backingLayer)
2134 { 2134 {
2135 const LayoutBoxModelObject* paintInvalidationContainer = containerForPaintIn validation(); 2135 const LayoutBoxModelObject* paintInvalidationContainer = containerForPaintIn validation();
2136 ASSERT(paintInvalidationContainer); 2136 ASSERT(paintInvalidationContainer);
2137 ASSERT(paintInvalidationContainer->layer()); 2137 ASSERT(paintInvalidationContainer->layer());
2138 2138
2139 if (backingLayer) 2139 if (backingLayer)
2140 *backingLayer = paintInvalidationContainer->layer(); 2140 *backingLayer = paintInvalidationContainer->layer();
2141 FloatPoint containerPoint = localToContainerPoint(FloatPoint(localPoint), pa intInvalidationContainer, TraverseDocumentBoundaries); 2141 FloatPoint containerPoint = localToContainerPoint(FloatPoint(localPoint), pa intInvalidationContainer, TraverseDocumentBoundaries);
2142 2142
2143 // A renderer can have no invalidation backing if it is from a detached fram e, 2143 // A layoutObject can have no invalidation backing if it is from a detached frame,
2144 // or when forced compositing is disabled. 2144 // or when forced compositing is disabled.
2145 if (paintInvalidationContainer->layer()->compositingState() == NotComposited ) 2145 if (paintInvalidationContainer->layer()->compositingState() == NotComposited )
2146 return containerPoint; 2146 return containerPoint;
2147 2147
2148 DeprecatedPaintLayer::mapPointToPaintBackingCoordinates(paintInvalidationCon tainer, containerPoint); 2148 DeprecatedPaintLayer::mapPointToPaintBackingCoordinates(paintInvalidationCon tainer, containerPoint);
2149 return containerPoint; 2149 return containerPoint;
2150 } 2150 }
2151 2151
2152 LayoutSize LayoutObject::offsetFromContainer(const LayoutObject* o, const Layout Point& point, bool* offsetDependsOnPoint) const 2152 LayoutSize LayoutObject::offsetFromContainer(const LayoutObject* o, const Layout Point& point, bool* offsetDependsOnPoint) const
2153 { 2153 {
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
2191 { 2191 {
2192 if (extraWidthToEndOfLine) 2192 if (extraWidthToEndOfLine)
2193 *extraWidthToEndOfLine = 0; 2193 *extraWidthToEndOfLine = 0;
2194 2194
2195 return LayoutRect(); 2195 return LayoutRect();
2196 } 2196 }
2197 2197
2198 void LayoutObject::computeLayerHitTestRects(LayerHitTestRects& layerRects) const 2198 void LayoutObject::computeLayerHitTestRects(LayerHitTestRects& layerRects) const
2199 { 2199 {
2200 // Figure out what layer our container is in. Any offset (or new layer) for this 2200 // Figure out what layer our container is in. Any offset (or new layer) for this
2201 // renderer within it's container will be applied in addLayerHitTestRects. 2201 // layoutObject within it's container will be applied in addLayerHitTestRect s.
2202 LayoutPoint layerOffset; 2202 LayoutPoint layerOffset;
2203 const DeprecatedPaintLayer* currentLayer = 0; 2203 const DeprecatedPaintLayer* currentLayer = 0;
2204 2204
2205 if (!hasLayer()) { 2205 if (!hasLayer()) {
2206 LayoutObject* container = this->container(); 2206 LayoutObject* container = this->container();
2207 currentLayer = container->enclosingLayer(); 2207 currentLayer = container->enclosingLayer();
2208 if (container && currentLayer->layoutObject() != container) { 2208 if (container && currentLayer->layoutObject() != container) {
2209 layerOffset.move(container->offsetFromAncestorContainer(currentLayer ->layoutObject())); 2209 layerOffset.move(container->offsetFromAncestorContainer(currentLayer ->layoutObject()));
2210 // If the layer itself is scrolled, we have to undo the subtraction of its scroll 2210 // If the layer itself is scrolled, we have to undo the subtraction of its scroll
2211 // offset since we want the offset relative to the scrolling content , not the 2211 // offset since we want the offset relative to the scrolling content , not the
2212 // element itself. 2212 // element itself.
2213 if (currentLayer->layoutObject()->hasOverflowClip()) 2213 if (currentLayer->layoutObject()->hasOverflowClip())
2214 layerOffset.move(currentLayer->layoutBox()->scrolledContentOffse t()); 2214 layerOffset.move(currentLayer->layoutBox()->scrolledContentOffse t());
2215 } 2215 }
2216 } 2216 }
2217 2217
2218 this->addLayerHitTestRects(layerRects, currentLayer, layerOffset, LayoutRect ()); 2218 this->addLayerHitTestRects(layerRects, currentLayer, layerOffset, LayoutRect ());
2219 } 2219 }
2220 2220
2221 void LayoutObject::addLayerHitTestRects(LayerHitTestRects& layerRects, const Dep recatedPaintLayer* currentLayer, const LayoutPoint& layerOffset, const LayoutRec t& containerRect) const 2221 void LayoutObject::addLayerHitTestRects(LayerHitTestRects& layerRects, const Dep recatedPaintLayer* currentLayer, const LayoutPoint& layerOffset, const LayoutRec t& containerRect) const
2222 { 2222 {
2223 ASSERT(currentLayer); 2223 ASSERT(currentLayer);
2224 ASSERT(currentLayer == this->enclosingLayer()); 2224 ASSERT(currentLayer == this->enclosingLayer());
2225 2225
2226 // Compute the rects for this renderer only and add them to the results. 2226 // Compute the rects for this layoutObject only and add them to the results.
2227 // Note that we could avoid passing the offset and instead adjust each resul t, but this 2227 // Note that we could avoid passing the offset and instead adjust each resul t, but this
2228 // seems slightly simpler. 2228 // seems slightly simpler.
2229 Vector<LayoutRect> ownRects; 2229 Vector<LayoutRect> ownRects;
2230 LayoutRect newContainerRect; 2230 LayoutRect newContainerRect;
2231 computeSelfHitTestRects(ownRects, layerOffset); 2231 computeSelfHitTestRects(ownRects, layerOffset);
2232 2232
2233 // When we get to have a lot of rects on a layer, the performance cost of tr acking those 2233 // When we get to have a lot of rects on a layer, the performance cost of tr acking those
2234 // rects outweighs the benefit of doing compositor thread hit testing. 2234 // rects outweighs the benefit of doing compositor thread hit testing.
2235 // FIXME: This limit needs to be low due to the O(n^2) algorithm in 2235 // FIXME: This limit needs to be low due to the O(n^2) algorithm in
2236 // WebLayer::setTouchEventHandlerRegion - crbug.com/300282. 2236 // WebLayer::setTouchEventHandlerRegion - crbug.com/300282.
2237 const size_t maxRectsPerLayer = 100; 2237 const size_t maxRectsPerLayer = 100;
2238 2238
2239 LayerHitTestRects::iterator iter = layerRects.find(currentLayer); 2239 LayerHitTestRects::iterator iter = layerRects.find(currentLayer);
2240 Vector<LayoutRect>* iterValue; 2240 Vector<LayoutRect>* iterValue;
2241 if (iter == layerRects.end()) 2241 if (iter == layerRects.end())
2242 iterValue = &layerRects.add(currentLayer, Vector<LayoutRect>()).storedVa lue->value; 2242 iterValue = &layerRects.add(currentLayer, Vector<LayoutRect>()).storedVa lue->value;
2243 else 2243 else
2244 iterValue = &iter->value; 2244 iterValue = &iter->value;
2245 for (size_t i = 0; i < ownRects.size(); i++) { 2245 for (size_t i = 0; i < ownRects.size(); i++) {
2246 if (!containerRect.contains(ownRects[i])) { 2246 if (!containerRect.contains(ownRects[i])) {
2247 iterValue->append(ownRects[i]); 2247 iterValue->append(ownRects[i]);
2248 if (iterValue->size() > maxRectsPerLayer) { 2248 if (iterValue->size() > maxRectsPerLayer) {
2249 // Just mark the entire layer instead, and switch to walking the layer 2249 // Just mark the entire layer instead, and switch to walking the layer
2250 // tree instead of the render tree. 2250 // tree instead of the layout tree.
2251 layerRects.remove(currentLayer); 2251 layerRects.remove(currentLayer);
2252 currentLayer->addLayerHitTestRects(layerRects); 2252 currentLayer->addLayerHitTestRects(layerRects);
2253 return; 2253 return;
2254 } 2254 }
2255 if (newContainerRect.isEmpty()) 2255 if (newContainerRect.isEmpty())
2256 newContainerRect = ownRects[i]; 2256 newContainerRect = ownRects[i];
2257 } 2257 }
2258 } 2258 }
2259 if (newContainerRect.isEmpty()) 2259 if (newContainerRect.isEmpty())
2260 newContainerRect = containerRect; 2260 newContainerRect = containerRect;
(...skipping 15 matching lines...) Expand all
2276 bool LayoutObject::isRooted() const 2276 bool LayoutObject::isRooted() const
2277 { 2277 {
2278 const LayoutObject* object = this; 2278 const LayoutObject* object = this;
2279 while (object->parent() && !object->hasLayer()) 2279 while (object->parent() && !object->hasLayer())
2280 object = object->parent(); 2280 object = object->parent();
2281 if (object->hasLayer()) 2281 if (object->hasLayer())
2282 return toLayoutBoxModelObject(object)->layer()->root()->isRootLayer(); 2282 return toLayoutBoxModelObject(object)->layer()->root()->isRootLayer();
2283 return false; 2283 return false;
2284 } 2284 }
2285 2285
2286 LayoutObject* LayoutObject::rendererForRootBackground() 2286 LayoutObject* LayoutObject::layoutObjectForRootBackground()
2287 { 2287 {
2288 ASSERT(isDocumentElement()); 2288 ASSERT(isDocumentElement());
2289 if (!hasBackground() && isHTMLHtmlElement(node())) { 2289 if (!hasBackground() && isHTMLHtmlElement(node())) {
2290 // Locate the <body> element using the DOM. This is easier than trying 2290 // Locate the <body> element using the DOM. This is easier than trying
2291 // to crawl around a render tree with potential :before/:after content a nd 2291 // to crawl around a layout tree with potential :before/:after content a nd
2292 // anonymous blocks created by inline <body> tags etc. We can locate the <body> 2292 // anonymous blocks created by inline <body> tags etc. We can locate the <body>
2293 // render object very easily via the DOM. 2293 // layout object very easily via the DOM.
2294 HTMLElement* body = document().body(); 2294 HTMLElement* body = document().body();
2295 LayoutObject* bodyObject = isHTMLBodyElement(body) ? body->layoutObject( ) : 0; 2295 LayoutObject* bodyObject = isHTMLBodyElement(body) ? body->layoutObject( ) : 0;
2296 if (bodyObject) 2296 if (bodyObject)
2297 return bodyObject; 2297 return bodyObject;
2298 } 2298 }
2299 2299
2300 return this; 2300 return this;
2301 } 2301 }
2302 2302
2303 RespectImageOrientationEnum LayoutObject::shouldRespectImageOrientation() const 2303 RespectImageOrientationEnum LayoutObject::shouldRespectImageOrientation() const
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
2385 } 2385 }
2386 2386
2387 void LayoutObject::willBeDestroyed() 2387 void LayoutObject::willBeDestroyed()
2388 { 2388 {
2389 // Destroy any leftover anonymous children. 2389 // Destroy any leftover anonymous children.
2390 LayoutObjectChildList* children = virtualChildren(); 2390 LayoutObjectChildList* children = virtualChildren();
2391 if (children) 2391 if (children)
2392 children->destroyLeftoverChildren(); 2392 children->destroyLeftoverChildren();
2393 2393
2394 if (LocalFrame* frame = this->frame()) { 2394 if (LocalFrame* frame = this->frame()) {
2395 // If this renderer is being autoscrolled, stop the autoscrolling. 2395 // If this layoutObject is being autoscrolled, stop the autoscrolling.
2396 if (frame->page()) 2396 if (frame->page())
2397 frame->page()->autoscrollController().stopAutoscrollIfNeeded(this); 2397 frame->page()->autoscrollController().stopAutoscrollIfNeeded(this);
2398 2398
2399 if (frame->view() && frame->view()->viewportLayoutObject() == this) 2399 if (frame->view() && frame->view()->viewportLayoutObject() == this)
2400 frame->view()->clearViewportLayoutObject(); 2400 frame->view()->clearViewportLayoutObject();
2401 } 2401 }
2402 2402
2403 // For accessibility management, notify the parent of the imminent change to its child set. 2403 // For accessibility management, notify the parent of the imminent change to its child set.
2404 // We do it now, before remove(), while the parent pointer is still availabl e. 2404 // We do it now, before remove(), while the parent pointer is still availabl e.
2405 if (AXObjectCache* cache = document().existingAXObjectCache()) 2405 if (AXObjectCache* cache = document().existingAXObjectCache())
2406 cache->childrenChanged(this->parent()); 2406 cache->childrenChanged(this->parent());
2407 2407
2408 remove(); 2408 remove();
2409 2409
2410 // The remove() call above may invoke axObjectCache()->childrenChanged() on the parent, which may require the AX render 2410 // The remove() call above may invoke axObjectCache()->childrenChanged() on the parent, which may require the AX layout
2411 // object for this renderer. So we remove the AX render object now, after th e renderer is removed. 2411 // object for this layoutObject. So we remove the AX layout object now, afte r the layoutObject is removed.
2412 if (AXObjectCache* cache = document().existingAXObjectCache()) 2412 if (AXObjectCache* cache = document().existingAXObjectCache())
2413 cache->remove(this); 2413 cache->remove(this);
2414 2414
2415 // If this renderer had a parent, remove should have destroyed any counters 2415 // If this layoutObject had a parent, remove should have destroyed any count ers
2416 // attached to this renderer and marked the affected other counters for 2416 // attached to this layoutObject and marked the affected other counters for
2417 // reevaluation. This apparently redundant check is here for the case when 2417 // reevaluation. This apparently redundant check is here for the case when
2418 // this renderer had no parent at the time remove() was called. 2418 // this layoutObject had no parent at the time remove() was called.
2419 2419
2420 if (hasCounterNodeMap()) 2420 if (hasCounterNodeMap())
2421 LayoutCounter::destroyCounterNodes(*this); 2421 LayoutCounter::destroyCounterNodes(*this);
2422 2422
2423 // Remove the handler if node had touch-action set. Handlers are not added 2423 // Remove the handler if node had touch-action set. Handlers are not added
2424 // for text nodes so don't try removing for one too. Need to check if 2424 // for text nodes so don't try removing for one too. Need to check if
2425 // m_style is null in cases of partial construction. Any handler we added 2425 // m_style is null in cases of partial construction. Any handler we added
2426 // previously may have already been removed by the Document independently. 2426 // previously may have already been removed by the Document independently.
2427 if (node() && !node()->isTextNode() && m_style && m_style->touchAction() != TouchActionAuto) { 2427 if (node() && !node()->isTextNode() && m_style && m_style->touchAction() != TouchActionAuto) {
2428 EventHandlerRegistry& registry = document().frameHost()->eventHandlerReg istry(); 2428 EventHandlerRegistry& registry = document().frameHost()->eventHandlerReg istry();
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
2483 if (!layer) 2483 if (!layer)
2484 layer = parent()->enclosingLayer(); 2484 layer = parent()->enclosingLayer();
2485 removeLayers(layer); 2485 removeLayers(layer);
2486 } 2486 }
2487 2487
2488 if (isOutOfFlowPositioned() && parent()->childrenInline()) 2488 if (isOutOfFlowPositioned() && parent()->childrenInline())
2489 parent()->dirtyLinesFromChangedChild(this); 2489 parent()->dirtyLinesFromChangedChild(this);
2490 2490
2491 removeFromLayoutFlowThread(); 2491 removeFromLayoutFlowThread();
2492 2492
2493 // Update cached boundaries in SVG renderers if a child is removed. 2493 // Update cached boundaries in SVG layoutObjects if a child is removed.
2494 if (parent()->isSVG()) 2494 if (parent()->isSVG())
2495 parent()->setNeedsBoundariesUpdate(); 2495 parent()->setNeedsBoundariesUpdate();
2496 } 2496 }
2497 2497
2498 void LayoutObject::removeFromLayoutFlowThread() 2498 void LayoutObject::removeFromLayoutFlowThread()
2499 { 2499 {
2500 if (flowThreadState() == NotInsideFlowThread) 2500 if (flowThreadState() == NotInsideFlowThread)
2501 return; 2501 return;
2502 2502
2503 // Sometimes we remove the element from the flow, but it's not destroyed at that time. 2503 // Sometimes we remove the element from the flow, but it's not destroyed at that time.
2504 // It's only until later when we actually destroy it and remove all the chil dren from it. 2504 // It's only until later when we actually destroy it and remove all the chil dren from it.
2505 // Currently, that happens for firstLetter elements and list markers. 2505 // Currently, that happens for firstLetter elements and list markers.
2506 // Pass in the flow thread so that we don't have to look it up for all the c hildren. 2506 // Pass in the flow thread so that we don't have to look it up for all the c hildren.
2507 // If we're a column spanner, we need to use our parent to find the flow thr ead, since a spanner 2507 // If we're a column spanner, we need to use our parent to find the flow thr ead, since a spanner
2508 // doesn't have the flow thread in its containing block chain. We still need to notify the flow 2508 // doesn't have the flow thread in its containing block chain. We still need to notify the flow
2509 // thread when the renderer removed happens to be a spanner, so that we get rid of the spanner 2509 // thread when the layoutObject removed happens to be a spanner, so that we get rid of the spanner
2510 // placeholder, and column sets around the placeholder get merged. 2510 // placeholder, and column sets around the placeholder get merged.
2511 LayoutFlowThread* flowThread = isColumnSpanAll() ? parent()->flowThreadConta iningBlock() : flowThreadContainingBlock(); 2511 LayoutFlowThread* flowThread = isColumnSpanAll() ? parent()->flowThreadConta iningBlock() : flowThreadContainingBlock();
2512 removeFromLayoutFlowThreadRecursive(flowThread); 2512 removeFromLayoutFlowThreadRecursive(flowThread);
2513 } 2513 }
2514 2514
2515 void LayoutObject::removeFromLayoutFlowThreadRecursive(LayoutFlowThread* renderF lowThread) 2515 void LayoutObject::removeFromLayoutFlowThreadRecursive(LayoutFlowThread* layoutF lowThread)
2516 { 2516 {
2517 if (const LayoutObjectChildList* children = virtualChildren()) { 2517 if (const LayoutObjectChildList* children = virtualChildren()) {
2518 for (LayoutObject* child = children->firstChild(); child; child = child- >nextSibling()) { 2518 for (LayoutObject* child = children->firstChild(); child; child = child- >nextSibling()) {
2519 if (child->isLayoutFlowThread()) 2519 if (child->isLayoutFlowThread())
2520 continue; // Don't descend into inner fragmentation contexts. 2520 continue; // Don't descend into inner fragmentation contexts.
2521 child->removeFromLayoutFlowThreadRecursive(child->isLayoutFlowThread () ? toLayoutFlowThread(child) : renderFlowThread); 2521 child->removeFromLayoutFlowThreadRecursive(child->isLayoutFlowThread () ? toLayoutFlowThread(child) : layoutFlowThread);
2522 } 2522 }
2523 } 2523 }
2524 2524
2525 if (renderFlowThread && renderFlowThread != this) 2525 if (layoutFlowThread && layoutFlowThread != this)
2526 renderFlowThread->flowThreadDescendantWillBeRemoved(this); 2526 layoutFlowThread->flowThreadDescendantWillBeRemoved(this);
2527 setFlowThreadState(NotInsideFlowThread); 2527 setFlowThreadState(NotInsideFlowThread);
2528 RELEASE_ASSERT(!spannerPlaceholder()); 2528 RELEASE_ASSERT(!spannerPlaceholder());
2529 } 2529 }
2530 2530
2531 void LayoutObject::destroyAndCleanupAnonymousWrappers() 2531 void LayoutObject::destroyAndCleanupAnonymousWrappers()
2532 { 2532 {
2533 // If the tree is destroyed, there is no need for a clean-up phase. 2533 // If the tree is destroyed, there is no need for a clean-up phase.
2534 if (documentBeingDestroyed()) { 2534 if (documentBeingDestroyed()) {
2535 destroy(); 2535 destroy();
2536 return; 2536 return;
2537 } 2537 }
2538 2538
2539 LayoutObject* destroyRoot = this; 2539 LayoutObject* destroyRoot = this;
2540 for (LayoutObject* destroyRootParent = destroyRoot->parent(); destroyRootPar ent && destroyRootParent->isAnonymous(); destroyRoot = destroyRootParent, destro yRootParent = destroyRootParent->parent()) { 2540 for (LayoutObject* destroyRootParent = destroyRoot->parent(); destroyRootPar ent && destroyRootParent->isAnonymous(); destroyRoot = destroyRootParent, destro yRootParent = destroyRootParent->parent()) {
2541 // Anonymous block continuations are tracked and destroyed elsewhere (se e the bottom of LayoutBlock::removeChild) 2541 // Anonymous block continuations are tracked and destroyed elsewhere (se e the bottom of LayoutBlock::removeChild)
2542 if (destroyRootParent->isLayoutBlock() && toLayoutBlock(destroyRootParen t)->isAnonymousBlockContinuation()) 2542 if (destroyRootParent->isLayoutBlock() && toLayoutBlock(destroyRootParen t)->isAnonymousBlockContinuation())
2543 break; 2543 break;
2544 // A flow thread is tracked by its containing block. Whether its childre n are removed or not is irrelevant. 2544 // A flow thread is tracked by its containing block. Whether its childre n are removed or not is irrelevant.
2545 if (destroyRootParent->isLayoutFlowThread()) 2545 if (destroyRootParent->isLayoutFlowThread())
2546 break; 2546 break;
2547 // Column spans are tracked elsewhere. 2547 // Column spans are tracked elsewhere.
2548 if (destroyRootParent->isAnonymousColumnSpanBlock()) 2548 if (destroyRootParent->isAnonymousColumnSpanBlock())
2549 break; 2549 break;
2550 2550
2551 if (destroyRootParent->slowFirstChild() != destroyRoot || destroyRootPar ent->slowLastChild() != destroyRoot) 2551 if (destroyRootParent->slowFirstChild() != destroyRoot || destroyRootPar ent->slowLastChild() != destroyRoot)
2552 break; // Need to keep the anonymous parent, since it won't become e mpty by the removal of this renderer. 2552 break; // Need to keep the anonymous parent, since it won't become e mpty by the removal of this layoutObject.
2553 } 2553 }
2554 2554
2555 destroyRoot->destroy(); 2555 destroyRoot->destroy();
2556 2556
2557 // WARNING: |this| is deleted here. 2557 // WARNING: |this| is deleted here.
2558 } 2558 }
2559 2559
2560 void LayoutObject::destroy() 2560 void LayoutObject::destroy()
2561 { 2561 {
2562 willBeDestroyed(); 2562 willBeDestroyed();
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
2649 return inside; 2649 return inside;
2650 } 2650 }
2651 2651
2652 void LayoutObject::updateHitTestResult(HitTestResult& result, const LayoutPoint& point) 2652 void LayoutObject::updateHitTestResult(HitTestResult& result, const LayoutPoint& point)
2653 { 2653 {
2654 if (result.innerNode()) 2654 if (result.innerNode())
2655 return; 2655 return;
2656 2656
2657 Node* node = this->node(); 2657 Node* node = this->node();
2658 2658
2659 // If we hit the anonymous renderers inside generated content we should 2659 // If we hit the anonymous layoutObjects inside generated content we should
2660 // actually hit the generated content so walk up to the PseudoElement. 2660 // actually hit the generated content so walk up to the PseudoElement.
2661 if (!node && parent() && parent()->isBeforeOrAfterContent()) { 2661 if (!node && parent() && parent()->isBeforeOrAfterContent()) {
2662 for (LayoutObject* renderer = parent(); renderer && !node; renderer = re nderer->parent()) 2662 for (LayoutObject* layoutObject = parent(); layoutObject && !node; layou tObject = layoutObject->parent())
2663 node = renderer->node(); 2663 node = layoutObject->node();
2664 } 2664 }
2665 2665
2666 if (node) { 2666 if (node) {
2667 result.setInnerNode(node); 2667 result.setInnerNode(node);
2668 result.setLocalPoint(point); 2668 result.setLocalPoint(point);
2669 } 2669 }
2670 } 2670 }
2671 2671
2672 bool LayoutObject::nodeAtPoint(HitTestResult&, const HitTestLocation& /*location InContainer*/, const LayoutPoint& /*accumulatedOffset*/, HitTestAction) 2672 bool LayoutObject::nodeAtPoint(HitTestResult&, const HitTestLocation& /*location InContainer*/, const LayoutPoint& /*accumulatedOffset*/, HitTestAction)
2673 { 2673 {
(...skipping 29 matching lines...) Expand all
2703 { 2703 {
2704 setNormalChildNeedsLayout(true); 2704 setNormalChildNeedsLayout(true);
2705 layout(); 2705 layout();
2706 } 2706 }
2707 2707
2708 enum StyleCacheState { 2708 enum StyleCacheState {
2709 Cached, 2709 Cached,
2710 Uncached 2710 Uncached
2711 }; 2711 };
2712 2712
2713 static PassRefPtr<ComputedStyle> firstLineStyleForCachedUncachedType(StyleCacheS tate type, const LayoutObject* renderer, ComputedStyle* style) 2713 static PassRefPtr<ComputedStyle> firstLineStyleForCachedUncachedType(StyleCacheS tate type, const LayoutObject* layoutObject, ComputedStyle* style)
2714 { 2714 {
2715 const LayoutObject* rendererForFirstLineStyle = renderer; 2715 const LayoutObject* layoutObjectForFirstLineStyle = layoutObject;
2716 if (renderer->isBeforeOrAfterContent()) 2716 if (layoutObject->isBeforeOrAfterContent())
2717 rendererForFirstLineStyle = renderer->parent(); 2717 layoutObjectForFirstLineStyle = layoutObject->parent();
2718 2718
2719 if (rendererForFirstLineStyle->isLayoutBlockFlow() || rendererForFirstLineSt yle->isLayoutButton()) { 2719 if (layoutObjectForFirstLineStyle->isLayoutBlockFlow() || layoutObjectForFir stLineStyle->isLayoutButton()) {
2720 if (LayoutBlock* firstLineBlock = rendererForFirstLineStyle->firstLineBl ock()) { 2720 if (LayoutBlock* firstLineBlock = layoutObjectForFirstLineStyle->firstLi neBlock()) {
2721 if (type == Cached) 2721 if (type == Cached)
2722 return firstLineBlock->getCachedPseudoStyle(FIRST_LINE, style); 2722 return firstLineBlock->getCachedPseudoStyle(FIRST_LINE, style);
2723 return firstLineBlock->getUncachedPseudoStyle(PseudoStyleRequest(FIR ST_LINE), style, firstLineBlock == renderer ? style : 0); 2723 return firstLineBlock->getUncachedPseudoStyle(PseudoStyleRequest(FIR ST_LINE), style, firstLineBlock == layoutObject ? style : 0);
2724 } 2724 }
2725 } else if (!rendererForFirstLineStyle->isAnonymous() && rendererForFirstLine Style->isLayoutInline() 2725 } else if (!layoutObjectForFirstLineStyle->isAnonymous() && layoutObjectForF irstLineStyle->isLayoutInline()
2726 && !rendererForFirstLineStyle->node()->isFirstLetterPseudoElement()) { 2726 && !layoutObjectForFirstLineStyle->node()->isFirstLetterPseudoElement()) {
2727 const ComputedStyle* parentStyle = rendererForFirstLineStyle->parent()-> firstLineStyle(); 2727 const ComputedStyle* parentStyle = layoutObjectForFirstLineStyle->parent ()->firstLineStyle();
2728 if (parentStyle != rendererForFirstLineStyle->parent()->style()) { 2728 if (parentStyle != layoutObjectForFirstLineStyle->parent()->style()) {
2729 if (type == Cached) { 2729 if (type == Cached) {
2730 // A first-line style is in effect. Cache a first-line style for ourselves. 2730 // A first-line style is in effect. Cache a first-line style for ourselves.
2731 rendererForFirstLineStyle->mutableStyleRef().setHasPseudoStyle(F IRST_LINE_INHERITED); 2731 layoutObjectForFirstLineStyle->mutableStyleRef().setHasPseudoSty le(FIRST_LINE_INHERITED);
2732 return rendererForFirstLineStyle->getCachedPseudoStyle(FIRST_LIN E_INHERITED, parentStyle); 2732 return layoutObjectForFirstLineStyle->getCachedPseudoStyle(FIRST _LINE_INHERITED, parentStyle);
2733 } 2733 }
2734 return rendererForFirstLineStyle->getUncachedPseudoStyle(PseudoStyle Request(FIRST_LINE_INHERITED), parentStyle, style); 2734 return layoutObjectForFirstLineStyle->getUncachedPseudoStyle(PseudoS tyleRequest(FIRST_LINE_INHERITED), parentStyle, style);
2735 } 2735 }
2736 } 2736 }
2737 return nullptr; 2737 return nullptr;
2738 } 2738 }
2739 2739
2740 PassRefPtr<ComputedStyle> LayoutObject::uncachedFirstLineStyle(ComputedStyle* st yle) const 2740 PassRefPtr<ComputedStyle> LayoutObject::uncachedFirstLineStyle(ComputedStyle* st yle) const
2741 { 2741 {
2742 if (!document().styleEngine().usesFirstLineRules()) 2742 if (!document().styleEngine().usesFirstLineRules())
2743 return nullptr; 2743 return nullptr;
2744 2744
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after
2885 FloatRect absBounds = localToAbsoluteQuad(localBounds).boundingBox(); 2885 FloatRect absBounds = localToAbsoluteQuad(localBounds).boundingBox();
2886 2886
2887 AnnotatedRegionValue region; 2887 AnnotatedRegionValue region;
2888 region.draggable = style()->getDraggableRegionMode() == DraggableRegionDrag; 2888 region.draggable = style()->getDraggableRegionMode() == DraggableRegionDrag;
2889 region.bounds = LayoutRect(absBounds); 2889 region.bounds = LayoutRect(absBounds);
2890 regions.append(region); 2890 regions.append(region);
2891 } 2891 }
2892 2892
2893 void LayoutObject::collectAnnotatedRegions(Vector<AnnotatedRegionValue>& regions ) 2893 void LayoutObject::collectAnnotatedRegions(Vector<AnnotatedRegionValue>& regions )
2894 { 2894 {
2895 // RenderTexts don't have their own style, they just use their parent's styl e, 2895 // LayoutTexts don't have their own style, they just use their parent's styl e,
2896 // so we don't want to include them. 2896 // so we don't want to include them.
2897 if (isText()) 2897 if (isText())
2898 return; 2898 return;
2899 2899
2900 addAnnotatedRegions(regions); 2900 addAnnotatedRegions(regions);
2901 for (LayoutObject* curr = slowFirstChild(); curr; curr = curr->nextSibling() ) 2901 for (LayoutObject* curr = slowFirstChild(); curr; curr = curr->nextSibling() )
2902 curr->collectAnnotatedRegions(regions); 2902 curr->collectAnnotatedRegions(regions);
2903 } 2903 }
2904 2904
2905 bool LayoutObject::willRenderImage(ImageResource*) 2905 bool LayoutObject::willRenderImage(ImageResource*)
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
2950 return current - 1; 2950 return current - 1;
2951 } 2951 }
2952 2952
2953 int LayoutObject::nextOffset(int current) const 2953 int LayoutObject::nextOffset(int current) const
2954 { 2954 {
2955 return current + 1; 2955 return current + 1;
2956 } 2956 }
2957 2957
2958 bool LayoutObject::isInert() const 2958 bool LayoutObject::isInert() const
2959 { 2959 {
2960 const LayoutObject* renderer = this; 2960 const LayoutObject* layoutObject = this;
2961 while (!renderer->node()) 2961 while (!layoutObject->node())
2962 renderer = renderer->parent(); 2962 layoutObject = layoutObject->parent();
2963 return renderer->node()->isInert(); 2963 return layoutObject->node()->isInert();
2964 } 2964 }
2965 2965
2966 // touch-action applies to all elements with both width AND height properties. 2966 // touch-action applies to all elements with both width AND height properties.
2967 // According to the CSS Box Model Spec (http://dev.w3.org/csswg/css-box/#the-wid th-and-height-properties) 2967 // According to the CSS Box Model Spec (http://dev.w3.org/csswg/css-box/#the-wid th-and-height-properties)
2968 // width applies to all elements but non-replaced inline elements, table rows, a nd row groups and 2968 // width applies to all elements but non-replaced inline elements, table rows, a nd row groups and
2969 // height applies to all elements but non-replaced inline elements, table column s, and column groups. 2969 // height applies to all elements but non-replaced inline elements, table column s, and column groups.
2970 bool LayoutObject::supportsTouchAction() const 2970 bool LayoutObject::supportsTouchAction() const
2971 { 2971 {
2972 if (isInline() && !isReplaced()) 2972 if (isInline() && !isReplaced())
2973 return false; 2973 return false;
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
3012 // Webkit specific extension where offsetParent stops at zoom level chan ges. 3012 // Webkit specific extension where offsetParent stops at zoom level chan ges.
3013 if (effectiveZoom != ancestor->style()->effectiveZoom()) 3013 if (effectiveZoom != ancestor->style()->effectiveZoom())
3014 break; 3014 break;
3015 } 3015 }
3016 3016
3017 return node && node->isElementNode() ? toElement(node) : 0; 3017 return node && node->isElementNode() ? toElement(node) : 0;
3018 } 3018 }
3019 3019
3020 PositionWithAffinity LayoutObject::createPositionWithAffinity(int offset, EAffin ity affinity) 3020 PositionWithAffinity LayoutObject::createPositionWithAffinity(int offset, EAffin ity affinity)
3021 { 3021 {
3022 // If this is a non-anonymous renderer in an editable area, then it's simple . 3022 // If this is a non-anonymous layoutObject in an editable area, then it's si mple.
3023 if (Node* node = nonPseudoNode()) { 3023 if (Node* node = nonPseudoNode()) {
3024 if (!node->hasEditableStyle()) { 3024 if (!node->hasEditableStyle()) {
3025 // If it can be found, we prefer a visually equivalent position that is editable. 3025 // If it can be found, we prefer a visually equivalent position that is editable.
3026 Position position = createLegacyEditingPosition(node, offset); 3026 Position position = createLegacyEditingPosition(node, offset);
3027 Position candidate = position.downstream(CanCrossEditingBoundary); 3027 Position candidate = position.downstream(CanCrossEditingBoundary);
3028 if (candidate.deprecatedNode()->hasEditableStyle()) 3028 if (candidate.deprecatedNode()->hasEditableStyle())
3029 return PositionWithAffinity(candidate, affinity); 3029 return PositionWithAffinity(candidate, affinity);
3030 candidate = position.upstream(CanCrossEditingBoundary); 3030 candidate = position.upstream(CanCrossEditingBoundary);
3031 if (candidate.deprecatedNode()->hasEditableStyle()) 3031 if (candidate.deprecatedNode()->hasEditableStyle())
3032 return PositionWithAffinity(candidate, affinity); 3032 return PositionWithAffinity(candidate, affinity);
3033 } 3033 }
3034 // FIXME: Eliminate legacy editing positions 3034 // FIXME: Eliminate legacy editing positions
3035 return PositionWithAffinity(createLegacyEditingPosition(node, offset), a ffinity); 3035 return PositionWithAffinity(createLegacyEditingPosition(node, offset), a ffinity);
3036 } 3036 }
3037 3037
3038 // We don't want to cross the boundary between editable and non-editable 3038 // We don't want to cross the boundary between editable and non-editable
3039 // regions of the document, but that is either impossible or at least 3039 // regions of the document, but that is either impossible or at least
3040 // extremely unlikely in any normal case because we stop as soon as we 3040 // extremely unlikely in any normal case because we stop as soon as we
3041 // find a single non-anonymous renderer. 3041 // find a single non-anonymous layoutObject.
3042 3042
3043 // Find a nearby non-anonymous renderer. 3043 // Find a nearby non-anonymous layoutObject.
3044 LayoutObject* child = this; 3044 LayoutObject* child = this;
3045 while (LayoutObject* parent = child->parent()) { 3045 while (LayoutObject* parent = child->parent()) {
3046 // Find non-anonymous content after. 3046 // Find non-anonymous content after.
3047 for (LayoutObject* renderer = child->nextInPreOrder(parent); renderer; r enderer = renderer->nextInPreOrder(parent)) { 3047 for (LayoutObject* layoutObject = child->nextInPreOrder(parent); layoutO bject; layoutObject = layoutObject->nextInPreOrder(parent)) {
3048 if (Node* node = renderer->nonPseudoNode()) 3048 if (Node* node = layoutObject->nonPseudoNode())
3049 return PositionWithAffinity(firstPositionInOrBeforeNode(node), D OWNSTREAM); 3049 return PositionWithAffinity(firstPositionInOrBeforeNode(node), D OWNSTREAM);
3050 } 3050 }
3051 3051
3052 // Find non-anonymous content before. 3052 // Find non-anonymous content before.
3053 for (LayoutObject* renderer = child->previousInPreOrder(); renderer; ren derer = renderer->previousInPreOrder()) { 3053 for (LayoutObject* layoutObject = child->previousInPreOrder(); layoutObj ect; layoutObject = layoutObject->previousInPreOrder()) {
3054 if (renderer == parent) 3054 if (layoutObject == parent)
3055 break; 3055 break;
3056 if (Node* node = renderer->nonPseudoNode()) 3056 if (Node* node = layoutObject->nonPseudoNode())
3057 return PositionWithAffinity(lastPositionInOrAfterNode(node), DOW NSTREAM); 3057 return PositionWithAffinity(lastPositionInOrAfterNode(node), DOW NSTREAM);
3058 } 3058 }
3059 3059
3060 // Use the parent itself unless it too is anonymous. 3060 // Use the parent itself unless it too is anonymous.
3061 if (Node* node = parent->nonPseudoNode()) 3061 if (Node* node = parent->nonPseudoNode())
3062 return PositionWithAffinity(firstPositionInOrBeforeNode(node), DOWNS TREAM); 3062 return PositionWithAffinity(firstPositionInOrBeforeNode(node), DOWNS TREAM);
3063 3063
3064 // Repeat at the next level up. 3064 // Repeat at the next level up.
3065 child = parent; 3065 child = parent;
3066 } 3066 }
(...skipping 20 matching lines...) Expand all
3087 { 3087 {
3088 if (needsLayout()) 3088 if (needsLayout())
3089 return false; 3089 return false;
3090 3090
3091 const LayoutBlock* containingBlock = this->containingBlock(); 3091 const LayoutBlock* containingBlock = this->containingBlock();
3092 return containingBlock ? !containingBlock->needsLayout() : false; 3092 return containingBlock ? !containingBlock->needsLayout() : false;
3093 } 3093 }
3094 3094
3095 void LayoutObject::setNeedsBoundariesUpdate() 3095 void LayoutObject::setNeedsBoundariesUpdate()
3096 { 3096 {
3097 if (LayoutObject* renderer = parent()) 3097 if (LayoutObject* layoutObject = parent())
3098 renderer->setNeedsBoundariesUpdate(); 3098 layoutObject->setNeedsBoundariesUpdate();
3099 } 3099 }
3100 3100
3101 FloatRect LayoutObject::objectBoundingBox() const 3101 FloatRect LayoutObject::objectBoundingBox() const
3102 { 3102 {
3103 ASSERT_NOT_REACHED(); 3103 ASSERT_NOT_REACHED();
3104 return FloatRect(); 3104 return FloatRect();
3105 } 3105 }
3106 3106
3107 FloatRect LayoutObject::strokeBoundingBox() const 3107 FloatRect LayoutObject::strokeBoundingBox() const
3108 { 3108 {
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
3222 // booleans that are cleared below. 3222 // booleans that are cleared below.
3223 ASSERT(paintInvalidationState.forceCheckForPaintInvalidation() || paintInval idationStateIsDirty()); 3223 ASSERT(paintInvalidationState.forceCheckForPaintInvalidation() || paintInval idationStateIsDirty());
3224 clearShouldDoFullPaintInvalidation(); 3224 clearShouldDoFullPaintInvalidation();
3225 setNeededLayoutBecauseOfChildren(false); 3225 setNeededLayoutBecauseOfChildren(false);
3226 setShouldInvalidateOverflowForPaint(false); 3226 setShouldInvalidateOverflowForPaint(false);
3227 clearLayoutDidGetCalledSinceLastFrame(); 3227 clearLayoutDidGetCalledSinceLastFrame();
3228 clearMayNeedPaintInvalidation(); 3228 clearMayNeedPaintInvalidation();
3229 clearShouldInvalidateSelection(); 3229 clearShouldInvalidateSelection();
3230 } 3230 }
3231 3231
3232 bool LayoutObject::isAllowedToModifyRenderTreeStructure(Document& document) 3232 bool LayoutObject::isAllowedToModifyLayoutTreeStructure(Document& document)
3233 { 3233 {
3234 return DeprecatedDisableModifyRenderTreeStructureAsserts::canModifyRenderTre eStateInAnyState() 3234 return DeprecatedDisableModifyLayoutTreeStructureAsserts::canModifyLayoutTre eStateInAnyState()
3235 || document.lifecycle().stateAllowsRenderTreeMutations(); 3235 || document.lifecycle().stateAllowsLayoutTreeMutations();
3236 } 3236 }
3237 3237
3238 DeprecatedDisableModifyRenderTreeStructureAsserts::DeprecatedDisableModifyRender TreeStructureAsserts() 3238 DeprecatedDisableModifyLayoutTreeStructureAsserts::DeprecatedDisableModifyLayout TreeStructureAsserts()
3239 : m_disabler(gModifyRenderTreeStructureAnyState, true) 3239 : m_disabler(gModifyLayoutTreeStructureAnyState, true)
3240 { 3240 {
3241 } 3241 }
3242 3242
3243 bool DeprecatedDisableModifyRenderTreeStructureAsserts::canModifyRenderTreeState InAnyState() 3243 bool DeprecatedDisableModifyLayoutTreeStructureAsserts::canModifyLayoutTreeState InAnyState()
3244 { 3244 {
3245 return gModifyRenderTreeStructureAnyState; 3245 return gModifyLayoutTreeStructureAnyState;
3246 } 3246 }
3247 3247
3248 DisablePaintInvalidationStateAsserts::DisablePaintInvalidationStateAsserts() 3248 DisablePaintInvalidationStateAsserts::DisablePaintInvalidationStateAsserts()
3249 : m_disabler(gDisablePaintInvalidationStateAsserts, true) 3249 : m_disabler(gDisablePaintInvalidationStateAsserts, true)
3250 { 3250 {
3251 } 3251 }
3252 3252
3253 // Since we're only painting non-composited layers, we know that they all share the same paintInvalidationContainer. 3253 // Since we're only painting non-composited layers, we know that they all share the same paintInvalidationContainer.
3254 void LayoutObject::invalidatePaintIncludingNonCompositingDescendants() 3254 void LayoutObject::invalidatePaintIncludingNonCompositingDescendants()
3255 { 3255 {
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
3294 { 3294 {
3295 if (object1) { 3295 if (object1) {
3296 const blink::LayoutObject* root = object1; 3296 const blink::LayoutObject* root = object1;
3297 while (root->parent()) 3297 while (root->parent())
3298 root = root->parent(); 3298 root = root->parent();
3299 root->showLayoutTreeAndMark(object1, "*", object2, "-", 0); 3299 root->showLayoutTreeAndMark(object1, "*", object2, "-", 0);
3300 } 3300 }
3301 } 3301 }
3302 3302
3303 #endif 3303 #endif
OLDNEW
« no previous file with comments | « Source/core/layout/LayoutObject.h ('k') | Source/core/layout/LayoutView.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698