From 2a4e141e0e6552cfb20fb50bc9d545395871e5ce Mon Sep 17 00:00:00 2001
From: Chris Rodriguez <github@chrisrodriguez.me>
Date: Thu, 24 Sep 2015 12:55:32 -0400
Subject: [PATCH] LMS: fixing skip links and adding a11y tests

---
 cms/static/sass/_base.scss                           | 12 ++++++------
 cms/static/sass/elements/_navigation.scss            | 11 ++++++-----
 cms/templates/base.html                              |  2 +-
 cms/templates/course-create-rerun.html               |  2 +-
 .../acceptance/tests/lms/test_account_settings.py    |  1 -
 .../acceptance/tests/lms/test_learner_profile.py     |  1 -
 .../test/acceptance/tests/lms/test_lms_dashboard.py  |  3 +--
 .../acceptance/tests/studio/test_studio_library.py   |  1 -
 lms/static/js/spec/search/search_spec.js             |  6 +++---
 lms/static/sass/base/_base.scss                      | 11 ++++++-----
 lms/static/sass/course/instructor/_instructor_2.scss |  2 +-
 lms/static/sass/multicourse/_dashboard.scss          |  4 ++++
 lms/templates/courseware/courseware-chromeless.html  |  2 +-
 lms/templates/courseware/courseware.html             |  2 +-
 lms/templates/courseware/progress.html               |  2 +-
 lms/templates/dashboard.html                         |  2 +-
 lms/templates/discussion/index.html                  |  3 ++-
 .../instructor_dashboard_2.html                      |  2 +-
 lms/templates/main.html                              |  2 +-
 lms/templates/main_django.html                       |  2 +-
 lms/templates/ux/reference/teams-base.html           |  2 +-
 lms/templates/ux/reference/teams-create.html         |  2 +-
 lms/templates/wiki/article.html                      |  2 +-
 themes/edx.org/lms/templates/dashboard.html          |  2 +-
 24 files changed, 42 insertions(+), 39 deletions(-)

diff --git a/cms/static/sass/_base.scss b/cms/static/sass/_base.scss
index 0bfc824143d..69f190b121b 100644
--- a/cms/static/sass/_base.scss
+++ b/cms/static/sass/_base.scss
@@ -648,21 +648,22 @@ hr.divider {
 // ui - skipnav
 .nav-skip {
   @extend %t-action3;
-  display: block;
+  display: inline-block;
   position: absolute;
   left: 0px;
   top: -($baseline*30);
-  width: 1px;
-  height: 1px;
   overflow: hidden;
   background: $white;
   border-bottom: 1px solid $gray-l4;
   padding: ($baseline*0.75) ($baseline/2);
 
-  &:focus, &:active {
-    position: static;
+  &:focus,
+  &:active {
+    position: relative;
+    top: auto;
     width: auto;
     height: auto;
+    margin: 0;
   }
 }
 
@@ -725,4 +726,3 @@ hr.divider {
     color: $gray-l1;
   }
 }
-
diff --git a/cms/static/sass/elements/_navigation.scss b/cms/static/sass/elements/_navigation.scss
index 2f4694b33fc..1e7e5f42da2 100644
--- a/cms/static/sass/elements/_navigation.scss
+++ b/cms/static/sass/elements/_navigation.scss
@@ -25,21 +25,22 @@ nav {
 // skip navigation
 .nav-skip {
   @include font-size(13);
-  display: block;
+  display: inline-block;
   position: absolute;
   left: 0px;
   top: -($baseline*30);
-  width: 1px;
-  height: 1px;
   overflow: hidden;
   background: $white;
   border-bottom: 1px solid $gray-l4;
   padding: ($baseline*0.75) ($baseline/2);
 
-  &:focus, &:active {
-    position: static;
+  &:focus,
+  &:active {
+    position: relative;
+    top: auto;
     width: auto;
     height: auto;
+    margin: 0;
   }
 }
 
diff --git a/cms/templates/base.html b/cms/templates/base.html
index 51db3f154cf..56107e157f5 100644
--- a/cms/templates/base.html
+++ b/cms/templates/base.html
@@ -62,7 +62,7 @@ from openedx.core.djangolib.js_utils import (
       <%block name="page_alert"></%block>
       </div>
 
-      <div id="content">
+      <div id="content" tabindex="-1">
       <%block name="content"></%block>
       </div>
 
diff --git a/cms/templates/course-create-rerun.html b/cms/templates/course-create-rerun.html
index 8f2a4d8b9fb..27e2cf2339e 100644
--- a/cms/templates/course-create-rerun.html
+++ b/cms/templates/course-create-rerun.html
@@ -21,7 +21,7 @@ from django.template.defaultfilters import escapejs
 </%block>
 
 <%block name="content">
-<div id="content">
+<div id="content" tabindex="-1">
   <div class="wrapper-mast wrapper">
     <header class="mast mast-wizard has-actions">
       <h1 class="page-header">
diff --git a/common/test/acceptance/tests/lms/test_account_settings.py b/common/test/acceptance/tests/lms/test_account_settings.py
index 353b8023b62..f6f935d301e 100644
--- a/common/test/acceptance/tests/lms/test_account_settings.py
+++ b/common/test/acceptance/tests/lms/test_account_settings.py
@@ -462,7 +462,6 @@ class AccountSettingsA11yTest(AccountSettingsTestMixin, WebAppTest):
         self.account_settings_page.a11y_audit.config.set_rules({
             'ignore': [
                 'link-href',  # TODO: AC-233, AC-238
-                'skip-link',  # TODO: AC-179
             ],
         })
         self.account_settings_page.a11y_audit.check_for_accessibility_errors()
diff --git a/common/test/acceptance/tests/lms/test_learner_profile.py b/common/test/acceptance/tests/lms/test_learner_profile.py
index 03f4f8c4ec4..01d0159c998 100644
--- a/common/test/acceptance/tests/lms/test_learner_profile.py
+++ b/common/test/acceptance/tests/lms/test_learner_profile.py
@@ -795,7 +795,6 @@ class LearnerProfileA11yTest(LearnerProfileTestMixin, WebAppTest):
 
         profile_page.a11y_audit.config.set_rules({
             "ignore": [
-                'skip-link',  # TODO: AC-179
                 'link-href',  # TODO: AC-231
             ],
         })
diff --git a/common/test/acceptance/tests/lms/test_lms_dashboard.py b/common/test/acceptance/tests/lms/test_lms_dashboard.py
index 4b319e4b8f0..ab81dfd3f29 100644
--- a/common/test/acceptance/tests/lms/test_lms_dashboard.py
+++ b/common/test/acceptance/tests/lms/test_lms_dashboard.py
@@ -235,8 +235,7 @@ class LmsDashboardA11yTest(BaseLmsDashboardTest):
 
         self.dashboard_page.a11y_audit.config.set_rules({
             "ignore": [
-                'skip-link',  # TODO: AC-179
-                'link-href',  # TODO: AC-238, AC-179
+                'link-href',  # TODO: AC-238
             ],
         })
 
diff --git a/common/test/acceptance/tests/studio/test_studio_library.py b/common/test/acceptance/tests/studio/test_studio_library.py
index 1eefd30573a..8fc50262b24 100644
--- a/common/test/acceptance/tests/studio/test_studio_library.py
+++ b/common/test/acceptance/tests/studio/test_studio_library.py
@@ -659,7 +659,6 @@ class StudioLibraryA11yTest(StudioLibraryTest):
                 'color-contrast',  # TODO: AC-225
                 'link-href',  # TODO: AC-226
                 'nav-aria-label',  # TODO: AC-227
-                'skip-link',  # TODO: AC-228
                 'icon-aria-hidden',  # TODO: AC-229
             ],
         })
diff --git a/lms/static/js/spec/search/search_spec.js b/lms/static/js/spec/search/search_spec.js
index 6edf915b46d..dce93d0ea3e 100644
--- a/lms/static/js/spec/search/search_spec.js
+++ b/lms/static/js/spec/search/search_spec.js
@@ -490,7 +490,7 @@ define([
                     '<div class="courseware-results"></div>' +
                     '<section id="course-content"></section>' +
                     '<section id="dashboard-search-results"></section>' +
-                    '<section id="my-courses"></section>'
+                    '<section id="my-courses" tabindex="-1"></section>'
                 );
 
                 TemplateHelpers.installTemplates([
@@ -705,7 +705,7 @@ define([
                     loadFixtures('js/fixtures/search/dashboard_search_form.html');
                     appendSetFixtures(
                         '<section id="dashboard-search-results"></section>' +
-                        '<section id="my-courses"></section>'
+                        '<section id="my-courses" tabindex="-1"></section>'
                     );
                     loadTemplates.call(this);
                     DashboardSearchFactory();
@@ -753,4 +753,4 @@ define([
         });
 
     });
-});
\ No newline at end of file
+});
diff --git a/lms/static/sass/base/_base.scss b/lms/static/sass/base/_base.scss
index e6d9665fe81..a67a8198d52 100644
--- a/lms/static/sass/base/_base.scss
+++ b/lms/static/sass/base/_base.scss
@@ -336,20 +336,21 @@ mark {
 .nav-skip {
   @extend %ui-print-excluded;
 
-  display: block;
+  display: inline-block;
   position: absolute;
   left: 0;
   top: -($baseline*30);
-  width: 1px;
-  height: 1px;
   overflow: hidden;
   background: $white;
   border-bottom: 1px solid $border-color-4;
   padding: ($baseline*0.75) ($baseline/2);
 
-  &:focus, &:active {
-    position: static;
+  &:focus,
+  &:active {
+    position: relative;
+    top: auto;
     width: auto;
     height: auto;
+    margin: 0;
   }
 }
diff --git a/lms/static/sass/course/instructor/_instructor_2.scss b/lms/static/sass/course/instructor/_instructor_2.scss
index f8c8dd5c099..a23634864ff 100644
--- a/lms/static/sass/course/instructor/_instructor_2.scss
+++ b/lms/static/sass/course/instructor/_instructor_2.scss
@@ -1712,7 +1712,7 @@ input[name="subject"] {
           height: 40px;
           border-radius: 3px;
         }
-    #coupon-content, #course-content, #registration-content, #regcode-content {
+    #coupon-content, #course-content, #content, #registration-content, #regcode-content {
       padding: $baseline;
       header {
         margin: 0;
diff --git a/lms/static/sass/multicourse/_dashboard.scss b/lms/static/sass/multicourse/_dashboard.scss
index a1eab8972b3..dc76ae64448 100644
--- a/lms/static/sass/multicourse/_dashboard.scss
+++ b/lms/static/sass/multicourse/_dashboard.scss
@@ -316,6 +316,10 @@
 // ====================
 .dashboard .my-courses {
 
+  &:focus {
+    outline: none;
+  }
+
   // UI: individual course item
   .course {
     @include box-sizing(box);
diff --git a/lms/templates/courseware/courseware-chromeless.html b/lms/templates/courseware/courseware-chromeless.html
index 745a87ecfab..aa6778c3285 100644
--- a/lms/templates/courseware/courseware-chromeless.html
+++ b/lms/templates/courseware/courseware-chromeless.html
@@ -37,7 +37,7 @@ ${static.get_page_title_breadcrumbs(course_name())}
 <%static:css group='style-student-notes'/>
 % endif
 
-<%block name="nav_skip">${"#seq_content" if section_title else "#course-content"}</%block>
+<%block name="nav_skip">${"#content" if section_title else "#content"}</%block>
 
 <%include file="../discussion/_js_head_dependencies.html" />
   ${fragment.head_html()}
diff --git a/lms/templates/courseware/courseware.html b/lms/templates/courseware/courseware.html
index a9df6c8c1aa..459361806a9 100644
--- a/lms/templates/courseware/courseware.html
+++ b/lms/templates/courseware/courseware.html
@@ -62,7 +62,7 @@ ${static.get_page_title_breadcrumbs(course_name())}
 <%static:css group='style-student-notes'/>
 % endif
 
-<%block name="nav_skip">${"#seq_content" if section_title else "#course-content"}</%block>
+<%block name="nav_skip">${"#content" if section_title else "#content"}</%block>
 
 <%include file="../discussion/_js_head_dependencies.html" />
   ${fragment.head_html()}
diff --git a/lms/templates/courseware/progress.html b/lms/templates/courseware/progress.html
index f68e93292fc..c520ea26424 100644
--- a/lms/templates/courseware/progress.html
+++ b/lms/templates/courseware/progress.html
@@ -18,7 +18,7 @@ from django.utils.http import urlquote_plus
 <%namespace name="progress_graph" file="/courseware/progress_graph.js"/>
 
 <%block name="pagetitle">${_("{course_number} Progress").format(course_number=course.display_number_with_default) | h}</%block>
-<%block name="nav_skip">#course-info-progress</%block>
+<%block name="nav_skip">#content</%block>
 
 <%block name="js_extra">
 <script type="text/javascript" src="${static.url('js/vendor/flot/jquery.flot.js') | h}"></script>
diff --git a/lms/templates/dashboard.html b/lms/templates/dashboard.html
index 337018224cc..54861f320e7 100644
--- a/lms/templates/dashboard.html
+++ b/lms/templates/dashboard.html
@@ -74,7 +74,7 @@ import json
 </div>
 
 <section class="container dashboard" id="dashboard-main">
-  <section class="my-courses" id="my-courses" role="main" aria-label="Content">
+  <section class="my-courses" id="my-courses" role="main" tabindex="-1">
     <header class="wrapper-header-courses">
       <h2 class="header-courses">${_("My Courses")}</h2>
     </header>
diff --git a/lms/templates/discussion/index.html b/lms/templates/discussion/index.html
index 465f34d2c9a..444e8aee1d5 100644
--- a/lms/templates/discussion/index.html
+++ b/lms/templates/discussion/index.html
@@ -39,7 +39,8 @@ from django.core.urlresolvers import reverse
          data-sort-preference="${sort_preference | h}"
          data-flag-moderator="${flag_moderator | h}"
          data-user-cohort-id="${user_cohort | h}"
-         data-course-settings="${course_settings | h}">
+         data-course-settings="${course_settings | h}"
+         tabindex="-1">
     <div class="discussion-body">
         <div class="forum-nav" role="complementary" aria-label="${_("Discussion thread list")}"></div>
         <div class="discussion-column" role="main" aria-label="Discussion" id="discussion-column">
diff --git a/lms/templates/instructor/instructor_dashboard_2/instructor_dashboard_2.html b/lms/templates/instructor/instructor_dashboard_2/instructor_dashboard_2.html
index 660ed2cd139..1e2a2480802 100644
--- a/lms/templates/instructor/instructor_dashboard_2/instructor_dashboard_2.html
+++ b/lms/templates/instructor/instructor_dashboard_2/instructor_dashboard_2.html
@@ -20,7 +20,7 @@ from django.core.urlresolvers import reverse
 ## 6. And tests go in lms/djangoapps/instructor/tests/
 
 <%block name="pagetitle">${_("Instructor Dashboard")}</%block>
-<%block name="nav_skip">#instructor-dashboard-content</%block>
+<%block name="nav_skip">#content</%block>
 
 <%block name="headextra">
   <%static:css group='style-course-vendor'/>
diff --git a/lms/templates/main.html b/lms/templates/main.html
index 3cc40e4e8cd..b45f36ee1eb 100644
--- a/lms/templates/main.html
+++ b/lms/templates/main.html
@@ -124,7 +124,7 @@ from branding import api as branding_api
         <%include file="${static.get_template_path('header.html')}" />
     % endif
 
-    <div class="content-wrapper" id="content">
+    <div role="main" class="content-wrapper" id="content" tabindex="-1">
       ${self.body()}
       <%block name="bodyextra"/>
     </div>
diff --git a/lms/templates/main_django.html b/lms/templates/main_django.html
index f8e4fc62ff9..89eb7f80c05 100644
--- a/lms/templates/main_django.html
+++ b/lms/templates/main_django.html
@@ -30,7 +30,7 @@
     {% with course=request.course %}
       {% include "header.html"|microsite_template_path %}
     {% endwith %}
-    <div class="content-wrapper" id="content">
+    <div role="main" class="content-wrapper" id="content" tabindex="-1">
       {% block body %}{% endblock %}
       {% block bodyextra %}{% endblock %}
     </div>
diff --git a/lms/templates/ux/reference/teams-base.html b/lms/templates/ux/reference/teams-base.html
index 295a78b984d..abe0e611f1d 100644
--- a/lms/templates/ux/reference/teams-base.html
+++ b/lms/templates/ux/reference/teams-base.html
@@ -95,7 +95,7 @@ Teams | Course name
 <%block name="headextra">
 <%static:css group='style-course-vendor'/>
 <%static:css group='style-course'/>
-<%block name="nav_skip">${"#seq_content" if section_title else "#course-content"}</%block>
+<%block name="nav_skip">${"#content" if section_title else "#content"}</%block>
 </%block>
 
 <%block name="js_extra">
diff --git a/lms/templates/ux/reference/teams-create.html b/lms/templates/ux/reference/teams-create.html
index c8cce4144e5..3b256ed4f7a 100644
--- a/lms/templates/ux/reference/teams-create.html
+++ b/lms/templates/ux/reference/teams-create.html
@@ -94,7 +94,7 @@ Create New Team | [Course name]
 <%block name="headextra">
 <%static:css group='style-course-vendor'/>
 <%static:css group='style-course'/>
-<%block name="nav_skip">${"#seq_content" if section_title else "#course-content"}</%block>
+<%block name="nav_skip">${"#content" if section_title else "#content"}</%block>
 </%block>
 
 <%block name="js_extra">
diff --git a/lms/templates/wiki/article.html b/lms/templates/wiki/article.html
index bb1e53b27e3..f06d93ea440 100644
--- a/lms/templates/wiki/article.html
+++ b/lms/templates/wiki/article.html
@@ -13,7 +13,7 @@
 
   <div class="article-wrapper">
 
-    <article class="main-article" id="main-article">
+    <article class="main-article" id="main-article" tabindex="-1">
         {% if selected_tab != "edit" %}
           <h1>{{ article.current_revision.title }}</h1>
 
diff --git a/themes/edx.org/lms/templates/dashboard.html b/themes/edx.org/lms/templates/dashboard.html
index c921e9c8946..410c08a35d4 100644
--- a/themes/edx.org/lms/templates/dashboard.html
+++ b/themes/edx.org/lms/templates/dashboard.html
@@ -75,7 +75,7 @@ import json
 </div>
 
 <section class="container dashboard" id="dashboard-main">
-  <section class="my-courses" id="my-courses" role="main" aria-label="Content">
+  <section class="my-courses" id="my-courses" role="main" aria-label="Content" tabindex="-1">
     <header class="wrapper-header-courses">
       <h2 class="header-courses">${_("My Courses")}</h2>
     </header>
-- 
GitLab