| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserv
ed. | 2 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserv
ed. |
| 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 | 5 * modification, are permitted provided that the following conditions |
| 6 * are met: | 6 * are met: |
| 7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
| 8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
| 9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
| 10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 82 Node* highestRoot = highestEditableRoot(visiblePosition.deepEquivalent(), ed
itableType); | 82 Node* highestRoot = highestEditableRoot(visiblePosition.deepEquivalent(), ed
itableType); |
| 83 Node* previousNode = previousLeafWithSameEditability(node, editableType); | 83 Node* previousNode = previousLeafWithSameEditability(node, editableType); |
| 84 | 84 |
| 85 while (previousNode && (!previousNode->renderer() || inSameLine(VisiblePosit
ion(firstPositionInOrBeforeNode(previousNode)), visiblePosition))) | 85 while (previousNode && (!previousNode->renderer() || inSameLine(VisiblePosit
ion(firstPositionInOrBeforeNode(previousNode)), visiblePosition))) |
| 86 previousNode = previousLeafWithSameEditability(previousNode, editableTyp
e); | 86 previousNode = previousLeafWithSameEditability(previousNode, editableTyp
e); |
| 87 | 87 |
| 88 while (previousNode && !previousNode->isShadowRoot()) { | 88 while (previousNode && !previousNode->isShadowRoot()) { |
| 89 if (highestEditableRoot(firstPositionInOrBeforeNode(previousNode), edita
bleType) != highestRoot) | 89 if (highestEditableRoot(firstPositionInOrBeforeNode(previousNode), edita
bleType) != highestRoot) |
| 90 break; | 90 break; |
| 91 | 91 |
| 92 Position pos = previousNode->hasTagName(brTag) ? positionBeforeNode(*pre
viousNode) : | 92 Position pos = previousNode->hasTagName(brTag) ? positionBeforeNode(prev
iousNode) : |
| 93 createLegacyEditingPosition(previousNode, caretMaxOffset(previousNod
e)); | 93 createLegacyEditingPosition(previousNode, caretMaxOffset(previousNod
e)); |
| 94 | 94 |
| 95 if (pos.isCandidate()) | 95 if (pos.isCandidate()) |
| 96 return pos; | 96 return pos; |
| 97 | 97 |
| 98 previousNode = previousLeafWithSameEditability(previousNode, editableTyp
e); | 98 previousNode = previousLeafWithSameEditability(previousNode, editableTyp
e); |
| 99 } | 99 } |
| 100 return Position(); | 100 return Position(); |
| 101 } | 101 } |
| 102 | 102 |
| (...skipping 635 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 738 return VisiblePosition(); | 738 return VisiblePosition(); |
| 739 | 739 |
| 740 startNode = startBox->renderer().nonPseudoNode(); | 740 startNode = startBox->renderer().nonPseudoNode(); |
| 741 if (startNode) | 741 if (startNode) |
| 742 break; | 742 break; |
| 743 | 743 |
| 744 startBox = startBox->nextLeafChild(); | 744 startBox = startBox->nextLeafChild(); |
| 745 } | 745 } |
| 746 } | 746 } |
| 747 | 747 |
| 748 return VisiblePosition(startNode->isTextNode() ? Position(toText(startNode),
toInlineTextBox(startBox)->start()) : positionBeforeNode(*startNode)); | 748 return VisiblePosition(startNode->isTextNode() ? Position(toText(startNode),
toInlineTextBox(startBox)->start()) : positionBeforeNode(startNode)); |
| 749 } | 749 } |
| 750 | 750 |
| 751 static VisiblePosition startOfLine(const VisiblePosition& c, LineEndpointComputa
tionMode mode) | 751 static VisiblePosition startOfLine(const VisiblePosition& c, LineEndpointComputa
tionMode mode) |
| 752 { | 752 { |
| 753 // TODO: this is the current behavior that might need to be fixed. | 753 // TODO: this is the current behavior that might need to be fixed. |
| 754 // Please refer to https://bugs.webkit.org/show_bug.cgi?id=49107 for detail. | 754 // Please refer to https://bugs.webkit.org/show_bug.cgi?id=49107 for detail. |
| 755 VisiblePosition visPos = startPositionForLine(c, mode); | 755 VisiblePosition visPos = startPositionForLine(c, mode); |
| 756 | 756 |
| 757 if (mode == UseLogicalOrdering) { | 757 if (mode == UseLogicalOrdering) { |
| 758 if (Node* editableRoot = highestEditableRoot(c.deepEquivalent())) { | 758 if (Node* editableRoot = highestEditableRoot(c.deepEquivalent())) { |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 807 endNode = endBox->renderer().nonPseudoNode(); | 807 endNode = endBox->renderer().nonPseudoNode(); |
| 808 if (endNode) | 808 if (endNode) |
| 809 break; | 809 break; |
| 810 | 810 |
| 811 endBox = endBox->prevLeafChild(); | 811 endBox = endBox->prevLeafChild(); |
| 812 } | 812 } |
| 813 } | 813 } |
| 814 | 814 |
| 815 Position pos; | 815 Position pos; |
| 816 if (endNode->hasTagName(brTag)) | 816 if (endNode->hasTagName(brTag)) |
| 817 pos = positionBeforeNode(*endNode); | 817 pos = positionBeforeNode(endNode); |
| 818 else if (endBox->isInlineTextBox() && endNode->isTextNode()) { | 818 else if (endBox->isInlineTextBox() && endNode->isTextNode()) { |
| 819 InlineTextBox* endTextBox = toInlineTextBox(endBox); | 819 InlineTextBox* endTextBox = toInlineTextBox(endBox); |
| 820 int endOffset = endTextBox->start(); | 820 int endOffset = endTextBox->start(); |
| 821 if (!endTextBox->isLineBreak()) | 821 if (!endTextBox->isLineBreak()) |
| 822 endOffset += endTextBox->len(); | 822 endOffset += endTextBox->len(); |
| 823 pos = Position(toText(endNode), endOffset); | 823 pos = Position(toText(endNode), endOffset); |
| 824 } else | 824 } else |
| 825 pos = positionAfterNode(*endNode); | 825 pos = positionAfterNode(endNode); |
| 826 | 826 |
| 827 return VisiblePosition(pos, VP_UPSTREAM_IF_POSSIBLE); | 827 return VisiblePosition(pos, VP_UPSTREAM_IF_POSSIBLE); |
| 828 } | 828 } |
| 829 | 829 |
| 830 static bool inSameLogicalLine(const VisiblePosition& a, const VisiblePosition& b
) | 830 static bool inSameLogicalLine(const VisiblePosition& a, const VisiblePosition& b
) |
| 831 { | 831 { |
| 832 return a.isNotNull() && logicalStartOfLine(a) == logicalStartOfLine(b); | 832 return a.isNotNull() && logicalStartOfLine(a) == logicalStartOfLine(b); |
| 833 } | 833 } |
| 834 | 834 |
| 835 static VisiblePosition endOfLine(const VisiblePosition& c, LineEndpointComputati
onMode mode) | 835 static VisiblePosition endOfLine(const VisiblePosition& c, LineEndpointComputati
onMode mode) |
| (...skipping 243 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1079 | 1079 |
| 1080 VisiblePosition startOfParagraph(const VisiblePosition& c, EditingBoundaryCrossi
ngRule boundaryCrossingRule) | 1080 VisiblePosition startOfParagraph(const VisiblePosition& c, EditingBoundaryCrossi
ngRule boundaryCrossingRule) |
| 1081 { | 1081 { |
| 1082 Position p = c.deepEquivalent(); | 1082 Position p = c.deepEquivalent(); |
| 1083 Node* startNode = p.deprecatedNode(); | 1083 Node* startNode = p.deprecatedNode(); |
| 1084 | 1084 |
| 1085 if (!startNode) | 1085 if (!startNode) |
| 1086 return VisiblePosition(); | 1086 return VisiblePosition(); |
| 1087 | 1087 |
| 1088 if (isRenderedAsNonInlineTableImageOrHR(startNode)) | 1088 if (isRenderedAsNonInlineTableImageOrHR(startNode)) |
| 1089 return VisiblePosition(positionBeforeNode(*startNode)); | 1089 return VisiblePosition(positionBeforeNode(startNode)); |
| 1090 | 1090 |
| 1091 Node* startBlock = enclosingBlock(startNode); | 1091 Node* startBlock = enclosingBlock(startNode); |
| 1092 | 1092 |
| 1093 Node* node = startNode; | 1093 Node* node = startNode; |
| 1094 Node* highestRoot = highestEditableRoot(p); | 1094 Node* highestRoot = highestEditableRoot(p); |
| 1095 int offset = p.deprecatedEditingOffset(); | 1095 int offset = p.deprecatedEditingOffset(); |
| 1096 Position::AnchorType type = p.anchorType(); | 1096 Position::AnchorType type = p.anchorType(); |
| 1097 | 1097 |
| 1098 Node* n = startNode; | 1098 Node* n = startNode; |
| 1099 bool startNodeIsEditable = startNode->rendererIsEditable(); | 1099 bool startNodeIsEditable = startNode->rendererIsEditable(); |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1156 | 1156 |
| 1157 VisiblePosition endOfParagraph(const VisiblePosition &c, EditingBoundaryCrossing
Rule boundaryCrossingRule) | 1157 VisiblePosition endOfParagraph(const VisiblePosition &c, EditingBoundaryCrossing
Rule boundaryCrossingRule) |
| 1158 { | 1158 { |
| 1159 if (c.isNull()) | 1159 if (c.isNull()) |
| 1160 return VisiblePosition(); | 1160 return VisiblePosition(); |
| 1161 | 1161 |
| 1162 Position p = c.deepEquivalent(); | 1162 Position p = c.deepEquivalent(); |
| 1163 Node* startNode = p.deprecatedNode(); | 1163 Node* startNode = p.deprecatedNode(); |
| 1164 | 1164 |
| 1165 if (isRenderedAsNonInlineTableImageOrHR(startNode)) | 1165 if (isRenderedAsNonInlineTableImageOrHR(startNode)) |
| 1166 return VisiblePosition(positionAfterNode(*startNode)); | 1166 return VisiblePosition(positionAfterNode(startNode)); |
| 1167 | 1167 |
| 1168 Node* startBlock = enclosingBlock(startNode); | 1168 Node* startBlock = enclosingBlock(startNode); |
| 1169 Node* stayInsideBlock = startBlock; | 1169 Node* stayInsideBlock = startBlock; |
| 1170 | 1170 |
| 1171 Node* node = startNode; | 1171 Node* node = startNode; |
| 1172 Node* highestRoot = highestEditableRoot(p); | 1172 Node* highestRoot = highestEditableRoot(p); |
| 1173 int offset = p.deprecatedEditingOffset(); | 1173 int offset = p.deprecatedEditingOffset(); |
| 1174 Position::AnchorType type = p.anchorType(); | 1174 Position::AnchorType type = p.anchorType(); |
| 1175 | 1175 |
| 1176 Node* n = startNode; | 1176 Node* n = startNode; |
| (...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1384 { | 1384 { |
| 1385 return direction == LTR ? logicalStartOfLine(c) : logicalEndOfLine(c); | 1385 return direction == LTR ? logicalStartOfLine(c) : logicalEndOfLine(c); |
| 1386 } | 1386 } |
| 1387 | 1387 |
| 1388 VisiblePosition rightBoundaryOfLine(const VisiblePosition& c, TextDirection dire
ction) | 1388 VisiblePosition rightBoundaryOfLine(const VisiblePosition& c, TextDirection dire
ction) |
| 1389 { | 1389 { |
| 1390 return direction == LTR ? logicalEndOfLine(c) : logicalStartOfLine(c); | 1390 return direction == LTR ? logicalEndOfLine(c) : logicalStartOfLine(c); |
| 1391 } | 1391 } |
| 1392 | 1392 |
| 1393 } | 1393 } |
| OLD | NEW |