/*
 * Copyright (C) 2009 Google 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:
 *
 *     * Redistributions of source code must retain the above copyright
 * notice, this list of conditions and the following disclaimer.
 *     * 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.
 *     * Neither the name of Google Inc. nor the names of its
 * contributors may be used to endorse or promote products derived from
 * this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
 * OWNER OR 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.
 */

#ifndef WebAXObject_h
#define WebAXObject_h

#include "../platform/WebCommon.h"
#include "../platform/WebPoint.h"
#include "../platform/WebPrivatePtr.h"
#include "../platform/WebSize.h"
#include "../platform/WebVector.h"
#include "WebAXEnums.h"
#include <memory>

class SkMatrix44;

namespace blink {

class AXObject;
class ScopedAXObjectCache;
class WebAXObject;
class WebNode;
class WebDocument;
class WebString;
class WebURL;
struct WebFloatRect;
struct WebPoint;
struct WebRect;
struct WebSize;

class BLINK_EXPORT WebAXSparseAttributeClient {
 public:
  WebAXSparseAttributeClient() {}
  virtual ~WebAXSparseAttributeClient() {}

  virtual void addBoolAttribute(WebAXBoolAttribute, bool) = 0;
  virtual void addStringAttribute(WebAXStringAttribute, const WebString&) = 0;
  virtual void addObjectAttribute(WebAXObjectAttribute, const WebAXObject&) = 0;
  virtual void addObjectVectorAttribute(WebAXObjectVectorAttribute,
                                        const WebVector<WebAXObject>&) = 0;
};

// An instance of this class, while kept alive, indicates that accessibility
// should be temporarily enabled. If accessibility was enabled globally
// (WebSettings::setAccessibilityEnabled), this will have no effect.
class WebScopedAXContext {
 public:
  BLINK_EXPORT WebScopedAXContext(WebDocument& rootDocument);
  BLINK_EXPORT ~WebScopedAXContext();

  BLINK_EXPORT WebAXObject root() const;

 private:
  std::unique_ptr<ScopedAXObjectCache> m_private;
};

// A container for passing around a reference to AXObject.
class WebAXObject {
 public:
  ~WebAXObject() { reset(); }

  WebAXObject() {}
  WebAXObject(const WebAXObject& o) { assign(o); }
  WebAXObject& operator=(const WebAXObject& o) {
    assign(o);
    return *this;
  }

  BLINK_EXPORT void reset();
  BLINK_EXPORT void assign(const WebAXObject&);
  BLINK_EXPORT bool equals(const WebAXObject&) const;

  bool isNull() const { return m_private.isNull(); }
  // isDetached also checks for null, so it's safe to just call isDetached.
  BLINK_EXPORT bool isDetached() const;

  BLINK_EXPORT int axID() const;

  // Get a new AXID that's not used by any accessibility node in this process,
  // for when the client needs to insert additional nodes into the accessibility
  // tree.
  BLINK_EXPORT int generateAXID() const;

  // Update layout on the underlying tree, and return true if this object is
  // still valid (not detached). Note that calling this method
  // can cause other WebAXObjects to become invalid, too,
  // so always call isDetached if any other WebCore code has run.
  BLINK_EXPORT bool updateLayoutAndCheckValidity();

  BLINK_EXPORT unsigned childCount() const;

  BLINK_EXPORT WebAXObject childAt(unsigned) const;
  BLINK_EXPORT WebAXObject parentObject() const;

  // Retrieve accessibility attributes that apply to only a small
  // fraction of WebAXObjects by passing an implementation of
  // WebAXSparseAttributeClient, which will be called with only the attributes
  // that apply to this object.
  BLINK_EXPORT void getSparseAXAttributes(WebAXSparseAttributeClient&) const;

  BLINK_EXPORT bool isAnchor() const;
  BLINK_EXPORT bool isAriaReadOnly() const;
  BLINK_EXPORT bool isButtonStateMixed() const;
  BLINK_EXPORT bool isChecked() const;
  BLINK_EXPORT bool isClickable() const;
  BLINK_EXPORT bool isCollapsed() const;
  BLINK_EXPORT bool isControl() const;
  BLINK_EXPORT bool isEnabled() const;
  BLINK_EXPORT WebAXExpanded isExpanded() const;
  BLINK_EXPORT bool isFocused() const;
  BLINK_EXPORT bool isHovered() const;
  BLINK_EXPORT bool isLinked() const;
  BLINK_EXPORT bool isLoaded() const;
  BLINK_EXPORT bool isModal() const;
  BLINK_EXPORT bool isMultiSelectable() const;
  BLINK_EXPORT bool isOffScreen() const;
  BLINK_EXPORT bool isPasswordField() const;
  BLINK_EXPORT bool isPressed() const;
  BLINK_EXPORT bool isReadOnly() const;
  BLINK_EXPORT bool isRequired() const;
  BLINK_EXPORT bool isSelected() const;
  BLINK_EXPORT bool isSelectedOptionActive() const;
  BLINK_EXPORT bool isVisible() const;
  BLINK_EXPORT bool isVisited() const;

  BLINK_EXPORT WebString accessKey() const;
  BLINK_EXPORT unsigned backgroundColor() const;
  BLINK_EXPORT unsigned color() const;
  // Deprecated.
  BLINK_EXPORT void colorValue(int& r, int& g, int& b) const;
  BLINK_EXPORT unsigned colorValue() const;
  BLINK_EXPORT WebAXObject ariaActiveDescendant() const;
  BLINK_EXPORT WebString ariaAutoComplete() const;
  BLINK_EXPORT WebAXAriaCurrentState ariaCurrentState() const;
  BLINK_EXPORT bool ariaHasPopup() const;
  BLINK_EXPORT bool isEditable() const;
  BLINK_EXPORT bool isMultiline() const;
  BLINK_EXPORT bool isRichlyEditable() const;
  BLINK_EXPORT bool ariaOwns(WebVector<WebAXObject>& ownsElements) const;
  BLINK_EXPORT WebString fontFamily() const;
  BLINK_EXPORT float fontSize() const;
  BLINK_EXPORT bool canvasHasFallbackContent() const;
  // If this is an image, returns the image (scaled to maxSize) as a data url.
  BLINK_EXPORT WebString imageDataUrl(const WebSize& maxSize) const;
  BLINK_EXPORT WebAXInvalidState invalidState() const;
  // Only used when invalidState() returns WebAXInvalidStateOther.
  BLINK_EXPORT WebString ariaInvalidValue() const;
  BLINK_EXPORT double estimatedLoadingProgress() const;
  BLINK_EXPORT int headingLevel() const;
  BLINK_EXPORT int hierarchicalLevel() const;
  BLINK_EXPORT WebAXObject hitTest(const WebPoint&) const;
  BLINK_EXPORT WebString keyboardShortcut() const;
  BLINK_EXPORT WebString language() const;
  BLINK_EXPORT WebAXObject inPageLinkTarget() const;
  BLINK_EXPORT WebAXOrientation orientation() const;
  BLINK_EXPORT WebVector<WebAXObject> radioButtonsInGroup() const;
  BLINK_EXPORT WebAXRole role() const;
  BLINK_EXPORT WebString stringValue() const;
  BLINK_EXPORT WebAXTextDirection textDirection() const;
  BLINK_EXPORT WebAXTextStyle textStyle() const;
  BLINK_EXPORT WebURL url() const;

  // Retrieves the accessible name of the object, an enum indicating where the
  // name was derived from, and a list of related objects that were used to
  // derive the name, if any.
  BLINK_EXPORT WebString name(WebAXNameFrom&,
                              WebVector<WebAXObject>& nameObjects) const;
  // Simplified version of |name| when nameFrom and nameObjects aren't needed.
  BLINK_EXPORT WebString name() const;
  // Takes the result of nameFrom from calling |name|, above, and retrieves the
  // accessible description of the object, which is secondary to |name|, an enum
  // indicating where the description was derived from, and a list of objects
  // that were used to derive the description, if any.
  BLINK_EXPORT WebString
  description(WebAXNameFrom,
              WebAXDescriptionFrom&,
              WebVector<WebAXObject>& descriptionObjects) const;
  // Takes the result of nameFrom and descriptionFrom from calling |name| and
  // |description|, above, and retrieves the placeholder of the object, if
  // present and if it wasn't already exposed by one of the two functions above.
  BLINK_EXPORT WebString placeholder(WebAXNameFrom) const;

  // The following selection functions get or set the global document
  // selection and can be called on any object in the tree.
  BLINK_EXPORT void selection(WebAXObject& anchorObject,
                              int& anchorOffset,
                              WebAXTextAffinity& anchorAffinity,
                              WebAXObject& focusObject,
                              int& focusOffset,
                              WebAXTextAffinity& focusAffinity) const;
  BLINK_EXPORT void setSelection(const WebAXObject& anchorObject,
                                 int anchorOffset,
                                 const WebAXObject& focusObject,
                                 int focusOffset) const;

  // The following selection functions return text offsets calculated starting
  // the current object. They only report on a selection that is placed on
  // the current object or on any of its descendants.
  BLINK_EXPORT unsigned selectionEnd() const;
  BLINK_EXPORT unsigned selectionEndLineNumber() const;
  BLINK_EXPORT unsigned selectionStart() const;
  BLINK_EXPORT unsigned selectionStartLineNumber() const;

  // 1-based position in set & Size of set.
  BLINK_EXPORT int posInSet() const;
  BLINK_EXPORT int setSize() const;

  // Live regions.
  BLINK_EXPORT bool isInLiveRegion() const;
  BLINK_EXPORT bool liveRegionAtomic() const;
  BLINK_EXPORT bool liveRegionBusy() const;
  BLINK_EXPORT WebString liveRegionRelevant() const;
  BLINK_EXPORT WebString liveRegionStatus() const;
  BLINK_EXPORT WebAXObject liveRegionRoot() const;
  BLINK_EXPORT bool containerLiveRegionAtomic() const;
  BLINK_EXPORT bool containerLiveRegionBusy() const;
  BLINK_EXPORT WebString containerLiveRegionRelevant() const;
  BLINK_EXPORT WebString containerLiveRegionStatus() const;

  BLINK_EXPORT bool supportsRangeValue() const;
  BLINK_EXPORT WebString valueDescription() const;
  BLINK_EXPORT float valueForRange() const;
  BLINK_EXPORT float maxValueForRange() const;
  BLINK_EXPORT float minValueForRange() const;

  BLINK_EXPORT WebNode node() const;
  BLINK_EXPORT WebDocument document() const;
  BLINK_EXPORT bool hasComputedStyle() const;
  BLINK_EXPORT WebString computedStyleDisplay() const;
  BLINK_EXPORT bool accessibilityIsIgnored() const;
  BLINK_EXPORT bool lineBreaks(WebVector<int>&) const;
  BLINK_EXPORT void markers(WebVector<WebAXMarkerType>& types,
                            WebVector<int>& starts,
                            WebVector<int>& ends) const;

  // Actions
  BLINK_EXPORT WebAXSupportedAction action() const;
  BLINK_EXPORT bool canDecrement() const;
  BLINK_EXPORT bool canIncrement() const;
  BLINK_EXPORT bool canPress() const;
  BLINK_EXPORT bool canSetFocusAttribute() const;
  BLINK_EXPORT bool canSetSelectedAttribute() const;
  BLINK_EXPORT bool canSetValueAttribute() const;
  BLINK_EXPORT bool performDefaultAction() const;
  BLINK_EXPORT bool press() const;
  BLINK_EXPORT bool increment() const;
  BLINK_EXPORT bool decrement() const;
  BLINK_EXPORT void setFocused(bool) const;
  BLINK_EXPORT void setSelectedTextRange(int selectionStart,
                                         int selectionEnd) const;
  BLINK_EXPORT void setSequentialFocusNavigationStartingPoint() const;
  BLINK_EXPORT void setValue(WebString) const;
  BLINK_EXPORT void showContextMenu() const;

  // For a table
  BLINK_EXPORT int ariaColumnCount() const;
  BLINK_EXPORT unsigned ariaColumnIndex() const;
  BLINK_EXPORT int ariaRowCount() const;
  BLINK_EXPORT unsigned ariaRowIndex() const;
  BLINK_EXPORT unsigned columnCount() const;
  BLINK_EXPORT unsigned rowCount() const;
  BLINK_EXPORT WebAXObject cellForColumnAndRow(unsigned column,
                                               unsigned row) const;
  BLINK_EXPORT WebAXObject headerContainerObject() const;
  BLINK_EXPORT WebAXObject rowAtIndex(unsigned rowIndex) const;
  BLINK_EXPORT WebAXObject columnAtIndex(unsigned columnIndex) const;
  BLINK_EXPORT void rowHeaders(WebVector<WebAXObject>&) const;
  BLINK_EXPORT void columnHeaders(WebVector<WebAXObject>&) const;

  // For a table row
  BLINK_EXPORT unsigned rowIndex() const;
  BLINK_EXPORT WebAXObject rowHeader() const;

  // For a table column
  BLINK_EXPORT unsigned columnIndex() const;
  BLINK_EXPORT WebAXObject columnHeader() const;

  // For a table cell
  BLINK_EXPORT unsigned cellColumnIndex() const;
  BLINK_EXPORT unsigned cellColumnSpan() const;
  BLINK_EXPORT unsigned cellRowIndex() const;
  BLINK_EXPORT unsigned cellRowSpan() const;
  BLINK_EXPORT WebAXSortDirection sortDirection() const;

  // Load inline text boxes for just this subtree, even if
  // settings->inlineTextBoxAccessibilityEnabled() is false.
  BLINK_EXPORT void loadInlineTextBoxes() const;

  // Walk the WebAXObjects on the same line. This is supported on any
  // object type but primarily intended to be used for inline text boxes.
  BLINK_EXPORT WebAXObject nextOnLine() const;
  BLINK_EXPORT WebAXObject previousOnLine() const;

  // For an inline text box.
  BLINK_EXPORT void characterOffsets(WebVector<int>&) const;
  BLINK_EXPORT void wordBoundaries(WebVector<int>& starts,
                                   WebVector<int>& ends) const;

  // Scrollable containers.
  BLINK_EXPORT bool isScrollableContainer() const;
  BLINK_EXPORT WebPoint getScrollOffset() const;
  BLINK_EXPORT WebPoint minimumScrollOffset() const;
  BLINK_EXPORT WebPoint maximumScrollOffset() const;
  BLINK_EXPORT void setScrollOffset(const WebPoint&) const;

  // Every object's bounding box is returned relative to a
  // container object (which is guaranteed to be an ancestor) and
  // optionally a transformation matrix that needs to be applied too.
  // To compute the absolute bounding box of an element, start with its
  // boundsInContainer and apply the transform. Then as long as its container is
  // not null, walk up to its container and offset by the container's offset
  // from origin, the container's scroll position if any, and apply the
  // container's transform.  Do this until you reach the root of the tree.
  BLINK_EXPORT void getRelativeBounds(WebAXObject& offsetContainer,
                                      WebFloatRect& boundsInContainer,
                                      SkMatrix44& containerTransform) const;

  // Make this object visible by scrolling as many nested scrollable views as
  // needed.
  BLINK_EXPORT void scrollToMakeVisible() const;
  // Same, but if the whole object can't be made visible, try for this subrect,
  // in local coordinates.
  BLINK_EXPORT void scrollToMakeVisibleWithSubFocus(const WebRect&) const;
  // Scroll this object to a given point in global coordinates of the top-level
  // window.
  BLINK_EXPORT void scrollToGlobalPoint(const WebPoint&) const;

#if BLINK_IMPLEMENTATION
  WebAXObject(AXObject*);
  WebAXObject& operator=(AXObject*);
  operator AXObject*() const;
#endif

 private:
  WebPrivatePtr<AXObject> m_private;
};

}  // namespace blink

#endif
