Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(376)

Side by Side Diff: chrome/browser/resources/access_chromevox/chromevox/background/bookmark_manager_ui.js

Issue 6254007: Adding ChromeVox as a component extensions (enabled only for ChromeOS, for no... (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 9 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
Property Changes:
Added: svn:executable
+ *
Added: svn:eol-style
+ LF
OLDNEW
(Empty)
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 goog.provide('cvox.ChromeVoxBookmarksManager');
6
7 goog.require('cvox.ChromeVoxEarcons');
8
9 /**
10 * @constructor
11 */
12 cvox.ChromeVoxBookmarksManager = function() {};
13
14 /**
15 * Handle to the TTS.
16 * @type {Object}
17 */
18 cvox.ChromeVoxBookmarksManager.tts;
19
20 /**
21 * Handle to the Earcons.
22 * @type {Object}
23 */
24 cvox.ChromeVoxBookmarksManager.earcons;
25
26 /**
27 * Bookmarknode to delete.
28 * @type {Node}
29 */
30 cvox.ChromeVoxBookmarksManager.bookmarkNodeToDelete = '';
31 cvox.ChromeVoxBookmarksManager.idCounter = 0;
32 cvox.ChromeVoxBookmarksManager.HIDDENSTYLE_ = '{display: none;}';
33 cvox.ChromeVoxBookmarksManager.mode = 0; // 0 for edit, 1 for search
34 cvox.ChromeVoxBookmarksManager.currentSearchString = '';
35 cvox.ChromeVoxBookmarksManager.currentBookmarkIndex = -1;
36 cvox.ChromeVoxBookmarksManager.EXPANDED_UNICODE_GRAPHIC = '▼ ';
37 cvox.ChromeVoxBookmarksManager.COLLAPSED_UNICODE_GRAPHIC = '▶ ';
38
39 cvox.ChromeVoxBookmarksManager.treeBrowser = function(bmTreeNodeArray) {
40 var htmlStr = '';
41 for (var i = 0, node; node = bmTreeNodeArray[i]; i++) {
42 htmlStr = htmlStr +
43 cvox.ChromeVoxBookmarksManager.treeNodeToHtml(node, 0, '') +
44 '<br>';
45 }
46 document.getElementById('bookmarks').innerHTML = htmlStr;
47 };
48
49 cvox.ChromeVoxBookmarksManager.treeNodeToHtml = function(
50 bmTreeNode, level, classString) {
51 if (bmTreeNode.url) {
52 return "<li class='" + classString + "'> <a id='bmNodeID_" +
53 bmTreeNode.id + "' href='" + bmTreeNode.url +
54 "' onKeyDown='cvox.ChromeVoxBookmarksManager." +
55 "itemKeyDownHandler(evt)' " +
56 "class='bookmark link'>" + bmTreeNode.title + '</a></li>';
57 } else {
58 if (level > 6) {
59 level = 6;
60 }
61 var branchId = cvox.ChromeVoxBookmarksManager.idCounter;
62 cvox.ChromeVoxBookmarksManager.idCounter++;
63 var htmlStr = '';
64 if (level > 0) {
65 var ruleStr = 'li.class_' + branchId +
66 cvox.ChromeVoxBookmarksManager.HIDDENSTYLE_;
67 document.styleSheets[0].insertRule(ruleStr, 0);
68 ruleStr = 'h2.class_' + branchId +
69 cvox.ChromeVoxBookmarksManager.HIDDENSTYLE_;
70 document.styleSheets[0].insertRule(ruleStr, 0);
71 ruleStr = 'h3.class_' + branchId +
72 cvox.ChromeVoxBookmarksManager.HIDDENSTYLE_;
73 document.styleSheets[0].insertRule(ruleStr, 0);
74 ruleStr = 'h4.class_' + branchId +
75 cvox.ChromeVoxBookmarksManager.HIDDENSTYLE_;
76 document.styleSheets[0].insertRule(ruleStr, 0);
77 ruleStr = 'h5.class_' + branchId +
78 cvox.ChromeVoxBookmarksManager.HIDDENSTYLE_;
79 document.styleSheets[0].insertRule(ruleStr, 0);
80 ruleStr = 'h6.class_' + branchId +
81 cvox.ChromeVoxBookmarksManager.HIDDENSTYLE_;
82 document.styleSheets[0].insertRule(ruleStr, 0);
83 htmlStr =
84 "<ul id='" + branchId + "'><h" + level + " id='bmNodeID_" +
85 bmTreeNode.id + "' tabIndex='0' " +
86 "onClick='cvox.ChromeVoxBookmarksManager." +
87 "bmItemExpandCollapseToggle(" + branchId +
88 ")' onKeyDown='cvox.ChromeVoxBookmarksManager." +
89 "itemKeyDownHandler(evt)' " +
90 "class='bookmark folder " + classString +
91 "'><span id='indicatorSpan_" + branchId + "'>" +
92 cvox.ChromeVoxBookmarksManager.COLLAPSED_UNICODE_GRAPHIC +
93 '</span>' + bmTreeNode.title + '</h' + level + '>';
94 }
95 var childNodes = bmTreeNode.children;
96 for (var i = 0, childNode; childNode = childNodes[i]; i++) {
97 htmlStr = htmlStr + cvox.ChromeVoxBookmarksManager.treeNodeToHtml(
98 childNode, level + 1, ' class_' + branchId + ' ' + classString);
99 }
100 if (level > 0) {
101 htmlStr = htmlStr + '</ul>';
102 }
103 return htmlStr;
104 }
105 };
106
107 cvox.ChromeVoxBookmarksManager.deleteBookmarkNode = function(bmNodeId) {
108 var bookmarkName = document.getElementById(bmNodeId).textContent;
109 var targetHtmlNode = document.getElementById(bmNodeId).parentNode;
110 targetHtmlNode.parentNode.removeChild(targetHtmlNode);
111 var internalId = bmNodeId.substring(9);
112 chrome.bookmarks.remove(internalId, null);
113 chrome.bookmarks.removeTree(internalId, null);
114 cvox.ChromeVoxBookmarksManager.tts.speak('Deleted ' + bookmarkName, 0,
115 null);
116 };
117
118
119 cvox.ChromeVoxBookmarksManager.itemKeyDownHandler = function(evt) {
120 if (evt.keyCode == 13) { // Enter
121 if (evt.target.tagName == 'A') {
122 // Do nothing, this is a link, default behavior is fine.
123 } else {
124 if (cvox.ChromeVoxBookmarksManager.isCollapsed(
125 evt.target.parentNode.id)) {
126 cvox.ChromeVoxBookmarksManager.itemExpand(
127 evt.target.parentNode.id);
128 } else {
129 cvox.ChromeVoxBookmarksManager.itemCollapse(
130 evt.target.parentNode.id);
131 }
132 evt.target.blur();
133 evt.target.focus();
134 }
135 return false;
136 }
137 // Ignore all keys on the individual items when searching
138 // except for navigation keys
139 if (cvox.ChromeVoxBookmarksManager.mode == 1) {
140 if ((evt.keyCode == 38) || (evt.keyCode == 40)) {
141 return true;
142 }
143 return false;
144 }
145 return true;
146 };
147
148 cvox.ChromeVoxBookmarksManager.globalKeyDownHandler = function(evt) {
149 if (cvox.ChromeVoxBookmarksManager.bookmarkNodeToDelete !== '') {
150 if (evt.keyCode == 46) { // DEL
151 cvox.ChromeVoxBookmarksManager.deleteBookmarkNode(
152 cvox.ChromeVoxBookmarksManager.bookmarkNodeToDelete);
153 cvox.ChromeVoxBookmarksManager.bookmarkNodeToDelete = '';
154 return false;
155 }
156 cvox.ChromeVoxBookmarksManager.bookmarkNodeToDelete = '';
157 }
158 /* Things to do in all modes */
159 if (evt.keyCode == 27) { // ESC
160 cvox.ChromeVoxBookmarksManager.toggleModes();
161 return false;
162 }
163 if (evt.keyCode == 38) { // UP Arrow
164 cvox.ChromeVoxBookmarksManager.prevBookmark();
165 return false;
166 }
167 if (evt.keyCode == 40) { // DOWN Arrow
168 cvox.ChromeVoxBookmarksManager.nextBookmark();
169 return false;
170 }
171 if (evt.keyCode == 39) { // RIGHT Arrow
172 if (evt.target.tagName == 'A') {
173 document.location = evt.target.href;
174 } else {
175 cvox.ChromeVoxBookmarksManager.itemExpand(evt.target.parentNode.id);
176 evt.target.blur();
177 evt.target.focus();
178 }
179 return false;
180 }
181 if (cvox.ChromeVoxBookmarksManager.mode == 1) {
182 return true;
183 }
184 /* Things to do in Browse mode but NOT in Search mode */
185 if (evt.keyCode == 37) { // LEFT Arrow
186 if (evt.target.tagName == 'A') {
187 cvox.ChromeVoxBookmarksManager.itemCollapse(
188 evt.target.parentNode.parentNode.id);
189 evt.target.parentNode.parentNode.firstElementChild.blur();
190 evt.target.parentNode.parentNode.firstElementChild.focus();
191 } else {
192 cvox.ChromeVoxBookmarksManager.itemCollapse(
193 evt.target.parentNode.id);
194 evt.target.blur();
195 evt.target.focus();
196 }
197 return false;
198 }
199 if (evt.keyCode == 187) { // =
200 cvox.ChromeVoxBookmarksManager.expandAll();
201 cvox.ChromeVoxBookmarksManager.earcons.playEarcon(
202 ChromeVoxEarcons.EXPANDED);
203 return false;
204 }
205 if (evt.keyCode == 189) { // -
206 cvox.ChromeVoxBookmarksManager.collapseAll();
207 cvox.ChromeVoxBookmarksManager.earcons.playEarcon(
208 ChromeVoxEarcons.COLLAPSED);
209 return false;
210 }
211 if (evt.keyCode == 46) { // DEL
212 if (evt.target.id && (evt.target.id.indexOf('bmNodeID_') === 0)) {
213 cvox.ChromeVoxBookmarksManager.bookmarkNodeToDelete = evt.target.id;
214 cvox.ChromeVoxBookmarksManager.tts.speak(
215 'You are about to delete ' + evt.target.textContent +
216 '\n \n Press delete again to confirm.', 0, null);
217 return false;
218 }
219 }
220 return true;
221 };
222
223 cvox.ChromeVoxBookmarksManager.globalKeyPressHandler = function(evt) {
224 if (cvox.ChromeVoxBookmarksManager.mode == 1) {
225 cvox.ChromeVoxBookmarksManager.updateSearch(evt.charCode);
226 return false;
227 }
228 return true;
229 };
230
231 cvox.ChromeVoxBookmarksManager.globalKeyUpHandler = function(evt) {
232 if (cvox.ChromeVoxBookmarksManager.mode == 1) {
233 if (evt.keyCode == 8) { // Backspace
234 if (cvox.ChromeVoxBookmarksManager.currentSearchString.length > 1) {
235 cvox.ChromeVoxBookmarksManager.currentSearchString =
236 cvox.ChromeVoxBookmarksManager.currentSearchString.substring(0,
237 cvox.ChromeVoxBookmarksManager.currentSearchString.length - 1);
238 } else {
239 cvox.ChromeVoxBookmarksManager.currentSearchString = '';
240 }
241 cvox.ChromeVoxBookmarksManager.updateSearch(null);
242 }
243 return false;
244 }
245 return true;
246 };
247
248 cvox.ChromeVoxBookmarksManager.itemExpand = function(id) {
249 var cssRules = document.styleSheets[0].cssRules;
250 for (var i = 0, rule; rule = cssRules[i]; i++) {
251 if (rule.cssText.indexOf('class_' + id) != -1) {
252 rule.style.setProperty('display', '');
253 }
254 }
255 document.getElementById('indicatorSpan_' + id).innerHTML =
256 cvox.ChromeVoxBookmarksManager.EXPANDED_UNICODE_GRAPHIC;
257 };
258
259 cvox.ChromeVoxBookmarksManager.itemCollapse = function(id) {
260 var cssRules = document.styleSheets[0].cssRules;
261 for (var i = 0, rule; rule = cssRules[i]; i++) {
262 if (rule.cssText.indexOf('class_' + id) != -1) {
263 rule.style.setProperty('display', 'none');
264 }
265 }
266 document.getElementById('indicatorSpan_' + id).innerHTML =
267 cvox.ChromeVoxBookmarksManager.COLLAPSED_UNICODE_GRAPHIC;
268 };
269
270 cvox.ChromeVoxBookmarksManager.expandAll = function() {
271 var cssRules = document.styleSheets[0].cssRules;
272 for (var i = 0, rule; rule = cssRules[i]; i++) {
273 if (rule.style.getPropertyValue('display') == 'none') {
274 rule.style.setProperty('display', '');
275 }
276 }
277 var spans = document.getElementsByTagName('span');
278 for (var i = 0, span; span = spans[i]; i++) {
279 span.innerHTML =
280 cvox.ChromeVoxBookmarksManager.EXPANDED_UNICODE_GRAPHIC;
281 }
282 };
283
284 cvox.ChromeVoxBookmarksManager.collapseAll = function() {
285 var cssRules = document.styleSheets[0].cssRules;
286 for (var i = 0, rule; rule = cssRules[i]; i++) {
287 rule.style.setProperty('display', 'none');
288 }
289 var spans = document.getElementsByTagName('span');
290 for (var i = 0, span; span = spans[i]; i++) {
291 span.innerHTML =
292 cvox.ChromeVoxBookmarksManager.COLLAPSED_UNICODE_GRAPHIC;
293 }
294 };
295
296 cvox.ChromeVoxBookmarksManager.isCollapsed = function(id) {
297 var cssRules = document.styleSheets[0].cssRules;
298 for (var i = 0, rule; rule = cssRules[i]; i++) {
299 if (rule.cssText.indexOf('class_' + id) != -1) {
300 if (rule.style.getPropertyValue('display') == 'none') {
301 return true;
302 } else {
303 return false;
304 }
305 }
306 }
307 return false;
308 };
309
310 cvox.ChromeVoxBookmarksManager.toggleModes = function() {
311 if (cvox.ChromeVoxBookmarksManager.mode == 1) {
312 document.getElementById('bookmarks').style.setProperty('display', '');
313 document.getElementById('search').style.setProperty('display', 'none');
314 cvox.ChromeVoxBookmarksManager.mode = 0;
315 cvox.ChromeVoxBookmarksManager.currentSearchString = '';
316 cvox.ChromeVoxBookmarksManager.currentBookmarkIndex = -1;
317 cvox.ChromeVoxBookmarksManager.tts.speak('Browse mode', 0, null);
318 } else {
319 document.getElementById('bookmarks').style.setProperty('display', 'none');
320 document.getElementById('search').style.setProperty('display', '');
321 cvox.ChromeVoxBookmarksManager.mode = 1;
322 cvox.ChromeVoxBookmarksManager.currentSearchString = '';
323 cvox.ChromeVoxBookmarksManager.tts.speak('Search mode', 0, null);
324 }
325 };
326
327
328
329 cvox.ChromeVoxBookmarksManager.displaySearchResults = function(
330 bmTreeNodeArray) {
331 var htmlStr = '';
332 for (var i = 0, node; node = bmTreeNodeArray[i]; i++) {
333 htmlStr = htmlStr +
334 cvox.ChromeVoxBookmarksManager.treeNodeToHtml(node, 0, '') + '<br>';
335 }
336 document.getElementById('search_results').innerHTML = htmlStr;
337 var linksArray =
338 document.getElementById('search_results').getElementsByTagName('a');
339 if (linksArray.length > 0) {
340 cvox.ChromeVoxBookmarksManager.currentBookmarkIndex = 0;
341 linksArray[0].focus();
342 } else {
343 cvox.ChromeVoxBookmarksManager.tts.speak('No matches found', 0, null);
344 }
345 };
346
347
348 cvox.ChromeVoxBookmarksManager.updateSearch = function(charCode) {
349 if (charCode !== null) {
350 cvox.ChromeVoxBookmarksManager.currentSearchString =
351 cvox.ChromeVoxBookmarksManager.currentSearchString +
352 String.fromCharCode(charCode);
353 }
354 chrome.bookmarks.search(
355 cvox.ChromeVoxBookmarksManager.currentSearchString,
356 cvox.ChromeVoxBookmarksManager.displaySearchResults);
357 document.getElementById('search_message').innerHTML = 'Search results for: ' +
358 cvox.ChromeVoxBookmarksManager.currentSearchString;
359 };
360
361 cvox.ChromeVoxBookmarksManager.nextBookmark = function() {
362 cvox.ChromeVoxBookmarksManager.currentBookmarkIndex++;
363 var bookmarks = document.getElementsByClassName('bookmark');
364 if (cvox.ChromeVoxBookmarksManager.currentBookmarkIndex >
365 bookmarks.length - 1) {
366 // Reached the end of the bookmarks list, time to loop around
367 cvox.ChromeVoxBookmarksManager.currentBookmarkIndex = -1;
368 cvox.ChromeVoxBookmarksManager.earcons.playEarcon(
369 ChromeVoxEarcons.WRAP);
370 return;
371 }
372 var node =
373 bookmarks[cvox.ChromeVoxBookmarksManager.currentBookmarkIndex];
374 while ((cvox.ChromeVoxBookmarksManager.currentBookmarkIndex <
375 bookmarks.length) &&
376 cvox.ChromeVoxBookmarksManager.isInvisible(node)) {
377 cvox.ChromeVoxBookmarksManager.currentBookmarkIndex++;
378 var node =
379 bookmarks[cvox.ChromeVoxBookmarksManager.currentBookmarkIndex];
380 if (!node) {
381 break;
382 }
383 }
384 if (cvox.ChromeVoxBookmarksManager.currentBookmarkIndex >
385 bookmarks.length - 1) {
386 // There were still bookmarks, but they were hidden; time to loop around.
387 cvox.ChromeVoxBookmarksManager.currentBookmarkIndex = -1;
388 cvox.ChromeVoxBookmarksManager.earcons.playEarcon(
389 ChromeVoxEarcons.WRAP);
390 return;
391 }
392
393 bookmarks[cvox.ChromeVoxBookmarksManager.currentBookmarkIndex].focus();
394 };
395
396
397
398 cvox.ChromeVoxBookmarksManager.prevBookmark = function() {
399 cvox.ChromeVoxBookmarksManager.currentBookmarkIndex--;
400 var bookmarks = document.getElementsByClassName('bookmark');
401 if (cvox.ChromeVoxBookmarksManager.currentBookmarkIndex < 0) {
402 // Reached the end of the bookmarks list, time to loop around
403 cvox.ChromeVoxBookmarksManager.currentBookmarkIndex = bookmarks.length;
404 cvox.ChromeVoxBookmarksManager.earcons.playEarcon(
405 ChromeVoxEarcons.WRAP);
406 return;
407 }
408 var node =
409 bookmarks[cvox.ChromeVoxBookmarksManager.currentBookmarkIndex];
410 while ((cvox.ChromeVoxBookmarksManager.currentBookmarkIndex > -1) &&
411 cvox.ChromeVoxBookmarksManager.isInvisible(node)) {
412 cvox.ChromeVoxBookmarksManager.currentBookmarkIndex--;
413 node = bookmarks[cvox.ChromeVoxBookmarksManager.currentBookmarkIndex];
414 if (!node) {
415 break;
416 }
417 }
418 if (cvox.ChromeVoxBookmarksManager.currentBookmarkIndex < 0) {
419 // There were still bookmarks, but they were hidden; time to loop around.
420 cvox.ChromeVoxBookmarksManager.currentBookmarkIndex = bookmarks.length;
421 cvox.ChromeVoxBookmarksManager.earcons.playEarcon(
422 ChromeVoxEarcons.WRAP);
423 return;
424 }
425
426 bookmarks[cvox.ChromeVoxBookmarksManager.currentBookmarkIndex].focus();
427 };
428
429 // Function to determine if a node is being made invisible by having
430 // display set to none.
431 // Note that using getComputedStyle by itself does not work as it
432 // is unreliable in Webkit. It may return that a child is being
433 // displayed when its parent is display:none.
434 cvox.ChromeVoxBookmarksManager.isInvisible = function(node) {
435 var computedStyle = window.getComputedStyle(node, null);
436 if (computedStyle === null) {
437 return false;
438 }
439 while (computedStyle.getPropertyValue('display') != 'none') {
440 node = node.parentNode;
441 if (!node) {
442 return false;
443 }
444 computedStyle = window.getComputedStyle(node, null);
445 if (computedStyle === null) {
446 return false;
447 }
448 }
449 return true;
450 };
451
452
453 cvox.ChromeVoxBookmarksManager.speakerFocusHandler = function(evt) {
454 var target = evt.target;
455 if (target.tagName != 'A') {
456 if (target.parentNode &&
457 cvox.ChromeVoxBookmarksManager.isCollapsed(target.parentNode.id)) {
458 cvox.ChromeVoxBookmarksManager.earcons.playEarcon(
459 ChromeVoxEarcons.COLLAPSED);
460 } else {
461 cvox.ChromeVoxBookmarksManager.earcons.playEarcon(
462 ChromeVoxEarcons.EXPANDED);
463 }
464 } else {
465 cvox.ChromeVoxBookmarksManager.earcons.playEarcon(
466 ChromeVoxEarcons.LINK);
467 }
468 cvox.ChromeVoxBookmarksManager.tts.speak(target.textContent, 0, null);
469 };
470
471 cvox.ChromeVoxBookmarksManager.speakerKeyDownHandler = function(evt) {
472 if (evt.ctrlKey) {
473 cvox.ChromeVoxBookmarksManager.tts.stop();
474 return true;
475 }
476 };
477
478
479 cvox.ChromeVoxBookmarksManager.speakerInit = function() {
480 cvox.ChromeVoxBookmarksManager.tts = new cvox.ChromeVoxTtsBridge();
481 cvox.ChromeVoxBookmarksManager.earcons =
482 new cvox.ChromeVoxEarcons();
483 document.addEventListener(
484 'focus', cvox.ChromeVoxBookmarksManager.speakerFocusHandler, true);
485 document.addEventListener('keydown',
486 cvox.ChromeVoxBookmarksManager.speakerKeyDownHandler, true);
487 };
488
489
490 chrome.bookmarks.getTree(cvox.ChromeVoxBookmarksManager.treeBrowser);
491
492 document.body.addEventListener(
493 'keydown', cvox.ChromeVoxBookmarksManager.globalKeyDownHandler, false);
494 document.body.addEventListener('keypress',
495 cvox.ChromeVoxBookmarksManager.globalKeyPressHandler, false);
496 document.body.addEventListener(
497 'keyup', cvox.ChromeVoxBookmarksManager.globalKeyUpHandler, false);
498
499 window.setTimeout(cvox.ChromeVoxBookmarksManager.speakerInit, 1000);
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698