diff options
Diffstat (limited to 'accessible/xpcom/xpcAccessiblePivot.cpp')
-rw-r--r-- | accessible/xpcom/xpcAccessiblePivot.cpp | 155 |
1 files changed, 155 insertions, 0 deletions
diff --git a/accessible/xpcom/xpcAccessiblePivot.cpp b/accessible/xpcom/xpcAccessiblePivot.cpp new file mode 100644 index 0000000000..862cb88bdd --- /dev/null +++ b/accessible/xpcom/xpcAccessiblePivot.cpp @@ -0,0 +1,155 @@ +/* -*- 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 "xpcAccessiblePivot.h" +#include "xpcAccessibleDocument.h" + +#include "Pivot.h" + +using namespace mozilla::a11y; + +using mozilla::DebugOnly; + +/** + * An object that stores a given traversal rule during the pivot movement. + */ +class xpcPivotRule : public PivotRule { + public: + explicit xpcPivotRule(nsIAccessibleTraversalRule* aRule) : mRule(aRule) {} + ~xpcPivotRule() {} + + virtual uint16_t Match(Accessible* aAcc) override; + + private: + nsCOMPtr<nsIAccessibleTraversalRule> mRule; +}; + +//////////////////////////////////////////////////////////////////////////////// +// xpcAccessiblePivot + +xpcAccessiblePivot::xpcAccessiblePivot(nsIAccessible* aRoot) : mRoot(aRoot) { + NS_ASSERTION(aRoot, "A root accessible is required"); +} + +xpcAccessiblePivot::~xpcAccessiblePivot() {} + +//////////////////////////////////////////////////////////////////////////////// +// nsISupports + +NS_IMPL_CYCLE_COLLECTION(xpcAccessiblePivot, mRoot) + +NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(xpcAccessiblePivot) + NS_INTERFACE_MAP_ENTRY(nsIAccessiblePivot) + NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIAccessiblePivot) +NS_INTERFACE_MAP_END + +NS_IMPL_CYCLE_COLLECTING_ADDREF(xpcAccessiblePivot) +NS_IMPL_CYCLE_COLLECTING_RELEASE(xpcAccessiblePivot) + +//////////////////////////////////////////////////////////////////////////////// +// nsIAccessiblePivot + +NS_IMETHODIMP +xpcAccessiblePivot::Next(nsIAccessible* aAnchor, + nsIAccessibleTraversalRule* aRule, bool aIncludeStart, + uint8_t aArgc, nsIAccessible** aResult) { + NS_ENSURE_ARG(aResult); + NS_ENSURE_ARG(aRule); + + Accessible* root = Root(); + Accessible* anchor = aAnchor->ToInternalGeneric(); + NS_ENSURE_TRUE(root && anchor, NS_ERROR_NOT_IN_TREE); + + Pivot pivot(Root()); + xpcPivotRule rule(aRule); + Accessible* result = + pivot.Next(anchor, rule, (aArgc > 0) ? aIncludeStart : false); + NS_IF_ADDREF(*aResult = ToXPC(result)); + + return NS_OK; +} + +NS_IMETHODIMP +xpcAccessiblePivot::Prev(nsIAccessible* aAnchor, + nsIAccessibleTraversalRule* aRule, bool aIncludeStart, + uint8_t aArgc, nsIAccessible** aResult) { + NS_ENSURE_ARG(aResult); + NS_ENSURE_ARG(aRule); + + Accessible* root = Root(); + Accessible* anchor = aAnchor->ToInternalGeneric(); + NS_ENSURE_TRUE(root && anchor, NS_ERROR_NOT_IN_TREE); + + Pivot pivot(Root()); + xpcPivotRule rule(aRule); + Accessible* result = + pivot.Prev(anchor, rule, (aArgc > 0) ? aIncludeStart : false); + NS_IF_ADDREF(*aResult = ToXPC(result)); + + return NS_OK; +} + +NS_IMETHODIMP +xpcAccessiblePivot::First(nsIAccessibleTraversalRule* aRule, + nsIAccessible** aResult) { + NS_ENSURE_ARG(aResult); + NS_ENSURE_ARG(aRule); + + Accessible* root = Root(); + NS_ENSURE_TRUE(root, NS_ERROR_NOT_IN_TREE); + + Pivot pivot(root); + xpcPivotRule rule(aRule); + Accessible* result = pivot.First(rule); + NS_IF_ADDREF(*aResult = ToXPC(result)); + + return NS_OK; +} + +NS_IMETHODIMP +xpcAccessiblePivot::Last(nsIAccessibleTraversalRule* aRule, + nsIAccessible** aResult) { + NS_ENSURE_ARG(aResult); + NS_ENSURE_ARG(aRule); + + Accessible* root = Root(); + NS_ENSURE_TRUE(root, NS_ERROR_NOT_IN_TREE); + + Pivot pivot(root); + xpcPivotRule rule(aRule); + Accessible* result = pivot.Last(rule); + NS_IF_ADDREF(*aResult = ToXPC(result)); + + return NS_OK; +} + +NS_IMETHODIMP +xpcAccessiblePivot::AtPoint(int32_t aX, int32_t aY, + nsIAccessibleTraversalRule* aRule, + nsIAccessible** aResult) { + NS_ENSURE_ARG_POINTER(aResult); + NS_ENSURE_ARG_POINTER(aRule); + + Accessible* root = Root(); + NS_ENSURE_TRUE(root, NS_ERROR_NOT_IN_TREE); + + xpcPivotRule rule(aRule); + Pivot pivot(root); + + Accessible* result = pivot.AtPoint(aX, aY, rule); + NS_IF_ADDREF(*aResult = ToXPC(result)); + + return NS_OK; +} + +uint16_t xpcPivotRule::Match(Accessible* aAcc) { + uint16_t matchResult = nsIAccessibleTraversalRule::FILTER_IGNORE; + + DebugOnly<nsresult> rv = mRule->Match(ToXPC(aAcc), &matchResult); + MOZ_ASSERT(NS_SUCCEEDED(rv)); + + return matchResult; +} |