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