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

[
    Conditional=ACCESSIBILITY,
] 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 stringDescriptionOfAttributeValue(DOMString attr);
    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 DOMString popupValue;
    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);
    DOMString attributedStringForElement();
    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);
    [PassContext] object searchTextWithCriteria(object searchStrings, DOMString startFrom, DOMString direction);
    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();
    boolean replaceTextInRange(DOMString string, long position, long length);
    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();
};

