add a callstack to errors in browser and msg (#1369)
				
					
				
			This commit is contained in:
		
							parent
							
								
									9d2854c272
								
							
						
					
					
						commit
						0ac01d2e22
					
				
							
								
								
									
										15
									
								
								js/msg.js
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								js/msg.js
									
									
									
									
									
								
							|  | @ -78,12 +78,12 @@ | |||
| 
 | ||||
|     send(data, target = 'extension') { | ||||
|       return browser.runtime.sendMessage({data, target}) | ||||
|         .then(unwrapResponse); | ||||
|         .then(unwrapResponseFactory('send')); | ||||
|     }, | ||||
| 
 | ||||
|     sendTab(tabId, data, options, target = 'tab') { | ||||
|       return browser.tabs.sendMessage(tabId, {data, target}, options) | ||||
|         .then(unwrapResponse); | ||||
|         .then(unwrapResponseFactory('sendTab')); | ||||
|     }, | ||||
| 
 | ||||
|     _execute(types, ...args) { | ||||
|  | @ -138,9 +138,16 @@ | |||
|     }; | ||||
|   } | ||||
| 
 | ||||
|   function unwrapResponse({data, error} = {error: {message: ERR_NO_RECEIVER}}) { | ||||
|   function unwrapResponseFactory(name) { | ||||
|     // Saving the local callstack before making an async call
 | ||||
|     return unwrapResponse.bind(null, new Error(`Callstack before invoking msg.${name}:`)); | ||||
|   } | ||||
| 
 | ||||
|   function unwrapResponse(localErr, {data, error} = {error: {message: ERR_NO_RECEIVER}}) { | ||||
|     return error | ||||
|       ? Promise.reject(Object.assign(new Error(error.message), error)) | ||||
|       ? Promise.reject(Object.assign(localErr, error, error.stack && { | ||||
|         stack: `${error.stack}\n${localErr.stack}`, | ||||
|       })) | ||||
|       : data; | ||||
|   } | ||||
| 
 | ||||
|  |  | |||
|  | @ -23,14 +23,21 @@ | |||
|     }; | ||||
|     const promisify = function (fn, ...args) { | ||||
|       let res; | ||||
|       let resolve, reject; | ||||
|       // Saving the local callstack before making an async call
 | ||||
|       const err = new Error(); | ||||
|       try { | ||||
|         let resolve, reject; | ||||
|         /* Some callbacks have 2 parameters so we're resolving as an array in that case. | ||||
|            For example, chrome.runtime.requestUpdateCheck and chrome.webRequest.onAuthRequired */ | ||||
|         args.push((...results) => | ||||
|           chrome.runtime.lastError ? | ||||
|             reject(new Error(chrome.runtime.lastError.message)) : | ||||
|             resolve(results.length <= 1 ? results[0] : results)); | ||||
|         args.push((...results) => { | ||||
|           const {lastError} = chrome.runtime; | ||||
|           if (lastError) { | ||||
|             err.message = lastError.message; | ||||
|             reject(err); | ||||
|           } else { | ||||
|             /* Some callbacks have 2 parameters so we're resolving as an array in that case. | ||||
|                For example, chrome.runtime.requestUpdateCheck and chrome.webRequest.onAuthRequired */ | ||||
|             resolve(results.length <= 1 ? results[0] : results); | ||||
|           } | ||||
|         }); | ||||
|         fn.apply(this, args); | ||||
|         res = new Promise((...rr) => ([resolve, reject] = rr)); | ||||
|       } catch (err) { | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	Block a user