// 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;
  };

  dictionary AXTreeUpdate {
    // ID of the node, if any, which should be invalidated before the new data
    // is applied.
    long nodeIdToClear;

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

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

    // Serialized changes to the tree structure and node data that should be
    // applied before processing the event.
    AXTreeUpdate update;
  };

  // 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);

    static void onAccessibilityTreeDestroyed(long processID, long routingID);
  };
};
