mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Bug 873450 - Implement IA2 containing relations, r=tbsaunde
This commit is contained in:
parent
d31253fc11
commit
00e9067476
@ -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.
|
||||
*/
|
||||
|
@ -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)
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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++) {
|
||||
|
@ -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
|
||||
};
|
||||
};
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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();
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user