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

Side by Side Diff: chrome/renderer/spellchecker/spellcheck.cc

Issue 1092243002: Handle typographical apostrophe with spelling service client (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix ozone and mac Created 5 years, 8 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
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "chrome/renderer/spellchecker/spellcheck.h" 5 #include "chrome/renderer/spellchecker/spellcheck.h"
6 6
7 #include <algorithm>
8
7 #include "base/bind.h" 9 #include "base/bind.h"
8 #include "base/message_loop/message_loop_proxy.h" 10 #include "base/message_loop/message_loop_proxy.h"
9 #include "base/strings/utf_string_conversions.h" 11 #include "base/strings/utf_string_conversions.h"
10 #include "chrome/common/render_messages.h" 12 #include "chrome/common/render_messages.h"
11 #include "chrome/common/spellcheck_common.h" 13 #include "chrome/common/spellcheck_common.h"
12 #include "chrome/common/spellcheck_messages.h" 14 #include "chrome/common/spellcheck_messages.h"
13 #include "chrome/common/spellcheck_result.h" 15 #include "chrome/common/spellcheck_result.h"
14 #include "chrome/renderer/spellchecker/spellcheck_language.h" 16 #include "chrome/renderer/spellchecker/spellcheck_language.h"
15 #include "chrome/renderer/spellchecker/spellcheck_provider.h" 17 #include "chrome/renderer/spellchecker/spellcheck_provider.h"
16 #include "content/public/renderer/render_thread.h" 18 #include "content/public/renderer/render_thread.h"
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
85 for (size_t i = 0; i < words.size(); ++i) 87 for (size_t i = 0; i < words.size(); ++i)
86 words_[i] = WebString::fromUTF8(words[i]); 88 words_[i] = WebString::fromUTF8(words[i]);
87 } 89 }
88 90
89 bool DocumentMarkersRemover::Visit(content::RenderView* render_view) { 91 bool DocumentMarkersRemover::Visit(content::RenderView* render_view) {
90 if (render_view && render_view->GetWebView()) 92 if (render_view && render_view->GetWebView())
91 render_view->GetWebView()->removeSpellingMarkersUnderWords(words_); 93 render_view->GetWebView()->removeSpellingMarkersUnderWords(words_);
92 return true; 94 return true;
93 } 95 }
94 96
97 // Makes sure that the apostrophes in |to| are the same type as in the range
98 // |from_begin| to |from_end|, in the same order.
99 void PreserveOriginalApostropheTypes(
100 const base::string16::const_iterator& from_begin,
101 const base::string16::const_iterator& from_end,
102 base::string16* to) {
103 const base::string16 kApostrophes(base::WideToUTF16(L"\x2019'"));
groby-ooo-7-16 2015/04/25 00:19:02 Please declare as constant
please use gerrit instead 2015/06/17 03:52:07 No longer applicable after using literals in IsApo
104 base::string16::const_iterator from_it = std::find_first_of(
105 from_begin, from_end, kApostrophes.begin(), kApostrophes.end());
106 for (base::string16::iterator to_it = std::find_first_of(
groby-ooo-7-16 2015/04/25 00:19:02 You'll need to handle the case of differing apostr
please use gerrit instead 2015/06/17 03:52:07 I think that's an edge case that requires some mor
107 to->begin(), to->end(), kApostrophes.begin(), kApostrophes.end());
108 from_it != from_end && to_it != to->end();
groby-ooo-7-16 2015/04/25 00:19:02 Also, this is the for-loop from hell. For readabi
please use gerrit instead 2015/06/17 03:52:07 Done.
109 from_it = std::find_first_of(
110 from_it + 1, from_end, kApostrophes.begin(), kApostrophes.end()),
111 to_it = std::find_first_of(
112 to_it + 1, to->end(), kApostrophes.begin(), kApostrophes.end())) {
113 *to_it = *from_it;
114 }
115 }
116
95 } // namespace 117 } // namespace
96 118
97 class SpellCheck::SpellcheckRequest { 119 class SpellCheck::SpellcheckRequest {
98 public: 120 public:
99 SpellcheckRequest(const base::string16& text, 121 SpellcheckRequest(const base::string16& text,
100 blink::WebTextCheckingCompletion* completion) 122 blink::WebTextCheckingCompletion* completion)
101 : text_(text), completion_(completion) { 123 : text_(text), completion_(completion) {
102 DCHECK(completion); 124 DCHECK(completion);
103 } 125 }
104 ~SpellcheckRequest() {} 126 ~SpellcheckRequest() {}
(...skipping 271 matching lines...) Expand 10 before | Expand all | Expand 10 after
376 398
377 void SpellCheck::CreateTextCheckingResults( 399 void SpellCheck::CreateTextCheckingResults(
378 ResultFilter filter, 400 ResultFilter filter,
379 int line_offset, 401 int line_offset,
380 const base::string16& line_text, 402 const base::string16& line_text,
381 const std::vector<SpellCheckResult>& spellcheck_results, 403 const std::vector<SpellCheckResult>& spellcheck_results,
382 WebVector<WebTextCheckingResult>* textcheck_results) { 404 WebVector<WebTextCheckingResult>* textcheck_results) {
383 // Double-check misspelled words with our spellchecker and attach grammar 405 // Double-check misspelled words with our spellchecker and attach grammar
384 // markers to them if our spellchecker tells they are correct words, i.e. they 406 // markers to them if our spellchecker tells they are correct words, i.e. they
385 // are probably contextually-misspelled words. 407 // are probably contextually-misspelled words.
386 const base::char16* text = line_text.c_str(); 408 std::vector<WebTextCheckingResult> result;
387 std::vector<WebTextCheckingResult> list;
388 for (size_t i = 0; i < spellcheck_results.size(); ++i) { 409 for (size_t i = 0; i < spellcheck_results.size(); ++i) {
groby-ooo-7-16 2015/04/25 00:19:02 While you're here: for (const SpellCheckResult& sp
please use gerrit instead 2015/06/17 03:52:07 Done.
410 if (custom_dictionary_.SpellCheckWord(line_text,
groby-ooo-7-16 2015/04/25 00:19:02 Makes sense to move this up - thanks! (If this CL
please use gerrit instead 2015/06/17 03:52:07 Ack
411 spellcheck_results[i].location,
412 spellcheck_results[i].length)) {
413 continue;
414 }
415
416 base::string16 replacement = spellcheck_results[i].replacement;
417 PreserveOriginalApostropheTypes(
418 line_text.begin() + spellcheck_results[i].location,
groby-ooo-7-16 2015/04/25 00:19:02 Given that we refer to the substring several times
please use gerrit instead 2015/06/17 03:52:07 Done.
419 line_text.begin() + spellcheck_results[i].location +
420 spellcheck_results[i].length,
421 &replacement);
422 if (line_text.compare(spellcheck_results[i].location,
423 spellcheck_results[i].length, replacement) == 0) {
424 continue;
425 }
426
389 SpellCheckResult::Decoration decoration = spellcheck_results[i].decoration; 427 SpellCheckResult::Decoration decoration = spellcheck_results[i].decoration;
390 int word_location = spellcheck_results[i].location;
391 int word_length = spellcheck_results[i].length;
392 int misspelling_start = 0; 428 int misspelling_start = 0;
393 int misspelling_length = 0; 429 int misspelling_length = 0;
394 if (decoration == SpellCheckResult::SPELLING && 430 if (decoration == SpellCheckResult::SPELLING &&
395 filter == USE_NATIVE_CHECKER) { 431 filter == USE_NATIVE_CHECKER &&
396 if (SpellCheckWord(text + word_location, word_length, 0, 432 SpellCheckWord(line_text.c_str() + spellcheck_results[i].location,
397 &misspelling_start, &misspelling_length, NULL)) { 433 spellcheck_results[i].length, 0, &misspelling_start,
398 decoration = SpellCheckResult::GRAMMAR; 434 &misspelling_length, NULL)) {
399 } 435 decoration = SpellCheckResult::GRAMMAR;
400 } 436 }
401 if (!custom_dictionary_.SpellCheckWord( 437
402 line_text, word_location, word_length)) { 438 result.push_back(WebTextCheckingResult(
403 list.push_back(WebTextCheckingResult( 439 static_cast<WebTextDecorationType>(decoration),
404 static_cast<WebTextDecorationType>(decoration), 440 line_offset + spellcheck_results[i].location,
405 word_location + line_offset, 441 spellcheck_results[i].length, replacement, spellcheck_results[i].hash));
406 word_length,
407 spellcheck_results[i].replacement,
408 spellcheck_results[i].hash));
409 }
410 } 442 }
411 textcheck_results->assign(list); 443
444 textcheck_results->assign(result);
412 } 445 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698