| Index: chrome/browser/ui/webui/options/language_dictionary_interactive_uitest.cc
 | 
| diff --git a/chrome/browser/ui/webui/options/language_dictionary_interactive_uitest.cc b/chrome/browser/ui/webui/options/language_dictionary_interactive_uitest.cc
 | 
| deleted file mode 100644
 | 
| index dbdad4f2af14f11818419285aade8ff83f9ae2d3..0000000000000000000000000000000000000000
 | 
| --- a/chrome/browser/ui/webui/options/language_dictionary_interactive_uitest.cc
 | 
| +++ /dev/null
 | 
| @@ -1,255 +0,0 @@
 | 
| -// Copyright 2015 The Chromium Authors. All rights reserved.
 | 
| -// Use of this source code is governed by a BSD-style license that can be
 | 
| -// found in the LICENSE file.
 | 
| -
 | 
| -#include "base/macros.h"
 | 
| -#include "base/strings/stringprintf.h"
 | 
| -#include "base/test/scoped_feature_list.h"
 | 
| -#include "build/build_config.h"
 | 
| -#include "chrome/browser/chrome_notification_types.h"
 | 
| -#include "chrome/browser/ui/browser_window.h"
 | 
| -#include "chrome/browser/ui/chrome_pages.h"
 | 
| -#include "chrome/browser/ui/tabs/tab_strip_model.h"
 | 
| -#include "chrome/common/chrome_features.h"
 | 
| -#include "chrome/common/url_constants.h"
 | 
| -#include "chrome/test/base/in_process_browser_test.h"
 | 
| -#include "chrome/test/base/interactive_test_utils.h"
 | 
| -#include "content/public/test/browser_test_utils.h"
 | 
| -
 | 
| -namespace {
 | 
| -
 | 
| -// This class tests the language dictionary settings.
 | 
| -// This test is part of the interactive_ui_tests instead of browser_tests
 | 
| -// because it is necessary to emulate pushing the tab key.
 | 
| -class LanguageDictionaryWebUITest : public InProcessBrowserTest {
 | 
| - public:
 | 
| -  LanguageDictionaryWebUITest() {}
 | 
| -
 | 
| -  // Navigate to the editDictionary page.
 | 
| -  void SetUpOnMainThread() override {
 | 
| -    disable_md_settings_.InitAndDisableFeature(
 | 
| -        features::kMaterialDesignSettings);
 | 
| -    const GURL url = chrome::GetSettingsUrl("editDictionary");
 | 
| -    ui_test_utils::NavigateToURL(browser(), url);
 | 
| -  }
 | 
| -
 | 
| - protected:
 | 
| -  const std::string kDictionaryListSelector =
 | 
| -      "#language-dictionary-overlay-word-list";
 | 
| -
 | 
| -  content::RenderFrameHost* GetActiveFrame() {
 | 
| -    return GetActiveWebContents()->GetFocusedFrame();
 | 
| -  }
 | 
| -
 | 
| -  content::RenderViewHost* GetRenderViewHost() {
 | 
| -    return GetActiveWebContents()->GetRenderViewHost();
 | 
| -  }
 | 
| -
 | 
| -  content::WebContents* GetActiveWebContents() {
 | 
| -    return browser()->tab_strip_model()->GetActiveWebContents();
 | 
| -  }
 | 
| -
 | 
| -  // Add a few test words to the dictionary.
 | 
| -  void SetTestWords(const std::string& list_selector) {
 | 
| -    const std::string script = base::StringPrintf(
 | 
| -        "document.querySelector('%s').setWordList(['cat', 'dog', 'bird']);",
 | 
| -        list_selector.c_str());
 | 
| -    EXPECT_TRUE(content::ExecuteScript(GetActiveFrame(), script));
 | 
| -    // Expected list size is 4: 3 word items + 1 placeholder.
 | 
| -    EXPECT_EQ(4, GetListSize(list_selector));
 | 
| -  }
 | 
| -
 | 
| -  // Returns the number of items in the list.
 | 
| -  int GetListSize(const std::string& list_selector) {
 | 
| -    const std::string script = base::StringPrintf(
 | 
| -        "domAutomationController.send("
 | 
| -        "document.querySelector('%s').items.length);",
 | 
| -        list_selector.c_str());
 | 
| -    int length = -1;
 | 
| -    EXPECT_TRUE(content::ExecuteScriptAndExtractInt(
 | 
| -        GetActiveFrame(),
 | 
| -        script,
 | 
| -        &length));
 | 
| -    return length;
 | 
| -  }
 | 
| -
 | 
| -  // Returns true if element contains document.activeElement.
 | 
| -  bool ContainsActiveElement(const std::string& element_selector) {
 | 
| -    const std::string script = base::StringPrintf(
 | 
| -        "domAutomationController.send("
 | 
| -        "document.querySelector('%s').contains(document.activeElement));",
 | 
| -        element_selector.c_str());
 | 
| -    bool result;
 | 
| -    EXPECT_TRUE(content::ExecuteScriptAndExtractBool(
 | 
| -        GetActiveFrame(),
 | 
| -        script,
 | 
| -        &result));
 | 
| -    return result;
 | 
| -  }
 | 
| -
 | 
| -  // Returns true if list item[|index|] contains document.activeElement.
 | 
| -  bool ListItemContainsActiveElement(const std::string& list_selector,
 | 
| -                                     int index) {
 | 
| -    EXPECT_GE(index, 0);
 | 
| -    // EXPECT_TRUE will fail if index is out of bounds.
 | 
| -    const std::string script = base::StringPrintf(
 | 
| -        "domAutomationController.send("
 | 
| -        "document.querySelector('%s').items[%d].contains("
 | 
| -        "document.activeElement));",
 | 
| -        list_selector.c_str(),
 | 
| -        index);
 | 
| -    bool result;
 | 
| -    EXPECT_TRUE(content::ExecuteScriptAndExtractBool(
 | 
| -        GetActiveFrame(),
 | 
| -        script,
 | 
| -        &result));
 | 
| -    return result;
 | 
| -  }
 | 
| -
 | 
| -  // Returns true if list item[|index|] has 'selected' attribute.
 | 
| -  bool ListItemSelected(const std::string& list_selector, int index) {
 | 
| -    EXPECT_GE(index, 0);
 | 
| -    // EXPECT_TRUE will fail if index is out of bounds.
 | 
| -    const std::string script = base::StringPrintf(
 | 
| -        "domAutomationController.send("
 | 
| -        "document.querySelector('%s').items[%d].hasAttribute('selected'));",
 | 
| -        list_selector.c_str(),
 | 
| -        index);
 | 
| -    bool result = false;
 | 
| -    EXPECT_TRUE(content::ExecuteScriptAndExtractBool(
 | 
| -        GetActiveFrame(),
 | 
| -        script,
 | 
| -        &result));
 | 
| -    return result;
 | 
| -  }
 | 
| -
 | 
| -  // Returns true if list item[|index|] has 'selected' attribute and contains
 | 
| -  // document.activeElement.
 | 
| -  bool ListItemSelectedAndFocused(const std::string& list_selector,
 | 
| -                                  int index) {
 | 
| -    EXPECT_GE(index, 0);
 | 
| -    return ListItemSelected(list_selector, index) &&
 | 
| -           ListItemContainsActiveElement(list_selector, index);
 | 
| -  }
 | 
| -
 | 
| -  // Press and release a key in the browser. This will wait for the element on
 | 
| -  // the page to change.
 | 
| -  bool PressKey(ui::KeyboardCode key_code, bool shift) {
 | 
| -    return ui_test_utils::SendKeyPressAndWait(
 | 
| -        browser(),
 | 
| -        key_code,
 | 
| -        false,
 | 
| -        shift,
 | 
| -        false,
 | 
| -        false,
 | 
| -        content::NOTIFICATION_FOCUS_CHANGED_IN_PAGE,
 | 
| -        content::Source<content::RenderViewHost>(GetRenderViewHost()));
 | 
| -  }
 | 
| -
 | 
| -  void InitializeDomMessageQueue() {
 | 
| -    dom_message_queue_.reset(new content::DOMMessageQueue);
 | 
| -  }
 | 
| -
 | 
| -  // Wait for a message from the DOM automation controller.
 | 
| -  void WaitForDomMessage(const std::string& message) {
 | 
| -    const std::string expected = "\"" + message + "\"";
 | 
| -    std::string received;
 | 
| -    do {
 | 
| -      ASSERT_TRUE(dom_message_queue_->WaitForMessage(&received));
 | 
| -    } while (received != expected);
 | 
| -  }
 | 
| -
 | 
| -  // Add a JavaScript event listener to send a DOM automation controller message
 | 
| -  // whenever the |selected| property of the list item changes.
 | 
| -  void ListenForItemSelectedChange(const std::string& list_selector,
 | 
| -                                   int index) {
 | 
| -    EXPECT_GE(index, 0);
 | 
| -    // EXPECT_TRUE will fail if index is out of bounds.
 | 
| -    const std::string script = base::StringPrintf(
 | 
| -        "document.querySelector('%s').items[%d].addEventListener("
 | 
| -            "'selectedChange', function() {"
 | 
| -              "domAutomationController.setAutomationId(0);"
 | 
| -              "domAutomationController.send('selected=' + this.selected);"
 | 
| -            "});",
 | 
| -        list_selector.c_str(),
 | 
| -        index);
 | 
| -
 | 
| -    EXPECT_TRUE(content::ExecuteScript(
 | 
| -        GetActiveFrame(),
 | 
| -        script));
 | 
| -  }
 | 
| -
 | 
| - private:
 | 
| -  std::unique_ptr<content::DOMMessageQueue> dom_message_queue_;
 | 
| -  base::test::ScopedFeatureList disable_md_settings_;
 | 
| -
 | 
| -  DISALLOW_COPY_AND_ASSIGN(LanguageDictionaryWebUITest);
 | 
| -};
 | 
| -
 | 
| -}  // namespace
 | 
| -
 | 
| -// Test InlineEditableItemList keyboard focus behavior in editDictionary
 | 
| -// overlay.
 | 
| -// editDictionary overlay doesn't exist on OSX so disable it there.
 | 
| -#if !defined(OS_MACOSX)
 | 
| -
 | 
| -// Crashes on Win 7. http://crbug.com/500609
 | 
| -#if defined(OS_WIN)
 | 
| -#define MAYBE_TestListKeyboardFocus DISABLED_TestListKeyboardFocus
 | 
| -#else
 | 
| -#define MAYBE_TestListKeyboardFocus TestListKeyboardFocus
 | 
| -#endif
 | 
| -
 | 
| -IN_PROC_BROWSER_TEST_F(LanguageDictionaryWebUITest,
 | 
| -                       MAYBE_TestListKeyboardFocus) {
 | 
| -  const std::string list_selector = kDictionaryListSelector;
 | 
| -
 | 
| -  // Populate the list with some test words.
 | 
| -  SetTestWords(list_selector);
 | 
| -  int placeholder_index = GetListSize(list_selector) - 1;
 | 
| -
 | 
| -  // Listen for changes of the placeholder item's |selected| property so that
 | 
| -  // test can wait until change has taken place after key press before
 | 
| -  // continuing.
 | 
| -  InitializeDomMessageQueue();
 | 
| -  ListenForItemSelectedChange(list_selector, placeholder_index);
 | 
| -
 | 
| -  // Press tab to focus the placeholder.
 | 
| -  PressKey(ui::VKEY_TAB, false);
 | 
| -
 | 
| -  // Wait for placeholder item to become selected.
 | 
| -  WaitForDomMessage("selected=true");
 | 
| -
 | 
| -  // Verify that the placeholder is selected and has focus.
 | 
| -  EXPECT_TRUE(ListItemSelectedAndFocused(list_selector, placeholder_index));
 | 
| -
 | 
| -  // Press up arrow to select item above the placeholder.
 | 
| -  PressKey(ui::VKEY_UP, false);
 | 
| -
 | 
| -  // Wait for placeholder to become unselected.
 | 
| -  WaitForDomMessage("selected=false");
 | 
| -
 | 
| -  // Verify that the placeholder is no longer selected.
 | 
| -  EXPECT_FALSE(ListItemSelected(list_selector, placeholder_index));
 | 
| -
 | 
| -  // Verify that the item above the placeholder is selected and has focus.
 | 
| -  EXPECT_TRUE(ListItemSelectedAndFocused(list_selector,
 | 
| -                                         placeholder_index - 1));
 | 
| -
 | 
| -  // Press tab to leave the list.
 | 
| -  PressKey(ui::VKEY_TAB, false);
 | 
| -
 | 
| -  // Verify that focus has left the list.
 | 
| -  EXPECT_FALSE(ContainsActiveElement(list_selector));
 | 
| -
 | 
| -  // Verify that the item above the placeholder is still selected.
 | 
| -  EXPECT_TRUE(ListItemSelected(list_selector, placeholder_index - 1));
 | 
| -
 | 
| -  // Press shift+tab to go back to the list.
 | 
| -  PressKey(ui::VKEY_TAB, true);
 | 
| -
 | 
| -  // Verify that the item above the placeholder is selected and has focus.
 | 
| -  EXPECT_TRUE(ListItemSelectedAndFocused(list_selector,
 | 
| -                                         placeholder_index - 1));
 | 
| -}
 | 
| -#endif  // !defined(OS_MACOSX)
 | 
| 
 |