// 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.

// This is the implementation layer of the chrome.automation API, and is
// essentially a translation of the internal accessibility tree update system
// into an extension API.
namespace automationInternal {
  dictionary Rect {
    long left;
    long top;
    long width;
    long height;
  };

  // A compact representation of the accessibility information for a
  // single web object, in a form that can be serialized and sent from
  // one process to another.
  // See ui/accessibility/ax_node_data.h
  dictionary AXNodeData {
    long id;
    DOMString role;
    object state;
    Rect location;

    object? boolAttributes;
    object? floatAttributes;
    object? htmlAttributes;
    object? intAttributes;
    object? intlistAttributes;
    object? stringAttributes;
    long[] childIds;
  };

  // Data for an accessibility event and/or an atomic change to an accessibility
  // tree. See ui/accessibility/ax_tree_update.h for an extended explanation of
  // the tree update format.
  dictionary AXEventParams {
    // The process id of the renderer host.
    long processID;

    // The routing id of the web contents that this update is for.
    long routingID;

    // ID of the node that the event applies to.
    long targetID;

    // The type of event that this update represents.
    DOMString eventType;

    // A vector of nodes to update according to the rules described in
    // ui/ax_tree_update.h.
    AXNodeData[] nodes;
  };

  // All possible actions that can be performed on automation nodes.
  enum ActionType {
    focus,
    doDefault,
    makeVisible,
    setSelection
  };

  // Arguments required for all actions supplied to performAction.
  dictionary PerformActionRequiredParams {
    long processID;
    long routingID;
    long automationNodeID;
    ActionType actionType;
  };

  // Arguments for the set_selection action supplied to performAction.
  dictionary SetSelectionParams {
    long startIndex;
    long endIndex;
  };

  // Returns the process id and routing id of the tab whose accessibility was
  // enabled using enable().
  callback EnableTabCallback = void(long processID, long routingID);

  // Callback called when enableDesktop() returns.
  callback EnableDesktopCallback = void();

  interface Functions {
    // Enable automation of the tab with the given id, or the active tab if no
    // tab id is given, and retrieves its process and routing ids for use in
    // future updates.
    static void enableTab(optional long tabId, EnableTabCallback callback);

    // Enables desktop automation.
    static void enableDesktop(EnableDesktopCallback callback);

    // Performs an action on an automation node.
    static void performAction(PerformActionRequiredParams args,
                              object opt_args);
  };

  interface Events {
    // Fired when an accessibility event occurs
    static void onAccessibilityEvent(AXEventParams update);
  };
};