aboutsummaryrefslogtreecommitdiff
path: root/contexts/data/lib/closure-library/closure/goog/debug/debug.js
diff options
context:
space:
mode:
Diffstat (limited to 'contexts/data/lib/closure-library/closure/goog/debug/debug.js')
-rw-r--r--contexts/data/lib/closure-library/closure/goog/debug/debug.js492
1 files changed, 0 insertions, 492 deletions
diff --git a/contexts/data/lib/closure-library/closure/goog/debug/debug.js b/contexts/data/lib/closure-library/closure/goog/debug/debug.js
deleted file mode 100644
index 384fb91..0000000
--- a/contexts/data/lib/closure-library/closure/goog/debug/debug.js
+++ /dev/null
@@ -1,492 +0,0 @@
-// Copyright 2006 The Closure Library Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS-IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-/**
- * @fileoverview Logging and debugging utilities.
- *
- * @see ../demos/debug.html
- */
-
-goog.provide('goog.debug');
-
-goog.require('goog.array');
-goog.require('goog.string');
-goog.require('goog.structs.Set');
-goog.require('goog.userAgent');
-
-
-/**
- * Catches onerror events fired by windows and similar objects.
- * @param {function(Object)} logFunc The function to call with the error
- * information.
- * @param {boolean=} opt_cancel Whether to stop the error from reaching the
- * browser.
- * @param {Object=} opt_target Object that fires onerror events.
- */
-goog.debug.catchErrors = function(logFunc, opt_cancel, opt_target) {
- var target = opt_target || goog.global;
- var oldErrorHandler = target.onerror;
- var retVal = !!opt_cancel;
-
- // Chrome interprets onerror return value backwards (http://crbug.com/92062)
- // until it was fixed in webkit revision r94061 (Webkit 535.3). This
- // workaround still needs to be skipped in Safari after the webkit change
- // gets pushed out in Safari.
- // See https://bugs.webkit.org/show_bug.cgi?id=67119
- if (goog.userAgent.WEBKIT && !goog.userAgent.isVersion('535.3')) {
- retVal = !retVal;
- }
- target.onerror = function(message, url, line) {
- if (oldErrorHandler) {
- oldErrorHandler(message, url, line);
- }
- logFunc({
- message: message,
- fileName: url,
- line: line
- });
- return retVal;
- };
-};
-
-
-/**
- * Creates a string representing an object and all its properties.
- * @param {Object|null|undefined} obj Object to expose.
- * @param {boolean=} opt_showFn Show the functions as well as the properties,
- * default is false.
- * @return {string} The string representation of {@code obj}.
- */
-goog.debug.expose = function(obj, opt_showFn) {
- if (typeof obj == 'undefined') {
- return 'undefined';
- }
- if (obj == null) {
- return 'NULL';
- }
- var str = [];
-
- for (var x in obj) {
- if (!opt_showFn && goog.isFunction(obj[x])) {
- continue;
- }
- var s = x + ' = ';
- /** @preserveTry */
- try {
- s += obj[x];
- } catch (e) {
- s += '*** ' + e + ' ***';
- }
- str.push(s);
- }
- return str.join('\n');
-};
-
-
-/**
- * Creates a string representing a given primitive or object, and for an
- * object, all its properties and nested objects. WARNING: If an object is
- * given, it and all its nested objects will be modified. To detect reference
- * cycles, this method identifies objects using goog.getUid() which mutates the
- * object.
- * @param {*} obj Object to expose.
- * @param {boolean=} opt_showFn Also show properties that are functions (by
- * default, functions are omitted).
- * @return {string} A string representation of {@code obj}.
- */
-goog.debug.deepExpose = function(obj, opt_showFn) {
- var previous = new goog.structs.Set();
- var str = [];
-
- var helper = function(obj, space) {
- var nestspace = space + ' ';
-
- var indentMultiline = function(str) {
- return str.replace(/\n/g, '\n' + space);
- };
-
- /** @preserveTry */
- try {
- if (!goog.isDef(obj)) {
- str.push('undefined');
- } else if (goog.isNull(obj)) {
- str.push('NULL');
- } else if (goog.isString(obj)) {
- str.push('"' + indentMultiline(obj) + '"');
- } else if (goog.isFunction(obj)) {
- str.push(indentMultiline(String(obj)));
- } else if (goog.isObject(obj)) {
- if (previous.contains(obj)) {
- // TODO(user): This is a bug; it falsely detects non-loops as loops
- // when the reference tree contains two references to the same object.
- str.push('*** reference loop detected ***');
- } else {
- previous.add(obj);
- str.push('{');
- for (var x in obj) {
- if (!opt_showFn && goog.isFunction(obj[x])) {
- continue;
- }
- str.push('\n');
- str.push(nestspace);
- str.push(x + ' = ');
- helper(obj[x], nestspace);
- }
- str.push('\n' + space + '}');
- }
- } else {
- str.push(obj);
- }
- } catch (e) {
- str.push('*** ' + e + ' ***');
- }
- };
-
- helper(obj, '');
- return str.join('');
-};
-
-
-/**
- * Recursively outputs a nested array as a string.
- * @param {Array} arr The array.
- * @return {string} String representing nested array.
- */
-goog.debug.exposeArray = function(arr) {
- var str = [];
- for (var i = 0; i < arr.length; i++) {
- if (goog.isArray(arr[i])) {
- str.push(goog.debug.exposeArray(arr[i]));
- } else {
- str.push(arr[i]);
- }
- }
- return '[ ' + str.join(', ') + ' ]';
-};
-
-
-/**
- * Exposes an exception that has been caught by a try...catch and outputs the
- * error with a stack trace.
- * @param {Object} err Error object or string.
- * @param {Function=} opt_fn Optional function to start stack trace from.
- * @return {string} Details of exception.
- */
-goog.debug.exposeException = function(err, opt_fn) {
- /** @preserveTry */
- try {
- var e = goog.debug.normalizeErrorObject(err);
-
- // Create the error message
- var error = 'Message: ' + goog.string.htmlEscape(e.message) +
- '\nUrl: <a href="view-source:' + e.fileName + '" target="_new">' +
- e.fileName + '</a>\nLine: ' + e.lineNumber + '\n\nBrowser stack:\n' +
- goog.string.htmlEscape(e.stack + '-> ') +
- '[end]\n\nJS stack traversal:\n' + goog.string.htmlEscape(
- goog.debug.getStacktrace(opt_fn) + '-> ');
- return error;
- } catch (e2) {
- return 'Exception trying to expose exception! You win, we lose. ' + e2;
- }
-};
-
-
-/**
- * Normalizes the error/exception object between browsers.
- * @param {Object} err Raw error object.
- * @return {Object} Normalized error object.
- */
-goog.debug.normalizeErrorObject = function(err) {
- var href = goog.getObjectByName('window.location.href');
- if (goog.isString(err)) {
- return {
- 'message': err,
- 'name': 'Unknown error',
- 'lineNumber': 'Not available',
- 'fileName': href,
- 'stack': 'Not available'
- };
- }
-
- var lineNumber, fileName;
- var threwError = false;
-
- try {
- lineNumber = err.lineNumber || err.line || 'Not available';
- } catch (e) {
- // Firefox 2 sometimes throws an error when accessing 'lineNumber':
- // Message: Permission denied to get property UnnamedClass.lineNumber
- lineNumber = 'Not available';
- threwError = true;
- }
-
- try {
- fileName = err.fileName || err.filename || err.sourceURL || href;
- } catch (e) {
- // Firefox 2 may also throw an error when accessing 'filename'.
- fileName = 'Not available';
- threwError = true;
- }
-
- // The IE Error object contains only the name and the message.
- // The Safari Error object uses the line and sourceURL fields.
- if (threwError || !err.lineNumber || !err.fileName || !err.stack) {
- return {
- 'message': err.message,
- 'name': err.name,
- 'lineNumber': lineNumber,
- 'fileName': fileName,
- 'stack': err.stack || 'Not available'
- };
- }
-
- // Standards error object
- return err;
-};
-
-
-/**
- * Converts an object to an Error if it's a String,
- * adds a stacktrace if there isn't one,
- * and optionally adds an extra message.
- * @param {Error|string} err the original thrown object or string.
- * @param {string=} opt_message optional additional message to add to the
- * error.
- * @return {Error} If err is a string, it is used to create a new Error,
- * which is enhanced and returned. Otherwise err itself is enhanced
- * and returned.
- */
-goog.debug.enhanceError = function(err, opt_message) {
- var error = typeof err == 'string' ? Error(err) : err;
- if (!error.stack) {
- error.stack = goog.debug.getStacktrace(arguments.callee.caller);
- }
- if (opt_message) {
- // find the first unoccupied 'messageX' property
- var x = 0;
- while (error['message' + x]) {
- ++x;
- }
- error['message' + x] = String(opt_message);
- }
- return error;
-};
-
-
-/**
- * Gets the current stack trace. Simple and iterative - doesn't worry about
- * catching circular references or getting the args.
- * @param {number=} opt_depth Optional maximum depth to trace back to.
- * @return {string} A string with the function names of all functions in the
- * stack, separated by \n.
- */
-goog.debug.getStacktraceSimple = function(opt_depth) {
- var sb = [];
- var fn = arguments.callee.caller;
- var depth = 0;
-
- while (fn && (!opt_depth || depth < opt_depth)) {
- sb.push(goog.debug.getFunctionName(fn));
- sb.push('()\n');
- /** @preserveTry */
- try {
- fn = fn.caller;
- } catch (e) {
- sb.push('[exception trying to get caller]\n');
- break;
- }
- depth++;
- if (depth >= goog.debug.MAX_STACK_DEPTH) {
- sb.push('[...long stack...]');
- break;
- }
- }
- if (opt_depth && depth >= opt_depth) {
- sb.push('[...reached max depth limit...]');
- } else {
- sb.push('[end]');
- }
-
- return sb.join('');
-};
-
-
-/**
- * Max length of stack to try and output
- * @type {number}
- */
-goog.debug.MAX_STACK_DEPTH = 50;
-
-
-/**
- * Gets the current stack trace, either starting from the caller or starting
- * from a specified function that's currently on the call stack.
- * @param {Function=} opt_fn Optional function to start getting the trace from.
- * If not provided, defaults to the function that called this.
- * @return {string} Stack trace.
- */
-goog.debug.getStacktrace = function(opt_fn) {
- return goog.debug.getStacktraceHelper_(opt_fn || arguments.callee.caller, []);
-};
-
-
-/**
- * Private helper for getStacktrace().
- * @param {Function} fn Function to start getting the trace from.
- * @param {Array} visited List of functions visited so far.
- * @return {string} Stack trace starting from function fn.
- * @private
- */
-goog.debug.getStacktraceHelper_ = function(fn, visited) {
- var sb = [];
-
- // Circular reference, certain functions like bind seem to cause a recursive
- // loop so we need to catch circular references
- if (goog.array.contains(visited, fn)) {
- sb.push('[...circular reference...]');
-
- // Traverse the call stack until function not found or max depth is reached
- } else if (fn && visited.length < goog.debug.MAX_STACK_DEPTH) {
- sb.push(goog.debug.getFunctionName(fn) + '(');
- var args = fn.arguments;
- for (var i = 0; i < args.length; i++) {
- if (i > 0) {
- sb.push(', ');
- }
- var argDesc;
- var arg = args[i];
- switch (typeof arg) {
- case 'object':
- argDesc = arg ? 'object' : 'null';
- break;
-
- case 'string':
- argDesc = arg;
- break;
-
- case 'number':
- argDesc = String(arg);
- break;
-
- case 'boolean':
- argDesc = arg ? 'true' : 'false';
- break;
-
- case 'function':
- argDesc = goog.debug.getFunctionName(arg);
- argDesc = argDesc ? argDesc : '[fn]';
- break;
-
- case 'undefined':
- default:
- argDesc = typeof arg;
- break;
- }
-
- if (argDesc.length > 40) {
- argDesc = argDesc.substr(0, 40) + '...';
- }
- sb.push(argDesc);
- }
- visited.push(fn);
- sb.push(')\n');
- /** @preserveTry */
- try {
- sb.push(goog.debug.getStacktraceHelper_(fn.caller, visited));
- } catch (e) {
- sb.push('[exception trying to get caller]\n');
- }
-
- } else if (fn) {
- sb.push('[...long stack...]');
- } else {
- sb.push('[end]');
- }
- return sb.join('');
-};
-
-
-/**
- * Set a custom function name resolver.
- * @param {function(Function): string} resolver Resolves functions to their
- * names.
- */
-goog.debug.setFunctionResolver = function(resolver) {
- goog.debug.fnNameResolver_ = resolver;
-};
-
-
-/**
- * Gets a function name
- * @param {Function} fn Function to get name of.
- * @return {string} Function's name.
- */
-goog.debug.getFunctionName = function(fn) {
- if (goog.debug.fnNameCache_[fn]) {
- return goog.debug.fnNameCache_[fn];
- }
- if (goog.debug.fnNameResolver_) {
- var name = goog.debug.fnNameResolver_(fn);
- if (name) {
- goog.debug.fnNameCache_[fn] = name;
- return name;
- }
- }
-
- // Heuristically determine function name based on code.
- var functionSource = String(fn);
- if (!goog.debug.fnNameCache_[functionSource]) {
- var matches = /function ([^\(]+)/.exec(functionSource);
- if (matches) {
- var method = matches[1];
- goog.debug.fnNameCache_[functionSource] = method;
- } else {
- goog.debug.fnNameCache_[functionSource] = '[Anonymous]';
- }
- }
-
- return goog.debug.fnNameCache_[functionSource];
-};
-
-
-/**
- * Makes whitespace visible by replacing it with printable characters.
- * This is useful in finding diffrences between the expected and the actual
- * output strings of a testcase.
- * @param {string} string whose whitespace needs to be made visible.
- * @return {string} string whose whitespace is made visible.
- */
-goog.debug.makeWhitespaceVisible = function(string) {
- return string.replace(/ /g, '[_]')
- .replace(/\f/g, '[f]')
- .replace(/\n/g, '[n]\n')
- .replace(/\r/g, '[r]')
- .replace(/\t/g, '[t]');
-};
-
-
-/**
- * Hash map for storing function names that have already been looked up.
- * @type {Object}
- * @private
- */
-goog.debug.fnNameCache_ = {};
-
-
-/**
- * Resolves functions to their names. Resolved function names will be cached.
- * @type {function(Function):string}
- * @private
- */
-goog.debug.fnNameResolver_;