Changeset 158713 in webkit


Ignore:
Timestamp:
Nov 5, 2013 7:50:51 PM (10 years ago)
Author:
commit-queue@webkit.org
Message:

AX: media controls accessibility needs more work
https://bugs.webkit.org/show_bug.cgi?id=123749

Patch by James Craig <jcraig@apple.com> on 2013-11-05
Reviewed by Jer Noble.

Updated some of the control labels/roles to improve accessibility.

  • Volume slider is now keyboard/screenreader accessible.
  • muteButton was a checkbox toggling checked state, now a button that toggles label "mute/unmute"
  • fullscreenButton was a checkbox toggling checked state, now a button that toggles label "display/exit full screen"
  • captionButton was a checkbox, now a popup button that launches the newly accessible menu.

Subtitles menu is now keyboard/screenreader accessible (uses roaming tabindex).
Render dump expectations changed because volume slider is now hidden via...
...opacity/size (to make accessible without hover) instead of display:none.

Updated existing test coverage.

Source/WebCore:

  • Modules/mediacontrols/mediaControlsApple.css:

(audio::-webkit-media-controls-panel .volume-box):
(audio::-webkit-media-controls-panel .volume-box:active):
(audio::-webkit-media-controls-toggle-closed-captions-button):
(audio::-webkit-media-controls-closed-captions-container .list):
(audio::-webkit-media-controls-closed-captions-container li:focus):

  • Modules/mediacontrols/mediaControlsApple.js:

(Controller.prototype.createControls):
(Controller.prototype.handleFullscreenChange):
(Controller.prototype.handleMuteButtonClicked):
(Controller.prototype.handleMinButtonClicked):
(Controller.prototype.handleMaxButtonClicked):
(Controller.prototype.handleVolumeSliderChange):
(Controller.prototype.buildCaptionMenu):
(Controller.prototype.focusSiblingCaptionItem):
(Controller.prototype.handleCaptionItemKeyUp):

LayoutTests:

  • platform/mac/accessibility/media-element-expected.txt:
  • platform/mac/media/audio-controls-rendering-expected.txt:
  • platform/mac/media/controls-after-reload-expected.txt:
  • platform/mac/media/controls-strict-expected.txt:
  • platform/mac/media/controls-styling-strict-expected.txt:
  • platform/mac/media/controls-without-preload-expected.txt:
Location:
trunk
Files:
10 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r158711 r158713  
     12013-11-05  James Craig  <jcraig@apple.com>
     2
     3        AX: media controls accessibility needs more work
     4        https://bugs.webkit.org/show_bug.cgi?id=123749
     5
     6        Reviewed by Jer Noble.
     7
     8        Updated some of the control labels/roles to improve accessibility.
     9          - Volume slider is now keyboard/screenreader accessible.
     10          - muteButton was a checkbox toggling checked state, now a button that toggles label "mute/unmute"
     11          - fullscreenButton was a checkbox toggling checked state, now a button that toggles label "display/exit full screen"
     12          - captionButton was a checkbox, now a popup button that launches the newly accessible menu.
     13        Subtitles menu is now keyboard/screenreader accessible (uses roaming tabindex).
     14        Render dump expectations changed because volume slider is now hidden via...
     15        ...opacity/size (to make accessible without hover) instead of display:none.
     16
     17        Updated existing test coverage.
     18
     19        * platform/mac/accessibility/media-element-expected.txt:
     20        * platform/mac/media/audio-controls-rendering-expected.txt:
     21        * platform/mac/media/controls-after-reload-expected.txt:
     22        * platform/mac/media/controls-strict-expected.txt:
     23        * platform/mac/media/controls-styling-strict-expected.txt:
     24        * platform/mac/media/controls-without-preload-expected.txt:
     25
    1262013-11-05  Ryosuke Niwa  <rniwa@webkit.org>
    227
  • trunk/LayoutTests/platform/mac/accessibility/media-element-expected.txt

    r158455 r158713  
    5555
    5656
     57            description: AXDescription: Volume
     58            role: AXRole: AXSlider
     59
     60
     61                description: AXDescription:
     62                role: AXRole: AXValueIndicator
     63
     64
    5765            description: AXDescription: Mute
    58             role: AXRole: AXCheckBox
     66            role: AXRole: AXButton
    5967
    6068
    6169            description: AXDescription: Display Full Screen
    62             role: AXRole: AXCheckBox
     70            role: AXRole: AXButton
    6371
    6472
  • trunk/LayoutTests/platform/mac/media/audio-controls-rendering-expected.txt

    r156546 r158713  
    4444layer at (184,44) size 22x22
    4545  RenderFlexibleBox {DIV} at (176,2) size 22x22
     46layer at (184,44) size 2x22
     47  RenderFlexibleBox {DIV} at (0,0) size 2x22 [border: (1px solid #000000F3)]
     48    RenderSlider {INPUT} at (-7,6) size 2x10 [color=#909090] [border: (1px solid #000000DF)]
     49      RenderFlexibleBox {DIV} at (1,1) size 0x8
     50        RenderBlock {DIV} at (0,0) size 0x8
     51layer at (170,51) size 8x8
     52  RenderBlock {DIV} at (-8,0) size 8x8
    4653layer at (187,47) size 16x16
    4754  RenderButton {BUTTON} at (3,3) size 16x16 [color=#FFFFFF]
     
    7582layer at (304,87) size 22x22
    7683  RenderFlexibleBox {DIV} at (296,2) size 22x22
     84layer at (304,87) size 2x22
     85  RenderFlexibleBox {DIV} at (0,0) size 2x22 [border: (1px solid #000000F3)]
     86    RenderSlider {INPUT} at (-7,6) size 2x10 [color=#909090] [border: (1px solid #000000DF)]
     87      RenderFlexibleBox {DIV} at (1,1) size 0x8
     88        RenderBlock {DIV} at (0,0) size 0x8
     89layer at (290,94) size 8x8
     90  RenderBlock {DIV} at (-8,0) size 8x8
    7791layer at (307,90) size 16x16
    7892  RenderButton {BUTTON} at (3,3) size 16x16 [color=#FFFFFF]
     
    108122layer at (304,205) size 22x22
    109123  RenderFlexibleBox {DIV} at (296,2) size 22x22
     124layer at (304,205) size 2x22
     125  RenderFlexibleBox {DIV} at (0,0) size 2x22 [border: (1px solid #000000F3)]
     126    RenderSlider {INPUT} at (-7,6) size 2x10 [color=#909090] [border: (1px solid #000000DF)]
     127      RenderFlexibleBox {DIV} at (1,1) size 0x8
     128        RenderBlock {DIV} at (0,0) size 0x8
     129layer at (290,212) size 8x8
     130  RenderBlock {DIV} at (-8,0) size 8x8
    110131layer at (307,208) size 16x16
    111132  RenderButton {BUTTON} at (3,3) size 16x16 [color=#FFFFFF]
  • trunk/LayoutTests/platform/mac/media/controls-after-reload-expected.txt

    r156546 r158713  
    4040layer at (274,259) size 22x22
    4141  RenderFlexibleBox {DIV} at (266,2) size 22x22
     42layer at (274,259) size 2x22
     43  RenderFlexibleBox {DIV} at (0,0) size 2x22 [border: (1px solid #000000F3)]
     44    RenderSlider {INPUT} at (-7,6) size 2x10 [color=#909090] [border: (1px solid #000000DF)]
     45      RenderFlexibleBox {DIV} at (1,1) size 0x8
     46        RenderBlock {DIV} at (0,0) size 0x8
     47layer at (260,266) size 8x8
     48  RenderBlock {DIV} at (-8,0) size 8x8
    4249layer at (277,262) size 16x16
    4350  RenderButton {BUTTON} at (3,3) size 16x16 [color=#FFFFFF]
  • trunk/LayoutTests/platform/mac/media/controls-strict-expected.txt

    r156546 r158713  
    4040layer at (274,267) size 22x22
    4141  RenderFlexibleBox {DIV} at (266,2) size 22x22
     42layer at (274,267) size 2x22
     43  RenderFlexibleBox {DIV} at (0,0) size 2x22 [border: (1px solid #000000F3)]
     44    RenderSlider {INPUT} at (-7,6) size 2x10 [color=#909090] [border: (1px solid #000000DF)]
     45      RenderFlexibleBox {DIV} at (1,1) size 0x8
     46        RenderBlock {DIV} at (0,0) size 0x8
     47layer at (260,274) size 8x8
     48  RenderBlock {DIV} at (-8,0) size 8x8
    4249layer at (277,270) size 16x16
    4350  RenderButton {BUTTON} at (3,3) size 16x16 [color=#FFFFFF]
  • trunk/LayoutTests/platform/mac/media/controls-styling-strict-expected.txt

    r156546 r158713  
    4444layer at (274,267) size 22x22
    4545  RenderFlexibleBox {DIV} at (266,2) size 22x22
     46layer at (274,267) size 2x22
     47  RenderFlexibleBox {DIV} at (0,0) size 2x22 [border: (1px solid #000000F3)]
     48    RenderSlider {INPUT} at (-7,6) size 2x10 [color=#909090] [border: (1px solid #000000DF)]
     49      RenderFlexibleBox {DIV} at (1,1) size 0x8
     50        RenderBlock {DIV} at (0,0) size 0x8
     51layer at (260,274) size 8x8
     52  RenderBlock {DIV} at (-8,0) size 8x8
    4653layer at (277,270) size 16x16
    4754  RenderButton {BUTTON} at (3,3) size 16x16 [color=#FFFFFF]
     
    7784layer at (598,267) size 22x22
    7885  RenderFlexibleBox {DIV} at (266,2) size 22x22
     86layer at (598,267) size 2x22
     87  RenderFlexibleBox {DIV} at (0,0) size 2x22 [border: (1px solid #000000F3)]
     88    RenderSlider {INPUT} at (-7,6) size 2x10 [color=#909090] [border: (1px solid #000000DF)]
     89      RenderFlexibleBox {DIV} at (1,1) size 0x8
     90        RenderBlock {DIV} at (0,0) size 0x8
     91layer at (584,274) size 8x8
     92  RenderBlock {DIV} at (-8,0) size 8x8
    7993layer at (601,270) size 16x16
    8094  RenderButton {BUTTON} at (3,3) size 16x16 [color=#FFFFFF]
  • trunk/LayoutTests/platform/mac/media/controls-without-preload-expected.txt

    r156546 r158713  
    4040layer at (274,259) size 22x22
    4141  RenderFlexibleBox {DIV} at (266,2) size 22x22
     42layer at (274,259) size 2x22
     43  RenderFlexibleBox {DIV} at (0,0) size 2x22 [border: (1px solid #000000F3)]
     44    RenderSlider {INPUT} at (-7,6) size 2x10 [color=#909090] [border: (1px solid #000000DF)]
     45      RenderFlexibleBox {DIV} at (1,1) size 0x8
     46        RenderBlock {DIV} at (0,0) size 0x8
     47layer at (260,266) size 8x8
     48  RenderBlock {DIV} at (-8,0) size 8x8
    4249layer at (277,262) size 16x16
    4350  RenderButton {BUTTON} at (3,3) size 16x16 [color=#FFFFFF]
  • trunk/Source/WebCore/ChangeLog

    r158712 r158713  
     12013-11-05  James Craig  <jcraig@apple.com>
     2
     3        AX: media controls accessibility needs more work
     4        https://bugs.webkit.org/show_bug.cgi?id=123749
     5
     6        Reviewed by Jer Noble.
     7
     8        Updated some of the control labels/roles to improve accessibility.
     9          - Volume slider is now keyboard/screenreader accessible.
     10          - muteButton was a checkbox toggling checked state, now a button that toggles label "mute/unmute"
     11          - fullscreenButton was a checkbox toggling checked state, now a button that toggles label "display/exit full screen"
     12          - captionButton was a checkbox, now a popup button that launches the newly accessible menu.
     13        Subtitles menu is now keyboard/screenreader accessible (uses roaming tabindex).
     14        Render dump expectations changed because volume slider is now hidden via...
     15        ...opacity/size (to make accessible without hover) instead of display:none.
     16
     17        Updated existing test coverage.
     18
     19        * Modules/mediacontrols/mediaControlsApple.css:
     20        (audio::-webkit-media-controls-panel .volume-box):
     21        (audio::-webkit-media-controls-panel .volume-box:active):
     22        (audio::-webkit-media-controls-toggle-closed-captions-button):
     23        (audio::-webkit-media-controls-closed-captions-container .list):
     24        (audio::-webkit-media-controls-closed-captions-container li:focus):
     25        * Modules/mediacontrols/mediaControlsApple.js:
     26        (Controller.prototype.createControls):
     27        (Controller.prototype.handleFullscreenChange):
     28        (Controller.prototype.handleMuteButtonClicked):
     29        (Controller.prototype.handleMinButtonClicked):
     30        (Controller.prototype.handleMaxButtonClicked):
     31        (Controller.prototype.handleVolumeSliderChange):
     32        (Controller.prototype.buildCaptionMenu):
     33        (Controller.prototype.focusSiblingCaptionItem):
     34        (Controller.prototype.handleCaptionItemKeyUp):
     35
    1362013-11-05  Andreas Kling  <akling@apple.com>
    237
  • trunk/Source/WebCore/Modules/mediacontrols/mediaControlsApple.css

    r156546 r158713  
    173173    box-sizing: border-box;
    174174    height: 22px;
    175     width: 114px;
    176175    bottom: 0;
    177176    left: 0;
     
    195194
    196195    opacity: 0;
    197     display: none;
    198 }
    199 
     196    /* make zero width (rather than display:none) for AX and FKA */
     197    width: 0; /* will become 114px when shown */
     198
     199}
     200
     201/* FIXME: needs CSS4 !subject selector to show when slider inside .volume-box is focused */
    200202video::-webkit-media-controls-panel .mute-box:hover .volume-box,
    201203video::-webkit-media-controls-panel .volume-box:hover,
     
    205207audio::-webkit-media-controls-panel .volume-box:active {
    206208    opacity: 1;
    207     display: inherit;
     209    /* resize to usable amount (rather than display:none) for AX and FKA */
     210    width: 114px;
    208211}
    209212
     
    269272    height: 16px;
    270273    margin: 0 7px;
    271 
    272274    background-image: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 102 105"><linearGradient id="gradient" x2="0" y2="100%" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="rgb(216, 216, 216)"/><stop offset="0.46875" stop-color="rgb(216, 216, 216)"/><stop offset="0.46875" stop-color="rgb(208, 208, 208)"/><stop offset="0.53125" stop-color="rgb(208, 208, 208)"/><stop offset="0.53125" stop-color="rgb(200, 200, 200)"/><stop offset="1" stop-color="rgb(208, 208, 208)"/></linearGradient><path d="M98.766,43.224c0-23.163-21.775-41.94-48.637-41.94c-26.859,0-48.635,18.777-48.635,41.94c0,18.266,13.546,33.796,32.444,39.549c1.131,8.356,26.037,24.255,22.864,19.921c-4.462-6.096-5.159-13.183-5.07-17.566C77.85,84.397,98.766,65.923,98.766,43.224z" fill="url(#gradient)"/></svg>');
     275    outline: 0;
    273276}
    274277
     
    295298audio::-webkit-media-controls-closed-captions-container .list {
    296299    display: block;
    297     font-family: "Helvetica Bold", Helvetica;
     300    font-family: "Helvetica Bold", Helvetica, sans-serif;
    298301    font-size: 10pt;
    299302    -webkit-user-select: none;
     
    338341}
    339342
     343video::-webkit-media-controls-closed-captions-container li:focus,
     344audio::-webkit-media-controls-closed-captions-container li:focus {
     345    outline: 0;
     346    background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, rgba(255, 255, 255, 0.3)), color-stop(1, rgba(255, 255, 255, 0.2)));
     347}
     348
    340349video::-webkit-media-controls-closed-captions-container li:hover,
    341350audio::-webkit-media-controls-closed-captions-container li:hover {
  • trunk/Source/WebCore/Modules/mediacontrols/mediaControlsApple.js

    r158455 r158713  
    7777        volumeBox: 'volume-box',
    7878    },
     79    KeyCodes: {
     80        enter: 13,
     81        escape: 27,
     82        space: 32,
     83        pageUp: 33,
     84        pageDown: 34,
     85        end: 35,
     86        home: 36,
     87        left: 37,
     88        up: 38,
     89        right: 39,
     90        down: 40
     91    },
    7992
    8093    // Localized string accessor
     
    89102        'Aborted': 'Aborted',
    90103        'Audio Playback': 'Audio Playback',
     104        'Captions': 'Captions',
    91105        'Display Full Screen': 'Display Full Screen',
    92106        'Duration': 'Duration',
     107        'Elapsed': 'Elapsed',
    93108        'Error': 'Error',
     109        'Exit Full Screen': 'Exit Full Screen',
    94110        'Fast Forward': 'Fast Forward',
    95111        'Loading': 'Loading',
     
    97113        'Minimum Volume': 'Minimum Volume',
    98114        'Mute': 'Mute',
     115        'Pause': 'Pause',
    99116        'Play': 'Play',
    100         'Pause': 'Pause',
     117        'Remaining': 'Remaining',
    101118        'Rewind': 'Rewind',
    102119        'Rewind %%sec%% Seconds': 'Rewind %%sec%% Seconds',
    103         'Show Captions': 'Show Captions',
    104120        'Stalled': 'Stalled',
     121        'Subtitles': 'Subtitles',
    105122        'Suspended': 'Suspended',
    106         'Elapsed': 'Elapsed',
    107         'Remaining': 'Remaining',
     123        'Unmute': 'Unmute',
    108124        'Video Playback': 'Video Playback',
    109125        'Volume': 'Volume',
     
    302318        muteButton.setAttribute('pseudo', '-webkit-media-controls-mute-button');
    303319        muteButton.setAttribute('aria-label', this.UIString('Mute'));
    304         muteButton.setAttribute('role', 'checkbox');
    305         muteButton.setAttribute('aria-checked', 'false');
    306320        this.listenFor(muteButton, 'click', this.handleMuteButtonClicked);
    307321
     
    330344        var captionButton = this.controls.captionButton = document.createElement('button');
    331345        captionButton.setAttribute('pseudo', '-webkit-media-controls-toggle-closed-captions-button');
    332         captionButton.setAttribute('aria-label', this.UIString('Show Captions'));
    333         captionButton.setAttribute('role', 'checkbox');
    334         captionButton.setAttribute('aria-checked', 'false');
     346        captionButton.setAttribute('aria-label', this.UIString('Captions'));
     347        captionButton.setAttribute('aria-haspopup', 'true');
    335348        this.listenFor(captionButton, 'click', this.handleCaptionButtonClicked);
    336349
     
    338351        fullscreenButton.setAttribute('pseudo', '-webkit-media-controls-fullscreen-button');
    339352        fullscreenButton.setAttribute('aria-label', this.UIString('Display Full Screen'));
    340         fullscreenButton.setAttribute('role', 'checkbox');
    341         fullscreenButton.setAttribute('aria-checked', 'false');
    342353        this.listenFor(fullscreenButton, 'click', this.handleFullscreenButtonClicked);
    343354    },
     
    520531        if (this.isFullScreen()) {
    521532            this.controls.fullscreenButton.classList.add(this.ClassNames.exit);
    522             this.controls.fullscreenButton.setAttribute('aria-checked', 'true');
     533            this.controls.fullscreenButton.setAttribute('aria-label', this.UIString('Exit Full Screen'));
    523534            this.setControlsType(Controller.FullScreenControls);
    524535        } else {
    525536            this.controls.fullscreenButton.classList.remove(this.ClassNames.exit);
    526             this.controls.fullscreenButton.setAttribute('aria-checked', 'false');
     537            this.controls.fullscreenButton.setAttribute('aria-label', this.UIString('Display Full Screen'));
    527538            this.setControlsType(Controller.InlineControls);
    528539        }
     
    669680        this.video.muted = !this.video.muted;
    670681        if (this.video.muted)
    671             this.controls.muteButton.setAttribute('aria-checked', 'true');
     682            this.controls.muteButton.setAttribute('aria-label', this.UIString('Unmute'));
    672683    },
    673684
     
    676687        if (this.video.muted) {
    677688            this.video.muted = false;
    678             this.controls.muteButton.setAttribute('aria-checked', 'false');
     689            this.controls.muteButton.setAttribute('aria-label', this.UIString('Mute'));
    679690        }
    680691        this.video.volume = 0;
     
    685696        if (this.video.muted) {
    686697            this.video.muted = false;
    687             this.controls.muteButton.setAttribute('aria-checked', 'false');
     698            this.controls.muteButton.setAttribute('aria-label', this.UIString('Mute'));
    688699        }
    689700        this.video.volume = 1;
     
    694705        if (this.video.muted) {
    695706            this.video.muted = false;
    696             this.controls.muteButton.setAttribute('aria-checked', 'false');
     707            this.controls.muteButton.setAttribute('aria-label', this.UIString('Mute'));
    697708        }
    698709        this.video.volume = this.controls.volume.value;
     
    929940
    930941        var heading = document.createElement('h3');
     942        heading.id = 'webkitMediaControlsClosedCaptionsHeading'; // for AX menu label
    931943        list.appendChild(heading);
    932         heading.innerText = 'Subtitles';
     944        heading.innerText = this.UIString('Subtitles');
    933945
    934946        var ul = document.createElement('ul');
     947        ul.setAttribute('role', 'menu');
     948        ul.setAttribute('aria-labelledby', 'webkitMediaControlsClosedCaptionsHeading');
    935949        list.appendChild(ul);
    936950
    937951        for (var i = 0; i < tracks.length; ++i) {
    938952            var menuItem = document.createElement('li');
     953            menuItem.setAttribute('role', 'menuitemradio');
     954            menuItem.setAttribute('tabindex', '-1');
    939955            this.captionMenuItems.push(menuItem);
    940956            this.listenFor(menuItem, 'click', this.captionItemSelected);
     957            this.listenFor(menuItem, 'keyup', this.handleCaptionItemKeyUp);
    941958            ul.appendChild(menuItem);
    942959
     
    951968
    952969            if (track === automaticItem) {
    953                 if (displayMode === 'automatic')
     970                if (displayMode === 'automatic') {
    954971                    menuItem.classList.add(this.ClassNames.selected);
     972                    menuItem.setAttribute('tabindex', '0');
     973                    menuItem.setAttribute('aria-checked', 'true');
     974                }
    955975                continue;
    956976            }
     
    959979                var trackMenuItemSelected = true;
    960980                menuItem.classList.add(this.ClassNames.selected);
     981                menuItem.setAttribute('tabindex', '0');
     982                menuItem.setAttribute('aria-checked', 'true');
    961983            }
    962         }
    963 
    964         if (offMenu && displayMode === 'forced-only' && !trackMenuItemSelected)
     984
     985        }
     986
     987        if (offMenu && displayMode === 'forced-only' && !trackMenuItemSelected) {
    965988            offMenu.classList.add(this.ClassNames.selected);
     989            menuItem.setAttribute('tabindex', '0');
     990            menuItem.setAttribute('aria-checked', 'true');
     991        }
     992       
     993        // focus first selected menuitem
     994        for (var i = 0, c = this.captionMenuItems.length; i < c; i++) {
     995            var item = this.captionMenuItems[i];
     996            if (item.classList.contains(this.ClassNames.selected)) {
     997                item.focus();
     998                break;
     999            }
     1000        }
     1001       
    9661002    },
    9671003
     
    9721008    },
    9731009
     1010    focusSiblingCaptionItem: function(event)
     1011    {
     1012        var currentItem = event.target;
     1013        var pendingItem = false;
     1014        switch(event.keyCode) {
     1015        case this.KeyCodes.left:
     1016        case this.KeyCodes.up:
     1017            pendingItem = currentItem.previousSibling;
     1018            break;
     1019        case this.KeyCodes.right:
     1020        case this.KeyCodes.down:
     1021            pendingItem = currentItem.nextSibling;
     1022            break;
     1023        }
     1024        if (pendingItem) {
     1025            currentItem.setAttribute('tabindex', '-1');
     1026            pendingItem.setAttribute('tabindex', '0');
     1027            pendingItem.focus();
     1028        }
     1029    },
     1030
     1031    handleCaptionItemKeyUp: function(event)
     1032    {
     1033        switch (event.keyCode) {
     1034        case this.KeyCodes.enter:
     1035        case this.KeyCodes.space:
     1036            this.captionItemSelected(event);
     1037            break;
     1038        case this.KeyCodes.escape:
     1039            this.destroyCaptionMenu();
     1040            break;
     1041        case this.KeyCodes.left:
     1042        case this.KeyCodes.up:
     1043        case this.KeyCodes.right:
     1044        case this.KeyCodes.down:
     1045            this.focusSiblingCaptionItem(event);
     1046            break;
     1047        default:
     1048            return;
     1049        }
     1050        // handled
     1051        event.stopPropagation();
     1052        event.preventDefault();
     1053    },
     1054
    9741055    destroyCaptionMenu: function()
    9751056    {
     
    9791060        this.captionMenuItems.forEach(function(item){
    9801061            this.stopListeningFor(item, 'click', this.captionItemSelected);
     1062            this.stopListeningFor(item, 'keyup', this.handleCaptionItemKeyUp);
    9811063        }, this);
     1064
     1065        // FKA and AX: focus the trigger before destroying the element with focus
     1066        if (this.controls.captionButton)
     1067            this.controls.captionButton.focus();
    9821068
    9831069        if (this.captionMenu.parentNode)
Note: See TracChangeset for help on using the changeset viewer.