Bug 1455676 part 2. Remove nsIDOMNode usage from accessible/. r=surkov

This commit is contained in:
Boris Zbarsky 2018-05-29 22:58:47 -04:00
parent 89366855ba
commit 4ef13b9076
20 changed files with 88 additions and 96 deletions

View File

@ -199,7 +199,6 @@ a11y::MakeXPCEvent(AccEvent* aEvent)
DocAccessible* doc = aEvent->Document();
Accessible* acc = aEvent->GetAccessible();
nsINode* node = acc->GetNode();
nsIDOMNode* domNode = node ? node->AsDOMNode() : nullptr;
bool fromUser = aEvent->IsFromUserInput();
uint32_t type = aEvent->GetEventType();
uint32_t eventGroup = aEvent->GetEventGroups();
@ -210,7 +209,7 @@ a11y::MakeXPCEvent(AccEvent* aEvent)
bool extra = false;
uint32_t state = nsAccUtils::To32States(sc->GetState(), &extra);
xpEvent = new xpcAccStateChangeEvent(type, ToXPC(acc), ToXPCDocument(doc),
domNode, fromUser,
node, fromUser,
state, extra, sc->IsStateEnabled());
return xpEvent.forget();
}
@ -220,7 +219,7 @@ a11y::MakeXPCEvent(AccEvent* aEvent)
nsString text;
tc->GetModifiedText(text);
xpEvent = new xpcAccTextChangeEvent(type, ToXPC(acc), ToXPCDocument(doc),
domNode, fromUser,
node, fromUser,
tc->GetStartOffset(), tc->GetLength(),
tc->IsTextInserted(), text);
return xpEvent.forget();
@ -229,7 +228,7 @@ a11y::MakeXPCEvent(AccEvent* aEvent)
if (eventGroup & (1 << AccEvent::eHideEvent)) {
AccHideEvent* hideEvent = downcast_accEvent(aEvent);
xpEvent = new xpcAccHideEvent(type, ToXPC(acc), ToXPCDocument(doc),
domNode, fromUser,
node, fromUser,
ToXPC(hideEvent->TargetParent()),
ToXPC(hideEvent->TargetNextSibling()),
ToXPC(hideEvent->TargetPrevSibling()));
@ -239,7 +238,7 @@ a11y::MakeXPCEvent(AccEvent* aEvent)
if (eventGroup & (1 << AccEvent::eCaretMoveEvent)) {
AccCaretMoveEvent* cm = downcast_accEvent(aEvent);
xpEvent = new xpcAccCaretMoveEvent(type, ToXPC(acc), ToXPCDocument(doc),
domNode, fromUser,
node, fromUser,
cm->GetCaretOffset());
return xpEvent.forget();
}
@ -248,7 +247,7 @@ a11y::MakeXPCEvent(AccEvent* aEvent)
AccVCChangeEvent* vcc = downcast_accEvent(aEvent);
xpEvent = new xpcAccVirtualCursorChangeEvent(type,
ToXPC(acc), ToXPCDocument(doc),
domNode, fromUser,
node, fromUser,
ToXPC(vcc->OldAccessible()),
vcc->OldStartOffset(),
vcc->OldEndOffset(),
@ -262,12 +261,12 @@ a11y::MakeXPCEvent(AccEvent* aEvent)
oac->GetAttribute()->ToString(attribute);
xpEvent = new xpcAccObjectAttributeChangedEvent(type,
ToXPC(acc),
ToXPCDocument(doc), domNode,
ToXPCDocument(doc), node,
fromUser,
attribute);
return xpEvent.forget();
}
xpEvent = new xpcAccEvent(type, ToXPC(acc), ToXPCDocument(doc), domNode, fromUser);
xpEvent = new xpcAccEvent(type, ToXPC(acc), ToXPCDocument(doc), node, fromUser);
return xpEvent.forget();
}

View File

@ -1661,17 +1661,16 @@ nsAccessibilityService::RemoveNativeRootAccessible(Accessible* aAccessible)
}
bool
nsAccessibilityService::HasAccessible(nsIDOMNode* aDOMNode)
nsAccessibilityService::HasAccessible(nsINode* aDOMNode)
{
nsCOMPtr<nsINode> node(do_QueryInterface(aDOMNode));
if (!node)
if (!aDOMNode)
return false;
DocAccessible* document = GetDocAccessible(node->OwnerDoc());
DocAccessible* document = GetDocAccessible(aDOMNode->OwnerDoc());
if (!document)
return false;
return document->HasAccessible(node);
return document->HasAccessible(aDOMNode);
}
////////////////////////////////////////////////////////////////////////////////

View File

@ -121,7 +121,7 @@ public:
Accessible* AddNativeRootAccessible(void* aAtkAccessible);
void RemoveNativeRootAccessible(Accessible* aRootAccessible);
bool HasAccessible(nsIDOMNode* aDOMNode);
bool HasAccessible(nsINode* aDOMNode);
/**
* Get a string equivalent for an accessible role value.

View File

@ -5,12 +5,13 @@
#include "nsISupports.idl"
interface nsIDOMNode;
interface nsIAccessible;
interface nsIWeakReference;
interface nsIPresShell;
interface nsIAccessiblePivot;
webidl Node;
/**
* An interface for in-process accessibility clients wishing to get an
* nsIAccessible for a given DOM node. More documentation at:
@ -31,7 +32,7 @@ interface nsIAccessibilityService : nsISupports
* @param aNode The DOM node to get an accessible for.
* @return The nsIAccessible for the given DOM node.
*/
nsIAccessible getAccessibleFor(in nsIDOMNode aNode);
nsIAccessible getAccessibleFor(in Node aNode);
/**
* Returns accessible role as a string.
@ -73,7 +74,7 @@ interface nsIAccessibilityService : nsISupports
*
* @return cached accessible for the given DOM node if any
*/
nsIAccessible getAccessibleFromCache(in nsIDOMNode aNode);
nsIAccessible getAccessibleFromCache(in Node aNode);
/**
* Create a new pivot for tracking a position and traversing a subtree.

View File

@ -7,10 +7,11 @@
#include "nsIArray.idl"
interface nsIPersistentProperties;
interface nsIDOMNode;
interface nsIAccessibleDocument;
interface nsIAccessibleRelation;
webidl Node;
%{C++
namespace mozilla {
namespace a11y {
@ -76,7 +77,7 @@ interface nsIAccessible : nsISupports
/**
* The DOM node this nsIAccessible is associated with.
*/
readonly attribute nsIDOMNode DOMNode;
readonly attribute Node DOMNode;
/**
* For remote accessibles the id of the related DOM node.

View File

@ -7,7 +7,8 @@
interface nsIAccessible;
interface nsIAccessibleDocument;
interface nsIDOMNode;
webidl Node;
%{C++
#define NS_ACCESSIBLE_EVENT_TOPIC "accessible-event"
@ -442,10 +443,10 @@ interface nsIAccessibleEvent : nsISupports
readonly attribute nsIAccessibleDocument accessibleDocument;
/**
* The nsIDOMNode associated with the event
* The Node associated with the event
* May return null if accessible for event has been shut down
*/
readonly attribute nsIDOMNode DOMNode;
readonly attribute Node DOMNode;
/**
* Returns true if the event was caused by explicit user input,

View File

@ -94,7 +94,7 @@ DocAccessibleParent::RecvShowEvent(const ShowEventData& aData,
uint32_t type = nsIAccessibleEvent::EVENT_SHOW;
xpcAccessibleGeneric* xpcAcc = GetXPCAccessible(target);
xpcAccessibleDocument* doc = GetAccService()->GetXPCDocument(this);
nsIDOMNode* node = nullptr;
nsINode* node = nullptr;
RefPtr<xpcAccEvent> event = new xpcAccEvent(type, xpcAcc, doc, node,
aFromUser);
nsCoreUtils::DispatchAccEvent(Move(event));
@ -185,7 +185,7 @@ DocAccessibleParent::RecvHideEvent(const uint64_t& aRootID,
ProxyAccessible* prev = root->PrevSibling();
xpcAccessibleGeneric* xpcPrev = prev ? GetXPCAccessible(prev) : nullptr;
xpcAccessibleDocument* doc = GetAccService()->GetXPCDocument(this);
nsIDOMNode* node = nullptr;
nsINode* node = nullptr;
event = new xpcAccHideEvent(type, xpcAcc, doc, node, aFromUser, xpcParent,
xpcNext, xpcPrev);
}
@ -223,7 +223,7 @@ DocAccessibleParent::RecvEvent(const uint64_t& aID, const uint32_t& aEventType)
xpcAccessibleGeneric* xpcAcc = GetXPCAccessible(proxy);
xpcAccessibleDocument* doc = GetAccService()->GetXPCDocument(this);
nsIDOMNode* node = nullptr;
nsINode* node = nullptr;
bool fromUser = true; // XXX fix me
RefPtr<xpcAccEvent> event = new xpcAccEvent(aEventType, xpcAcc, doc, node,
fromUser);
@ -259,7 +259,7 @@ DocAccessibleParent::RecvStateChangeEvent(const uint64_t& aID,
bool extra;
uint32_t state = nsAccUtils::To32States(aState, &extra);
bool fromUser = true; // XXX fix this
nsIDOMNode* node = nullptr; // XXX can we do better?
nsINode* node = nullptr; // XXX can we do better?
RefPtr<xpcAccStateChangeEvent> event =
new xpcAccStateChangeEvent(type, xpcAcc, doc, node, fromUser, state, extra,
aEnabled);
@ -297,7 +297,7 @@ DocAccessibleParent::RecvCaretMoveEvent(const uint64_t& aID,
xpcAccessibleGeneric* xpcAcc = GetXPCAccessible(proxy);
xpcAccessibleDocument* doc = GetAccService()->GetXPCDocument(this);
nsIDOMNode* node = nullptr;
nsINode* node = nullptr;
bool fromUser = true; // XXX fix me
uint32_t type = nsIAccessibleEvent::EVENT_TEXT_CARET_MOVED;
RefPtr<xpcAccCaretMoveEvent> event =
@ -335,7 +335,7 @@ DocAccessibleParent::RecvTextChangeEvent(const uint64_t& aID,
xpcAccessibleDocument* doc = GetAccService()->GetXPCDocument(this);
uint32_t type = aIsInsert ? nsIAccessibleEvent::EVENT_TEXT_INSERTED :
nsIAccessibleEvent::EVENT_TEXT_REMOVED;
nsIDOMNode* node = nullptr;
nsINode* node = nullptr;
RefPtr<xpcAccTextChangeEvent> event =
new xpcAccTextChangeEvent(type, xpcAcc, doc, node, aFromUser, aStart, aLen,
aIsInsert, aStr);
@ -745,7 +745,7 @@ DocAccessibleParent::RecvFocusEvent(const uint64_t& aID,
xpcAccessibleGeneric* xpcAcc = GetXPCAccessible(proxy);
xpcAccessibleDocument* doc = GetAccService()->GetXPCDocument(this);
nsIDOMNode* node = nullptr;
nsINode* node = nullptr;
bool fromUser = true; // XXX fix me
RefPtr<xpcAccEvent> event = new xpcAccEvent(nsIAccessibleEvent::EVENT_FOCUS,
xpcAcc, doc, node, fromUser);

View File

@ -5,8 +5,6 @@ module.exports = {
"plugin:mozilla/mochitest-test"
],
"rules": {
"mozilla/reject-importGlobalProperties": "error",
// XXX These are rules that are enabled in the recommended configuration, but
// disabled here due to failures when initially implemented. They should be
// removed (and hence enabled) at some stage.

View File

@ -44,11 +44,28 @@ const nsIAccessibleValue = Ci.nsIAccessibleValue;
const nsIObserverService = Ci.nsIObserverService;
const nsIDOMNode = Ci.nsIDOMNode;
const nsIDOMWindow = Ci.nsIDOMWindow;
const nsIPropertyElement = Ci.nsIPropertyElement;
// Testing "'Node' in this" doesn't do the right thing because there are cases
// when our "this" is not the global even though we're at toplevel. In those
// cases, the import could fail because our global is a Window and we in fact
// have a Node all along.
//
// We could get the global via the (function() { return this; })() trick, but
// that might break any time if people switch us to strict mode. So let's just
// test the thing we care about directly: does bareword Node exist?
let needToImportNode = false;
try {
Node;
} catch (e) {
needToImportNode = true;
}
if (needToImportNode) {
Cu.importGlobalProperties(["Node"]);
}
// //////////////////////////////////////////////////////////////////////////////
// OS detect
@ -208,7 +225,7 @@ function getNode(aAccOrNodeOrID, aDocument) {
if (!aAccOrNodeOrID)
return null;
if (aAccOrNodeOrID instanceof nsIDOMNode)
if (Node.isInstance(aAccOrNodeOrID))
return aAccOrNodeOrID;
if (aAccOrNodeOrID instanceof nsIAccessible)
@ -256,7 +273,7 @@ function getAccessible(aAccOrElmOrID, aInterfaces, aElmObj, aDoNotFailIf) {
if (aAccOrElmOrID instanceof nsIAccessible) {
try { elm = aAccOrElmOrID.DOMNode; } catch (e) { }
} else if (aAccOrElmOrID instanceof nsIDOMNode) {
} else if (Node.isInstance(aAccOrElmOrID)) {
elm = aAccOrElmOrID;
} else {
@ -791,7 +808,7 @@ function prettyName(aIdentifier) {
return msg;
}
if (aIdentifier instanceof nsIDOMNode)
if (Node.isInstance(aIdentifier))
return "[ " + getNodePrettyName(aIdentifier) + " ]";
if (aIdentifier && typeof aIdentifier === "object" ) {
@ -873,11 +890,11 @@ function setTestPluginEnabledState(aNewEnabledState, aPluginName) {
function getNodePrettyName(aNode) {
try {
var tag = "";
if (aNode.nodeType == nsIDOMNode.DOCUMENT_NODE) {
if (aNode.nodeType == Node.DOCUMENT_NODE) {
tag = "document";
} else {
tag = aNode.localName;
if (aNode.nodeType == nsIDOMNode.ELEMENT_NODE && aNode.hasAttribute("id"))
if (aNode.nodeType == Node.ELEMENT_NODE && aNode.hasAttribute("id"))
tag += "@id=\"" + aNode.getAttribute("id") + "\"";
}

View File

@ -94,7 +94,7 @@ function waitForEvent(aEventType, aTargetOrFunc, aFunc, aContext, aArg1, aArg2)
target != aEvent.accessible)
return;
if (target instanceof nsIDOMNode &&
if (Node.isInstance(target) &&
target != aEvent.DOMNode)
return;
}

View File

@ -33,7 +33,7 @@
var gFocusHandler = {
handleEvent: function gFocusHandler_handleEvent(aEvent) {
var elm = aEvent.target;
if (elm.nodeType != nsIDOMNode.ELEMENT_NODE)
if (elm.nodeType != Node.ELEMENT_NODE)
return;
gTooltipElm.style.display = "block";
@ -47,7 +47,7 @@
gTooltipElm.style.display = "none";
var elm = aEvent.target;
if (elm.nodeType == nsIDOMNode.ELEMENT_NODE)
if (elm.nodeType == Node.ELEMENT_NODE)
elm.removeAttribute("aria-describedby");
}
};

View File

@ -108,7 +108,7 @@ xpcAccessibilityService::GetApplicationAccessible(nsIAccessible** aAccessibleApp
}
NS_IMETHODIMP
xpcAccessibilityService::GetAccessibleFor(nsIDOMNode *aNode,
xpcAccessibilityService::GetAccessibleFor(nsINode *aNode,
nsIAccessible **aAccessible)
{
NS_ENSURE_ARG_POINTER(aAccessible);
@ -117,19 +117,14 @@ xpcAccessibilityService::GetAccessibleFor(nsIDOMNode *aNode,
return NS_OK;
}
nsCOMPtr<nsINode> node(do_QueryInterface(aNode));
if (!node) {
return NS_ERROR_INVALID_ARG;
}
nsAccessibilityService* accService = GetAccService();
if (!accService) {
return NS_ERROR_SERVICE_NOT_AVAILABLE;
}
DocAccessible* document = accService->GetDocAccessible(node->OwnerDoc());
DocAccessible* document = accService->GetDocAccessible(aNode->OwnerDoc());
if (document) {
NS_IF_ADDREF(*aAccessible = ToXPC(document->GetAccessible(node)));
NS_IF_ADDREF(*aAccessible = ToXPC(document->GetAccessible(aNode)));
}
return NS_OK;
@ -187,7 +182,7 @@ xpcAccessibilityService::GetStringRelationType(uint32_t aRelationType,
}
NS_IMETHODIMP
xpcAccessibilityService::GetAccessibleFromCache(nsIDOMNode* aNode,
xpcAccessibilityService::GetAccessibleFromCache(nsINode* aNode,
nsIAccessible** aAccessible)
{
NS_ENSURE_ARG_POINTER(aAccessible);
@ -196,11 +191,6 @@ xpcAccessibilityService::GetAccessibleFromCache(nsIDOMNode* aNode,
return NS_OK;
}
nsCOMPtr<nsINode> node(do_QueryInterface(aNode));
if (!node) {
return NS_ERROR_INVALID_ARG;
}
nsAccessibilityService* accService = GetAccService();
if (!accService) {
return NS_ERROR_SERVICE_NOT_AVAILABLE;
@ -212,9 +202,9 @@ xpcAccessibilityService::GetAccessibleFromCache(nsIDOMNode* aNode,
// document accessibles are not stored in the document cache, however an
// "unofficially" shutdown document (i.e. not from DocManager) can still
// exist in the document cache.
Accessible* accessible = accService->FindAccessibleInCache(node);
Accessible* accessible = accService->FindAccessibleInCache(aNode);
if (!accessible) {
nsCOMPtr<nsIDocument> document(do_QueryInterface(node));
nsCOMPtr<nsIDocument> document(do_QueryInterface(aNode));
if (document) {
accessible = mozilla::a11y::GetExistingDocAccessible(document);
}

View File

@ -177,7 +177,7 @@ xpcAccessible::GetIndexInParent(int32_t* aIndexInParent)
}
NS_IMETHODIMP
xpcAccessible::GetDOMNode(nsIDOMNode** aDOMNode)
xpcAccessible::GetDOMNode(nsINode** aDOMNode)
{
NS_ENSURE_ARG_POINTER(aDOMNode);
*aDOMNode = nullptr;
@ -185,9 +185,8 @@ xpcAccessible::GetDOMNode(nsIDOMNode** aDOMNode)
if (!Intl())
return NS_ERROR_FAILURE;
nsINode* node = Intl()->GetNode();
if (node)
CallQueryInterface(node, aDOMNode);
nsCOMPtr<nsINode> node = Intl()->GetNode();
node.forget(aDOMNode);
return NS_OK;
}

View File

@ -37,7 +37,7 @@ public:
NS_IMETHOD GetChildren(nsIArray** aChildren) final;
NS_IMETHOD GetIndexInParent(int32_t* aIndexInParent) final;
NS_IMETHOD GetDOMNode(nsIDOMNode** aDOMNode) final;
NS_IMETHOD GetDOMNode(nsINode** aDOMNode) final;
NS_IMETHOD GetId(nsAString& aID) final;
NS_IMETHOD GetDocument(nsIAccessibleDocument** aDocument) final;
NS_IMETHOD GetRootDocument(nsIAccessibleDocument** aRootDocument)

View File

@ -501,15 +501,11 @@ XULListboxAccessible::ContainerWidget() const
nsCOMPtr<nsIDOMXULMenuListElement> menuListElm =
do_QueryInterface(mContent->GetParent());
if (menuListElm) {
nsCOMPtr<nsIDOMNode> inputElm;
RefPtr<mozilla::dom::Element> inputElm;
menuListElm->GetInputField(getter_AddRefs(inputElm));
if (inputElm) {
nsCOMPtr<nsINode> inputNode = do_QueryInterface(inputElm);
if (inputNode) {
Accessible* input =
mDoc->GetAccessible(inputNode);
Accessible* input = mDoc->GetAccessible(inputElm);
return input ? input->ContainerWidget() : nullptr;
}
}
}
}

View File

@ -114,14 +114,12 @@ XULTabAccessible::RelationByType(RelationType aType) const
if (!tabsElm)
return rel;
nsCOMPtr<nsIDOMNode> domNode(do_QueryInterface(GetNode()));
nsCOMPtr<nsIDOMNode> tabpanelNode;
tabsElm->GetRelatedElement(domNode, getter_AddRefs(tabpanelNode));
if (!tabpanelNode)
RefPtr<mozilla::dom::Element> tabpanelElement;
tabsElm->GetRelatedElement(GetNode(), getter_AddRefs(tabpanelElement));
if (!tabpanelElement)
return rel;
nsCOMPtr<nsIContent> tabpanelContent(do_QueryInterface(tabpanelNode));
rel.AppendTarget(mDoc, tabpanelContent);
rel.AppendTarget(mDoc, tabpanelElement);
return rel;
}
@ -201,13 +199,11 @@ XULTabpanelAccessible::RelationByType(RelationType aType) const
if (!tabpanelsElm)
return rel;
nsCOMPtr<nsIDOMNode> domNode(do_QueryInterface(GetNode()));
nsCOMPtr<nsIDOMNode> tabNode;
tabpanelsElm->GetRelatedElement(domNode, getter_AddRefs(tabNode));
if (!tabNode)
RefPtr<mozilla::dom::Element> tabElement;
tabpanelsElm->GetRelatedElement(GetNode(), getter_AddRefs(tabElement));
if (!tabElement)
return rel;
nsCOMPtr<nsIContent> tabContent(do_QueryInterface(tabNode));
rel.AppendTarget(mDoc, tabContent);
rel.AppendTarget(mDoc, tabElement);
return rel;
}

View File

@ -497,15 +497,11 @@ XULTreeAccessible::ContainerWidget() const
nsCOMPtr<nsIDOMXULMenuListElement> menuListElm =
do_QueryInterface(mContent->GetParent());
if (menuListElm) {
nsCOMPtr<nsIDOMNode> inputElm;
RefPtr<mozilla::dom::Element> inputElm;
menuListElm->GetInputField(getter_AddRefs(inputElm));
if (inputElm) {
nsCOMPtr<nsINode> inputNode = do_QueryInterface(inputElm);
if (inputNode) {
Accessible* input =
mDoc->GetAccessible(inputNode);
return input ? input->ContainerWidget() : nullptr;
}
Accessible* input = mDoc->GetAccessible(inputElm);
return input ? input->ContainerWidget() : nullptr;
}
}
}

View File

@ -368,8 +368,6 @@ nsFocusManager::GetRedirectedFocus(nsIContent* aContent)
#ifdef MOZ_XUL
if (aContent->IsXULElement()) {
nsCOMPtr<nsIDOMNode> inputField;
if (aContent->IsXULElement(nsGkAtoms::textbox)) {
return aContent->OwnerDoc()->
GetAnonymousElementByAttribute(aContent, nsGkAtoms::anonid, NS_LITERAL_STRING("input"));
@ -377,7 +375,9 @@ nsFocusManager::GetRedirectedFocus(nsIContent* aContent)
else {
nsCOMPtr<nsIDOMXULMenuListElement> menulist = do_QueryInterface(aContent);
if (menulist) {
RefPtr<Element> inputField;
menulist->GetInputField(getter_AddRefs(inputField));
return inputField;
}
else if (aContent->IsXULElement(nsGkAtoms::scale)) {
nsCOMPtr<nsIDocument> doc = aContent->GetComposedDoc();
@ -392,11 +392,6 @@ nsFocusManager::GetRedirectedFocus(nsIContent* aContent)
}
}
}
if (inputField) {
nsCOMPtr<Element> retval = do_QueryInterface(inputField);
return retval;
}
}
#endif

View File

@ -4,7 +4,8 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "nsIDOMXULSelectCntrlEl.idl"
interface nsIDOMNode;
webidl Element;
[scriptable, uuid(36c16a17-c0e9-4b35-951b-81a147314ef1)]
interface nsIDOMXULMenuListElement : nsIDOMXULSelectControlElement {
@ -18,6 +19,6 @@ interface nsIDOMXULMenuListElement : nsIDOMXULSelectControlElement {
attribute DOMString image;
// For editable menu lists only.
readonly attribute nsIDOMNode inputField;
readonly attribute Element inputField;
};

View File

@ -5,6 +5,9 @@
#include "domstubs.idl"
webidl Element;
webidl Node;
[scriptable, uuid(9fbac05a-fb27-470d-8e5f-028b2dc54ad0)]
interface nsIDOMXULRelatedElement : nsISupports
{
@ -14,5 +17,5 @@ interface nsIDOMXULRelatedElement : nsISupports
* this interface is implemented by XUL tabs and XUL tabpanels elements
* and used to get XUL tab element by linked tab panel and vice versa.
*/
nsIDOMNode getRelatedElement(in nsIDOMNode aElement);
Element getRelatedElement(in Node aElement);
};