// 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'; } /** * 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; }