Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright (C) 1997 Martin Jones (mjones@kde.org) | 2 * Copyright (C) 1997 Martin Jones (mjones@kde.org) |
| 3 * (C) 1997 Torben Weis (weis@kde.org) | 3 * (C) 1997 Torben Weis (weis@kde.org) |
| 4 * (C) 1998 Waldo Bastian (bastian@kde.org) | 4 * (C) 1998 Waldo Bastian (bastian@kde.org) |
| 5 * (C) 1999 Lars Knoll (knoll@kde.org) | 5 * (C) 1999 Lars Knoll (knoll@kde.org) |
| 6 * (C) 1999 Antti Koivisto (koivisto@kde.org) | 6 * (C) 1999 Antti Koivisto (koivisto@kde.org) |
| 7 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. | 7 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. |
| 8 * All rights reserved. | 8 * All rights reserved. |
| 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 28 matching lines...) Expand all Loading... | |
| 39 #include "platform/geometry/TransformState.h" | 39 #include "platform/geometry/TransformState.h" |
| 40 #include "wtf/PtrUtil.h" | 40 #include "wtf/PtrUtil.h" |
| 41 | 41 |
| 42 namespace blink { | 42 namespace blink { |
| 43 | 43 |
| 44 using namespace HTMLNames; | 44 using namespace HTMLNames; |
| 45 | 45 |
| 46 struct SameSizeAsLayoutTableCell : public LayoutBlockFlow { | 46 struct SameSizeAsLayoutTableCell : public LayoutBlockFlow { |
| 47 unsigned bitfields; | 47 unsigned bitfields; |
| 48 int paddings[2]; | 48 int paddings[2]; |
| 49 void* pointer; | 49 void* pointer1; |
| 50 void* pointer2; | |
| 51 void* pointer3; | |
| 52 void* pointer4; | |
| 53 void* pointer5; | |
| 50 }; | 54 }; |
| 51 | 55 |
| 52 static_assert(sizeof(LayoutTableCell) == sizeof(SameSizeAsLayoutTableCell), | 56 static_assert(sizeof(LayoutTableCell) == sizeof(SameSizeAsLayoutTableCell), |
| 53 "LayoutTableCell should stay small"); | 57 "LayoutTableCell should stay small"); |
| 54 static_assert(sizeof(CollapsedBorderValue) == 8, | 58 static_assert(sizeof(CollapsedBorderValue) == 8, |
| 55 "CollapsedBorderValue should stay small"); | 59 "CollapsedBorderValue should stay small"); |
| 56 | 60 |
| 57 LayoutTableCell::LayoutTableCell(Element* element) | 61 LayoutTableCell::LayoutTableCell(Element* element) |
| 58 : LayoutBlockFlow(element), | 62 : LayoutBlockFlow(element), |
| 59 m_absoluteColumnIndex(unsetColumnIndex), | 63 m_absoluteColumnIndex(unsetColumnIndex), |
| (...skipping 396 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 456 // The baseline of a cell is the baseline of the first in-flow line box in the | 460 // The baseline of a cell is the baseline of the first in-flow line box in the |
| 457 // cell, or the first in-flow table-row in the cell, whichever comes first. If | 461 // cell, or the first in-flow table-row in the cell, whichever comes first. If |
| 458 // there is no such line box or table-row, the baseline is the bottom of | 462 // there is no such line box or table-row, the baseline is the bottom of |
| 459 // content edge of the cell box. | 463 // content edge of the cell box. |
| 460 int firstLineBaseline = firstLineBoxBaseline(); | 464 int firstLineBaseline = firstLineBoxBaseline(); |
| 461 if (firstLineBaseline != -1) | 465 if (firstLineBaseline != -1) |
| 462 return firstLineBaseline; | 466 return firstLineBaseline; |
| 463 return (borderBefore() + paddingBefore() + contentLogicalHeight()).toInt(); | 467 return (borderBefore() + paddingBefore() + contentLogicalHeight()).toInt(); |
| 464 } | 468 } |
| 465 | 469 |
| 470 void LayoutTableCell::createCompositedCellDisplayItemClients() { | |
| 471 if (!usesCompositedCellDisplayItemClients()) | |
| 472 return; | |
| 473 | |
| 474 if (row()->styleRef().hasBackground() && !m_rowBackgroundDisplayItemClient) { | |
| 475 m_rowBackgroundDisplayItemClient = | |
| 476 wrapUnique(new LayoutTableCell::RowBackgroundDisplayItemClient(*row())); | |
| 477 } | |
| 478 | |
| 479 LayoutTable::ColAndColGroup colAndColGroup = | |
| 480 table()->colElementAtAbsoluteColumn(absoluteColumnIndex()); | |
| 481 LayoutTableCol* column = colAndColGroup.col; | |
| 482 LayoutTableCol* columnGroup = colAndColGroup.colgroup; | |
| 483 if (column && column->styleRef().hasBackground() && | |
| 484 !m_colBackgroundDisplayItemClient) { | |
| 485 m_colBackgroundDisplayItemClient = wrapUnique( | |
| 486 new LayoutTableCell::ColBackgroundDisplayItemClient(*column)); | |
| 487 } | |
| 488 if (columnGroup && columnGroup->styleRef().hasBackground() && | |
| 489 !m_colGroupBackgroundDisplayItemClient) { | |
| 490 m_colGroupBackgroundDisplayItemClient = wrapUnique( | |
| 491 new LayoutTableCell::ColBackgroundDisplayItemClient(*columnGroup)); | |
| 492 } | |
| 493 if (section()->styleRef().hasBackground() && | |
| 494 !m_sectionBackgroundDisplayItemClient) { | |
| 495 m_sectionBackgroundDisplayItemClient = wrapUnique( | |
| 496 new LayoutTableCell::SectionBackgroundDisplayItemClient(*section())); | |
| 497 } | |
| 498 } | |
| 499 | |
| 500 void LayoutTableCell::ensureIsReadyForPaintInvalidation() { | |
| 501 LayoutBlockFlow::ensureIsReadyForPaintInvalidation(); | |
| 502 // Below handles the case where a page starts out in a state where the table | |
|
wkorman
2016/11/15 01:05:33
I ended up keeping this as it handles one case (de
| |
| 503 // cell compositing state and its container styling is such that one or more | |
| 504 // special display item clients are needed. | |
| 505 createCompositedCellDisplayItemClients(); | |
| 506 } | |
| 507 | |
| 466 void LayoutTableCell::styleDidChange(StyleDifference diff, | 508 void LayoutTableCell::styleDidChange(StyleDifference diff, |
| 467 const ComputedStyle* oldStyle) { | 509 const ComputedStyle* oldStyle) { |
| 468 DCHECK_EQ(style()->display(), EDisplay::TableCell); | 510 DCHECK_EQ(style()->display(), EDisplay::TableCell); |
| 469 | 511 |
| 470 LayoutBlockFlow::styleDidChange(diff, oldStyle); | 512 LayoutBlockFlow::styleDidChange(diff, oldStyle); |
| 471 setHasBoxDecorationBackground(true); | 513 setHasBoxDecorationBackground(true); |
| 472 | 514 |
| 473 if (parent() && section() && oldStyle && | 515 if (parent() && section() && oldStyle && |
| 474 style()->height() != oldStyle->height()) | 516 style()->height() != oldStyle->height()) |
| 475 section()->rowLogicalHeightChanged(row()); | 517 section()->rowLogicalHeightChanged(row()); |
| (...skipping 933 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1409 bool LayoutTableCell::backgroundIsKnownToBeOpaqueInRect( | 1451 bool LayoutTableCell::backgroundIsKnownToBeOpaqueInRect( |
| 1410 const LayoutRect& localRect) const { | 1452 const LayoutRect& localRect) const { |
| 1411 // If this object has layer, the area of collapsed borders should be | 1453 // If this object has layer, the area of collapsed borders should be |
| 1412 // transparent to expose the collapsed borders painted on the underlying | 1454 // transparent to expose the collapsed borders painted on the underlying |
| 1413 // layer. | 1455 // layer. |
| 1414 if (hasLayer() && table()->collapseBorders()) | 1456 if (hasLayer() && table()->collapseBorders()) |
| 1415 return false; | 1457 return false; |
| 1416 return LayoutBlockFlow::backgroundIsKnownToBeOpaqueInRect(localRect); | 1458 return LayoutBlockFlow::backgroundIsKnownToBeOpaqueInRect(localRect); |
| 1417 } | 1459 } |
| 1418 | 1460 |
| 1419 bool LayoutTableCell::usesTableAsAdditionalDisplayItemClient() const { | 1461 LayoutTableCell::RowBackgroundDisplayItemClient::RowBackgroundDisplayItemClient( |
| 1420 // In certain cases such as collapsed borders for composited table cells we | 1462 const LayoutTableRow& layoutTableRow) |
| 1421 // paint content for the cell into the table graphics layer backing and so | 1463 : m_layoutTableRow(layoutTableRow) {} |
| 1422 // must use the table's visual rect. | 1464 |
| 1465 String LayoutTableCell::RowBackgroundDisplayItemClient::debugName() const { | |
| 1466 return "RowBackground"; | |
| 1467 } | |
| 1468 | |
| 1469 LayoutRect LayoutTableCell::RowBackgroundDisplayItemClient::visualRect() const { | |
| 1470 return m_layoutTableRow.visualRect(); | |
| 1471 } | |
| 1472 | |
| 1473 LayoutTableCell::ColBackgroundDisplayItemClient::ColBackgroundDisplayItemClient( | |
| 1474 const LayoutTableCol& layoutTableCol) | |
| 1475 : m_layoutTableCol(layoutTableCol) {} | |
| 1476 | |
| 1477 String LayoutTableCell::ColBackgroundDisplayItemClient::debugName() const { | |
| 1478 return "ColBackground"; | |
| 1479 } | |
| 1480 | |
| 1481 LayoutRect LayoutTableCell::ColBackgroundDisplayItemClient::visualRect() const { | |
| 1482 return m_layoutTableCol.visualRect(); | |
| 1483 } | |
| 1484 | |
| 1485 LayoutTableCell::SectionBackgroundDisplayItemClient:: | |
| 1486 SectionBackgroundDisplayItemClient( | |
| 1487 const LayoutTableSection& layoutTableSection) | |
| 1488 : m_layoutTableSection(layoutTableSection) {} | |
| 1489 | |
| 1490 String LayoutTableCell::SectionBackgroundDisplayItemClient::debugName() const { | |
| 1491 return "SectionBackground"; | |
| 1492 } | |
| 1493 | |
| 1494 LayoutRect LayoutTableCell::SectionBackgroundDisplayItemClient::visualRect() | |
| 1495 const { | |
| 1496 return m_layoutTableSection.visualRect(); | |
| 1497 } | |
| 1498 | |
| 1499 bool LayoutTableCell::usesCompositedCellDisplayItemClients() const { | |
| 1500 // Composited table cells are painted in special ways that require the use of | |
| 1501 // custom display item clients: | |
| 1502 // | |
| 1503 // 1. When painting row background we paint content for the cell into the | |
| 1504 // table row graphics layer backing and so must use the row's visual rect. | |
| 1505 // | |
| 1506 // 2. When painting section, column or column group backgrounds we paint | |
| 1507 // content for the cell into the table section graphics layer backing and must | |
| 1508 // use the visual rect for the respective background object | |
| 1423 return (hasLayer() && layer()->compositingState() != NotComposited) || | 1509 return (hasLayer() && layer()->compositingState() != NotComposited) || |
| 1424 RuntimeEnabledFeatures::slimmingPaintV2Enabled(); | 1510 RuntimeEnabledFeatures::slimmingPaintV2Enabled(); |
|
Xianzhu
2016/11/15 02:58:23
This misses the case that the row is composited bu
wkorman
2016/11/15 19:46:02
Ah. I will look at adding tests for these cases (e
Xianzhu
2016/11/15 20:16:58
Sorry, "DisplayItemClients" should be "LayoutTable
| |
| 1425 } | 1511 } |
| 1426 | 1512 |
| 1427 void LayoutTableCell::invalidateDisplayItemClients( | 1513 void LayoutTableCell::invalidateDisplayItemClients( |
| 1428 PaintInvalidationReason reason) const { | 1514 PaintInvalidationReason reason) const { |
| 1429 if (m_collapsedBorderValues && usesTableAsAdditionalDisplayItemClient()) { | 1515 LayoutBlockFlow::invalidateDisplayItemClients(reason); |
| 1430 ObjectPaintInvalidator(*this).invalidateDisplayItemClient( | 1516 |
| 1431 *m_collapsedBorderValues, reason); | 1517 if (!usesCompositedCellDisplayItemClients()) |
| 1518 return; | |
| 1519 | |
| 1520 ObjectPaintInvalidator invalidator(*this); | |
| 1521 if (m_collapsedBorderValues) | |
| 1522 invalidator.invalidateDisplayItemClient(*m_collapsedBorderValues, reason); | |
| 1523 if (m_rowBackgroundDisplayItemClient) { | |
| 1524 invalidator.invalidateDisplayItemClient(*m_rowBackgroundDisplayItemClient, | |
| 1525 reason); | |
| 1432 } | 1526 } |
| 1433 LayoutBlockFlow::invalidateDisplayItemClients(reason); | 1527 if (m_colBackgroundDisplayItemClient) { |
| 1528 invalidator.invalidateDisplayItemClient(*m_colBackgroundDisplayItemClient, | |
| 1529 reason); | |
| 1530 } | |
| 1531 if (m_colGroupBackgroundDisplayItemClient) { | |
| 1532 invalidator.invalidateDisplayItemClient( | |
| 1533 *m_colGroupBackgroundDisplayItemClient, reason); | |
| 1534 } | |
| 1535 if (m_sectionBackgroundDisplayItemClient) { | |
| 1536 invalidator.invalidateDisplayItemClient( | |
| 1537 *m_sectionBackgroundDisplayItemClient, reason); | |
| 1538 } | |
| 1434 } | 1539 } |
| 1435 | 1540 |
| 1436 // TODO(lunalu): Deliberately dump the "inner" box of table cells, since that | 1541 // TODO(lunalu): Deliberately dump the "inner" box of table cells, since that |
| 1437 // is what current results reflect. We'd like to clean up the results to dump | 1542 // is what current results reflect. We'd like to clean up the results to dump |
| 1438 // both the outer box and the intrinsic padding so that both bits of information | 1543 // both the outer box and the intrinsic padding so that both bits of information |
| 1439 // are captured by the results. | 1544 // are captured by the results. |
| 1440 LayoutRect LayoutTableCell::debugRect() const { | 1545 LayoutRect LayoutTableCell::debugRect() const { |
| 1441 LayoutRect rect = LayoutRect( | 1546 LayoutRect rect = LayoutRect( |
| 1442 location().x(), location().y() + intrinsicPaddingBefore(), size().width(), | 1547 location().x(), location().y() + intrinsicPaddingBefore(), size().width(), |
| 1443 size().height() - intrinsicPaddingBefore() - intrinsicPaddingAfter()); | 1548 size().height() - intrinsicPaddingBefore() - intrinsicPaddingAfter()); |
| 1444 | 1549 |
| 1445 LayoutBlock* cb = containingBlock(); | 1550 LayoutBlock* cb = containingBlock(); |
| 1446 if (cb) | 1551 if (cb) |
| 1447 cb->adjustChildDebugRect(rect); | 1552 cb->adjustChildDebugRect(rect); |
| 1448 | 1553 |
| 1449 return rect; | 1554 return rect; |
| 1450 } | 1555 } |
| 1451 | 1556 |
| 1452 void LayoutTableCell::adjustChildDebugRect(LayoutRect& r) const { | 1557 void LayoutTableCell::adjustChildDebugRect(LayoutRect& r) const { |
| 1453 r.move(0, -intrinsicPaddingBefore()); | 1558 r.move(0, -intrinsicPaddingBefore()); |
| 1454 } | 1559 } |
| 1455 | 1560 |
| 1456 } // namespace blink | 1561 } // namespace blink |
| OLD | NEW |