UNPKG

weer

Version:

Web Extensions Error Reporter catches global errors, shows notifications and opens error reporter in one click

87 lines (61 loc) 2.39 kB
(function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('./utils')) : typeof define === 'function' && define.amd ? define(['./utils'], factory) : (global.Weer = global.Weer || {}, global.Weer.ErrorCatchers = factory(global.Weer.Utils)); }(this, (function (Utils) { 'use strict'; Utils = Utils && Utils.hasOwnProperty('default') ? Utils['default'] : Utils; var Debug = window.debug || ((/* Logger ID */) => (/* Log message */) => { /* Ignore all */ }); const debug = Debug('weer:catcher'); const bgName = 'BG'; var errorCatchers = { installListenersOn({ hostWindow = window, nameForDebug = bgName, handleErrorMessage, } = {}, cb) { const ifInBg = hostWindow === window; const bgIsBg = `Background window can't have name other than "${bgName}". ` + `Default value is "${bgName}".`; if (ifInBg) { Utils.assert( typeof handleErrorMessage === 'function', 'Messaging from BG window to itself is not allowed,' + ' provide message handler for such cases.', ); Utils.assert(nameForDebug === 'BG', bgIsBg); } else { Utils.assert(nameForDebug !== 'BG', bgIsBg); } const listener = (errorEvent) => { debug(nameForDebug, errorEvent); const plainObj = Utils.errorEventToPlainObject(errorEvent); const msg = { to: 'error-reporter', payload: plainObj, }; if (ifInBg) { // Because self messaging is not allowed. handleErrorMessage(msg); } else { hostWindow.chrome.runtime.sendMessage(msg); } }; const ifUseCapture = true; hostWindow.addEventListener('error', listener, ifUseCapture); const rejHandler = (event) => { event.preventDefault(); debug(nameForDebug, 'rethrowing promise...'); throw event.reason; }; hostWindow.addEventListener('unhandledrejection', rejHandler, ifUseCapture); if (cb) { Utils.timeouted(cb)(); } return function uninstallListeners() { hostWindow.removeEventListener('error', listener, ifUseCapture); hostWindow.removeEventListener('unhandledrejection', rejHandler, ifUseCapture); }; }, }; return errorCatchers; })));