Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright (C) 2006, 2007, 2008, 2011 Apple Inc. All rights reserved. | 2 * Copyright (C) 2006, 2007, 2008, 2011 Apple Inc. All rights reserved. |
| 3 * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) | 3 * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) |
| 4 * | 4 * |
| 5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
| 6 * modification, are permitted provided that the following conditions | 6 * modification, are permitted provided that the following conditions |
| 7 * are met: | 7 * are met: |
| 8 * 1. Redistributions of source code must retain the above copyright | 8 * 1. Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * 2. Redistributions in binary form must reproduce the above copyright | 10 * 2. Redistributions in binary form must reproduce the above copyright |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 127 // TODO(xiaochengh): |sentenceStart > range.startPosition()| is possible, | 127 // TODO(xiaochengh): |sentenceStart > range.startPosition()| is possible, |
| 128 // which would trigger a DCHECK in EphemeralRange's constructor if we return | 128 // which would trigger a DCHECK in EphemeralRange's constructor if we return |
| 129 // it directly. However, this shouldn't happen and needs to be fixed. | 129 // it directly. However, this shouldn't happen and needs to be fixed. |
| 130 return expandEndToSentenceBoundary(EphemeralRange( | 130 return expandEndToSentenceBoundary(EphemeralRange( |
| 131 sentenceStart.isNotNull() && sentenceStart < range.startPosition() | 131 sentenceStart.isNotNull() && sentenceStart < range.startPosition() |
| 132 ? sentenceStart | 132 ? sentenceStart |
| 133 : range.startPosition(), | 133 : range.startPosition(), |
| 134 range.endPosition())); | 134 range.endPosition())); |
| 135 } | 135 } |
| 136 | 136 |
| 137 SelectionInDOMTree selectionFromBaseAndExtent(const VisiblePosition& base, | |
|
Xiaocheng
2016/10/21 11:18:36
We should use setBaseAndExtentDeprecated. Though t
yosin_UTC9
2016/10/24 06:19:44
Done.
| |
| 138 const VisiblePosition& extent) { | |
| 139 if (base.isNotNull() && extent.isNotNull()) { | |
| 140 return SelectionInDOMTree::Builder() | |
| 141 .collapse(base.toPositionWithAffinity()) | |
| 142 .extend(extent.deepEquivalent()) | |
| 143 .build(); | |
| 144 } | |
| 145 if (base.isNotNull()) { | |
| 146 return SelectionInDOMTree::Builder() | |
| 147 .collapse(base.toPositionWithAffinity()) | |
| 148 .build(); | |
| 149 } | |
| 150 if (extent.isNotNull()) { | |
| 151 return SelectionInDOMTree::Builder() | |
| 152 .collapse(extent.toPositionWithAffinity()) | |
| 153 .build(); | |
| 154 } | |
| 155 return SelectionInDOMTree(); | |
| 156 } | |
| 157 | |
| 158 SelectionInDOMTree selectWord(const VisiblePosition& position) { | |
| 159 return selectionFromBaseAndExtent(startOfWord(position, LeftWordIfOnBoundary), | |
| 160 endOfWord(position, RightWordIfOnBoundary)); | |
| 161 } | |
| 162 | |
| 137 } // namespace | 163 } // namespace |
| 138 | 164 |
| 139 SpellChecker* SpellChecker::create(LocalFrame& frame) { | 165 SpellChecker* SpellChecker::create(LocalFrame& frame) { |
| 140 return new SpellChecker(frame); | 166 return new SpellChecker(frame); |
| 141 } | 167 } |
| 142 | 168 |
| 143 static SpellCheckerClient& emptySpellCheckerClient() { | 169 static SpellCheckerClient& emptySpellCheckerClient() { |
| 144 DEFINE_STATIC_LOCAL(EmptySpellCheckerClient, client, ()); | 170 DEFINE_STATIC_LOCAL(EmptySpellCheckerClient, client, ()); |
| 145 return client; | 171 return client; |
| 146 } | 172 } |
| (...skipping 290 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 437 VisiblePosition start = createVisiblePosition( | 463 VisiblePosition start = createVisiblePosition( |
| 438 cmd.endingSelection().start(), cmd.endingSelection().affinity()); | 464 cmd.endingSelection().start(), cmd.endingSelection().affinity()); |
| 439 VisiblePosition previous = previousPositionOf(start); | 465 VisiblePosition previous = previousPositionOf(start); |
| 440 | 466 |
| 441 VisiblePosition wordStartOfPrevious = | 467 VisiblePosition wordStartOfPrevious = |
| 442 startOfWord(previous, LeftWordIfOnBoundary); | 468 startOfWord(previous, LeftWordIfOnBoundary); |
| 443 | 469 |
| 444 if (cmd.commandTypeOfOpenCommand() == | 470 if (cmd.commandTypeOfOpenCommand() == |
| 445 TypingCommand::InsertParagraphSeparator) { | 471 TypingCommand::InsertParagraphSeparator) { |
| 446 VisiblePosition nextWord = nextWordPosition(start); | 472 VisiblePosition nextWord = nextWordPosition(start); |
| 447 VisibleSelection words = | 473 VisibleSelection words = createVisibleSelection( |
| 448 createVisibleSelection(wordStartOfPrevious, endOfWord(nextWord)); | 474 selectionFromBaseAndExtent(wordStartOfPrevious, endOfWord(nextWord))); |
|
Xiaocheng
2016/10/21 11:18:36
We should use setBaseAndExtentDeprecated.
yosin_UTC9
2016/10/24 06:19:44
Done
| |
| 449 markMisspellingsAfterLineBreak(words); | 475 markMisspellingsAfterLineBreak(words); |
| 450 return; | 476 return; |
| 451 } | 477 } |
| 452 | 478 |
| 453 if (previous.isNull()) | 479 if (previous.isNull()) |
| 454 return; | 480 return; |
| 455 VisiblePosition currentWordStart = startOfWord(start, LeftWordIfOnBoundary); | 481 VisiblePosition currentWordStart = startOfWord(start, LeftWordIfOnBoundary); |
| 456 if (wordStartOfPrevious.deepEquivalent() == currentWordStart.deepEquivalent()) | 482 if (wordStartOfPrevious.deepEquivalent() == currentWordStart.deepEquivalent()) |
| 457 return; | 483 return; |
| 458 markMisspellingsAfterTypingToWord(wordStartOfPrevious); | 484 markMisspellingsAfterTypingToWord(wordStartOfPrevious); |
| 459 } | 485 } |
| 460 | 486 |
| 461 void SpellChecker::markMisspellingsAfterLineBreak( | 487 void SpellChecker::markMisspellingsAfterLineBreak( |
| 462 const VisibleSelection& wordSelection) { | 488 const VisibleSelection& wordSelection) { |
| 463 TRACE_EVENT0("blink", "SpellChecker::markMisspellingsAfterLineBreak"); | 489 TRACE_EVENT0("blink", "SpellChecker::markMisspellingsAfterLineBreak"); |
| 464 | 490 |
| 465 markMisspellingsAndBadGrammar(wordSelection); | 491 markMisspellingsAndBadGrammar(wordSelection); |
| 466 } | 492 } |
| 467 | 493 |
| 468 void SpellChecker::markMisspellingsAfterTypingToWord( | 494 void SpellChecker::markMisspellingsAfterTypingToWord( |
| 469 const VisiblePosition& wordStart) { | 495 const VisiblePosition& wordStart) { |
| 470 TRACE_EVENT0("blink", "SpellChecker::markMisspellingsAfterTypingToWord"); | 496 TRACE_EVENT0("blink", "SpellChecker::markMisspellingsAfterTypingToWord"); |
| 471 | 497 |
| 472 VisibleSelection adjacentWords = | 498 VisibleSelection adjacentWords = |
| 473 createVisibleSelection(startOfWord(wordStart, LeftWordIfOnBoundary), | 499 createVisibleSelection(selectWord(wordStart)); |
| 474 endOfWord(wordStart, RightWordIfOnBoundary)); | |
| 475 markMisspellingsAndBadGrammar(adjacentWords); | 500 markMisspellingsAndBadGrammar(adjacentWords); |
| 476 } | 501 } |
| 477 | 502 |
| 478 bool SpellChecker::isSpellCheckingEnabledInFocusedNode() const { | 503 bool SpellChecker::isSpellCheckingEnabledInFocusedNode() const { |
| 479 Node* focusedNode = frame().selection().start().anchorNode(); | 504 Node* focusedNode = frame().selection().start().anchorNode(); |
| 480 if (!focusedNode) | 505 if (!focusedNode) |
| 481 return false; | 506 return false; |
| 482 const Element* focusedElement = focusedNode->isElementNode() | 507 const Element* focusedElement = focusedNode->isElementNode() |
| 483 ? toElement(focusedNode) | 508 ? toElement(focusedNode) |
| 484 : focusedNode->parentElement(); | 509 : focusedNode->parentElement(); |
| (...skipping 376 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 861 | 886 |
| 862 VisibleSelection newAdjacentWords; | 887 VisibleSelection newAdjacentWords; |
| 863 const VisibleSelection newSelection = frame().selection().selection(); | 888 const VisibleSelection newSelection = frame().selection().selection(); |
| 864 if (isSelectionInTextFormControl(newSelection)) { | 889 if (isSelectionInTextFormControl(newSelection)) { |
| 865 const Position newStart = newSelection.start(); | 890 const Position newStart = newSelection.start(); |
| 866 newAdjacentWords.setWithoutValidation( | 891 newAdjacentWords.setWithoutValidation( |
| 867 HTMLTextFormControlElement::startOfWord(newStart), | 892 HTMLTextFormControlElement::startOfWord(newStart), |
| 868 HTMLTextFormControlElement::endOfWord(newStart)); | 893 HTMLTextFormControlElement::endOfWord(newStart)); |
| 869 } else { | 894 } else { |
| 870 if (newSelection.isContentEditable()) { | 895 if (newSelection.isContentEditable()) { |
| 871 const VisiblePosition newStart(newSelection.visibleStart()); | |
| 872 newAdjacentWords = | 896 newAdjacentWords = |
| 873 createVisibleSelection(startOfWord(newStart, LeftWordIfOnBoundary), | 897 createVisibleSelection(selectWord(newSelection.visibleStart())); |
| 874 endOfWord(newStart, RightWordIfOnBoundary)); | |
| 875 } | 898 } |
| 876 } | 899 } |
| 877 | 900 |
| 878 // When typing we check spelling elsewhere, so don't redo it here. | 901 // When typing we check spelling elsewhere, so don't redo it here. |
| 879 // If this is a change in selection resulting from a delete operation, | 902 // If this is a change in selection resulting from a delete operation, |
| 880 // oldSelection may no longer be in the document. | 903 // oldSelection may no longer be in the document. |
| 881 // FIXME(http://crbug.com/382809): if oldSelection is on a textarea | 904 // FIXME(http://crbug.com/382809): if oldSelection is on a textarea |
| 882 // element, we cause synchronous layout. | 905 // element, we cause synchronous layout. |
| 883 spellCheckOldSelection(oldSelectionStart, newAdjacentWords); | 906 spellCheckOldSelection(oldSelectionStart, newAdjacentWords); |
| 884 } | 907 } |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 922 void SpellChecker::spellCheckOldSelection( | 945 void SpellChecker::spellCheckOldSelection( |
| 923 const Position& oldSelectionStart, | 946 const Position& oldSelectionStart, |
| 924 const VisibleSelection& newAdjacentWords) { | 947 const VisibleSelection& newAdjacentWords) { |
| 925 if (!isSpellCheckingEnabled()) | 948 if (!isSpellCheckingEnabled()) |
| 926 return; | 949 return; |
| 927 | 950 |
| 928 TRACE_EVENT0("blink", "SpellChecker::spellCheckOldSelection"); | 951 TRACE_EVENT0("blink", "SpellChecker::spellCheckOldSelection"); |
| 929 | 952 |
| 930 VisiblePosition oldStart = createVisiblePosition(oldSelectionStart); | 953 VisiblePosition oldStart = createVisiblePosition(oldSelectionStart); |
| 931 VisibleSelection oldAdjacentWords = | 954 VisibleSelection oldAdjacentWords = |
| 932 createVisibleSelection(startOfWord(oldStart, LeftWordIfOnBoundary), | 955 createVisibleSelection(selectWord(oldStart)); |
| 933 endOfWord(oldStart, RightWordIfOnBoundary)); | |
| 934 if (oldAdjacentWords == newAdjacentWords) | 956 if (oldAdjacentWords == newAdjacentWords) |
| 935 return; | 957 return; |
| 936 markMisspellingsAndBadGrammar(oldAdjacentWords); | 958 markMisspellingsAndBadGrammar(oldAdjacentWords); |
| 937 } | 959 } |
| 938 | 960 |
| 939 static Node* findFirstMarkable(Node* node) { | 961 static Node* findFirstMarkable(Node* node) { |
| 940 while (node) { | 962 while (node) { |
| 941 if (!node->layoutObject()) | 963 if (!node->layoutObject()) |
| 942 return 0; | 964 return 0; |
| 943 if (node->layoutObject()->isText()) | 965 if (node->layoutObject()->isText()) |
| (...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1129 startOfNextParagraph(createVisiblePosition(paragraphEnd)); | 1151 startOfNextParagraph(createVisiblePosition(paragraphEnd)); |
| 1130 paragraphStart = newParagraphStart.toParentAnchoredPosition(); | 1152 paragraphStart = newParagraphStart.toParentAnchoredPosition(); |
| 1131 paragraphEnd = endOfParagraph(newParagraphStart).toParentAnchoredPosition(); | 1153 paragraphEnd = endOfParagraph(newParagraphStart).toParentAnchoredPosition(); |
| 1132 firstIteration = false; | 1154 firstIteration = false; |
| 1133 totalLengthProcessed += currentLength; | 1155 totalLengthProcessed += currentLength; |
| 1134 } | 1156 } |
| 1135 return std::make_pair(firstFoundItem, firstFoundOffset); | 1157 return std::make_pair(firstFoundItem, firstFoundOffset); |
| 1136 } | 1158 } |
| 1137 | 1159 |
| 1138 } // namespace blink | 1160 } // namespace blink |
| OLD | NEW |