@@ -84,29 +84,20 @@ function handleMessageEvent(e) {
8484
8585window . addEventListener ( 'message' , handleMessageEvent ) ;
8686
87- // catch reference errors, via http://stackoverflow.com/a/12747364/2994108
88- window . onerror = async function onError (
89- msg ,
90- source ,
91- lineNumber ,
92- columnNo ,
93- error
94- ) {
95- // maybe i can use error.stack sometime but i'm having a hard time triggering
96- // this function
97- let data ;
98- if ( ! error ) {
99- data = msg ;
100- } else {
101- data = `${ error . name } : ${ error . message } ` ;
102- const resolvedFileName = window . objectUrls [ source ] ;
103- let resolvedLineNo = lineNumber ;
104- if ( window . objectUrls [ source ] === 'index.html' ) {
105- resolvedLineNo = lineNumber - htmlOffset ;
87+ function formatStackLine ( { fileName, functionName, lineNumber, columnNumber } ) {
88+ const resolvedFileName = window . objectUrls [ fileName ] || fileName ;
89+ const resolvedFuncName = functionName || '(anonymous function)' ;
90+ if ( lineNumber && columnNumber ) {
91+ let resolvedLineNumber = lineNumber ;
92+ if ( resolvedFileName === 'index.html' ) {
93+ resolvedLineNumber = lineNumber - htmlOffset ;
10694 }
107- const line = `\n at ${ resolvedFileName } :${ resolvedLineNo } :${ columnNo } ` ;
108- data = data . concat ( line ) ;
95+ return `\n at ${ resolvedFuncName } (${ resolvedFileName } :${ resolvedLineNumber } :${ columnNumber } )` ;
10996 }
97+ return `\n at ${ resolvedFuncName } (${ resolvedFileName } )` ;
98+ }
99+
100+ function postErrorMessage ( data ) {
110101 editor . postMessage (
111102 {
112103 source : 'sketch' ,
@@ -124,50 +115,62 @@ window.onerror = async function onError(
124115 } ,
125116 editorOrigin
126117 ) ;
118+ }
119+
120+ // catch reference errors, via http://stackoverflow.com/a/12747364/2994108
121+ window . onerror = async function onError (
122+ msg ,
123+ source ,
124+ lineNumber ,
125+ columnNo ,
126+ error
127+ ) {
128+ if ( ! error ) {
129+ postErrorMessage ( msg ) ;
130+ return false ;
131+ }
132+ let data = `${ error . name } : ${ error . message } ` ;
133+ let stackLines = [ ] ;
134+ if ( error . stack ) {
135+ try {
136+ stackLines = await StackTrace . fromError ( error ) ;
137+ } catch ( e ) {
138+ stackLines = [ ] ;
139+ }
140+ }
141+ if ( stackLines . length > 0 ) {
142+ stackLines . forEach ( ( stackLine ) => {
143+ data = data . concat ( formatStackLine ( stackLine ) ) ;
144+ } ) ;
145+ } else {
146+ data = data . concat (
147+ formatStackLine ( {
148+ fileName : source ,
149+ functionName : null ,
150+ lineNumber,
151+ columnNumber : columnNo
152+ } )
153+ ) ;
154+ }
155+ postErrorMessage ( data ) ;
127156 return false ;
128157} ;
129158// catch rejected promises
130159window . onunhandledrejection = async function onUnhandledRejection ( event ) {
131- if ( event . reason && event . reason . message ) {
132- let stackLines = [ ] ;
133- if ( event . reason . stack ) {
160+ if ( ! event . reason || ! event . reason . message ) return ;
161+ let stackLines = [ ] ;
162+ if ( event . reason . stack ) {
163+ try {
134164 stackLines = await StackTrace . fromError ( event . reason ) ;
165+ } catch ( e ) {
166+ stackLines = [ ] ;
135167 }
136- let data = `${ event . reason . name } : ${ event . reason . message } ` ;
137- stackLines . forEach ( ( stackLine ) => {
138- const { fileName, functionName, lineNumber, columnNumber } = stackLine ;
139- const resolvedFileName = window . objectUrls [ fileName ] || fileName ;
140- const resolvedFuncName = functionName || '(anonymous function)' ;
141- let line ;
142- if ( lineNumber && columnNumber ) {
143- let resolvedLineNumber = lineNumber ;
144- if ( resolvedFileName === 'index.html' ) {
145- resolvedLineNumber = lineNumber - htmlOffset ;
146- }
147- line = `\n at ${ resolvedFuncName } (${ resolvedFileName } :${ resolvedLineNumber } :${ columnNumber } )` ;
148- } else {
149- line = `\n at ${ resolvedFuncName } (${ resolvedFileName } )` ;
150- }
151- data = data . concat ( line ) ;
152- } ) ;
153- editor . postMessage (
154- {
155- source : 'sketch' ,
156- messages : [
157- {
158- log : [
159- {
160- method : 'error' ,
161- data : [ data ] ,
162- id : Date . now ( ) . toString ( )
163- }
164- ]
165- }
166- ]
167- } ,
168- editorOrigin
169- ) ;
170168 }
169+ let data = `${ event . reason . name } : ${ event . reason . message } ` ;
170+ stackLines . forEach ( ( stackLine ) => {
171+ data = data . concat ( formatStackLine ( stackLine ) ) ;
172+ } ) ;
173+ postErrorMessage ( data ) ;
171174} ;
172175
173176// Monkeypatch p5._friendlyError
0 commit comments