Changeset 89091 in webkit
- Timestamp:
- Jun 16, 2011 5:25:42 PM (13 years ago)
- Location:
- trunk
- Files:
-
- 36 added
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r89064 r89091 1 2011-06-16 Ryosuke Niwa <rniwa@webkit.org> 2 3 Reviewed by Darin Adler. 4 5 Support logical line movement in vertical writing mode 6 https://bugs.webkit.org/show_bug.cgi?id=62743 7 8 Added various tests to ensure WebKit uses a proper line direction point 9 when extending selection horizontally in vertical writing modes. 10 11 * editing/selection/vertical-lr-ltr-extend-line-backward-br.html: Added. 12 * editing/selection/vertical-lr-ltr-extend-line-forward-br.html: Added. 13 * editing/selection/vertical-rl-ltr-extend-line-backward-br.html: Added. 14 * editing/selection/vertical-rl-ltr-extend-line-backward-p.html: Added. 15 * editing/selection/vertical-rl-ltr-extend-line-backward-wrap.html: Added. 16 * editing/selection/vertical-rl-ltr-extend-line-forward-br.html: Added. 17 * editing/selection/vertical-rl-ltr-extend-line-forward-p.html: Added. 18 * editing/selection/vertical-rl-ltr-extend-line-forward-wrap.html: Added. 19 * editing/selection/vertical-rl-rtl-extend-line-backward-br.html: Added. 20 * editing/selection/vertical-rl-rtl-extend-line-backward-p.html: Added. 21 * editing/selection/vertical-rl-rtl-extend-line-forward-br.html: Added. 22 * editing/selection/vertical-rl-rtl-extend-line-forward-p.html: Added. 23 * platform/mac/editing/selection/vertical-lr-ltr-extend-line-backward-br-expected.png: Added. 24 * platform/mac/editing/selection/vertical-lr-ltr-extend-line-backward-br-expected.txt: Added. 25 * platform/mac/editing/selection/vertical-lr-ltr-extend-line-forward-br-expected.png: Added. 26 * platform/mac/editing/selection/vertical-lr-ltr-extend-line-forward-br-expected.txt: Added. 27 * platform/mac/editing/selection/vertical-rl-ltr-extend-line-backward-br-expected.png: Added. 28 * platform/mac/editing/selection/vertical-rl-ltr-extend-line-backward-br-expected.txt: Added. 29 * platform/mac/editing/selection/vertical-rl-ltr-extend-line-backward-p-expected.png: Added. 30 * platform/mac/editing/selection/vertical-rl-ltr-extend-line-backward-p-expected.txt: Added. 31 * platform/mac/editing/selection/vertical-rl-ltr-extend-line-backward-wrap-expected.png: Added. 32 * platform/mac/editing/selection/vertical-rl-ltr-extend-line-backward-wrap-expected.txt: Added. 33 * platform/mac/editing/selection/vertical-rl-ltr-extend-line-forward-br-expected.png: Added. 34 * platform/mac/editing/selection/vertical-rl-ltr-extend-line-forward-br-expected.txt: Added. 35 * platform/mac/editing/selection/vertical-rl-ltr-extend-line-forward-p-expected.png: Added. 36 * platform/mac/editing/selection/vertical-rl-ltr-extend-line-forward-p-expected.txt: Added. 37 * platform/mac/editing/selection/vertical-rl-ltr-extend-line-forward-wrap-expected.png: Added. 38 * platform/mac/editing/selection/vertical-rl-ltr-extend-line-forward-wrap-expected.txt: Added. 39 * platform/mac/editing/selection/vertical-rl-rtl-extend-line-backward-br-expected.png: Added. 40 * platform/mac/editing/selection/vertical-rl-rtl-extend-line-backward-br-expected.txt: Added. 41 * platform/mac/editing/selection/vertical-rl-rtl-extend-line-backward-p-expected.png: Added. 42 * platform/mac/editing/selection/vertical-rl-rtl-extend-line-backward-p-expected.txt: Added. 43 * platform/mac/editing/selection/vertical-rl-rtl-extend-line-forward-br-expected.png: Added. 44 * platform/mac/editing/selection/vertical-rl-rtl-extend-line-forward-br-expected.txt: Added. 45 * platform/mac/editing/selection/vertical-rl-rtl-extend-line-forward-p-expected.png: Added. 46 * platform/mac/editing/selection/vertical-rl-rtl-extend-line-forward-p-expected.txt: Added. 47 1 48 2011-06-16 Ryosuke Niwa <rniwa@webkit.org> 2 49 -
trunk/Source/WebCore/ChangeLog
r89086 r89091 1 2011-06-16 Ryosuke Niwa <rniwa@webkit.org> 2 3 Reviewed by Darin Adler. 4 5 Support logical line movement in vertical writing mode 6 https://bugs.webkit.org/show_bug.cgi?id=62743 7 8 Fixed the bug by making xOffsetForVerticalNavigation (now called lineDirectionPointForVerticalNavigation) 9 aware of writing modes. Also extracted absoluteLineDirectionPointToLocalPointInBlock from previousLinePosition 10 and nextLinePosition to convert a line direction point to a physical point relative to a root inline box. 11 12 Tests: editing/selection/vertical-lr-ltr-extend-line-backward-br.html 13 editing/selection/vertical-lr-ltr-extend-line-forward-br.html 14 editing/selection/vertical-rl-ltr-extend-line-backward-br.html 15 editing/selection/vertical-rl-ltr-extend-line-backward-p.html 16 editing/selection/vertical-rl-ltr-extend-line-backward-wrap.html 17 editing/selection/vertical-rl-ltr-extend-line-forward-br.html 18 editing/selection/vertical-rl-ltr-extend-line-forward-p.html 19 editing/selection/vertical-rl-ltr-extend-line-forward-wrap.html 20 editing/selection/vertical-rl-rtl-extend-line-backward-br.html 21 editing/selection/vertical-rl-rtl-extend-line-backward-p.html 22 editing/selection/vertical-rl-rtl-extend-line-forward-br.html 23 editing/selection/vertical-rl-rtl-extend-line-forward-p.html 24 25 * editing/FrameSelection.cpp: 26 (WebCore::FrameSelection::modifyExtendingForward): Calls lineDirectionPointForBlockDirectionNavigation. 27 (WebCore::FrameSelection::modifyMovingForward): Ditto. 28 (WebCore::FrameSelection::modifyExtendingBackward): Ditto. 29 (WebCore::FrameSelection::modifyMovingBackward): Ditto. 30 (WebCore::FrameSelection::modify): Ditto. 31 (WebCore::FrameSelection::lineDirectionPointForBlockDirectionNavigation): Renamed from 32 xPosForVerticalArrowNavigation; calls VisiblePosition::lineDirectionPointForVerticalNavigation. 33 * editing/FrameSelection.h: 34 * editing/VisiblePosition.cpp: 35 (WebCore::VisiblePosition::lineDirectionPointForBlockDirectionNavigation): Renamed from 36 xOffsetForVerticalNavigation. Returns line direction point instead of visual x coordinate. 37 * editing/VisiblePosition.h: 38 * editing/visible_units.cpp: 39 (WebCore::absoluteLineDirectionPointToLocalPointInBlock): Extracted from previousLinePosition and 40 nextLinePosition. Takes care or writing modes. 41 (WebCore::previousLinePosition): Calls absoluteLineDirectionPointToLocalPointInBlock. 42 (WebCore::nextLinePosition): Ditto. 43 * editing/visible_units.h: 44 * rendering/RootInlineBox.cpp: 45 (WebCore::RootInlineBox::closestLeafChildForPoint): Added; takes a physical point and calls 46 closestLeafChildForLogicalLeftPosition with logical x. 47 * rendering/RootInlineBox.h: 48 1 49 2011-06-16 Nate Chapin <japhet@chromium.org> 2 50 -
trunk/Source/WebCore/editing/FrameSelection.cpp
r88178 r89091 507 507 break; 508 508 case LineGranularity: 509 pos = nextLinePosition(pos, xPosForVerticalArrowNavigation(EXTENT));509 pos = nextLinePosition(pos, lineDirectionPointForBlockDirectionNavigation(EXTENT)); 510 510 break; 511 511 case ParagraphGranularity: 512 pos = nextParagraphPosition(pos, xPosForVerticalArrowNavigation(EXTENT));512 pos = nextParagraphPosition(pos, lineDirectionPointForBlockDirectionNavigation(EXTENT)); 513 513 break; 514 514 case SentenceBoundary: … … 590 590 pos = endForPlatform(); 591 591 if (!isRange() || !isStartOfLine(pos)) 592 pos = nextLinePosition(pos, xPosForVerticalArrowNavigation(START));592 pos = nextLinePosition(pos, lineDirectionPointForBlockDirectionNavigation(START)); 593 593 break; 594 594 } 595 595 case ParagraphGranularity: 596 pos = nextParagraphPosition(endForPlatform(), xPosForVerticalArrowNavigation(START));596 pos = nextParagraphPosition(endForPlatform(), lineDirectionPointForBlockDirectionNavigation(START)); 597 597 break; 598 598 case SentenceBoundary: … … 679 679 break; 680 680 case LineGranularity: 681 pos = previousLinePosition(pos, xPosForVerticalArrowNavigation(EXTENT));681 pos = previousLinePosition(pos, lineDirectionPointForBlockDirectionNavigation(EXTENT)); 682 682 break; 683 683 case ParagraphGranularity: 684 pos = previousParagraphPosition(pos, xPosForVerticalArrowNavigation(EXTENT));684 pos = previousParagraphPosition(pos, lineDirectionPointForBlockDirectionNavigation(EXTENT)); 685 685 break; 686 686 case SentenceBoundary: … … 756 756 break; 757 757 case LineGranularity: 758 pos = previousLinePosition(startForPlatform(), xPosForVerticalArrowNavigation(START));758 pos = previousLinePosition(startForPlatform(), lineDirectionPointForBlockDirectionNavigation(START)); 759 759 break; 760 760 case ParagraphGranularity: 761 pos = previousParagraphPosition(startForPlatform(), xPosForVerticalArrowNavigation(START));761 pos = previousParagraphPosition(startForPlatform(), lineDirectionPointForBlockDirectionNavigation(START)); 762 762 break; 763 763 case SentenceBoundary: … … 844 844 // Note: the START position type is arbitrary because it is unused, it would be 845 845 // the requested position type if there were no xPosForVerticalArrowNavigation set. 846 int x = xPosForVerticalArrowNavigation(START);846 int x = lineDirectionPointForBlockDirectionNavigation(START); 847 847 848 848 switch (alter) { … … 916 916 case AlterationMove: 917 917 pos = VisiblePosition(up ? m_selection.start() : m_selection.end(), m_selection.affinity()); 918 xPos = xPosForVerticalArrowNavigation(up ? START : END);918 xPos = lineDirectionPointForBlockDirectionNavigation(up ? START : END); 919 919 m_selection.setAffinity(up ? UPSTREAM : DOWNSTREAM); 920 920 break; 921 921 case AlterationExtend: 922 922 pos = VisiblePosition(m_selection.extent(), m_selection.affinity()); 923 xPos = xPosForVerticalArrowNavigation(EXTENT);923 xPos = lineDirectionPointForBlockDirectionNavigation(EXTENT); 924 924 m_selection.setAffinity(DOWNSTREAM); 925 925 break; … … 972 972 } 973 973 974 int FrameSelection:: xPosForVerticalArrowNavigation(EPositionType type)974 int FrameSelection::lineDirectionPointForBlockDirectionNavigation(EPositionType type) 975 975 { 976 976 int x = 0; … … 1003 1003 // VisiblePosition creation can fail here if a node containing the selection becomes visibility:hidden 1004 1004 // after the selection is created and before this function is called. 1005 x = visiblePosition.isNotNull() ? visiblePosition. xOffsetForVerticalNavigation() : 0;1005 x = visiblePosition.isNotNull() ? visiblePosition.lineDirectionPointForBlockDirectionNavigation() : 0; 1006 1006 m_xPosForVerticalArrowNavigation = x; 1007 1007 } else -
trunk/Source/WebCore/editing/FrameSelection.h
r88050 r89091 256 256 VisiblePosition modifyMovingBackward(TextGranularity); 257 257 258 int xPosForVerticalArrowNavigation(EPositionType);258 int lineDirectionPointForBlockDirectionNavigation(EPositionType); 259 259 260 260 void notifyAccessibilityForSelectionChange(); -
trunk/Source/WebCore/editing/VisiblePosition.cpp
r88685 r89091 34 34 #include "Logging.h" 35 35 #include "Range.h" 36 #include "RenderBlock.h" 36 37 #include "RootInlineBox.h" 37 38 #include "Text.h" … … 589 590 } 590 591 591 int VisiblePosition:: xOffsetForVerticalNavigation() const592 int VisiblePosition::lineDirectionPointForBlockDirectionNavigation() const 592 593 { 593 594 RenderObject* renderer; … … 599 600 // without consulting transforms, so that 'up' in transformed text is 'up' 600 601 // relative to the text, not absolute 'up'. 601 return renderer->localToAbsolute(localRect.location()).x(); 602 FloatPoint caretPoint = renderer->localToAbsolute(localRect.location()); 603 return renderer->containingBlock()->isHorizontalWritingMode() ? caretPoint.x() : caretPoint.y(); 602 604 } 603 605 -
trunk/Source/WebCore/editing/VisiblePosition.h
r80752 r89091 96 96 // Bounds of (possibly transformed) caret in absolute coords 97 97 IntRect absoluteCaretBounds() const; 98 // Abs x position of the caret ignoring transforms.98 // Abs x/y position of the caret ignoring transforms. 99 99 // FIXME: navigation with transforms should be smarter. 100 int xOffsetForVerticalNavigation() const;100 int lineDirectionPointForBlockDirectionNavigation() const; 101 101 102 102 #ifndef NDEBUG -
trunk/Source/WebCore/editing/visible_units.cpp
r89056 r89091 504 504 } 505 505 506 VisiblePosition previousLinePosition(const VisiblePosition &visiblePosition, int x) 506 static inline IntPoint absoluteLineDirectionPointToLocalPointInBlock(RootInlineBox* root, int lineDirectionPoint) 507 { 508 ASSERT(root); 509 RenderBlock* containingBlock = root->block(); 510 FloatPoint absoluteBlockPoint = containingBlock->localToAbsolute(FloatPoint()); 511 if (containingBlock->hasOverflowClip()) 512 absoluteBlockPoint -= containingBlock->layer()->scrolledContentOffset(); 513 514 if (root->block()->isHorizontalWritingMode()) 515 return IntPoint(lineDirectionPoint - absoluteBlockPoint.x(), root->blockDirectionPointInLine()); 516 517 return IntPoint(root->selectionTop(), lineDirectionPoint - absoluteBlockPoint.y()); 518 } 519 520 VisiblePosition previousLinePosition(const VisiblePosition &visiblePosition, int lineDirectionPoint) 507 521 { 508 522 Position p = visiblePosition.deepEquivalent(); … … 518 532 return VisiblePosition(); 519 533 520 RenderBlock *containingBlock = 0;521 534 RootInlineBox *root = 0; 522 535 InlineBox* box; … … 527 540 // We want to skip zero height boxes. 528 541 // This could happen in case it is a TrailingFloatsRootInlineBox. 529 if (root && root->logicalHeight()) 530 containingBlock = renderer->containingBlock(); 531 else 542 if (!root || !root->logicalHeight()) 532 543 root = 0; 533 544 } … … 554 565 // previous root line box found 555 566 root = box->root(); 556 containingBlock = n->renderer()->containingBlock();557 567 break; 558 568 } … … 567 577 if (root) { 568 578 // FIXME: Can be wrong for multi-column layout and with transforms. 569 FloatPoint absPos = containingBlock->localToAbsolute(FloatPoint()); 570 if (containingBlock->hasOverflowClip()) 571 absPos -= containingBlock->layer()->scrolledContentOffset(); 572 RenderObject* renderer = root->closestLeafChildForLogicalLeftPosition(x - absPos.x(), isEditablePosition(p))->renderer(); 579 IntPoint pointInLine = absoluteLineDirectionPointToLocalPointInBlock(root, lineDirectionPoint); 580 RenderObject* renderer = root->closestLeafChildForPoint(pointInLine, isEditablePosition(p))->renderer(); 573 581 Node* node = renderer->node(); 574 582 if (node && editingIgnoresContent(node)) 575 583 return positionInParentBeforeNode(node); 576 return renderer->positionForPoint( IntPoint(x - absPos.x(), root->blockDirectionPointInLine()));584 return renderer->positionForPoint(pointInLine); 577 585 } 578 586 … … 615 623 } 616 624 617 VisiblePosition nextLinePosition(const VisiblePosition &visiblePosition, int x)625 VisiblePosition nextLinePosition(const VisiblePosition &visiblePosition, int lineDirectionPoint) 618 626 { 619 627 Position p = visiblePosition.deepEquivalent(); … … 629 637 return VisiblePosition(); 630 638 631 RenderBlock *containingBlock = 0;632 639 RootInlineBox *root = 0; 633 640 InlineBox* box; … … 638 645 // We want to skip zero height boxes. 639 646 // This could happen in case it is a TrailingFloatsRootInlineBox. 640 if (root && root->logicalHeight()) 641 containingBlock = renderer->containingBlock(); 642 else 647 if (!root || !root->logicalHeight()) 643 648 root = 0; 644 649 } … … 662 667 // next root line box found 663 668 root = box->root(); 664 containingBlock = n->renderer()->containingBlock();665 669 break; 666 670 } … … 674 678 if (root) { 675 679 // FIXME: Can be wrong for multi-column layout and with transforms. 676 FloatPoint absPos = containingBlock->localToAbsolute(FloatPoint()); 677 if (containingBlock->hasOverflowClip()) 678 absPos -= containingBlock->layer()->scrolledContentOffset(); 679 RenderObject* renderer = root->closestLeafChildForLogicalLeftPosition(x - absPos.x(), isEditablePosition(p))->renderer(); 680 IntPoint pointInLine = absoluteLineDirectionPointToLocalPointInBlock(root, lineDirectionPoint); 681 RenderObject* renderer = root->closestLeafChildForPoint(pointInLine, isEditablePosition(p))->renderer(); 680 682 Node* node = renderer->node(); 681 683 if (node && editingIgnoresContent(node)) 682 684 return positionInParentBeforeNode(node); 683 return renderer->positionForPoint( IntPoint(x - absPos.x(), root->blockDirectionPointInLine()));684 } 685 return renderer->positionForPoint(pointInLine); 686 } 685 687 686 688 // Could not find a next line. This means we must already be on the last line. -
trunk/Source/WebCore/editing/visible_units.h
r86325 r89091 55 55 VisiblePosition startOfLine(const VisiblePosition &); 56 56 VisiblePosition endOfLine(const VisiblePosition &); 57 VisiblePosition previousLinePosition(const VisiblePosition &, int x);58 VisiblePosition nextLinePosition(const VisiblePosition &, int x);57 VisiblePosition previousLinePosition(const VisiblePosition &, int lineDirectionPoint); 58 VisiblePosition nextLinePosition(const VisiblePosition &, int lineDirectionPoint); 59 59 bool inSameLine(const VisiblePosition &, const VisiblePosition &); 60 60 bool inSameLogicalLine(const VisiblePosition &, const VisiblePosition &); -
trunk/Source/WebCore/rendering/RootInlineBox.cpp
r88319 r89091 459 459 } 460 460 461 InlineBox* RootInlineBox::closestLeafChildForPoint(const IntPoint& pointInContents, bool onlyEditableLeaves) 462 { 463 return closestLeafChildForLogicalLeftPosition(block()->isHorizontalWritingMode() ? pointInContents.x() : pointInContents.y(), onlyEditableLeaves); 464 } 465 461 466 InlineBox* RootInlineBox::closestLeafChildForLogicalLeftPosition(int leftPosition, bool onlyEditableLeaves) 462 467 { -
trunk/Source/WebCore/rendering/RootInlineBox.h
r89056 r89091 112 112 RenderBlock* block() const; 113 113 114 InlineBox* closestLeafChildForPoint(const IntPoint&, bool onlyEditableLeaves); 114 115 InlineBox* closestLeafChildForLogicalLeftPosition(int, bool onlyEditableLeaves = false); 115 116
Note: See TracChangeset
for help on using the changeset viewer.