bug 1119923 - allow proxies to implement non standard interfaces r=davidb

This commit is contained in:
Trevor Saunders 2015-01-09 15:01:39 -05:00
parent a9f507428f
commit a06296dc67
13 changed files with 83 additions and 23 deletions

View File

@ -1019,15 +1019,20 @@ GetWrapperFor(ProxyAccessible* aProxy)
}
static uint16_t
GetInterfacesForProxy(ProxyAccessible* aProxy)
GetInterfacesForProxy(ProxyAccessible* aProxy, uint32_t aInterfaces)
{
return MAI_INTERFACE_COMPONENT;
uint16_t interfaces = 1 << MAI_INTERFACE_COMPONENT;
if (aInterfaces & Interfaces::HYPERTEXT)
interfaces |= (1 << MAI_INTERFACE_HYPERTEXT) | (1 << MAI_INTERFACE_TEXT)
| (1 << MAI_INTERFACE_EDITABLE_TEXT);
return interfaces;
}
void
a11y::ProxyCreated(ProxyAccessible* aProxy)
a11y::ProxyCreated(ProxyAccessible* aProxy, uint32_t aInterfaces)
{
GType type = GetMaiAtkType(GetInterfacesForProxy(aProxy));
GType type = GetMaiAtkType(GetInterfacesForProxy(aProxy, aInterfaces));
NS_ASSERTION(type, "why don't we have a type!");
AtkObject* obj =

View File

@ -9,6 +9,7 @@
#include "Accessible-inl.h"
#include "HyperTextAccessible-inl.h"
#include "nsMai.h"
#include "ProxyAccessible.h"
#include "nsIAccessibleTypes.h"
#include "nsIPersistentProperties2.h"
@ -110,21 +111,23 @@ static gchar*
getTextCB(AtkText *aText, gint aStartOffset, gint aEndOffset)
{
AccessibleWrap* accWrap = GetAccessibleWrap(ATK_OBJECT(aText));
if (!accWrap)
return nullptr;
nsAutoString autoStr;
if (accWrap) {
HyperTextAccessible* text = accWrap->AsHyperText();
if (!text || !text->IsTextRole())
return nullptr;
HyperTextAccessible* text = accWrap->AsHyperText();
if (!text || !text->IsTextRole())
return nullptr;
nsAutoString autoStr;
text->TextSubstring(aStartOffset, aEndOffset, autoStr);
ConvertTexttoAsterisks(accWrap, autoStr);
NS_ConvertUTF16toUTF8 cautoStr(autoStr);
} else if (ProxyAccessible* proxy = GetProxy(ATK_OBJECT(aText))) {
proxy->TextSubstring(aStartOffset, aEndOffset, autoStr);
}
//copy and return, libspi will free it.
return (cautoStr.get()) ? g_strdup(cautoStr.get()) : nullptr;
NS_ConvertUTF16toUTF8 cautoStr(autoStr);
//copy and return, libspi will free it.
return (cautoStr.get()) ? g_strdup(cautoStr.get()) : nullptr;
}
static gchar*

View File

@ -549,5 +549,5 @@ DocManager::RemoteDocAdded(DocAccessibleParent* aDoc)
MOZ_ASSERT(!sRemoteDocuments->Contains(aDoc),
"How did we already have the doc!");
sRemoteDocuments->AppendElement(aDoc);
ProxyCreated(aDoc);
ProxyCreated(aDoc, 0);
}

View File

@ -55,7 +55,7 @@ void PlatformShutdown();
* called when a new ProxyAccessible is created, so the platform may setup a
* wrapper for it, or take other action.
*/
void ProxyCreated(ProxyAccessible*);
void ProxyCreated(ProxyAccessible* aProxy, uint32_t aInterfaces);
/**
* Called just before a ProxyAccessible is destroyed so its wrapper can be

View File

@ -7,6 +7,7 @@
#include "DocAccessibleChild.h"
#include "Accessible-inl.h"
#include "ProxyAccessible.h"
#include "nsIPersistentProperties2.h"
#include "nsISimpleEnumerator.h"
@ -14,12 +15,23 @@
namespace mozilla {
namespace a11y {
void
static uint32_t
InterfacesFor(Accessible* aAcc)
{
uint32_t interfaces = 0;
if (aAcc->IsHyperText() && aAcc->AsHyperText()->IsTextRole())
interfaces |= Interfaces::HYPERTEXT;
return interfaces;
}
static void
SerializeTree(Accessible* aRoot, nsTArray<AccessibleData>& aTree)
{
uint64_t id = reinterpret_cast<uint64_t>(aRoot->UniqueID());
uint32_t role = aRoot->Role();
uint32_t childCount = aRoot->ChildCount();
uint32_t interfaces = InterfacesFor(aRoot);
// OuterDocAccessibles are special because we don't want to serialize the
// child doc here, we'll call PDocAccessibleConstructor in
@ -27,7 +39,7 @@ SerializeTree(Accessible* aRoot, nsTArray<AccessibleData>& aTree)
if (childCount == 1 && aRoot->GetChildAt(0)->IsDoc())
childCount = 0;
aTree.AppendElement(AccessibleData(id, role, childCount));
aTree.AppendElement(AccessibleData(id, role, childCount, interfaces));
for (uint32_t i = 0; i < childCount; i++)
SerializeTree(aRoot->GetChildAt(i), aTree);
}
@ -117,5 +129,19 @@ DocAccessibleChild::RecvAttributes(const uint64_t& aID, nsTArray<Attribute>* aAt
return true;
}
bool
DocAccessibleChild::RecvTextSubstring(const uint64_t& aID,
const int32_t& aStartOffset,
const int32_t& aEndOffset,
nsString* aText)
{
Accessible* acc = mDoc->GetAccessibleByUniqueID((void*)aID);
if (!acc || !acc->IsHyperText())
return false;
acc->AsHyperText()->TextSubstring(aStartOffset, aEndOffset, *aText);
return true;
}
}
}

View File

@ -49,6 +49,10 @@ public:
virtual bool RecvDescription(const uint64_t& aID, nsString* aDesc) MOZ_OVERRIDE;
virtual bool RecvAttributes(const uint64_t& aID, nsTArray<Attribute> *aAttributes) MOZ_OVERRIDE;
virtual bool RecvTextSubstring(const uint64_t& aID,
const int32_t& aStartOffset,
const int32_t& aEndOffset, nsString* aText)
MOZ_OVERRIDE;
private:
DocAccessible* mDoc;

View File

@ -7,6 +7,7 @@
#include "DocAccessibleParent.h"
#include "nsAutoPtr.h"
#include "mozilla/a11y/Platform.h"
#include "ProxyAccessible.h"
namespace mozilla {
namespace a11y {
@ -74,7 +75,7 @@ DocAccessibleParent::AddSubtree(ProxyAccessible* aParent,
new ProxyAccessible(newChild.ID(), aParent, this, role);
aParent->AddChildAt(aIdxInParent, newProxy);
mAccessibles.PutEntry(newChild.ID())->mProxy = newProxy;
ProxyCreated(newProxy);
ProxyCreated(newProxy, newChild.Interfaces());
uint32_t accessibles = 1;
uint32_t kids = newChild.ChildrenCount();
@ -142,7 +143,7 @@ DocAccessibleParent::AddChildDoc(DocAccessibleParent* aChildDoc,
outerDoc->SetChildDoc(aChildDoc);
mChildDocs.AppendElement(aChildDoc);
aChildDoc->mParentDoc = this;
ProxyCreated(aChildDoc);
ProxyCreated(aChildDoc, 0);
return true;
}

View File

@ -14,6 +14,7 @@ struct AccessibleData
uint64_t ID;
uint32_t Role;
uint32_t ChildrenCount;
uint32_t Interfaces;
};
struct ShowEventData
@ -49,6 +50,8 @@ child:
prio(high) sync Name(uint64_t aID) returns(nsString name);
prio(high) sync Description(uint64_t aID) returns(nsString desc);
prio(high) sync Attributes(uint64_t aID) returns(Attribute[] attributes);
prio(high) sync TextSubstring(uint64_t aID, int32_t aStartOffset, int32_t
aEndOffset) returns(nsString aText);
};
}

View File

@ -69,5 +69,12 @@ ProxyAccessible::Attributes(nsTArray<Attribute> *aAttrs) const
{
unused << mDoc->SendAttributes(mID, aAttrs);
}
void
ProxyAccessible::TextSubstring(int32_t aStartOffset, int32_t aEndOfset,
nsString& aText) const
{
unused << mDoc->SendTextSubstring(mID, aStartOffset, aEndOfset, &aText);
}
}
}

View File

@ -79,6 +79,12 @@ public:
*/
void Attributes(nsTArray<Attribute> *aAttrs) const;
/**
* Get the text between the given offsets.
*/
void TextSubstring(int32_t aStartOffset, int32_t aEndOfset,
nsString& aText) const;
/**
* Allow the platform to store a pointers worth of data on us.
*/
@ -108,6 +114,11 @@ private:
bool mOuterDoc : 1;
};
enum Interfaces
{
HYPERTEXT = 1
};
}
}

View File

@ -34,7 +34,7 @@ PlatformShutdown()
}
void
ProxyCreated(ProxyAccessible*)
ProxyCreated(ProxyAccessible*, uint32_t)
{
}

View File

@ -20,7 +20,7 @@ a11y::PlatformShutdown()
}
void
a11y::ProxyCreated(ProxyAccessible*)
a11y::ProxyCreated(ProxyAccessible*, uint32_t)
{
}

View File

@ -35,7 +35,7 @@ a11y::PlatformShutdown()
}
void
a11y::ProxyCreated(ProxyAccessible*)
a11y::ProxyCreated(ProxyAccessible*, uint32_t)
{
}