Commit 76ac2710 authored by Victor Fei's avatar Victor Fei Committed by Commit Bot

UIA: Fire UIA_AriaPropertiesPropertyId event, part 3/5

- Implemented firing property changed event for
  UIA_AriaPropertiesPropertyId and associated unit and
  browser dump tests for the following AriaProperties:
   - disabled
   - level
   - live
   - multiselectable

- Breakdown of UI Automation AriaProperties need to be
  implemented:
  atomic [part 1]
  busy [part 1]
  channel [part 2]
  checked [part 1]
  disabled [part 3, this cl]
  dropeffect [part 2]
  expanded [part 1]
  grabbed [part 2]
  haspopup [part 1]
  hidden [not implemented]
  invalid [part 1]
  level [part 3, this cl]
  live [part 3, this cl]
  multiline [part 1]
  multiselectable [part 3, this cl]
  posinset [part 4]
  pressed [part 4]
  readonly [part 4]
  relevant [part 4]
  required [part 1]
  secret [part 2]
  selected [part 1]
  setsize [part 5]
  sort [part 5]
  tabindex [part 2]
  valuemax [part 5]
  valuemin [part 5]
  valuenow [part 5]
  valuetext [part 5]

- Documentation on UI Automation AriaProperties
(see the second table's last column for AriaProperties
properties):
https://docs.microsoft.com/en-us/windows/desktop/WinAuto/uiauto-ariaspecification

- Link to part 1, UIA: Fire UIA_AriaPropertiesPropertyId event:
  CL:1574834

- Link to part 2, UIA: Fire UIA_AriaPropertiesPropertyId event:
  CL:1576280

- Link to part 3, UIA: Fire UIA_AriaPropertiesPropertyId event:
  CL:1589100

- Link to part 4, UIA: Fire UIA_AriaPropertiesPropertyId event:
  CL:1592640

- Link to part 5, UIA: Fire UIA_AriaPropertiesPropertyId event:
  CL:1591487

Bug: 928949

Change-Id: If2dff6ee3c40a6a4d5e7bec0b298e599b529f878
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1589100
Commit-Queue: Victor Fei <vicfei@microsoft.com>
Reviewed-by: default avatarKatie Dektar <katie@chromium.org>
Reviewed-by: default avatarIan Prest <iapres@microsoft.com>
Cr-Commit-Position: refs/heads/master@{#658735}
parent 9d13e639
......@@ -222,6 +222,7 @@ void BrowserAccessibilityManagerWin::FireGeneratedEvent(
}
case ui::AXEventGenerator::Event::ENABLED_CHANGED:
FireUiaPropertyChangedEvent(UIA_IsEnabledPropertyId, node);
aria_properties_events_.insert(node);
break;
case ui::AXEventGenerator::Event::FLOW_FROM_CHANGED:
FireUiaPropertyChangedEvent(UIA_FlowsFromPropertyId, node);
......@@ -234,6 +235,7 @@ void BrowserAccessibilityManagerWin::FireGeneratedEvent(
break;
case ui::AXEventGenerator::Event::HIERARCHICAL_LEVEL_CHANGED:
FireUiaPropertyChangedEvent(UIA_LevelPropertyId, node);
aria_properties_events_.insert(node);
break;
case ui::AXEventGenerator::Event::IMAGE_ANNOTATION_CHANGED:
FireWinAccessibilityEvent(EVENT_OBJECT_NAMECHANGE, node);
......@@ -271,6 +273,7 @@ void BrowserAccessibilityManagerWin::FireGeneratedEvent(
break;
case ui::AXEventGenerator::Event::LIVE_STATUS_CHANGED:
FireUiaPropertyChangedEvent(UIA_LiveSettingPropertyId, node);
aria_properties_events_.insert(node);
break;
case ui::AXEventGenerator::Event::LOAD_COMPLETE:
FireWinAccessibilityEvent(IA2_EVENT_DOCUMENT_LOAD_COMPLETE, node);
......@@ -284,6 +287,7 @@ void BrowserAccessibilityManagerWin::FireGeneratedEvent(
case ui::AXEventGenerator::Event::MULTISELECTABLE_STATE_CHANGED:
FireUiaPropertyChangedEvent(UIA_SelectionCanSelectMultiplePropertyId,
node);
aria_properties_events_.insert(node);
break;
case ui::AXEventGenerator::Event::NAME_CHANGED:
FireUiaPropertyChangedEvent(UIA_NamePropertyId, node);
......
......@@ -255,6 +255,11 @@ IN_PROC_BROWSER_TEST_P(DumpAccessibilityEventsTest,
RunEventTest(FILE_PATH_LITERAL("aria-controls-changed.html"));
}
IN_PROC_BROWSER_TEST_P(DumpAccessibilityEventsTest,
AccessibilityEventsAriaDisabledChanged) {
RunEventTest(FILE_PATH_LITERAL("aria-disabled-changed.html"));
}
IN_PROC_BROWSER_TEST_P(DumpAccessibilityEventsTest,
AccessibilityEventsAriaHasPopupChanged) {
RunEventTest(FILE_PATH_LITERAL("aria-haspopup-changed.html"));
......@@ -265,6 +270,16 @@ IN_PROC_BROWSER_TEST_P(DumpAccessibilityEventsTest,
RunEventTest(FILE_PATH_LITERAL("aria-invalid-changed.html"));
}
IN_PROC_BROWSER_TEST_P(DumpAccessibilityEventsTest,
AccessibilityEventsAriaLevelChanged) {
RunEventTest(FILE_PATH_LITERAL("aria-level-changed.html"));
}
IN_PROC_BROWSER_TEST_P(DumpAccessibilityEventsTest,
AccessibilityEventsAriaLiveChanged) {
RunEventTest(FILE_PATH_LITERAL("aria-live-changed.html"));
}
IN_PROC_BROWSER_TEST_P(DumpAccessibilityEventsTest,
AccessibilityEventsAriaMultilineChanged) {
RunEventTest(FILE_PATH_LITERAL("aria-multiline-changed.html"));
......
AriaProperties changed on role=checkbox, name=checkbox1
AriaProperties changed on role=checkbox, name=checkbox2
AriaProperties changed on role=group, name=fieldset0
AriaProperties changed on role=group, name=fieldset1
AriaProperties changed on role=radio, name=radio0
AriaProperties changed on role=radio, name=radio1
IsEnabled changed on role=checkbox, name=checkbox1
IsEnabled changed on role=checkbox, name=checkbox2
IsEnabled changed on role=group, name=fieldset0
IsEnabled changed on role=group, name=fieldset1
IsEnabled changed on role=radio, name=radio0
IsEnabled changed on role=radio, name=radio1
ValueIsReadOnly changed on role=checkbox, name=checkbox1
ValueIsReadOnly changed on role=checkbox, name=checkbox2
ValueIsReadOnly changed on role=radio, name=radio0
ValueIsReadOnly changed on role=radio, name=radio1
EVENT_OBJECT_STATECHANGE on role=ROLE_SYSTEM_CHECKBUTTON UNAVAILABLE IA2_STATE_CHECKABLE
EVENT_OBJECT_STATECHANGE on role=ROLE_SYSTEM_RADIOBUTTON IA2_STATE_CHECKABLE
EVENT_OBJECT_STATECHANGE on role=ROLE_SYSTEM_GROUPING
\ No newline at end of file
EVENT_OBJECT_STATECHANGE on <div#checkbox1> role=ROLE_SYSTEM_CHECKBUTTON name="checkbox1" UNAVAILABLE IA2_STATE_CHECKABLE
EVENT_OBJECT_STATECHANGE on <div#checkbox2> role=ROLE_SYSTEM_CHECKBUTTON name="checkbox2" IA2_STATE_CHECKABLE
EVENT_OBJECT_STATECHANGE on <div#radio0> role=ROLE_SYSTEM_RADIOBUTTON name="radio0" IA2_STATE_CHECKABLE PosInSet=1 SetSize=1
EVENT_OBJECT_STATECHANGE on <div#radio1> role=ROLE_SYSTEM_RADIOBUTTON name="radio1" IA2_STATE_CHECKABLE PosInSet=1 SetSize=1
EVENT_OBJECT_STATECHANGE on <fieldset#fieldset0> role=ROLE_SYSTEM_GROUPING name="fieldset0"
EVENT_OBJECT_STATECHANGE on <fieldset#fieldset1> role=ROLE_SYSTEM_GROUPING name="fieldset1"
<!DOCTYPE html>
<!--
@MAC-ALLOW:AXEnabled*
@WIN-ALLOW:UNAVAILABLE
-->
<!DOCTYPE html>
<form>
<div role="checkbox"></div>
<fieldset aria-disabled="true">
<div role="radio" aria-disabled="true"></div>
<div id="checkbox0" aria-label="checkbox0" role="checkbox"></div>
<div id="checkbox1" aria-label="checkbox1" role="checkbox"></div>
<div id="checkbox2" aria-label="checkbox2" role="checkbox" aria-disabled="true"></div>
<fieldset id="fieldset0" aria-label="fieldset0" aria-disabled="true">
<div id="radio0" aria-label="radio0" role="radio" aria-disabled="true"></div>
</fieldset>
<fieldset id="fieldset1" aria-label="fieldset1" aria-disabled="true">
<div id="radio1" aria-label="radio1" role="radio" aria-disabled="true"></div>
</fieldset>
<fieldset id="fieldset2" aria-label="fieldset2">
<div id="radio2" aria-label="radio2" role="radio"></div>
</fieldset>
</form>
<script>
function go() {
document.querySelector('div[role=checkbox]').setAttribute('aria-disabled', true);
document.querySelector('div[role=radio]').setAttribute('aria-disabled', false);
document.querySelector('fieldset').setAttribute('aria-disabled', false);
// Set aria-disabled on checkbox from default false->false; should not fire an event.
document.getElementById('checkbox0').setAttribute('aria-disabled', false);
// Set aria-disabled on checkbox from default false->true; should fire an event.
document.getElementById('checkbox1').setAttribute('aria-disabled', true);
// Set aria-disabled on checkbox from true->[removed]; should fire an event.
document.getElementById('checkbox2').removeAttribute('aria-disabled');
// Set aria-disabled on radio from true->false; should fire an event.
document.getElementById('radio0').setAttribute('aria-disabled', false);
// Set aria-disabled on fieldset from true->false; should fire an event.
document.getElementById('fieldset0').setAttribute('aria-disabled', false);
// Set aria-disabled on radio from true->[removed]; should fire an event.
document.getElementById('radio1').setAttribute('aria-disabled', false);
// Set aria-disabled on fieldset from true->[removed]; should fire an event.
document.getElementById('fieldset1').setAttribute('aria-disabled', false);
// Set aria-disabled on radio from default false->false; should not fire an event.
document.getElementById('radio2').setAttribute('aria-disabled', false);
// Set aria-disabled on fieldset from default false->false; should not fire an event.
document.getElementById('fieldset2').setAttribute('aria-disabled', false);
}
</script>
AriaProperties changed on role=heading, name=Item2
AriaProperties changed on role=heading, name=Item3
AriaProperties changed on role=heading, name=Item4
Level changed on role=heading, name=Item2
Level changed on role=heading, name=Item3
Level changed on role=heading, name=Item4
AriaProperties changed on role=heading, name=Item2
AriaProperties changed on role=heading, name=Item3
AriaProperties changed on role=heading, name=Item4
<!DOCTYPE html>
<html>
<body>
<div id="d1" role="heading">Item1</div>
<div id="d2" role="heading">Item2</div>
<div id="d3" role="heading" aria-level="3">Item3</div>
<div id="d4" role="heading" aria-level="3">Item4</div>
<script>
function go() {
// Set aria-level from default '2'->'2'; should not fire an event.
document.getElementById('d1').setAttribute('aria-level', '2');
// Set aria-level from default '2'->'3'; should fire an event.
document.getElementById('d2').setAttribute('aria-level', '3');
// Set aria-level from '3'->'2'; should fire an event.
document.getElementById('d3').setAttribute('aria-level', '2');
// Set aria-level from '3'->[removed]; should fire an event.
document.getElementById('d4').removeAttribute('aria-level');
}
</script>
</body>
</html>
AriaProperties changed on role=heading, name=Item2
AriaProperties changed on role=heading, name=Item3
AriaProperties changed on role=heading, name=Item4
LiveSetting changed on role=heading, name=Item2
LiveSetting changed on role=heading, name=Item3
LiveSetting changed on role=heading, name=Item4
AriaProperties changed on role=heading, name=Item2
AriaProperties changed on role=heading, name=Item3
AriaProperties changed on role=heading, name=Item4
<!--
@UIA-WIN-DENY:*
@UIA-WIN-ALLOW:AriaProperties*
@UIA-WIN-ALLOW:LiveSetting*
-->
<!DOCTYPE html>
<html>
<body>
<h4 id="d1" aria-live="off">Item1</h4>
<h4 id="d2" aria-live="polite">Item2</h4>
<h4 id="d3" aria-live="polite">Item3</h4>
<h4 id="d4">Item4</h4>
<button onclick="go()">go</button>
<script>
function go() {
// set live from 'off' to 'off', so this shouldn't fire an event
document.getElementById('d1').setAttribute('aria-live', 'off');
// set live from 'polite'->'assertive'; should fire an event
document.getElementById('d2').setAttribute('aria-live', 'assertive');
// set live from 'polite'->[removed]; should fire event
document.getElementById('d3').removeAttribute('aria-live');
// set live to 'polite'; should fire an event
document.getElementById('d4').setAttribute('aria-live', 'polite');
}
</script>
</body>
</html>
AriaProperties changed on role=grid
AriaProperties changed on role=listbox
AriaProperties changed on role=tablist
AriaProperties changed on role=tree
AriaProperties changed on role=treegrid
SelectionCanSelectMultiple changed on role=grid
SelectionCanSelectMultiple changed on role=listbox
SelectionCanSelectMultiple changed on role=tablist
......
AriaProperties changed on role=group
LiveRegionChanged on role=group
LiveSetting changed on role=group
<!--
@UIA-WIN-DENY:*
@UIA-WIN-ALLOW:AriaProperties*
@UIA-WIN-ALLOW:LiveRegion*
@UIA-WIN-ALLOW:LiveSetting*
-->
......
AriaProperties changed on role=slider
IsEnabled changed on role=slider
RangeValueIsReadOnly changed on role=slider
=== Start Continuation ===
AriaProperties changed on role=slider
IsEnabled changed on role=slider
RangeValueIsReadOnly changed on role=slider
=== Start Continuation ===
......@@ -8,8 +10,10 @@ RangeValueIsReadOnly changed on role=slider
=== Start Continuation ===
RangeValueIsReadOnly changed on role=slider
=== Start Continuation ===
AriaProperties changed on role=slider
IsEnabled changed on role=slider
RangeValueIsReadOnly changed on role=slider
=== Start Continuation ===
AriaProperties changed on role=slider
IsEnabled changed on role=slider
RangeValueIsReadOnly changed on role=slider
AriaProperties changed on role=textbox
IsEnabled changed on role=textbox
ValueIsReadOnly changed on role=textbox
=== Start Continuation ===
AriaProperties changed on role=textbox
IsEnabled changed on role=textbox
ValueIsReadOnly changed on role=textbox
=== Start Continuation ===
......@@ -12,8 +14,10 @@ ValueIsReadOnly changed on role=textbox
=== Start Continuation ===
ValueIsReadOnly changed on role=textbox
=== Start Continuation ===
AriaProperties changed on role=textbox
IsEnabled changed on role=textbox
ValueIsReadOnly changed on role=textbox
=== Start Continuation ===
AriaProperties changed on role=textbox
IsEnabled changed on role=textbox
ValueIsReadOnly changed on role=textbox
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