author | Trevor Saunders <trev.saunders@gmail.com> |
Fri, 24 Oct 2014 05:29:48 -0400 | |
changeset 213148 | 339521504f276c1d4519bb46491ed350409e63e0 |
parent 213147 | 94cc70e64a90cb285e586080435699b7db940cdf |
child 213149 | 70af2ce2bdfcaa38c60bde30ffc3e1ae2b881ffc |
push id | 51160 |
push user | trev.saunders@gmail.com |
push date | Thu, 30 Oct 2014 18:47:51 +0000 |
treeherder | mozilla-inbound@339521504f27 [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | davidb |
bugs | 1088628 |
milestone | 36.0a1 |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
--- a/accessible/atk/AccessibleWrap.cpp +++ b/accessible/atk/AccessibleWrap.cpp @@ -5,16 +5,17 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "AccessibleWrap.h" #include "Accessible-inl.h" #include "ApplicationAccessibleWrap.h" #include "InterfaceInitFuncs.h" #include "nsAccUtils.h" +#include "mozilla/a11y/PDocAccessible.h" #include "ProxyAccessible.h" #include "RootAccessible.h" #include "nsMai.h" #include "nsMaiHyperlink.h" #include "nsString.h" #include "nsAutoPtr.h" #include "prprf.h" #include "nsStateMap.h" @@ -766,17 +767,37 @@ GetAttributeSet(Accessible* aAccessible) return nullptr; } AtkAttributeSet * getAttributesCB(AtkObject *aAtkObj) { AccessibleWrap* accWrap = GetAccessibleWrap(aAtkObj); - return accWrap ? GetAttributeSet(accWrap) : nullptr; + if (accWrap) + return GetAttributeSet(accWrap); + + ProxyAccessible* proxy = GetProxy(aAtkObj); + if (!proxy) + return nullptr; + + nsAutoTArray<Attribute, 10> attrs; + proxy->Attributes(&attrs); + if (attrs.IsEmpty()) + return nullptr; + + AtkAttributeSet* objAttributeSet = nullptr; + for (uint32_t i = 0; i < attrs.Length(); i++) { + AtkAttribute *objAttr = (AtkAttribute *)g_malloc(sizeof(AtkAttribute)); + objAttr->name = g_strdup(attrs[i].Name().get()); + objAttr->value = g_strdup(NS_ConvertUTF16toUTF8(attrs[i].Value()).get()); + objAttributeSet = g_slist_prepend(objAttributeSet, objAttr); + } + + return objAttributeSet; } const gchar* GetLocaleCB(AtkObject* aAtkObj) { AccessibleWrap* accWrap = GetAccessibleWrap(aAtkObj); if (!accWrap) return nullptr;
--- a/accessible/atk/moz.build +++ b/accessible/atk/moz.build @@ -44,8 +44,10 @@ LOCAL_INCLUDES += [ FINAL_LIBRARY = 'xul' if CONFIG['MOZ_ENABLE_GTK']: CFLAGS += CONFIG['TK_CFLAGS'] CXXFLAGS += CONFIG['TK_CFLAGS'] if CONFIG['MOZ_ENABLE_DBUS']: CXXFLAGS += CONFIG['MOZ_DBUS_CFLAGS'] + + include('/ipc/chromium/chromium-config.mozbuild')
--- a/accessible/ipc/DocAccessibleChild.cpp +++ b/accessible/ipc/DocAccessibleChild.cpp @@ -3,16 +3,19 @@ /* 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 "DocAccessibleChild.h" #include "Accessible-inl.h" +#include "nsIPersistentProperties2.h" +#include "nsISimpleEnumerator.h" + namespace mozilla { namespace a11y { void SerializeTree(Accessible* aRoot, nsTArray<AccessibleData>& aTree) { uint64_t id = reinterpret_cast<uint64_t>(aRoot->UniqueID()); uint32_t role = aRoot->Role(); @@ -71,10 +74,48 @@ DocAccessibleChild::RecvDescription(cons { Accessible* acc = mDoc->GetAccessibleByUniqueID((void*)aID); if (!acc) return true; acc->Description(*aDesc); return true; } + +bool +DocAccessibleChild::RecvAttributes(const uint64_t& aID, nsTArray<Attribute>* aAttributes) +{ + Accessible* acc = mDoc->GetAccessibleByUniqueID((void*)aID); + if (!acc) + return true; + + nsCOMPtr<nsIPersistentProperties> props = acc->Attributes(); + if (!props) + return true; + + nsCOMPtr<nsISimpleEnumerator> propEnum; + nsresult rv = props->Enumerate(getter_AddRefs(propEnum)); + NS_ENSURE_SUCCESS(rv, false); + + bool hasMore; + while (NS_SUCCEEDED(propEnum->HasMoreElements(&hasMore)) && hasMore) { + nsCOMPtr<nsISupports> sup; + rv = propEnum->GetNext(getter_AddRefs(sup)); + NS_ENSURE_SUCCESS(rv, false); + + nsCOMPtr<nsIPropertyElement> propElem(do_QueryInterface(sup)); + NS_ENSURE_TRUE(propElem, false); + + nsAutoCString name; + rv = propElem->GetKey(name); + NS_ENSURE_SUCCESS(rv, false); + + nsAutoString value; + rv = propElem->GetValue(value); + NS_ENSURE_SUCCESS(rv, false); + + aAttributes->AppendElement(Attribute(name, value)); + } + + return true; } } +}
--- a/accessible/ipc/DocAccessibleChild.h +++ b/accessible/ipc/DocAccessibleChild.h @@ -43,16 +43,18 @@ public: */ virtual bool RecvName(const uint64_t& aID, nsString* aName) MOZ_OVERRIDE; /* * Get the description for the accessible with given id. */ virtual bool RecvDescription(const uint64_t& aID, nsString* aDesc) MOZ_OVERRIDE; + virtual bool RecvAttributes(const uint64_t& aID, nsTArray<Attribute> *aAttributes) MOZ_OVERRIDE; + private: DocAccessible* mDoc; }; } } #endif
--- a/accessible/ipc/PDocAccessible.ipdl +++ b/accessible/ipc/PDocAccessible.ipdl @@ -18,16 +18,22 @@ struct AccessibleData struct ShowEventData { uint64_t ID; uint32_t Idx; AccessibleData[] NewTree; }; +struct Attribute +{ + nsCString Name; + nsString Value; +}; + prio(normal upto high) sync protocol PDocAccessible { manager PContent; parent: __delete__(); /* @@ -37,12 +43,13 @@ parent: Event(uint32_t type); ShowEvent(ShowEventData data); HideEvent(uint64_t aRootID); child: prio(high) sync State(uint64_t aID) returns(uint64_t states); 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); }; } }
--- a/accessible/ipc/ProxyAccessible.cpp +++ b/accessible/ipc/ProxyAccessible.cpp @@ -54,10 +54,16 @@ ProxyAccessible::Name(nsString& aName) c unused << mDoc->SendName(mID, &aName); } void ProxyAccessible::Description(nsString& aDesc) const { unused << mDoc->SendDescription(mID, &aDesc); } + +void +ProxyAccessible::Attributes(nsTArray<Attribute> *aAttrs) const +{ + unused << mDoc->SendAttributes(mID, aAttrs); } } +}
--- a/accessible/ipc/ProxyAccessible.h +++ b/accessible/ipc/ProxyAccessible.h @@ -9,16 +9,17 @@ #include "mozilla/a11y/Role.h" #include "nsString.h" #include "nsTArray.h" namespace mozilla { namespace a11y { +class Attribute; class DocAccessibleParent; class ProxyAccessible { public: ProxyAccessible(uint64_t aID, ProxyAccessible* aParent, DocAccessibleParent* aDoc, role aRole) : @@ -64,16 +65,21 @@ public: void Name(nsString& aName) const; /** * Set aDesc to the description of the proxied accessible. */ void Description(nsString& aDesc) const; /** + * Get the set of attributes on the proxied accessible. + */ + void Attributes(nsTArray<Attribute> *aAttrs) const; + + /** * Allow the platform to store a pointers worth of data on us. */ uintptr_t GetWrapper() const { return mWrapper; } void SetWrapper(uintptr_t aWrapper) { mWrapper = aWrapper; } /* * Return the ID of the accessible being proxied. */