OLD | NEW |
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) 2007 David Smith (catfish.man@gmail.com) | 4 * (C) 2007 David Smith (catfish.man@gmail.com) |
5 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc.
All rights reserved. | 5 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc.
All rights reserved. |
6 * Copyright (C) Research In Motion Limited 2010. All rights reserved. | 6 * Copyright (C) Research In Motion Limited 2010. All rights reserved. |
7 * | 7 * |
8 * This library is free software; you can redistribute it and/or | 8 * This library is free software; you can redistribute it and/or |
9 * modify it under the terms of the GNU Library General Public | 9 * modify it under the terms of the GNU Library General Public |
10 * License as published by the Free Software Foundation; either | 10 * License as published by the Free Software Foundation; either |
(...skipping 1320 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1331 if (block->hasOverflowClip()) { | 1331 if (block->hasOverflowClip()) { |
1332 block->layer()->scrollableArea()->updateAfterLayout(); | 1332 block->layer()->scrollableArea()->updateAfterLayout(); |
1333 } | 1333 } |
1334 } | 1334 } |
1335 } | 1335 } |
1336 } | 1336 } |
1337 | 1337 |
1338 void RenderBlock::updateScrollInfoAfterLayout() | 1338 void RenderBlock::updateScrollInfoAfterLayout() |
1339 { | 1339 { |
1340 if (hasOverflowClip()) { | 1340 if (hasOverflowClip()) { |
1341 if (style()->isFlippedBlocksWritingMode()) { | 1341 if (style()->slowIsFlippedBlocksWritingMode()) { |
1342 // FIXME: https://bugs.webkit.org/show_bug.cgi?id=97937 | 1342 // FIXME: https://bugs.webkit.org/show_bug.cgi?id=97937 |
1343 // Workaround for now. We cannot delay the scroll info for overflow | 1343 // Workaround for now. We cannot delay the scroll info for overflow |
1344 // for items with opposite writing directions, as the contents needs | 1344 // for items with opposite writing directions, as the contents needs |
1345 // to overflow in that direction | 1345 // to overflow in that direction |
1346 layer()->scrollableArea()->updateAfterLayout(); | 1346 layer()->scrollableArea()->updateAfterLayout(); |
1347 return; | 1347 return; |
1348 } | 1348 } |
1349 | 1349 |
1350 if (gDelayUpdateScrollInfo) | 1350 if (gDelayUpdateScrollInfo) |
1351 gDelayedUpdateScrollInfoSet->add(this); | 1351 gDelayedUpdateScrollInfoSet->add(this); |
(...skipping 1102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2454 | 2454 |
2455 return false; | 2455 return false; |
2456 } | 2456 } |
2457 | 2457 |
2458 class ColumnRectIterator { | 2458 class ColumnRectIterator { |
2459 WTF_MAKE_NONCOPYABLE(ColumnRectIterator); | 2459 WTF_MAKE_NONCOPYABLE(ColumnRectIterator); |
2460 public: | 2460 public: |
2461 ColumnRectIterator(const RenderBlock& block) | 2461 ColumnRectIterator(const RenderBlock& block) |
2462 : m_block(block) | 2462 : m_block(block) |
2463 , m_colInfo(block.columnInfo()) | 2463 , m_colInfo(block.columnInfo()) |
2464 , m_direction(m_block.style()->isFlippedBlocksWritingMode() ? 1 : -1) | 2464 , m_direction(m_block.style()->slowIsFlippedBlocksWritingMode() ? 1 : -1
) |
2465 , m_isHorizontal(block.isHorizontalWritingMode()) | 2465 , m_isHorizontal(block.isHorizontalWritingMode()) |
2466 , m_logicalLeft(block.logicalLeftOffsetForContent()) | 2466 , m_logicalLeft(block.logicalLeftOffsetForContent()) |
2467 { | 2467 { |
2468 int colCount = m_colInfo->columnCount(); | 2468 int colCount = m_colInfo->columnCount(); |
2469 m_colIndex = colCount - 1; | 2469 m_colIndex = colCount - 1; |
2470 m_currLogicalTopOffset = colCount * m_colInfo->columnHeight() * m_direct
ion; | 2470 m_currLogicalTopOffset = colCount * m_colInfo->columnHeight() * m_direct
ion; |
2471 update(); | 2471 update(); |
2472 } | 2472 } |
2473 | 2473 |
2474 void advance() | 2474 void advance() |
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2631 } | 2631 } |
2632 | 2632 |
2633 PositionWithAffinity RenderBlock::positionForPointWithInlineChildren(const Layou
tPoint& pointInLogicalContents) | 2633 PositionWithAffinity RenderBlock::positionForPointWithInlineChildren(const Layou
tPoint& pointInLogicalContents) |
2634 { | 2634 { |
2635 ASSERT(childrenInline()); | 2635 ASSERT(childrenInline()); |
2636 | 2636 |
2637 if (!firstRootBox()) | 2637 if (!firstRootBox()) |
2638 return createPositionWithAffinity(0, DOWNSTREAM); | 2638 return createPositionWithAffinity(0, DOWNSTREAM); |
2639 | 2639 |
2640 bool linesAreFlipped = style()->isFlippedLinesWritingMode(); | 2640 bool linesAreFlipped = style()->isFlippedLinesWritingMode(); |
2641 bool blocksAreFlipped = style()->isFlippedBlocksWritingMode(); | 2641 bool blocksAreFlipped = style()->slowIsFlippedBlocksWritingMode(); |
2642 | 2642 |
2643 // look for the closest line box in the root box which is at the passed-in y
coordinate | 2643 // look for the closest line box in the root box which is at the passed-in y
coordinate |
2644 InlineBox* closestBox = 0; | 2644 InlineBox* closestBox = 0; |
2645 RootInlineBox* firstRootBoxWithChildren = 0; | 2645 RootInlineBox* firstRootBoxWithChildren = 0; |
2646 RootInlineBox* lastRootBoxWithChildren = 0; | 2646 RootInlineBox* lastRootBoxWithChildren = 0; |
2647 for (RootInlineBox* root = firstRootBox(); root; root = root->nextRootBox())
{ | 2647 for (RootInlineBox* root = firstRootBox(); root; root = root->nextRootBox())
{ |
2648 if (!root->firstLeafChild()) | 2648 if (!root->firstLeafChild()) |
2649 continue; | 2649 continue; |
2650 if (!firstRootBoxWithChildren) | 2650 if (!firstRootBoxWithChildren) |
2651 firstRootBoxWithChildren = root; | 2651 firstRootBoxWithChildren = root; |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2749 if (!isHorizontalWritingMode()) | 2749 if (!isHorizontalWritingMode()) |
2750 pointInLogicalContents = pointInLogicalContents.transposedPoint(); | 2750 pointInLogicalContents = pointInLogicalContents.transposedPoint(); |
2751 | 2751 |
2752 if (childrenInline()) | 2752 if (childrenInline()) |
2753 return positionForPointWithInlineChildren(pointInLogicalContents); | 2753 return positionForPointWithInlineChildren(pointInLogicalContents); |
2754 | 2754 |
2755 RenderBox* lastCandidateBox = lastChildBox(); | 2755 RenderBox* lastCandidateBox = lastChildBox(); |
2756 while (lastCandidateBox && !isChildHitTestCandidate(lastCandidateBox)) | 2756 while (lastCandidateBox && !isChildHitTestCandidate(lastCandidateBox)) |
2757 lastCandidateBox = lastCandidateBox->previousSiblingBox(); | 2757 lastCandidateBox = lastCandidateBox->previousSiblingBox(); |
2758 | 2758 |
2759 bool blocksAreFlipped = style()->isFlippedBlocksWritingMode(); | 2759 bool blocksAreFlipped = style()->slowIsFlippedBlocksWritingMode(); |
2760 if (lastCandidateBox) { | 2760 if (lastCandidateBox) { |
2761 if (pointInLogicalContents.y() > logicalTopForChild(lastCandidateBox) | 2761 if (pointInLogicalContents.y() > logicalTopForChild(lastCandidateBox) |
2762 || (!blocksAreFlipped && pointInLogicalContents.y() == logicalTopFor
Child(lastCandidateBox))) | 2762 || (!blocksAreFlipped && pointInLogicalContents.y() == logicalTopFor
Child(lastCandidateBox))) |
2763 return positionForPointRespectingEditingBoundaries(this, lastCandida
teBox, pointInContents); | 2763 return positionForPointRespectingEditingBoundaries(this, lastCandida
teBox, pointInContents); |
2764 | 2764 |
2765 for (RenderBox* childBox = firstChildBox(); childBox; childBox = childBo
x->nextSiblingBox()) { | 2765 for (RenderBox* childBox = firstChildBox(); childBox; childBox = childBo
x->nextSiblingBox()) { |
2766 if (!isChildHitTestCandidate(childBox)) | 2766 if (!isChildHitTestCandidate(childBox)) |
2767 continue; | 2767 continue; |
2768 LayoutUnit childLogicalBottom = logicalTopForChild(childBox) + logic
alHeightForChild(childBox); | 2768 LayoutUnit childLogicalBottom = logicalTopForChild(childBox) + logic
alHeightForChild(childBox); |
2769 // We hit child if our click is above the bottom of its padding box
(like IE6/7 and FF3). | 2769 // We hit child if our click is above the bottom of its padding box
(like IE6/7 and FF3). |
(...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2962 } | 2962 } |
2963 } else { | 2963 } else { |
2964 if (point.x() < colRect.x()) | 2964 if (point.x() < colRect.x()) |
2965 point.setX(colRect.x()); | 2965 point.setX(colRect.x()); |
2966 else if (point.x() >= colRect.maxX()) | 2966 else if (point.x() >= colRect.maxX()) |
2967 point.setX(colRect.maxX() - 1); | 2967 point.setX(colRect.maxX() - 1); |
2968 } | 2968 } |
2969 | 2969 |
2970 // We're inside the column. Translate the x and y into our colu
mn coordinate space. | 2970 // We're inside the column. Translate the x and y into our colu
mn coordinate space. |
2971 if (colInfo->progressionAxis() == ColumnInfo::InlineAxis) | 2971 if (colInfo->progressionAxis() == ColumnInfo::InlineAxis) |
2972 point.move(columnPoint.x() - colRect.x(), (!style()->isFlipp
edBlocksWritingMode() ? logicalOffset : -logicalOffset)); | 2972 point.move(columnPoint.x() - colRect.x(), (!style()->slowIsF
lippedBlocksWritingMode() ? logicalOffset : -logicalOffset)); |
2973 else | 2973 else |
2974 point.move((!style()->isFlippedBlocksWritingMode() ? logical
Offset : -logicalOffset) - colRect.x() + borderLeft() + paddingLeft(), 0); | 2974 point.move((!style()->slowIsFlippedBlocksWritingMode() ? log
icalOffset : -logicalOffset) - colRect.x() + borderLeft() + paddingLeft(), 0); |
2975 return; | 2975 return; |
2976 } | 2976 } |
2977 | 2977 |
2978 // Move to the next position. | 2978 // Move to the next position. |
2979 logicalOffset += colInfo->progressionAxis() == ColumnInfo::InlineAxi
s ? colRect.height() : colRect.width(); | 2979 logicalOffset += colInfo->progressionAxis() == ColumnInfo::InlineAxi
s ? colRect.height() : colRect.width(); |
2980 } else { | 2980 } else { |
2981 LayoutRect gapAndColumnRect(colRect.x(), colRect.y() - halfColGap, c
olRect.width(), colRect.height() + colGap); | 2981 LayoutRect gapAndColumnRect(colRect.x(), colRect.y() - halfColGap, c
olRect.width(), colRect.height() + colGap); |
2982 if (point.y() >= gapAndColumnRect.y() && point.y() < gapAndColumnRec
t.maxY()) { | 2982 if (point.y() >= gapAndColumnRect.y() && point.y() < gapAndColumnRec
t.maxY()) { |
2983 if (colInfo->progressionAxis() == ColumnInfo::InlineAxis) { | 2983 if (colInfo->progressionAxis() == ColumnInfo::InlineAxis) { |
2984 // FIXME: The clamping that follows is not completely right
for right-to-left | 2984 // FIXME: The clamping that follows is not completely right
for right-to-left |
2985 // content. | 2985 // content. |
2986 // Clamp everything above the column to its top left. | 2986 // Clamp everything above the column to its top left. |
2987 if (point.x() < gapAndColumnRect.x()) | 2987 if (point.x() < gapAndColumnRect.x()) |
2988 point = gapAndColumnRect.location(); | 2988 point = gapAndColumnRect.location(); |
2989 // Clamp everything below the column to the next column's to
p left. If there is | 2989 // Clamp everything below the column to the next column's to
p left. If there is |
2990 // no next column, this still maps to just after this column
. | 2990 // no next column, this still maps to just after this column
. |
2991 else if (point.x() >= gapAndColumnRect.maxX()) { | 2991 else if (point.x() >= gapAndColumnRect.maxX()) { |
2992 point = gapAndColumnRect.location(); | 2992 point = gapAndColumnRect.location(); |
2993 point.move(gapAndColumnRect.width(), 0); | 2993 point.move(gapAndColumnRect.width(), 0); |
2994 } | 2994 } |
2995 } else { | 2995 } else { |
2996 if (point.y() < colRect.y()) | 2996 if (point.y() < colRect.y()) |
2997 point.setY(colRect.y()); | 2997 point.setY(colRect.y()); |
2998 else if (point.y() >= colRect.maxY()) | 2998 else if (point.y() >= colRect.maxY()) |
2999 point.setY(colRect.maxY() - 1); | 2999 point.setY(colRect.maxY() - 1); |
3000 } | 3000 } |
3001 | 3001 |
3002 // We're inside the column. Translate the x and y into our colu
mn coordinate space. | 3002 // We're inside the column. Translate the x and y into our colu
mn coordinate space. |
3003 if (colInfo->progressionAxis() == ColumnInfo::InlineAxis) | 3003 if (colInfo->progressionAxis() == ColumnInfo::InlineAxis) |
3004 point.move((!style()->isFlippedBlocksWritingMode() ? logical
Offset : -logicalOffset), columnPoint.y() - colRect.y()); | 3004 point.move((!style()->slowIsFlippedBlocksWritingMode() ? log
icalOffset : -logicalOffset), columnPoint.y() - colRect.y()); |
3005 else | 3005 else |
3006 point.move(0, (!style()->isFlippedBlocksWritingMode() ? logi
calOffset : -logicalOffset) - colRect.y() + borderTop() + paddingTop()); | 3006 point.move(0, (!style()->slowIsFlippedBlocksWritingMode() ?
logicalOffset : -logicalOffset) - colRect.y() + borderTop() + paddingTop()); |
3007 return; | 3007 return; |
3008 } | 3008 } |
3009 | 3009 |
3010 // Move to the next position. | 3010 // Move to the next position. |
3011 logicalOffset += colInfo->progressionAxis() == ColumnInfo::InlineAxi
s ? colRect.width() : colRect.height(); | 3011 logicalOffset += colInfo->progressionAxis() == ColumnInfo::InlineAxi
s ? colRect.width() : colRect.height(); |
3012 } | 3012 } |
3013 } | 3013 } |
3014 } | 3014 } |
3015 | 3015 |
3016 void RenderBlock::adjustRectForColumns(LayoutRect& r) const | 3016 void RenderBlock::adjustRectForColumns(LayoutRect& r) const |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3068 result.unite(columnRectAt(colInfo, startColumn)); | 3068 result.unite(columnRectAt(colInfo, startColumn)); |
3069 result.unite(columnRectAt(colInfo, endColumn)); | 3069 result.unite(columnRectAt(colInfo, endColumn)); |
3070 } | 3070 } |
3071 | 3071 |
3072 r = result; | 3072 r = result; |
3073 } | 3073 } |
3074 | 3074 |
3075 LayoutPoint RenderBlock::flipForWritingModeIncludingColumns(const LayoutPoint& p
oint) const | 3075 LayoutPoint RenderBlock::flipForWritingModeIncludingColumns(const LayoutPoint& p
oint) const |
3076 { | 3076 { |
3077 ASSERT(hasColumns()); | 3077 ASSERT(hasColumns()); |
3078 if (!hasColumns() || !style()->isFlippedBlocksWritingMode()) | 3078 if (!hasColumns() || !style()->slowIsFlippedBlocksWritingMode()) |
3079 return point; | 3079 return point; |
3080 ColumnInfo* colInfo = columnInfo(); | 3080 ColumnInfo* colInfo = columnInfo(); |
3081 LayoutUnit columnLogicalHeight = colInfo->columnHeight(); | 3081 LayoutUnit columnLogicalHeight = colInfo->columnHeight(); |
3082 LayoutUnit expandedLogicalHeight = borderBefore() + paddingBefore() + column
Count(colInfo) * columnLogicalHeight + borderAfter() + paddingAfter() + scrollba
rLogicalHeight(); | 3082 LayoutUnit expandedLogicalHeight = borderBefore() + paddingBefore() + column
Count(colInfo) * columnLogicalHeight + borderAfter() + paddingAfter() + scrollba
rLogicalHeight(); |
3083 if (isHorizontalWritingMode()) | 3083 if (isHorizontalWritingMode()) |
3084 return LayoutPoint(point.x(), expandedLogicalHeight - point.y()); | 3084 return LayoutPoint(point.x(), expandedLogicalHeight - point.y()); |
3085 return LayoutPoint(expandedLogicalHeight - point.x(), point.y()); | 3085 return LayoutPoint(expandedLogicalHeight - point.x(), point.y()); |
3086 } | 3086 } |
3087 | 3087 |
3088 void RenderBlock::adjustStartEdgeForWritingModeIncludingColumns(LayoutRect& rect
) const | 3088 void RenderBlock::adjustStartEdgeForWritingModeIncludingColumns(LayoutRect& rect
) const |
3089 { | 3089 { |
3090 ASSERT(hasColumns()); | 3090 ASSERT(hasColumns()); |
3091 if (!hasColumns() || !style()->isFlippedBlocksWritingMode()) | 3091 if (!hasColumns() || !style()->slowIsFlippedBlocksWritingMode()) |
3092 return; | 3092 return; |
3093 | 3093 |
3094 ColumnInfo* colInfo = columnInfo(); | 3094 ColumnInfo* colInfo = columnInfo(); |
3095 LayoutUnit columnLogicalHeight = colInfo->columnHeight(); | 3095 LayoutUnit columnLogicalHeight = colInfo->columnHeight(); |
3096 LayoutUnit expandedLogicalHeight = borderBefore() + paddingBefore() + column
Count(colInfo) * columnLogicalHeight + borderAfter() + paddingAfter() + scrollba
rLogicalHeight(); | 3096 LayoutUnit expandedLogicalHeight = borderBefore() + paddingBefore() + column
Count(colInfo) * columnLogicalHeight + borderAfter() + paddingAfter() + scrollba
rLogicalHeight(); |
3097 | 3097 |
3098 if (isHorizontalWritingMode()) | 3098 if (isHorizontalWritingMode()) |
3099 rect.setY(expandedLogicalHeight - rect.maxY()); | 3099 rect.setY(expandedLogicalHeight - rect.maxY()); |
3100 else | 3100 else |
3101 rect.setX(expandedLogicalHeight - rect.maxX()); | 3101 rect.setX(expandedLogicalHeight - rect.maxX()); |
(...skipping 1010 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4112 void RenderBlock::showLineTreeAndMark(const InlineBox* markedBox1, const char* m
arkedLabel1, const InlineBox* markedBox2, const char* markedLabel2, const Render
Object* obj) const | 4112 void RenderBlock::showLineTreeAndMark(const InlineBox* markedBox1, const char* m
arkedLabel1, const InlineBox* markedBox2, const char* markedLabel2, const Render
Object* obj) const |
4113 { | 4113 { |
4114 showRenderObject(); | 4114 showRenderObject(); |
4115 for (const RootInlineBox* root = firstRootBox(); root; root = root->nextRoot
Box()) | 4115 for (const RootInlineBox* root = firstRootBox(); root; root = root->nextRoot
Box()) |
4116 root->showLineTreeAndMark(markedBox1, markedLabel1, markedBox2, markedLa
bel2, obj, 1); | 4116 root->showLineTreeAndMark(markedBox1, markedLabel1, markedBox2, markedLa
bel2, obj, 1); |
4117 } | 4117 } |
4118 | 4118 |
4119 #endif | 4119 #endif |
4120 | 4120 |
4121 } // namespace blink | 4121 } // namespace blink |
OLD | NEW |