Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(352)

Side by Side Diff: Source/core/editing/EditingUtilities.cpp

Issue 1299873002: ALL-IN-ONE Introduce enum class TextAffinity (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: 2015-08-19T18:08:52 Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « Source/core/editing/EditingUtilities.h ('k') | Source/core/editing/Editor.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2004, 2005, 2006, 2007 Apple Inc. All rights reserved. 2 * Copyright (C) 2004, 2005, 2006, 2007 Apple 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 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 1114 matching lines...) Expand 10 before | Expand all | Expand 10 after
1125 bool isNodeRendered(const Node& node) 1125 bool isNodeRendered(const Node& node)
1126 { 1126 {
1127 LayoutObject* layoutObject = node.layoutObject(); 1127 LayoutObject* layoutObject = node.layoutObject();
1128 if (!layoutObject) 1128 if (!layoutObject)
1129 return false; 1129 return false;
1130 1130
1131 return layoutObject->style()->visibility() == VISIBLE; 1131 return layoutObject->style()->visibility() == VISIBLE;
1132 } 1132 }
1133 1133
1134 // return first preceding DOM position rendered at a different location, or "thi s" 1134 // return first preceding DOM position rendered at a different location, or "thi s"
1135 static Position previousCharacterPosition(const Position& position, EAffinity af finity) 1135 static Position previousCharacterPosition(const Position& position, TextAffinity affinity)
1136 { 1136 {
1137 if (position.isNull()) 1137 if (position.isNull())
1138 return Position(); 1138 return Position();
1139 1139
1140 Element* fromRootEditableElement = position.anchorNode()->rootEditableElemen t(); 1140 Element* fromRootEditableElement = position.anchorNode()->rootEditableElemen t();
1141 1141
1142 bool atStartOfLine = isStartOfLine(VisiblePosition(position, affinity)); 1142 bool atStartOfLine = isStartOfLine(VisiblePosition(position, affinity));
1143 bool rendered = position.isCandidate(); 1143 bool rendered = position.isCandidate();
1144 1144
1145 Position currentPos = position; 1145 Position currentPos = position;
1146 while (!currentPos.atStartOfTree()) { 1146 while (!currentPos.atStartOfTree()) {
1147 currentPos = currentPos.previous(); 1147 currentPos = currentPos.previous();
1148 1148
1149 if (currentPos.anchorNode()->rootEditableElement() != fromRootEditableEl ement) 1149 if (currentPos.anchorNode()->rootEditableElement() != fromRootEditableEl ement)
1150 return position; 1150 return position;
1151 1151
1152 if (atStartOfLine || !rendered) { 1152 if (atStartOfLine || !rendered) {
1153 if (currentPos.isCandidate()) 1153 if (currentPos.isCandidate())
1154 return currentPos; 1154 return currentPos;
1155 } else if (rendersInDifferentPosition(position, currentPos)) { 1155 } else if (rendersInDifferentPosition(position, currentPos)) {
1156 return currentPos; 1156 return currentPos;
1157 } 1157 }
1158 } 1158 }
1159 1159
1160 return position; 1160 return position;
1161 } 1161 }
1162 1162
1163 // This assumes that it starts in editable content. 1163 // This assumes that it starts in editable content.
1164 Position leadingWhitespacePosition(const Position& position, EAffinity affinity, WhitespacePositionOption option) 1164 Position leadingWhitespacePosition(const Position& position, TextAffinity affini ty, WhitespacePositionOption option)
1165 { 1165 {
1166 ASSERT(isEditablePosition(position, ContentIsEditable, DoNotUpdateStyle)); 1166 ASSERT(isEditablePosition(position, ContentIsEditable, DoNotUpdateStyle));
1167 if (position.isNull()) 1167 if (position.isNull())
1168 return Position(); 1168 return Position();
1169 1169
1170 if (isHTMLBRElement(*position.upstream().anchorNode())) 1170 if (isHTMLBRElement(*position.upstream().anchorNode()))
1171 return Position(); 1171 return Position();
1172 1172
1173 Position prev = previousCharacterPosition(position, affinity); 1173 Position prev = previousCharacterPosition(position, affinity);
1174 if (prev != position && inSameContainingBlockFlowElement(prev.anchorNode(), position.anchorNode()) && prev.anchorNode()->isTextNode()) { 1174 if (prev != position && inSameContainingBlockFlowElement(prev.anchorNode(), position.anchorNode()) && prev.anchorNode()->isTextNode()) {
1175 String string = toText(prev.anchorNode())->data(); 1175 String string = toText(prev.anchorNode())->data();
1176 UChar previousCharacter = string[prev.computeOffsetInContainerNode()]; 1176 UChar previousCharacter = string[prev.computeOffsetInContainerNode()];
1177 bool isSpace = option == ConsiderNonCollapsibleWhitespace ? (isSpaceOrNe wline(previousCharacter) || previousCharacter == noBreakSpaceCharacter) : isColl apsibleWhitespace(previousCharacter); 1177 bool isSpace = option == ConsiderNonCollapsibleWhitespace ? (isSpaceOrNe wline(previousCharacter) || previousCharacter == noBreakSpaceCharacter) : isColl apsibleWhitespace(previousCharacter);
1178 if (isSpace && isEditablePosition(prev)) 1178 if (isSpace && isEditablePosition(prev))
1179 return prev; 1179 return prev;
1180 } 1180 }
1181 1181
1182 return Position(); 1182 return Position();
1183 } 1183 }
1184 1184
1185 // This assumes that it starts in editable content. 1185 // This assumes that it starts in editable content.
1186 Position trailingWhitespacePosition(const Position& position, EAffinity, Whitesp acePositionOption option) 1186 Position trailingWhitespacePosition(const Position& position, TextAffinity, Whit espacePositionOption option)
1187 { 1187 {
1188 ASSERT(isEditablePosition(position, ContentIsEditable, DoNotUpdateStyle)); 1188 ASSERT(isEditablePosition(position, ContentIsEditable, DoNotUpdateStyle));
1189 if (position.isNull()) 1189 if (position.isNull())
1190 return Position(); 1190 return Position();
1191 1191
1192 VisiblePosition visiblePosition(position); 1192 VisiblePosition visiblePosition(position);
1193 UChar characterAfterVisiblePosition = visiblePosition.characterAfter(); 1193 UChar characterAfterVisiblePosition = visiblePosition.characterAfter();
1194 bool isSpace = option == ConsiderNonCollapsibleWhitespace ? (isSpaceOrNewlin e(characterAfterVisiblePosition) || characterAfterVisiblePosition == noBreakSpac eCharacter) : isCollapsibleWhitespace(characterAfterVisiblePosition); 1194 bool isSpace = option == ConsiderNonCollapsibleWhitespace ? (isSpaceOrNewlin e(characterAfterVisiblePosition) || characterAfterVisiblePosition == noBreakSpac eCharacter) : isCollapsibleWhitespace(characterAfterVisiblePosition);
1195 // The space must not be in another paragraph and it must be editable. 1195 // The space must not be in another paragraph and it must be editable.
1196 if (isSpace && !isEndOfParagraph(visiblePosition) && visiblePosition.next(Ca nnotCrossEditingBoundary).isNotNull()) 1196 if (isSpace && !isEndOfParagraph(visiblePosition) && visiblePosition.next(Ca nnotCrossEditingBoundary).isNotNull())
(...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after
1434 // if the selection starts just before a paragraph break, skip over it 1434 // if the selection starts just before a paragraph break, skip over it
1435 if (isEndOfParagraph(visiblePosition)) 1435 if (isEndOfParagraph(visiblePosition))
1436 return visiblePosition.next().deepEquivalent().downstream(); 1436 return visiblePosition.next().deepEquivalent().downstream();
1437 1437
1438 // otherwise, make sure to be at the start of the first selected node, 1438 // otherwise, make sure to be at the start of the first selected node,
1439 // instead of possibly at the end of the last node before the selection 1439 // instead of possibly at the end of the last node before the selection
1440 return visiblePosition.deepEquivalent().downstream(); 1440 return visiblePosition.deepEquivalent().downstream();
1441 } 1441 }
1442 1442
1443 } // namespace blink 1443 } // namespace blink
OLDNEW
« no previous file with comments | « Source/core/editing/EditingUtilities.h ('k') | Source/core/editing/Editor.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698