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