Categories
Accessibility Technology Uncategorized

Quirks in Web Standards, Browsers, and Screen Readers

This is my second session of the first day at the CSUN conference, and “takes a look at quirks and bugs in browsers and screen readers, what they mean for users, and how to avoid, fix, or work around them.”  (description is from the conference session guide).  As someone who is actively involved in building consistent web experiences (i.e. browser compatibility), I’m interested in how Ian does this when you add accessible technology into the mix.  Any misinterpretations of Ian’s presentation are entirely my own.  Any errata, please let me know!

Presenter:  Ian Pouncey, Accessibility Specialist, BBC (@IanPouncey)

 

RESOURCES

 

SLIDE ONE

Ian took some time to establish his credibility…

Used to work on the Yahoo! home page, and more recently has been a web developer at the BBC.  Been doing this for about 14 years.  Written a book about CSS from Wrox publishing.

Room was made up of developers, technical folks, screen reader users, and those obliged to come (a little humor).

Ian shared a few slides that were pretty humorous related to “skip to content” links, wherein the humor was related to where you placed the accent on the word content (hopefully he’ll post those slides).

 

SLIDE TWO

Shared a couple pages about skip links from Gez Lemon and Terrilll Thompson, and then demonstrated dynamic skip link code with window.location.hash.

 

SLIDE THREE

Ian showed form error listings and focusing on fields with errors.  Unfortunately, window.location.hash only works reliably in IE!

Ian did a demo of a skip link bug when using off-page content on iOS7.  He prefers using content off-top rather than off-left.  This technique however can result in some interesting behavior, notably showing the skip link after an up-swipe gesture to turn on VoiceOver, and then navigation after that makes the screen go completely blank.

Another option is to use off-screen CSS clipping, which unfortunately results in a lot more code.  This clipping technique is used on about 98% of the BBC web site, so if you want to see it at work, head over there 🙂

 

SLIDE FOUR

Next, Ian shared an ARIA landmark bug in iOS6.  This bug basically announces ALL landmarks in VoiceOver as simply “landmarks,” which is not very helpful.  This bug is resolved by adding a heading to every landmark.

 

SLIDE FIVE

Finally, Ian shared a bug with Live Regions.  You can’t always rely on live regions to provide information to the AT at the appropriate time.

Solution:  JavaScript-added content can be read once it’s been written to the screen.  So, you can build an empty div that quietly waits for content to be written into it.  Be sure to use role status with the assertive attribute.

Categories
Accessibility Technology Uncategorized

Implementing ARIA and HTML5 into Modern Web Applications (Part Two)

This is part two of a two-part presentation.  Catch up on part one here:  Introduction to ARIA and HTML5, Part 1

I’m typing this introduction before the presentation begins, and as I understand it, this session will be more technical than the morning session.  I’m not sure how many in-depth code samples will be included (the resources link below hints at what we’ll be talking about), so I’m making an educated guess that I may not be able to capture every nuance.  My apologies in advance if this is the case.

Presenters:

 

RESOURCES

 

EVENT PLUG – TPGBB (The Paciello Group Bug Bash)

  • Wherein you and TPG can ID and squash AT bugs
  • Thursday, March 20, 5:30 – 6:30 PM
  • Suite 3233, Harbor tower, Manchester Grand Hyatt

 

 

STEVE FAULKNER’S SEGMENT

SLIDE ONE

Diving into some HTML5  – an overview of the session

Steve Faulkner talked briefly into his involvement with his having a role in the creation of the HTML specification.  His specific interest is in how APIs speak to AT.

 

SLIDE TWO

Getting Simple

Getting to use native HTML controls makes things simpler for the developers and the AT.

 

SLIDE THREE

HTML5 Demo – details/summary

Here’s an example of the “HTML code triangle” we’re all used to:

<details>

<summary> label </summary>

Some content

</details>

When fully supported, you’ll be able to use native HTML controls without having to use any complicated JavaScript.  In the example above, clicking details would expand and show the contained elements.

Steve then demonstrated in CodePen an example of the code above, and how vastly simplified it is to render these UI elements.  This will make UI/UX designer’s lives much easier.

 

SLIDE FOUR

Chrome, Opera, and Safari have implemented this

Keyboard = 1/2 implemented

 

SLIDE FIVE

Steve then gave a description of how the code above is exposed to the AT APIs (i.e. MSAA).   Put simply, it’s exposed as a <div>, however, it’s not an accurate description of how it’s represented within the DOM.  He then proceeded to show how this looks when viewed through the “Accessibility Viewer” tool.  The aviewer tool is an object inspection tool available from the Paciello Group’s web site at http://www.paciellogroup.com/resources/aviewer.

Not all information is necessarily passed through the API and readable by aviewer.  The hope is that every browser will expose the same API Names, Roles, and States.

 

SLIDE SIX AND SEVEN

What We Want

  • We want to be able to see what’s actually there.
  • We also want to fill the gaps in general support in FF, IE, and webkit browsers

 

SLIDE EIGHT

Steve showed and described the example above, only this time embellished with ARIA code inserted.

 

SLIDE NINE

Showed the details summary here as a working example:  http://www.html5accessibility.com/CSUN14/details.html

The properties of the code on this page are properly exposed by the API, and thus readable as you would expect by aviewer.

 

SLIDE TEN

Dialog

Creating a modal dialog that works with keyboard and prevents users from accessing ‘disable’ content is the holy grail…

Being able to do this within native HTML is something that sure would be awesome.  See next slide…

 

SLIDE ELEVEN

What we get for free:

  • Focus moves to modal dialog when displayed
  • Focus stays until it is dismissed
  • Content not in the modal dialog is really disabled
  • ESC key dismisses it
  • <dialog> = role=dialog

 

SLIDE TWELVE

What we need to add (this only works in Chrome with Canary plug-in at the moment)

  • Accessible name to dialog:  <dialog aria-label=”text”>
  • Currently when the dialog is dismissed, focus moves to <body> when it needs to move to control that triggered dialog display:  can be polyfilled using scripting.

Steve demonstrated accessible modal dialog, once again with CodePen; he was unable to tab “out” of the modal dialog.  It works like a JavaScript alert()

 

SLIDE THIRTEEN

The “good oil” on implementing custom dialogs (I didn’t capture these links, but they’re available in the TPG source slides from the “Resources” link above).

  • Juicy Studio – Custom Built Modal Dialogs
  • The Incredible Accessible Modal Dialog
  • WAI-ARIA design pattern – modal dialog

 

SLIDE FOURTEEN

Input type=number

What we get:

  • Correct role and value information
  • Keyboard operable

Exposed as spin buttons

 

SLIDE FIFTEEN

Input type=range control

Implemented in all browsers.  However, default styling in IE is pretty funky, and they all look different from each other.  Bottom line:  you get everything for free.

 

SLIDE SIXTEEN

There are conformance rules for HTML5, but they can be difficult to decipher.  Steve has a “Using ARIA in HTML” document available for download which can help.

 

SLIDE SEVENTEEN

A large part of what’s been consuming Steve’s life in his role on the HTML5 specification group is figuring out which ARIA Roles, States, and Properties can be used on any HTML element.

 

SLIDE EIGHTEEN

ARIA Validation

  • Use of ARIA in HTML5 is non-conforming and probably always will be.  It doesn’t make any difference, it still works.
  • Easiest method is to use the HTML5 DOCTYPE with ARIA markup and then validate it using the W3C NU markup checker:  http://validator.w3.org/nu/

<!DOCTYPE html>

 

KARL GROVE’S SEGMENT

SLIDE ONE

Live Regions

  • Allows user to be notified of content changes
  • Typically for content that changes automatically
  • Content change may exist separate to what has focus
  • Live Regions facilitate these notifications

ARIA overcomes gaps between what JavaScript has “traditionally” done in web browsers to emulate desktop applications.

 

SLIDE TWO

Karl’s favorite thing to say:  “What is this thing & what does it do?”

  • Chat, error logs, etc. (role=’log’)
  • Status messages (role=’status’)
  • Urgent message requiring immediate notice (role=’alert’)
  • Stock ticker (role=’marquee’)
  • Timer/Clock (role=’timer’)
  • Progress indicator (role=’progressbar’)
  • None of the above (role=’region’)

 

SLIDE THREE

How important is the content?

  • aria-live=’polite’ (waits patiently, default for most roles)
  • aria-live=’assertive’ (interrupts output, default for alert role)

 

SLIDE FOUR

What’s being changed?

  • I’m adding stuff (aria-relevant=’additions’)
  • I’m removing stuff (aria-relevant=’removals’)
  • I’m changing text (aria-relevant=’text’)
  • I’m replacing stuff (aria-relevant=’all’)

Makes relevant changes to the DOM within that live region.  You can change these properties together as needed.

 

SLIDE FIVE

What matters?

  • aria-atomic=’false’ (default behavior, only announces changed node)
  • aria-atomic=’true’ (presents entire contents)

 

SLIDE SIX

What’s my name

A redux of aria labels that was covered in Part One

 

SLIDES SEVEN AND EIGHT

<div role=’alert’ aria-label=”Errors’>

Please correct the following errors:

</div>

Significance of the code above is that it will announce all the mistakes made in a form all at once, which is pretty handy.

 

SLIDE EIGHT

Karl then demonstrated some of the challenges when using live regions with a chat he had set up at:  chat.karlgroves-sandbox.com

He also showed a web-based slideshow called “shower”

Download and play with Karl’s JQuery plug-in at github.com/karlgroves/jquery-live-regions

Short break here…

Karl went about soapboxing:

“ARIA is a LIE and your HTML doesn’t do anything.  They are instead a polite request to the browser about what to do with our code, which is then transformed into a DOM.”

Principle of Least Astonishment:  things should behave consistently

 

HANS’ SEGMENT

SLIDE ONE

  • Keyboard and Focus management
  • Form validation
  • Mode conflicts
  • Solutions, workarounds, and considerations

 

SLIDE TWO

Problem with Custom Controls (not native UI)

Usually created with generic elements like <divs> and <spans>

  • Not keyboard focusable
  • Have a default tab order
  • Behavior unknown

Best solution is to use native controls, or manually define keyboard focus and behavior needs.

 

SLIDE THREE

Keyboard Issues in a Nutshell

  • Reachability:  via tab order, globally defined shortcut, activating another widget
  • Operability:  all functionality should be doable via keyboard and mouse input.

 

SLIDE FOUR

To be accessible, ARIA input widgets need focus.

  • Tabindex=”0″ element becomes a part of the tab order
  • Tabindex=”-1″ element is not in tab order, but focusable

Each widget should have only one stop in the tab order.  All of your widgets should be reachable via keyboard.  Hans then gave a demonstration of a tree widget, tabbing both into and out of it using JAWS.  This demonstration also pointed out the danger of wrapping a page with a role of application.

An alternative for a roving tabindex is the aria-activedescendant=”<idref>”

 

SLIDE FIVE

Every widget needs to be operable by keyboard.  Common keystrokes are:

  • Arrow keys, home, end, page up, page down, enter, space, esc
  • Mimic navigation in the desktop environment when possible:  www.w3.org/WAI/PF/aria-practices
  • Always manage and keep track of your focus.  Never let it get lost.

To demonstrate focus, Hans showed a table that allowed deletion of columns of data.  After deleting a column, the previous column received focus.

 

SLIDE SIX

Skipping Mechanisms

  • Ability to skip content is crucial for screen reader and keyboard users
  • Skip links may be out of fashion and often misused, but users still need to be able to skip.
  • Alternatives:  collapsible sections, consistent shortcuts, custom focus manager

 

SLIDE SEVEN

Form validation

  • ARIA makes form validation easier to manage:  aria-required & aria-invalid states, role=”alert” flags validation errors immediately.  Inline and error summary used together are most effective.
  • Validation summaries make invalid entries easier to find

Create a programmatic connection between validation messages and their associated fields.  Maybe there needs to be a W3C specification about how AT is supposed to behave (there’s one for UA).  Hans provided a demonstration of a sample form with required fields.  Tabbing away from a required field activated the “required” error when tabbing into the following field.  He attempted to mark up the fields as live regions, but it didn’t work very well.

 

SLIDE EIGHT

Fallback solutions for link buttons

There’s no real consensus on links versus buttons.  Set role=”button” to make links look like buttons for screen readers

 

SLIDE NINE

Mode conflicts, i.e. Role=Application

  • Screen readers normally browse in ‘virtual mode.’  This means it navigates a virtual copy of the web page.  It intercepts all keystrokes for its own navigation (i.e. “H” for heading navigation.
  • For dynamic web apps, virtual mode may need to be turned off.  Interactive widgets need to define the keystrokes themselves; content needs to be live, not a virtual copy; automatically switches between virtual and non-virtual mode.
  • role=”application”:  screen reader switches to non-virtual for these elements; must provide all keyboard navigation when in role=”application” mode; screen readers don’t intercept keystrokes then, so typical functions will not work.

 

SLIDE TEN

Role=Document

  • For apps with reading or editing sections (e-mail client)
  • When applied to a container inside an application role, the screen reader switches to virtual mode.

Only use application role when your application actually IS a web application.

 

SLIDE ELEVEN

Explain to users how Rich Internet Applications work

Put some hidden text at the beginning of the page to explain.

 

SLIDE TWELVE

The perfect dialog, in theory

  • Use role=”dialog” combined with aria-labelledby (for dialog title), aria-describedby (for dialog message text)
  • Focus management
  • For modal dialogs:  prevent virtual navigation to background using aria-hidden=”true”

 

Categories
Student Affairs Technology

How a simple web service saved 1,500+ hours of student time

It may only be February, but graduation is already on the minds of many of us in higher education.  It’s an exciting time for our graduating seniors, and a lot of work for us in Student Affairs who do the “behind the scenes” work to make these events run smoothly.

At CSUN, we have an annual event in March called “GradFest” that supports Commencement.  GradFest is an event where students who have applied to graduate can learn everything they need to know about graduation, visit with vendors to purchase a cap and gown, class ring, and so on.  The annual CSUN graduate population is made up of thousands of students, so as you might imagine, this is a large event to plan from a logistical standpoint.

A big part of GradFest is to check that students have indeed applied to graduate – that is, they are “on the list.”  Prior to 2013, this was accomplished by students waiting in a line, where they were manually matched by staff in our Office of Student Involvement and Development to a long list of students who had a) met the criteria to walk and b) applied to graduate.  If students were on that list, they were checked off and sent to a second set of lines where they could purchase their regalia (more on that in a moment).  At this point, you may be asking yourself “why does that first line exist to begin with?”  Great question.  In the distant past (10+ years ago), we had situations where students who had not applied to graduate and were not in fact eligible to walk, purchasing regalia and walking.  Implementing this simple cross-check virtually eliminated the case of the “phantom graduate.”  The downside is that this check was done manually with a paper list, and that takes time.

Many of you who are front-line with students probably already see the other issue.  At any event hosting thousands of students, you’re bound to have some standing in line who – for whatever reason – should not be there because they haven’t done what they were supposed to do.  After waiting in line for as much as an hour, these students find out that they aren’t on the list and need to visit the registrar to sort things out.  They’re not able to move forward and order the most visible artifacts of a graduate, so at this point they’re likely to be upset.

As a web technologist, I saw this situation and thought of ways that we could use web services to simplify event logistics.  One of our big GradFest vendors brings in over fifty of their own computers that are connected to the Internet, so students can easily browse their online store and buy or reserve their regalia.  I thought:  “What if my team could build a simple web app that calls a web service whose sole purpose is to say whether or not a student is on the list?”  If we could do that, then all we’d have to do is present this web page on a browser of the vendor’s computers.  This would not only completely eliminate a line, we’d also free up many hours of professional staff time.  An added side-benefit is that those students who were not on the list would not be quite as upset when told they needed to visit the registrar.  A five-minute wait beats an hour-long wait hands down!

To make this happen, my team had to do four things:

  1. Add to our data warehouse the list of students who had successfully met the criteria to graduate and had successfully applied to participate in their graduation ceremony.
  2. Build a web service that a) verifies a student is in the warehouse, and b) returns a simple “thumbs-up/thumbs-down” value.
  3. Build a bare-bones web app that authenticates a student using their CSUN user id and password.  After authenticating the user, the app invokes the web service and presents appropriate messaging to the student, i.e. “Congratulations…” or “We’re sorry, but…”
  4. Document the process.

Some of you may be asking yourselves:  “Hey Paul, web services have been in general use for over a decade in the larger world.  What’s so special about your implementation?  It sounds super simple.”  And you’d be right to ask that question.  What makes our implementation so special is that waaaay back in 2013, this was the very first production implementation of a web service at CSUN that I’m aware of…and it took us less than two weeks to build!  Once we implemented this simple proof of concept, the vast potential that web services and APIs enable became very real for us.  By making clearly defined data available to applications, we opened up some pretty amazing possibilities.

Ok, so what were the specific successes and issues we experienced?

The successes were dramatic and obvious:

  1. Eliminated a line, saving students 1,500+ hours of time standing in line
  2. Saved professional staff 50+ hours of time manning the line, freeing them up to provide high-touch event services for those students who really needed them
  3. Built a practical proof-of-concept that worked exactly as expected and demonstrated the power of web services
  4. Added a table to our data warehouse containing an always up-to-date list of students who can participate in graduation ceremonies.
  5. Created excitement among our developers around web services and APIs

The issues and challenges we experienced are real, but tend towards the philosophical.  For many processes and services on this campus – and I suspect any campus – simply putting your information into a database is a big step forward.  Add a web interface, and you’re talking rocket science!  Ok, I’ll cop to a little hyperbolic license there, but it is fair to say that some people who benefit from a database-powered application tend to get, shall we say, protective of their data.  This human issue almost inevitably leads to data balkanization, more often referred to as silos.  Another issue when implementing web services is that higher ed administrators and even some IT folks are used to thinking about applications in the traditional sense, and don’t give much – if any – time to thinking “a layer above” their application. There are almost always ways in which data and applications can be made useful beyond their original intended purpose.  I believe that strategically thinking about how we make connections between our data and services is the future of technology in Student Affairs.  In short, Student Affairs is a platform.  More on that in another post…

In a few weeks, I look forward to seeing CSUN students use our little app at GradFest.  In a few months, when I attend graduation and hear pomp and circumstance, I’ll know that I and my team had some small hand in making this process just a little bit easier for our students and the staff who support their success.

Good luck to everyone in this 2014 graduation season!

 

Categories
Technology

My EDUCAUSE 2013 Mega Post

One the things I try to do when I attend conferences is to make a detailed record of all the sessions I attend, with the exception of keynotes, which tend to get really good coverage from other folks.  I live blog the events as I attend them, which hopefully helps those who committed to other sessions, and then I do one of these “mega posts,” which summarize all the posts I attended.  Based on my itinerary, 2013 seems to be the year of big data and analytics.  I’m willing to bet a lot of my fellow attendees will agree 🙂

I’ve been in higher education for just over seven years now, and somewhat amazingly, this was the very first EDUCAUSE event I’ve ever attended.  Why didn’t anyone tell me about this conference?  It was an extremely worthwhile event, at least for me…one of the meetings I had will likely save my division close to $50,000 each year!  That savings will go a long way toward providing students at CSUN with more and/or better services.  There were lots of great sessions to attend, with lots of smart folks sharing what they’re doing with IT on their campuses.  I’ll definitely be back next year.

Without any further ado, here’s my EDUCAUSE 2013 mega-post…please drop me a line and let me know if this helps you!

 

Friday, October 18 (last day of EDUCAUSE was a half day)

 

Thursday, October 17 (my busiest day)

 

Wednesday, October 16 (spent a few hours prowling the vendor floor and visiting with my accessibility colleagues)

 

Tuesday, October 15 (each session was a half-day long)

 

Categories
Technology

EDUCAUSE Web Professionals Constituent Group

Title:  EDUCAUSE Web Professionals Constituent Group

Facilitator:  Aren Cambre, Team Lead, Web Technologies, Southern Methodist University

 

Quick round of introductions, about 16 attendees.

What is the web now?  What makes it special?  What are we now?

There’s a ton of work to do yet with the web, we tend to be about five years behind the rest of the world.  We spent several minutes talking about CMSes (Ektron, OmniUpdate specifically) and how we tend to work with our marketing departments.

IT people are often are a store of institutional knowledge…do others experience this, too?  General nodding of assent around the room.  Decentralized IT units seem to be the norm.  UCLA has about 80 IT departments.  Other campuses also have many IT units.

We all leverage students to take care of our work.  It’s generally best to serve them with “progressive development opportunities.”  For example, angular framework, CloudFoundry, and Node.js were discussed.

Some talk about UX and design patterns, which led into a discussion about WCM.  Lots of Drupal, some WordPress, Cascade, OmniUpdate, plus a few others I didn’t catch.

Please use the UWebD list serve and use our EDUCAUSE web professionals list!

 

 

%d bloggers like this: