/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

include protocol PBrowser;

include DocAccessibleTypes;

include "mozilla/GfxMessageUtils.h";

using mozilla::LayoutDeviceIntRect from "Units.h";
using mozilla::LayoutDeviceIntPoint from "Units.h";
using mozilla::LayoutDeviceIntSize from "Units.h";
using mozilla::a11y::role from "mozilla/a11y/IPCTypes.h";
using mozilla::a11y::AccType from "mozilla/a11y/IPCTypes.h";
using mozilla::a11y::AccGenericType from "mozilla/a11y/IPCTypes.h";
[RefCounted] using mozilla::a11y::AccAttributes from "mozilla/a11y/IPCTypes.h";
using mozilla::a11y::CacheUpdateType from "mozilla/a11y/IPCTypes.h";
using mozilla::gfx::Matrix4x4 from "mozilla/gfx/Matrix.h";

namespace mozilla {
namespace a11y {

struct AccessibleData
{
  uint64_t ID;
  role Role;
  uint64_t ParentID;
  uint32_t IndexInParent;
  AccType Type;
  AccGenericType GenericTypes;
  uint8_t RoleMapEntryIndex;
  nullable AccAttributes CacheFields;
};

struct CacheEventData {
  CacheUpdateType UpdateType;
  CacheData[] aData;
};

struct ShowEventData {
  AccessibleData[] NewTree;
  bool EventSuppressed;
  bool Complete;
  bool FromUser;
};

struct HideEventData {
  uint64_t ID;
  bool IsFromUserInput;
};

struct ReorderEventData {
  uint64_t ID;
  uint32_t Type;
};

struct TextChangeEventData {
  uint64_t ID;
  nsString Str;
  int32_t Start;
  uint32_t Len;
  bool IsInsert;
  bool FromUser;
};

union MutationEventData {
  CacheEventData;
  ShowEventData;
  HideEventData;
  ReorderEventData;
  TextChangeEventData;
};

struct TextRangeData
{
  uint64_t StartID;
  uint64_t EndID;
  int32_t StartOffset;
  int32_t EndOffset;
};

[ManualDealloc, ChildImpl=virtual, ParentImpl=virtual]
protocol PDocAccessible
{
  manager PBrowser;

parent:
  async Shutdown();

  /*
   * Notify the parent process the document in the child process is firing an
   * event.
   */
  async Event(uint64_t aID, uint32_t type);
  async StateChangeEvent(uint64_t aID, uint64_t aState, bool aEnabled);
  async CaretMoveEvent(uint64_t aID,
                       LayoutDeviceIntRect aCaretRect,
                       int32_t aOffset,
                       bool aIsSelectionCollapsed, bool aIsAtEndOfLine,
                       int32_t aGranularity, bool aFromUser);
  async MutationEvents(MutationEventData[] aData);
  async RequestAckMutationEvents();
  async SelectionEvent(uint64_t aID, uint64_t aWidgetID, uint32_t aType);
  async RoleChangedEvent(role aRole, uint8_t aRoleMapEntryIndex);
  async FocusEvent(uint64_t aID, LayoutDeviceIntRect aCaretRect);
  async ScrollingEvent(uint64_t aID, uint64_t aType,
                       uint32_t aScrollX, uint32_t aScrollY,
                       uint32_t aMaxScrollX, uint32_t aMaxScrollY);
#ifndef XP_WIN
  async AnnouncementEvent(uint64_t aID,
                          nsString aAnnouncement,
                          uint16_t aPriority);
#endif
  async TextSelectionChangeEvent(uint64_t aID, TextRangeData[] aSelection);

  /*
   * Tell the parent document to bind the existing document as a new child
   * document.
   */
  async BindChildDoc(PDocAccessible aChildDoc, uint64_t aID);

  /*
   * Cache The World
   */
  async Cache(CacheUpdateType aUpdateType, CacheData[] aData);

  /*
   * Lists of accessibles that either gained or lost a selected state.
   */
  async SelectedAccessiblesChanged(uint64_t[] aSelectedIDs, uint64_t[] aUnselectedIDs);

  /*
   * Tell the parent process that the given Accessibles are about to be moved
   * via subsequent hide and show events.
   */
  async AccessiblesWillMove(uint64_t[] aIDs);

child:
  async __delete__();

  /*
   * Called as a result of focus shifting from chrome to content
   * elements through keyboard navigation.
   */
  async RestoreFocus();

  // LocalAccessible
  async ScrollTo(uint64_t aID, uint32_t aScrollType);
  async ScrollToPoint(uint64_t aID, uint32_t aScrollType, int32_t aX,
                      int32_t aY);
#ifndef XP_WIN
  async Announce(uint64_t aID, nsString aAnnouncement, uint16_t aPriority);
#endif

  // AccessibleText

  async SetTextSelection(uint64_t aStartID, int32_t aStartOffset,
                     uint64_t aEndID, int32_t aEndOffset,
                     int32_t aSelectionNum);
  async RemoveTextSelection(uint64_t aID, int32_t aSelectionNum);

  async ScrollTextLeafRangeIntoView(uint64_t aStartID, int32_t aStartOffset,
                                    uint64_t aEndID, int32_t aEndOffset,
                                    uint32_t aScrollType);
  async ScrollSubstringToPoint(uint64_t aID,
                               int32_t aStartOffset,
                               int32_t aEndOffset,
                               uint32_t aCoordinateType,
                               int32_t aX, int32_t aY);

  async ReplaceText(uint64_t aID, nsString aText);
  async InsertText(uint64_t aID, nsString aText, int32_t aPosition);
  async CopyText(uint64_t aID, int32_t aStartPos, int32_t aEndPos);
  async CutText(uint64_t aID, int32_t aStartPos, int32_t aEndPos);
  async DeleteText(uint64_t aID, int32_t aStartPos, int32_t aEndPos);
  async PasteText(uint64_t aID, int32_t aPosition);

  async TakeSelection(uint64_t aID);
  async SetSelected(uint64_t aID, bool aSelected);

  async DoActionAsync(uint64_t aID, uint8_t aIndex);

  async SetCurValue(uint64_t aID, double aValue);

  async TakeFocus(uint64_t aID);

  /*
   * Verify the cache. Used for testing purposes.
   */
  async VerifyCache(uint64_t aID, uint64_t aCacheDomain, nullable AccAttributes aFields);

  async AckMutationEvents();

};

}
}
