/*
 * Copyright (C) 2011 Apple Inc. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
 * THE POSSIBILITY OF SUCH DAMAGE.
 */

interface AccessibilityUIElement {
    boolean isEqual(AccessibilityUIElement otherElement);

    // Document information
    readonly attribute DOMString documentEncoding;
    readonly attribute DOMString documentURI;

    // Element access.
    AccessibilityUIElement elementAtPoint(long x, long y);
    AccessibilityUIElement childAtIndex(unsigned long index);
    unsigned long indexOfChild(AccessibilityUIElement child);
    AccessibilityUIElement linkedUIElementAtIndex(unsigned long index);
    AccessibilityUIElement selectedChildAtIndex(unsigned long index);
    void setSelectedChild(AccessibilityUIElement element);
    void setSelectedChildAtIndex(unsigned long index);
    void removeSelectionAtIndex(unsigned long index);
    void clearSelectedChildren();
    AccessibilityUIElement titleUIElement();
    AccessibilityUIElement parentElement();
    
    readonly attribute DOMString role;
    readonly attribute DOMString subrole;
    readonly attribute DOMString roleDescription;
    readonly attribute DOMString computedRoleString;
    readonly attribute DOMString title;
    readonly attribute DOMString description;
    readonly attribute DOMString language;
    readonly attribute DOMString helpText;
    readonly attribute DOMString valueDescription;
    readonly attribute DOMString url;
    readonly attribute DOMString speakAs;
    readonly attribute DOMString orientation;
    readonly attribute long insertionPointLineNumber;
    readonly attribute DOMString selectedTextRange;

    DOMString stringAttributeValue(DOMString attr);
    double numberAttributeValue(DOMString attr);
    object uiElementArrayAttributeValue(DOMString attr);
    AccessibilityUIElement uiElementAttributeValue(DOMString attr);  
    boolean boolAttributeValue(DOMString attr);
    void setBoolAttributeValue(DOMString attr, boolean value);
    boolean isAttributeSupported(DOMString attr);
    boolean isAttributeSettable(DOMString attr);
    boolean isPressActionSupported();
    boolean isIncrementActionSupported();
    boolean isDecrementActionSupported();
    void setValue(DOMString value);

    readonly attribute DOMString stringValue;
    readonly attribute long intValue;
    readonly attribute long minValue;
    readonly attribute long maxValue;
    
    readonly attribute boolean isEnabled;
    readonly attribute boolean isRequired;
    readonly attribute boolean isFocused;
    readonly attribute boolean isFocusable;
    readonly attribute boolean isSelectable;
    readonly attribute boolean isSelected;
    readonly attribute boolean isSelectedOptionActive;
    readonly attribute boolean isMultiSelectable;
    readonly attribute boolean isExpanded;
    readonly attribute boolean isChecked;
    readonly attribute boolean isIndeterminate;
    readonly attribute boolean isVisible;
    readonly attribute boolean isCollapsed;
    readonly attribute boolean hasPopup;
    readonly attribute boolean isIgnored;
    readonly attribute boolean isSingleLine;
    readonly attribute boolean isMultiLine;
    readonly attribute boolean isOffScreen;
    readonly attribute boolean isValid;
    readonly attribute long hierarchicalLevel;
    readonly attribute boolean ariaIsGrabbed;
    readonly attribute DOMString ariaDropEffects;
    readonly attribute DOMString classList;

    readonly attribute long x;
    readonly attribute long y;
    readonly attribute long width;
    readonly attribute long height;
    readonly attribute long clickPointX;
    readonly attribute long clickPointY;

    readonly attribute long childrenCount;
    readonly attribute long selectedChildrenCount;
    readonly attribute long rowCount;
    readonly attribute long columnCount;

    // Actions.
    void increment();
    void decrement();
    void asyncIncrement();
    void asyncDecrement();
    void press();
    void syncPress();
    void showMenu();
    boolean dismiss();

    // Attribute info.
    DOMString allAttributes();
    DOMString attributesOfChildren();
    DOMString attributesOfLinkedUIElements();
    DOMString attributesOfDocumentLinks();

    // Text info.
    DOMString characterAtOffset(long offset);
    DOMString wordAtOffset(long offset);
    DOMString lineAtOffset(long offset);
    DOMString sentenceAtOffset(long offset);
    
    // Table info.
    DOMString attributesOfColumnHeaders();
    DOMString attributesOfRowHeaders();
    DOMString attributesOfColumns();
    DOMString attributesOfRows();
    DOMString attributesOfVisibleCells();
    DOMString attributesOfHeader();
    AccessibilityUIElement cellForColumnAndRow(unsigned long column, unsigned long row);
    AccessibilityUIElement selectedRowAtIndex(unsigned long index);
    AccessibilityUIElement disclosedByRow();
    AccessibilityUIElement disclosedRowAtIndex(unsigned long index);
    AccessibilityUIElement rowAtIndex(unsigned long index);
    long indexInTable();
    DOMString rowIndexRange();
    DOMString columnIndexRange();
    long rowCount();
    long columnCount();
    object columnHeaders();
    object rowHeaders();

    AccessibilityUIElement ariaOwnsElementAtIndex(unsigned long index);
    AccessibilityUIElement ariaOwnsReferencingElementAtIndex(unsigned long index);
    AccessibilityUIElement ariaFlowToElementAtIndex(unsigned long index);
    AccessibilityUIElement ariaFlowToReferencingElementAtIndex(unsigned long index);
    AccessibilityUIElement ariaControlsElementAtIndex(unsigned long index);
    AccessibilityUIElement ariaControlsReferencingElementAtIndex(unsigned long index);
    AccessibilityUIElement ariaLabelledByElementAtIndex(unsigned long index);
    AccessibilityUIElement ariaLabelledByReferencingElementAtIndex(unsigned long index);
    AccessibilityUIElement ariaDescribedByElementAtIndex(unsigned long index);
    AccessibilityUIElement ariaDescribedByReferencingElementAtIndex(unsigned long index);
    AccessibilityUIElement ariaDetailsElementAtIndex(unsigned long index);
    AccessibilityUIElement ariaDetailsReferencingElementAtIndex(unsigned long index);
    AccessibilityUIElement ariaErrorMessageElementAtIndex(unsigned long index);
    AccessibilityUIElement ariaErrorMessageReferencingElementAtIndex(unsigned long index);

    // Paramaterized attributes.
    DOMString parameterizedAttributeNames();
    long lineForIndex(long index);
    DOMString rangeForLine(long index);
    DOMString rangeForPosition(long x, long y);
    DOMString boundsForRange(unsigned long location, unsigned long length);
    DOMString stringForRange(unsigned long location, unsigned long length);
    DOMString attributedStringForRange(unsigned long location, unsigned long length);
    boolean attributedStringRangeIsMisspelled(unsigned long location, unsigned long length);
    [PassContext] unsigned long uiElementCountForSearchPredicate(AccessibilityUIElement startElement, boolean isDirectionNext, object searchKey, DOMString searchText, boolean visibleOnly, boolean immediateDescendantsOnly);
    [PassContext] AccessibilityUIElement uiElementForSearchPredicate(AccessibilityUIElement startElement, boolean isDirectionNext, object searchKey, DOMString searchText, boolean visibleOnly, boolean immediateDescendantsOnly);
    [PassContext] DOMString selectTextWithCriteria(DOMString ambiguityResolution, object searchStrings, DOMString replacementString, DOMString activity);
    boolean setSelectedTextRange(unsigned long location, unsigned long length);

    // Scroll area attributes.
    readonly attribute AccessibilityUIElement horizontalScrollbar;
    readonly attribute AccessibilityUIElement verticalScrollbar;

    void scrollToMakeVisible();
    void scrollToGlobalPoint(long x, long y);
    void scrollToMakeVisibleWithSubFocus(long x, long y, long width, long height);

    void takeFocus();
    boolean scrollPageDown();
    boolean scrollPageUp();
    boolean scrollPageLeft();
    boolean scrollPageRight();

    // Text markers.
    AccessibilityTextMarkerRange lineTextMarkerRangeForTextMarker(AccessibilityTextMarker textMarker);
    AccessibilityTextMarkerRange textMarkerRangeForElement(AccessibilityUIElement element);    
    AccessibilityTextMarkerRange textMarkerRangeForMarkers(AccessibilityTextMarker startMarker, AccessibilityTextMarker endMarker);
    AccessibilityTextMarkerRange selectedTextMarkerRange();
    void resetSelectedTextMarkerRange();
    AccessibilityTextMarker startTextMarkerForTextMarkerRange(AccessibilityTextMarkerRange range);
    AccessibilityTextMarker endTextMarkerForTextMarkerRange(AccessibilityTextMarkerRange range);
    AccessibilityTextMarker endTextMarkerForBounds(long x, long y, long width, long height);
    AccessibilityTextMarker startTextMarkerForBounds(long x, long y, long width, long height);
    AccessibilityTextMarker textMarkerForPoint(long x, long y);
    AccessibilityTextMarker previousTextMarker(AccessibilityTextMarker marker);
    AccessibilityTextMarker nextTextMarker(AccessibilityTextMarker marker);
    AccessibilityUIElement accessibilityElementForTextMarker(AccessibilityTextMarker marker);
    DOMString stringForTextMarkerRange(AccessibilityTextMarkerRange range);
    DOMString attributedStringForTextMarkerRange(AccessibilityTextMarkerRange range);
    DOMString attributedStringForTextMarkerRangeWithOptions(AccessibilityTextMarkerRange range, boolean includeSpellCheck);
    long textMarkerRangeLength(AccessibilityTextMarkerRange range);
    boolean attributedStringForTextMarkerRangeContainsAttribute(DOMString attr, AccessibilityTextMarkerRange range);
    long indexForTextMarker(AccessibilityTextMarker marker);
    boolean isTextMarkerValid(AccessibilityTextMarker marker);
    AccessibilityTextMarker textMarkerForIndex(long textIndex);
    readonly attribute AccessibilityTextMarker startTextMarker;
    readonly attribute AccessibilityTextMarker endTextMarker;
    boolean setSelectedVisibleTextRange(AccessibilityTextMarkerRange range);
    AccessibilityTextMarkerRange leftWordTextMarkerRangeForTextMarker(AccessibilityTextMarker textMarker);
    AccessibilityTextMarkerRange rightWordTextMarkerRangeForTextMarker(AccessibilityTextMarker textMarker);
    AccessibilityTextMarker previousWordStartTextMarkerForTextMarker(AccessibilityTextMarker textMarker);
    AccessibilityTextMarker nextWordEndTextMarkerForTextMarker(AccessibilityTextMarker textMarker);
    AccessibilityTextMarkerRange paragraphTextMarkerRangeForTextMarker(AccessibilityTextMarker textMarker);
    AccessibilityTextMarker previousParagraphStartTextMarkerForTextMarker(AccessibilityTextMarker textMarker);
    AccessibilityTextMarker nextParagraphEndTextMarkerForTextMarker(AccessibilityTextMarker textMarker);
    AccessibilityTextMarkerRange sentenceTextMarkerRangeForTextMarker(AccessibilityTextMarker textMarker);
    AccessibilityTextMarker previousSentenceStartTextMarkerForTextMarker(AccessibilityTextMarker textMarker);
    AccessibilityTextMarker nextSentenceEndTextMarkerForTextMarker(AccessibilityTextMarker textMarker);
    AccessibilityTextMarkerRange textMarkerRangeMatchesTextNearMarkers(DOMString text, AccessibilityTextMarker startMarker, AccessibilityTextMarker endMarker);

    // Returns an ordered list of supported actions for an element.
    readonly attribute DOMString supportedActions;
    readonly attribute DOMString mathPostscriptsDescription;
    readonly attribute DOMString mathPrescriptsDescription;

    readonly attribute DOMString pathDescription;

    // iOS specific accessibility methods.
    readonly attribute DOMString identifier;
    readonly attribute DOMString traits;
    readonly attribute long elementTextPosition;
    readonly attribute long elementTextLength;
    readonly attribute DOMString stringForSelection;
    object elementsForRange(unsigned long location, unsigned long length);
    void increaseTextSelection();
    void decreaseTextSelection();
    AccessibilityUIElement linkedElement();
    AccessibilityUIElement headerElementAtIndex(unsigned long index);
    // This will simulate the accessibilityDidBecomeFocused API in UIKit.
    void assistiveTechnologySimulatedFocus();
    readonly attribute boolean isSearchField;
    readonly attribute boolean isTextArea;

    // Fieldset
    readonly attribute boolean hasContainedByFieldsetTrait;
    AccessibilityUIElement fieldsetAncestorElement();

    // Notification support.
    boolean addNotificationListener(object callbackFunction);
    boolean removeNotificationListener();
};

