Bug 873450 - Implement IA2 containing relations, r=tbsaunde

This commit is contained in:
Andrew Quartey 2013-10-25 11:14:32 -04:00
parent d31253fc11
commit 00e9067476
8 changed files with 105 additions and 29 deletions

View File

@ -11,7 +11,7 @@ interface nsIAccessible;
/**
* This interface gives access to an accessible's set of relations.
*/
[scriptable, uuid(9f85fc0d-2969-48e6-b822-68140f7e5770)]
[scriptable, uuid(55b308c4-2ae4-46bc-b4cd-4d4370e0a660)]
interface nsIAccessibleRelation : nsISupports
{
/**
@ -109,6 +109,21 @@ interface nsIAccessibleRelation : nsISupports
*/
const unsigned long RELATION_DEFAULT_BUTTON = 0x10;
/**
* The target object is the containing document object.
*/
const unsigned long RELATION_CONTAINING_DOCUMENT = 0x11;
/**
* The target object is the topmost containing document object in the tab pane.
*/
const unsigned long RELATION_CONTAINING_TAB_PANE = 0x12;
/**
* The target object is the containing application object.
*/
const unsigned long RELATION_CONTAINING_APPLICATION = 0x14;
/**
* Returns the type of the relation.
*/

View File

@ -109,7 +109,27 @@ MOZ_BEGIN_ENUM_CLASS(RelationType)
*/
DEFAULT_BUTTON = 0x10,
LAST = DEFAULT_BUTTON
/**
* The target object is the containing document object.
*/
CONTAINING_DOCUMENT = 0x11,
/**
* The target object is the topmost containing document object in the tab pane.
*/
CONTAINING_TAB_PANE = 0x12,
/**
* The target object is the containing window object.
*/
CONTAINING_WINDOW = 0x13,
/**
* The target object is the containing application object.
*/
CONTAINING_APPLICATION = 0x14,
LAST = CONTAINING_APPLICATION
MOZ_END_ENUM_CLASS(RelationType)

View File

@ -110,3 +110,21 @@ RELATIONTYPE(DEFAULT_BUTTON,
ATK_RELATION_NULL,
NAVRELATION_DEFAULT_BUTTON,
IA2_RELATION_NULL)
RELATIONTYPE(CONTAINING_DOCUMENT,
"containing document",
ATK_RELATION_NULL,
NAVRELATION_CONTAINING_DOCUMENT,
IA2_RELATION_CONTAINING_DOCUMENT)
RELATIONTYPE(CONTAINING_TAB_PANE,
"containing tab pane",
ATK_RELATION_NULL,
NAVRELATION_CONTAINING_TAB_PANE,
IA2_RELATION_CONTAINING_TAB_PANE)
RELATIONTYPE(CONTAINING_APPLICATION,
"containing application",
ATK_RELATION_NULL,
NAVRELATION_CONTAINING_APPLICATION,
IA2_RELATION_CONTAINING_APPLICATION)

View File

@ -13,6 +13,8 @@
#include "nsAccUtils.h"
#include "nsAccessibleRelation.h"
#include "nsAccessibilityService.h"
#include "ApplicationAccessible.h"
#include "nsCoreUtils.h"
#include "nsIAccessibleRelation.h"
#include "nsIAccessibleRole.h"
#include "nsEventShell.h"
@ -2180,6 +2182,33 @@ Accessible::RelationByType(RelationType aType)
return Relation();
}
case RelationType::CONTAINING_DOCUMENT:
return Relation(mDoc);
case RelationType::CONTAINING_TAB_PANE: {
nsCOMPtr<nsIDocShell> docShell =
nsCoreUtils::GetDocShellFor(GetNode());
if (docShell) {
// Walk up the parent chain without crossing the boundary at which item
// types change, preventing us from walking up out of tab content.
nsCOMPtr<nsIDocShellTreeItem> root;
docShell->GetSameTypeRootTreeItem(getter_AddRefs(root));
if (root) {
// If the item type is typeContent, we assume we are in browser tab
// content. Note, this includes content such as about:addons,
// for consistency.
int32_t itemType = 0;
root->GetItemType(&itemType);
if (itemType == nsIDocShellTreeItem::typeContent)
return Relation(nsAccUtils::GetDocAccessibleFor(root));
}
}
return Relation();
}
case RelationType::CONTAINING_APPLICATION:
return Relation(ApplicationAcc());
default:
return Relation();
}
@ -2214,7 +2243,10 @@ Accessible::GetRelations(nsIArray **aRelations)
nsIAccessibleRelation::RELATION_EMBEDDED_BY,
nsIAccessibleRelation::RELATION_POPUP_FOR,
nsIAccessibleRelation::RELATION_PARENT_WINDOW_OF,
nsIAccessibleRelation::RELATION_DEFAULT_BUTTON
nsIAccessibleRelation::RELATION_DEFAULT_BUTTON,
nsIAccessibleRelation::RELATION_CONTAINING_DOCUMENT,
nsIAccessibleRelation::RELATION_CONTAINING_TAB_PANE,
nsIAccessibleRelation::RELATION_CONTAINING_APPLICATION
};
for (uint32_t idx = 0; idx < ArrayLength(relationTypes); idx++) {

View File

@ -202,7 +202,10 @@ protected:
NAVRELATION_DEFAULT_BUTTON = 0x100d,
NAVRELATION_DESCRIBED_BY = 0x100e,
NAVRELATION_DESCRIPTION_FOR = 0x100f,
NAVRELATION_NODE_PARENT_OF = 0x1010
NAVRELATION_NODE_PARENT_OF = 0x1010,
NAVRELATION_CONTAINING_DOCUMENT = 0x1011,
NAVRELATION_CONTAINING_TAB_PANE = 0x1012,
NAVRELATION_CONTAINING_APPLICATION = 0x1014
};
};

View File

@ -11,6 +11,7 @@
#include "DocAccessible.h"
#include "nsAccUtils.h"
#include "nsCoreUtils.h"
#include "Relation.h"
#include "uiaRawElmProvider.h"
#include "mozilla/Preferences.h"
@ -60,33 +61,12 @@ ServiceProvider::QueryService(REFGUID aGuidService, REFIID aIID,
if (aIID != IID_IAccessible)
return E_NOINTERFACE;
nsCOMPtr<nsIDocShell> docShell =
nsCoreUtils::GetDocShellFor(mAccessible->GetNode());
if (!docShell)
return E_UNEXPECTED;
// Walk up the parent chain without crossing the boundary at which item
// types change, preventing us from walking up out of tab content.
nsCOMPtr<nsIDocShellTreeItem> root;
docShell->GetSameTypeRootTreeItem(getter_AddRefs(root));
if (!root)
return E_UNEXPECTED;
// If the item type is typeContent, we assume we are in browser tab content.
// Note this includes content such as about:addons, for consistency.
int32_t itemType;
root->GetItemType(&itemType);
if (itemType != nsIDocShellTreeItem::typeContent)
Relation rel = mAccessible->RelationByType(RelationType::CONTAINING_TAB_PANE);
AccessibleWrap* tabDoc = static_cast<AccessibleWrap*>(rel.Next());
if (!tabDoc)
return E_NOINTERFACE;
// Make sure this is a document.
DocAccessible* docAcc = nsAccUtils::GetDocAccessibleFor(root);
if (!docAcc)
return E_UNEXPECTED;
*aInstancePtr = static_cast<IAccessible*>(docAcc);
*aInstancePtr = static_cast<IAccessible*>(tabDoc);
(reinterpret_cast<IUnknown*>(*aInstancePtr))->AddRef();
return S_OK;
}

View File

@ -18,6 +18,9 @@ const RELATION_NODE_PARENT_OF = nsIAccessibleRelation.RELATION_NODE_PARENT_OF;
const RELATION_PARENT_WINDOW_OF = nsIAccessibleRelation.RELATION_PARENT_WINDOW_OF;
const RELATION_POPUP_FOR = nsIAccessibleRelation.RELATION_POPUP_FOR;
const RELATION_SUBWINDOW_OF = nsIAccessibleRelation.RELATION_SUBWINDOW_OF;
const RELATION_CONTAINING_DOCUMENT = nsIAccessibleRelation.RELATION_CONTAINING_DOCUMENT;
const RELATION_CONTAINING_TAB_PANE = nsIAccessibleRelation.RELATION_CONTAINING_TAB_PANE;
const RELATION_CONTAINING_APPLICATION = nsIAccessibleRelation.RELATION_CONTAINING_APPLICATION;
////////////////////////////////////////////////////////////////////////////////
// General

View File

@ -167,6 +167,11 @@
testRelation("legend", RELATION_LABEL_FOR, "fieldset");
testRelation("fieldset", RELATION_LABELLED_BY, "legend");
// containing relations
testRelation("control1_1", RELATION_CONTAINING_DOCUMENT, document);
testRelation("control1_1", RELATION_CONTAINING_TAB_PANE, getTabDocAccessible("control1_1"));
testRelation("control1_1", RELATION_CONTAINING_APPLICATION, getApplicationAccessible());
// finish test
SimpleTest.finish();
}