| OLD | NEW |
| (Empty) |
| 1 // Copyright 2014 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 /** | |
| 6 * @fileoverview Shared util methods between api.js and api_implementation.js | |
| 7 * for doing common tasks such as passing node references between page script | |
| 8 * and ChromeVox. | |
| 9 */ | |
| 10 | |
| 11 if (typeof(goog) != 'undefined' && goog.provide){ | |
| 12 goog.provide('cvox.ApiUtil'); | |
| 13 } | |
| 14 | |
| 15 | |
| 16 if (!window['cvox']) { | |
| 17 window['cvox'] = {}; | |
| 18 } | |
| 19 | |
| 20 /** | |
| 21 * @constructor | |
| 22 */ | |
| 23 cvox.ApiUtils = function() { | |
| 24 }; | |
| 25 | |
| 26 /** | |
| 27 * The next id to use for the cvoxid attribute that we add to elements | |
| 28 * in order to be able to find them from the content script. | |
| 29 * @type {number} | |
| 30 */ | |
| 31 cvox.ApiUtils.nextCvoxId_ = 1; | |
| 32 | |
| 33 /** | |
| 34 * Makes a serializable reference to a node. | |
| 35 * If the node or its parent has an ID, reference it directly. Otherwise, | |
| 36 * add a temporary cvoxid attribute. This has a corresponding method in | |
| 37 * api_implementation.js to decode this and return a node. | |
| 38 * @param {Node} targetNode The node to reference. | |
| 39 * @return {Object} A serializable node reference. | |
| 40 */ | |
| 41 cvox.ApiUtils.makeNodeReference = function(targetNode) { | |
| 42 if (targetNode.id && document.getElementById(targetNode.id) == targetNode) { | |
| 43 return {'id': targetNode.id}; | |
| 44 } else if (targetNode instanceof HTMLElement) { | |
| 45 var cvoxid = cvox.ApiUtils.nextCvoxId_; | |
| 46 targetNode.setAttribute('cvoxid', cvoxid); | |
| 47 cvox.ApiUtils.nextCvoxId_ = (cvox.ApiUtils.nextCvoxId_ + 1) % 100; | |
| 48 return {'cvoxid': cvoxid}; | |
| 49 } else if (targetNode.parentElement) { | |
| 50 var parent = targetNode.parentElement; | |
| 51 var childIndex = -1; | |
| 52 for (var i = 0; i < parent.childNodes.length; i++) { | |
| 53 if (parent.childNodes[i] == targetNode) { | |
| 54 childIndex = i; | |
| 55 break; | |
| 56 } | |
| 57 } | |
| 58 if (childIndex >= 0) { | |
| 59 var cvoxid = cvox.ApiUtils.nextCvoxId_; | |
| 60 parent.setAttribute('cvoxid', cvoxid); | |
| 61 cvox.ApiUtils.nextCvoxId_ = (cvox.ApiUtils.nextCvoxId_ + 1) % 100; | |
| 62 return {'cvoxid': cvoxid, 'childIndex': childIndex}; | |
| 63 } | |
| 64 } | |
| 65 throw 'Cannot reference node: ' + targetNode; | |
| 66 }; | |
| 67 | |
| 68 /** | |
| 69 * Retrieves a node from its serializable node reference. | |
| 70 * | |
| 71 * @param {Object} nodeRef A serializable reference to a node. | |
| 72 * @return {Node} The node on the page that this object refers to. | |
| 73 */ | |
| 74 cvox.ApiUtils.getNodeFromRef = function(nodeRef) { | |
| 75 if (nodeRef['id']) { | |
| 76 return document.getElementById(nodeRef['id']); | |
| 77 } else if (nodeRef['cvoxid']) { | |
| 78 var selector = '*[cvoxid="' + nodeRef['cvoxid'] + '"]'; | |
| 79 var element = document.querySelector(selector); | |
| 80 if (element && element.removeAttribute) { | |
| 81 element.removeAttribute('cvoxid'); | |
| 82 } | |
| 83 if (nodeRef['childIndex'] != null) { | |
| 84 return element.childNodes[nodeRef['childIndex']]; | |
| 85 } else { | |
| 86 return element; | |
| 87 } | |
| 88 } | |
| 89 throw 'Bad node reference: ' + cvox.ChromeVoxJSON.stringify(nodeRef); | |
| 90 }; | |
| OLD | NEW |