Skip to content

Commit 684b2ed

Browse files
committed
Initial import of PandoraA11yFixes.
1 parent 88b59b0 commit 684b2ed

File tree

1 file changed

+115
-0
lines changed

1 file changed

+115
-0
lines changed

PandoraA11yFixes.user.js

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
// ==UserScript==
2+
// @name Pandora Accessibility Fixes
3+
// @namespace http://www.jantrid.net/axSGrease/
4+
// @description Improves the accessibility of Pandora.
5+
// @author James Teh <jamie@jantrid.net>
6+
// @copyright 2013 James Teh
7+
// @license GNU General Public License version 2.0
8+
// @version 0.20130110.01
9+
// @include http://www.pandora.com/*
10+
// @homepageURL http://userscripts.org/scripts/show/156173
11+
// @updateURL https://userscripts.org/scripts/source/156173.user.js
12+
// ==/UserScript==
13+
14+
BUTTONS_LABELS = {
15+
"thumbUpButton": "Thumb up",
16+
"thumbDownButton": "Thumb down",
17+
"pauseButton": "Pause",
18+
"playButton": "Play",
19+
"skipButton": "Skip",
20+
}
21+
function fixButton(target) {
22+
var classes = target.classList;
23+
if (!classes)
24+
return;
25+
for (var cls in BUTTONS_LABELS) {
26+
if (!classes.contains(cls))
27+
continue;
28+
var button = target.firstChild;
29+
button.setAttribute("role", "button");
30+
button.setAttribute("aria-label", BUTTONS_LABELS[cls]);
31+
if (cls == "thumbUpButton")
32+
button.setAttribute("aria-pressed",
33+
classes.contains("indicator") ? "true" : "false");
34+
break;
35+
}
36+
}
37+
38+
function onClassModified(target) {
39+
var classes = target.classList;
40+
if (!classes)
41+
return;
42+
fixButton(target);
43+
if (classes.contains("stationListItem"))
44+
target.setAttribute("aria-checked",
45+
classes.contains("selected") ? "true" : "false");
46+
}
47+
48+
function onNodeAdded(target) {
49+
var node;
50+
if (node = document.getElementById("stationList"))
51+
node.setAttribute("role", "radiogroup");
52+
var nodes;
53+
nodes = target.getElementsByClassName("stationListItem");
54+
for (var i = 0; i < nodes.length; ++i) {
55+
node = nodes[i];
56+
node.setAttribute("role", "radio");
57+
if (node.classList.contains("selected"))
58+
node.setAttribute("aria-checked", "true");
59+
}
60+
nodes = target.getElementsByClassName("stationName");
61+
for (var i = 0; i < nodes.length; ++i)
62+
nodes[i].setAttribute("role", "presentation");
63+
nodes = target.getElementsByClassName("option");
64+
for (var i = 0; i < nodes.length; ++i)
65+
nodes[i].setAttribute("role", "button");
66+
}
67+
68+
function onStyleModified(target) {
69+
var style = target.style;
70+
if (target.id == "station_menu_dd" && style.visibility == "visible")
71+
target.getElementsByTagName("a")[0].focus();
72+
}
73+
74+
function init() {
75+
var nodes;
76+
nodes = document.getElementsByClassName("buttons")[0].childNodes;
77+
for (var i = 0; i < nodes.length; ++i)
78+
fixButton(nodes[i]);
79+
var node;
80+
if (node = document.getElementsByClassName("buyButton")[0]) {
81+
node.setAttribute("role", "button");
82+
node.setAttribute("aria-label", "Buy");
83+
}
84+
// Something causes these nodes to remove ARIA attributes if we set them here,
85+
// so delay this.
86+
setTimeout(function() {
87+
document.getElementById("addArtistSeed").setAttribute("aria-label", "Add artist");
88+
var nodes = document.getElementsByClassName("deletable");
89+
for (var i = 0; i < nodes.length; ++i) {
90+
var node = nodes[i];
91+
node.setAttribute("role", "button");
92+
node.setAttribute("aria-label", "Delete");
93+
}
94+
var nodes = document.getElementsByClassName("sample");
95+
for (var i = 0; i < nodes.length; ++i)
96+
nodes[i].firstChild.setAttribute("aria-label", "Sample");
97+
}, 7000);
98+
}
99+
100+
var observer = new MutationObserver(function(mutations) {
101+
mutations.forEach(function(mutation) {
102+
if (mutation.type === "childList") {
103+
for (var i = 0; i < mutation.addedNodes.length; ++i)
104+
onNodeAdded(mutation.addedNodes[i]);
105+
} else if (mutation.type === "attributes") {
106+
if (mutation.attributeName == "class")
107+
onClassModified(mutation.target);
108+
else if (mutation.attributeName == "style")
109+
onStyleModified(mutation.target);
110+
}
111+
});
112+
});
113+
observer.observe(document, {childList: true, attributes: true,
114+
subtree: true, attributeFilter: ["class", "style"]});
115+
init();

0 commit comments

Comments
 (0)