Index: chrome/browser/spellchecker/spellcheck_service_browsertest.cc |
diff --git a/chrome/browser/spellchecker/spellcheck_service_browsertest.cc b/chrome/browser/spellchecker/spellcheck_service_browsertest.cc |
index 533eeabd25cdf8697640009c934d4c0396597b34..2558e59401c960d93b1e0800588dd2661bbc1ddb 100644 |
--- a/chrome/browser/spellchecker/spellcheck_service_browsertest.cc |
+++ b/chrome/browser/spellchecker/spellcheck_service_browsertest.cc |
@@ -4,54 +4,40 @@ |
#include "chrome/browser/spellchecker/spellcheck_service.h" |
-#include <stddef.h> |
-#include <stdint.h> |
#include <string> |
-#include <tuple> |
#include <vector> |
-#include "base/command_line.h" |
#include "base/macros.h" |
#include "base/path_service.h" |
#include "base/run_loop.h" |
#include "base/strings/string_piece.h" |
#include "base/strings/string_split.h" |
#include "base/strings/string_util.h" |
+#include "base/strings/utf_string_conversions.h" |
#include "base/synchronization/waitable_event.h" |
+#include "base/test/histogram_tester.h" |
#include "base/threading/thread_restrictions.h" |
#include "base/values.h" |
#include "chrome/browser/profiles/profile.h" |
#include "chrome/browser/spellchecker/spellcheck_factory.h" |
+#include "chrome/browser/spellchecker/spellcheck_host_impl.h" |
+#include "chrome/browser/spellchecker/spellcheck_service.h" |
#include "chrome/browser/ui/browser.h" |
#include "chrome/common/chrome_paths.h" |
-#include "chrome/common/chrome_switches.h" |
#include "chrome/common/pref_names.h" |
#include "chrome/test/base/in_process_browser_test.h" |
#include "components/prefs/pref_service.h" |
#include "components/spellcheck/browser/pref_names.h" |
#include "components/spellcheck/common/spellcheck.mojom.h" |
#include "components/spellcheck/common/spellcheck_common.h" |
+#include "components/spellcheck/common/spellcheck_result.h" |
#include "components/user_prefs/user_prefs.h" |
#include "content/public/test/mock_render_process_host.h" |
#include "content/public/test/test_utils.h" |
-#include "url/gurl.h" |
+#include "services/service_manager/public/cpp/bind_source_info.h" |
using content::BrowserContext; |
- |
-namespace { |
- |
-// A corrupted BDICT data used in DeleteCorruptedBDICT. Please do not use this |
-// BDICT data for other tests. |
-const uint8_t kCorruptedBDICT[] = { |
- 0x42, 0x44, 0x69, 0x63, 0x02, 0x00, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00, |
- 0x3b, 0x00, 0x00, 0x00, 0x65, 0x72, 0xe0, 0xac, 0x27, 0xc7, 0xda, 0x66, |
- 0x6d, 0x1e, 0xa6, 0x35, 0xd1, 0xf6, 0xb7, 0x35, 0x32, 0x00, 0x00, 0x00, |
- 0x38, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x00, |
- 0x0a, 0x0a, 0x41, 0x46, 0x20, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe6, |
- 0x49, 0x00, 0x68, 0x02, 0x73, 0x06, 0x74, 0x0b, 0x77, 0x11, 0x79, 0x15, |
-}; |
- |
-} // namespace |
+using content::RenderProcessHost; |
class SpellcheckServiceBrowserTest : public InProcessBrowserTest, |
public spellcheck::mojom::SpellChecker { |
@@ -69,13 +55,13 @@ class SpellcheckServiceBrowserTest : public InProcessBrowserTest, |
renderer_.reset(); |
} |
- BrowserContext* GetContext() { |
+ RenderProcessHost* GetRenderer() const { return renderer_.get(); } |
+ |
+ BrowserContext* GetContext() const { |
return static_cast<BrowserContext*>(browser()->profile()); |
} |
- PrefService* GetPrefs() { |
- return prefs_; |
- } |
+ PrefService* GetPrefs() const { return prefs_; } |
void InitSpellcheck(bool enable_spellcheck, |
const std::string& single_dictionary, |
@@ -208,6 +194,11 @@ class SpellcheckServiceBrowserTest : public InProcessBrowserTest, |
EXPECT_EQ(2u, words_added.size()); |
} |
+ protected: |
+ // Quits the RunLoop on SpellChecker request flow completion. |
+ base::OnceClosure quit_; |
+ |
+ private: |
// Mocked RenderProcessHost. |
std::unique_ptr<content::MockRenderProcessHost> renderer_; |
@@ -217,9 +208,6 @@ class SpellcheckServiceBrowserTest : public InProcessBrowserTest, |
// Binding to receive the SpellChecker request flow. |
mojo::Binding<spellcheck::mojom::SpellChecker> binding_; |
- // Quits the RunLoop on SpellChecker request flow completion. |
- base::OnceClosure quit_; |
- |
// Used to verify the SpellChecker request flow. |
bool bound_connection_closed_; |
bool custom_dictionary_changed_called_; |
@@ -229,6 +217,64 @@ class SpellcheckServiceBrowserTest : public InProcessBrowserTest, |
DISALLOW_COPY_AND_ASSIGN(SpellcheckServiceBrowserTest); |
}; |
+class SpellcheckServiceHostBrowserTest : public SpellcheckServiceBrowserTest { |
+ public: |
+ SpellcheckServiceHostBrowserTest() = default; |
+ |
+ void RequestDictionary() { |
+ spellcheck::mojom::SpellCheckHostPtr interface; |
+ RequestSpellCheckHost(&interface); |
+ |
+ interface->RequestDictionary(); |
+ } |
+ |
+ void NotifyChecked() { |
+ spellcheck::mojom::SpellCheckHostPtr interface; |
+ RequestSpellCheckHost(&interface); |
+ |
+ bool misspelt = true; |
+ base::UTF8ToUTF16("hallo", 5, &word_); |
+ interface->NotifyChecked(word_, misspelt); |
+ base::RunLoop().RunUntilIdle(); |
+ } |
+ |
+ void CallSpellingService() { |
+ spellcheck::mojom::SpellCheckHostPtr interface; |
+ RequestSpellCheckHost(&interface); |
+ |
+ base::UTF8ToUTF16("hello", 5, &word_); |
+ interface->CallSpellingService( |
+ word_, |
+ base::Bind(&SpellcheckServiceHostBrowserTest::SpellingServiceDone, |
+ base::Unretained(this))); |
+ |
+ base::RunLoop run_loop; |
+ quit_ = run_loop.QuitClosure(); |
+ run_loop.Run(); |
+ |
+ EXPECT_TRUE(spelling_service_done_called_); |
+ } |
+ |
+ private: |
+ void RequestSpellCheckHost(spellcheck::mojom::SpellCheckHostPtr* interface) { |
+ SpellCheckHostImpl::Create(GetRenderer()->GetID(), |
+ service_manager::BindSourceInfo(), |
+ mojo::MakeRequest(interface)); |
+ } |
+ |
+ void SpellingServiceDone(bool success, |
+ const std::vector<::SpellCheckResult>& results) { |
+ spelling_service_done_called_ = true; |
+ if (quit_) |
+ std::move(quit_).Run(); |
+ } |
+ |
+ bool spelling_service_done_called_ = false; |
+ base::string16 word_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(SpellcheckServiceHostBrowserTest); |
+}; |
+ |
// Removing a spellcheck language from accept languages should remove it from |
// spellcheck languages list as well. |
IN_PROC_BROWSER_TEST_F(SpellcheckServiceBrowserTest, |
@@ -334,9 +380,49 @@ IN_PROC_BROWSER_TEST_F(SpellcheckServiceBrowserTest, CustomDictionaryChanged) { |
EXPECT_TRUE(GetCustomDictionaryChangedState()); |
} |
+// Starting with only a single-language spellcheck setting, the host should |
+// initialize the renderer's spellcheck system, and the same if the renderer |
+// explicity requests the spellcheck dictionaries. |
+IN_PROC_BROWSER_TEST_F(SpellcheckServiceHostBrowserTest, RequestDictionary) { |
+ InitSpellcheck(true, "en-US", ""); |
+ EXPECT_TRUE(GetEnableSpellcheckState()); |
+ |
+ RequestDictionary(); |
+ EXPECT_TRUE(GetEnableSpellcheckState()); |
+} |
+ |
+// When the renderer notifies that it corrected a word, the render process |
+// host should record UMA stats about the correction. |
+IN_PROC_BROWSER_TEST_F(SpellcheckServiceHostBrowserTest, NotifyChecked) { |
+ const char kMisspellRatio[] = "SpellCheck.MisspellRatio"; |
+ |
+ base::HistogramTester tester; |
+ tester.ExpectTotalCount(kMisspellRatio, 0); |
+ NotifyChecked(); |
+ tester.ExpectTotalCount(kMisspellRatio, 1); |
+} |
+ |
+#if !BUILDFLAG(USE_BROWSER_SPELLCHECKER) |
+// When the renderer requests the spelling service for correcting text, the |
+// render process host should call the remote spelling service. |
+IN_PROC_BROWSER_TEST_F(SpellcheckServiceHostBrowserTest, CallSpellingService) { |
+ CallSpellingService(); |
+} |
+#endif // !BUILDFLAG(USE_BROWSER_SPELLCHECKER) |
+ |
// Tests that we can delete a corrupted BDICT file used by hunspell. We do not |
// run this test on Mac because Mac does not use hunspell by default. |
IN_PROC_BROWSER_TEST_F(SpellcheckServiceBrowserTest, DeleteCorruptedBDICT) { |
+ // Corrupted BDICT data: please do not use this BDICT data for other tests. |
+ const uint8_t kCorruptedBDICT[] = { |
+ 0x42, 0x44, 0x69, 0x63, 0x02, 0x00, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00, |
+ 0x3b, 0x00, 0x00, 0x00, 0x65, 0x72, 0xe0, 0xac, 0x27, 0xc7, 0xda, 0x66, |
+ 0x6d, 0x1e, 0xa6, 0x35, 0xd1, 0xf6, 0xb7, 0x35, 0x32, 0x00, 0x00, 0x00, |
+ 0x38, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x00, |
+ 0x0a, 0x0a, 0x41, 0x46, 0x20, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe6, |
+ 0x49, 0x00, 0x68, 0x02, 0x73, 0x06, 0x74, 0x0b, 0x77, 0x11, 0x79, 0x15, |
+ }; |
+ |
// Write the corrupted BDICT data to create a corrupted BDICT file. |
base::FilePath dict_dir; |
ASSERT_TRUE(PathService::Get(chrome::DIR_APP_DICTIONARIES, &dict_dir)); |