Index: chrome/browser/resources/shared/js/util.js |
=================================================================== |
--- chrome/browser/resources/shared/js/util.js (revision 177292) |
+++ chrome/browser/resources/shared/js/util.js (working copy) |
@@ -1,321 +0,0 @@ |
-// 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. |
- |
-/** |
- * The global object. |
- * @type {!Object} |
- * @const |
- */ |
-var global = this; |
- |
-/** |
- * Alias for document.getElementById. |
- * @param {string} id The ID of the element to find. |
- * @return {HTMLElement} The found element or null if not found. |
- */ |
-function $(id) { |
- return document.getElementById(id); |
-} |
- |
-/** |
- * Calls chrome.send with a callback and restores the original afterwards. |
- * @param {string} name The name of the message to send. |
- * @param {!Array} params The parameters to send. |
- * @param {string} callbackName The name of the function that the backend calls. |
- * @param {!Function} callback The function to call. |
- */ |
-function chromeSend(name, params, callbackName, callback) { |
- var old = global[callbackName]; |
- global[callbackName] = function() { |
- // restore |
- global[callbackName] = old; |
- |
- var args = Array.prototype.slice.call(arguments); |
- return callback.apply(global, args); |
- }; |
- chrome.send(name, params); |
-} |
- |
-/** |
- * Returns the scale factors supported by this platform. |
- * @return {array} The supported scale factors. |
- */ |
-function getSupportedScaleFactors() { |
- var supportedScaleFactors = []; |
- if (cr.isMac || cr.isChromeOS) { |
- supportedScaleFactors.push(1); |
- supportedScaleFactors.push(2); |
- } else { |
- // Windows must be restarted to display at a different scale factor. |
- supportedScaleFactors.push(window.devicePixelRatio); |
- } |
- return supportedScaleFactors; |
-} |
- |
-/** |
- * Generates a CSS url string. |
- * @param {string} s The URL to generate the CSS url for. |
- * @return {string} The CSS url string. |
- */ |
-function url(s) { |
- // http://www.w3.org/TR/css3-values/#uris |
- // Parentheses, commas, whitespace characters, single quotes (') and double |
- // quotes (") appearing in a URI must be escaped with a backslash |
- var s2 = s.replace(/(\(|\)|\,|\s|\'|\"|\\)/g, '\\$1'); |
- // WebKit has a bug when it comes to URLs that end with \ |
- // https://bugs.webkit.org/show_bug.cgi?id=28885 |
- if (/\\\\$/.test(s2)) { |
- // Add a space to work around the WebKit bug. |
- s2 += ' '; |
- } |
- return 'url("' + s2 + '")'; |
-} |
- |
-/** |
- * Generates a CSS -webkit-image-set for a chrome:// url. |
- * An entry in the image set is added for each of getSupportedScaleFactors(). |
- * The scale-factor-specific url is generated by replacing the first instance of |
- * 'scalefactor' in |path| with the numeric scale factor. |
- * @param {string} path The URL to generate an image set for. |
- * 'scalefactor' should be a substring of |path|. |
- * @return {string} The CSS -webkit-image-set. |
- */ |
-function imageset(path) { |
- var supportedScaleFactors = getSupportedScaleFactors(); |
- |
- var replaceStartIndex = path.indexOf('scalefactor'); |
- if (replaceStartIndex < 0) |
- return url(path); |
- |
- var s = ''; |
- for (var i = 0; i < supportedScaleFactors.length; ++i) { |
- var scaleFactor = supportedScaleFactors[i]; |
- var pathWithScaleFactor = path.substr(0, replaceStartIndex) + scaleFactor + |
- path.substr(replaceStartIndex + 'scalefactor'.length); |
- |
- s += url(pathWithScaleFactor) + ' ' + scaleFactor + 'x'; |
- |
- if (i != supportedScaleFactors.length - 1) |
- s += ', '; |
- } |
- return '-webkit-image-set(' + s + ')'; |
-} |
- |
-/** |
- * Parses query parameters from Location. |
- * @param {string} location The URL to generate the CSS url for. |
- * @return {object} Dictionary containing name value pairs for URL |
- */ |
-function parseQueryParams(location) { |
- var params = {}; |
- var query = unescape(location.search.substring(1)); |
- var vars = query.split('&'); |
- for (var i = 0; i < vars.length; i++) { |
- var pair = vars[i].split('='); |
- params[pair[0]] = pair[1]; |
- } |
- return params; |
-} |
- |
-function findAncestorByClass(el, className) { |
- return findAncestor(el, function(el) { |
- if (el.classList) |
- return el.classList.contains(className); |
- return null; |
- }); |
-} |
- |
-/** |
- * Return the first ancestor for which the {@code predicate} returns true. |
- * @param {Node} node The node to check. |
- * @param {function(Node) : boolean} predicate The function that tests the |
- * nodes. |
- * @return {Node} The found ancestor or null if not found. |
- */ |
-function findAncestor(node, predicate) { |
- var last = false; |
- while (node != null && !(last = predicate(node))) { |
- node = node.parentNode; |
- } |
- return last ? node : null; |
-} |
- |
-function swapDomNodes(a, b) { |
- var afterA = a.nextSibling; |
- if (afterA == b) { |
- swapDomNodes(b, a); |
- return; |
- } |
- var aParent = a.parentNode; |
- b.parentNode.replaceChild(a, b); |
- aParent.insertBefore(b, afterA); |
-} |
- |
-/** |
- * Disables text selection and dragging, with optional whitelist callbacks. |
- * @param {function(Event):boolean=} opt_allowSelectStart Unless this function |
- * is defined and returns true, the onselectionstart event will be |
- * surpressed. |
- * @param {function(Event):boolean=} opt_allowDragStart Unless this function |
- * is defined and returns true, the ondragstart event will be surpressed. |
- */ |
-function disableTextSelectAndDrag(opt_allowSelectStart, opt_allowDragStart) { |
- // Disable text selection. |
- document.onselectstart = function(e) { |
- if (!(opt_allowSelectStart && opt_allowSelectStart.call(this, e))) |
- e.preventDefault(); |
- }; |
- |
- // Disable dragging. |
- document.ondragstart = function(e) { |
- if (!(opt_allowDragStart && opt_allowDragStart.call(this, e))) |
- e.preventDefault(); |
- }; |
-} |
- |
-/** |
- * Call this to stop clicks on <a href="#"> links from scrolling to the top of |
- * the page (and possibly showing a # in the link). |
- */ |
-function preventDefaultOnPoundLinkClicks() { |
- document.addEventListener('click', function(e) { |
- var anchor = findAncestor(e.target, function(el) { |
- return el.tagName == 'A'; |
- }); |
- // Use getAttribute() to prevent URL normalization. |
- if (anchor && anchor.getAttribute('href') == '#') |
- e.preventDefault(); |
- }); |
-} |
- |
-/** |
- * Check the directionality of the page. |
- * @return {boolean} True if Chrome is running an RTL UI. |
- */ |
-function isRTL() { |
- return document.documentElement.dir == 'rtl'; |
-} |
- |
-/** |
- * Simple common assertion API |
- * @param {*} condition The condition to test. Note that this may be used to |
- * test whether a value is defined or not, and we don't want to force a |
- * cast to Boolean. |
- * @param {string=} opt_message A message to use in any error. |
- */ |
-function assert(condition, opt_message) { |
- 'use strict'; |
- if (!condition) { |
- var msg = 'Assertion failed'; |
- if (opt_message) |
- msg = msg + ': ' + opt_message; |
- throw new Error(msg); |
- } |
-} |
- |
-/** |
- * Get an element that's known to exist by its ID. We use this instead of just |
- * calling getElementById and not checking the result because this lets us |
- * satisfy the JSCompiler type system. |
- * @param {string} id The identifier name. |
- * @return {!Element} the Element. |
- */ |
-function getRequiredElement(id) { |
- var element = $(id); |
- assert(element, 'Missing required element: ' + id); |
- return element; |
-} |
- |
-// Handle click on a link. If the link points to a chrome: or file: url, then |
-// call into the browser to do the navigation. |
-document.addEventListener('click', function(e) { |
- // Allow preventDefault to work. |
- if (!e.returnValue) |
- return; |
- |
- var el = e.target; |
- if (el.nodeType == Node.ELEMENT_NODE && |
- el.webkitMatchesSelector('A, A *')) { |
- while (el.tagName != 'A') { |
- el = el.parentElement; |
- } |
- |
- if ((el.protocol == 'file:' || el.protocol == 'about:') && |
- (e.button == 0 || e.button == 1)) { |
- chrome.send('navigateToUrl', [ |
- el.href, |
- el.target, |
- e.button, |
- e.altKey, |
- e.ctrlKey, |
- e.metaKey, |
- e.shiftKey |
- ]); |
- e.preventDefault(); |
- } |
- } |
-}); |
- |
-/** |
- * Creates a new URL which is the old URL with a GET param of key=value. |
- * @param {string} url The base URL. There is not sanity checking on the URL so |
- * it must be passed in a proper format. |
- * @param {string} key The key of the param. |
- * @param {string} value The value of the param. |
- * @return {string} The new URL. |
- */ |
-function appendParam(url, key, value) { |
- var param = encodeURIComponent(key) + '=' + encodeURIComponent(value); |
- |
- if (url.indexOf('?') == -1) |
- return url + '?' + param; |
- return url + '&' + param; |
-} |
- |
-/** |
- * Creates a CSS -webkit-image-set for a favicon request. |
- * @param {string} url The url for the favicon. |
- * @param {number=} opt_size Optional preferred size of the favicon. |
- * @param {boolean=} opt_sessionFavicon Optional flag to indicate if |
- * requesting a session favicon. |
- * @return {string} -webkit-image-set for the favicon. |
- */ |
-function getFaviconImageSet(url, opt_size, opt_sessionFavicon) { |
- var size = opt_size || 16; |
- var type = opt_sessionFavicon ? 'session-favicon' : 'favicon'; |
- return imageset( |
- 'chrome://' + type + '/size/' + size + '@scalefactorx/' + url); |
-} |
- |
-/** |
- * Creates a new URL for a favicon request for the current device pixel ratio. |
- * The URL must be updated when the user moves the browser to a screen with a |
- * different device pixel ratio. Use getFaviconImageSet() for the updating to |
- * occur automatically. |
- * @param {string} url The url for the favicon. |
- * @param {number=} opt_size Optional preferred size of the favicon. |
- * @param {boolean=} opt_sessionFavicon Optional flag to indicate if |
- * requesting a session favicon. |
- * @return {string} Updated URL for the favicon. |
- */ |
-function getFaviconUrlForCurrentDevicePixelRatio(url, |
- opt_size, |
- opt_sessionFavicon) { |
- var size = opt_size || 16; |
- var type = opt_sessionFavicon ? 'session-favicon' : 'favicon'; |
- return 'chrome://' + type + '/size/' + size + '@' + |
- window.devicePixelRatio + 'x/' + url; |
-} |
- |
-/** |
- * Creates an element of a specified type with a specified class name. |
- * @param {string} type The node type. |
- * @param {string} className The class name to use. |
- * @return {Element} The created element. |
- */ |
-function createElementWithClassName(type, className) { |
- var elm = document.createElement(type); |
- elm.className = className; |
- return elm; |
-} |