1// Copyright (c) 2012 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 * Sets the width (in pixels) on a DOM node. 7 * @param {!HtmlNode} node The node whose width is being set. 8 * @param {number} widthPx The width in pixels. 9 */ 10function setNodeWidth(node, widthPx) { 11 node.style.width = widthPx.toFixed(0) + 'px'; 12} 13 14/** 15 * Sets the height (in pixels) on a DOM node. 16 * @param {!HtmlNode} node The node whose height is being set. 17 * @param {number} heightPx The height in pixels. 18 */ 19function setNodeHeight(node, heightPx) { 20 node.style.height = heightPx.toFixed(0) + 'px'; 21} 22 23/** 24 * Sets the position and size of a DOM node (in pixels). 25 * @param {!HtmlNode} node The node being positioned. 26 * @param {number} leftPx The left position in pixels. 27 * @param {number} topPx The top position in pixels. 28 * @param {number} widthPx The width in pixels. 29 * @param {number} heightPx The height in pixels. 30 */ 31function setNodePosition(node, leftPx, topPx, widthPx, heightPx) { 32 node.style.left = leftPx.toFixed(0) + 'px'; 33 node.style.top = topPx.toFixed(0) + 'px'; 34 setNodeWidth(node, widthPx); 35 setNodeHeight(node, heightPx); 36} 37 38/** 39 * Sets the visibility for a DOM node. 40 * @param {!HtmlNode} node The node being positioned. 41 * @param {boolean} isVisible Whether to show the node or not. 42 */ 43function setNodeDisplay(node, isVisible) { 44 node.style.display = isVisible ? '' : 'none'; 45} 46 47/** 48 * Adds a node to |parentNode|, of type |tagName|. 49 * @param {!HtmlNode} parentNode The node that will be the parent of the new 50 * element. 51 * @param {string} tagName the tag name of the new element. 52 * @return {!HtmlElement} The newly created element. 53 */ 54function addNode(parentNode, tagName) { 55 var elem = parentNode.ownerDocument.createElement(tagName); 56 parentNode.appendChild(elem); 57 return elem; 58} 59 60/** 61 * Adds |text| to node |parentNode|. 62 * @param {!HtmlNode} parentNode The node to add text to. 63 * @param {string} text The text to be added. 64 * @return {!Object} The newly created text node. 65 */ 66function addTextNode(parentNode, text) { 67 var textNode = parentNode.ownerDocument.createTextNode(text); 68 parentNode.appendChild(textNode); 69 return textNode; 70} 71 72/** 73 * Adds a node to |parentNode|, of type |tagName|. Then adds 74 * |text| to the new node. 75 * @param {!HtmlNode} parentNode The node that will be the parent of the new 76 * element. 77 * @param {string} tagName the tag name of the new element. 78 * @param {string} text The text to be added. 79 * @return {!HtmlElement} The newly created element. 80 */ 81function addNodeWithText(parentNode, tagName, text) { 82 var elem = parentNode.ownerDocument.createElement(tagName); 83 parentNode.appendChild(elem); 84 addTextNode(elem, text); 85 return elem; 86} 87 88/** 89 * Returns the key such that map[key] == value, or the string '?' if 90 * there is no such key. 91 * @param {!Object} map The object being used as a lookup table. 92 * @param {Object} value The value to be found in |map|. 93 * @return {string} The key for |value|, or '?' if there is no such key. 94 */ 95function getKeyWithValue(map, value) { 96 for (var key in map) { 97 if (map[key] == value) 98 return key; 99 } 100 return '?'; 101} 102 103/** 104 * Returns a new map with the keys and values of the input map inverted. 105 * @param {!Object} map The object to have its keys and values reversed. Not 106 * modified by the function call. 107 * @return {Object} The new map with the reversed keys and values. 108 */ 109function makeInverseMap(map) { 110 var reversed = {}; 111 for (var key in map) 112 reversed[map[key]] = key; 113 return reversed; 114} 115 116/** 117 * Looks up |key| in |map|, and returns the resulting entry, if there is one. 118 * Otherwise, returns |key|. Intended primarily for use with incomplete 119 * tables, and for reasonable behavior with system enumerations that may be 120 * extended in the future. 121 * @param {!Object} map The table in which |key| is looked up. 122 * @param {string} key The key to look up. 123 * @return {Object|string} map[key], if it exists, or |key| if it doesn't. 124 */ 125function tryGetValueWithKey(map, key) { 126 if (key in map) 127 return map[key]; 128 return key; 129} 130 131/** 132 * Builds a string by repeating |str| |count| times. 133 * @param {string} str The string to be repeated. 134 * @param {number} count The number of times to repeat |str|. 135 * @return {string} The constructed string 136 */ 137function makeRepeatedString(str, count) { 138 var out = []; 139 for (var i = 0; i < count; ++i) 140 out.push(str); 141 return out.join(''); 142} 143 144/** 145 * Clones a basic POD object. Only a new top level object will be cloned. It 146 * will continue to reference the same values as the original object. 147 * @param {Object} object The object to be cloned. 148 * @return {Object} A copy of |object|. 149 */ 150function shallowCloneObject(object) { 151 if (!(object instanceof Object)) 152 return object; 153 var copy = {}; 154 for (var key in object) { 155 copy[key] = object[key]; 156 } 157 return copy; 158} 159 160/** 161 * Helper to make sure singleton classes are not instantiated more than once. 162 * @param {Function} ctor The constructor function being checked. 163 */ 164function assertFirstConstructorCall(ctor) { 165 // This is the variable which is set by cr.addSingletonGetter(). 166 if (ctor.hasCreateFirstInstance_) { 167 throw Error('The class ' + ctor.name + ' is a singleton, and should ' + 168 'only be accessed using ' + ctor.name + '.getInstance().'); 169 } 170 ctor.hasCreateFirstInstance_ = true; 171} 172 173function hasTouchScreen() { 174 return 'ontouchstart' in window; 175} 176