Commit cf071719 authored by CJ DiMeglio's avatar CJ DiMeglio Committed by Commit Bot

[Accessibility] Volume slider reads out level in percentages.

This CL makes it such that the volume level is read out as a percentage
in aria. This CL also amplifies how the accessibility information is
given to aria, by setting attributes instead of explicitly creating
accessibility nodes.

Bug: 905024
Change-Id: I0ee5a91215669f39c7394d3c8f113ae83a74cf00
Reviewed-on: https://chromium-review.googlesource.com/c/1337298Reviewed-by: default avatarNico Weber <thakis@chromium.org>
Reviewed-by: default avatarDominic Mazzoni <dmazzoni@chromium.org>
Reviewed-by: default avatarMounir Lamouri <mlamouri@chromium.org>
Commit-Queue: CJ DiMeglio <lethalantidote@chromium.org>
Cr-Commit-Position: refs/heads/master@{#612160}
parent 02f8a46c
...@@ -1866,6 +1866,10 @@ IN_PROC_BROWSER_TEST_F(DumpAccessibilityTreeTest, DISABLED_AccessibilityVideo) { ...@@ -1866,6 +1866,10 @@ IN_PROC_BROWSER_TEST_F(DumpAccessibilityTreeTest, DISABLED_AccessibilityVideo) {
RunHtmlTest(FILE_PATH_LITERAL("video.html")); RunHtmlTest(FILE_PATH_LITERAL("video.html"));
} }
IN_PROC_BROWSER_TEST_F(DumpAccessibilityTreeTest, AccessibilityVideoControls) {
RunHtmlTest(FILE_PATH_LITERAL("video-controls.html"));
}
IN_PROC_BROWSER_TEST_F(DumpAccessibilityTreeTest, AccessibilityWbr) { IN_PROC_BROWSER_TEST_F(DumpAccessibilityTreeTest, AccessibilityWbr) {
RunHtmlTest(FILE_PATH_LITERAL("wbr.html")); RunHtmlTest(FILE_PATH_LITERAL("wbr.html"));
} }
......
[document web]
++[section]
++++[video]
++++++[section]
++++++++[tool bar] name='video' description='video' horizontal
++++++++[tool bar] name='video' description='video' horizontal
++++++++++[tool bar] name='video' description='video' horizontal
++++++++++++[tool bar] name='video' description='video' horizontal
++++++++++++++[push button] name='play'
++++++++++++++[text] name='0:00'
++++++++++++++[push button] name='mute'
++++++++++++++[push button] name='enter full screen'
++++++++++++++[push button] name='show more media controls' description='more options'
++++++++++++[slider] description='movie time scrubber' horizontal
rootWebArea
++genericContainer
++++video
++++++genericContainer
++++++++toolbar horizontal description='video' name='video' descriptionFrom=uninitialized
++++++++toolbar horizontal description='video' name='video' descriptionFrom=uninitialized
++++++++++toolbar horizontal description='video' name='video' descriptionFrom=uninitialized
++++++++++++toolbar horizontal description='video' name='video' descriptionFrom=uninitialized
++++++++++++++button name='play' restriction=disabled
++++++++++++++staticText name='0:00'
++++++++++++++++inlineTextBox name='0:00'
++++++++++++++button name='mute' restriction=disabled
++++++++++++++button name='enter full screen' restriction=disabled
++++++++++++++button description='more options' name='show more media controls' descriptionFrom=uninitialized restriction=disabled
++++++++++++slider horizontal description='movie time scrubber' value='0:00' descriptionFrom=uninitialized valueForRange=0.00 minValueForRange=0.00 maxValueForRange=0.00
++++++++++++++sliderThumb
<!DOCTYPE html>
<html>
<body>
<video controls></video>
</body>
</html>
<!DOCTYPE html>
<title>Media Controls: volume slider accessibility tests</title>
<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
<script src="../media-controls.js"></script>
<video controls></video>
<script>
async_test(t => {
// Ensure that we will show the volume slider.
setPreferHiddenVolumeControlsForTest(t, false);
assert_true(internals.runtimeFlags.accessibilityObjectModelEnabled);
var video = document.querySelector('video');
video.src = '../content/test.ogv';
video.onloadedmetadata = t.step(function() {
var volume_slider = volumeSliderElement(video);
assert_not_equals(volume_slider, null);
assert_equals(volume_slider.getAttribute('aria-label'), 'volume');
assert_equals(volume_slider.getAttribute('aria-valuemin'), '0');
assert_equals(volume_slider.getAttribute('aria-valuemax'), '100');
assert_equals(volume_slider.getAttribute('aria-valuenow'), '100');
// Trigger events that will update the timeline internal state.
video.volume = 0.54;
video.onvolumechange = t.step_func_done(function(event) {
assert_equals(volume_slider.getAttribute('aria-valuenow'), '54');
});
});
});
</script>
...@@ -58,10 +58,6 @@ AXObject* AccessibilityMediaControl::Create( ...@@ -58,10 +58,6 @@ AXObject* AccessibilityMediaControl::Create(
case kMediaSlider: case kMediaSlider:
return AccessibilityMediaTimeline::Create(layout_object, ax_object_cache); return AccessibilityMediaTimeline::Create(layout_object, ax_object_cache);
case kMediaVolumeSlider:
return AccessibilityMediaVolumeSlider::Create(layout_object,
ax_object_cache);
case kMediaCurrentTimeDisplay: case kMediaCurrentTimeDisplay:
case kMediaTimeRemainingDisplay: case kMediaTimeRemainingDisplay:
return AccessibilityMediaTimeDisplay::Create(layout_object, return AccessibilityMediaTimeDisplay::Create(layout_object,
...@@ -97,6 +93,10 @@ AXObject* AccessibilityMediaControl::Create( ...@@ -97,6 +93,10 @@ AXObject* AccessibilityMediaControl::Create(
case kMediaDisplayCutoutFullscreenButton: case kMediaDisplayCutoutFullscreenButton:
case kMediaAnimatedArrowContainer: case kMediaAnimatedArrowContainer:
return new AccessibilityMediaControl(layout_object, ax_object_cache); return new AccessibilityMediaControl(layout_object, ax_object_cache);
// Removed as a part of the a11y tree rewrite https://crbug/836549.
case kMediaVolumeSlider:
NOTREACHED();
return new AccessibilityMediaControl(layout_object, ax_object_cache);
} }
NOTREACHED(); NOTREACHED();
...@@ -368,37 +368,6 @@ String AccessibilityMediaTimeline::Description( ...@@ -368,37 +368,6 @@ String AccessibilityMediaTimeline::Description(
: WebLocalizedString::kAXMediaAudioSliderHelp); : WebLocalizedString::kAXMediaAudioSliderHelp);
} }
//
// AccessibilityMediaVolumeSlider
AccessibilityMediaVolumeSlider::AccessibilityMediaVolumeSlider(
LayoutObject* layout_object,
AXObjectCacheImpl& ax_object_cache)
: AXSlider(layout_object, ax_object_cache) {}
AXObject* AccessibilityMediaVolumeSlider::Create(
LayoutObject* layout_object,
AXObjectCacheImpl& ax_object_cache) {
return new AccessibilityMediaVolumeSlider(layout_object, ax_object_cache);
}
String AccessibilityMediaVolumeSlider::Description(
ax::mojom::NameFrom name_from,
ax::mojom::DescriptionFrom& description_from,
AXObjectVector* description_objects) const {
return QueryString(WebLocalizedString::kAXMediaVolumeSliderHelp);
}
bool AccessibilityMediaVolumeSlider::InternalSetAccessibilityFocusAction() {
MediaControlElementsHelper::NotifyMediaControlAccessibleFocus(GetElement());
return AXSlider::InternalSetAccessibilityFocusAction();
}
bool AccessibilityMediaVolumeSlider::InternalClearAccessibilityFocusAction() {
MediaControlElementsHelper::NotifyMediaControlAccessibleBlur(GetElement());
return AXSlider::InternalClearAccessibilityFocusAction();
}
// //
// AccessibilityMediaTimeDisplay // AccessibilityMediaTimeDisplay
......
...@@ -80,24 +80,6 @@ class AccessibilityMediaTimeline final : public AXSlider { ...@@ -80,24 +80,6 @@ class AccessibilityMediaTimeline final : public AXSlider {
DISALLOW_COPY_AND_ASSIGN(AccessibilityMediaTimeline); DISALLOW_COPY_AND_ASSIGN(AccessibilityMediaTimeline);
}; };
class AccessibilityMediaVolumeSlider final : public AXSlider {
public:
static AXObject* Create(LayoutObject*, AXObjectCacheImpl&);
~AccessibilityMediaVolumeSlider() override = default;
String Description(ax::mojom::NameFrom,
ax::mojom::DescriptionFrom&,
AXObjectVector* description_objects) const override;
bool InternalSetAccessibilityFocusAction() override;
bool InternalClearAccessibilityFocusAction() override;
private:
AccessibilityMediaVolumeSlider(LayoutObject*, AXObjectCacheImpl&);
DISALLOW_COPY_AND_ASSIGN(AccessibilityMediaVolumeSlider);
};
class AXMediaControlsContainer final : public AccessibilityMediaControl { class AXMediaControlsContainer final : public AccessibilityMediaControl {
public: public:
static AXObject* Create(LayoutObject*, AXObjectCacheImpl&); static AXObject* Create(LayoutObject*, AXObjectCacheImpl&);
......
...@@ -82,6 +82,7 @@ ...@@ -82,6 +82,7 @@
#include "third_party/blink/renderer/modules/accessibility/ax_slider.h" #include "third_party/blink/renderer/modules/accessibility/ax_slider.h"
#include "third_party/blink/renderer/modules/accessibility/ax_svg_root.h" #include "third_party/blink/renderer/modules/accessibility/ax_svg_root.h"
#include "third_party/blink/renderer/modules/accessibility/ax_virtual_object.h" #include "third_party/blink/renderer/modules/accessibility/ax_virtual_object.h"
#include "third_party/blink/renderer/modules/media_controls/elements/media_control_elements_helper.h"
#include "third_party/blink/renderer/modules/permissions/permission_utils.h" #include "third_party/blink/renderer/modules/permissions/permission_utils.h"
namespace blink { namespace blink {
...@@ -311,8 +312,13 @@ AXObject* AXObjectCacheImpl::CreateFromRenderer(LayoutObject* layout_object) { ...@@ -311,8 +312,13 @@ AXObject* AXObjectCacheImpl::CreateFromRenderer(LayoutObject* layout_object) {
return AXList::Create(layout_object, *this); return AXList::Create(layout_object, *this);
// media controls // media controls
if (node && node->IsMediaControlElement()) // TODO(836549): Remove for the rest of the controls.
// kMediaVolumeSlider has already been removed.
if (node && node->IsMediaControlElement() &&
MediaControlElementsHelper::GetMediaControlElementType(node) !=
kMediaVolumeSlider) {
return AccessibilityMediaControl::Create(layout_object, *this); return AccessibilityMediaControl::Create(layout_object, *this);
}
if (IsHTMLOptionElement(node)) if (IsHTMLOptionElement(node))
return AXListBoxOption::Create(layout_object, *this); return AXListBoxOption::Create(layout_object, *this);
......
...@@ -20,6 +20,9 @@ MediaControlVolumeSliderElement::MediaControlVolumeSliderElement( ...@@ -20,6 +20,9 @@ MediaControlVolumeSliderElement::MediaControlVolumeSliderElement(
MediaControlsImpl& media_controls) MediaControlsImpl& media_controls)
: MediaControlSliderElement(media_controls, kMediaVolumeSlider) { : MediaControlSliderElement(media_controls, kMediaVolumeSlider) {
setAttribute(html_names::kMaxAttr, "1"); setAttribute(html_names::kMaxAttr, "1");
setAttribute(html_names::kAriaValuemaxAttr, "100");
setAttribute(html_names::kAriaValueminAttr, "0");
setAttribute(html_names::kAriaLabelAttr, "volume");
SetShadowPseudoId(AtomicString("-webkit-media-controls-volume-slider")); SetShadowPseudoId(AtomicString("-webkit-media-controls-volume-slider"));
SetVolumeInternal(MediaElement().volume()); SetVolumeInternal(MediaElement().volume());
...@@ -104,6 +107,9 @@ void MediaControlVolumeSliderElement::DefaultEventHandler(Event& event) { ...@@ -104,6 +107,9 @@ void MediaControlVolumeSliderElement::DefaultEventHandler(Event& event) {
void MediaControlVolumeSliderElement::SetVolumeInternal(double volume) { void MediaControlVolumeSliderElement::SetVolumeInternal(double volume) {
SetupBarSegments(); SetupBarSegments();
SetAfterSegmentPosition(MediaControlSliderElement::Position(0, volume)); SetAfterSegmentPosition(MediaControlSliderElement::Position(0, volume));
int percent_vol = 100 * volume;
setAttribute(html_names::kAriaValuenowAttr,
WTF::AtomicString::Number(percent_vol));
} }
bool MediaControlVolumeSliderElement::KeepEventInNode( bool MediaControlVolumeSliderElement::KeepEventInNode(
......
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