Commit c68b3219 authored by Suproteem Sarkar's avatar Suproteem Sarkar Committed by Commit Bot

Implemented value changing control patterns in IAccessibleEx, allowing for...

Implemented value changing control patterns in IAccessibleEx, allowing for manipulation of basic fields with values

R=nektar@chromium.org,dmazzoni@chromium.org

Bug: 852965
Change-Id: I080188507ac4dd0bd7548bec89a9ec069e581b85
Reviewed-on: https://chromium-review.googlesource.com/1101837
Commit-Queue: Nektarios Paisios <nektar@chromium.org>
Reviewed-by: default avatarNektarios Paisios <nektar@chromium.org>
Reviewed-by: default avatarDominic Mazzoni <dmazzoni@chromium.org>
Reviewed-by: default avatarNico Weber <thakis@chromium.org>
Cr-Commit-Position: refs/heads/master@{#569648}
parent 009fdad3
...@@ -169,6 +169,10 @@ base::LazyInstance<AXPlatformNodeWinSet>::Leaky g_alert_targets = ...@@ -169,6 +169,10 @@ base::LazyInstance<AXPlatformNodeWinSet>::Leaky g_alert_targets =
base::LazyInstance<base::ObserverList<IAccessible2UsageObserver>>::Leaky base::LazyInstance<base::ObserverList<IAccessible2UsageObserver>>::Leaky
g_iaccessible2_usage_observer_list = LAZY_INSTANCE_INITIALIZER; g_iaccessible2_usage_observer_list = LAZY_INSTANCE_INITIALIZER;
// Sets the multiplier by which large changes to a RangeValueProvider are
// greater than small changes
constexpr int kLargeChangeScaleFactor = 10;
} // namespace } // namespace
// There is no easy way to decouple |kScreenReader| and |kHTML| accessibility // There is no easy way to decouple |kScreenReader| and |kHTML| accessibility
...@@ -1419,6 +1423,108 @@ STDMETHODIMP AXPlatformNodeWin::ScrollIntoView() { ...@@ -1419,6 +1423,108 @@ STDMETHODIMP AXPlatformNodeWin::ScrollIntoView() {
return E_FAIL; return E_FAIL;
} }
//
// IValueProvider implementation.
//
STDMETHODIMP AXPlatformNodeWin::SetValue(LPCWSTR value) {
if (!value)
return E_INVALIDARG;
AXActionData data;
data.action = ax::mojom::Action::kSetValue;
data.value = base::string16(value);
if (delegate_->AccessibilityPerformAction(data))
return S_OK;
return E_FAIL;
}
STDMETHODIMP AXPlatformNodeWin::get_IsReadOnly(BOOL* result) {
COM_OBJECT_VALIDATE_1_ARG(result);
int restriction;
if (GetIntAttribute(ax::mojom::IntAttribute::kRestriction, &restriction)) {
*result = static_cast<ax::mojom::Restriction>(restriction) ==
ax::mojom::Restriction::kReadOnly;
return S_OK;
}
return E_FAIL;
}
STDMETHODIMP AXPlatformNodeWin::get_Value(BSTR* result) {
COM_OBJECT_VALIDATE_1_ARG(result);
if (GetStringAttributeAsBstr(ax::mojom::StringAttribute::kValue, result))
return S_OK;
return E_FAIL;
}
//
// IRangeValueProvider implementation.
//
STDMETHODIMP AXPlatformNodeWin::SetValue(double value) {
AXActionData data;
data.action = ax::mojom::Action::kSetValue;
data.value = base::NumberToString16(value);
if (delegate_->AccessibilityPerformAction(data))
return S_OK;
return E_FAIL;
}
STDMETHODIMP AXPlatformNodeWin::get_LargeChange(double* result) {
COM_OBJECT_VALIDATE_1_ARG(result);
float attribute;
if (GetFloatAttribute(ax::mojom::FloatAttribute::kStepValueForRange,
&attribute)) {
*result = attribute * kLargeChangeScaleFactor;
return S_OK;
}
return E_FAIL;
}
STDMETHODIMP AXPlatformNodeWin::get_Maximum(double* result) {
COM_OBJECT_VALIDATE_1_ARG(result);
float attribute;
if (GetFloatAttribute(ax::mojom::FloatAttribute::kMaxValueForRange,
&attribute)) {
*result = attribute;
return S_OK;
}
return E_FAIL;
}
STDMETHODIMP AXPlatformNodeWin::get_Minimum(double* result) {
COM_OBJECT_VALIDATE_1_ARG(result);
float attribute;
if (GetFloatAttribute(ax::mojom::FloatAttribute::kMinValueForRange,
&attribute)) {
*result = attribute;
return S_OK;
}
return E_FAIL;
}
STDMETHODIMP AXPlatformNodeWin::get_SmallChange(double* result) {
COM_OBJECT_VALIDATE_1_ARG(result);
float attribute;
if (GetFloatAttribute(ax::mojom::FloatAttribute::kStepValueForRange,
&attribute)) {
*result = attribute;
return S_OK;
}
return E_FAIL;
}
STDMETHODIMP AXPlatformNodeWin::get_Value(double* result) {
COM_OBJECT_VALIDATE_1_ARG(result);
float attribute;
if (GetFloatAttribute(ax::mojom::FloatAttribute::kValueForRange,
&attribute)) {
*result = attribute;
return S_OK;
}
return E_FAIL;
}
// IAccessibleEx methods not implemented. // IAccessibleEx methods not implemented.
STDMETHODIMP AXPlatformNodeWin::GetRuntimeId(SAFEARRAY** runtime_id) { STDMETHODIMP AXPlatformNodeWin::GetRuntimeId(SAFEARRAY** runtime_id) {
WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_RUNTIME_ID); WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_RUNTIME_ID);
...@@ -2569,19 +2675,25 @@ STDMETHODIMP AXPlatformNodeWin::GetPatternProvider(PATTERNID pattern_id, ...@@ -2569,19 +2675,25 @@ STDMETHODIMP AXPlatformNodeWin::GetPatternProvider(PATTERNID pattern_id,
case UIA_GridPatternId: case UIA_GridPatternId:
case UIA_GridItemPatternId: case UIA_GridItemPatternId:
case UIA_MultipleViewPatternId: case UIA_MultipleViewPatternId:
break;
case UIA_RangeValuePatternId: case UIA_RangeValuePatternId:
*result = static_cast<IRawElementProviderSimple*>(this);
AddRef();
break;
case UIA_ScrollPatternId: case UIA_ScrollPatternId:
*result = nullptr;
break; break;
case UIA_ScrollItemPatternId: case UIA_ScrollItemPatternId:
*result = static_cast<IRawElementProviderSimple*>(this); *result = static_cast<IRawElementProviderSimple*>(this);
AddRef(); AddRef();
break; break;
case UIA_SynchronizedInputPatternId: case UIA_SynchronizedInputPatternId:
case UIA_TablePatternId: case UIA_TablePatternId:
case UIA_TableItemPatternId: case UIA_TableItemPatternId:
case UIA_TransformPatternId: case UIA_TransformPatternId:
*result = nullptr;
break; break;
// TODO(suproteem): Add checks for control role. // TODO(suproteem): Add checks for control role.
...@@ -2589,7 +2701,13 @@ STDMETHODIMP AXPlatformNodeWin::GetPatternProvider(PATTERNID pattern_id, ...@@ -2589,7 +2701,13 @@ STDMETHODIMP AXPlatformNodeWin::GetPatternProvider(PATTERNID pattern_id,
case UIA_SelectionItemPatternId: case UIA_SelectionItemPatternId:
case UIA_SelectionPatternId: case UIA_SelectionPatternId:
case UIA_TogglePatternId: case UIA_TogglePatternId:
break;
case UIA_ValuePatternId: case UIA_ValuePatternId:
*result = static_cast<IRawElementProviderSimple*>(this);
AddRef();
break;
case UIA_WindowPatternId: case UIA_WindowPatternId:
// Overlap with MSAA, not supported. // Overlap with MSAA, not supported.
...@@ -2609,7 +2727,6 @@ STDMETHODIMP AXPlatformNodeWin::GetPatternProvider(PATTERNID pattern_id, ...@@ -2609,7 +2727,6 @@ STDMETHODIMP AXPlatformNodeWin::GetPatternProvider(PATTERNID pattern_id,
case UIA_TextPattern2Id: case UIA_TextPattern2Id:
case UIA_TransformPattern2Id: case UIA_TransformPattern2Id:
case UIA_VirtualizedItemPatternId: case UIA_VirtualizedItemPatternId:
*result = nullptr;
break; break;
} }
return S_OK; return S_OK;
......
...@@ -241,9 +241,11 @@ class AX_EXPORT __declspec(uuid("26f5641a-246d-457b-a96d-07f3fae6acf2")) ...@@ -241,9 +241,11 @@ class AX_EXPORT __declspec(uuid("26f5641a-246d-457b-a96d-07f3fae6acf2"))
public IAccessibleTable, public IAccessibleTable,
public IAccessibleTable2, public IAccessibleTable2,
public IAccessibleTableCell, public IAccessibleTableCell,
public IRangeValueProvider,
public IRawElementProviderSimple, public IRawElementProviderSimple,
public IScrollItemProvider, public IScrollItemProvider,
public IServiceProvider, public IServiceProvider,
public IValueProvider,
public AXPlatformNodeBase { public AXPlatformNodeBase {
public: public:
BEGIN_COM_MAP(AXPlatformNodeWin) BEGIN_COM_MAP(AXPlatformNodeWin)
...@@ -257,8 +259,10 @@ class AX_EXPORT __declspec(uuid("26f5641a-246d-457b-a96d-07f3fae6acf2")) ...@@ -257,8 +259,10 @@ class AX_EXPORT __declspec(uuid("26f5641a-246d-457b-a96d-07f3fae6acf2"))
COM_INTERFACE_ENTRY(IAccessibleTable) COM_INTERFACE_ENTRY(IAccessibleTable)
COM_INTERFACE_ENTRY(IAccessibleTable2) COM_INTERFACE_ENTRY(IAccessibleTable2)
COM_INTERFACE_ENTRY(IAccessibleTableCell) COM_INTERFACE_ENTRY(IAccessibleTableCell)
COM_INTERFACE_ENTRY(IRangeValueProvider)
COM_INTERFACE_ENTRY(IRawElementProviderSimple) COM_INTERFACE_ENTRY(IRawElementProviderSimple)
COM_INTERFACE_ENTRY(IScrollItemProvider) COM_INTERFACE_ENTRY(IScrollItemProvider)
COM_INTERFACE_ENTRY(IValueProvider)
COM_INTERFACE_ENTRY(IServiceProvider) COM_INTERFACE_ENTRY(IServiceProvider)
END_COM_MAP() END_COM_MAP()
...@@ -426,6 +430,32 @@ class AX_EXPORT __declspec(uuid("26f5641a-246d-457b-a96d-07f3fae6acf2")) ...@@ -426,6 +430,32 @@ class AX_EXPORT __declspec(uuid("26f5641a-246d-457b-a96d-07f3fae6acf2"))
STDMETHODIMP ScrollIntoView() override; STDMETHODIMP ScrollIntoView() override;
//
// IValueProvider methods.
//
STDMETHODIMP SetValue(LPCWSTR val) override;
STDMETHODIMP get_IsReadOnly(BOOL* result) override;
STDMETHODIMP get_Value(BSTR* result) override;
//
// IRangeValueProvider methods.
//
STDMETHODIMP SetValue(double val) override;
STDMETHODIMP get_LargeChange(double* result) override;
STDMETHODIMP get_Maximum(double* result) override;
STDMETHODIMP get_Minimum(double* result) override;
STDMETHODIMP get_SmallChange(double* result) override;
STDMETHODIMP get_Value(double* result) override;
// IAccessibleEx methods not implemented. // IAccessibleEx methods not implemented.
STDMETHODIMP GetRuntimeId(SAFEARRAY** runtime_id) override; STDMETHODIMP GetRuntimeId(SAFEARRAY** runtime_id) override;
......
...@@ -36,24 +36,6 @@ bool UIATextProvider::CreateTextProvider(const string16& value, ...@@ -36,24 +36,6 @@ bool UIATextProvider::CreateTextProvider(const string16& value,
return false; return false;
} }
STDMETHODIMP UIATextProvider::get_IsReadOnly(BOOL* read_only) {
*read_only = !editable_;
return S_OK;
}
//
// IValueProvider methods.
//
STDMETHODIMP UIATextProvider::SetValue(const wchar_t* val) {
return E_NOTIMPL;
}
STDMETHODIMP UIATextProvider::get_Value(BSTR* value) {
*value = SysAllocString(value_.c_str());
return S_OK;
}
// //
// ITextProvider methods. // ITextProvider methods.
// //
......
...@@ -18,12 +18,10 @@ namespace win { ...@@ -18,12 +18,10 @@ namespace win {
// UIA Text provider implementation for edit controls. // UIA Text provider implementation for edit controls.
class UI_BASE_EXPORT UIATextProvider class UI_BASE_EXPORT UIATextProvider
: public CComObjectRootEx<CComMultiThreadModel>, : public CComObjectRootEx<CComMultiThreadModel>,
public IValueProvider,
public ITextProvider { public ITextProvider {
public: public:
BEGIN_COM_MAP(UIATextProvider) BEGIN_COM_MAP(UIATextProvider)
COM_INTERFACE_ENTRY2(IUnknown, ITextProvider) COM_INTERFACE_ENTRY2(IUnknown, ITextProvider)
COM_INTERFACE_ENTRY(IValueProvider)
COM_INTERFACE_ENTRY(ITextProvider) COM_INTERFACE_ENTRY(ITextProvider)
END_COM_MAP() END_COM_MAP()
...@@ -42,18 +40,6 @@ class UI_BASE_EXPORT UIATextProvider ...@@ -42,18 +40,6 @@ class UI_BASE_EXPORT UIATextProvider
void set_value(const string16& value) { value_ = value; } void set_value(const string16& value) { value_ = value; }
//
// IValueProvider methods.
//
STDMETHOD(get_IsReadOnly)(BOOL* read_only) override;
//
// IValueProvider methods.
//
STDMETHOD(SetValue)(const wchar_t* val) override;
STDMETHOD(get_Value)(BSTR* value) override;
// //
// ITextProvider methods. // ITextProvider methods.
// //
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment