OLD | NEW |
1 // Copyright (c) 2006-2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2009 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/browser/spellchecker.h" | 5 #include "chrome/browser/spellchecker.h" |
6 | 6 |
7 #include "app/l10n_util.h" | 7 #include "app/l10n_util.h" |
8 #include "base/basictypes.h" | 8 #include "base/basictypes.h" |
9 #include "base/compiler_specific.h" | 9 #include "base/compiler_specific.h" |
10 #include "base/file_util.h" | 10 #include "base/file_util.h" |
11 #include "base/histogram.h" | 11 #include "base/histogram.h" |
12 #include "base/logging.h" | 12 #include "base/logging.h" |
13 #include "base/path_service.h" | 13 #include "base/path_service.h" |
14 #include "base/stats_counters.h" | 14 #include "base/stats_counters.h" |
15 #include "base/string_util.h" | 15 #include "base/string_util.h" |
16 #include "chrome/browser/chrome_thread.h" | |
17 #include "chrome/browser/net/url_fetcher.h" | 16 #include "chrome/browser/net/url_fetcher.h" |
18 #include "chrome/browser/profile.h" | 17 #include "chrome/browser/profile.h" |
19 #include "chrome/browser/spellchecker_common.h" | 18 #include "chrome/browser/spellchecker_common.h" |
20 #include "chrome/browser/spellchecker_platform_engine.h" | 19 #include "chrome/browser/spellchecker_platform_engine.h" |
21 #include "chrome/common/chrome_constants.h" | 20 #include "chrome/common/chrome_constants.h" |
22 #include "chrome/common/chrome_counters.h" | 21 #include "chrome/common/chrome_counters.h" |
23 #include "chrome/common/chrome_paths.h" | 22 #include "chrome/common/chrome_paths.h" |
24 #include "chrome/common/pref_names.h" | 23 #include "chrome/common/pref_names.h" |
25 #include "chrome/common/pref_service.h" | 24 #include "chrome/common/pref_service.h" |
26 #include "grit/generated_resources.h" | 25 #include "grit/generated_resources.h" |
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
214 } | 213 } |
215 | 214 |
216 Finish(true); | 215 Finish(true); |
217 } | 216 } |
218 | 217 |
219 private: | 218 private: |
220 void Finish(bool file_existed) { | 219 void Finish(bool file_existed) { |
221 ChromeThread::PostTask( | 220 ChromeThread::PostTask( |
222 ChromeThread::IO, FROM_HERE, | 221 ChromeThread::IO, FROM_HERE, |
223 NewRunnableMethod( | 222 NewRunnableMethod( |
224 spellchecker_, &SpellChecker::HunspellInited, hunspell_, | 223 spellchecker_.get(), &SpellChecker::HunspellInited, hunspell_, |
225 bdict_file_, file_existed)); | 224 bdict_file_, file_existed)); |
226 } | 225 } |
227 | 226 |
228 // The SpellChecker we are working for. We are guaranteed to be outlived | 227 // The SpellChecker we are working for. |
229 // by this object because it AddRefs() itself before calling us. | 228 scoped_refptr<SpellChecker> spellchecker_; |
230 // Accessing it is not necessarily thread safe, but are careful to only access | |
231 // it in ways that are. | |
232 SpellChecker* spellchecker_; | |
233 Hunspell* hunspell_; | 229 Hunspell* hunspell_; |
234 file_util::MemoryMappedFile* bdict_file_; | 230 file_util::MemoryMappedFile* bdict_file_; |
235 | 231 |
236 FilePath custom_dictionary_file_name_; | 232 FilePath custom_dictionary_file_name_; |
237 FilePath dict_file_name_app_; | 233 FilePath dict_file_name_app_; |
238 FilePath dict_file_name_usr_; | 234 FilePath dict_file_name_usr_; |
239 | 235 |
240 DISALLOW_COPY_AND_ASSIGN(ReadDictionaryTask); | 236 DISALLOW_COPY_AND_ASSIGN(ReadDictionaryTask); |
241 }; | 237 }; |
242 | 238 |
(...skipping 287 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
530 // File name for downloading in DIR_APP_DICTIONARIES. | 526 // File name for downloading in DIR_APP_DICTIONARIES. |
531 FilePath dictionary_file_name_app = GetVersionedFileName(language_, | 527 FilePath dictionary_file_name_app = GetVersionedFileName(language_, |
532 given_dictionary_directory_); | 528 given_dictionary_directory_); |
533 | 529 |
534 // Filename for downloading in the fallback dictionary download directory, | 530 // Filename for downloading in the fallback dictionary download directory, |
535 // DIR_USER_DATA. | 531 // DIR_USER_DATA. |
536 FilePath dict_dir_userdata = GetFallbackDictionaryDownloadDirectory(); | 532 FilePath dict_dir_userdata = GetFallbackDictionaryDownloadDirectory(); |
537 FilePath dictionary_file_name_usr = GetVersionedFileName(language_, | 533 FilePath dictionary_file_name_usr = GetVersionedFileName(language_, |
538 dict_dir_userdata); | 534 dict_dir_userdata); |
539 | 535 |
540 // Balances Release() in HunspellInited(). | |
541 AddRef(); | |
542 ChromeThread::PostTask( | 536 ChromeThread::PostTask( |
543 ChromeThread::FILE, FROM_HERE, | 537 ChromeThread::FILE, FROM_HERE, |
544 new ReadDictionaryTask( | 538 new ReadDictionaryTask( |
545 this, dictionary_file_name_app, dictionary_file_name_usr)); | 539 this, dictionary_file_name_app, dictionary_file_name_usr)); |
546 | 540 |
547 return hunspell_.get() != NULL; | 541 return hunspell_.get() != NULL; |
548 } | 542 } |
549 | 543 |
550 void SpellChecker::HunspellInited(Hunspell* hunspell, | 544 void SpellChecker::HunspellInited(Hunspell* hunspell, |
551 file_util::MemoryMappedFile* bdict_file, | 545 file_util::MemoryMappedFile* bdict_file, |
552 bool file_existed) { | 546 bool file_existed) { |
553 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::IO)); | 547 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::IO)); |
554 | 548 |
555 if (file_existed) | 549 if (file_existed) |
556 tried_to_init_ = true; | 550 tried_to_init_ = true; |
557 | 551 |
558 if (!hunspell) { | 552 if (!hunspell) { |
559 if (!file_existed) { | 553 if (!file_existed) { |
560 // File didn't exist. We need to download a dictionary. | 554 // File didn't exist. We need to download a dictionary. |
561 DoDictionaryDownload(); | 555 DoDictionaryDownload(); |
562 } | 556 } |
563 | |
564 // Balances AddRef() in Initialize(). | |
565 Release(); | |
566 return; | 557 return; |
567 } | 558 } |
568 | 559 |
569 | 560 |
570 bdict_file_.reset(bdict_file); | 561 bdict_file_.reset(bdict_file); |
571 hunspell_.reset(hunspell); | 562 hunspell_.reset(hunspell); |
572 // Add all the custom words we've gotten while Hunspell was loading. | 563 // Add all the custom words we've gotten while Hunspell was loading. |
573 while (!custom_words_.empty()) { | 564 while (!custom_words_.empty()) { |
574 hunspell_->add(custom_words_.front().c_str()); | 565 hunspell_->add(custom_words_.front().c_str()); |
575 custom_words_.pop(); | 566 custom_words_.pop(); |
576 } | 567 } |
577 | |
578 // Balances AddRef() in Initialize(). | |
579 Release(); | |
580 } | 568 } |
581 | 569 |
582 void SpellChecker::DoDictionaryDownload() { | 570 void SpellChecker::DoDictionaryDownload() { |
583 // Download the dictionary file. | 571 // Download the dictionary file. |
584 if (request_context_getter_) { | 572 if (request_context_getter_) { |
585 if (!tried_to_download_dictionary_file_) { | 573 if (!tried_to_download_dictionary_file_) { |
586 FilePath dictionary_file_name_app = GetVersionedFileName(language_, | 574 FilePath dictionary_file_name_app = GetVersionedFileName(language_, |
587 given_dictionary_directory_); | 575 given_dictionary_directory_); |
588 StartDictionaryDownload(dictionary_file_name_app); | 576 StartDictionaryDownload(dictionary_file_name_app); |
589 tried_to_download_dictionary_file_ = true; | 577 tried_to_download_dictionary_file_ = true; |
(...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
816 | 804 |
817 // Populate the vector of WideStrings. | 805 // Populate the vector of WideStrings. |
818 for (int i = 0; i < number_of_suggestions; i++) { | 806 for (int i = 0; i < number_of_suggestions; i++) { |
819 if (i < kMaxSuggestions) | 807 if (i < kMaxSuggestions) |
820 optional_suggestions->push_back(UTF8ToUTF16(suggestions[i])); | 808 optional_suggestions->push_back(UTF8ToUTF16(suggestions[i])); |
821 free(suggestions[i]); | 809 free(suggestions[i]); |
822 } | 810 } |
823 if (suggestions != NULL) | 811 if (suggestions != NULL) |
824 free(suggestions); | 812 free(suggestions); |
825 } | 813 } |
OLD | NEW |