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

Side by Side Diff: third_party/WebKit/Source/core/editing/spellcheck/HotModeSpellCheckRequester.cpp

Issue 2867393003: [Idle time spell checker] Add paragraph-level heuristic to hot mode requester (Closed)
Patch Set: Created 3 years, 7 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 | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2017 The Chromium Authors. All rights reserved. 1 // Copyright 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "core/editing/spellcheck/HotModeSpellCheckRequester.h" 5 #include "core/editing/spellcheck/HotModeSpellCheckRequester.h"
6 6
7 #include "core/editing/EditingUtilities.h" 7 #include "core/editing/EditingUtilities.h"
8 #include "core/editing/Editor.h" 8 #include "core/editing/Editor.h"
9 #include "core/editing/VisiblePosition.h" 9 #include "core/editing/VisiblePosition.h"
10 #include "core/editing/commands/CompositeEditCommand.h" 10 #include "core/editing/commands/CompositeEditCommand.h"
11 #include "core/editing/commands/TypingCommand.h" 11 #include "core/editing/commands/TypingCommand.h"
12 #include "core/editing/iterators/BackwardsCharacterIterator.h" 12 #include "core/editing/iterators/BackwardsCharacterIterator.h"
13 #include "core/editing/iterators/CharacterIterator.h" 13 #include "core/editing/iterators/CharacterIterator.h"
14 #include "core/editing/markers/DocumentMarkerController.h" 14 #include "core/editing/markers/DocumentMarkerController.h"
15 #include "core/editing/spellcheck/SpellCheckRequester.h" 15 #include "core/editing/spellcheck/SpellCheckRequester.h"
16 #include "core/editing/spellcheck/SpellChecker.h" 16 #include "core/editing/spellcheck/SpellChecker.h"
17 17
18 namespace blink { 18 namespace blink {
19 19
20 namespace { 20 namespace {
21 21
22 const int kHotModeCheckAllThreshold = 128;
22 const int kHotModeChunkSize = 1024; 23 const int kHotModeChunkSize = 1024;
23 24
24 EphemeralRange AdjacentWordIfExists(const Position& pos) { 25 EphemeralRange AdjacentWordIfExists(const Position& pos) {
25 const VisiblePosition& visible_pos = CreateVisiblePosition(pos); 26 const VisiblePosition& visible_pos = CreateVisiblePosition(pos);
26 const VisiblePosition& word_start = PreviousWordPosition(visible_pos); 27 const VisiblePosition& word_start = PreviousWordPosition(visible_pos);
27 if (word_start.IsNull()) 28 if (word_start.IsNull())
28 return EphemeralRange(); 29 return EphemeralRange();
29 const VisiblePosition& word_end = EndOfWord(word_start); 30 const VisiblePosition& word_end = EndOfWord(word_start);
30 if (word_end.IsNull()) 31 if (word_end.IsNull())
31 return EphemeralRange(); 32 return EphemeralRange();
(...skipping 26 matching lines...) Expand all
58 return false; 59 return false;
59 if (editable.VisibleBoundsInVisualViewport().IsEmpty()) 60 if (editable.VisibleBoundsInVisualViewport().IsEmpty())
60 return false; 61 return false;
61 // TODO(xiaochengh): Design more aggressive strategies to reduce checking when 62 // TODO(xiaochengh): Design more aggressive strategies to reduce checking when
62 // we are just moving selection around without modifying anything. 63 // we are just moving selection around without modifying anything.
63 return true; 64 return true;
64 } 65 }
65 66
66 EphemeralRange CalculateHotModeCheckingRange(const Element& editable, 67 EphemeralRange CalculateHotModeCheckingRange(const Element& editable,
67 const Position& position) { 68 const Position& position) {
69 // Check everything in |editable| if its total length is short.
68 const EphemeralRange& full_range = EphemeralRange::RangeOfContents(editable); 70 const EphemeralRange& full_range = EphemeralRange::RangeOfContents(editable);
69 const int full_length = TextIterator::RangeLength(full_range.StartPosition(), 71 const int full_length = TextIterator::RangeLength(full_range.StartPosition(),
70 full_range.EndPosition()); 72 full_range.EndPosition());
71 if (full_length <= kHotModeChunkSize) 73 // TODO(xiaochengh): There is no need to check if |full_length <= 2|, since
74 // we don't consider two characters as misspelled. However, a lot of layout
75 // tests depend on "zz" as misspelled, which should be changed.
76 if (full_length <= kHotModeCheckAllThreshold)
72 return full_range; 77 return full_range;
73 78
79 // Otherwise, if |position| is in a short paragraph, check the paragraph.
80 const EphemeralRange& paragraph_range =
81 ExpandToParagraphBoundary(EphemeralRange(position));
82 const int paragraph_length = TextIterator::RangeLength(
83 paragraph_range.StartPosition(), paragraph_range.EndPosition());
84 if (paragraph_length <= kHotModeChunkSize)
85 return paragraph_range;
86
87 // Otherwise, check a chunk of text centered at |position|.
74 TextIteratorBehavior behavior = TextIteratorBehavior::Builder() 88 TextIteratorBehavior behavior = TextIteratorBehavior::Builder()
75 .SetEmitsObjectReplacementCharacter(true) 89 .SetEmitsObjectReplacementCharacter(true)
76 .Build(); 90 .Build();
77 BackwardsCharacterIterator backward_iterator(full_range.StartPosition(), 91 BackwardsCharacterIterator backward_iterator(full_range.StartPosition(),
78 position, behavior); 92 position, behavior);
79 if (!backward_iterator.AtEnd()) 93 if (!backward_iterator.AtEnd())
80 backward_iterator.Advance(kHotModeChunkSize / 2); 94 backward_iterator.Advance(kHotModeChunkSize / 2);
81 const Position& chunk_start = backward_iterator.EndPosition(); 95 const Position& chunk_start = backward_iterator.EndPosition();
82 CharacterIterator forward_iterator(position, full_range.EndPosition(), 96 CharacterIterator forward_iterator(position, full_range.EndPosition(),
83 behavior); 97 behavior);
(...skipping 28 matching lines...) Expand all
112 current_word, DocumentMarker::MisspellingMarkers()); 126 current_word, DocumentMarker::MisspellingMarkers());
113 return; 127 return;
114 } 128 }
115 129
116 const EphemeralRange& checking_range = 130 const EphemeralRange& checking_range =
117 CalculateHotModeCheckingRange(*root_editable, position); 131 CalculateHotModeCheckingRange(*root_editable, position);
118 requester_->RequestCheckingFor(checking_range); 132 requester_->RequestCheckingFor(checking_range);
119 } 133 }
120 134
121 } // namespace blink 135 } // namespace blink
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698