Title: [200520] trunk
- Revision
- 200520
- Author
- [email protected]
- Date
- 2016-05-06 14:01:32 -0700 (Fri, 06 May 2016)
Log Message
FKA: No way to get focus from DOM to shadow DOM components (Was: HTML5 media controls not keyboard accessible)
https://bugs.webkit.org/show_bug.cgi?id=117857
Reviewed by Jer Noble.
Source/WebCore:
The bug was caused by hasCustomFocusLogic returning true on media elements.
Fix the bug by removing this function so that FocusController will walk into the shadow tree of media elements
to look for focusable elements. This will allow AT such as Voice Over to iterate through controls.
We don't seem to draw focus rings inside the media elements but that could be tweaked in a separate patch.
Test: media/tab-focus-inside-media-elements.html
* html/HTMLMediaElement.cpp:
(WebCore::HTMLMediaElement::hasCustomFocusLogic): Deleted.
* html/HTMLMediaElement.h:
LayoutTests:
Added a regression test for moving focus into media elements by pressing tab key.
* media/tab-focus-inside-media-elements-expected.txt: Added.
* media/tab-focus-inside-media-elements.html: Added.
Modified Paths
Added Paths
Diff
Modified: trunk/LayoutTests/ChangeLog (200519 => 200520)
--- trunk/LayoutTests/ChangeLog 2016-05-06 20:38:55 UTC (rev 200519)
+++ trunk/LayoutTests/ChangeLog 2016-05-06 21:01:32 UTC (rev 200520)
@@ -1,3 +1,15 @@
+2016-05-06 Ryosuke Niwa <[email protected]>
+
+ FKA: No way to get focus from DOM to shadow DOM components (Was: HTML5 media controls not keyboard accessible)
+ https://bugs.webkit.org/show_bug.cgi?id=117857
+
+ Reviewed by Jer Noble.
+
+ Added a regression test for moving focus into media elements by pressing tab key.
+
+ * media/tab-focus-inside-media-elements-expected.txt: Added.
+ * media/tab-focus-inside-media-elements.html: Added.
+
2016-05-06 Filip Pizlo <[email protected]>
JS Function removed after parsing
Added: trunk/LayoutTests/media/tab-focus-inside-media-elements-expected.txt (0 => 200520)
--- trunk/LayoutTests/media/tab-focus-inside-media-elements-expected.txt (rev 0)
+++ trunk/LayoutTests/media/tab-focus-inside-media-elements-expected.txt 2016-05-06 21:01:32 UTC (rev 200520)
@@ -0,0 +1,39 @@
+
+
+Tests for moving the focus onto controls inside an audio element and a video element.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS document.body.focus(); eventSender.keyDown("\t"); document.activeElement is mediaElements[0]
+PASS mediaElements[0] instanceof HTMLAudioElement is true
+PASS mediaElements[0].controls is true
+PASS eventSender.keyDown("\t"); document.activeElement is mediaElements[0]
+PASS !!internals.shadowRoot(mediaElements[0]).activeElement /* play button */ is true
+PASS eventSender.keyDown("\t"); document.activeElement is mediaElements[0]
+PASS !!internals.shadowRoot(mediaElements[0]).activeElement /* rewind button */ is true
+PASS eventSender.keyDown("\t"); document.activeElement is mediaElements[0]
+PASS !!internals.shadowRoot(mediaElements[0]).activeElement /* volume slider */ is true
+PASS eventSender.keyDown("\t"); document.activeElement is mediaElements[0]
+PASS !!internals.shadowRoot(mediaElements[0]).activeElement /* mute button */ is true
+PASS eventSender.keyDown("\t"); document.activeElement is mediaElements[1]
+PASS mediaElements[1] instanceof HTMLVideoElement is true
+PASS mediaElements[1].controls is true
+FAIL !!internals.shadowRoot(mediaElements[1]).activeElement /* play button */ should be true. Was false.
+PASS eventSender.keyDown("\t"); document.activeElement is mediaElements[1]
+PASS !!internals.shadowRoot(mediaElements[1]).activeElement /* rewind button */ is true
+PASS eventSender.keyDown("\t"); document.activeElement is mediaElements[1]
+PASS !!internals.shadowRoot(mediaElements[1]).activeElement /* volume slider */ is true
+PASS eventSender.keyDown("\t"); document.activeElement is mediaElements[1]
+PASS !!internals.shadowRoot(mediaElements[1]).activeElement /* mute button */ is true
+FAIL eventSender.keyDown("\t"); document.activeElement should be [object HTMLAudioElement]. Was [object HTMLVideoElement].
+PASS mediaElements[2] instanceof HTMLAudioElement is true
+PASS mediaElements[2].controls is false
+PASS eventSender.keyDown("\t"); document.activeElement is mediaElements[3]
+PASS mediaElements[3] instanceof HTMLVideoElement is true
+PASS mediaElements[3].controls is false
+PASS eventSender.keyDown("\t"); document.activeElement is document.querySelector("div")
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
Added: trunk/LayoutTests/media/tab-focus-inside-media-elements.html (0 => 200520)
--- trunk/LayoutTests/media/tab-focus-inside-media-elements.html (rev 0)
+++ trunk/LayoutTests/media/tab-focus-inside-media-elements.html 2016-05-06 21:01:32 UTC (rev 200520)
@@ -0,0 +1,61 @@
+<!DOCTYPE html!>
+<html>
+<body>
+<audio controls></audio><video controls></video><br>
+<audio tabindex="0"></audio><video tabindex="0"></video>
+<div tabindex="0"></div>
+<div id="console"></div>
+<script src=""
+<script>
+
+description('Tests for moving the focus onto controls inside an audio element and a video element.');
+
+var mediaElements = document.querySelectorAll("audio,video");
+
+if (window.testRunner)
+ runTests();
+else
+ log('This test requires eventSender');
+
+function runTests()
+{
+ testRunner.overridePreference("WebKitTabToLinksPreferenceKey", 1);
+
+ shouldBe('document.body.focus(); eventSender.keyDown("\\t"); document.activeElement', 'mediaElements[0]');
+ shouldBeTrue('mediaElements[0] instanceof HTMLAudioElement');
+ shouldBeTrue('mediaElements[0].controls');
+ shouldBe('eventSender.keyDown("\\t"); document.activeElement', 'mediaElements[0]');
+ shouldBeTrue('!!internals.shadowRoot(mediaElements[0]).activeElement /* play button */');
+ shouldBe('eventSender.keyDown("\\t"); document.activeElement', 'mediaElements[0]');
+ shouldBeTrue('!!internals.shadowRoot(mediaElements[0]).activeElement /* rewind button */');
+ shouldBe('eventSender.keyDown("\\t"); document.activeElement', 'mediaElements[0]');
+ shouldBeTrue('!!internals.shadowRoot(mediaElements[0]).activeElement /* volume slider */');
+ shouldBe('eventSender.keyDown("\\t"); document.activeElement', 'mediaElements[0]');
+ shouldBeTrue('!!internals.shadowRoot(mediaElements[0]).activeElement /* mute button */');
+
+ shouldBe('eventSender.keyDown("\\t"); document.activeElement', 'mediaElements[1]');
+ shouldBeTrue('mediaElements[1] instanceof HTMLVideoElement');
+ shouldBeTrue('mediaElements[1].controls');
+ shouldBeTrue('!!internals.shadowRoot(mediaElements[1]).activeElement /* play button */');
+ shouldBe('eventSender.keyDown("\\t"); document.activeElement', 'mediaElements[1]');
+ shouldBeTrue('!!internals.shadowRoot(mediaElements[1]).activeElement /* rewind button */');
+ shouldBe('eventSender.keyDown("\\t"); document.activeElement', 'mediaElements[1]');
+ shouldBeTrue('!!internals.shadowRoot(mediaElements[1]).activeElement /* volume slider */');
+ shouldBe('eventSender.keyDown("\\t"); document.activeElement', 'mediaElements[1]');
+ shouldBeTrue('!!internals.shadowRoot(mediaElements[1]).activeElement /* mute button */');
+
+ shouldBe('eventSender.keyDown("\\t"); document.activeElement', 'mediaElements[2]');
+ shouldBeTrue('mediaElements[2] instanceof HTMLAudioElement');
+ shouldBeFalse('mediaElements[2].controls');
+
+ shouldBe('eventSender.keyDown("\\t"); document.activeElement', 'mediaElements[3]');
+ shouldBeTrue('mediaElements[3] instanceof HTMLVideoElement');
+ shouldBeFalse('mediaElements[3].controls');
+
+ shouldBe('eventSender.keyDown("\\t"); document.activeElement', 'document.querySelector("div")');
+}
+
+</script>
+<script src=""
+</body>
+</html>
Modified: trunk/Source/WebCore/ChangeLog (200519 => 200520)
--- trunk/Source/WebCore/ChangeLog 2016-05-06 20:38:55 UTC (rev 200519)
+++ trunk/Source/WebCore/ChangeLog 2016-05-06 21:01:32 UTC (rev 200520)
@@ -1,3 +1,23 @@
+2016-05-06 Ryosuke Niwa <[email protected]>
+
+ FKA: No way to get focus from DOM to shadow DOM components (Was: HTML5 media controls not keyboard accessible)
+ https://bugs.webkit.org/show_bug.cgi?id=117857
+
+ Reviewed by Jer Noble.
+
+ The bug was caused by hasCustomFocusLogic returning true on media elements.
+
+ Fix the bug by removing this function so that FocusController will walk into the shadow tree of media elements
+ to look for focusable elements. This will allow AT such as Voice Over to iterate through controls.
+
+ We don't seem to draw focus rings inside the media elements but that could be tweaked in a separate patch.
+
+ Test: media/tab-focus-inside-media-elements.html
+
+ * html/HTMLMediaElement.cpp:
+ (WebCore::HTMLMediaElement::hasCustomFocusLogic): Deleted.
+ * html/HTMLMediaElement.h:
+
2016-05-06 Anders Carlsson <[email protected]>
Tidy up the LinkRelAttribute code
Modified: trunk/Source/WebCore/html/HTMLMediaElement.cpp (200519 => 200520)
--- trunk/Source/WebCore/html/HTMLMediaElement.cpp 2016-05-06 20:38:55 UTC (rev 200519)
+++ trunk/Source/WebCore/html/HTMLMediaElement.cpp 2016-05-06 21:01:32 UTC (rev 200520)
@@ -659,11 +659,6 @@
}
#endif
-bool HTMLMediaElement::hasCustomFocusLogic() const
-{
- return true;
-}
-
bool HTMLMediaElement::supportsFocus() const
{
if (document().isMediaDocument())
Modified: trunk/Source/WebCore/html/HTMLMediaElement.h (200519 => 200520)
--- trunk/Source/WebCore/html/HTMLMediaElement.h 2016-05-06 20:38:55 UTC (rev 200519)
+++ trunk/Source/WebCore/html/HTMLMediaElement.h 2016-05-06 21:01:32 UTC (rev 200520)
@@ -496,7 +496,6 @@
// FIXME: Shadow DOM spec says we should be able to create shadow root on audio and video elements
bool canHaveUserAgentShadowRoot() const final { return true; }
- bool hasCustomFocusLogic() const override;
bool supportsFocus() const override;
bool isMouseFocusable() const override;
bool rendererIsNeeded(const RenderStyle&) override;
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes