OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2011 Google Inc. All rights reserved. | 2 * Copyright (C) 2011 Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
6 * met: | 6 * met: |
7 * | 7 * |
8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
201 int LayoutFlexibleBox::baselinePosition(FontBaseline, bool, LineDirectionMode di
rection, LinePositionMode mode) const | 201 int LayoutFlexibleBox::baselinePosition(FontBaseline, bool, LineDirectionMode di
rection, LinePositionMode mode) const |
202 { | 202 { |
203 DCHECK_EQ(mode, PositionOnContainingLine); | 203 DCHECK_EQ(mode, PositionOnContainingLine); |
204 int baseline = firstLineBoxBaseline(); | 204 int baseline = firstLineBoxBaseline(); |
205 if (baseline == -1) | 205 if (baseline == -1) |
206 baseline = synthesizedBaselineFromContentBox(*this, direction); | 206 baseline = synthesizedBaselineFromContentBox(*this, direction); |
207 | 207 |
208 return beforeMarginInLineDirection(direction) + baseline; | 208 return beforeMarginInLineDirection(direction) + baseline; |
209 } | 209 } |
210 | 210 |
211 static const StyleContentAlignmentData& normalValueBehavior() | 211 static const StyleContentAlignmentData& contentAlignmentNormalBehavior() |
212 { | 212 { |
213 // The justify-content property applies along the main axis, but since flexi
ng | 213 // The justify-content property applies along the main axis, but since flexi
ng |
214 // in the main axis is controlled by flex, stretch behaves as flex-start (ig
noring | 214 // in the main axis is controlled by flex, stretch behaves as flex-start (ig
noring |
215 // the specified fallback alignment, if any). | 215 // the specified fallback alignment, if any). |
216 // https://drafts.csswg.org/css-align/#distribution-flex | 216 // https://drafts.csswg.org/css-align/#distribution-flex |
217 static const StyleContentAlignmentData normalBehavior = {ContentPositionNorm
al, ContentDistributionStretch}; | 217 static const StyleContentAlignmentData normalBehavior = {ContentPositionNorm
al, ContentDistributionStretch}; |
218 return normalBehavior; | 218 return normalBehavior; |
219 } | 219 } |
220 | 220 |
221 int LayoutFlexibleBox::firstLineBoxBaseline() const | 221 int LayoutFlexibleBox::firstLineBoxBaseline() const |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
325 return flexDirection == (style()->isLeftToRightDirection() ? FlowRowReve
rse : FlowRow); | 325 return flexDirection == (style()->isLeftToRightDirection() ? FlowRowReve
rse : FlowRow); |
326 return flexDirection == FlowColumnReverse; | 326 return flexDirection == FlowColumnReverse; |
327 } | 327 } |
328 | 328 |
329 void LayoutFlexibleBox::removeChild(LayoutObject* child) | 329 void LayoutFlexibleBox::removeChild(LayoutObject* child) |
330 { | 330 { |
331 LayoutBlock::removeChild(child); | 331 LayoutBlock::removeChild(child); |
332 m_intrinsicSizeAlongMainAxis.remove(child); | 332 m_intrinsicSizeAlongMainAxis.remove(child); |
333 } | 333 } |
334 | 334 |
| 335 // TODO (lajava): Is this function still needed ? Every time the flex container'
s align-items value changes we |
| 336 // propagate the diff to its children (see ComputedStyle::stylePropagationDiff). |
335 void LayoutFlexibleBox::styleDidChange(StyleDifference diff, const ComputedStyle
* oldStyle) | 337 void LayoutFlexibleBox::styleDidChange(StyleDifference diff, const ComputedStyle
* oldStyle) |
336 { | 338 { |
337 LayoutBlock::styleDidChange(diff, oldStyle); | 339 LayoutBlock::styleDidChange(diff, oldStyle); |
338 | 340 |
339 if (oldStyle && oldStyle->alignItemsPosition() == ItemPositionStretch && dif
f.needsFullLayout()) { | 341 if (oldStyle && oldStyle->alignItemsPosition() == ItemPositionStretch && dif
f.needsFullLayout()) { |
340 // Flex items that were previously stretching need to be relayed out so
we can compute new available cross axis space. | 342 // Flex items that were previously stretching need to be relayed out so
we can compute new available cross axis space. |
341 // This is only necessary for stretching since other alignment values do
n't change the size of the box. | 343 // This is only necessary for stretching since other alignment values do
n't change the size of the box. |
342 for (LayoutBox* child = firstChildBox(); child; child = child->nextSibli
ngBox()) { | 344 for (LayoutBox* child = firstChildBox(); child; child = child->nextSibli
ngBox()) { |
343 ItemPosition previousAlignment = ComputedStyle::resolveAlignment(*ol
dStyle, child->styleRef(), ItemPositionStretch); | 345 ItemPosition previousAlignment = child->styleRef().resolvedAlignSelf
(selfAlignmentNormalBehavior(), oldStyle).position(); |
344 if (previousAlignment == ItemPositionStretch && previousAlignment !=
ComputedStyle::resolveAlignment(styleRef(), child->styleRef(), ItemPositionStre
tch)) | 346 if (previousAlignment == ItemPositionStretch && previousAlignment !=
child->styleRef().resolvedAlignSelf(selfAlignmentNormalBehavior(), style()).pos
ition()) |
345 child->setChildNeedsLayout(MarkOnlyThis); | 347 child->setChildNeedsLayout(MarkOnlyThis); |
346 } | 348 } |
347 } | 349 } |
348 } | 350 } |
349 | 351 |
350 void LayoutFlexibleBox::layoutBlock(bool relayoutChildren) | 352 void LayoutFlexibleBox::layoutBlock(bool relayoutChildren) |
351 { | 353 { |
352 DCHECK(needsLayout()); | 354 DCHECK(needsLayout()); |
353 | 355 |
354 if (!relayoutChildren && simplifiedLayout()) | 356 if (!relayoutChildren && simplifiedLayout()) |
(...skipping 1036 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1391 if (justifyContentDistribution == ContentDistributionSpaceAround) | 1393 if (justifyContentDistribution == ContentDistributionSpaceAround) |
1392 return availableFreeSpace / numberOfChildren; | 1394 return availableFreeSpace / numberOfChildren; |
1393 } | 1395 } |
1394 return LayoutUnit(); | 1396 return LayoutUnit(); |
1395 } | 1397 } |
1396 | 1398 |
1397 static LayoutUnit alignmentOffset(LayoutUnit availableFreeSpace, ItemPosition po
sition, LayoutUnit ascent, LayoutUnit maxAscent, bool isWrapReverse) | 1399 static LayoutUnit alignmentOffset(LayoutUnit availableFreeSpace, ItemPosition po
sition, LayoutUnit ascent, LayoutUnit maxAscent, bool isWrapReverse) |
1398 { | 1400 { |
1399 switch (position) { | 1401 switch (position) { |
1400 case ItemPositionAuto: | 1402 case ItemPositionAuto: |
| 1403 case ItemPositionNormal: |
1401 NOTREACHED(); | 1404 NOTREACHED(); |
1402 break; | 1405 break; |
1403 case ItemPositionStretch: | 1406 case ItemPositionStretch: |
1404 // Actual stretching must be handled by the caller. | 1407 // Actual stretching must be handled by the caller. |
1405 // Since wrap-reverse flips cross start and cross end, stretch children
should be aligned with the cross end. | 1408 // Since wrap-reverse flips cross start and cross end, stretch children
should be aligned with the cross end. |
1406 // This matters because applyStretchAlignment doesn't always stretch or
stretch fully (explicit cross size given, | 1409 // This matters because applyStretchAlignment doesn't always stretch or
stretch fully (explicit cross size given, |
1407 // or stretching constrained by max-height/max-width). | 1410 // or stretching constrained by max-height/max-width). |
1408 // For flex-start and flex-end this is handled by alignmentForChild(). | 1411 // For flex-start and flex-end this is handled by alignmentForChild(). |
1409 if (isWrapReverse) | 1412 if (isWrapReverse) |
1410 return availableFreeSpace; | 1413 return availableFreeSpace; |
(...skipping 28 matching lines...) Expand all Loading... |
1439 if (hasOrthogonalFlow(child)) | 1442 if (hasOrthogonalFlow(child)) |
1440 child.setOverrideLogicalContentHeight(childPreferredSize); | 1443 child.setOverrideLogicalContentHeight(childPreferredSize); |
1441 else | 1444 else |
1442 child.setOverrideLogicalContentWidth(childPreferredSize); | 1445 child.setOverrideLogicalContentWidth(childPreferredSize); |
1443 } | 1446 } |
1444 | 1447 |
1445 LayoutUnit LayoutFlexibleBox::staticMainAxisPositionForPositionedChild(const Lay
outBox& child) | 1448 LayoutUnit LayoutFlexibleBox::staticMainAxisPositionForPositionedChild(const Lay
outBox& child) |
1446 { | 1449 { |
1447 const LayoutUnit availableSpace = mainAxisContentExtent(contentLogicalHeight
()) - mainAxisExtentForChild(child); | 1450 const LayoutUnit availableSpace = mainAxisContentExtent(contentLogicalHeight
()) - mainAxisExtentForChild(child); |
1448 | 1451 |
1449 ContentPosition position = styleRef().resolvedJustifyContentPosition(normalV
alueBehavior()); | 1452 ContentPosition position = styleRef().resolvedJustifyContentPosition(content
AlignmentNormalBehavior()); |
1450 ContentDistributionType distribution = styleRef().resolvedJustifyContentDist
ribution(normalValueBehavior()); | 1453 ContentDistributionType distribution = styleRef().resolvedJustifyContentDist
ribution(contentAlignmentNormalBehavior()); |
1451 LayoutUnit offset = initialJustifyContentOffset(availableSpace, position, di
stribution, 1); | 1454 LayoutUnit offset = initialJustifyContentOffset(availableSpace, position, di
stribution, 1); |
1452 if (styleRef().flexDirection() == FlowRowReverse || styleRef().flexDirection
() == FlowColumnReverse) | 1455 if (styleRef().flexDirection() == FlowRowReverse || styleRef().flexDirection
() == FlowColumnReverse) |
1453 offset = availableSpace - offset; | 1456 offset = availableSpace - offset; |
1454 return offset; | 1457 return offset; |
1455 } | 1458 } |
1456 | 1459 |
1457 LayoutUnit LayoutFlexibleBox::staticCrossAxisPositionForPositionedChild(const La
youtBox& child) | 1460 LayoutUnit LayoutFlexibleBox::staticCrossAxisPositionForPositionedChild(const La
youtBox& child) |
1458 { | 1461 { |
1459 LayoutUnit availableSpace = crossAxisContentExtent() - crossAxisExtentForChi
ld(child); | 1462 LayoutUnit availableSpace = crossAxisContentExtent() - crossAxisExtentForChi
ld(child); |
1460 return alignmentOffset(availableSpace, alignmentForChild(child), LayoutUnit(
), LayoutUnit(), styleRef().flexWrap() == FlexWrapReverse); | 1463 return alignmentOffset(availableSpace, alignmentForChild(child), LayoutUnit(
), LayoutUnit(), styleRef().flexWrap() == FlexWrapReverse); |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1510 LayoutUnit staticBlockPosition = flowAwareBorderBefore() + flowAwarePaddingB
efore(); | 1513 LayoutUnit staticBlockPosition = flowAwareBorderBefore() + flowAwarePaddingB
efore(); |
1511 if (childLayer->staticBlockPosition() != staticBlockPosition) { | 1514 if (childLayer->staticBlockPosition() != staticBlockPosition) { |
1512 childLayer->setStaticBlockPosition(staticBlockPosition); | 1515 childLayer->setStaticBlockPosition(staticBlockPosition); |
1513 if (child.style()->hasStaticBlockPosition(style()->isHorizontalWritingMo
de())) | 1516 if (child.style()->hasStaticBlockPosition(style()->isHorizontalWritingMo
de())) |
1514 child.setChildNeedsLayout(MarkOnlyThis); | 1517 child.setChildNeedsLayout(MarkOnlyThis); |
1515 } | 1518 } |
1516 } | 1519 } |
1517 | 1520 |
1518 ItemPosition LayoutFlexibleBox::alignmentForChild(const LayoutBox& child) const | 1521 ItemPosition LayoutFlexibleBox::alignmentForChild(const LayoutBox& child) const |
1519 { | 1522 { |
1520 ItemPosition align = ComputedStyle::resolveAlignment(styleRef(), child.style
Ref(), ItemPositionStretch); | 1523 ItemPosition align = child.styleRef().resolvedAlignSelf(selfAlignmentNormalB
ehavior(), child.isAnonymous() ? style() : nullptr).position(); |
| 1524 DCHECK(align != ItemPositionAuto && align != ItemPositionNormal); |
1521 | 1525 |
1522 if (align == ItemPositionBaseline && hasOrthogonalFlow(child)) | 1526 if (align == ItemPositionBaseline && hasOrthogonalFlow(child)) |
1523 align = ItemPositionFlexStart; | 1527 align = ItemPositionFlexStart; |
1524 | 1528 |
1525 if (style()->flexWrap() == FlexWrapReverse) { | 1529 if (style()->flexWrap() == FlexWrapReverse) { |
1526 if (align == ItemPositionFlexStart) | 1530 if (align == ItemPositionFlexStart) |
1527 align = ItemPositionFlexEnd; | 1531 align = ItemPositionFlexEnd; |
1528 else if (align == ItemPositionFlexEnd) | 1532 else if (align == ItemPositionFlexEnd) |
1529 align = ItemPositionFlexStart; | 1533 align = ItemPositionFlexStart; |
1530 } | 1534 } |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1600 | 1604 |
1601 EOverflow LayoutFlexibleBox::crossAxisOverflowForChild(const LayoutBox& child) c
onst | 1605 EOverflow LayoutFlexibleBox::crossAxisOverflowForChild(const LayoutBox& child) c
onst |
1602 { | 1606 { |
1603 if (isHorizontalFlow()) | 1607 if (isHorizontalFlow()) |
1604 return child.styleRef().overflowY(); | 1608 return child.styleRef().overflowY(); |
1605 return child.styleRef().overflowX(); | 1609 return child.styleRef().overflowX(); |
1606 } | 1610 } |
1607 | 1611 |
1608 void LayoutFlexibleBox::layoutAndPlaceChildren(LayoutUnit& crossAxisOffset, cons
t OrderedFlexItemList& children, LayoutUnit availableFreeSpace, bool relayoutChi
ldren, SubtreeLayoutScope& layoutScope, Vector<LineContext>& lineContexts) | 1612 void LayoutFlexibleBox::layoutAndPlaceChildren(LayoutUnit& crossAxisOffset, cons
t OrderedFlexItemList& children, LayoutUnit availableFreeSpace, bool relayoutChi
ldren, SubtreeLayoutScope& layoutScope, Vector<LineContext>& lineContexts) |
1609 { | 1613 { |
1610 ContentPosition position = styleRef().resolvedJustifyContentPosition(normalV
alueBehavior()); | 1614 ContentPosition position = styleRef().resolvedJustifyContentPosition(content
AlignmentNormalBehavior()); |
1611 ContentDistributionType distribution = styleRef().resolvedJustifyContentDist
ribution(normalValueBehavior()); | 1615 ContentDistributionType distribution = styleRef().resolvedJustifyContentDist
ribution(contentAlignmentNormalBehavior()); |
1612 | 1616 |
1613 size_t numberOfChildrenForJustifyContent = numberOfInFlowPositionedChildren(
children); | 1617 size_t numberOfChildrenForJustifyContent = numberOfInFlowPositionedChildren(
children); |
1614 LayoutUnit autoMarginOffset = autoMarginOffsetInMainAxis(children, available
FreeSpace); | 1618 LayoutUnit autoMarginOffset = autoMarginOffsetInMainAxis(children, available
FreeSpace); |
1615 LayoutUnit mainAxisOffset = flowAwareBorderStart() + flowAwarePaddingStart()
; | 1619 LayoutUnit mainAxisOffset = flowAwareBorderStart() + flowAwarePaddingStart()
; |
1616 mainAxisOffset += initialJustifyContentOffset(availableFreeSpace, position,
distribution, numberOfChildrenForJustifyContent); | 1620 mainAxisOffset += initialJustifyContentOffset(availableFreeSpace, position,
distribution, numberOfChildrenForJustifyContent); |
1617 if (style()->flexDirection() == FlowRowReverse && shouldPlaceBlockDirectionS
crollbarOnLogicalLeft()) | 1621 if (style()->flexDirection() == FlowRowReverse && shouldPlaceBlockDirectionS
crollbarOnLogicalLeft()) |
1618 mainAxisOffset += isHorizontalFlow() ? verticalScrollbarWidth() : horizo
ntalScrollbarHeight(); | 1622 mainAxisOffset += isHorizontalFlow() ? verticalScrollbarWidth() : horizo
ntalScrollbarHeight(); |
1619 | 1623 |
1620 LayoutUnit totalMainExtent = mainAxisExtent(); | 1624 LayoutUnit totalMainExtent = mainAxisExtent(); |
1621 if (!shouldPlaceBlockDirectionScrollbarOnLogicalLeft()) | 1625 if (!shouldPlaceBlockDirectionScrollbarOnLogicalLeft()) |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1702 } | 1706 } |
1703 | 1707 |
1704 if (m_numberOfInFlowChildrenOnFirstLine == -1) | 1708 if (m_numberOfInFlowChildrenOnFirstLine == -1) |
1705 m_numberOfInFlowChildrenOnFirstLine = seenInFlowPositionedChildren; | 1709 m_numberOfInFlowChildrenOnFirstLine = seenInFlowPositionedChildren; |
1706 lineContexts.append(LineContext(crossAxisOffset, maxChildCrossAxisExtent, ch
ildren.size(), maxAscent)); | 1710 lineContexts.append(LineContext(crossAxisOffset, maxChildCrossAxisExtent, ch
ildren.size(), maxAscent)); |
1707 crossAxisOffset += maxChildCrossAxisExtent; | 1711 crossAxisOffset += maxChildCrossAxisExtent; |
1708 } | 1712 } |
1709 | 1713 |
1710 void LayoutFlexibleBox::layoutColumnReverse(const OrderedFlexItemList& children,
LayoutUnit crossAxisOffset, LayoutUnit availableFreeSpace) | 1714 void LayoutFlexibleBox::layoutColumnReverse(const OrderedFlexItemList& children,
LayoutUnit crossAxisOffset, LayoutUnit availableFreeSpace) |
1711 { | 1715 { |
1712 ContentPosition position = styleRef().resolvedJustifyContentPosition(normalV
alueBehavior()); | 1716 ContentPosition position = styleRef().resolvedJustifyContentPosition(content
AlignmentNormalBehavior()); |
1713 ContentDistributionType distribution = styleRef().resolvedJustifyContentDist
ribution(normalValueBehavior()); | 1717 ContentDistributionType distribution = styleRef().resolvedJustifyContentDist
ribution(contentAlignmentNormalBehavior()); |
1714 | 1718 |
1715 // This is similar to the logic in layoutAndPlaceChildren, except we place t
he children | 1719 // This is similar to the logic in layoutAndPlaceChildren, except we place t
he children |
1716 // starting from the end of the flexbox. We also don't need to layout anythi
ng since we're | 1720 // starting from the end of the flexbox. We also don't need to layout anythi
ng since we're |
1717 // just moving the children to a new position. | 1721 // just moving the children to a new position. |
1718 size_t numberOfChildrenForJustifyContent = numberOfInFlowPositionedChildren(
children); | 1722 size_t numberOfChildrenForJustifyContent = numberOfInFlowPositionedChildren(
children); |
1719 LayoutUnit mainAxisOffset = logicalHeight() - flowAwareBorderEnd() - flowAwa
rePaddingEnd(); | 1723 LayoutUnit mainAxisOffset = logicalHeight() - flowAwareBorderEnd() - flowAwa
rePaddingEnd(); |
1720 mainAxisOffset -= initialJustifyContentOffset(availableFreeSpace, position,
distribution, numberOfChildrenForJustifyContent); | 1724 mainAxisOffset -= initialJustifyContentOffset(availableFreeSpace, position,
distribution, numberOfChildrenForJustifyContent); |
1721 mainAxisOffset -= isHorizontalFlow() ? verticalScrollbarWidth() : horizontal
ScrollbarHeight(); | 1725 mainAxisOffset -= isHorizontalFlow() ? verticalScrollbarWidth() : horizontal
ScrollbarHeight(); |
1722 | 1726 |
1723 size_t seenInFlowPositionedChildren = 0; | 1727 size_t seenInFlowPositionedChildren = 0; |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1765 return availableFreeSpace / numberOfLines; | 1769 return availableFreeSpace / numberOfLines; |
1766 } | 1770 } |
1767 return LayoutUnit(); | 1771 return LayoutUnit(); |
1768 } | 1772 } |
1769 | 1773 |
1770 void LayoutFlexibleBox::alignFlexLines(Vector<LineContext>& lineContexts) | 1774 void LayoutFlexibleBox::alignFlexLines(Vector<LineContext>& lineContexts) |
1771 { | 1775 { |
1772 if (!lineContexts.size()) | 1776 if (!lineContexts.size()) |
1773 return; | 1777 return; |
1774 | 1778 |
1775 ContentPosition position = styleRef().resolvedAlignContentPosition(normalVal
ueBehavior()); | 1779 ContentPosition position = styleRef().resolvedAlignContentPosition(contentAl
ignmentNormalBehavior()); |
1776 ContentDistributionType distribution = styleRef().resolvedAlignContentDistri
bution(normalValueBehavior()); | 1780 ContentDistributionType distribution = styleRef().resolvedAlignContentDistri
bution(contentAlignmentNormalBehavior()); |
1777 | 1781 |
1778 // If we have a single line flexbox the line height is all the available spa
ce. | 1782 // If we have a single line flexbox the line height is all the available spa
ce. |
1779 // For flex-direction: row, this means we need to use the height, so we do t
his after calling updateLogicalHeight. | 1783 // For flex-direction: row, this means we need to use the height, so we do t
his after calling updateLogicalHeight. |
1780 if (!isMultiline()) { | 1784 if (!isMultiline()) { |
1781 lineContexts[0].crossAxisExtent = crossAxisContentExtent(); | 1785 lineContexts[0].crossAxisExtent = crossAxisContentExtent(); |
1782 return; | 1786 return; |
1783 } | 1787 } |
1784 | 1788 |
1785 if (position == ContentPositionFlexStart) | 1789 if (position == ContentPositionFlexStart) |
1786 return; | 1790 return; |
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1927 DCHECK(child); | 1931 DCHECK(child); |
1928 LayoutUnit lineCrossAxisExtent = lineContexts[lineNumber].crossAxisE
xtent; | 1932 LayoutUnit lineCrossAxisExtent = lineContexts[lineNumber].crossAxisE
xtent; |
1929 LayoutUnit originalOffset = lineContexts[lineNumber].crossAxisOffset
- crossAxisStartEdge; | 1933 LayoutUnit originalOffset = lineContexts[lineNumber].crossAxisOffset
- crossAxisStartEdge; |
1930 LayoutUnit newOffset = contentExtent - originalOffset - lineCrossAxi
sExtent; | 1934 LayoutUnit newOffset = contentExtent - originalOffset - lineCrossAxi
sExtent; |
1931 adjustAlignmentForChild(*child, newOffset - originalOffset); | 1935 adjustAlignmentForChild(*child, newOffset - originalOffset); |
1932 } | 1936 } |
1933 } | 1937 } |
1934 } | 1938 } |
1935 | 1939 |
1936 } // namespace blink | 1940 } // namespace blink |
OLD | NEW |