123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610 |
- goog.provide('goog.debug');
- goog.require('goog.array');
- goog.require('goog.userAgent');
- goog.define('goog.debug.LOGGING_ENABLED', goog.DEBUG);
- goog.define('goog.debug.FORCE_SLOPPY_STACKS', false);
- goog.debug.catchErrors = function(logFunc, opt_cancel, opt_target) {
- var target = opt_target || goog.global;
- var oldErrorHandler = target.onerror;
- var retVal = !!opt_cancel;
-
-
-
-
-
- if (goog.userAgent.WEBKIT && !goog.userAgent.isVersionOrHigher('535.3')) {
- retVal = !retVal;
- }
-
- target.onerror = function(message, url, line, opt_col, opt_error) {
- if (oldErrorHandler) {
- oldErrorHandler(message, url, line, opt_col, opt_error);
- }
- logFunc({
- message: message,
- fileName: url,
- line: line,
- col: opt_col,
- error: opt_error
- });
- return retVal;
- };
- };
- 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 + ' = ';
- try {
- s += obj[x];
- } catch (e) {
- s += '*** ' + e + ' ***';
- }
- str.push(s);
- }
- return str.join('\n');
- };
- goog.debug.deepExpose = function(obj, opt_showFn) {
- var str = [];
-
-
-
- var uidsToCleanup = [];
- var ancestorUids = {};
- var helper = function(obj, space) {
- var nestspace = space + ' ';
- var indentMultiline = function(str) {
- return str.replace(/\n/g, '\n' + space);
- };
- 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 (!goog.hasUid(obj)) {
- uidsToCleanup.push(obj);
- }
- var uid = goog.getUid(obj);
- if (ancestorUids[uid]) {
- str.push('*** reference loop detected (id=' + uid + ') ***');
- } else {
- ancestorUids[uid] = true;
- 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 + '}');
- delete ancestorUids[uid];
- }
- } else {
- str.push(obj);
- }
- } catch (e) {
- str.push('*** ' + e + ' ***');
- }
- };
- helper(obj, '');
-
- for (var i = 0; i < uidsToCleanup.length; i++) {
- goog.removeUid(uidsToCleanup[i]);
- }
- return str.join('');
- };
- 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(', ') + ' ]';
- };
- 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) {
-
-
- lineNumber = 'Not available';
- threwError = true;
- }
- try {
- fileName = err.fileName || err.filename || err.sourceURL ||
-
-
- goog.global['$googDebugFname'] || href;
- } catch (e) {
-
- fileName = 'Not available';
- threwError = true;
- }
-
-
- if (threwError || !err.lineNumber || !err.fileName || !err.stack ||
- !err.message || !err.name) {
- return {
- 'message': err.message || 'Not available',
- 'name': err.name || 'UnknownError',
- 'lineNumber': lineNumber,
- 'fileName': fileName,
- 'stack': err.stack || 'Not available'
- };
- }
-
-
- return (err);
- };
- goog.debug.enhanceError = function(err, opt_message) {
- var error;
- if (!(err instanceof Error)) {
- error = Error(err);
- if (Error.captureStackTrace) {
-
- Error.captureStackTrace(error, goog.debug.enhanceError);
- }
- } else {
- error = err;
- }
- if (!error.stack) {
- error.stack = goog.debug.getStacktrace(goog.debug.enhanceError);
- }
- if (opt_message) {
-
- var x = 0;
- while (error['message' + x]) {
- ++x;
- }
- error['message' + x] = String(opt_message);
- }
- return error;
- };
- goog.debug.getStacktraceSimple = function(opt_depth) {
- if (!goog.debug.FORCE_SLOPPY_STACKS) {
- var stack = goog.debug.getNativeStackTrace_(goog.debug.getStacktraceSimple);
- if (stack) {
- return stack;
- }
-
-
- }
- 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');
- 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('');
- };
- goog.debug.MAX_STACK_DEPTH = 50;
- goog.debug.getNativeStackTrace_ = function(fn) {
- var tempErr = new Error();
- if (Error.captureStackTrace) {
- Error.captureStackTrace(tempErr, fn);
- return String(tempErr.stack);
- } else {
-
- try {
- throw tempErr;
- } catch (e) {
- tempErr = e;
- }
- var stack = tempErr.stack;
- if (stack) {
- return String(stack);
- }
- }
- return null;
- };
- goog.debug.getStacktrace = function(fn) {
- var stack;
- if (!goog.debug.FORCE_SLOPPY_STACKS) {
-
- var contextFn = fn || goog.debug.getStacktrace;
- stack = goog.debug.getNativeStackTrace_(contextFn);
- }
- if (!stack) {
-
-
- stack = goog.debug.getStacktraceHelper_(fn || arguments.callee.caller, []);
- }
- return stack;
- };
- goog.debug.getStacktraceHelper_ = function(fn, visited) {
- var sb = [];
-
-
- if (goog.array.contains(visited, fn)) {
- sb.push('[...circular reference...]');
-
- } else if (fn && visited.length < goog.debug.MAX_STACK_DEPTH) {
- sb.push(goog.debug.getFunctionName(fn) + '(');
- var args = fn.arguments;
-
- for (var i = 0; args && 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');
- 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('');
- };
- goog.debug.setFunctionResolver = function(resolver) {
- goog.debug.fnNameResolver_ = resolver;
- };
- 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;
- }
- }
-
- 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];
- };
- 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]');
- };
- goog.debug.runtimeType = function(value) {
- if (value instanceof Function) {
- return value.displayName || value.name || 'unknown type name';
- } else if (value instanceof Object) {
- return value.constructor.displayName || value.constructor.name ||
- Object.prototype.toString.call(value);
- } else {
- return value === null ? 'null' : typeof value;
- }
- };
- goog.debug.fnNameCache_ = {};
- goog.debug.fnNameResolver_;
|