// Copyright 2014 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 test fixture.
GEN_INCLUDE(['../../testing/chromevox_next_e2e_test_base.js',
             '../../testing/assert_additions.js']);

GEN_INCLUDE(['../../testing/mock_feedback.js']);

/**
 * Test fixture for Background.
 * @constructor
 * @extends {ChromeVoxNextE2ETest}
 */
function BackgroundTest() {
  ChromeVoxNextE2ETest.call(this);
}

BackgroundTest.prototype = {
  __proto__: ChromeVoxNextE2ETest.prototype,

  /** @override */
  setUp: function() {
    window.RoleType = chrome.automation.RoleType;
    window.doCmd = this.doCmd;

    // Reset notifications so only explicit mode changes can cause them to trigger.
    Notifications.reset();
    this.forceContextualLastOutput();
  },

  /**
   * @return {!MockFeedback}
   */
  createMockFeedback: function() {
    var mockFeedback = new MockFeedback(this.newCallback(),
                                        this.newCallback.bind(this));
    mockFeedback.install();
    return mockFeedback;
  },

  /**
   * Create a function which perform the command |cmd|.
   * @param {string} cmd
   * @return {function() : void}
   */
  doCmd: function(cmd) {
    return function() {
      CommandHandler.onCommand(cmd);
    };
  },

  linksAndHeadingsDoc: function() {/*!
    <p>start</p>
    <a href='#a'>alpha</a>
    <a href='#b'>beta</a>
    <p>
      <h1>charlie</h1>
      <a href='foo'>delta</a>
    </p>
    <a href='#bar'>echo</a>
    <h2>foxtraut</h2>
    <p>end<span>of test</span></p>
  */},

  buttonDoc: function() {/*!
    <p>start</p>
    <button>hello button one</button>
    cats
    <button>hello button two</button>
    <p>end</p>
  */},

  formsDoc: function() {/*!
    <select id="fruitSelect">
      <option>apple</option>
      <option>grape</option>
      <option> banana</option>
    </select>
  */},

  iframesDoc: function() {/*!
    <p>start</p>
    <button>Before</button>
    <iframe srcdoc="<button>Inside</button><h1>Inside</h1>"></iframe>
    <button>After</button>
  */},

  disappearingObjectDoc: function() {/*!
    <p>start</p>
    <div role="group">
      <p>Before1</p>
      <p>Before2</p>
      <p>Before3</p>
    </div>
    <div role="group">
      <p id="disappearing">Disappearing</p>
    </div>
    <div role="group">
      <p>After1</p>
      <p>After2</p>
      <p>After3</p>
    </div>
    <div id="live" aria-live="polite"></div>
    <div id="delete" role="button">Delete</div>
    <script>
      document.getElementById('delete').addEventListener('click', function() {
        var d = document.getElementById('disappearing');
        d.parentElement.removeChild(d);
        document.getElementById('live').innerText = 'Deleted';
      });
    </script>
  */},
};

/** Tests that ChromeVox classic is in this context. */
SYNC_TEST_F('BackgroundTest', 'ClassicNamespaces', function() {
  assertEquals('object', typeof(cvox));
  assertEquals('function', typeof(cvox.ChromeVoxBackground));
});

/** Tests that ChromeVox next is in this context. */
SYNC_TEST_F('BackgroundTest', 'NextNamespaces', function() {
  assertEquals('function', typeof(Background));
});

/** Tests consistency of navigating forward and backward. */
TEST_F('BackgroundTest', 'ForwardBackwardNavigation', function() {
  var mockFeedback = this.createMockFeedback();
  this.runWithLoadedTree(this.linksAndHeadingsDoc, function() {
    mockFeedback.expectSpeech('start').expectBraille('start');

    mockFeedback.call(doCmd('nextLink'))
        .expectSpeech('alpha', 'Link')
        .expectBraille('alpha lnk');
    mockFeedback.call(doCmd('nextLink'))
        .expectSpeech('beta', 'Link')
        .expectBraille('beta lnk');
    mockFeedback.call(doCmd('nextLink'))
        .expectSpeech('delta', 'Link')
        .expectBraille('delta lnk');
    mockFeedback.call(doCmd('previousLink'))
        .expectSpeech('beta', 'Link')
        .expectBraille('beta lnk');
    mockFeedback.call(doCmd('nextHeading'))
        .expectSpeech('charlie', 'Heading 1')
        .expectBraille('charlie h1');
    mockFeedback.call(doCmd('nextHeading'))
        .expectSpeech('foxtraut', 'Heading 2')
        .expectBraille('foxtraut h2');
    mockFeedback.call(doCmd('previousHeading'))
        .expectSpeech('charlie', 'Heading 1')
        .expectBraille('charlie h1');

    mockFeedback.call(doCmd('nextObject'))
        .expectSpeech('delta', 'Link')
        .expectBraille('delta lnk');
    mockFeedback.call(doCmd('nextObject'))
        .expectSpeech('echo', 'Link')
        .expectBraille('echo lnk');
    mockFeedback.call(doCmd('nextObject'))
        .expectSpeech('foxtraut', 'Heading 2')
        .expectBraille('foxtraut h2');
    mockFeedback.call(doCmd('nextObject'))
        .expectSpeech('end')
        .expectBraille('end');
    mockFeedback.call(doCmd('previousObject'))
        .expectSpeech('foxtraut', 'Heading 2')
        .expectBraille('foxtraut h2');
    mockFeedback.call(doCmd('nextLine'))
        .expectSpeech('end', 'of test')
        .expectBraille('endof test');

    mockFeedback.call(doCmd('jumpToTop'))
        .expectSpeech('start')
        .expectBraille('start');
    mockFeedback.call(doCmd('jumpToBottom'))
        .expectSpeech('of test')
        .expectBraille('of test');

    mockFeedback.replay();
  });
});

TEST_F('BackgroundTest', 'CaretNavigation', function() {
  // TODO(plundblad): Add braille expectaions when crbug.com/523285 is fixed.
  var mockFeedback = this.createMockFeedback();
  this.runWithLoadedTree(this.linksAndHeadingsDoc, function() {
    mockFeedback.expectSpeech('start');
    mockFeedback.call(doCmd('nextCharacter'))
        .expectSpeech('t');
    mockFeedback.call(doCmd('nextCharacter'))
        .expectSpeech('a');
    mockFeedback.call(doCmd('nextWord'))
        .expectSpeech('alpha', 'Link');
    mockFeedback.call(doCmd('nextWord'))
        .expectSpeech('beta', 'Link');
    mockFeedback.call(doCmd('previousWord'))
        .expectSpeech('alpha', 'Link');
    mockFeedback.call(doCmd('nextWord'))
        .expectSpeech('beta', 'Link');
    mockFeedback.call(doCmd('nextWord'))
        .expectSpeech('charlie', 'Heading 1');
    mockFeedback.call(doCmd('nextLine'))
        .expectSpeech('delta', 'Link');
    mockFeedback.call(doCmd('nextLine'))
        .expectSpeech('echo', 'Link');
    mockFeedback.call(doCmd('nextLine'))
        .expectSpeech('foxtraut', 'Heading 2');
    mockFeedback.call(doCmd('nextLine'))
        .expectSpeech('end', 'of test');
    mockFeedback.call(doCmd('nextCharacter'))
        .expectSpeech('n');
    mockFeedback.call(doCmd('previousCharacter'))
        .expectSpeech('e');
    mockFeedback.call(doCmd('previousCharacter'))
        .expectSpeech('t', 'Heading 2');
    mockFeedback.call(doCmd('previousWord'))
        .expectSpeech('foxtraut');
    mockFeedback.call(doCmd('previousWord'))
        .expectSpeech('echo', 'Link');
    mockFeedback.call(doCmd('previousCharacter'))
        .expectSpeech('a', 'Link');
    mockFeedback.call(doCmd('previousCharacter'))
        .expectSpeech('t');
    mockFeedback.call(doCmd('nextWord'))
        .expectSpeech('echo', 'Link');
    mockFeedback.replay();
  });
});

/** Tests that individual buttons are stops for move-by-word functionality. */
TEST_F('BackgroundTest', 'CaretNavigationTreatsButtonAsWord', function() {
  var mockFeedback = this.createMockFeedback();
  this.runWithLoadedTree(this.buttonDoc, function() {
    mockFeedback.expectSpeech('start');
    mockFeedback.call(doCmd('nextWord'))
        .expectSpeech('hello button one', 'Button');
    mockFeedback.call(doCmd('nextWord'))
        .expectSpeech('cats');
    mockFeedback.call(doCmd('nextWord'))
        .expectSpeech('hello button two', 'Button');
    mockFeedback.call(doCmd('nextWord'))
        .expectSpeech('end');
    mockFeedback.call(doCmd('previousWord'))
        .expectSpeech('hello button two', 'Button');
    mockFeedback.call(doCmd('previousWord'))
        .expectSpeech('cats');
    mockFeedback.call(doCmd('previousWord'))
        .expectSpeech('hello button one', 'Button');
    mockFeedback.replay();
  });
});

TEST_F('BackgroundTest', 'SelectSingleBasic', function() {
  var mockFeedback = this.createMockFeedback();
  this.runWithLoadedTree(this.formsDoc, function() {
    var incrementSelectedIndex =
        this.incrementSelectedIndex.bind(this, undefined, '#fruitSelect');
    mockFeedback.expectSpeech('apple', 'has pop up', 'Collapsed')
        .expectBraille('apple btn +popup +')
        .call(incrementSelectedIndex)
        .expectSpeech('grape', /2 of 3/)
        .expectBraille('grape mnuitm 2/3 (x)')
        .call(incrementSelectedIndex)
        .expectSpeech('banana', /3 of 3/)
        .expectBraille('banana mnuitm 3/3 (x)');
    mockFeedback.replay();
  });
});

TEST_F('BackgroundTest', 'ContinuousRead', function() {
  var mockFeedback = this.createMockFeedback();
  this.runWithLoadedTree(this.linksAndHeadingsDoc, function() {
    mockFeedback.expectSpeech('start')
        .call(doCmd('readFromHere'))
        .expectSpeech(
            'start',
            'alpha', 'Link',
            'beta', 'Link',
            'charlie', 'Heading 1');
    mockFeedback.replay();
  });
});

TEST_F('BackgroundTest', 'InitialFocus', function() {
  var mockFeedback = this.createMockFeedback();
  this.runWithLoadedTree('<a href="a">a</a>',
    function(rootNode) {
      mockFeedback.expectSpeech('a')
          .expectSpeech('Link');
      mockFeedback.replay();
    });
});

TEST_F('BackgroundTest', 'AriaLabel', function() {
  var mockFeedback = this.createMockFeedback();
  this.runWithLoadedTree('<a aria-label="foo" href="a">a</a>',
    function(rootNode) {
      rootNode.find({role: RoleType.LINK}).focus();
      mockFeedback.expectSpeech('foo')
          .expectSpeech('Link')
          .expectBraille('foo lnk');
      mockFeedback.replay();
    }
  );
});

TEST_F('BackgroundTest', 'ShowContextMenu', function() {
  var mockFeedback = this.createMockFeedback();
  this.runWithLoadedTree('<p>before</p><a href="a">a</a>',
    function(rootNode) {
      var go = rootNode.find({ role: RoleType.LINK });
      // Menus no longer nest a message loop, so we can launch menu and confirm
      // expected speech. The menu will not block test shutdown.
      mockFeedback.call(go.focus.bind(go))
          .expectSpeech('a', 'Link')
          .call(doCmd('contextMenu'))
          .expectSpeech(/menu opened/);
      mockFeedback.replay();
    }.bind(this));
});

TEST_F('BackgroundTest', 'BrailleRouting', function() {
  var mockFeedback = this.createMockFeedback();
  var route = function(position) {
    assertTrue(ChromeVoxState.instance.onBrailleKeyEvent(
        {command: cvox.BrailleKeyCommand.ROUTING,
         displayPosition: position},
        mockFeedback.lastMatchedBraille));
  };
  this.runWithLoadedTree(
      function() {/*!
        <p>start</p>
        <button id="btn1">Click me</button>
        <p>Some text</p>
        <button id="btn2">Focus me</button>
        <p>Some more text</p>
        <input type="text" id ="text" value="Edit me">
        <script>
          document.getElementById('btn1').addEventListener('click', function() {
            document.getElementById('btn2').focus();
          }, false);
        </script>
      */},
      function(rootNode) {
        var button1 = rootNode.find({role: RoleType.BUTTON,
                                     attributes: { name: 'Click me' }});
        var textField = rootNode.find(
            {role: RoleType.TEXT_FIELD});
        mockFeedback.expectBraille('start')
            .call(button1.focus.bind(button1))
            .expectBraille(/^Click me btn/)
            .call(route.bind(null, 5))
            .expectBraille(/Focus me btn/)
            .call(textField.focus.bind(textField))
            .expectBraille('Edit me ed', {startIndex: 0})
            .call(route.bind(null, 3))
            .expectBraille('Edit me ed', {startIndex: 3})
            .call(function() {
              assertEquals(3, textField.textSelStart);
            });
        mockFeedback.replay();
      });
});

TEST_F('BackgroundTest', 'FocusInputElement', function() {
  var mockFeedback = this.createMockFeedback();
  this.runWithLoadedTree(
    function() {/*!
      <input id="name" value="Lancelot">
      <input id="quest" value="Grail">
      <input id="color" value="Blue">
    */},
    function(rootNode) {
      var name = rootNode.find({ attributes: { value: 'Lancelot' } });
      var quest = rootNode.find({ attributes: { value: 'Grail' } });
      var color = rootNode.find({ attributes: { value: 'Blue' } });

      mockFeedback.call(quest.focus.bind(quest))
          .expectSpeech('Grail', 'Edit text')
          .call(color.focus.bind(color))
          .expectSpeech('Blue', 'Edit text')
          .call(name.focus.bind(name))
          .expectNextSpeechUtteranceIsNot('Blue')
          .expectSpeech('Lancelot', 'Edit text');
      mockFeedback.replay();
    }.bind(this));
});

// Flaky, see http://crbug.com/643902.
TEST_F('BackgroundTest', 'DISABLED_UseEditableState', function() {
  this.runWithLoadedTree(
    function() {/*!
      <input type="text"></input>
      <p tabindex=0>hi</p>
    */},
    function(rootNode) {
      var assertExists = this.newCallback(function (evt) {
        assertNotNullNorUndefined(
            ChromeVoxState.desktopAutomationHandler.textEditHandler_);
        evt.stopPropagation();
      });
      var assertDoesntExist = this.newCallback(function (evt) {
        assertTrue(
            !ChromeVoxState.desktopAutomationHandler.editableTextHandler_);
        evt.stopPropagation();

        // Focus the other text field here to make this test not racey.
        editable.focus();
      });

      var editable = rootNode.find({ role: RoleType.TEXT_FIELD });
      var nonEditable = rootNode.find({ role: RoleType.PARAGRAPH });

      this.listenOnce(nonEditable, 'focus', assertDoesntExist);
      this.listenOnce(editable, 'focus', assertExists);

      nonEditable.focus();
    }.bind(this));
});

TEST_F('BackgroundTest', 'EarconsForControls', function() {
  var mockFeedback = this.createMockFeedback();
  this.runWithLoadedTree(
    function() {/*!
      <p>Initial focus will be on something that's not a control.</p>
      <a href="#">MyLink</a>
      <button>MyButton</button>
      <input type=checkbox>
      <input type=checkbox checked>
      <input>
      <select multiple><option>1</option></select>
      <select><option>2</option></select>
      <input type=range value=5>
    */},
    function(rootNode) {
      mockFeedback.call(doCmd('nextObject'))
          .expectSpeech('MyLink')
          .expectEarcon(cvox.Earcon.LINK)
          .call(doCmd('nextObject'))
          .expectSpeech('MyButton')
          .expectEarcon(cvox.Earcon.BUTTON)
          .call(doCmd('nextObject'))
          .expectSpeech('Check box')
          .expectEarcon(cvox.Earcon.CHECK_OFF)
          .call(doCmd('nextObject'))
          .expectSpeech('Check box')
          .expectEarcon(cvox.Earcon.CHECK_ON)
          .call(doCmd('nextObject'))
          .expectSpeech('Edit text')
          .expectEarcon(cvox.Earcon.EDITABLE_TEXT)
          .call(doCmd('nextObject'))
          .expectSpeech('List box')
          .expectEarcon(cvox.Earcon.LISTBOX)
          .call(doCmd('nextObject'))
          .expectSpeech('Button', 'has pop up')
          .expectEarcon(cvox.Earcon.POP_UP_BUTTON)
          .call(doCmd('nextObject'))
          .expectSpeech(/Slider/)
          .expectEarcon(cvox.Earcon.SLIDER);

      mockFeedback.replay();
    }.bind(this));
});

TEST_F('BackgroundTest', 'ToggleChromeVoxVersion', function() {
  var mockFeedback = this.createMockFeedback();
  this.runWithLoadedTree(this.linksAndHeadingsDoc, function() {
    var gotCmd = CommandHandler.onCommand;

    // The command came from the background keyboard handler.
    var togglerFromBackground = gotCmd.bind(gotCmd, 'toggleChromeVoxVersion');

    // The command came from a content script.
    var togglerFromContent = gotCmd.bind(gotCmd, 'toggleChromeVoxVersion',
                                         true);

    mockFeedback.call(togglerFromBackground)
        .expectSpeech('Switched to Classic ChromeVox')
        .call(togglerFromContent)
        .expectSpeech('Switched to ChromeVox Next')
        .call(togglerFromBackground)
        .expectSpeech('Switched to Classic ChromeVox');
    mockFeedback.replay();
  });
});

SYNC_TEST_F('BackgroundTest', 'GlobsToRegExp', function() {
  assertEquals('/^()$/', Background.globsToRegExp_([]).toString());
  assertEquals(
      '/^(http:\\/\\/host\\/path\\+here)$/',
      Background.globsToRegExp_(['http://host/path+here']).toString());
  assertEquals(
      '/^(url1.*|u.l2|.*url3)$/',
      Background.globsToRegExp_(['url1*', 'u?l2', '*url3']).toString());
});

// Flaky, see http://crbug.com/635032
TEST_F('BackgroundTest', 'DISABLED_ActiveOrInactive', function() {
  var mockFeedback = this.createMockFeedback();
  this.runWithLoadedTree(function() {/*!
      <a href="a">a</a>
      <button>b</button>
      <input type="text"></input>
    */},
    function(rootNode) {
      var focusButton = function() {
        rootNode.find({role: RoleType.BUTTON}).focus();
      };
      var on = function() { cvox.ChromeVox.isActive = true; };
      var off = function() { cvox.ChromeVox.isActive = false; };

      function focusThen(toFocus, then) {
        toFocus.addEventListener('focus', function innerFocus(e) {
          if (e.target != toFocus)
            return;
          rootNode.removeEventListener('focus', innerFocus, true);
          then && then();
        }, true);
        toFocus.focus();
      }

      mockFeedback.call(focusButton)
          .expectSpeech('b').expectSpeech('Button')
          .call(off)
          .call(focusThen.bind(this, rootNode.find(
              { role: RoleType.LINK }), on))
          .call(focusThen.bind(this, rootNode.find(
              { role: RoleType.TEXT_FIELD })))
          .expectNextSpeechUtteranceIsNot('a')
          .expectSpeech('Edit text');

      mockFeedback.replay();
    });
});

TEST_F('BackgroundTest', 'ModeSwitching', function() {
  this.runWithLoadedTree('<button></button>', function(root) {
    var fakeDesktop = {};
    fakeDesktop.role = 'desktop';
    fakeDesktop.root = fakeDesktop;

    var fakeWebRoot = {};
    fakeWebRoot.root = fakeWebRoot;
    fakeWebRoot.parent = fakeDesktop;
    fakeWebRoot.role = RoleType.ROOT_WEB_AREA;
    fakeWebRoot.makeVisible = function() {};
    fakeWebRoot.location = {left: 1, top: 1, width: 1, height: 1};
    var fakeSubRoot = {};
    fakeSubRoot.root = fakeSubRoot;
    fakeSubRoot.parent = fakeWebRoot;
    fakeSubRoot.role = RoleType.ROOT_WEB_AREA;
    fakeSubRoot.makeVisible = function() {};
    fakeSubRoot.location = {left: 1, top: 1, width: 1, height: 1};
    var bk = ChromeVoxState.instance;

    // Tests default to force next mode.
    assertEquals('force_next', bk.mode);

    // Force next mode stays set regardless of where the range lands.
    fakeWebRoot.docUrl = 'http://google.com';
    bk.setCurrentRange(cursors.Range.fromNode(fakeWebRoot));
    assertEquals('force_next', bk.mode);
    // Empty urls occur before document load or when root is desktop.
    fakeWebRoot.docUrl = '';
    bk.setCurrentRange(cursors.Range.fromNode(fakeWebRoot));
    assertEquals('force_next', bk.mode);

    // Verify force next -> classic compat switching.
    localStorage['useClassic'] = true;
    fakeWebRoot.docUrl = 'chrome://foobar';
    bk.setCurrentRange(cursors.Range.fromNode(fakeWebRoot));
    assertEquals('classic_compat', bk.mode);

    // Classic compat -> classic.
    fakeWebRoot.docUrl = 'http://google.com';
    bk.setCurrentRange(cursors.Range.fromNode(fakeWebRoot));
    assertEquals('classic', bk.mode);

    // Ensure we switch to classic compat if our current range has focused
    // state set and is not in web content.
    assertTrue(root.parent.state.focused);
    bk.setCurrentRange(cursors.Range.fromNode(root.parent));
    assertEquals('classic_compat', bk.mode);

    // And back to classic.
    bk.setCurrentRange(cursors.Range.fromNode(root));
    assertEquals('classic', bk.mode);

    // Now, verify mode switching uses the top level root.
    fakeWebRoot.docUrl = 'http://google.com/#chromevox_next_test';
    fakeSubRoot.docUrl = 'http://chromevox.com';
    bk.setCurrentRange(cursors.Range.fromNode(fakeWebRoot));
    assertEquals('next', bk.mode);

    // Next compat switching.
    localStorage['useClassic'] = false;
    fakeWebRoot.docUrl = 'http://docs.google.com/document/#123123';
    bk.setCurrentRange(cursors.Range.fromNode(fakeWebRoot));
    assertEquals('force_next', bk.mode);

    // And, back to force next.
    fakeWebRoot.docUrl = 'http://docs.google.com/form/123';
    bk.setCurrentRange(cursors.Range.fromNode(fakeWebRoot));
    assertEquals('force_next', bk.mode);
  }.bind(this));
});

TEST_F('BackgroundTest', 'ShouldNotFocusIframe', function() {
  this.runWithLoadedTree(  function() {/*!
    <iframe tabindex=0 src="data:text/html,<p>Inside</p>"></iframe>
    <button>outside</button>
  */}, function(root) {
    var iframe = root.find({role: RoleType.IFRAME});
    var button = root.find({role: RoleType.BUTTON});

    assertEquals('iframe', iframe.role);
    assertEquals('button', button.role);

    var didFocus = false;
    iframe.addEventListener('focus', function() {
      didFocus = true;
    });
    var b = ChromeVoxState.instance;
    b.currentRange_ = cursors.Range.fromNode(button);
    doCmd('previousElement');
    assertFalse(didFocus);
  }.bind(this));
});

TEST_F('BackgroundTest', 'ShouldFocusLink', function() {
  this.runWithLoadedTree(  function() {/*!
    <div><a href="#">mylink</a></div>
    <button>after</button>
  */}, function(root) {
    var link = root.find({role: RoleType.LINK});
    var button = root.find({role: RoleType.BUTTON});

    assertEquals('link', link.role);
    assertEquals('button', button.role);

    var didFocus = false;
    link.addEventListener('focus', this.newCallback(function() {
      // Success
    }));
    var b = ChromeVoxState.instance;
    b.currentRange_ = cursors.Range.fromNode(button);
    doCmd('previousElement');
  });
});

TEST_F('BackgroundTest', 'NoisySlider', function() {
  var mockFeedback = this.createMockFeedback();
  this.runWithLoadedTree(  function() {/*!
    <button id="go">go</button>
    <div id="slider" tabindex=0 role="slider"></div>
    <script>
      function update() {
        var s = document.getElementById('slider');
        s.setAttribute('aria-valuetext', 'noisy');
        setTimeout(update, 500);
      }
      update();
    </script>
  */}, function(root) {
    var go = root.find({role: RoleType.BUTTON});
    var slider = root.find({role: RoleType.SLIDER});
    var focusButton = go.focus.bind(go);
    var focusSlider = slider.focus.bind(slider);
    mockFeedback.call(focusButton)
        .expectNextSpeechUtteranceIsNot('noisy')
        .call(focusSlider)
        .expectSpeech('noisy')
        .expectSpeech('noisy')
        .replay();
  }.bind(this));
});

TEST_F('BackgroundTest', 'Checkbox', function() {
  var mockFeedback = this.createMockFeedback();
  this.runWithLoadedTree(function() {/*!
    <div id="go" role="checkbox">go</div>
    <script>
      var go = document.getElementById('go');
      var isChecked = true;
      go.addEventListener('click', function(e) {
        if (isChecked)
          go.setAttribute('aria-checked', true);
        else
          go.removeAttribute('aria-checked');
        isChecked = !isChecked;
      });
    </script>
  */}, function(root) {
    var cbx = root.find({role: RoleType.CHECK_BOX});
    var click = cbx.doDefault.bind(cbx);
    var focus = cbx.focus.bind(cbx);
    mockFeedback.call(focus)
        .expectSpeech('go')
        .expectSpeech('Check box')
        .expectSpeech('Not checked')
        .call(click)
        .expectSpeech('go')
        .expectSpeech('Check box')
        .expectSpeech('Checked')
        .call(click)
        .expectSpeech('go')
        .expectSpeech('Check box')
        .expectSpeech('Not checked')
        .replay();
  });
});

TEST_F('BackgroundTest', 'MixedCheckbox', function() {
  var mockFeedback = this.createMockFeedback();
  this.runWithLoadedTree(function() {/*!
    <div id="go" role="checkbox" aria-checked="mixed">go</div>
  */}, function(root) {
    mockFeedback.expectSpeech('go', 'Check box', 'Partially checked').replay();
  });
});

/** Tests navigating into and out of iframes using nextButton */
TEST_F('BackgroundTest', 'ForwardNavigationThroughIframeButtons', function() {
  var mockFeedback = this.createMockFeedback();

  var running = false;
  var runTestIfIframeIsLoaded = function(rootNode) {
    if (running)
      return;

    // Return if the iframe hasn't loaded yet.
    var iframe = rootNode.find({role: RoleType.IFRAME});
    var childDoc = iframe.firstChild;
    if (!childDoc || childDoc.children.length == 0)
      return;

    running = true;
    var beforeButton = rootNode.find({role: RoleType.BUTTON,
                                      name: 'Before'});
    beforeButton.focus();
    mockFeedback.expectSpeech('Before', 'Button');
    mockFeedback.call(doCmd('nextButton'))
        .expectSpeech('Inside', 'Button');
    mockFeedback.call(doCmd('nextButton'))
        .expectSpeech('After', 'Button');
    mockFeedback.call(doCmd('previousButton'))
        .expectSpeech('Inside', 'Button');
    mockFeedback.call(doCmd('previousButton'))
        .expectSpeech('Before', 'Button');
    mockFeedback.replay();
  }.bind(this);

  this.runWithLoadedTree(this.iframesDoc, function(rootNode) {
    chrome.automation.getDesktop(function(desktopNode) {
      runTestIfIframeIsLoaded(rootNode);

      desktopNode.addEventListener('loadComplete', function(evt) {
        runTestIfIframeIsLoaded(rootNode);
      }, true);
    });
  });
});

/** Tests navigating into and out of iframes using nextObject */
TEST_F('BackgroundTest', 'ForwardObjectNavigationThroughIframes', function() {
  var mockFeedback = this.createMockFeedback();

  var running = false;
  var runTestIfIframeIsLoaded = function(rootNode) {
    if (running)
      return;

    // Return if the iframe hasn't loaded yet.
    var iframe = rootNode.find({role: 'iframe'});
    var childDoc = iframe.firstChild;
    if (!childDoc || childDoc.children.length == 0)
      return;

    running = true;
    var beforeButton = rootNode.find({role: RoleType.BUTTON,
                                      name: 'Before'});
    beforeButton.focus();
    mockFeedback.expectSpeech('Before', 'Button');
    mockFeedback.call(doCmd('nextObject'))
        .expectSpeech('Inside', 'Button');
    mockFeedback.call(doCmd('nextObject'))
        .expectSpeech('Inside', 'Heading 1');
    mockFeedback.call(doCmd('nextObject'))
        .expectSpeech('After', 'Button');
    mockFeedback.call(doCmd('previousObject'))
        .expectSpeech('Inside', 'Heading 1');
    mockFeedback.call(doCmd('previousObject'))
        .expectSpeech('Inside', 'Button');
    mockFeedback.call(doCmd('previousObject'))
        .expectSpeech('Before', 'Button');
    mockFeedback.replay();
  }.bind(this);

  this.runWithLoadedTree(this.iframesDoc, function(rootNode) {
    chrome.automation.getDesktop(function(desktopNode) {
      runTestIfIframeIsLoaded(rootNode);

      desktopNode.addEventListener('loadComplete', function(evt) {
        runTestIfIframeIsLoaded(rootNode);
      }, true);
    });
  });
});

TEST_F('BackgroundTest', 'SelectOptionSelected', function() {
  var mockFeedback = this.createMockFeedback();
  this.runWithLoadedTree(function() {/*!
    <select>
      <option>apple
      <option>banana
      <option>grapefruit
    </select>
  */}, function(root) {
    var select = root.find({role: RoleType.POP_UP_BUTTON});
    var clickSelect = select.doDefault.bind(select);
    var lastOption = select.lastChild.lastChild;
    var selectLastOption = lastOption.doDefault.bind(lastOption);

    mockFeedback.call(clickSelect)
        .expectSpeech('apple')
        .expectSpeech('Button')
        .call(selectLastOption)
        .expectNextSpeechUtteranceIsNot('apple')
        .expectSpeech('grapefruit')
            .replay();
  });
});

TEST_F('BackgroundTest', 'ToggleButton', function() {
  var mockFeedback = this.createMockFeedback();
  this.runWithLoadedTree(function() {/*!
    <div aria-pressed="mixed" role="button">boldface</div>
    <div aria-pressed="true" role="button">ok</div>
    <div aria-pressed="false" role="button">cancel</div>
    <div aria-pressed role="button">close</div>
  */}, function(root) {
    var b = ChromeVoxState.instance;
    var move = doCmd('nextObject');
    mockFeedback.call(move)
        .expectSpeech('boldface')
        .expectSpeech('Button')
        .expectSpeech('Partially pressed')

        .call(move)
        .expectSpeech('ok')
        .expectSpeech('Button')
        .expectSpeech('Pressed')

        .call(move)
        .expectSpeech('cancel')
        .expectSpeech('Button')
        .expectSpeech('Not pressed')

        .call(move)
        .expectSpeech('close')
        .expectSpeech('Button')

        .replay();
  });
});

TEST_F('BackgroundTest', 'EditText', function() {
  var mockFeedback = this.createMockFeedback();
  this.runWithLoadedTree(function() {/*!
    <input type="text"></input>
    <input role="combobox" type="text"></input>
  */}, function(root) {
    var nextEditText = doCmd('nextEditText');
    var previousEditText = doCmd('previousEditText');
    mockFeedback.call(nextEditText)
        .expectSpeech('Combo box')
        .call(previousEditText)
        .expectSpeech('Edit text')
        .replay();
  });
});

TEST_F('BackgroundTest', 'BackwardForwardSync', function() {
  var mockFeedback = this.createMockFeedback();
  this.runWithLoadedTree(function() {/*!
    <div aria-label="Group" role="group" tabindex=0>
      <input type="text"></input>
    </div>
    <ul>
      <li tabindex=0>
        <button>ok</button>
      </li>
    </ul>
  */}, function(root) {
    var listItem = root.find({role: RoleType.LIST_ITEM});

    mockFeedback.call(listItem.focus.bind(listItem))
        .expectSpeech('List item')
        .call(this.doCmd('nextObject'))
        .expectSpeech('\u2022 ') // bullet
        .call(this.doCmd('nextObject'))
        .expectSpeech('Button')
        .call(this.doCmd('previousObject'))
        .expectSpeech('\u2022 ') // bullet
        .call(this.doCmd('previousObject'))
        .expectSpeech('List item')
        .call(this.doCmd('previousObject'))
        .expectSpeech('Edit text')
        .call(this.doCmd('previousObject'))
        .expectSpeech('Group')
        .replay();
  });
});

/** Tests that navigation works when the current object disappears. */
TEST_F('BackgroundTest', 'DisappearingObject', function() {
  var mockFeedback = this.createMockFeedback();
  this.runWithLoadedTree(this.disappearingObjectDoc, function(rootNode) {
    var deleteButton = rootNode.find({role: RoleType.BUTTON,
                                      attributes: { name: 'Delete' }});
    var pressDelete = deleteButton.doDefault.bind(deleteButton);
    mockFeedback.expectSpeech('start').expectBraille('start');

    mockFeedback.call(doCmd('nextObject'))
        .expectSpeech('Before1')
        .call(doCmd('nextObject'))
        .expectSpeech('Before2')
        .call(doCmd('nextObject'))
        .expectSpeech('Before3')
        .call(doCmd('nextObject'))
        .expectSpeech('Disappearing')
        .call(pressDelete)
        .expectSpeech('Deleted')
        .call(doCmd('nextObject'))
        .expectSpeech('After1')
        .call(doCmd('nextObject'))
        .expectSpeech('After2')
        .call(doCmd('previousObject'))
        .expectSpeech('After1')
        .call(doCmd('previousObject'))
        .expectSpeech('Before3');

    mockFeedback.replay();
  });
});

TEST_F('BackgroundTest', 'ButtonNameValueDescription', function() {
  var mockFeedback = this.createMockFeedback();
  this.runWithLoadedTree(function(root) {/*!
    <input type="submit" aria-label="foo" value="foo"></input>
  */}, function(root) {
    var btn = root.find({role: RoleType.BUTTON});
    mockFeedback.call(btn.focus.bind(btn))
        .expectSpeech('foo')
        .expectSpeech('Button')
        .replay();
  });
});

TEST_F('BackgroundTest', 'NameFromHeadingLink', function() {
  var mockFeedback = this.createMockFeedback();
  this.runWithLoadedTree(function(root) {/*!
    <p>before</p>
    <h1><a href="google.com">go</a><p>here</p></h1>
  */}, function(root) {
    var link = root.find({role: RoleType.LINK});
    mockFeedback.call(link.focus.bind(link))
        .expectSpeech('go')
        .expectSpeech('Link')
        .expectSpeech('Heading 1')
        .replay();
  });
});

TEST_F('BackgroundTest', 'OptionChildIndexCount', function() {
  var mockFeedback = this.createMockFeedback();
  this.runWithLoadedTree(function(root) {/*!
    <div role="listbox">
      <p>Fruits</p>
      <div role="option">apple</div>
      <div role="option">banana</div>
    </div>
  */}, function(root) {
    mockFeedback.call(doCmd('nextObject'))
        .expectSpeech('Fruits')
        .expectSpeech('with 2 items')
        .expectSpeech('apple')
        .expectSpeech(' 1 of 2 ')
        .call(doCmd('nextObject'))
        .expectSpeech('banana')
        .expectSpeech(' 2 of 2 ')
        .replay();
  });
});

TEST_F('BackgroundTest', 'ListMarkerIsIgnored', function() {
  var mockFeedback = this.createMockFeedback();
  this.runWithLoadedTree(function(root) {/*!
    <ul><li>apple</ul>
  */}, function(root) {
    mockFeedback.call(doCmd('nextObject'))
        .expectNextSpeechUtteranceIsNot('listMarker')
        .expectSpeech('apple')
        .replay();
  });
});

TEST_F('BackgroundTest', 'SymetricComplexHeading', function() {
  var mockFeedback = this.createMockFeedback();
  this.runWithLoadedTree(function(root) {/*!
    <h4><p>NW</p><p>NE</p></h4>
    <h4><p>SW</p><p>SE</p></h4>
  */}, function(root) {
    mockFeedback.call(doCmd('nextHeading'))
        .expectNextSpeechUtteranceIsNot('NE')
        .expectSpeech('NW')
        .call(doCmd('previousHeading'))
        .expectNextSpeechUtteranceIsNot('NE')
        .expectSpeech('NW')
        .replay();
  });
});

TEST_F('BackgroundTest', 'ContentEditableJumpSyncsRange', function() {
  var mockFeedback = this.createMockFeedback();
  this.runWithLoadedTree(function(root) {/*!
    <p>start</p>
    <div contenteditable>
      <h1>Top News</h1>
      <h1>Most Popular</h1>
      <h1>Sports</h1>
    </div>
  */}, function(root) {
    var assertRangeHasText = function(text) {
      return function() {
        assertEquals(text,
                     ChromeVoxState.instance.getCurrentRange().start.node.name);
      };
    };

    mockFeedback.call(doCmd('nextEditText'))
        .expectSpeech('Top News Most Popular Sports')
        .call(doCmd('nextHeading'))
        .expectSpeech('Top News')
        .call(assertRangeHasText('Top News'))
        .call(doCmd('nextHeading'))
        .expectSpeech('Most Popular')
        .call(assertRangeHasText('Most Popular'))
        .call(doCmd('nextHeading'))
        .expectSpeech('Sports')
        .call(assertRangeHasText('Sports'))
        .replay();
  });
});

TEST_F('BackgroundTest', 'Selection', function() {
  var mockFeedback = this.createMockFeedback();
  this.runWithLoadedTree(function(root) {/*!
    <p>simple</p>
    <p>doc</p>
  */}, function(root) {
    // Fakes a toggleSelection command.
    root.addEventListener('textSelectionChanged', function() {
      if (root.focusOffset == 3)
        CommandHandler.onCommand('toggleSelection');
    }, true);

    mockFeedback.call(doCmd('toggleSelection'))
        .expectSpeech('simple', 'selected')
        .call(doCmd('nextCharacter'))
        .expectSpeech('i', 'selected')
        .call(doCmd('previousCharacter'))
        .expectSpeech('i', 'unselected')
        .call(doCmd('nextCharacter'))
        .call(doCmd('nextCharacter'))
        .expectSpeech('End selection', 'sim')
        .replay();
  });
});

TEST_F('BackgroundTest', 'BasicTableCommands', function() {
  var mockFeedback = this.createMockFeedback();
  this.runWithLoadedTree(function(root) {/*!
  <table border=1>
    <tr><td>name</td><td>title</td><td>address</td><td>phone</td></tr>
    <tr><td>Dan</td><td>Mr</td><td>666 Elm Street</td><td>212 222 5555</td></tr>
  </table>
  */}, function(root) {
    mockFeedback.call(doCmd('nextRow'))
        .expectSpeech('Dan', 'row 2 column 1')
        .call(doCmd('previousRow'))
        .expectSpeech('name', 'row 1 column 1')
        .call(doCmd('previousRow'))
        .expectSpeech('No cell above.')
        .call(doCmd('nextCol'))
        .expectSpeech('title', 'row 1 column 2')
        .call(doCmd('nextRow'))
        .expectSpeech('Mr', 'row 2 column 2')
        .call(doCmd('previousRow'))
        .expectSpeech('title', 'row 1 column 2')
        .call(doCmd('nextCol'))
        .expectSpeech('address', 'row 1 column 3')
        .call(doCmd('nextCol'))
        .expectSpeech('phone', 'row 1 column 4')
        .call(doCmd('nextCol'))
        .expectSpeech('No cell right.')
        .call(doCmd('previousRow'))
        .expectSpeech('No cell above.')
        .call(doCmd('nextRow'))
        .expectSpeech('212 222 5555', 'row 2 column 4')
        .call(doCmd('nextRow'))
        .expectSpeech('No cell below.')
        .call(doCmd('nextCol'))
        .expectSpeech('No cell right.')
        .call(doCmd('previousCol'))
        .expectSpeech('666 Elm Street', 'row 2 column 3')
        .call(doCmd('previousCol'))
        .expectSpeech('Mr', 'row 2 column 2')

        .call(doCmd('goToRowLastCell'))
        .expectSpeech('212 222 5555', 'row 2 column 4')
        .call(doCmd('goToRowLastCell'))
        .expectSpeech('212 222 5555')
        .call(doCmd('goToRowFirstCell'))
        .expectSpeech('Dan', 'row 2 column 1')
        .call(doCmd('goToRowFirstCell'))
        .expectSpeech('Dan')

        .call(doCmd('goToColFirstCell'))
    .expectSpeech('name', 'row 1 column 1')
        .call(doCmd('goToColFirstCell'))
        .expectSpeech('name')
        .call(doCmd('goToColLastCell'))
    .expectSpeech('Dan', 'row 2 column 1')
        .call(doCmd('goToColLastCell'))
        .expectSpeech('Dan')

        .call(doCmd('goToLastCell'))
        .expectSpeech('212 222 5555', 'row 2 column 4')
        .call(doCmd('goToLastCell'))
        .expectSpeech('212 222 5555')
        .call(doCmd('goToFirstCell'))
        .expectSpeech('name', 'row 1 column 1')
        .call(doCmd('goToFirstCell'))
        .expectSpeech('name')

        .replay();
  });
});

TEST_F('BackgroundTest', 'MissingTableCells', function() {
  var mockFeedback = this.createMockFeedback();
  this.runWithLoadedTree(function(root) {/*!
  <table border=1>
    <tr><td>a</td><td>b</td><td>c</td></tr>
    <tr><td>d</td><td>e</td></tr>
    <tr><td>f</td></tr>
  </table>
  */}, function(root) {
    mockFeedback.call(doCmd('goToRowLastCell'))
        .expectSpeech('c', 'row 1 column 3')
        .call(doCmd('goToRowLastCell'))
        .expectSpeech('c')
        .call(doCmd('goToRowFirstCell'))
        .expectSpeech('a', 'row 1 column 1')
        .call(doCmd('goToRowFirstCell'))
        .expectSpeech('a')

        .call(doCmd('nextCol'))
        .expectSpeech('b', 'row 1 column 2')

        .call(doCmd('goToColLastCell'))
        .expectSpeech('e', 'row 2 column 2')
        .call(doCmd('goToColLastCell'))
        .expectSpeech('e')
        .call(doCmd('goToColFirstCell'))
        .expectSpeech('b', 'row 1 column 2')
        .call(doCmd('goToColFirstCell'))
        .expectSpeech('b')

        .call(doCmd('goToFirstCell'))
        .expectSpeech('a', 'row 1 column 1')
        .call(doCmd('goToFirstCell'))
        .expectSpeech('a')
        .call(doCmd('goToLastCell'))
        .expectSpeech('f', 'row 3 column 1')
        .call(doCmd('goToLastCell'))
        .expectSpeech('f')
        .replay();
  });
});

TEST_F('BackgroundTest', 'DisabledState', function() {
  var mockFeedback = this.createMockFeedback();
  this.runWithLoadedTree(function(root) {/*!
    <button aria-disabled="true">ok</button>
  */}, function(root) {
    mockFeedback.expectSpeech('ok', 'Disabled', 'Button').replay();
  });
});

TEST_F('BackgroundTest', 'HeadingLevels', function() {
  var mockFeedback = this.createMockFeedback();
  this.runWithLoadedTree(function(root) {/*!
    <h1>1</h1><h2>2</h2><h3>3</h3><h4>4</h4><h5>5</h5><h6>6</h6>
  */}, function(root) {
    var makeLevelAssertions = function(level) {
      mockFeedback.call(doCmd('nextHeading' + level))
          .expectSpeech('Heading ' + level)
          .call(doCmd('nextHeading' + level))
          .expectEarcon('wrap')
          .call(doCmd('previousHeading' + level))
          .expectEarcon('wrap');
    };
    for (var i = 1; i <= 6; i++)
      makeLevelAssertions(i);
    mockFeedback.replay();
  });
});

// Flaky, see crbug.com/693928.
TEST_F('BackgroundTest', 'DISABLED_EditableNavigation', function() {
  var mockFeedback = this.createMockFeedback();
  this.runWithLoadedTree(function(root) {/*!
    <div contenteditable>this is a test</div>
  */}, function(root) {
    mockFeedback.call(doCmd('nextObject'))
        .expectSpeech('this is a test')
        .call(doCmd('nextObject'))
        .expectSpeech(/data*/)
        .call(doCmd('nextObject'))
        .expectSpeech('this is a test')
        .call(doCmd('nextWord'))
        .expectSpeech('is', 'selected')
        .replay();
  });
});

TEST_F('BackgroundTest', 'NavigationMovesFocus', function() {
  this.runWithLoadedTree(function(root) {/*!
    <p>start</p>
    <input type="text"></input>
  */}, function(root) {
    this.listenOnce(root, 'focus', function(e) {
      var focus = ChromeVoxState.instance.currentRange.start.node;
      assertEquals(RoleType.TEXT_FIELD, focus.role);
      assertTrue(focus.state.focused);
    });
    doCmd('nextEditText')();
  });
});

TEST_F('BackgroundTest', 'BrailleCaretNavigation', function() {
  var mockFeedback = this.createMockFeedback();
  this.runWithLoadedTree(function(root) {/*!
    <p>This is a<em>test</em> of inline braille<br>with a second line</p>
  */}, function(root) {
    var text = 'This is a';
    mockFeedback.call(doCmd('nextCharacter'))
        .expectBraille(text, {startIndex: 1, endIndex: 2})  // h
        .call(doCmd('nextCharacter'))
        .expectBraille(text, {startIndex: 2, endIndex: 3})  // i
        .call(doCmd('nextWord'))
        .expectBraille(text, {startIndex: 5, endIndex: 7})  // is
        .call(doCmd('previousWord'))
        .expectBraille(text, {startIndex: 0, endIndex: 4})  // This
        .call(doCmd('nextLine'))
        // Ensure nothing is selected when the range covers the entire line.
        .expectBraille('with a second line', {startIndex: -1, endIndex: -1})
        .replay();
  });
});

TEST_F('BackgroundTest', 'InPageLinks', function() {
  var mockFeedback = this.createMockFeedback();
  this.runWithLoadedTree(function(root) {/*!
    <a href="#there">hi</a>
    <button id="there">there</button>
  */}, function(root) {
    mockFeedback.expectSpeech('hi', 'Internal link')
        .call(doCmd('forceClickOnCurrentItem'))
        .expectSpeech('there', 'Button')
        .replay();
  });
});

TEST_F('BackgroundTest', 'ListItem', function() {
  this.resetContextualOutput();
  var mockFeedback = this.createMockFeedback();
  this.runWithLoadedTree(function(root) {/*!
    <p>start</p>
    <ul><li>apple<li>grape<li>banana</ul>
    <ol><li>pork<li>beef<li>chicken</ol>
  */}, function(root) {
    mockFeedback.call(doCmd('nextLine'))
        .expectSpeech('\u2022 ', 'apple', 'List item')
        .expectBraille('\u2022 apple lstitm list +3')
        .call(doCmd('nextLine'))
        .expectSpeech('\u2022 ', 'grape', 'List item')
        .expectBraille('\u2022 grape lstitm')
        .call(doCmd('nextLine'))
        .expectSpeech('\u2022 ', 'banana', 'List item')
        .expectBraille('\u2022 banana lstitm')

        .call(doCmd('nextLine'))
        .expectSpeech('1. ', 'pork', 'List item')
        .expectBraille('1. pork lstitm list +3')
        .call(doCmd('nextLine'))
        .expectSpeech('2. ', 'beef', 'List item')
        .expectBraille('2. beef lstitm')
        .call(doCmd('nextLine'))
        .expectSpeech('3. ', 'chicken', 'List item')
        .expectBraille('3. chicken lstitm')
        .replay();
  });
});

TEST_F('BackgroundTest', 'BusyHeading', function() {
  this.resetContextualOutput();
  var mockFeedback = this.createMockFeedback();
  this.runWithLoadedTree(function(root) {/*!
    <p>start</p>
    <h2><a href="#">Lots</a><a href="#">going</a><a href="#">here</a></h2>
  */}, function(root) {
    // In the past, this would have inserted the 'heading 2' after the first
    // link's output. Make sure it goes to the end.
    mockFeedback.call(doCmd('nextLine'))
        .expectSpeech(
            'Lots', 'Link', 'going', 'Link', 'here', 'Link', 'Heading 2')
        .expectBraille('Lots lnk going lnk here lnk h2')
        .replay();
  });
});
