| // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| /** |
| * Sets the width (in pixels) on a DOM node. |
| * @param {!HtmlNode} node The node whose width is being set. |
| * @param {number} widthPx The width in pixels. |
| */ |
| function setNodeWidth(node, widthPx) { |
| node.style.width = widthPx.toFixed(0) + 'px'; |
| } |
| |
| /** |
| * Sets the height (in pixels) on a DOM node. |
| * @param {!HtmlNode} node The node whose height is being set. |
| * @param {number} heightPx The height in pixels. |
| */ |
| function setNodeHeight(node, heightPx) { |
| node.style.height = heightPx.toFixed(0) + 'px'; |
| } |
| |
| /** |
| * Sets the position and size of a DOM node (in pixels). |
| * @param {!HtmlNode} node The node being positioned. |
| * @param {number} leftPx The left position in pixels. |
| * @param {number} topPx The top position in pixels. |
| * @param {number} widthPx The width in pixels. |
| * @param {number} heightPx The height in pixels. |
| */ |
| function setNodePosition(node, leftPx, topPx, widthPx, heightPx) { |
| node.style.left = leftPx.toFixed(0) + 'px'; |
| node.style.top = topPx.toFixed(0) + 'px'; |
| setNodeWidth(node, widthPx); |
| setNodeHeight(node, heightPx); |
| } |
| |
| /** |
| * Sets the visibility for a DOM node. |
| * @param {!HtmlNode} node The node being positioned. |
| * @param {boolean} isVisible Whether to show the node or not. |
| */ |
| function setNodeDisplay(node, isVisible) { |
| node.style.display = isVisible ? '' : 'none'; |
| } |
| |
| /** |
| * Toggles the visibility of a DOM node. |
| * @param {!HtmlNode} node The node to show or hide. |
| */ |
| function toggleNodeDisplay(node) { |
| setNodeDisplay(node, !getNodeDisplay(node)); |
| } |
| |
| /** |
| * Returns the visibility of a DOM node. |
| * @param {!HtmlNode} node The node to query. |
| */ |
| function getNodeDisplay(node) { |
| return node.style.display != 'none'; |
| } |
| |
| /** |
| * Adds a node to |parentNode|, of type |tagName|. |
| * @param {!HtmlNode} parentNode The node that will be the parent of the new |
| * element. |
| * @param {string} tagName the tag name of the new element. |
| * @return {!HtmlElement} The newly created element. |
| */ |
| function addNode(parentNode, tagName) { |
| var elem = parentNode.ownerDocument.createElement(tagName); |
| parentNode.appendChild(elem); |
| return elem; |
| } |
| |
| /** |
| * Adds |text| to node |parentNode|. |
| * @param {!HtmlNode} parentNode The node to add text to. |
| * @param {string} text The text to be added. |
| * @return {!Object} The newly created text node. |
| */ |
| function addTextNode(parentNode, text) { |
| var textNode = parentNode.ownerDocument.createTextNode(text); |
| parentNode.appendChild(textNode); |
| return textNode; |
| } |
| |
| /** |
| * Adds a node to |parentNode|, of type |tagName|. Then adds |
| * |text| to the new node. |
| * @param {!HtmlNode} parentNode The node that will be the parent of the new |
| * element. |
| * @param {string} tagName the tag name of the new element. |
| * @param {string} text The text to be added. |
| * @return {!HtmlElement} The newly created element. |
| */ |
| function addNodeWithText(parentNode, tagName, text) { |
| var elem = parentNode.ownerDocument.createElement(tagName); |
| parentNode.appendChild(elem); |
| addTextNode(elem, text); |
| return elem; |
| } |
| |
| /** |
| * Returns the key such that map[key] == value, or the string '?' if |
| * there is no such key. |
| * @param {!Object} map The object being used as a lookup table. |
| * @param {Object} value The value to be found in |map|. |
| * @return {string} The key for |value|, or '?' if there is no such key. |
| */ |
| function getKeyWithValue(map, value) { |
| for (var key in map) { |
| if (map[key] == value) |
| return key; |
| } |
| return '?'; |
| } |
| |
| /** |
| * Returns a new map with the keys and values of the input map inverted. |
| * @param {!Object} map The object to have its keys and values reversed. Not |
| * modified by the function call. |
| * @return {Object} The new map with the reversed keys and values. |
| */ |
| function makeInverseMap(map) { |
| var reversed = {}; |
| for (var key in map) |
| reversed[map[key]] = key; |
| return reversed; |
| } |
| |
| /** |
| * Looks up |key| in |map|, and returns the resulting entry, if there is one. |
| * Otherwise, returns |key|. Intended primarily for use with incomplete |
| * tables, and for reasonable behavior with system enumerations that may be |
| * extended in the future. |
| * @param {!Object} map The table in which |key| is looked up. |
| * @param {string} key The key to look up. |
| * @return {Object|string} map[key], if it exists, or |key| if it doesn't. |
| */ |
| function tryGetValueWithKey(map, key) { |
| if (key in map) |
| return map[key]; |
| return key; |
| } |
| |
| /** |
| * Builds a string by repeating |str| |count| times. |
| * @param {string} str The string to be repeated. |
| * @param {number} count The number of times to repeat |str|. |
| * @return {string} The constructed string |
| */ |
| function makeRepeatedString(str, count) { |
| var out = []; |
| for (var i = 0; i < count; ++i) |
| out.push(str); |
| return out.join(''); |
| } |
| |
| /** |
| * Clones a basic POD object. Only a new top level object will be cloned. It |
| * will continue to reference the same values as the original object. |
| * @param {Object} object The object to be cloned. |
| * @return {Object} A copy of |object|. |
| */ |
| function shallowCloneObject(object) { |
| if (!(object instanceof Object)) |
| return object; |
| var copy = {}; |
| for (var key in object) { |
| copy[key] = object[key]; |
| } |
| return copy; |
| } |
| |
| /** |
| * Helper to make sure singleton classes are not instantiated more than once. |
| * @param {Function} ctor The constructor function being checked. |
| */ |
| function assertFirstConstructorCall(ctor) { |
| // This is the variable which is set by cr.addSingletonGetter(). |
| if (ctor.hasCreateFirstInstance_) { |
| throw Error( |
| 'The class ' + ctor.name + ' is a singleton, and should ' + |
| 'only be accessed using ' + ctor.name + '.getInstance().'); |
| } |
| ctor.hasCreateFirstInstance_ = true; |
| } |
| |
| function hasTouchScreen() { |
| return 'ontouchstart' in window; |
| } |