Index: chrome/browser/chrome_site_per_process_browsertest.cc |
diff --git a/chrome/browser/chrome_site_per_process_browsertest.cc b/chrome/browser/chrome_site_per_process_browsertest.cc |
index e426d21c644152fa4ed9302e5ff29542197f9a13..7ff93310dd52398e78a28a3ccb7beafa2a8d0c7d 100644 |
--- a/chrome/browser/chrome_site_per_process_browsertest.cc |
+++ b/chrome/browser/chrome_site_per_process_browsertest.cc |
@@ -38,7 +38,9 @@ |
#include "url/gurl.h" |
#if BUILDFLAG(ENABLE_SPELLCHECK) |
+#include "components/spellcheck/common/spellcheck.mojom.h" |
#include "components/spellcheck/common/spellcheck_messages.h" |
+#include "services/service_manager/public/cpp/bind_source_info.h" |
#endif |
class ChromeSitePerProcessTest : public InProcessBrowserTest { |
@@ -518,57 +520,87 @@ IN_PROC_BROWSER_TEST_F(ChromeSitePerProcessTest, |
} |
#if BUILDFLAG(ENABLE_SPELLCHECK) |
-// Class to sniff incoming IPCs for spell check messages. |
-class TestSpellCheckMessageFilter : public content::BrowserMessageFilter { |
+// Class to sniff incoming spellcheck IPC / Mojo SpellCheckHost messages. |
+class TestSpellCheckMessageFilter : public content::BrowserMessageFilter, |
+ spellcheck::mojom::SpellCheckHost { |
public: |
explicit TestSpellCheckMessageFilter(content::RenderProcessHost* process_host) |
: content::BrowserMessageFilter(SpellCheckMsgStart), |
process_host_(process_host), |
text_received_(false), |
- message_loop_runner_(base::MakeShared<content::MessageLoopRunner>()) {} |
+ message_loop_runner_(base::MakeShared<content::MessageLoopRunner>()), |
+ binding_(this) {} |
+ |
+ content::RenderProcessHost* process() const { return process_host_; } |
+ |
+ const base::string16& text() const { return text_; } |
+ |
+ void Wait() { |
+ if (!text_received_) |
+ message_loop_runner_->Run(); |
+ } |
bool OnMessageReceived(const IPC::Message& message) override { |
+#if BUILDFLAG(USE_BROWSER_SPELLCHECKER) |
IPC_BEGIN_MESSAGE_MAP(TestSpellCheckMessageFilter, message) |
-#if !BUILDFLAG(USE_BROWSER_SPELLCHECKER) |
- IPC_MESSAGE_HANDLER(SpellCheckHostMsg_CallSpellingService, HandleMessage) |
-#else |
+ // TODO(crbug.com/714480): convert the RequestTextCheck IPC to mojo. |
IPC_MESSAGE_HANDLER(SpellCheckHostMsg_RequestTextCheck, HandleMessage) |
-#endif |
IPC_END_MESSAGE_MAP() |
+#endif |
return false; |
} |
- base::string16 last_text() const { return last_text_; } |
- |
- void Wait() { |
- if (!text_received_) |
- message_loop_runner_->Run(); |
+#if !BUILDFLAG(USE_BROWSER_SPELLCHECKER) |
+ void ShellCheckHostRequest(const service_manager::BindSourceInfo& source_info, |
+ spellcheck::mojom::SpellCheckHostRequest request) { |
+ EXPECT_FALSE(binding_.is_bound()); |
+ binding_.Bind(std::move(request)); |
} |
- |
- content::RenderProcessHost* process() const { return process_host_; } |
+#endif |
private: |
~TestSpellCheckMessageFilter() override {} |
+#if BUILDFLAG(USE_BROWSER_SPELLCHECKER) |
void HandleMessage(int, int, const base::string16& text) { |
content::BrowserThread::PostTask( |
content::BrowserThread::UI, FROM_HERE, |
- base::BindOnce(&TestSpellCheckMessageFilter::HandleMessageOnUI, this, |
- text)); |
+ base::BindOnce(&TestSpellCheckMessageFilter::HandleMessageOnUIThread, |
+ this, text)); |
} |
+#endif |
- void HandleMessageOnUI(const base::string16& text) { |
- last_text_ = text; |
+ void HandleMessageOnUIThread(const base::string16& text) { |
if (!text_received_) { |
text_received_ = true; |
+ text_ = text; |
message_loop_runner_->Quit(); |
+ } else { |
+ NOTREACHED(); |
} |
} |
+ // spellcheck::mojom::SpellCheckHost: |
+ void RequestDictionary() override {} |
+ |
+ void NotifyChecked(const base::string16& word, bool misspelled) override {} |
+ |
+ void CallSpellingService( |
+ const base::string16& text, |
+ const CallSpellingServiceCallback& callback) override { |
+#if !BUILDFLAG(USE_BROWSER_SPELLCHECKER) |
+ DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
+ callback.Run(true, std::vector<SpellCheckResult>()); |
+ binding_.Close(); |
+ HandleMessageOnUIThread(text); |
+#endif |
+ } |
+ |
content::RenderProcessHost* process_host_; |
bool text_received_; |
- base::string16 last_text_; |
+ base::string16 text_; |
scoped_refptr<content::MessageLoopRunner> message_loop_runner_; |
+ mojo::Binding<spellcheck::mojom::SpellCheckHost> binding_; |
DISALLOW_COPY_AND_ASSIGN(TestSpellCheckMessageFilter); |
}; |
@@ -586,6 +618,28 @@ class TestBrowserClientForSpellCheck : public ChromeContentBrowserClient { |
ChromeContentBrowserClient::RenderProcessWillLaunch(process_host); |
} |
+#if !BUILDFLAG(USE_BROWSER_SPELLCHECKER) |
+ void ExposeInterfacesToRenderer( |
+ service_manager::BinderRegistry* registry, |
+ content::AssociatedInterfaceRegistry* associated_registry, |
+ content::RenderProcessHost* render_process_host) override { |
+ // Expose the default interfaces. |
+ ChromeContentBrowserClient::ExposeInterfacesToRenderer( |
+ registry, associated_registry, render_process_host); |
+ |
+ scoped_refptr<TestSpellCheckMessageFilter> filter = |
+ GetSpellCheckMessageFilterForProcess(render_process_host); |
+ CHECK(filter); |
+ |
+ // Override the default SpellCheckHost interface. |
+ auto ui_task_runner = content::BrowserThread::GetTaskRunnerForThread( |
+ content::BrowserThread::UI); |
+ registry->AddInterface( |
+ base::Bind(&TestSpellCheckMessageFilter::ShellCheckHostRequest, filter), |
+ ui_task_runner); |
+ } |
+#endif // !BUILDFLAG(USE_BROWSER_SPELLCHECKER) |
+ |
// Retrieves the registered filter for the given RenderProcessHost. It will |
// return nullptr if the RenderProcessHost was initialized while a different |
// instance of ContentBrowserClient was in action. |
@@ -618,14 +672,15 @@ IN_PROC_BROWSER_TEST_F(ChromeSitePerProcessTest, OOPIFSpellCheckTest) { |
content::WebContents* web_contents = |
browser()->tab_strip_model()->GetActiveWebContents(); |
- content::RenderFrameHost* subframe = |
+ content::RenderFrameHost* cross_site_subframe = |
ChildFrameAt(web_contents->GetMainFrame(), 0); |
+ |
scoped_refptr<TestSpellCheckMessageFilter> filter = |
browser_client.GetSpellCheckMessageFilterForProcess( |
- subframe->GetProcess()); |
+ cross_site_subframe->GetProcess()); |
filter->Wait(); |
- EXPECT_EQ(base::ASCIIToUTF16("zz."), filter->last_text()); |
+ EXPECT_EQ(base::ASCIIToUTF16("zz."), filter->text()); |
content::SetBrowserClientForTesting(old_browser_client); |
} |