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

Side by Side Diff: Source/core/rendering/RenderObject.cpp

Issue 360833002: Divorce PaintInvalidationState from LayoutState (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: ToT-ed Created 6 years, 5 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
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 1286 matching lines...) Expand 10 before | Expand all | Expand 10 after
1297 pos.move(box->locationOffset()); // FIXME: Snap offsets? crbug.c om/350474 1297 pos.move(box->locationOffset()); // FIXME: Snap offsets? crbug.c om/350474
1298 box->addFocusRingRects(rects, flooredIntPoint(pos), paintContain er); 1298 box->addFocusRingRects(rects, flooredIntPoint(pos), paintContain er);
1299 } 1299 }
1300 } else { 1300 } else {
1301 current->addFocusRingRects(rects, additionalOffset, paintContainer); 1301 current->addFocusRingRects(rects, additionalOffset, paintContainer);
1302 } 1302 }
1303 } 1303 }
1304 } 1304 }
1305 1305
1306 // FIXME: In repaint-after-layout, we should be able to change the logic to remo ve the need for this function. See crbug.com/368416. 1306 // FIXME: In repaint-after-layout, we should be able to change the logic to remo ve the need for this function. See crbug.com/368416.
1307 LayoutPoint RenderObject::positionFromPaintInvalidationContainer(const RenderLay erModelObject* paintInvalidationContainer) const 1307 LayoutPoint RenderObject::positionFromPaintInvalidationContainer(const RenderLay erModelObject* paintInvalidationContainer, const InvalidationTreeWalkState* inva lidationTreeWalkState) const
1308 { 1308 {
1309 // FIXME: This assert should be re-enabled when we move paint invalidation t o after compositing update. crbug.com/360286 1309 // FIXME: This assert should be re-enabled when we move paint invalidation t o after compositing update. crbug.com/360286
1310 // ASSERT(containerForPaintInvalidation() == paintInvalidationContainer); 1310 // ASSERT(containerForPaintInvalidation() == paintInvalidationContainer);
1311 1311
1312 LayoutPoint offset = isBox() ? toRenderBox(this)->location() : LayoutPoint() ; 1312 LayoutPoint offset = isBox() ? toRenderBox(this)->location() : LayoutPoint() ;
1313 if (paintInvalidationContainer == this) 1313 if (paintInvalidationContainer == this)
1314 return offset; 1314 return offset;
1315 1315
1316 return roundedIntPoint(localToContainerPoint(offset, paintInvalidationContai ner)); 1316 return roundedIntPoint(localToContainerPoint(offset, paintInvalidationContai ner, 0, 0, invalidationTreeWalkState));
1317 } 1317 }
1318 1318
1319 IntRect RenderObject::absoluteBoundingBoxRect() const 1319 IntRect RenderObject::absoluteBoundingBoxRect() const
1320 { 1320 {
1321 Vector<FloatQuad> quads; 1321 Vector<FloatQuad> quads;
1322 absoluteQuads(quads); 1322 absoluteQuads(quads);
1323 1323
1324 size_t n = quads.size(); 1324 size_t n = quads.size();
1325 if (!n) 1325 if (!n)
1326 return IntRect(); 1326 return IntRect();
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after
1452 } 1452 }
1453 1453
1454 static PassRefPtr<TraceEvent::ConvertableToTraceFormat> jsonObjectForPaintInvali dationInfo(const IntRect& rect, const String& invalidationReason) 1454 static PassRefPtr<TraceEvent::ConvertableToTraceFormat> jsonObjectForPaintInvali dationInfo(const IntRect& rect, const String& invalidationReason)
1455 { 1455 {
1456 TracedValue value; 1456 TracedValue value;
1457 addJsonObjectForRect(value, "rect", rect); 1457 addJsonObjectForRect(value, "rect", rect);
1458 value.setString("invalidation_reason", invalidationReason); 1458 value.setString("invalidation_reason", invalidationReason);
1459 return value.finish(); 1459 return value.finish();
1460 } 1460 }
1461 1461
1462 LayoutRect RenderObject::computePaintInvalidationRect(const RenderLayerModelObje ct* paintInvalidationContainer) const 1462 LayoutRect RenderObject::computePaintInvalidationRect(const RenderLayerModelObje ct* paintInvalidationContainer, const InvalidationTreeWalkState* invalidationTre eWalkState) const
1463 { 1463 {
1464 return clippedOverflowRectForPaintInvalidation(paintInvalidationContainer); 1464 return clippedOverflowRectForPaintInvalidation(paintInvalidationContainer, i nvalidationTreeWalkState);
1465 } 1465 }
1466 1466
1467 void RenderObject::invalidatePaintUsingContainer(const RenderLayerModelObject* p aintInvalidationContainer, const IntRect& r, InvalidationReason invalidationReas on) const 1467 void RenderObject::invalidatePaintUsingContainer(const RenderLayerModelObject* p aintInvalidationContainer, const IntRect& r, InvalidationReason invalidationReas on) const
1468 { 1468 {
1469 if (r.isEmpty()) 1469 if (r.isEmpty())
1470 return; 1470 return;
1471 1471
1472 // FIXME: This should be an assert, but editing/selection can trigger this c ase to invalidate 1472 // FIXME: This should be an assert, but editing/selection can trigger this c ase to invalidate
1473 // the selection. crbug.com/368140. 1473 // the selection. crbug.com/368140.
1474 if (!isRooted()) 1474 if (!isRooted())
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
1513 return; // Don't invalidate paints if we're printing. 1513 return; // Don't invalidate paints if we're printing.
1514 1514
1515 // FIXME: really, we're in the paint invalidation phase here, and the follow ing queries are legal. 1515 // FIXME: really, we're in the paint invalidation phase here, and the follow ing queries are legal.
1516 // Until those states are fully fledged, I'll just disable the ASSERTS. 1516 // Until those states are fully fledged, I'll just disable the ASSERTS.
1517 DisableCompositingQueryAsserts disabler; 1517 DisableCompositingQueryAsserts disabler;
1518 const RenderLayerModelObject* paintInvalidationContainer = containerForPaint Invalidation(); 1518 const RenderLayerModelObject* paintInvalidationContainer = containerForPaint Invalidation();
1519 LayoutRect paintInvalidationRect = boundsRectForPaintInvalidation(paintInval idationContainer); 1519 LayoutRect paintInvalidationRect = boundsRectForPaintInvalidation(paintInval idationContainer);
1520 invalidatePaintUsingContainer(paintInvalidationContainer, pixelSnappedIntRec t(paintInvalidationRect), InvalidationPaint); 1520 invalidatePaintUsingContainer(paintInvalidationContainer, pixelSnappedIntRec t(paintInvalidationRect), InvalidationPaint);
1521 } 1521 }
1522 1522
1523 LayoutRect RenderObject::boundsRectForPaintInvalidation(const RenderLayerModelOb ject* paintInvalidationContainer) const 1523 LayoutRect RenderObject::boundsRectForPaintInvalidation(const RenderLayerModelOb ject* paintInvalidationContainer, const InvalidationTreeWalkState* invalidationT reeWalkState) const
1524 { 1524 {
1525 if (!paintInvalidationContainer) 1525 if (!paintInvalidationContainer)
1526 return computePaintInvalidationRect(paintInvalidationContainer); 1526 return computePaintInvalidationRect(paintInvalidationContainer, invalida tionTreeWalkState);
1527 return RenderLayer::computePaintInvalidationRect(this, paintInvalidationCont ainer->layer()); 1527 return RenderLayer::computePaintInvalidationRect(this, paintInvalidationCont ainer->layer(), invalidationTreeWalkState);
1528 } 1528 }
1529 1529
1530 void RenderObject::invalidatePaintRectangle(const LayoutRect& r) const 1530 void RenderObject::invalidatePaintRectangle(const LayoutRect& r) const
1531 { 1531 {
1532 if (!isRooted()) 1532 if (!isRooted())
1533 return; 1533 return;
1534 1534
1535 if (view()->document().printing()) 1535 if (view()->document().printing())
1536 return; // Don't invalidate paints if we're printing. 1536 return; // Don't invalidate paints if we're printing.
1537 1537
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
1574 return "layer"; 1574 return "layer";
1575 case InvalidationPaint: 1575 case InvalidationPaint:
1576 return "invalidate paint"; 1576 return "invalidate paint";
1577 case InvalidationPaintRectangle: 1577 case InvalidationPaintRectangle:
1578 return "invalidate paint rectangle"; 1578 return "invalidate paint rectangle";
1579 } 1579 }
1580 ASSERT_NOT_REACHED(); 1580 ASSERT_NOT_REACHED();
1581 return ""; 1581 return "";
1582 } 1582 }
1583 1583
1584 void RenderObject::invalidateTreeAfterLayout(const RenderLayerModelObject& paint InvalidationContainer) 1584 void RenderObject::invalidateTreeAfterLayout(const InvalidationTreeWalkState& in validationTreeWalkState)
1585 { 1585 {
1586 // If we didn't need paint invalidation then our children don't need as well . 1586 // If we didn't need paint invalidation then our children don't need as well .
1587 // Skip walking down the tree as everything should be fine below us. 1587 // Skip walking down the tree as everything should be fine below us.
1588 if (!shouldCheckForPaintInvalidationAfterLayout()) 1588 if (!shouldCheckForPaintInvalidationAfterLayout())
1589 return; 1589 return;
1590 1590
1591 clearPaintInvalidationState(); 1591 clearPaintInvalidationState();
1592 1592
1593 for (RenderObject* child = slowFirstChild(); child; child = child->nextSibli ng()) { 1593 for (RenderObject* child = slowFirstChild(); child; child = child->nextSibli ng()) {
1594 if (!child->isOutOfFlowPositioned()) 1594 if (!child->isOutOfFlowPositioned())
1595 child->invalidateTreeAfterLayout(paintInvalidationContainer); 1595 child->invalidateTreeAfterLayout(invalidationTreeWalkState);
1596 } 1596 }
1597 } 1597 }
1598 1598
1599 static PassRefPtr<TraceEvent::ConvertableToTraceFormat> jsonObjectForOldAndNewRe cts(const LayoutRect& oldRect, const LayoutRect& newRect) 1599 static PassRefPtr<TraceEvent::ConvertableToTraceFormat> jsonObjectForOldAndNewRe cts(const LayoutRect& oldRect, const LayoutRect& newRect)
1600 { 1600 {
1601 TracedValue value; 1601 TracedValue value;
1602 addJsonObjectForRect(value, "old", oldRect); 1602 addJsonObjectForRect(value, "old", oldRect);
1603 addJsonObjectForRect(value, "new", newRect); 1603 addJsonObjectForRect(value, "new", newRect);
1604 return value.finish(); 1604 return value.finish();
1605 } 1605 }
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
1703 { 1703 {
1704 if (shouldInvalidateOverflowForPaint()) 1704 if (shouldInvalidateOverflowForPaint())
1705 invalidatePaintForOverflow(); 1705 invalidatePaintForOverflow();
1706 } 1706 }
1707 1707
1708 bool RenderObject::checkForPaintInvalidation() const 1708 bool RenderObject::checkForPaintInvalidation() const
1709 { 1709 {
1710 return !document().view()->needsFullPaintInvalidation() && everHadLayout(); 1710 return !document().view()->needsFullPaintInvalidation() && everHadLayout();
1711 } 1711 }
1712 1712
1713 LayoutRect RenderObject::rectWithOutlineForPaintInvalidation(const RenderLayerMo delObject* paintInvalidationContainer, LayoutUnit outlineWidth) const 1713 LayoutRect RenderObject::rectWithOutlineForPaintInvalidation(const RenderLayerMo delObject* paintInvalidationContainer, LayoutUnit outlineWidth, const Invalidati onTreeWalkState* invalidationTreeWalkState) const
1714 { 1714 {
1715 LayoutRect r(clippedOverflowRectForPaintInvalidation(paintInvalidationContai ner)); 1715 LayoutRect r(clippedOverflowRectForPaintInvalidation(paintInvalidationContai ner, invalidationTreeWalkState));
1716 r.inflate(outlineWidth); 1716 r.inflate(outlineWidth);
1717 return r; 1717 return r;
1718 } 1718 }
1719 1719
1720 LayoutRect RenderObject::clippedOverflowRectForPaintInvalidation(const RenderLay erModelObject*) const 1720 LayoutRect RenderObject::clippedOverflowRectForPaintInvalidation(const RenderLay erModelObject*, const InvalidationTreeWalkState*) const
1721 { 1721 {
1722 ASSERT_NOT_REACHED(); 1722 ASSERT_NOT_REACHED();
1723 return LayoutRect(); 1723 return LayoutRect();
1724 } 1724 }
1725 1725
1726 void RenderObject::mapRectToPaintInvalidationBacking(const RenderLayerModelObjec t* paintInvalidationContainer, LayoutRect& rect, bool fixed) const 1726 void RenderObject::mapRectToPaintInvalidationBacking(const RenderLayerModelObjec t* paintInvalidationContainer, LayoutRect& rect, bool fixed, const InvalidationT reeWalkState* invalidationTreeWalkState) const
1727 { 1727 {
1728 if (paintInvalidationContainer == this) 1728 if (paintInvalidationContainer == this)
1729 return; 1729 return;
1730 1730
1731 if (RenderObject* o = parent()) { 1731 if (RenderObject* o = parent()) {
1732 if (o->isRenderBlockFlow()) { 1732 if (o->isRenderBlockFlow()) {
1733 RenderBlock* cb = toRenderBlock(o); 1733 RenderBlock* cb = toRenderBlock(o);
1734 if (cb->hasColumns()) 1734 if (cb->hasColumns())
1735 cb->adjustRectForColumns(rect); 1735 cb->adjustRectForColumns(rect);
1736 } 1736 }
1737 1737
1738 if (o->hasOverflowClip()) { 1738 if (o->hasOverflowClip()) {
1739 RenderBox* boxParent = toRenderBox(o); 1739 RenderBox* boxParent = toRenderBox(o);
1740 boxParent->applyCachedClipAndScrollOffsetForRepaint(rect); 1740 boxParent->applyCachedClipAndScrollOffsetForRepaint(rect);
1741 if (rect.isEmpty()) 1741 if (rect.isEmpty())
1742 return; 1742 return;
1743 } 1743 }
1744 1744
1745 o->mapRectToPaintInvalidationBacking(paintInvalidationContainer, rect, f ixed); 1745 o->mapRectToPaintInvalidationBacking(paintInvalidationContainer, rect, f ixed, invalidationTreeWalkState);
1746 } 1746 }
1747 } 1747 }
1748 1748
1749 void RenderObject::computeFloatRectForPaintInvalidation(const RenderLayerModelOb ject*, FloatRect&, bool) const 1749 void RenderObject::computeFloatRectForPaintInvalidation(const RenderLayerModelOb ject*, FloatRect&, bool, const InvalidationTreeWalkState*) const
1750 { 1750 {
1751 ASSERT_NOT_REACHED(); 1751 ASSERT_NOT_REACHED();
1752 } 1752 }
1753 1753
1754 void RenderObject::dirtyLinesFromChangedChild(RenderObject*) 1754 void RenderObject::dirtyLinesFromChangedChild(RenderObject*)
1755 { 1755 {
1756 } 1756 }
1757 1757
1758 #ifndef NDEBUG 1758 #ifndef NDEBUG
1759 1759
(...skipping 536 matching lines...) Expand 10 before | Expand all | Expand 10 after
2296 } 2296 }
2297 2297
2298 FloatQuad RenderObject::absoluteToLocalQuad(const FloatQuad& quad, MapCoordinate sFlags mode) const 2298 FloatQuad RenderObject::absoluteToLocalQuad(const FloatQuad& quad, MapCoordinate sFlags mode) const
2299 { 2299 {
2300 TransformState transformState(TransformState::UnapplyInverseTransformDirecti on, quad.boundingBox().center(), quad); 2300 TransformState transformState(TransformState::UnapplyInverseTransformDirecti on, quad.boundingBox().center(), quad);
2301 mapAbsoluteToLocalPoint(mode, transformState); 2301 mapAbsoluteToLocalPoint(mode, transformState);
2302 transformState.flatten(); 2302 transformState.flatten();
2303 return transformState.lastPlanarQuad(); 2303 return transformState.lastPlanarQuad();
2304 } 2304 }
2305 2305
2306 void RenderObject::mapLocalToContainer(const RenderLayerModelObject* paintInvali dationContainer, TransformState& transformState, MapCoordinatesFlags mode, bool* wasFixed) const 2306 void RenderObject::mapLocalToContainer(const RenderLayerModelObject* paintInvali dationContainer, TransformState& transformState, MapCoordinatesFlags mode, bool* wasFixed, const InvalidationTreeWalkState* invalidationTreeWalkState) const
2307 { 2307 {
2308 if (paintInvalidationContainer == this) 2308 if (paintInvalidationContainer == this)
2309 return; 2309 return;
2310 2310
2311 RenderObject* o = parent(); 2311 RenderObject* o = parent();
2312 if (!o) 2312 if (!o)
2313 return; 2313 return;
2314 2314
2315 // FIXME: this should call offsetFromContainer to share code, but I'm not su re it's ever called. 2315 // FIXME: this should call offsetFromContainer to share code, but I'm not su re it's ever called.
2316 LayoutPoint centerPoint = roundedLayoutPoint(transformState.mappedPoint()); 2316 LayoutPoint centerPoint = roundedLayoutPoint(transformState.mappedPoint());
2317 if (mode & ApplyContainerFlip && o->isBox()) { 2317 if (mode & ApplyContainerFlip && o->isBox()) {
2318 if (o->style()->isFlippedBlocksWritingMode()) 2318 if (o->style()->isFlippedBlocksWritingMode())
2319 transformState.move(toRenderBox(o)->flipForWritingModeIncludingColum ns(roundedLayoutPoint(transformState.mappedPoint())) - centerPoint); 2319 transformState.move(toRenderBox(o)->flipForWritingModeIncludingColum ns(roundedLayoutPoint(transformState.mappedPoint())) - centerPoint);
2320 mode &= ~ApplyContainerFlip; 2320 mode &= ~ApplyContainerFlip;
2321 } 2321 }
2322 2322
2323 transformState.move(o->columnOffset(roundedLayoutPoint(transformState.mapped Point()))); 2323 transformState.move(o->columnOffset(roundedLayoutPoint(transformState.mapped Point())));
2324 2324
2325 if (o->hasOverflowClip()) 2325 if (o->hasOverflowClip())
2326 transformState.move(-toRenderBox(o)->scrolledContentOffset()); 2326 transformState.move(-toRenderBox(o)->scrolledContentOffset());
2327 2327
2328 o->mapLocalToContainer(paintInvalidationContainer, transformState, mode, was Fixed); 2328 o->mapLocalToContainer(paintInvalidationContainer, transformState, mode, was Fixed, invalidationTreeWalkState);
2329 } 2329 }
2330 2330
2331 const RenderObject* RenderObject::pushMappingToContainer(const RenderLayerModelO bject* ancestorToStopAt, RenderGeometryMap& geometryMap) const 2331 const RenderObject* RenderObject::pushMappingToContainer(const RenderLayerModelO bject* ancestorToStopAt, RenderGeometryMap& geometryMap) const
2332 { 2332 {
2333 ASSERT_UNUSED(ancestorToStopAt, ancestorToStopAt != this); 2333 ASSERT_UNUSED(ancestorToStopAt, ancestorToStopAt != this);
2334 2334
2335 RenderObject* container = parent(); 2335 RenderObject* container = parent();
2336 if (!container) 2336 if (!container)
2337 return 0; 2337 return 0;
2338 2338
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
2389 { 2389 {
2390 // Track the point at the center of the quad's bounding box. As mapLocalToCo ntainer() calls offsetFromContainer(), 2390 // Track the point at the center of the quad's bounding box. As mapLocalToCo ntainer() calls offsetFromContainer(),
2391 // it will use that point as the reference point to decide which column's tr ansform to apply in multiple-column blocks. 2391 // it will use that point as the reference point to decide which column's tr ansform to apply in multiple-column blocks.
2392 TransformState transformState(TransformState::ApplyTransformDirection, local Quad.boundingBox().center(), localQuad); 2392 TransformState transformState(TransformState::ApplyTransformDirection, local Quad.boundingBox().center(), localQuad);
2393 mapLocalToContainer(paintInvalidationContainer, transformState, mode | Apply ContainerFlip | UseTransforms, wasFixed); 2393 mapLocalToContainer(paintInvalidationContainer, transformState, mode | Apply ContainerFlip | UseTransforms, wasFixed);
2394 transformState.flatten(); 2394 transformState.flatten();
2395 2395
2396 return transformState.lastPlanarQuad(); 2396 return transformState.lastPlanarQuad();
2397 } 2397 }
2398 2398
2399 FloatPoint RenderObject::localToContainerPoint(const FloatPoint& localPoint, con st RenderLayerModelObject* paintInvalidationContainer, MapCoordinatesFlags mode, bool* wasFixed) const 2399 FloatPoint RenderObject::localToContainerPoint(const FloatPoint& localPoint, con st RenderLayerModelObject* paintInvalidationContainer, MapCoordinatesFlags mode, bool* wasFixed, const InvalidationTreeWalkState* invalidationTreeWalkState) con st
2400 { 2400 {
2401 TransformState transformState(TransformState::ApplyTransformDirection, local Point); 2401 TransformState transformState(TransformState::ApplyTransformDirection, local Point);
2402 mapLocalToContainer(paintInvalidationContainer, transformState, mode | Apply ContainerFlip | UseTransforms, wasFixed); 2402 mapLocalToContainer(paintInvalidationContainer, transformState, mode | Apply ContainerFlip | UseTransforms, wasFixed, invalidationTreeWalkState);
2403 transformState.flatten(); 2403 transformState.flatten();
2404 2404
2405 return transformState.lastPlanarPoint(); 2405 return transformState.lastPlanarPoint();
2406 } 2406 }
2407 2407
2408 LayoutSize RenderObject::offsetFromContainer(const RenderObject* o, const Layout Point& point, bool* offsetDependsOnPoint) const 2408 LayoutSize RenderObject::offsetFromContainer(const RenderObject* o, const Layout Point& point, bool* offsetDependsOnPoint) const
2409 { 2409 {
2410 ASSERT(o == container()); 2410 ASSERT(o == container());
2411 2411
2412 LayoutSize offset = o->columnOffset(point); 2412 LayoutSize offset = o->columnOffset(point);
(...skipping 1018 matching lines...) Expand 10 before | Expand all | Expand 10 after
3431 { 3431 {
3432 if (object1) { 3432 if (object1) {
3433 const WebCore::RenderObject* root = object1; 3433 const WebCore::RenderObject* root = object1;
3434 while (root->parent()) 3434 while (root->parent())
3435 root = root->parent(); 3435 root = root->parent();
3436 root->showRenderTreeAndMark(object1, "*", object2, "-", 0); 3436 root->showRenderTreeAndMark(object1, "*", object2, "-", 0);
3437 } 3437 }
3438 } 3438 }
3439 3439
3440 #endif 3440 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698