]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Bug 1280395 - [a11y] Make the Add Comment and Preview tabs real accessible tabs
authorKohei Yoshino <kohei.yoshino@gmail.com>
Wed, 11 Jan 2017 04:45:58 +0000 (04:45 +0000)
committerDavid Lawrence <dkl@mozilla.com>
Wed, 11 Jan 2017 04:45:58 +0000 (04:45 +0000)
extensions/BugModal/template/en/default/bug_modal/new_comment.html.tmpl
extensions/BugModal/web/bug_modal.css
extensions/BugModal/web/bug_modal.js

index e76e422bceb63b54415dd883c74884e5ec53ec0a..60bf2b29afe96c578b5e5388c2f63ce992e33bbe 100644 (file)
     </div>
   [% END %]
 
-  <ul id="comment-tabs">
-    <li id="comment-edit-tab" data-tab="comment-tab-add" data-focus="comment" class="current">
+  <ul id="comment-tabs" role="tablist">
+    <li id="comment-edit-tab" data-focus="comment" role="tab" tabindex="0" aria-controls="comment-edit-tabpanel" aria-selected="true">
       Add Comment
     </li>
     [%~ ~%]
-    <li id="comment-preview-tab" data-tab="comment-tab-preview" data-focus="">
+    <li id="comment-preview-tab" role="tab" tabindex="-1" aria-controls="comment-preview-tabpanel" aria-selected="false">
       Preview
       <img id="preview-throbber" src="extensions/BugModal/web/throbber.gif" width="16" height="11" style="display:none">
     </li>
   </ul>
 
-  <div id="comment-tab-add" class="comment-tab">
+  <div id="comment-edit-tabpanel" class="comment-tabpanel" role="tabpanel" aria-labelledby="comment-edit-tab">
     <textarea rows="5" cols="80" name="comment" id="comment"></textarea>
   </div>
-  <div id="comment-tab-preview" class="comment-tab" style="display:none">
+  <div id="comment-preview-tabpanel" class="comment-tabpanel" role="tabpanel" aria-labelledby="comment-preview-tab" style="display:none">
     <pre id="comment-preview" class="comment-text"></pre>
   </div>
 
index e6b31992c36bc0898b7a50b8d33275393796a09d..b3b99180792af11af0ca4613c5f592990fbb640c 100644 (file)
@@ -725,7 +725,7 @@ h3.change-name {
     border-top-right-radius: 2px;
 }
 
-#comment-tabs li.current {
+#comment-tabs li[aria-selected="true"] {
     background: #fff;
     border-bottom: 1px solid #fff;
 }
index 1406256312331ddeb19b0abe11efd5bcbd34a1f5..d7782192998c535238394452e83def75a853c1cc 100644 (file)
@@ -1276,7 +1276,7 @@ $(function() {
     var last_comment_text = '';
     $('#comment-tabs li').click(function() {
         var that = $(this);
-        if (that.hasClass('current'))
+        if (that.attr('aria-selected') === 'true')
             return;
 
         // ensure preview's height matches the comment
@@ -1285,22 +1285,18 @@ $(function() {
         var comment_height = comment[0].offsetHeight;
 
         // change tabs
-        $('#comment-tabs li').removeClass('current').attr('aria-selected', false);
-        $('.comment-tab').hide();
-        that.addClass('current').attr('aria-selected', true);
-        var tab = that.attr('data-tab');
-        $('#' + tab).show();
+        $('#comment-tabs li').attr({ tabindex: -1, 'aria-selected': false });
+        $('.comment-tabpanel').hide();
+        that.attr({ tabindex: 0, 'aria-selected': true });
+        var tabpanel = $('#' + that.attr('aria-controls')).show();
         var focus = that.data('focus');
-        if (focus === '') {
-            document.activeElement.blur();
-        }
-        else {
+        if (focus !== '') {
             $('#' + focus).focus();
         }
 
         // update preview
         preview.css('height', comment_height + 'px');
-        if (tab != 'comment-tab-preview' || last_comment_text == comment.val())
+        if (tabpanel.attr('id') != 'comment-preview-tabpanel' || last_comment_text == comment.val())
             return;
         $('#preview-throbber').show();
         preview.html('');
@@ -1324,6 +1320,31 @@ $(function() {
             }
         );
         last_comment_text = comment.val();
+    }).keydown(function(event) {
+        var that = $(this);
+        var tabs = $('#comment-tabs li');
+        var target;
+
+        // enable keyboard navigation on tabs
+        switch (event.keyCode) {
+            case 35: // End
+                target = tabs.last();
+                break;
+            case 36: // Home
+                target = tabs.first();
+                break;
+            case 37: // Left arrow
+                target = that.prev('[role="tab"]');
+                break;
+            case 39: // Right arrow
+                target = that.next('[role="tab"]');
+                break;
+        }
+
+        if (target && target.length) {
+            event.preventDefault();
+            target.click().focus();
+        }
     });
 
     // dirty field tracking