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

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

Issue 208143003: Issue trace events to gather repaint information. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 6 years, 9 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/rendering/RenderObject.h ('k') | no next file » | 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 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
75 #include "core/rendering/compositing/RenderLayerCompositor.h" 75 #include "core/rendering/compositing/RenderLayerCompositor.h"
76 #include "core/rendering/style/ContentData.h" 76 #include "core/rendering/style/ContentData.h"
77 #include "core/rendering/style/CursorList.h" 77 #include "core/rendering/style/CursorList.h"
78 #include "core/rendering/style/ShadowList.h" 78 #include "core/rendering/style/ShadowList.h"
79 #include "core/rendering/svg/SVGRenderSupport.h" 79 #include "core/rendering/svg/SVGRenderSupport.h"
80 #include "platform/Partitions.h" 80 #include "platform/Partitions.h"
81 #include "platform/geometry/TransformState.h" 81 #include "platform/geometry/TransformState.h"
82 #include "platform/graphics/GraphicsContext.h" 82 #include "platform/graphics/GraphicsContext.h"
83 #include "wtf/RefCountedLeakCounter.h" 83 #include "wtf/RefCountedLeakCounter.h"
84 #include "wtf/text/StringBuilder.h" 84 #include "wtf/text/StringBuilder.h"
85 #include "wtf/text/WTFString.h"
85 #include <algorithm> 86 #include <algorithm>
86 #ifndef NDEBUG 87 #ifndef NDEBUG
87 #include <stdio.h> 88 #include <stdio.h>
88 #endif 89 #endif
89 90
90 using namespace std; 91 using namespace std;
91 92
92 namespace WebCore { 93 namespace WebCore {
93 94
94 using namespace HTMLNames; 95 using namespace HTMLNames;
(...skipping 1276 matching lines...) Expand 10 before | Expand all | Expand 10 after
1371 // flow thread. Otherwise we will need to catch the repaint call and sen d it to the flow thread. 1372 // flow thread. Otherwise we will need to catch the repaint call and sen d it to the flow thread.
1372 RenderFlowThread* repaintContainerFlowThread = repaintContainer ? repain tContainer->flowThreadContainingBlock() : 0; 1373 RenderFlowThread* repaintContainerFlowThread = repaintContainer ? repain tContainer->flowThreadContainingBlock() : 0;
1373 if (!repaintContainerFlowThread || repaintContainerFlowThread != parentR enderFlowThread) 1374 if (!repaintContainerFlowThread || repaintContainerFlowThread != parentR enderFlowThread)
1374 repaintContainer = parentRenderFlowThread; 1375 repaintContainer = parentRenderFlowThread;
1375 } 1376 }
1376 return repaintContainer; 1377 return repaintContainer;
1377 } 1378 }
1378 1379
1379 void RenderObject::repaintUsingContainer(const RenderLayerModelObject* repaintCo ntainer, const IntRect& r) const 1380 void RenderObject::repaintUsingContainer(const RenderLayerModelObject* repaintCo ntainer, const IntRect& r) const
1380 { 1381 {
1382 TRACE_EVENT2(TRACE_DISABLED_BY_DEFAULT("blink.repaint"), "RenderObject::repa intUsingContainer()",
1383 "object", TRACE_STR_COPY(this->debugName().ascii().data()),
1384 "rect", TRACE_STR_COPY(String::format("%d,%d %dx%d", r.x(), r.y(), r.wid th(), r.height()).ascii().data()));
1385
1381 if (!repaintContainer) { 1386 if (!repaintContainer) {
1382 view()->repaintViewRectangle(r); 1387 view()->repaintViewRectangle(r);
1383 return; 1388 return;
1384 } 1389 }
1385 1390
1386 // FIXME: Don't read compositing state here since we do this in the middle o f recalc/layout. 1391 // FIXME: Don't read compositing state here since we do this in the middle o f recalc/layout.
1387 DisableCompositingQueryAsserts disabler; 1392 DisableCompositingQueryAsserts disabler;
1388 if (repaintContainer->compositingState() == PaintsIntoGroupedBacking) { 1393 if (repaintContainer->compositingState() == PaintsIntoGroupedBacking) {
1389 ASSERT(repaintContainer->groupedMapping()); 1394 ASSERT(repaintContainer->groupedMapping());
1390 1395
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
1442 void RenderObject::repaint() const 1447 void RenderObject::repaint() const
1443 { 1448 {
1444 // Don't repaint if we're unrooted (note that view() still returns the view when unrooted) 1449 // Don't repaint if we're unrooted (note that view() still returns the view when unrooted)
1445 RenderView* view; 1450 RenderView* view;
1446 if (!isRooted(&view)) 1451 if (!isRooted(&view))
1447 return; 1452 return;
1448 1453
1449 if (view->document().printing()) 1454 if (view->document().printing())
1450 return; // Don't repaint if we're printing. 1455 return; // Don't repaint if we're printing.
1451 1456
1457 TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("blink.repaint"), "RenderObject::repa int()",
1458 "object", TRACE_STR_COPY(this->debugName().ascii().data()));
1459
1452 // FIXME: really, we're in the repaint phase here, and the following queries are legal. 1460 // FIXME: really, we're in the repaint phase here, and the following queries are legal.
1453 // Until those states are fully fledged, I'll just disable the ASSERTS. 1461 // Until those states are fully fledged, I'll just disable the ASSERTS.
1454 DisableCompositingQueryAsserts disabler; 1462 DisableCompositingQueryAsserts disabler;
1455 RenderLayerModelObject* repaintContainer = containerForRepaint(); 1463 RenderLayerModelObject* repaintContainer = containerForRepaint();
1456 repaintUsingContainer(repaintContainer ? repaintContainer : view, pixelSnapp edIntRect(clippedOverflowRectForRepaint(repaintContainer))); 1464 repaintUsingContainer(repaintContainer ? repaintContainer : view, pixelSnapp edIntRect(clippedOverflowRectForRepaint(repaintContainer)));
1457 } 1465 }
1458 1466
1459 void RenderObject::repaintRectangle(const LayoutRect& r) const 1467 void RenderObject::repaintRectangle(const LayoutRect& r) const
1460 { 1468 {
1461 // Don't repaint if we're unrooted (note that view() still returns the view when unrooted) 1469 // Don't repaint if we're unrooted (note that view() still returns the view when unrooted)
1462 RenderView* view; 1470 RenderView* view;
1463 if (!isRooted(&view)) 1471 if (!isRooted(&view))
1464 return; 1472 return;
1465 1473
1466 if (view->document().printing()) 1474 if (view->document().printing())
1467 return; // Don't repaint if we're printing. 1475 return; // Don't repaint if we're printing.
1468 1476
1477 TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("blink.repaint"), "RenderObject::repa intRectangle()",
Julien - ping for review 2014/03/21 18:35:34 Is there a lot of values in tracing callers of rep
dsinclair 2014/03/24 15:04:31 The invalidationReasons are only coming from repai
1478 "object", TRACE_STR_COPY(this->debugName().ascii().data()));
1479
1469 LayoutRect dirtyRect(r); 1480 LayoutRect dirtyRect(r);
1470 1481
1471 if (!RuntimeEnabledFeatures::repaintAfterLayoutEnabled()) { 1482 if (!RuntimeEnabledFeatures::repaintAfterLayoutEnabled()) {
1472 // FIXME: layoutDelta needs to be applied in parts before/after transfor ms and 1483 // FIXME: layoutDelta needs to be applied in parts before/after transfor ms and
1473 // repaint containers. https://bugs.webkit.org/show_bug.cgi?id=23308 1484 // repaint containers. https://bugs.webkit.org/show_bug.cgi?id=23308
1474 dirtyRect.move(view->layoutDelta()); 1485 dirtyRect.move(view->layoutDelta());
1475 } 1486 }
1476 1487
1477 RenderLayerModelObject* repaintContainer = containerForRepaint(); 1488 RenderLayerModelObject* repaintContainer = containerForRepaint();
1478 computeRectForRepaint(repaintContainer, dirtyRect); 1489 computeRectForRepaint(repaintContainer, dirtyRect);
1479 repaintUsingContainer(repaintContainer ? repaintContainer : view, pixelSnapp edIntRect(dirtyRect)); 1490 repaintUsingContainer(repaintContainer ? repaintContainer : view, pixelSnapp edIntRect(dirtyRect));
1480 } 1491 }
1481 1492
1482 IntRect RenderObject::pixelSnappedAbsoluteClippedOverflowRect() const 1493 IntRect RenderObject::pixelSnappedAbsoluteClippedOverflowRect() const
1483 { 1494 {
1484 return pixelSnappedIntRect(absoluteClippedOverflowRect()); 1495 return pixelSnappedIntRect(absoluteClippedOverflowRect());
1485 } 1496 }
1486 1497
1498 const char* RenderObject::repaintReasonToString(const RepaintReason reason) cons t
1499 {
1500 switch (reason) {
1501 case RepaintNone:
1502 return "none";
1503 case RepaintSelfLayout:
1504 return "self layout";
1505 case RepaintBorderFitLines:
1506 return "border fit lines";
1507 case RepaintBorderRadius:
1508 return "border radius";
1509 case RepaintOutlineBoxChange:
1510 return "outline box change";
1511 case RepaintBoundsChange:
1512 return "bounds change";
1513 default:
1514 return "unknown";
1515 }
1516 }
1517
1487 bool RenderObject::repaintAfterLayoutIfNeeded(const RenderLayerModelObject* repa intContainer, bool wasSelfLayout, 1518 bool RenderObject::repaintAfterLayoutIfNeeded(const RenderLayerModelObject* repa intContainer, bool wasSelfLayout,
1488 const LayoutRect& oldBounds, const LayoutRect& oldOutlineBox, 1519 const LayoutRect& oldBounds, const LayoutRect& oldOutlineBox,
1489 const LayoutRect* newBoundsPtr, const LayoutRect* newOutlineBoxRectPtr) 1520 const LayoutRect* newBoundsPtr, const LayoutRect* newOutlineBoxRectPtr)
1490 { 1521 {
1491 RenderView* v = view(); 1522 RenderView* v = view();
1492 if (v->document().printing()) 1523 if (v->document().printing())
1493 return false; // Don't repaint if we're printing. 1524 return false; // Don't repaint if we're printing.
1494 1525
1526 TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("blink.repaint"), "RenderObject::repa intAfterLayoutIfNeeded",
1527 "object", TRACE_STR_COPY(this->debugName().ascii().data()));
1528
1495 // This ASSERT fails due to animations. See https://bugs.webkit.org/show_bu g.cgi?id=37048 1529 // This ASSERT fails due to animations. See https://bugs.webkit.org/show_bu g.cgi?id=37048
1496 // ASSERT(!newBoundsPtr || *newBoundsPtr == clippedOverflowRectForRepaint(re paintContainer)); 1530 // ASSERT(!newBoundsPtr || *newBoundsPtr == clippedOverflowRectForRepaint(re paintContainer));
1497 LayoutRect newBounds = newBoundsPtr ? *newBoundsPtr : clippedOverflowRectFor Repaint(repaintContainer); 1531 LayoutRect newBounds = newBoundsPtr ? *newBoundsPtr : clippedOverflowRectFor Repaint(repaintContainer);
1498 LayoutRect newOutlineBox; 1532 LayoutRect newOutlineBox;
1499 1533
1500 bool fullRepaint = wasSelfLayout; 1534 RepaintReason repaintReason = RepaintNone;
Julien - ping for review 2014/03/21 18:35:34 I hate RepaintNone as a default reason. I think th
dsinclair 2014/03/24 15:04:31 Done.
1535 if (wasSelfLayout)
1536 repaintReason = RepaintSelfLayout;
1537
1501 // Presumably a background or a border exists if border-fit:lines was specif ied. 1538 // Presumably a background or a border exists if border-fit:lines was specif ied.
1502 if (!fullRepaint && style()->borderFit() == BorderFitLines) 1539 if (repaintReason == RepaintNone && style()->borderFit() == BorderFitLines)
1503 fullRepaint = true; 1540 repaintReason = RepaintBorderFitLines;
1504 if (!fullRepaint && style()->hasBorderRadius()) { 1541
1542 if (repaintReason == RepaintNone&& style()->hasBorderRadius()) {
1505 // If a border-radius exists and width/height is smaller than 1543 // If a border-radius exists and width/height is smaller than
1506 // radius width/height, we cannot use delta-repaint. 1544 // radius width/height, we cannot use delta-repaint.
1507 RoundedRect oldRoundedRect = style()->getRoundedBorderFor(oldBounds); 1545 RoundedRect oldRoundedRect = style()->getRoundedBorderFor(oldBounds);
1508 RoundedRect newRoundedRect = style()->getRoundedBorderFor(newBounds); 1546 RoundedRect newRoundedRect = style()->getRoundedBorderFor(newBounds);
1509 fullRepaint = oldRoundedRect.radii() != newRoundedRect.radii(); 1547 if (oldRoundedRect.radii() != newRoundedRect.radii())
1548 repaintReason = RepaintBorderRadius;
1510 } 1549 }
1511 if (!fullRepaint) { 1550
1551 if (repaintReason == RepaintNone) {
1512 // This ASSERT fails due to animations. See https://bugs.webkit.org/sho w_bug.cgi?id=37048 1552 // This ASSERT fails due to animations. See https://bugs.webkit.org/sho w_bug.cgi?id=37048
1513 // ASSERT(!newOutlineBoxRectPtr || *newOutlineBoxRectPtr == outlineBound sForRepaint(repaintContainer)); 1553 // ASSERT(!newOutlineBoxRectPtr || *newOutlineBoxRectPtr == outlineBound sForRepaint(repaintContainer));
1514 newOutlineBox = newOutlineBoxRectPtr ? *newOutlineBoxRectPtr : outlineBo undsForRepaint(repaintContainer); 1554 newOutlineBox = newOutlineBoxRectPtr ? *newOutlineBoxRectPtr : outlineBo undsForRepaint(repaintContainer);
1515 1555
1516 if ((hasOutline() && newOutlineBox.location() != oldOutlineBox.location( )) 1556 if ((hasOutline() && newOutlineBox.location() != oldOutlineBox.location( ))
1517 || (mustRepaintBackgroundOrBorder() && (newBounds != oldBounds || (h asOutline() && newOutlineBox != oldOutlineBox)))) 1557 || (mustRepaintBackgroundOrBorder() && (newBounds != oldBounds || (h asOutline() && newOutlineBox != oldOutlineBox))))
1518 fullRepaint = true; 1558 repaintReason = RepaintOutlineBoxChange;
1519 } 1559 }
1520 1560
1521 // If there is no intersection between the old and the new bounds, invalidat ing 1561 // If there is no intersection between the old and the new bounds, invalidat ing
1522 // the difference is more expensive than just doing a full repaint. 1562 // the difference is more expensive than just doing a full repaint.
1523 if (!fullRepaint && !newBounds.intersects(oldBounds)) 1563 if (repaintReason == RepaintNone && !newBounds.intersects(oldBounds))
1524 fullRepaint = true; 1564 repaintReason = RepaintBoundsChange;
Julien - ping for review 2014/03/21 18:35:34 Sir, this is a change in behavior! We don't want t
dsinclair 2014/03/24 15:04:31 I'm not sure I understand, there should be no beha
1525 1565
1526 if (!repaintContainer) 1566 if (!repaintContainer)
1527 repaintContainer = v; 1567 repaintContainer = v;
1528 1568
1529 if (fullRepaint) { 1569 if (repaintReason != RepaintNone) {
1570 TRACE_EVENT_INSTANT2(TRACE_DISABLED_BY_DEFAULT("blink.repaint"), "repain t_reason::full",
1571 "object", TRACE_STR_COPY(this->debugName().ascii().data()),
1572 "reason", repaintReasonToString(repaintReason));
1573
1530 repaintUsingContainer(repaintContainer, pixelSnappedIntRect(oldBounds)); 1574 repaintUsingContainer(repaintContainer, pixelSnappedIntRect(oldBounds));
1531 if (newBounds != oldBounds) 1575 if (newBounds != oldBounds)
1532 repaintUsingContainer(repaintContainer, pixelSnappedIntRect(newBound s)); 1576 repaintUsingContainer(repaintContainer, pixelSnappedIntRect(newBound s));
1533 return true; 1577 return true;
1534 } 1578 }
1535 1579
1536 if (newBounds == oldBounds && newOutlineBox == oldOutlineBox) 1580 if (newBounds == oldBounds && newOutlineBox == oldOutlineBox)
1537 return false; 1581 return false;
1538 1582
1583 repaintReason = RepaintBoundsChange;
1584 TRACE_EVENT_INSTANT2(TRACE_DISABLED_BY_DEFAULT("blink.repaint"), "repaint_re ason::delta",
1585 "object", TRACE_STR_COPY(this->debugName().ascii().data()),
1586 "reason", repaintReasonToString(repaintReason));
1587
1539 LayoutUnit deltaLeft = newBounds.x() - oldBounds.x(); 1588 LayoutUnit deltaLeft = newBounds.x() - oldBounds.x();
1540 if (deltaLeft > 0) 1589 if (deltaLeft > 0)
1541 repaintUsingContainer(repaintContainer, pixelSnappedIntRect(oldBounds.x( ), oldBounds.y(), deltaLeft, oldBounds.height())); 1590 repaintUsingContainer(repaintContainer, pixelSnappedIntRect(oldBounds.x( ), oldBounds.y(), deltaLeft, oldBounds.height()));
1542 else if (deltaLeft < 0) 1591 else if (deltaLeft < 0)
1543 repaintUsingContainer(repaintContainer, pixelSnappedIntRect(newBounds.x( ), newBounds.y(), -deltaLeft, newBounds.height())); 1592 repaintUsingContainer(repaintContainer, pixelSnappedIntRect(newBounds.x( ), newBounds.y(), -deltaLeft, newBounds.height()));
1544 1593
1545 LayoutUnit deltaRight = newBounds.maxX() - oldBounds.maxX(); 1594 LayoutUnit deltaRight = newBounds.maxX() - oldBounds.maxX();
1546 if (deltaRight > 0) 1595 if (deltaRight > 0)
1547 repaintUsingContainer(repaintContainer, pixelSnappedIntRect(oldBounds.ma xX(), newBounds.y(), deltaRight, newBounds.height())); 1596 repaintUsingContainer(repaintContainer, pixelSnappedIntRect(oldBounds.ma xX(), newBounds.y(), deltaRight, newBounds.height()));
1548 else if (deltaRight < 0) 1597 else if (deltaRight < 0)
(...skipping 1859 matching lines...) Expand 10 before | Expand all | Expand 10 after
3408 { 3457 {
3409 if (object1) { 3458 if (object1) {
3410 const WebCore::RenderObject* root = object1; 3459 const WebCore::RenderObject* root = object1;
3411 while (root->parent()) 3460 while (root->parent())
3412 root = root->parent(); 3461 root = root->parent();
3413 root->showRenderTreeAndMark(object1, "*", object2, "-", 0); 3462 root->showRenderTreeAndMark(object1, "*", object2, "-", 0);
3414 } 3463 }
3415 } 3464 }
3416 3465
3417 #endif 3466 #endif
OLDNEW
« no previous file with comments | « Source/core/rendering/RenderObject.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698