spellcheck_panel.cc 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. // Copyright 2017 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "components/spellcheck/renderer/spellcheck_panel.h"
  5. #include "base/bind.h"
  6. #include "base/metrics/histogram_macros.h"
  7. #include "content/public/renderer/render_frame.h"
  8. #include "content/public/renderer/render_thread.h"
  9. #include "services/service_manager/public/cpp/local_interface_provider.h"
  10. #include "third_party/blink/public/platform/web_string.h"
  11. #include "third_party/blink/public/web/web_local_frame.h"
  12. SpellCheckPanel::SpellCheckPanel(
  13. content::RenderFrame* render_frame,
  14. service_manager::BinderRegistry* registry,
  15. service_manager::LocalInterfaceProvider* embedder_provider)
  16. : content::RenderFrameObserver(render_frame),
  17. spelling_panel_visible_(false),
  18. embedder_provider_(embedder_provider) {
  19. DCHECK(render_frame);
  20. DCHECK(embedder_provider);
  21. registry->AddInterface(base::BindRepeating(
  22. &SpellCheckPanel::SpellCheckPanelReceiver, base::Unretained(this)));
  23. render_frame->GetWebFrame()->SetSpellCheckPanelHostClient(this);
  24. }
  25. SpellCheckPanel::~SpellCheckPanel() = default;
  26. void SpellCheckPanel::OnDestruct() {
  27. delete this;
  28. }
  29. bool SpellCheckPanel::IsShowingSpellingUI() {
  30. return spelling_panel_visible_;
  31. }
  32. void SpellCheckPanel::ShowSpellingUI(bool show) {
  33. UMA_HISTOGRAM_BOOLEAN("SpellCheck.api.showUI", show);
  34. GetSpellCheckPanelHost()->ShowSpellingPanel(show);
  35. }
  36. void SpellCheckPanel::UpdateSpellingUIWithMisspelledWord(
  37. const blink::WebString& word) {
  38. GetSpellCheckPanelHost()->UpdateSpellingPanelWithMisspelledWord(word.Utf16());
  39. }
  40. void SpellCheckPanel::SpellCheckPanelReceiver(
  41. mojo::PendingReceiver<spellcheck::mojom::SpellCheckPanel> receiver) {
  42. receivers_.Add(this, std::move(receiver));
  43. }
  44. void SpellCheckPanel::AdvanceToNextMisspelling() {
  45. auto* render_frame = content::RenderFrameObserver::render_frame();
  46. DCHECK(render_frame->GetWebFrame());
  47. render_frame->GetWebFrame()->ExecuteCommand(
  48. blink::WebString::FromUTF8("AdvanceToNextMisspelling"));
  49. }
  50. void SpellCheckPanel::ToggleSpellPanel(bool visible) {
  51. auto* render_frame = content::RenderFrameObserver::render_frame();
  52. DCHECK(render_frame->GetWebFrame());
  53. // Tell our frame whether the spelling panel is visible or not so
  54. // that it won't need to make mojo calls later.
  55. spelling_panel_visible_ = visible;
  56. render_frame->GetWebFrame()->ExecuteCommand(
  57. blink::WebString::FromUTF8("ToggleSpellPanel"));
  58. }
  59. mojo::Remote<spellcheck::mojom::SpellCheckPanelHost>
  60. SpellCheckPanel::GetSpellCheckPanelHost() {
  61. mojo::Remote<spellcheck::mojom::SpellCheckPanelHost> spell_check_panel_host;
  62. embedder_provider_->GetInterface(
  63. spell_check_panel_host.BindNewPipeAndPassReceiver());
  64. return spell_check_panel_host;
  65. }