Final kick in the nuts re. focus - keyboard-a11y plugin
Antranig Basman
antranig.basman at colorado.edu
Thu Feb 6 21:58:20 EST 2014
Following on from my previous posting reporting on focus handling issues provoked by our recent jQuery
upgrade that I reported on at
http://fluid.2324889.n4.nabble.com/Breaking-changes-in-recent-versions-of-jQuery-focus-handling-td8867.html
I have what is hopefully a final round of reports and also in this case queries.
After the merge of both https://github.com/fluid-project/infusion/pull/448 and
https://github.com/fluid-project/infusion/pull/437 for http://issues.fluidproject.org/browse/FLUID-5241 and
http://issues.fluidproject.org/browse/FLUID-5204 http://issues.fluidproject.org/browse/FLUID-5185 we have a
framework image which is basically up to date and working, but the combination of the two pull requests have
precipitated a failure in our test cases for keyboard-a11y-tests.js on all versions of IE.
In some sense the failures are "benign" in that the real implementation is working on this platform, but
they raise a few philosophical and practical issues that we would need to talk through. This is following on
from an end-of-day conversation archived at https://botbot.me/freenode/fluid-work/2014-02-06/?tz=America/Denver
The root cause is a familiar one, just better understood - the recent version of jQuery now only relays
"faithful" focus messages resulting from the browser rather than "fake" ones as it has for many years, which
used to synchronously relay attempts to trigger focus events into listeners for them.
This creates particular problems for our keyboard accessibility tests, since these rely on focus triggering
not only in the test cases, but also in the implementation. To recap, the "selectable" widget, when
receiving focus on a "container" node, responds my immediately throwing focus onto the first of a set of
managed container elements - this shortcut saves one interaction cycle for those using the keyboard or other
equivalent.
Part of the work for FLUID-5185 involved progressively rewriting our tests in the new "asynchronous style"
for which there seems now little alternative for keyboard-a11y. Our alternatives for the other tests might
have involved the use of jQuery.triggerHandler which was jQuery's recommendation for restoring the old
framework behaviour - and is the approach used, for example, in the jquery.simulate plugin:
https://github.com/jquery/jquery-simulate/blob/master/jquery.simulate.js - however, it would seem
inappropriate to import this whole plugin as part of the implementation strategy of another widget, and it
even seems inappropriate (to me) to try to restore the old "event fakery" by calling $.triggerHandler() as
part of the implementation of keyboard-a11y - if for no other reason that this will restore odd pathologies
such as being notified of focus events twice (once for the fake handler trigger, and once for the real focus
event). However, I'm open to, say, improving our existing jqUnit.simulateFocus method (currently in
jqUnit-browser.js, as part of the FLUID-5185 work) to being a first-class core framework method which would
restore the old jQuery behaviour and allow us to retain our old tests.
The other option is to accept the variability of focus relay across browsers as "part of the environment"
and rewrite all the tests in keyboard-a11y-tests.js to use the IoC testing framework which was designed
precisely to abstract over asynchrony issues of this kind. This will further reduce the viability of these
tests from the point of non-Infusion users but I believe this counts for very little at this point (see below).
So either A) upgrade jqUnit.simulateFocus to a standard core utility which we use everywhere, OR B) fall
back on standard $.focus() everywhere and rewrite the keyboard-a11y tests to use IoC testing.
The philosophical issue relates to what we believe our tests assure... and how "portable" we expect their
effects to be. I think there are good grounds for wanting tests of our browser widgets to be "as faithful as
possible" wrt their browser environment, given part of their purpose is to reduce the burden of acceptance
testing. However, tests which have environmental dependencies are philosophically dubious, and it might be
worth starting to think more clearly about the roles of our different tests and perhaps separating out those
tests into a different area which are expected to execute differently (whilst still passing) on different
browser platforms.
The other issue relates to our keyboard-a11y plugin itself. I think it's fair to say that if we were to
write this today, we would not write it in the way we did in 2008. I think it's become clear to us that the
"instance-free, model-free" idiom for jQuery UI plugins doesn't meet our goals as a community, and one sense
in which this became apparent just now was the way in which our plugin doesn't expose the events and model
state that we now expect from a Fluid component makes it harder to write credible and reliable tests for it.
I propose that for Infusion 2.0 we eliminate both the "special status" of jquery.keyboard-11y.js itself
(since it's perfectly clear after 5 years that it remains of no interest to anyone in the wider jQuery
community) and its implementation in favour of producing a standard model-based and framework-aware version
of it. I think this will become even more important as with the merging of the FLUID-3674 branch and
subsequent work we will be working in a more and more "model-driven" idiom.
Cheers,
A.
More information about the fluid-work
mailing list