spelling_menu_observer_browsertest.cc revision 5f1c94371a64b3196d4be9466099bb892df9b88e
13a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// Copyright 2014 The Chromium Authors. All rights reserved.
23a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// Use of this source code is governed by a BSD-style license that can be
33a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// found in the LICENSE file.
43a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
53a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#include "chrome/browser/renderer_context_menu/spelling_menu_observer.h"
63a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
73a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#include <vector>
83a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
93a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#include "base/prefs/pref_service.h"
103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#include "base/strings/utf_string_conversions.h"
113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#include "chrome/app/chrome_command_ids.h"
123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#include "chrome/browser/renderer_context_menu/render_view_context_menu.h"
133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#include "chrome/browser/spellchecker/spelling_service_client.h"
143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#include "chrome/common/pref_names.h"
153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#include "chrome/test/base/in_process_browser_test.h"
163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#include "chrome/test/base/testing_profile.h"
173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#include "components/renderer_context_menu/render_view_context_menu_observer.h"
183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgusing content::RenderViewHost;
203a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgusing content::WebContents;
213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
223a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgnamespace {
233a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
243a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// A mock context menu used in this test. This class overrides virtual methods
253a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// derived from the RenderViewContextMenuProxy class to monitor calls from the
263a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// SpellingMenuObserver class.
273a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgclass MockRenderViewContextMenu : public RenderViewContextMenuProxy {
283a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org public:
293a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  // A menu item used in this test. This test uses a vector of this struct to
303a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  // hold menu items added by this test.
313a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  struct MockMenuItem {
32760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    MockMenuItem()
333a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org        : command_id(0),
343a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org          enabled(false),
353a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org          checked(false),
363a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org          hidden(true) {
373a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    }
383a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    int command_id;
393a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    bool enabled;
403a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    bool checked;
413a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    bool hidden;
423a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    base::string16 title;
433a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  };
443a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
453a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  explicit MockRenderViewContextMenu(bool incognito);
463a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  virtual ~MockRenderViewContextMenu();
473a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
483a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  // RenderViewContextMenuProxy implementation.
493a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  virtual void AddMenuItem(int command_id,
503a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                           const base::string16& title) OVERRIDE;
513a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  virtual void AddCheckItem(int command_id,
523a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                            const base::string16& title) OVERRIDE;
533a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  virtual void AddSeparator() OVERRIDE;
543a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  virtual void AddSubMenu(int command_id,
553a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                          const base::string16& label,
563a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                          ui::MenuModel* model) OVERRIDE;
573a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  virtual void UpdateMenuItem(int command_id,
583a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                              bool enabled,
593a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                              bool hidden,
603a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                              const base::string16& title) OVERRIDE;
613a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  virtual RenderViewHost* GetRenderViewHost() const OVERRIDE;
623a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  virtual WebContents* GetWebContents() const OVERRIDE;
633a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  virtual content::BrowserContext* GetBrowserContext() const OVERRIDE;
643a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
653a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  // Attaches a RenderViewContextMenuObserver to be tested.
663a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  void SetObserver(RenderViewContextMenuObserver* observer);
673a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
683a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  // Returns the number of items added by the test.
693a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  size_t GetMenuSize() const;
703a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
713a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  // Returns the i-th item.
723a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  bool GetMenuItem(size_t i, MockMenuItem* item) const;
733a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
743a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  // Returns the writable profile used in this test.
753a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  PrefService* GetPrefs();
763a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
773a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org private:
783a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  // An observer used for initializing the status of menu items added in this
793a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  // test. A test should delete this RenderViewContextMenuObserver object.
803a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  RenderViewContextMenuObserver* observer_;
813a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
823a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  // A dummy profile used in this test. Call GetPrefs() when a test needs to
833a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  // change this profile and use PrefService methods.
843a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  scoped_ptr<TestingProfile> profile_;
853a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
863a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  // A list of menu items added by the SpellingMenuObserver class.
873a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  std::vector<MockMenuItem> items_;
883a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
893a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  DISALLOW_COPY_AND_ASSIGN(MockRenderViewContextMenu);
903a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org};
913a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
923a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgMockRenderViewContextMenu::MockRenderViewContextMenu(bool incognito)
933a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    : observer_(NULL) {
943a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  TestingProfile::Builder builder;
953a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  if (incognito)
963a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    builder.SetIncognito();
973a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  profile_ = builder.Build();
983a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
993a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1003a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgMockRenderViewContextMenu::~MockRenderViewContextMenu() {
1013a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
1023a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1033a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid MockRenderViewContextMenu::AddMenuItem(int command_id,
1043a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                            const base::string16& title) {
1053a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  MockMenuItem item;
1063a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  item.command_id = command_id;
1073a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  item.enabled = observer_->IsCommandIdEnabled(command_id);
1083a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  item.checked = false;
1093a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  item.hidden = false;
1103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  item.title = title;
1113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  items_.push_back(item);
1123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
1133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid MockRenderViewContextMenu::AddCheckItem(int command_id,
1153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                             const base::string16& title) {
1163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  MockMenuItem item;
1173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  item.command_id = command_id;
1183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  item.enabled = observer_->IsCommandIdEnabled(command_id);
1193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  item.checked = observer_->IsCommandIdChecked(command_id);
1203a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  item.hidden = false;
1213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  item.title = title;
1223a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  items_.push_back(item);
1233a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
1243a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1253a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid MockRenderViewContextMenu::AddSeparator() {
1263a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  MockMenuItem item;
1273a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  item.command_id = -1;
1283a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  item.enabled = false;
1293a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  item.checked = false;
1303a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  item.hidden = false;
1313a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  items_.push_back(item);
1323a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
1333a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1343a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid MockRenderViewContextMenu::AddSubMenu(int command_id,
1353a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                           const base::string16& label,
1363a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                           ui::MenuModel* model) {
1373a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  MockMenuItem item;
1383a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  item.command_id = -1;
1393a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  item.enabled = false;
1403a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  item.checked = false;
1413a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  item.hidden = false;
1423a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  items_.push_back(item);
1433a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
1443a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1453a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid MockRenderViewContextMenu::UpdateMenuItem(int command_id,
1463a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                               bool enabled,
1473a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                               bool hidden,
1483a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                               const base::string16& title) {
1493a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  for (std::vector<MockMenuItem>::iterator it = items_.begin();
1503a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org       it != items_.end(); ++it) {
1513a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    if (it->command_id == command_id) {
1523a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      it->enabled = enabled;
1533a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      it->hidden = hidden;
1543a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      it->title = title;
1553a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      return;
1563a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    }
1573a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  }
1583a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1593a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  // The SpellingMenuObserver class tries to change a menu item not added by the
1603a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  // class. This is an unexpected behavior and we should stop now.
1613a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  FAIL();
1623a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
1633a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1643a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgRenderViewHost* MockRenderViewContextMenu::GetRenderViewHost() const {
1653a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  return NULL;
1663a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
1673a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1683a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgWebContents* MockRenderViewContextMenu::GetWebContents() const {
1693a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  return NULL;
1703a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
1713a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1723a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgcontent::BrowserContext* MockRenderViewContextMenu::GetBrowserContext() const {
1733a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  return profile_.get();
1743a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
1753a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1763a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgsize_t MockRenderViewContextMenu::GetMenuSize() const {
1773a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  return items_.size();
1783a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
1793a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1803a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgbool MockRenderViewContextMenu::GetMenuItem(size_t i,
1813a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                            MockMenuItem* item) const {
1823a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  if (i >= items_.size())
1833a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    return false;
1843a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  item->command_id = items_[i].command_id;
1853a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  item->enabled = items_[i].enabled;
1863a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  item->checked = items_[i].checked;
1873a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  item->hidden = items_[i].hidden;
1883a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  item->title = items_[i].title;
1893a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  return true;
1903a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
1913a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1923a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid MockRenderViewContextMenu::SetObserver(
1933a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    RenderViewContextMenuObserver* observer) {
1943a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  observer_ = observer;
1953a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
1963a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1973a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgPrefService* MockRenderViewContextMenu::GetPrefs() {
1983a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  return profile_->GetPrefs();
1993a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
2003a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2013a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// A test class used in this file. This test should be a browser test because it
2023a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// accesses resources.
2033a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgclass SpellingMenuObserverTest : public InProcessBrowserTest {
2043a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org public:
2053a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  SpellingMenuObserverTest();
2063a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2073a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  virtual void SetUpOnMainThread() OVERRIDE {
2083a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    Reset(false);
2093a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  }
2103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  virtual void TearDownOnMainThread() OVERRIDE {
2123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    observer_.reset();
2133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    menu_.reset();
2143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  }
2153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  void Reset(bool incognito) {
2173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    observer_.reset();
2183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    menu_.reset(new MockRenderViewContextMenu(incognito));
2193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    observer_.reset(new SpellingMenuObserver(menu_.get()));
2203a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    menu_->SetObserver(observer_.get());
2213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  }
2223a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2233a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  void InitMenu(const char* word, const char* suggestion) {
2243a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    content::ContextMenuParams params;
2253a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    params.is_editable = true;
2263a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    params.misspelled_word = base::ASCIIToUTF16(word);
2273a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    params.dictionary_suggestions.clear();
2283a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    if (suggestion)
2293a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      params.dictionary_suggestions.push_back(base::ASCIIToUTF16(suggestion));
2303a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    observer_->InitMenu(params);
2313a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  }
2323a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2333a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  void ForceSuggestMode() {
2343a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    menu()->GetPrefs()->SetBoolean(prefs::kSpellCheckUseSpellingService, true);
2353a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    // Force a non-empty and non-"en" locale so SUGGEST is available.
2363a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    menu()->GetPrefs()->SetString(prefs::kSpellCheckDictionary, "fr");
2373a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    ASSERT_TRUE(SpellingServiceClient::IsAvailable(
2383a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org        menu()->GetBrowserContext(), SpellingServiceClient::SUGGEST));
2393a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    ASSERT_FALSE(SpellingServiceClient::IsAvailable(
2403a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org        menu()->GetBrowserContext(), SpellingServiceClient::SPELLCHECK));
2413a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  }
2423a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2433a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  virtual ~SpellingMenuObserverTest();
2443a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  MockRenderViewContextMenu* menu() { return menu_.get(); }
2453a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  SpellingMenuObserver* observer() { return observer_.get(); }
2463a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org private:
2473a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  scoped_ptr<SpellingMenuObserver> observer_;
2483a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  scoped_ptr<MockRenderViewContextMenu> menu_;
2493a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  DISALLOW_COPY_AND_ASSIGN(SpellingMenuObserverTest);
2503a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org};
2513a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2523a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgSpellingMenuObserverTest::SpellingMenuObserverTest() {
2533a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
2543a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2553a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgSpellingMenuObserverTest::~SpellingMenuObserverTest() {
2563a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
2573a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2583a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}  // namespace
2593a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2603a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// Tests that right-clicking a correct word does not add any items.
2613a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgIN_PROC_BROWSER_TEST_F(SpellingMenuObserverTest, InitMenuWithCorrectWord) {
2623a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  InitMenu("", NULL);
2633a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  EXPECT_EQ(static_cast<size_t>(0), menu()->GetMenuSize());
2643a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
2653a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2663a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// Tests that right-clicking a misspelled word adds four items:
2673a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// "No spelling suggestions", "Add to dictionary", "Ask Google for suggestions",
2683a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// and a separator.
2693a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgIN_PROC_BROWSER_TEST_F(SpellingMenuObserverTest, InitMenuWithMisspelledWord) {
2703a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  InitMenu("wiimode", NULL);
2713a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  EXPECT_EQ(static_cast<size_t>(4), menu()->GetMenuSize());
2723a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2733a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  // Read all the context-menu items added by this test and verify they are
2743a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  // expected ones. We do not check the item titles to prevent resource changes
2753a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  // from breaking this test. (I think it is not expected by those who change
2763a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  // resources.)
2773a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  MockRenderViewContextMenu::MockMenuItem item;
2783a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  menu()->GetMenuItem(0, &item);
2793a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  EXPECT_EQ(IDC_CONTENT_CONTEXT_NO_SPELLING_SUGGESTIONS, item.command_id);
2803a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  EXPECT_FALSE(item.enabled);
2813a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  EXPECT_FALSE(item.hidden);
2823a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  menu()->GetMenuItem(1, &item);
2833a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  EXPECT_EQ(IDC_SPELLCHECK_ADD_TO_DICTIONARY, item.command_id);
2843a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  EXPECT_TRUE(item.enabled);
2853a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  EXPECT_FALSE(item.hidden);
2863a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  menu()->GetMenuItem(2, &item);
2873a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  EXPECT_EQ(IDC_CONTENT_CONTEXT_SPELLING_TOGGLE, item.command_id);
2883a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  EXPECT_TRUE(item.enabled);
2893a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  EXPECT_FALSE(item.checked);
2903a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  EXPECT_FALSE(item.hidden);
2913a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  menu()->GetMenuItem(3, &item);
2923a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  EXPECT_EQ(-1, item.command_id);
2933a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  EXPECT_FALSE(item.enabled);
2943a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  EXPECT_FALSE(item.hidden);
2953a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
2963a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2973a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// Tests that right-clicking a correct word when we enable spelling-service
2983a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// integration to verify an item "Ask Google for suggestions" is checked. Even
2993a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// though this meanu itself does not add this item, its sub-menu adds the item
3003a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// and calls SpellingMenuObserver::IsChecked() to check it.
3013a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgIN_PROC_BROWSER_TEST_F(SpellingMenuObserverTest,
3023a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                       EnableSpellingServiceWithCorrectWord) {
3033a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  menu()->GetPrefs()->SetBoolean(prefs::kSpellCheckUseSpellingService, true);
3043a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  InitMenu("", NULL);
3053a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3063a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  EXPECT_TRUE(
3073a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      observer()->IsCommandIdChecked(IDC_CONTENT_CONTEXT_SPELLING_TOGGLE));
3083a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
3093a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// Tests that right-clicking a misspelled word when we enable spelling-service
3113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// integration to verify an item "Ask Google for suggestions" is checked. (This
3123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// test does not actually send JSON-RPC requests to the service because it makes
3133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// this test flaky.)
3143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgIN_PROC_BROWSER_TEST_F(SpellingMenuObserverTest, EnableSpellingService) {
3153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  menu()->GetPrefs()->SetBoolean(prefs::kSpellCheckUseSpellingService, true);
3163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  menu()->GetPrefs()->SetString(prefs::kSpellCheckDictionary, std::string());
3173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  InitMenu("wiimode", NULL);
3193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  EXPECT_EQ(static_cast<size_t>(4), menu()->GetMenuSize());
3203a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  // To avoid duplicates, this test reads only the "Ask Google for suggestions"
3223a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  // item and verifies it is enabled and checked.
3233a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  MockRenderViewContextMenu::MockMenuItem item;
3243a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  menu()->GetMenuItem(2, &item);
3253a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  EXPECT_EQ(IDC_CONTENT_CONTEXT_SPELLING_TOGGLE, item.command_id);
3263a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  EXPECT_TRUE(item.enabled);
3273a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  EXPECT_TRUE(item.checked);
3283a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  EXPECT_FALSE(item.hidden);
3293a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
3303a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3313a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// Test that there will be a separator after "no suggestions" if
3323a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// SpellingServiceClient::SUGGEST is on.
3333a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgIN_PROC_BROWSER_TEST_F(SpellingMenuObserverTest, SeparatorAfterSuggestions) {
3343a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  ForceSuggestMode();
3353a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  InitMenu("jhhj", NULL);
3363a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3373a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  // The test should see a top separator, "No spelling suggestions",
3383a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  // "No more Google suggestions" (from SpellingService) and a separator
3393a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  // as the first four items, then possibly more (not relevant here).
3403a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  EXPECT_LT(4U, menu()->GetMenuSize());
3413a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3423a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  MockRenderViewContextMenu::MockMenuItem item;
3433a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  menu()->GetMenuItem(0, &item);
3443a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  EXPECT_EQ(-1, item.command_id);
3453a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  EXPECT_FALSE(item.enabled);
3463a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  EXPECT_FALSE(item.hidden);
3473a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3483a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  menu()->GetMenuItem(1, &item);
3493a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  EXPECT_EQ(IDC_CONTENT_CONTEXT_SPELLING_SUGGESTION, item.command_id);
3503a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  EXPECT_FALSE(item.enabled);
3513a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  EXPECT_FALSE(item.hidden);
3523a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3533a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  menu()->GetMenuItem(2, &item);
3543a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  EXPECT_EQ(IDC_CONTENT_CONTEXT_NO_SPELLING_SUGGESTIONS, item.command_id);
3553a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  EXPECT_FALSE(item.enabled);
3563a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  EXPECT_FALSE(item.hidden);
3573a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3583a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  menu()->GetMenuItem(3, &item);
3593a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  EXPECT_EQ(-1, item.command_id);
3603a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  EXPECT_FALSE(item.enabled);
3613a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  EXPECT_FALSE(item.hidden);
3623a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
3633a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3643a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// Test that we don't show "No more suggestions from Google" if the spelling
3653a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// service is enabled and that there is only one suggestion.
3663a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgIN_PROC_BROWSER_TEST_F(SpellingMenuObserverTest,
3673a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                       NoMoreSuggestionsNotDisplayed) {
3683a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  menu()->GetPrefs()->SetBoolean(prefs::kSpellCheckUseSpellingService, true);
3693a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3703a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  // Force a non-empty locale so SPELLCHECK is available.
3713a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  menu()->GetPrefs()->SetString(prefs::kSpellCheckDictionary, "en");
3723a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  EXPECT_TRUE(SpellingServiceClient::IsAvailable(
3733a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      menu()->GetBrowserContext(), SpellingServiceClient::SPELLCHECK));
3743a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  InitMenu("asdfkj", "asdf");
3753a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3763a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  // The test should see a separator, a suggestion and another separator
3773a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  // as the first two items, then possibly more (not relevant here).
3783a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  EXPECT_LT(3U, menu()->GetMenuSize());
3793a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3803a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  MockRenderViewContextMenu::MockMenuItem item;
3813a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  menu()->GetMenuItem(0, &item);
3823a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  EXPECT_EQ(-1, item.command_id);
3833a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  EXPECT_FALSE(item.enabled);
3843a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  EXPECT_FALSE(item.hidden);
3853a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3863a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  menu()->GetMenuItem(1, &item);
3873a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  EXPECT_EQ(IDC_SPELLCHECK_SUGGESTION_0, item.command_id);
3883a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  EXPECT_TRUE(item.enabled);
3893a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  EXPECT_FALSE(item.hidden);
3903a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3913a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  menu()->GetMenuItem(2, &item);
3923a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  EXPECT_EQ(-1, item.command_id);
3933a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  EXPECT_FALSE(item.enabled);
3943a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  EXPECT_FALSE(item.hidden);
3953a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
3963a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3973a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// Test that "Ask Google For Suggestions" is grayed out when using an
3983a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// off the record profile.
3993a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// TODO(rlp): Include graying out of autocorrect in this test when autocorrect
4003a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// is functional.
4013a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgIN_PROC_BROWSER_TEST_F(SpellingMenuObserverTest,
4023a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                       NoSpellingServiceWhenOffTheRecord) {
4033a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  // Create a menu in an incognito profile.
4043a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  Reset(true);
4053a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
4063a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  // This means spellchecking is allowed. Default is that the service is
4073a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  // contacted but this test makes sure that if profile is incognito, that
4083a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  // is not an option.
4093a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  menu()->GetPrefs()->SetBoolean(prefs::kSpellCheckUseSpellingService, true);
4103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
4113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  // Force a non-empty locale so SUGGEST normally would be available.
4123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  menu()->GetPrefs()->SetString(prefs::kSpellCheckDictionary, "en");
4133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  EXPECT_FALSE(SpellingServiceClient::IsAvailable(
4143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      menu()->GetBrowserContext(), SpellingServiceClient::SUGGEST));
4153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  EXPECT_FALSE(SpellingServiceClient::IsAvailable(
4163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      menu()->GetBrowserContext(), SpellingServiceClient::SPELLCHECK));
4173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
4183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  InitMenu("sjxdjiiiiii", NULL);
4193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
4203a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  // The test should see "No spelling suggestions" (from system checker).
4213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  // They should not see "No more Google suggestions" (from SpellingService) or
4223a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  // a separator. The next 2 items should be "Add to Dictionary" followed
4233a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  // by "Ask Google for suggestions" which should be disabled.
4243a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  // TODO(rlp): add autocorrect here when it is functional.
4253a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  EXPECT_LT(3U, menu()->GetMenuSize());
4263a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
4273a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  MockRenderViewContextMenu::MockMenuItem item;
4283a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  menu()->GetMenuItem(0, &item);
4293a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  EXPECT_EQ(IDC_CONTENT_CONTEXT_NO_SPELLING_SUGGESTIONS, item.command_id);
4303a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  EXPECT_FALSE(item.enabled);
4313a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  EXPECT_FALSE(item.hidden);
4323a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
4333a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  menu()->GetMenuItem(1, &item);
4343a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  EXPECT_EQ(IDC_SPELLCHECK_ADD_TO_DICTIONARY, item.command_id);
4353a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  EXPECT_TRUE(item.enabled);
4363a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  EXPECT_FALSE(item.hidden);
4373a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
4383a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  menu()->GetMenuItem(2, &item);
4393a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  EXPECT_EQ(IDC_CONTENT_CONTEXT_SPELLING_TOGGLE, item.command_id);
4403a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  EXPECT_FALSE(item.enabled);
4413a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  EXPECT_FALSE(item.hidden);
4423a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
4433a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
4443a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// Test that the menu is preceeded by a separator if there are any suggestions,
4453a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// or if the SpellingServiceClient is available
4463a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgIN_PROC_BROWSER_TEST_F(SpellingMenuObserverTest, SuggestionsForceTopSeparator) {
4473a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  menu()->GetPrefs()->SetBoolean(prefs::kSpellCheckUseSpellingService, false);
4483a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
4493a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  // First case: Misspelled word, no suggestions, no spellcheck service.
4503a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  InitMenu("asdfkj", NULL);
4513a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  // See SpellingMenuObserverTest.InitMenuWithMisspelledWord on why 4 items.
4523a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  EXPECT_EQ(static_cast<size_t>(4), menu()->GetMenuSize());
4533a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  MockRenderViewContextMenu::MockMenuItem item;
4543a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  menu()->GetMenuItem(0, &item);
4553a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  EXPECT_NE(-1, item.command_id);
4563a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
4573a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  // Case #2. Misspelled word, suggestions, no spellcheck service.
4583a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  Reset(false);
4593a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  menu()->GetPrefs()->SetBoolean(prefs::kSpellCheckUseSpellingService, false);
4603a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  InitMenu("asdfkj", "asdf");
4613a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
4623a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  // Expect at least separator and 4 default entries.
4633a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  EXPECT_LT(static_cast<size_t>(5), menu()->GetMenuSize());
4643a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  // This test only cares that the first one is a separator.
4653a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  menu()->GetMenuItem(0, &item);
4663a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  EXPECT_EQ(-1, item.command_id);
4673a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
4683a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  // Case #3. Misspelled word, suggestion service is on.
4693a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  Reset(false);
4703a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  ForceSuggestMode();
4713a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  InitMenu("asdfkj", NULL);
4723a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
4733a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  // Should have at least 2 entries. Separator, suggestion.
4743a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  EXPECT_LT(2U, menu()->GetMenuSize());
4753a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  menu()->GetMenuItem(0, &item);
4763a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  EXPECT_EQ(-1, item.command_id);
4773a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  menu()->GetMenuItem(1, &item);
4783a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  EXPECT_EQ(IDC_CONTENT_CONTEXT_SPELLING_SUGGESTION, item.command_id);
4793a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
4803a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org