chromium/chrome/test/data/extensions/api_test/automation/tests/desktop/position.js

// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

var allTests = [
  function testPositionType() {
    var button = rootNode.find({role: chrome.automation.RoleType.BUTTON});
    var position = button.createPosition(
        /* type */ chrome.automation.PositionType.TREE, /* offset */ 0);

    assertEq(button, position.node);

    assertFalse(position.isNullPosition());
    assertTrue(position.isTreePosition());
    assertFalse(position.isTextPosition());
    assertFalse(position.isLeafTextPosition());

    assertEq(0, position.childIndex);
    assertEq(-1, position.textOffset);
    assertEq('downstream', position.affinity);
    chrome.test.succeed();
  },

  function testBackingObjectsDiffer() {
    var childOfRoot = rootNode.lastChild;
    var pos1 = childOfRoot.createPosition(
        /* type */ chrome.automation.PositionType.TREE, /* offset */ 0);
    var pos2 = rootNode.createPosition(
        /* type */ chrome.automation.PositionType.TREE, /* offset */ 0);
    assertFalse(pos1.node == pos2.node, 'Nodes expected to differ');
    chrome.test.succeed();
  },

  function testCrossRoots() {
    chrome.automation.getDesktop(() => {
      var rootPosition = rootNode.createPosition(
          /* type */ chrome.automation.PositionType.TREE, /* offset */ 0);
      rootPosition.moveToParentPosition();
      assertFalse(rootPosition.isNullPosition());
      assertTrue(!!rootPosition.node);
      chrome.test.succeed();
    });
  },

  function testBeginningOfContentEditable() {
    var editable =
        rootNode.find({role: chrome.automation.RoleType.GENERIC_CONTAINER});
    assertTrue(Boolean(editable));
    var position = editable.createPosition(
        /* type */ chrome.automation.PositionType.TEXT, /*offset=*/ 0);
    assertTrue(position.isTextPosition());

    position.asLeafTextPosition();
    assertTrue(position.isTextPosition());
    assertEq('This', position.node.name);
    assertEq(0, position.textOffset);
    position.moveToNextLeafTextPosition();
    assertTrue(position.isTextPosition());
    assertEq(' ', position.node.name);
    assertEq(0, position.textOffset);
    position.moveToNextLeafTextPosition();
    assertTrue(position.isTextPosition());
    assertEq('is', position.node.name);
    assertEq(0, position.textOffset);
    position.moveToNextLeafTextPosition();
    assertTrue(position.isTextPosition());
    assertEq(' a', position.node.name);
    assertEq(0, position.textOffset);
    position.moveToNextLeafTextPosition();
    assertTrue(position.isTextPosition());
    assertEq(' test', position.node.name);
    assertEq(0, position.textOffset);

    chrome.test.succeed();
  },

  function testMiddleOfContentEditable() {
    var editable =
        rootNode.find({role: chrome.automation.RoleType.GENERIC_CONTAINER});
    assertTrue(Boolean(editable));
    // The editable value is "This is a test" (all words are contaiend in
    // separate nodes), so an index of 10 points to the beginning of "test".
    var position = editable.createPosition(
        /* type */ chrome.automation.PositionType.TEXT, /*offset=*/ 10);
    assertTrue(position.isTextPosition());
    position.asLeafTextPosition();
    assertTrue(position.isTextPosition());
    assertEq(' test', position.node.name);
    assertEq(1, position.textOffset);

    position = editable.createPosition(
        /* type */ chrome.automation.PositionType.TEXT, /*offset=*/ 9);
    assertTrue(position.isTextPosition());
    position.asLeafTextPosition();
    assertTrue(position.isTextPosition());
    assertEq(' a', position.node.name);
    assertEq(2, position.textOffset);

    // An index of 12 points to the middle of "test".
    position = editable.createPosition(
        /* type */ chrome.automation.PositionType.TEXT, /*offset=*/ 12);
    assertTrue(position.isTextPosition());
    position.asLeafTextPosition();
    assertTrue(position.isTextPosition());
    assertEq(' test', position.node.name);
    assertEq(3, position.textOffset);

    chrome.test.succeed();
  },

  function testIsTextPositionEdgeCases() {
    var editable =
        rootNode.find({role: chrome.automation.RoleType.GENERIC_CONTAINER});
    assertTrue(Boolean(editable));

    // Invalid indices should be corrected and set at either the beginning or
    // the end of the editable value.
    var position = editable.createPosition(
        /* type */ chrome.automation.PositionType.TEXT, /*offset=*/ -1);
    assertTrue(position.isTextPosition());
    position.asLeafTextPosition();
    assertTrue(position.isTextPosition());
    assertEq('This', position.node.name);
    assertEq(0, position.textOffset);

    // The value length is 14, so test that a correction is made when creating
    // the position.
    position = editable.createPosition(
        /* type */ chrome.automation.PositionType.TEXT, /*offset=*/ 14);
    assertTrue(position.isTextPosition());
    position.asLeafTextPosition();
    assertTrue(position.isTextPosition());
    assertEq(' test', position.node.name);
    assertEq(5, position.textOffset);

    position = editable.createPosition(
        /* type */ chrome.automation.PositionType.TEXT, /*offset=*/ 100);
    assertTrue(position.isTextPosition());
    position.asLeafTextPosition();
    assertTrue(position.isTextPosition());
    assertEq(' test', position.node.name);
    assertEq(5, position.textOffset);

    chrome.test.succeed();
  }
];

setUpAndRunTabsTests(allTests, 'position.html');