|
|
|
/*
|
|
|
|
Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
|
|
|
|
Available via Academic Free License >= 2.1 OR the modified BSD license.
|
|
|
|
see: http://dojotoolkit.org/license for details
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
if(!dojo._hasResource["dijit._base.wai"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
|
|
|
|
dojo._hasResource["dijit._base.wai"] = true;
|
|
|
|
dojo.provide("dijit._base.wai");
|
|
|
|
|
|
|
|
|
|
|
|
dijit.wai = {
|
|
|
|
onload: function(){
|
|
|
|
// summary:
|
|
|
|
// Detects if we are in high-contrast mode or not
|
|
|
|
|
|
|
|
// This must be a named function and not an anonymous
|
|
|
|
// function, so that the widget parsing code can make sure it
|
|
|
|
// registers its onload function after this function.
|
|
|
|
// DO NOT USE "this" within this function.
|
|
|
|
|
|
|
|
// create div for testing if high contrast mode is on or images are turned off
|
|
|
|
var div = dojo.create("div",{
|
|
|
|
id: "a11yTestNode",
|
|
|
|
style:{
|
|
|
|
cssText:'border: 1px solid;'
|
|
|
|
+ 'border-color:red green;'
|
|
|
|
+ 'position: absolute;'
|
|
|
|
+ 'height: 5px;'
|
|
|
|
+ 'top: -999px;'
|
|
|
|
+ 'background-image: url("' + (dojo.config.blankGif || dojo.moduleUrl("dojo", "resources/blank.gif")) + '");'
|
|
|
|
}
|
|
|
|
}, dojo.body());
|
|
|
|
|
|
|
|
// test it
|
|
|
|
var cs = dojo.getComputedStyle(div);
|
|
|
|
if(cs){
|
|
|
|
var bkImg = cs.backgroundImage;
|
|
|
|
var needsA11y = (cs.borderTopColor == cs.borderRightColor) || (bkImg != null && (bkImg == "none" || bkImg == "url(invalid-url:)" ));
|
|
|
|
dojo[needsA11y ? "addClass" : "removeClass"](dojo.body(), "dijit_a11y");
|
|
|
|
if(dojo.isIE){
|
|
|
|
div.outerHTML = ""; // prevent mixed-content warning, see http://support.microsoft.com/kb/925014
|
|
|
|
}else{
|
|
|
|
dojo.body().removeChild(div);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
// Test if computer is in high contrast mode.
|
|
|
|
// Make sure the a11y test runs first, before widgets are instantiated.
|
|
|
|
if(dojo.isIE || dojo.isMoz){ // NOTE: checking in Safari messes things up
|
|
|
|
dojo._loaders.unshift(dijit.wai.onload);
|
|
|
|
}
|
|
|
|
|
|
|
|
dojo.mixin(dijit, {
|
|
|
|
hasWaiRole: function(/*Element*/ elem, /*String?*/ role){
|
|
|
|
// summary:
|
|
|
|
// Determines if an element has a particular role.
|
|
|
|
// returns:
|
|
|
|
// True if elem has the specific role attribute and false if not.
|
|
|
|
// For backwards compatibility if role parameter not provided,
|
|
|
|
// returns true if has a role
|
|
|
|
var waiRole = this.getWaiRole(elem);
|
|
|
|
return role ? (waiRole.indexOf(role) > -1) : (waiRole.length > 0);
|
|
|
|
},
|
|
|
|
|
|
|
|
getWaiRole: function(/*Element*/ elem){
|
|
|
|
// summary:
|
|
|
|
// Gets the role for an element (which should be a wai role).
|
|
|
|
// returns:
|
|
|
|
// The role of elem or an empty string if elem
|
|
|
|
// does not have a role.
|
|
|
|
return dojo.trim((dojo.attr(elem, "role") || "").replace("wairole:",""));
|
|
|
|
},
|
|
|
|
|
|
|
|
setWaiRole: function(/*Element*/ elem, /*String*/ role){
|
|
|
|
// summary:
|
|
|
|
// Sets the role on an element.
|
|
|
|
// description:
|
|
|
|
// Replace existing role attribute with new role.
|
|
|
|
|
|
|
|
dojo.attr(elem, "role", role);
|
|
|
|
},
|
|
|
|
|
|
|
|
removeWaiRole: function(/*Element*/ elem, /*String*/ role){
|
|
|
|
// summary:
|
|
|
|
// Removes the specified role from an element.
|
|
|
|
// Removes role attribute if no specific role provided (for backwards compat.)
|
|
|
|
|
|
|
|
var roleValue = dojo.attr(elem, "role");
|
|
|
|
if(!roleValue){ return; }
|
|
|
|
if(role){
|
|
|
|
var t = dojo.trim((" " + roleValue + " ").replace(" " + role + " ", " "));
|
|
|
|
dojo.attr(elem, "role", t);
|
|
|
|
}else{
|
|
|
|
elem.removeAttribute("role");
|
|
|
|
}
|
|
|
|
},
|
|
|
|
|
|
|
|
hasWaiState: function(/*Element*/ elem, /*String*/ state){
|
|
|
|
// summary:
|
|
|
|
// Determines if an element has a given state.
|
|
|
|
// description:
|
|
|
|
// Checks for an attribute called "aria-"+state.
|
|
|
|
// returns:
|
|
|
|
// true if elem has a value for the given state and
|
|
|
|
// false if it does not.
|
|
|
|
|
|
|
|
return elem.hasAttribute ? elem.hasAttribute("aria-"+state) : !!elem.getAttribute("aria-"+state);
|
|
|
|
},
|
|
|
|
|
|
|
|
getWaiState: function(/*Element*/ elem, /*String*/ state){
|
|
|
|
// summary:
|
|
|
|
// Gets the value of a state on an element.
|
|
|
|
// description:
|
|
|
|
// Checks for an attribute called "aria-"+state.
|
|
|
|
// returns:
|
|
|
|
// The value of the requested state on elem
|
|
|
|
// or an empty string if elem has no value for state.
|
|
|
|
|
|
|
|
return elem.getAttribute("aria-"+state) || "";
|
|
|
|
},
|
|
|
|
|
|
|
|
setWaiState: function(/*Element*/ elem, /*String*/ state, /*String*/ value){
|
|
|
|
// summary:
|
|
|
|
// Sets a state on an element.
|
|
|
|
// description:
|
|
|
|
// Sets an attribute called "aria-"+state.
|
|
|
|
|
|
|
|
elem.setAttribute("aria-"+state, value);
|
|
|
|
},
|
|
|
|
|
|
|
|
removeWaiState: function(/*Element*/ elem, /*String*/ state){
|
|
|
|
// summary:
|
|
|
|
// Removes a state from an element.
|
|
|
|
// description:
|
|
|
|
// Sets an attribute called "aria-"+state.
|
|
|
|
|
|
|
|
elem.removeAttribute("aria-"+state);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
}
|