Bug 1417327 part 3: Accessible handler: Fix cache for IAccessible::accDefaultAction and use it for IAccessibleAction::name(0). r?marcoz draft
authorJames Teh <jteh@mozilla.com>
Thu, 16 Nov 2017 16:51:28 +1000
changeset 699030 a248449e6ca0c98bfd77a6907ad92f96f023bbab
parent 698860 6ff52a3d0294b1a1319f9670a5aa3705d3636a06
child 740506 8c0dd2b6c5cd4f94f80fba91e78202ed989c52ba
push id89434
push userbmo:jteh@mozilla.com
push dateThu, 16 Nov 2017 11:36:21 +0000
reviewersmarcoz
bugs1417327, 1363595
milestone59.0a1
Bug 1417327 part 3: Accessible handler: Fix cache for IAccessible::accDefaultAction and use it for IAccessibleAction::name(0). r?marcoz 1. Bug 1363595 added support for retrieving accDefaultAction from the cache, but the value was never cached in the first place. This would have meant that accDefaultAction was returning nothing to clients. 2. Since accDefaultAction is the name of the first action, we can also use this cached value for IAccessibleAction::name for index 0. MozReview-Commit-ID: 6PGRH45kKdB
accessible/ipc/win/HandlerProvider.cpp
accessible/ipc/win/handler/AccessibleHandler.cpp
--- a/accessible/ipc/win/HandlerProvider.cpp
+++ b/accessible/ipc/win/HandlerProvider.cpp
@@ -309,16 +309,21 @@ HandlerProvider::BuildDynamicIA2Data(Dyn
     return;
   }
 
   hr = target->get_accDescription(kChildIdSelf, &aOutIA2Data->mDescription);
   if (FAILED(hr)) {
     return;
   }
 
+  hr = target->get_accDefaultAction(kChildIdSelf, &aOutIA2Data->mDefaultAction);
+  if (FAILED(hr)) {
+    return;
+  }
+
   hr = target->get_accChildCount(&aOutIA2Data->mChildCount);
   if (FAILED(hr)) {
     return;
   }
 
   hr = target->get_accValue(kChildIdSelf, &aOutIA2Data->mValue);
   if (FAILED(hr)) {
     return;
--- a/accessible/ipc/win/handler/AccessibleHandler.cpp
+++ b/accessible/ipc/win/handler/AccessibleHandler.cpp
@@ -1273,16 +1273,34 @@ AccessibleHandler::get_keyBinding(long a
   }
   return mIAHyperlinkPassThru->get_keyBinding(
     actionIndex, nMaxBindings, keyBindings, nBindings);
 }
 
 HRESULT
 AccessibleHandler::get_name(long actionIndex, BSTR* name)
 {
+  if (!name) {
+    return E_INVALIDARG;
+  }
+
+  if (HasPayload()) {
+    if (actionIndex >= mCachedData.mDynamicData.mNActions) {
+      // Action does not exist.
+      return E_INVALIDARG;
+    }
+
+    if (actionIndex == 0) {
+      // same as accDefaultAction.
+      GET_BSTR(mDefaultAction, *name);
+      return S_OK;
+    }
+  }
+
+  // At this point, there's either no payload or actionIndex is > 0.
   HRESULT hr = ResolveIAHyperlink();
   if (FAILED(hr)) {
     return hr;
   }
   return mIAHyperlinkPassThru->get_name(actionIndex, name);
 }
 
 HRESULT