| OLD | NEW |
| 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 366 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 377 bool previousCharacterWasSpace = false; | 377 bool previousCharacterWasSpace = false; |
| 378 for (size_t i = 0; i < length; i++) { | 378 for (size_t i = 0; i < length; i++) { |
| 379 UChar c = string[i]; | 379 UChar c = string[i]; |
| 380 if (!isWhitespace(c)) { | 380 if (!isWhitespace(c)) { |
| 381 rebalancedString.append(c); | 381 rebalancedString.append(c); |
| 382 previousCharacterWasSpace = false; | 382 previousCharacterWasSpace = false; |
| 383 continue; | 383 continue; |
| 384 } | 384 } |
| 385 | 385 |
| 386 if (previousCharacterWasSpace || (!i && startIsStartOfParagraph) || (i +
1 == length && endIsEndOfParagraph)) { | 386 if (previousCharacterWasSpace || (!i && startIsStartOfParagraph) || (i +
1 == length && endIsEndOfParagraph)) { |
| 387 rebalancedString.append(noBreakSpace); | 387 rebalancedString.append(noBreakSpaceCharacter); |
| 388 previousCharacterWasSpace = false; | 388 previousCharacterWasSpace = false; |
| 389 } else { | 389 } else { |
| 390 rebalancedString.append(' '); | 390 rebalancedString.append(' '); |
| 391 previousCharacterWasSpace = true; | 391 previousCharacterWasSpace = true; |
| 392 } | 392 } |
| 393 } | 393 } |
| 394 | 394 |
| 395 ASSERT(rebalancedString.length() == length); | 395 ASSERT(rebalancedString.length() == length); |
| 396 | 396 |
| 397 return rebalancedString.toString(); | 397 return rebalancedString.toString(); |
| 398 } | 398 } |
| 399 | 399 |
| 400 bool isTableStructureNode(const Node *node) | 400 bool isTableStructureNode(const Node *node) |
| 401 { | 401 { |
| 402 LayoutObject* layoutObject = node->layoutObject(); | 402 LayoutObject* layoutObject = node->layoutObject(); |
| 403 return (layoutObject && (layoutObject->isTableCell() || layoutObject->isTabl
eRow() || layoutObject->isTableSection() || layoutObject->isLayoutTableCol())); | 403 return (layoutObject && (layoutObject->isTableCell() || layoutObject->isTabl
eRow() || layoutObject->isTableSection() || layoutObject->isLayoutTableCol())); |
| 404 } | 404 } |
| 405 | 405 |
| 406 const String& nonBreakingSpaceString() | 406 const String& nonBreakingSpaceString() |
| 407 { | 407 { |
| 408 DEFINE_STATIC_LOCAL(String, nonBreakingSpaceString, (&noBreakSpace, 1)); | 408 DEFINE_STATIC_LOCAL(String, nonBreakingSpaceString, (&noBreakSpaceCharacter,
1)); |
| 409 return nonBreakingSpaceString; | 409 return nonBreakingSpaceString; |
| 410 } | 410 } |
| 411 | 411 |
| 412 // FIXME: need to dump this | 412 // FIXME: need to dump this |
| 413 static bool isSpecialHTMLElement(const Node& n) | 413 static bool isSpecialHTMLElement(const Node& n) |
| 414 { | 414 { |
| 415 if (!n.isHTMLElement()) | 415 if (!n.isHTMLElement()) |
| 416 return false; | 416 return false; |
| 417 | 417 |
| 418 if (n.isLink()) | 418 if (n.isLink()) |
| (...skipping 492 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 911 if (position.isNull()) | 911 if (position.isNull()) |
| 912 return Position(); | 912 return Position(); |
| 913 | 913 |
| 914 if (isHTMLBRElement(*position.upstream().anchorNode())) | 914 if (isHTMLBRElement(*position.upstream().anchorNode())) |
| 915 return Position(); | 915 return Position(); |
| 916 | 916 |
| 917 Position prev = previousCharacterPosition(position, affinity); | 917 Position prev = previousCharacterPosition(position, affinity); |
| 918 if (prev != position && inSameContainingBlockFlowElement(prev.anchorNode(),
position.anchorNode()) && prev.anchorNode()->isTextNode()) { | 918 if (prev != position && inSameContainingBlockFlowElement(prev.anchorNode(),
position.anchorNode()) && prev.anchorNode()->isTextNode()) { |
| 919 String string = toText(prev.anchorNode())->data(); | 919 String string = toText(prev.anchorNode())->data(); |
| 920 UChar previousCharacter = string[prev.deprecatedEditingOffset()]; | 920 UChar previousCharacter = string[prev.deprecatedEditingOffset()]; |
| 921 bool isSpace = option == ConsiderNonCollapsibleWhitespace ? (isSpaceOrNe
wline(previousCharacter) || previousCharacter == noBreakSpace) : isCollapsibleWh
itespace(previousCharacter); | 921 bool isSpace = option == ConsiderNonCollapsibleWhitespace ? (isSpaceOrNe
wline(previousCharacter) || previousCharacter == noBreakSpaceCharacter) : isColl
apsibleWhitespace(previousCharacter); |
| 922 if (isSpace && isEditablePosition(prev)) | 922 if (isSpace && isEditablePosition(prev)) |
| 923 return prev; | 923 return prev; |
| 924 } | 924 } |
| 925 | 925 |
| 926 return Position(); | 926 return Position(); |
| 927 } | 927 } |
| 928 | 928 |
| 929 // This assumes that it starts in editable content. | 929 // This assumes that it starts in editable content. |
| 930 Position trailingWhitespacePosition(const Position& position, EAffinity, Whitesp
acePositionOption option) | 930 Position trailingWhitespacePosition(const Position& position, EAffinity, Whitesp
acePositionOption option) |
| 931 { | 931 { |
| 932 ASSERT(isEditablePosition(position, ContentIsEditable, DoNotUpdateStyle)); | 932 ASSERT(isEditablePosition(position, ContentIsEditable, DoNotUpdateStyle)); |
| 933 if (position.isNull()) | 933 if (position.isNull()) |
| 934 return Position(); | 934 return Position(); |
| 935 | 935 |
| 936 VisiblePosition visiblePosition(position); | 936 VisiblePosition visiblePosition(position); |
| 937 UChar characterAfterVisiblePosition = visiblePosition.characterAfter(); | 937 UChar characterAfterVisiblePosition = visiblePosition.characterAfter(); |
| 938 bool isSpace = option == ConsiderNonCollapsibleWhitespace ? (isSpaceOrNewlin
e(characterAfterVisiblePosition) || characterAfterVisiblePosition == noBreakSpac
e) : isCollapsibleWhitespace(characterAfterVisiblePosition); | 938 bool isSpace = option == ConsiderNonCollapsibleWhitespace ? (isSpaceOrNewlin
e(characterAfterVisiblePosition) || characterAfterVisiblePosition == noBreakSpac
eCharacter) : isCollapsibleWhitespace(characterAfterVisiblePosition); |
| 939 // The space must not be in another paragraph and it must be editable. | 939 // The space must not be in another paragraph and it must be editable. |
| 940 if (isSpace && !isEndOfParagraph(visiblePosition) && visiblePosition.next(Ca
nnotCrossEditingBoundary).isNotNull()) | 940 if (isSpace && !isEndOfParagraph(visiblePosition) && visiblePosition.next(Ca
nnotCrossEditingBoundary).isNotNull()) |
| 941 return position; | 941 return position; |
| 942 return Position(); | 942 return Position(); |
| 943 } | 943 } |
| 944 | 944 |
| 945 unsigned numEnclosingMailBlockquotes(const Position& p) | 945 unsigned numEnclosingMailBlockquotes(const Position& p) |
| 946 { | 946 { |
| 947 unsigned num = 0; | 947 unsigned num = 0; |
| 948 for (Node* n = p.deprecatedNode(); n; n = n->parentNode()) | 948 for (Node* n = p.deprecatedNode(); n; n = n->parentNode()) |
| (...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1182 // if the selection starts just before a paragraph break, skip over it | 1182 // if the selection starts just before a paragraph break, skip over it |
| 1183 if (isEndOfParagraph(visiblePosition)) | 1183 if (isEndOfParagraph(visiblePosition)) |
| 1184 return visiblePosition.next().deepEquivalent().downstream(); | 1184 return visiblePosition.next().deepEquivalent().downstream(); |
| 1185 | 1185 |
| 1186 // otherwise, make sure to be at the start of the first selected node, | 1186 // otherwise, make sure to be at the start of the first selected node, |
| 1187 // instead of possibly at the end of the last node before the selection | 1187 // instead of possibly at the end of the last node before the selection |
| 1188 return visiblePosition.deepEquivalent().downstream(); | 1188 return visiblePosition.deepEquivalent().downstream(); |
| 1189 } | 1189 } |
| 1190 | 1190 |
| 1191 } // namespace blink | 1191 } // namespace blink |
| OLD | NEW |