15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/tab_contents/spelling_menu_observer.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/command_line.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h" 11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/app/chrome_command_ids.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/spellchecker/spelling_service_client.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/tab_contents/render_view_context_menu.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/tab_contents/render_view_context_menu_observer.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/chrome_switches.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_profile.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::RenderViewHost; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A mock context menu used in this test. This class overrides virtual methods 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// derived from the RenderViewContextMenuProxy class to monitor calls from the 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SpellingMenuObserver class. 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockRenderViewContextMenu : public RenderViewContextMenuProxy { 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A menu item used in this test. This test uses a vector of this struct to 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // hold menu items added by this test. 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct MockMenuItem { 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockMenuItem() 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : command_id(0), 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enabled(false), 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) checked(false), 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hidden(true) { 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int command_id; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool enabled; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool checked; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool hidden; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 title; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockRenderViewContextMenu(); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~MockRenderViewContextMenu(); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // RenderViewContextMenuProxy implementation. 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void AddMenuItem(int command_id, const string16& title) OVERRIDE; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void AddCheckItem(int command_id, const string16& title) OVERRIDE; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void AddSeparator() OVERRIDE; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void AddSubMenu(int command_id, 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& label, 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MenuModel* model) OVERRIDE; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void UpdateMenuItem(int command_id, 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool enabled, 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool hidden, 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& title) OVERRIDE; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual RenderViewHost* GetRenderViewHost() const OVERRIDE; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual WebContents* GetWebContents() const OVERRIDE; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual Profile* GetProfile() const OVERRIDE; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Attaches a RenderViewContextMenuObserver to be tested. 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetObserver(RenderViewContextMenuObserver* observer); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the number of items added by the test. 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t GetMenuSize() const; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the i-th item. 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool GetMenuItem(size_t i, MockMenuItem* item) const; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the writable profile used in this test. 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrefService* GetPrefs(); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // An observer used for initializing the status of menu items added in this 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // test. A test should delete this RenderViewContextMenuObserver object. 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewContextMenuObserver* observer_; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A dummy profile used in this test. Call GetPrefs() when a test needs to 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // change this profile and use PrefService methods. 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<TestingProfile> profile_; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A list of menu items added by the SpellingMenuObserver class. 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<MockMenuItem> items_; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(MockRenderViewContextMenu); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MockRenderViewContextMenu::MockRenderViewContextMenu() 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : observer_(NULL), 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_(new TestingProfile) { 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MockRenderViewContextMenu::~MockRenderViewContextMenu() { 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MockRenderViewContextMenu::AddMenuItem(int command_id, 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& title) { 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockMenuItem item; 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) item.command_id = command_id; 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) item.enabled = observer_->IsCommandIdEnabled(command_id); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) item.checked = false; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) item.hidden = false; 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) item.title = title; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) items_.push_back(item); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MockRenderViewContextMenu::AddCheckItem(int command_id, 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& title) { 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockMenuItem item; 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) item.command_id = command_id; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) item.enabled = observer_->IsCommandIdEnabled(command_id); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) item.checked = observer_->IsCommandIdChecked(command_id); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) item.hidden = false; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) item.title = title; 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) items_.push_back(item); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MockRenderViewContextMenu::AddSeparator() { 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockMenuItem item; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) item.command_id = -1; 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) item.enabled = false; 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) item.checked = false; 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) item.hidden = false; 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) items_.push_back(item); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MockRenderViewContextMenu::AddSubMenu(int command_id, 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& label, 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MenuModel* model) { 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockMenuItem item; 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) item.command_id = -1; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) item.enabled = false; 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) item.checked = false; 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) item.hidden = false; 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) items_.push_back(item); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MockRenderViewContextMenu::UpdateMenuItem(int command_id, 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool enabled, 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool hidden, 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& title) { 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (std::vector<MockMenuItem>::iterator it = items_.begin(); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it != items_.end(); ++it) { 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (it->command_id == command_id) { 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it->enabled = enabled; 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it->hidden = hidden; 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it->title = title; 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The SpellingMenuObserver class tries to change a menu item not added by the 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // class. This is an unexpected behavior and we should stop now. 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FAIL(); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderViewHost* MockRenderViewContextMenu::GetRenderViewHost() const { 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContents* MockRenderViewContextMenu::GetWebContents() const { 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Profile* MockRenderViewContextMenu::GetProfile() const { 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return profile_.get(); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)size_t MockRenderViewContextMenu::GetMenuSize() const { 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return items_.size(); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool MockRenderViewContextMenu::GetMenuItem(size_t i, 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockMenuItem* item) const { 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (i >= items_.size()) 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) item->command_id = items_[i].command_id; 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) item->enabled = items_[i].enabled; 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) item->checked = items_[i].checked; 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) item->hidden = items_[i].hidden; 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) item->title = items_[i].title; 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MockRenderViewContextMenu::SetObserver( 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewContextMenuObserver* observer) { 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observer_ = observer; 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PrefService* MockRenderViewContextMenu::GetPrefs() { 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return profile_->GetPrefs(); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A test class used in this file. This test should be a browser test because it 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// accesses resources. 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SpellingMenuObserverTest : public InProcessBrowserTest { 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SpellingMenuObserverTest(); 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void SetUpOnMainThread() OVERRIDE { 205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Reset(); 206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void CleanUpOnMainThread() OVERRIDE { 209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) observer_.reset(); 210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) menu_.reset(); 211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void Reset() { 214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) observer_.reset(); 215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) menu_.reset(new MockRenderViewContextMenu); 216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) observer_.reset(new SpellingMenuObserver(menu_.get())); 217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) menu_->SetObserver(observer_.get()); 218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void InitMenu(const char* word, const char* suggestion) { 221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::ContextMenuParams params; 222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) params.is_editable = true; 223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) params.misspelled_word = ASCIIToUTF16(word); 224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) params.dictionary_suggestions.clear(); 225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (suggestion) 226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) params.dictionary_suggestions.push_back(ASCIIToUTF16(suggestion)); 227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) observer_->InitMenu(params); 228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual ~SpellingMenuObserverTest(); 231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MockRenderViewContextMenu* menu() { return menu_.get(); } 232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpellingMenuObserver* observer() { return observer_.get(); } 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<SpellingMenuObserver> observer_; 235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<MockRenderViewContextMenu> menu_; 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(SpellingMenuObserverTest); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SpellingMenuObserverTest::SpellingMenuObserverTest() { 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SpellingMenuObserverTest::~SpellingMenuObserverTest() { 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that right-clicking a correct word does not add any items. 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SpellingMenuObserverTest, InitMenuWithCorrectWord) { 249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InitMenu("", NULL); 250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(static_cast<size_t>(0), menu()->GetMenuSize()); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that right-clicking a misspelled word adds four items: 254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// "No spelling suggestions", "Add to dictionary", "Ask Google for suggestions", 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and a separator. 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SpellingMenuObserverTest, InitMenuWithMisspelledWord) { 257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InitMenu("wiimode", NULL); 258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(static_cast<size_t>(4), menu()->GetMenuSize()); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Read all the context-menu items added by this test and verify they are 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // expected ones. We do not check the item titles to prevent resource changes 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // from breaking this test. (I think it is not expected by those who change 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // resources.) 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockRenderViewContextMenu::MockMenuItem item; 265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) menu()->GetMenuItem(0, &item); 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(IDC_CONTENT_CONTEXT_NO_SPELLING_SUGGESTIONS, item.command_id); 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(item.enabled); 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(item.hidden); 269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) menu()->GetMenuItem(1, &item); 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(IDC_SPELLCHECK_ADD_TO_DICTIONARY, item.command_id); 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(item.enabled); 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(item.hidden); 273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) menu()->GetMenuItem(2, &item); 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(IDC_CONTENT_CONTEXT_SPELLING_TOGGLE, item.command_id); 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(item.enabled); 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(item.checked); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(item.hidden); 278c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) menu()->GetMenuItem(3, &item); 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(-1, item.command_id); 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(item.enabled); 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(item.hidden); 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that right-clicking a correct word when we enable spelling-service 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// integration to verify an item "Ask Google for suggestions" is checked. Even 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// though this meanu itself does not add this item, its sub-menu adds the item 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and calls SpellingMenuObserver::IsChecked() to check it. 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SpellingMenuObserverTest, 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EnableSpellingServiceWithCorrectWord) { 290c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) menu()->GetPrefs()->SetBoolean(prefs::kSpellCheckUseSpellingService, true); 291c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InitMenu("", NULL); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE( 294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) observer()->IsCommandIdChecked(IDC_CONTENT_CONTEXT_SPELLING_TOGGLE)); 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that right-clicking a misspelled word when we enable spelling-service 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// integration to verify an item "Ask Google for suggestions" is checked. (This 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// test does not actually send JSON-RPC requests to the service because it makes 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// this test flaky.) 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SpellingMenuObserverTest, EnableSpellingService) { 302c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) menu()->GetPrefs()->SetBoolean(prefs::kSpellCheckUseSpellingService, true); 303c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) menu()->GetPrefs()->SetString(prefs::kSpellCheckDictionary, std::string()); 304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InitMenu("wiimode", NULL); 306c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(static_cast<size_t>(4), menu()->GetMenuSize()); 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // To avoid duplicates, this test reads only the "Ask Google for suggestions" 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // item and verifies it is enabled and checked. 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockRenderViewContextMenu::MockMenuItem item; 311c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) menu()->GetMenuItem(2, &item); 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(IDC_CONTENT_CONTEXT_SPELLING_TOGGLE, item.command_id); 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(item.enabled); 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(item.checked); 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(item.hidden); 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that there will be a separator after "no suggestions" if 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SpellingServiceClient::SUGGEST is on. 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SpellingMenuObserverTest, SeparatorAfterSuggestions) { 321c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) menu()->GetPrefs()->SetBoolean(prefs::kSpellCheckUseSpellingService, true); 3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CommandLine* command_line = CommandLine::ForCurrentProcess(); 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) command_line->AppendSwitch(switches::kUseSpellingSuggestions); 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Force a non-empty locale so SUGGEST is available. 326c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) menu()->GetPrefs()->SetString(prefs::kSpellCheckDictionary, "en"); 327c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(SpellingServiceClient::IsAvailable(menu()->GetProfile(), 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SpellingServiceClient::SUGGEST)); 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 330c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InitMenu("jhhj", NULL); 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 332c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The test should see a top separator, "No spelling suggestions", 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // "No more Google suggestions" (from SpellingService) and a separator 334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // as the first four items, then possibly more (not relevant here). 335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_LT(4U, menu()->GetMenuSize()); 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockRenderViewContextMenu::MockMenuItem item; 338c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) menu()->GetMenuItem(0, &item); 339c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(-1, item.command_id); 340c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(item.enabled); 341c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(item.hidden); 342c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) menu()->GetMenuItem(1, &item); 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(IDC_CONTENT_CONTEXT_SPELLING_SUGGESTION, item.command_id); 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(item.enabled); 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(item.hidden); 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 348c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) menu()->GetMenuItem(2, &item); 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(IDC_CONTENT_CONTEXT_NO_SPELLING_SUGGESTIONS, item.command_id); 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(item.enabled); 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(item.hidden); 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 353c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) menu()->GetMenuItem(3, &item); 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(-1, item.command_id); 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(item.enabled); 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(item.hidden); 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Test that we don't show "No more suggestions from Google" if the spelling 3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// service is enabled and that there is only one suggestion. 3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(SpellingMenuObserverTest, 3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NoMoreSuggestionsNotDisplayed) { 363c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) menu()->GetPrefs()->SetBoolean(prefs::kSpellCheckUseSpellingService, true); 3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Force a non-empty locale so SPELLCHECK is available. 366c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) menu()->GetPrefs()->SetString(prefs::kSpellCheckDictionary, "en"); 367c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(SpellingServiceClient::IsAvailable(menu()->GetProfile(), 3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SpellingServiceClient::SPELLCHECK)); 369c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InitMenu("asdfkj", "asdf"); 3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 371c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The test should see a separator, a suggestion and another separator 3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // as the first two items, then possibly more (not relevant here). 373c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_LT(3U, menu()->GetMenuSize()); 3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockRenderViewContextMenu::MockMenuItem item; 376c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) menu()->GetMenuItem(0, &item); 377c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(-1, item.command_id); 378c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(item.enabled); 379c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(item.hidden); 380c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 381c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) menu()->GetMenuItem(1, &item); 3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(IDC_SPELLCHECK_SUGGESTION_0, item.command_id); 3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(item.enabled); 3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(item.hidden); 3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 386c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) menu()->GetMenuItem(2, &item); 3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(-1, item.command_id); 3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(item.enabled); 3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(item.hidden); 3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Test that "Ask Google For Suggestions" is grayed out when using an 3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// off the record profile. 3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(rlp): Include graying out of autocorrect in this test when autocorrect 3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// is functional. 3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(SpellingMenuObserverTest, 3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NoSpellingServiceWhenOffTheRecord) { 398c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) menu()->GetProfile()->AsTestingProfile()->set_incognito(true); 3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This means spellchecking is allowed. Default is that the service is 4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // contacted but this test makes sure that if profile is incognito, that 4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // is not an option. 403c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) menu()->GetPrefs()->SetBoolean(prefs::kSpellCheckUseSpellingService, true); 4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Force a non-empty locale so SUGGEST normally would be available. 406c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) menu()->GetPrefs()->SetString(prefs::kSpellCheckDictionary, "en"); 407c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(SpellingServiceClient::IsAvailable(menu()->GetProfile(), 4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SpellingServiceClient::SUGGEST)); 409c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(SpellingServiceClient::IsAvailable(menu()->GetProfile(), 4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SpellingServiceClient::SPELLCHECK)); 4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 412c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InitMenu("sjxdjiiiiii", NULL); 4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The test should see "No spelling suggestions" (from system checker). 4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // They should not see "No more Google suggestions" (from SpellingService) or 4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // a separator. The next 2 items should be "Add to Dictionary" followed 4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // by "Ask Google for suggestions" which should be disabled. 4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(rlp): add autocorrect here when it is functional. 419c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_LT(3U, menu()->GetMenuSize()); 4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockRenderViewContextMenu::MockMenuItem item; 422c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) menu()->GetMenuItem(0, &item); 4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(IDC_CONTENT_CONTEXT_NO_SPELLING_SUGGESTIONS, item.command_id); 4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(item.enabled); 4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(item.hidden); 4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 427c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) menu()->GetMenuItem(1, &item); 4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(IDC_SPELLCHECK_ADD_TO_DICTIONARY, item.command_id); 4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(item.enabled); 4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(item.hidden); 4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 432c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) menu()->GetMenuItem(2, &item); 4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(IDC_CONTENT_CONTEXT_SPELLING_TOGGLE, item.command_id); 4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(item.enabled); 4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(item.hidden); 4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Set incognito back to false to allow appropriate test cleanup. 438c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) menu()->GetProfile()->AsTestingProfile()->set_incognito(false); 4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 441c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Test that the menu is preceeded by a separator if there are any suggestions, 442c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// or if the SpellingServiceClient is available 443c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(SpellingMenuObserverTest, SuggestionsForceTopSeparator) { 444c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) menu()->GetPrefs()->SetBoolean(prefs::kSpellCheckUseSpellingService, false); 445c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 446c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // First case: Misspelled word, no suggestions, no spellcheck service. 447c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InitMenu("asdfkj", NULL); 448c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // See SpellingMenuObserverTest.InitMenuWithMisspelledWord on why 4 items. 449c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(static_cast<size_t>(4), menu()->GetMenuSize()); 450c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MockRenderViewContextMenu::MockMenuItem item; 451c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) menu()->GetMenuItem(0, &item); 452c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_NE(-1, item.command_id); 453c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 454c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Case #2. Misspelled word, suggestions, no spellcheck service. 455c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Reset(); 456c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) menu()->GetPrefs()->SetBoolean(prefs::kSpellCheckUseSpellingService, false); 457c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InitMenu("asdfkj", "asdf"); 458c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 459c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Expect at least separator and 4 default entries. 460c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_LT(static_cast<size_t>(5), menu()->GetMenuSize()); 461c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // This test only cares that the first one is a separator. 462c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) menu()->GetMenuItem(0, &item); 463c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(-1, item.command_id); 464c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 465c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Case #3. Misspelled word, suggestion service is on. 466c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Reset(); 467c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) menu()->GetPrefs()->SetBoolean(prefs::kSpellCheckUseSpellingService, true); 468c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CommandLine* command_line = CommandLine::ForCurrentProcess(); 469c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) command_line->AppendSwitch(switches::kUseSpellingSuggestions); 470c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InitMenu("asdfkj", NULL); 471c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 472c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Should have at least 2 entries. Separator, suggestion. 473c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_LT(2U, menu()->GetMenuSize()); 474c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) menu()->GetMenuItem(0, &item); 475c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(-1, item.command_id); 476c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) menu()->GetMenuItem(1, &item); 477c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(IDC_CONTENT_CONTEXT_SPELLING_SUGGESTION, item.command_id); 478c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 479