Chromium Code Reviews| OLD | NEW |
|---|---|
| 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/browser/spellchecker/spellcheck_service.h" | |
| 6 | |
| 7 #include <string> | |
| 8 #include <vector> | |
| 9 | |
| 10 #include "base/command_line.h" | |
| 5 #include "base/path_service.h" | 11 #include "base/path_service.h" |
| 12 #include "base/prefs/pref_member.h" | |
|
please use gerrit instead
2015/06/17 17:47:16
Why this include?
Julius
2015/06/17 20:14:45
Deleted.
| |
| 13 #include "base/prefs/pref_service.h" | |
| 6 #include "base/synchronization/waitable_event.h" | 14 #include "base/synchronization/waitable_event.h" |
| 7 #include "chrome/browser/profiles/profile.h" | 15 #include "chrome/browser/profiles/profile.h" |
| 8 #include "chrome/browser/spellchecker/spellcheck_factory.h" | 16 #include "chrome/browser/spellchecker/spellcheck_factory.h" |
| 9 #include "chrome/browser/spellchecker/spellcheck_service.h" | |
| 10 #include "chrome/browser/ui/browser.h" | 17 #include "chrome/browser/ui/browser.h" |
| 11 #include "chrome/common/chrome_paths.h" | 18 #include "chrome/common/chrome_paths.h" |
| 19 #include "chrome/common/chrome_switches.h" | |
| 20 #include "chrome/common/pref_names.h" | |
| 12 #include "chrome/common/spellcheck_common.h" | 21 #include "chrome/common/spellcheck_common.h" |
| 13 #include "chrome/test/base/in_process_browser_test.h" | 22 #include "chrome/test/base/in_process_browser_test.h" |
| 23 #include "components/user_prefs/user_prefs.h" | |
| 14 #include "content/public/test/test_utils.h" | 24 #include "content/public/test/test_utils.h" |
| 15 #include "url/gurl.h" | 25 #include "url/gurl.h" |
| 16 | 26 |
| 17 using content::BrowserContext; | 27 using content::BrowserContext; |
| 18 | 28 |
| 19 namespace { | 29 namespace { |
| 20 | 30 |
| 21 // A corrupted BDICT data used in DeleteCorruptedBDICT. Please do not use this | 31 // A corrupted BDICT data used in DeleteCorruptedBDICT. Please do not use this |
| 22 // BDICT data for other tests. | 32 // BDICT data for other tests. |
| 23 const uint8 kCorruptedBDICT[] = { | 33 const uint8 kCorruptedBDICT[] = { |
|
Julius
2015/06/17 00:59:53
clang-format reformatted this.
please use gerrit instead
2015/06/17 17:47:15
Acknowledged.
| |
| 24 0x42, 0x44, 0x69, 0x63, 0x02, 0x00, 0x01, 0x00, | 34 0x42, 0x44, 0x69, 0x63, 0x02, 0x00, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00, |
| 25 0x20, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x00, 0x00, | 35 0x3b, 0x00, 0x00, 0x00, 0x65, 0x72, 0xe0, 0xac, 0x27, 0xc7, 0xda, 0x66, |
| 26 0x65, 0x72, 0xe0, 0xac, 0x27, 0xc7, 0xda, 0x66, | 36 0x6d, 0x1e, 0xa6, 0x35, 0xd1, 0xf6, 0xb7, 0x35, 0x32, 0x00, 0x00, 0x00, |
| 27 0x6d, 0x1e, 0xa6, 0x35, 0xd1, 0xf6, 0xb7, 0x35, | 37 0x38, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x00, |
| 28 0x32, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, | 38 0x0a, 0x0a, 0x41, 0x46, 0x20, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe6, |
| 29 0x39, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x00, | 39 0x49, 0x00, 0x68, 0x02, 0x73, 0x06, 0x74, 0x0b, 0x77, 0x11, 0x79, 0x15, |
| 30 0x0a, 0x0a, 0x41, 0x46, 0x20, 0x30, 0x00, 0x00, | |
| 31 0x00, 0x00, 0x00, 0xe6, 0x49, 0x00, 0x68, 0x02, | |
| 32 0x73, 0x06, 0x74, 0x0b, 0x77, 0x11, 0x79, 0x15, | |
| 33 }; | 40 }; |
| 34 | 41 |
| 35 } // namespace | 42 } // namespace |
| 36 | 43 |
| 37 class SpellcheckServiceBrowserTest : public InProcessBrowserTest { | 44 struct SpellcheckLanguageTestCase { |
| 45 SpellcheckLanguageTestCase( | |
| 46 const std::string& spellcheck_dictionary, | |
| 47 const std::string& accept_languages, | |
| 48 const unsigned long& expected_enabled_spellcheck_languages, | |
|
please use gerrit instead
2015/06/17 17:47:15
size_t, no const, no &.
"const var_type& var_name
Julius
2015/06/17 20:14:46
Done.
| |
| 49 const std::vector<std::string> expected_spellcheck_languages) | |
| 50 : spellcheck_dictionary(spellcheck_dictionary), | |
| 51 accept_languages(accept_languages), | |
| 52 expected_enabled_spellcheck_languages( | |
| 53 expected_enabled_spellcheck_languages), | |
| 54 expected_spellcheck_languages(expected_spellcheck_languages) {} | |
| 55 ~SpellcheckLanguageTestCase() {} | |
| 56 | |
| 57 const std::string spellcheck_dictionary; | |
| 58 const std::string accept_languages; | |
| 59 const unsigned long expected_enabled_spellcheck_languages; | |
|
please use gerrit instead
2015/06/17 17:47:15
size_t
Julius
2015/06/17 20:14:45
Done.
| |
| 60 const std::vector<std::string> expected_spellcheck_languages; | |
| 61 }; | |
| 62 | |
| 63 class SpellcheckServiceBrowserTest | |
| 64 : public InProcessBrowserTest, | |
| 65 public testing::WithParamInterface<SpellcheckLanguageTestCase> { | |
| 38 public: | 66 public: |
| 39 Profile* GetProfile() { | 67 Profile* GetProfile() { return browser()->profile(); } |
|
please use gerrit instead
2015/06/17 17:47:16
class SpellcheckServiceBrowserTest
: public In
Julius
2015/06/17 20:14:46
Done.
| |
| 40 return browser()->profile(); | |
| 41 } | |
| 42 }; | 68 }; |
| 43 | 69 |
| 70 INSTANTIATE_TEST_CASE_P( | |
| 71 SpellcheckLanguageTestCases, | |
| 72 SpellcheckServiceBrowserTest, | |
| 73 testing::Values( | |
| 74 SpellcheckLanguageTestCase("en-US", | |
| 75 "en,en-US", | |
| 76 1UL, | |
| 77 std::vector<std::string>{"en-US"}), | |
| 78 SpellcheckLanguageTestCase("en-US", | |
| 79 "en-US,en", | |
| 80 1UL, | |
| 81 std::vector<std::string>{"en-US"}), | |
| 82 SpellcheckLanguageTestCase("en-US", | |
| 83 "en,fr,en-US,en-AU", | |
| 84 1UL, | |
| 85 std::vector<std::string>{"en-US", "fr", | |
|
please use gerrit instead
2015/06/17 17:47:15
This is "(Uniform) Initialization Syntax", which i
Julius
2015/06/17 20:14:46
Done.
| |
| 86 "en-AU"}), | |
| 87 SpellcheckLanguageTestCase("fr", | |
| 88 "en,en-JP,fr,zz,en-US", | |
| 89 1UL, | |
| 90 std::vector<std::string>{"fr", "en-US"}))); | |
| 91 | |
| 92 IN_PROC_BROWSER_TEST_P(SpellcheckServiceBrowserTest, GetSpellcheckLanguages) { | |
| 93 BrowserContext* context = static_cast<BrowserContext*>(GetProfile()); | |
| 94 PrefService* prefs = user_prefs::UserPrefs::Get(context); | |
| 95 prefs->SetString(prefs::kSpellCheckDictionary, | |
| 96 GetParam().spellcheck_dictionary); | |
| 97 prefs->SetString(prefs::kAcceptLanguages, GetParam().accept_languages); | |
| 98 | |
| 99 std::vector<std::string> spellcheck_languages; | |
| 100 size_t enabled_spellcheck_languages = | |
| 101 SpellcheckService::GetSpellCheckLanguages(context, &spellcheck_languages); | |
| 102 | |
| 103 EXPECT_EQ(GetParam().expected_enabled_spellcheck_languages, | |
| 104 enabled_spellcheck_languages); | |
| 105 EXPECT_EQ(GetParam().expected_spellcheck_languages, spellcheck_languages); | |
| 106 } | |
| 107 | |
| 44 // Tests that we can delete a corrupted BDICT file used by hunspell. We do not | 108 // Tests that we can delete a corrupted BDICT file used by hunspell. We do not |
| 45 // run this test on Mac because Mac does not use hunspell by default. | 109 // run this test on Mac because Mac does not use hunspell by default. |
| 46 IN_PROC_BROWSER_TEST_F(SpellcheckServiceBrowserTest, DeleteCorruptedBDICT) { | 110 IN_PROC_BROWSER_TEST_F(SpellcheckServiceBrowserTest, DeleteCorruptedBDICT) { |
| 47 // Write the corrupted BDICT data to create a corrupted BDICT file. | 111 // Write the corrupted BDICT data to create a corrupted BDICT file. |
| 48 base::FilePath dict_dir; | 112 base::FilePath dict_dir; |
| 49 ASSERT_TRUE(PathService::Get(chrome::DIR_APP_DICTIONARIES, &dict_dir)); | 113 ASSERT_TRUE(PathService::Get(chrome::DIR_APP_DICTIONARIES, &dict_dir)); |
| 50 base::FilePath bdict_path = | 114 base::FilePath bdict_path = |
| 51 chrome::spellcheck_common::GetVersionedFileName("en-US", dict_dir); | 115 chrome::spellcheck_common::GetVersionedFileName("en-US", dict_dir); |
| 52 | 116 |
| 53 size_t actual = base::WriteFile(bdict_path, | 117 size_t actual = base::WriteFile( |
| 54 reinterpret_cast<const char*>(kCorruptedBDICT), | 118 bdict_path, reinterpret_cast<const char*>(kCorruptedBDICT), |
|
Julius
2015/06/17 00:59:53
clang-format reformatted this and the lines below.
please use gerrit instead
2015/06/17 17:47:15
Acknowledged.
| |
| 55 arraysize(kCorruptedBDICT)); | 119 arraysize(kCorruptedBDICT)); |
| 56 EXPECT_EQ(arraysize(kCorruptedBDICT), actual); | 120 EXPECT_EQ(arraysize(kCorruptedBDICT), actual); |
| 57 | 121 |
| 58 // Attach an event to the SpellcheckService object so we can receive its | 122 // Attach an event to the SpellcheckService object so we can receive its |
| 59 // status updates. | 123 // status updates. |
| 60 base::WaitableEvent event(true, false); | 124 base::WaitableEvent event(true, false); |
| 61 SpellcheckService::AttachStatusEvent(&event); | 125 SpellcheckService::AttachStatusEvent(&event); |
| 62 | 126 |
| 63 BrowserContext * context = static_cast<BrowserContext*>(GetProfile()); | 127 BrowserContext* context = static_cast<BrowserContext*>(GetProfile()); |
| 64 | 128 |
| 65 // Ensure that the SpellcheckService object does not already exist. Otherwise | 129 // Ensure that the SpellcheckService object does not already exist. Otherwise |
| 66 // the next line will not force creation of the SpellcheckService and the | 130 // the next line will not force creation of the SpellcheckService and the |
| 67 // test will fail. | 131 // test will fail. |
| 68 SpellcheckService* service = static_cast<SpellcheckService*>( | 132 SpellcheckService* service = static_cast<SpellcheckService*>( |
| 69 SpellcheckServiceFactory::GetInstance()->GetServiceForBrowserContext( | 133 SpellcheckServiceFactory::GetInstance()->GetServiceForBrowserContext( |
| 70 context, | 134 context, false)); |
| 71 false)); | |
| 72 ASSERT_EQ(NULL, service); | 135 ASSERT_EQ(NULL, service); |
| 73 | 136 |
| 74 // Getting the spellcheck_service will initialize the SpellcheckService | 137 // Getting the spellcheck_service will initialize the SpellcheckService |
| 75 // object with the corrupted BDICT file created above since the hunspell | 138 // object with the corrupted BDICT file created above since the hunspell |
| 76 // dictionary is loaded in the SpellcheckService constructor right now. | 139 // dictionary is loaded in the SpellcheckService constructor right now. |
| 77 // The SpellCheckHost object will send a BDICT_CORRUPTED event. | 140 // The SpellCheckHost object will send a BDICT_CORRUPTED event. |
| 78 SpellcheckServiceFactory::GetForContext(context); | 141 SpellcheckServiceFactory::GetForContext(context); |
| 79 | 142 |
| 80 // Check the received event. Also we check if Chrome has successfully deleted | 143 // Check the received event. Also we check if Chrome has successfully deleted |
| 81 // the corrupted dictionary. We delete the corrupted dictionary to avoid | 144 // the corrupted dictionary. We delete the corrupted dictionary to avoid |
| 82 // leaking it when this test fails. | 145 // leaking it when this test fails. |
| 83 content::RunAllPendingInMessageLoop(content::BrowserThread::FILE); | 146 content::RunAllPendingInMessageLoop(content::BrowserThread::FILE); |
| 84 content::RunAllPendingInMessageLoop(content::BrowserThread::UI); | 147 content::RunAllPendingInMessageLoop(content::BrowserThread::UI); |
| 85 EXPECT_EQ(SpellcheckService::BDICT_CORRUPTED, | 148 EXPECT_EQ(SpellcheckService::BDICT_CORRUPTED, |
| 86 SpellcheckService::GetStatusEvent()); | 149 SpellcheckService::GetStatusEvent()); |
| 87 if (base::PathExists(bdict_path)) { | 150 if (base::PathExists(bdict_path)) { |
| 88 ADD_FAILURE(); | 151 ADD_FAILURE(); |
| 89 EXPECT_TRUE(base::DeleteFile(bdict_path, true)); | 152 EXPECT_TRUE(base::DeleteFile(bdict_path, true)); |
| 90 } | 153 } |
| 91 } | 154 } |
| 155 | |
| 156 class MultilingualSpellcheckServiceBrowserTest | |
| 157 : public InProcessBrowserTest, | |
| 158 public testing::WithParamInterface<SpellcheckLanguageTestCase> { | |
| 159 public: | |
| 160 Profile* GetProfile() { return browser()->profile(); } | |
| 161 void SetUpCommandLine(base::CommandLine* command_line) override { | |
|
please use gerrit instead
2015/06/17 17:47:15
Please also call "InProcBrowserTest::SetUpCommandL
Julius
2015/06/17 20:14:46
Done.
| |
| 162 command_line->AppendSwitch(switches::kEnableMultilingualSpellChecker); | |
| 163 } | |
| 164 }; | |
| 165 | |
| 166 INSTANTIATE_TEST_CASE_P( | |
| 167 MultilingualSpellcheckLanguageTestCases, | |
| 168 MultilingualSpellcheckServiceBrowserTest, | |
| 169 testing::Values( | |
| 170 SpellcheckLanguageTestCase("en-US", | |
| 171 "en,en-US", | |
| 172 1UL, | |
| 173 std::vector<std::string>{"en-US"}), | |
| 174 SpellcheckLanguageTestCase("en-US", | |
| 175 "en-US,en", | |
| 176 1UL, | |
| 177 std::vector<std::string>{"en-US"}), | |
| 178 SpellcheckLanguageTestCase("en-US,fr", | |
| 179 "en,fr,en-US,en-AU", | |
| 180 2UL, | |
| 181 std::vector<std::string>{"en-US", "fr", | |
| 182 "en-AU"}), | |
| 183 SpellcheckLanguageTestCase("fr", | |
| 184 "en,en-JP,fr,zz,en-US", | |
| 185 1UL, | |
| 186 std::vector<std::string>{"fr", "en-US"}))); | |
| 187 | |
| 188 IN_PROC_BROWSER_TEST_P(MultilingualSpellcheckServiceBrowserTest, | |
| 189 GetSpellcheckLanguages) { | |
| 190 BrowserContext* context = static_cast<BrowserContext*>(GetProfile()); | |
| 191 PrefService* prefs = user_prefs::UserPrefs::Get(context); | |
| 192 prefs->SetString(prefs::kSpellCheckDictionaries, | |
| 193 GetParam().spellcheck_dictionary); | |
| 194 prefs->SetString(prefs::kAcceptLanguages, GetParam().accept_languages); | |
| 195 | |
| 196 std::vector<std::string> spellcheck_languages; | |
| 197 size_t enabled_spellcheck_languages = | |
| 198 SpellcheckService::GetSpellCheckLanguages(context, | |
| 199 &spellcheck_languages); | |
| 200 | |
| 201 EXPECT_EQ(GetParam().expected_enabled_spellcheck_languages, | |
| 202 enabled_spellcheck_languages); | |
| 203 EXPECT_EQ(GetParam().expected_spellcheck_languages, spellcheck_languages); | |
| 204 } | |
| OLD | NEW |