Index: chrome/common/extensions/docs/examples/extensions/plugin_settings/domui/js/util.js |
diff --git a/chrome/common/extensions/docs/examples/extensions/plugin_settings/domui/js/util.js b/chrome/common/extensions/docs/examples/extensions/plugin_settings/domui/js/util.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..1efbf1907f9ded5739a8ae3976f1971461de5337 |
--- /dev/null |
+++ b/chrome/common/extensions/docs/examples/extensions/plugin_settings/domui/js/util.js |
@@ -0,0 +1,151 @@ |
+// Copyright (c) 2011 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 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} 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); |
+} |
+ |
+/** |
+ * 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 + '")'; |
+} |
+ |
+/** |
+ * Parses query parameters from Location. |
+ * @param {string} s 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. |
+ */ |
+function disableTextSelectAndDrag() { |
+ // Disable text selection. |
+ document.onselectstart = function(e) { |
+ e.preventDefault(); |
+ } |
+ |
+ // Disable dragging. |
+ document.ondragstart = function(e) { |
+ e.preventDefault(); |
+ } |
+} |
+ |
+// 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(); |
+ } |
+ } |
+}); |