• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5'use strict';
6
7/**
8 * This variable is checked in SelectFileDialogExtensionBrowserTest.
9 * @type {number}
10 */
11window.JSErrorCount = 0;
12
13/**
14 * Counts uncaught exceptions.
15 */
16window.onerror = function() { window.JSErrorCount++; };
17
18/**
19 * Wraps the function to use it as a callback.
20 * This does:
21 *  - Capture the stack trace in case of error.
22 *  - Bind this object
23 *
24 * @param {Object} thisObject Object to be used as this.
25 * @param {...} var_args Arguments to be bound with the wrapped function.
26 * @return {function} Wrapped function.
27 */
28Function.prototype.wrap = function(thisObject, var_args) {
29  var func = this;
30  var liveStack = (new Error('Stack trace before async call')).stack;
31  if (thisObject === undefined)
32    thisObject = null;
33  var boundArguments = Array.prototype.slice.call(arguments, 1);
34
35  return function wrappedCallback(var_args) {
36    try {
37      var args = boundArguments.concat(Array.prototype.slice.call(arguments));
38      return func.apply(thisObject, args);
39    } catch (e) {
40      // Some async funcrtion doesn't handle exception correctly. So outputing
41      // the exception message and stack trace just in case.
42      // The message will show twice if the caller handles exception correctly.
43      console.error(e.stack);
44      console.info('Exception above happened in callback.', liveStack);
45
46      window.JSErrorCount++;
47      throw e;
48    }
49  }
50};
51