// Copyright (c) 2013 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.
'use strict';
base.require('base.iteration_helpers');
base.exportTo('base', function() {
/**
* Adds a {@code getInstance} static method that always return the same
* instance object.
* @param {!Function} ctor The constructor for the class to add the static
* method to.
*/
function addSingletonGetter(ctor) {
ctor.getInstance = function() {
return ctor.instance_ || (ctor.instance_ = new ctor());
};
}
function instantiateTemplate(selector) {
return document.querySelector(selector).content.cloneNode(true);
}
function tracedFunction(fn, name, opt_this) {
function F() {
console.time(name);
try {
fn.apply(opt_this, arguments);
} finally {
console.timeEnd(name);
}
}
return F;
}
function normalizeException(e) {
if (typeof(e) == 'string') {
return {
message: e,
stack: ['<unknown>']
};
}
return {
message: e.message,
stack: e.stack ? e.stack : ['<unknown>']
};
}
function stackTrace() {
var stack = new Error().stack + '';
stack = stack.split('\n');
return stack.slice(2);
}
return {
addSingletonGetter: addSingletonGetter,
tracedFunction: tracedFunction,
normalizeException: normalizeException,
instantiateTemplate: instantiateTemplate,
stackTrace: stackTrace
};
});