Commit 093acc6f authored by Dave Tapuska's avatar Dave Tapuska Committed by Commit Bot

Add unittest for showing spelling panel on mac via EditCommand

Repurpose spell checking code that was testing for the mojo channel
to common code. Write a test that causes the showGuessPanel selector
to be sent and verify the panel is requested to be shown.

BUG=782836

Change-Id: I9d8ac59ac3bf96bbcd7e538f794eac71e0bc7553
Reviewed-on: https://chromium-review.googlesource.com/786260
Commit-Queue: Dave Tapuska <dtapuska@chromium.org>
Reviewed-by: default avatarRachel Blum <groby@chromium.org>
Reviewed-by: default avatarAlex Moshchuk <alexmos@chromium.org>
Cr-Commit-Position: refs/heads/master@{#522088}
parent a81b7e78
......@@ -4762,6 +4762,15 @@ static_library("test_support") {
"extensions/fake_safe_browsing_database_manager.h",
]
}
if (has_spellcheck_panel) {
sources += [
"spellchecker/test/spellcheck_content_browser_client.cc",
"spellchecker/test/spellcheck_content_browser_client.h",
"spellchecker/test/spellcheck_mock_panel_host.cc",
"spellchecker/test/spellcheck_mock_panel_host.h",
]
}
}
static_library("test_support_ui") {
......
......@@ -52,6 +52,7 @@
#include "mojo/public/cpp/bindings/binding_set.h"
#include "services/service_manager/public/cpp/interface_provider.h"
#if BUILDFLAG(HAS_SPELLCHECK_PANEL)
#include "chrome/browser/spellchecker/test/spellcheck_content_browser_client.h"
#include "components/spellcheck/common/spellcheck_panel.mojom.h"
#endif // BUILDFLAG(HAS_SPELLCHECK_PANEL)
#endif
......@@ -856,117 +857,11 @@ IN_PROC_BROWSER_TEST_F(ChromeSitePerProcessTest, OOPIFSpellCheckTest) {
}
#if BUILDFLAG(HAS_SPELLCHECK_PANEL)
class TestSpellCheckPanelHost : public spellcheck::mojom::SpellCheckPanelHost {
public:
explicit TestSpellCheckPanelHost(content::RenderProcessHost* process_host)
: process_host_(process_host) {}
content::RenderProcessHost* process_host() const { return process_host_; }
bool SpellingPanelVisible() {
if (!show_spelling_panel_called_) {
base::RunLoop run_loop;
quit_ = run_loop.QuitClosure();
run_loop.Run();
}
EXPECT_TRUE(show_spelling_panel_called_);
return spelling_panel_visible_;
}
void SpellCheckPanelHostRequest(
spellcheck::mojom::SpellCheckPanelHostRequest request) {
bindings_.AddBinding(this, std::move(request));
}
private:
// spellcheck::mojom::SpellCheckPanelHost:
void ShowSpellingPanel(bool show) override {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
show_spelling_panel_called_ = true;
spelling_panel_visible_ = show;
if (quit_)
std::move(quit_).Run();
}
void UpdateSpellingPanelWithMisspelledWord(
const base::string16& word) override {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
}
mojo::BindingSet<spellcheck::mojom::SpellCheckPanelHost> bindings_;
content::RenderProcessHost* process_host_;
bool show_spelling_panel_called_ = false;
bool spelling_panel_visible_ = false;
base::OnceClosure quit_;
DISALLOW_COPY_AND_ASSIGN(TestSpellCheckPanelHost);
};
class TestBrowserClientForSpellCheckPanelHost
: public ChromeContentBrowserClient {
public:
TestBrowserClientForSpellCheckPanelHost() = default;
// ContentBrowserClient overrides.
void OverrideOnBindInterface(
const service_manager::BindSourceInfo& remote_info,
const std::string& name,
mojo::ScopedMessagePipeHandle* handle) override {
if (name != spellcheck::mojom::SpellCheckPanelHost::Name_)
return;
spellcheck::mojom::SpellCheckPanelHostRequest request(std::move(*handle));
// Override the default SpellCheckHost interface.
auto ui_task_runner = content::BrowserThread::GetTaskRunnerForThread(
content::BrowserThread::UI);
ui_task_runner->PostTask(
FROM_HERE, base::Bind(&TestBrowserClientForSpellCheckPanelHost::
BindSpellCheckPanelHostRequest,
base::Unretained(this), base::Passed(&request),
remote_info));
}
TestSpellCheckPanelHost* GetTestSpellCheckPanelHostForProcess(
content::RenderProcessHost* render_process_host) const {
for (const auto& host : hosts_) {
if (host->process_host() == render_process_host)
return host.get();
}
return nullptr;
}
void RunUntilBind() {
base::RunLoop run_loop;
quit_on_bind_closure_ = run_loop.QuitClosure();
run_loop.Run();
}
private:
void BindSpellCheckPanelHostRequest(
spellcheck::mojom::SpellCheckPanelHostRequest request,
const service_manager::BindSourceInfo& source_info) {
content::RenderProcessHost* render_process_host =
content::RenderProcessHost::FromRendererIdentity(source_info.identity);
auto spell_check_panel_host =
std::make_unique<TestSpellCheckPanelHost>(render_process_host);
spell_check_panel_host->SpellCheckPanelHostRequest(std::move(request));
hosts_.push_back(std::move(spell_check_panel_host));
std::move(quit_on_bind_closure_).Run();
}
base::OnceClosure quit_on_bind_closure_;
std::vector<std::unique_ptr<TestSpellCheckPanelHost>> hosts_;
DISALLOW_COPY_AND_ASSIGN(TestBrowserClientForSpellCheckPanelHost);
};
// Tests that the OSX spell check panel can be opened from an out-of-process
// subframe, crbug.com/712395
IN_PROC_BROWSER_TEST_F(ChromeSitePerProcessTest, OOPIFSpellCheckPanelTest) {
TestBrowserClientForSpellCheckPanelHost browser_client;
spellcheck::SpellCheckContentBrowserClient browser_client;
content::ContentBrowserClient* old_browser_client =
content::SetBrowserClientForTesting(&browser_client);
......@@ -987,8 +882,8 @@ IN_PROC_BROWSER_TEST_F(ChromeSitePerProcessTest, OOPIFSpellCheckPanelTest) {
spell_check_panel_client->ToggleSpellPanel(false);
browser_client.RunUntilBind();
TestSpellCheckPanelHost* host =
browser_client.GetTestSpellCheckPanelHostForProcess(
spellcheck::SpellCheckMockPanelHost* host =
browser_client.GetSpellCheckMockPanelHostForProcess(
cross_site_subframe->GetProcess());
EXPECT_TRUE(host->SpellingPanelVisible());
......
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#import <Cocoa/Cocoa.h>
#include "chrome/browser/ui/browser.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "chrome/test/base/ui_test_utils.h"
#include "components/spellcheck/spellcheck_build_features.h"
#include "content/public/browser/render_frame_host.h"
#include "content/public/browser/render_widget_host_view.h"
#include "content/public/browser/web_contents.h"
#if BUILDFLAG(ENABLE_SPELLCHECK)
#include "chrome/browser/spellchecker/test/spellcheck_content_browser_client.h"
#endif
namespace {
class SpellCheckMacViewBrowserTest : public InProcessBrowserTest {
public:
SpellCheckMacViewBrowserTest() {}
};
#if BUILDFLAG(ENABLE_SPELLCHECK)
IN_PROC_BROWSER_TEST_F(SpellCheckMacViewBrowserTest, SpellCheckPanelVisible) {
spellcheck::SpellCheckContentBrowserClient browser_client;
content::ContentBrowserClient* old_browser_client =
content::SetBrowserClientForTesting(&browser_client);
ASSERT_TRUE(embedded_test_server()->Start());
auto* web_contents = browser()->tab_strip_model()->GetActiveWebContents();
ui_test_utils::NavigateToURL(browser(),
embedded_test_server()->GetURL("/title1.html"));
SEL show_guess_panel = NSSelectorFromString(@"showGuessPanel:");
[web_contents->GetRenderWidgetHostView()->GetNativeView()
performSelector:show_guess_panel];
browser_client.RunUntilBind();
spellcheck::SpellCheckMockPanelHost* host =
browser_client.GetSpellCheckMockPanelHostForProcess(
web_contents->GetMainFrame()->GetProcess());
EXPECT_TRUE(host->SpellingPanelVisible());
content::SetBrowserClientForTesting(old_browser_client);
}
#endif
} // namespace
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/spellchecker/test/spellcheck_content_browser_client.h"
#include "content/public/browser/browser_thread.h"
#include "services/service_manager/public/cpp/bind_source_info.h"
namespace spellcheck {
SpellCheckContentBrowserClient::SpellCheckContentBrowserClient() {}
SpellCheckContentBrowserClient::~SpellCheckContentBrowserClient() {}
void SpellCheckContentBrowserClient::OverrideOnBindInterface(
const service_manager::BindSourceInfo& remote_info,
const std::string& name,
mojo::ScopedMessagePipeHandle* handle) {
if (name != spellcheck::mojom::SpellCheckPanelHost::Name_)
return;
spellcheck::mojom::SpellCheckPanelHostRequest request(std::move(*handle));
// Override the default SpellCheckHost interface.
auto ui_task_runner = content::BrowserThread::GetTaskRunnerForThread(
content::BrowserThread::UI);
ui_task_runner->PostTask(
FROM_HERE,
base::BindOnce(
&SpellCheckContentBrowserClient::BindSpellCheckPanelHostRequest,
base::Unretained(this), base::Passed(&request), remote_info));
}
SpellCheckMockPanelHost*
SpellCheckContentBrowserClient::GetSpellCheckMockPanelHostForProcess(
content::RenderProcessHost* render_process_host) const {
for (const auto& host : hosts_) {
if (host->process_host() == render_process_host)
return host.get();
}
return nullptr;
}
void SpellCheckContentBrowserClient::RunUntilBind() {
base::RunLoop run_loop;
quit_on_bind_closure_ = run_loop.QuitClosure();
run_loop.Run();
}
void SpellCheckContentBrowserClient::BindSpellCheckPanelHostRequest(
spellcheck::mojom::SpellCheckPanelHostRequest request,
const service_manager::BindSourceInfo& source_info) {
content::RenderProcessHost* render_process_host =
content::RenderProcessHost::FromRendererIdentity(source_info.identity);
auto spell_check_panel_host =
std::make_unique<SpellCheckMockPanelHost>(render_process_host);
spell_check_panel_host->SpellCheckPanelHostRequest(std::move(request));
hosts_.push_back(std::move(spell_check_panel_host));
std::move(quit_on_bind_closure_).Run();
}
} // namespace spellcheck
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_SPELLCHECKER_TEST_SPELLCHECK_CONTENT_BROWSER_CLIENT_H_
#define CHROME_BROWSER_SPELLCHECKER_TEST_SPELLCHECK_CONTENT_BROWSER_CLIENT_H_
#include <vector>
#include "chrome/browser/chrome_content_browser_client.h"
#include "chrome/browser/spellchecker/test/spellcheck_mock_panel_host.h"
namespace spellcheck {
class SpellCheckContentBrowserClient : public ChromeContentBrowserClient {
public:
SpellCheckContentBrowserClient();
~SpellCheckContentBrowserClient() override;
// ContentBrowserClient overrides.
void OverrideOnBindInterface(
const service_manager::BindSourceInfo& remote_info,
const std::string& name,
mojo::ScopedMessagePipeHandle* handle) override;
SpellCheckMockPanelHost* GetSpellCheckMockPanelHostForProcess(
content::RenderProcessHost* render_process_host) const;
void RunUntilBind();
private:
void BindSpellCheckPanelHostRequest(
spellcheck::mojom::SpellCheckPanelHostRequest request,
const service_manager::BindSourceInfo& source_info);
base::OnceClosure quit_on_bind_closure_;
std::vector<std::unique_ptr<SpellCheckMockPanelHost>> hosts_;
DISALLOW_COPY_AND_ASSIGN(SpellCheckContentBrowserClient);
};
} // namespace spellcheck
#endif // CHROME_BROWSER_SPELLCHECKER_TEST_SPELLCHECK_CONTENT_BROWSER_CLIENT_H_
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/spellchecker/test/spellcheck_mock_panel_host.h"
#include "base/run_loop.h"
#include "content/public/browser/browser_thread.h"
namespace spellcheck {
SpellCheckMockPanelHost::SpellCheckMockPanelHost(
content::RenderProcessHost* process_host)
: process_host_(process_host) {}
SpellCheckMockPanelHost::~SpellCheckMockPanelHost() {}
bool SpellCheckMockPanelHost::SpellingPanelVisible() {
if (!show_spelling_panel_called_) {
base::RunLoop run_loop;
quit_ = run_loop.QuitClosure();
run_loop.Run();
}
return spelling_panel_visible_;
}
void SpellCheckMockPanelHost::SpellCheckPanelHostRequest(
spellcheck::mojom::SpellCheckPanelHostRequest request) {
bindings_.AddBinding(this, std::move(request));
}
// spellcheck::mojom::SpellCheckPanelHost:
void SpellCheckMockPanelHost::ShowSpellingPanel(bool show) {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
show_spelling_panel_called_ = true;
spelling_panel_visible_ = show;
if (quit_)
std::move(quit_).Run();
}
void SpellCheckMockPanelHost::UpdateSpellingPanelWithMisspelledWord(
const base::string16& word) {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
}
} // namespace spellcheck
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_SPELLCHECKER_TEST_SPELLCHECK_MOCK_PANEL_HOST_H_
#define CHROME_BROWSER_SPELLCHECKER_TEST_SPELLCHECK_MOCK_PANEL_HOST_H_
#include "base/callback.h"
#include "components/spellcheck/common/spellcheck_panel.mojom.h"
#include "content/public/browser/render_process_host.h"
#include "mojo/public/cpp/bindings/binding_set.h"
namespace spellcheck {
class SpellCheckMockPanelHost : public spellcheck::mojom::SpellCheckPanelHost {
public:
explicit SpellCheckMockPanelHost(content::RenderProcessHost* process_host);
~SpellCheckMockPanelHost() override;
content::RenderProcessHost* process_host() const { return process_host_; }
bool SpellingPanelVisible();
void SpellCheckPanelHostRequest(
spellcheck::mojom::SpellCheckPanelHostRequest request);
private:
// spellcheck::mojom::SpellCheckPanelHost:
void ShowSpellingPanel(bool show) override;
void UpdateSpellingPanelWithMisspelledWord(
const base::string16& word) override;
mojo::BindingSet<spellcheck::mojom::SpellCheckPanelHost> bindings_;
content::RenderProcessHost* process_host_;
bool show_spelling_panel_called_ = false;
bool spelling_panel_visible_ = false;
base::OnceClosure quit_;
DISALLOW_COPY_AND_ASSIGN(SpellCheckMockPanelHost);
};
} // namespace spellcheck
#endif // CHROME_BROWSER_SPELLCHECKER_TEST_SPELLCHECK_MOCK_PANEL_HOST_H_
......@@ -675,6 +675,7 @@ test("browser_tests") {
"../browser/net/network_connection_tracker_browsertest.cc",
"../browser/speech/extension_api/tts_extension_apitest.cc",
"../browser/speech/speech_recognition_browsertest.cc",
"../browser/spellchecker/spellcheck_mac_view_browsertest.mm",
"../browser/spellchecker/spellcheck_service_browsertest.cc",
"../browser/ssl/cert_verifier_browser_test.cc",
"../browser/ssl/cert_verifier_browser_test.h",
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment