blob: a8ea72aeda153cab0a66fe33cfb588f411e72a26 [file] [log] [blame]
// Copyright 2013 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.
#include <stddef.h>
#include <stdint.h>
#include "base/android/scoped_java_ref.h"
#include "base/macros.h"
#include "base/timer/elapsed_timer.h"
#include "content/browser/accessibility/browser_accessibility.h"
#include "ui/accessibility/platform/ax_platform_node.h"
namespace content {
class CONTENT_EXPORT BrowserAccessibilityAndroid : public BrowserAccessibility {
static BrowserAccessibilityAndroid* GetFromUniqueId(int32_t unique_id);
int32_t unique_id() const { return GetUniqueId().Get(); }
// Overrides from BrowserAccessibility.
void OnDataChanged() override;
bool IsNative() const override;
void OnLocationChanged() override;
base::string16 GetValue() const override;
bool PlatformIsLeaf() const override;
// Android needs events even on objects that are trimmed away.
bool CanFireEvents() const override;
bool IsCheckable() const;
bool IsChecked() const;
bool IsClickable() const override;
bool IsCollapsed() const;
bool IsCollection() const;
bool IsCollectionItem() const;
bool IsContentInvalid() const;
bool IsDismissable() const;
bool IsEditableText() const;
bool IsEnabled() const;
bool IsExpanded() const;
bool IsFocusable() const;
bool IsFocused() const;
bool IsHeading() const;
bool IsHierarchical() const;
bool IsLink() const;
bool IsMultiLine() const;
bool IsPassword() const;
bool IsRangeType() const;
bool IsScrollable() const;
bool IsSelected() const;
bool IsSlider() const;
bool IsVisibleToUser() const;
// This returns true for all nodes that we should navigate to.
// Nodes that have a generic role, no accessible name, and aren't
// focusable or clickable aren't interesting.
bool IsInterestingOnAndroid() const;
// If this node is interesting (IsInterestingOnAndroid() returns true),
// returns |this|. If not, it recursively checks all of the
// platform children of this node, and if just a single one is
// interesting, returns that one. If no descendants are interesting, or
// if more than one is interesting, returns nullptr.
const BrowserAccessibilityAndroid* GetSoleInterestingNodeFromSubtree() const;
// Returns true if the given subtree has inline text box data, or if there
// aren't any to load.
bool AreInlineTextBoxesLoaded() const;
bool CanOpenPopup() const;
bool HasFocusableNonOptionChild() const;
bool HasNonEmptyValue() const;
bool HasCharacterLocations() const;
bool HasImage() const;
const char* GetClassName() const;
base::string16 GetText() const override;
base::string16 GetHint() const;
std::string GetRoleString() const;
base::string16 GetContentInvalidErrorMessage() const;
base::string16 GetRoleDescription() const;
int GetItemIndex() const;
int GetItemCount() const;
bool CanScrollForward() const;
bool CanScrollBackward() const;
bool CanScrollUp() const;
bool CanScrollDown() const;
bool CanScrollLeft() const;
bool CanScrollRight() const;
int GetScrollX() const;
int GetScrollY() const;
int GetMinScrollX() const;
int GetMinScrollY() const;
int GetMaxScrollX() const;
int GetMaxScrollY() const;
bool Scroll(int direction) const;
int GetTextChangeFromIndex() const;
int GetTextChangeAddedCount() const;
int GetTextChangeRemovedCount() const;
base::string16 GetTextChangeBeforeText() const;
int GetSelectionStart() const;
int GetSelectionEnd() const;
int GetEditableTextLength() const;
int AndroidInputType() const;
int AndroidLiveRegionType() const;
int AndroidRangeType() const;
int RowCount() const;
int ColumnCount() const;
int RowIndex() const;
int RowSpan() const;
int ColumnIndex() const;
int ColumnSpan() const;
float RangeMin() const;
float RangeMax() const;
float RangeCurrentValue() const;
// Calls GetLineBoundaries or GetWordBoundaries depending on the value
// of |granularity|, or fails if anything else is passed in |granularity|.
void GetGranularityBoundaries(int granularity,
std::vector<int32_t>* starts,
std::vector<int32_t>* ends,
int offset);
// Append line start and end indices for the text of this node
// (as returned by GetText()), adding |offset| to each one.
void GetLineBoundaries(std::vector<int32_t>* line_starts,
std::vector<int32_t>* line_ends,
int offset);
// Append word start and end indices for the text of this node
// (as returned by GetText()) to |word_starts| and |word_ends|,
// adding |offset| to each one.
void GetWordBoundaries(std::vector<int32_t>* word_starts,
std::vector<int32_t>* word_ends,
int offset);
// Used to keep track of when to stop reporting content_invalid.
// Timer only applies if node has focus.
void ResetContentInvalidTimer();
base::ElapsedTimer content_invalid_timer_ = base::ElapsedTimer();
// This gives BrowserAccessibility::Create access to the class constructor.
friend class BrowserAccessibility;
~BrowserAccessibilityAndroid() override;
bool HasOnlyTextChildren() const;
bool HasOnlyTextAndImageChildren() const;
bool IsIframe() const;
bool ShouldExposeValueAsName() const;
int CountChildrenWithRole(ax::mojom::Role role) const;
static size_t CommonPrefixLength(const base::string16 a,
const base::string16 b);
static size_t CommonSuffixLength(const base::string16 a,
const base::string16 b);
static size_t CommonEndLengths(const base::string16 a,
const base::string16 b);
base::string16 cached_text_;
base::string16 old_value_;
base::string16 new_value_;
int32_t unique_id_;
} // namespace content