<!DOCTYPE html>
<html>
<head>
  <title>Tests AccessFu content integration</title>
  <meta charset="utf-8" />
  <link rel="stylesheet" type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css" />

  <script type="application/javascript"
          src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js">
  </script>
  <script type="application/javascript"
          src="chrome://mochikit/content/tests/SimpleTest/EventUtils.js">
  </script>
  <script type="application/javascript"
          src="chrome://mochikit/content/chrome-harness.js">
  </script>

  <script type="application/javascript" src="../common.js"></script>
  <script type="application/javascript" src="../browser.js"></script>
  <script type="application/javascript" src="../events.js"></script>
  <script type="application/javascript" src="../role.js"></script>
  <script type="application/javascript" src="../states.js"></script>
  <script type="application/javascript" src="../layout.js"></script>
  <script type="application/javascript" src="jsatcommon.js"></script>

  <script type="application/javascript">
    function doTest() {
      var doc = currentTabDocument();
      var textTest = new AccessFuContentTest(
        [
          // Read-only text tests
          [ContentMessages.simpleMoveFirst,
           new ExpectedCursorChange(
            ['Text content test document', 'These are my awards, Mother. ' +
             'From Army. The seal is for marksmanship, and the gorilla is ' +
             'for sand racing.'])],
          [ContentMessages.moveNextBy('word'),
           new ExpectedCursorTextChange('These', 0, 5)],
          [ContentMessages.moveNextBy('word'),
           new ExpectedCursorTextChange('are', 6, 9)],
          [ContentMessages.moveNextBy('word'),
           new ExpectedCursorTextChange('my', 10, 12)],
          [ContentMessages.moveNextBy('word'),
           new ExpectedCursorTextChange('awards,', 13, 20)],
          [ContentMessages.moveNextBy('word'),
           new ExpectedCursorTextChange('Mother.', 21, 28)],
          [ContentMessages.movePreviousBy('word'),
           new ExpectedCursorTextChange('awards,', 13, 20)],
          [ContentMessages.movePreviousBy('word'),
           new ExpectedCursorTextChange('my', 10, 12)],
          [ContentMessages.movePreviousBy('word'),
           new ExpectedCursorTextChange('are', 6, 9)],
          [ContentMessages.movePreviousBy('word'),
           new ExpectedCursorTextChange('These', 0, 5)],
          [ContentMessages.simpleMoveNext,
           new ExpectedCursorChange(['You\'re a good guy, mon frere. ' +
              'That means brother in French. ' +
              'I don\'t know how I know that. ' +
              'I took four years of Spanish.'])],
          // XXX: Word boundary should be past the apostraphe.
          [ContentMessages.moveNextBy('word'),
           new ExpectedCursorTextChange('You\'re', 0, 6,
             { android_todo: true /* Bug 980512 */})],

          // Editable text tests.
          [ContentMessages.focusSelector('textarea'),
           new ExpectedAnnouncement('editing'),
           new ExpectedEditState({
            editing: true,
            multiline: true,
            atStart: true,
            atEnd: false
           }),
           new ExpectedCursorChange(
            ['Please refrain from Mayoneggs during this salmonella scare.',
             {string: 'textarea'}]),
           new ExpectedTextSelectionChanged(0, 0)
          ],
          [ContentMessages.activateCurrent(10),
           new ExpectedTextCaretChanged(0, 10),
           new ExpectedEditState({ editing: true,
             multiline: true,
             atStart: false,
             atEnd: false }),
           new ExpectedTextSelectionChanged(10, 10)],
          [ContentMessages.activateCurrent(20),
           new ExpectedTextCaretChanged(10, 20),
           new ExpectedTextSelectionChanged(20, 20)
          ],
          [ContentMessages.moveCaretNextBy('word'),
           new ExpectedTextCaretChanged(20, 29),
           new ExpectedTextSelectionChanged(29, 29)
          ],
          [ContentMessages.moveCaretNextBy('word'),
           new ExpectedTextCaretChanged(29, 36),
           new ExpectedTextSelectionChanged(36, 36)
          ],
          [ContentMessages.moveCaretNextBy('character'),
           new ExpectedTextCaretChanged(36, 37),
           new ExpectedTextSelectionChanged(37, 37)
          ],
          [ContentMessages.moveCaretNextBy('character'),
           new ExpectedTextCaretChanged(37, 38),
           new ExpectedTextSelectionChanged(38, 38)
          ],
          [ContentMessages.moveCaretNextBy('paragraph'),
           new ExpectedTextCaretChanged(38, 59),
           new ExpectedTextSelectionChanged(59, 59)
          ],
          [ContentMessages.moveCaretPreviousBy('word'),
           new ExpectedTextCaretChanged(53, 59),
           new ExpectedTextSelectionChanged(53, 53)
          ],

          // bug xxx
          [ContentMessages.simpleMoveNext,
           new ExpectedCursorChange(
            ['So we don\'t get dessert?', {string: 'label'}],
            { focused: 'html'}),
           new ExpectedAnnouncement('navigating'),
           new ExpectedEditState({
            editing: false,
            multiline: false,
            atStart: true,
            atEnd: false })],
          [ContentMessages.simpleMoveNext,
           new ExpectedCursorChange(
            [{ string : 'entry' }],
            { focused: 'html'})],
          [ContentMessages.activateCurrent(0),
           new ExpectedClickAction(),
           new ExpectedAnnouncement('editing'),
           new ExpectedEditState({
            editing: true,
            multiline: false,
            atStart: true,
            atEnd: true
           }, { focused: 'input[type=text]' }),
           new ExpectedTextSelectionChanged(0, 0),
           new ExpectedTextSelectionChanged(0, 0)
           ],
          [ContentMessages.simpleMovePrevious,
           new ExpectedCursorChange(
            ['So we don\'t get dessert?', {string: 'label'}]),
           new ExpectedAnnouncement('navigating'),
           new ExpectedEditState({
            editing: false,
            multiline: false,
            atStart: true,
            atEnd: false
           },{ focused: 'html' })
         ],
          [ContentMessages.simpleMoveNext,
           new ExpectedCursorChange(
            [{ string : 'entry' }],
            { focused: 'html'})],
          [ContentMessages.activateCurrent(0),
           new ExpectedClickAction(),
           new ExpectedAnnouncement('editing'),
           new ExpectedEditState({
            editing: true,
            multiline: false,
            atStart: true,
            atEnd: true
           },
           { focused: 'input[type=text]' }),
           new ExpectedTextSelectionChanged(0, 0)],
          [ContentMessages.simpleMovePrevious,
           new ExpectedCursorChange(
            [ 'So we don\'t get dessert?', {string: 'label'} ]),
           new ExpectedAnnouncement('navigating'),
           new ExpectedEditState({
            editing: false,
            multiline: false,
            atStart: true,
            atEnd: false
           }, { focused: 'html' })],

          [ContentMessages.focusSelector('input'),
           new ExpectedAnnouncement('editing'),
           new ExpectedEditState({
            editing: true,
            multiline: false,
            atStart: true,
            atEnd: true
           }),
           new ExpectedCursorChange([{string: 'entry'}]),
           new ExpectedTextSelectionChanged(0, 0)
          ],
          [function() {
             SpecialPowers.pushPrefEnv({"set": [[KEYBOARD_ECHO_SETTING, 3]]}, typeKey('a')());
           },
           new ExpectedTextChanged('a'),
           new ExpectedTextSelectionChanged(1, 1),
          ],
          [typeKey('b'),
           new ExpectedTextChanged('b'),
           new ExpectedTextSelectionChanged(2, 2),
          ],
          [typeKey('c'),
           new ExpectedTextChanged('c'),
           new ExpectedTextSelectionChanged(3, 3),
          ],
          [typeKey('d'),
           new ExpectedTextChanged('d'),
           new ExpectedTextSelectionChanged(4, 4),
          ],
          [typeKey(' '),
           new ExpectedTextChanged(' abcd'),
           new ExpectedTextSelectionChanged(5, 5),
          ],
          [typeKey('e'),
           new ExpectedTextChanged('e'),
           new ExpectedTextSelectionChanged(6, 6),
          ],
          [function() {
             SpecialPowers.pushPrefEnv({"set": [[KEYBOARD_ECHO_SETTING, 2]]}, typeKey('a')());
           },
           new ExpectedTextChanged(''),
           new ExpectedTextSelectionChanged(7, 7),
          ],
          [typeKey('d'),
           new ExpectedTextChanged(''),
           new ExpectedTextSelectionChanged(8, 8),
          ],
          [typeKey(' '),
           new ExpectedTextChanged(' ead'),
           new ExpectedTextSelectionChanged(9, 9),
          ],
          [function() {
             SpecialPowers.pushPrefEnv({"set": [[KEYBOARD_ECHO_SETTING, 1]]}, typeKey('f')());
           },
           new ExpectedTextChanged('f'),
           new ExpectedTextSelectionChanged(10, 10),
          ],
          [typeKey('g'),
           new ExpectedTextChanged('g'),
           new ExpectedTextSelectionChanged(11, 11),
          ],
          [typeKey(' '),
           new ExpectedTextChanged(' '),
           new ExpectedTextSelectionChanged(12, 12),
          ],
          [function() {
             SpecialPowers.pushPrefEnv({"set": [[KEYBOARD_ECHO_SETTING, 0]]}, typeKey('f')());
           },
           new ExpectedTextChanged(''),
           new ExpectedTextSelectionChanged(13, 13),
          ],
          [typeKey('g'),
           new ExpectedTextChanged(''),
           new ExpectedTextSelectionChanged(14, 14),
          ],
          [typeKey(' '),
           new ExpectedTextChanged(''),
           new ExpectedTextSelectionChanged(15, 15),
          ],
        ]);

      const KEYBOARD_ECHO_SETTING = 'accessibility.accessfu.keyboard_echo';
      function typeKey(key) {
        return function() { synthesizeKey(key, {}, currentTabWindow()); };
      }

      addA11yLoadEvent(function() {
        textTest.start(function () {
          closeBrowserWindow();
          SimpleTest.finish();
        });
      }, doc.defaultView);
    }

    SimpleTest.waitForExplicitFinish();
    addLoadEvent(
      function () {
        openBrowserWindow(
          doTest,
          getRootDirectory(window.location.href) + "doc_content_text.html");
        });
  </script>
</head>
<body id="body">

  <a target="_blank"
     title="Add tests for text editing and navigating"
     href="https://bugzilla.mozilla.org/show_bug.cgi?id=972047">Mozilla Bug 933808</a>
  <p id="display"></p>
  <div id="content" style="display: none"></div>
  <pre id="test">
  </pre>
</body>
</html>