Add source-mapped stacktrace to error message in web UI (#13082)
* Add source-mapped stack trace to copyable text in error boundary * Add the error message to the copied report, not only the stack trace
This commit is contained in:
		
							parent
							
								
									d8e9bae482
								
							
						
					
					
						commit
						ff3a11d01d
					
				@ -2,6 +2,7 @@ import React from 'react';
 | 
				
			|||||||
import PropTypes from 'prop-types';
 | 
					import PropTypes from 'prop-types';
 | 
				
			||||||
import { FormattedMessage } from 'react-intl';
 | 
					import { FormattedMessage } from 'react-intl';
 | 
				
			||||||
import { version, source_url } from 'mastodon/initial_state';
 | 
					import { version, source_url } from 'mastodon/initial_state';
 | 
				
			||||||
 | 
					import StackTrace from 'stacktrace-js';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default class ErrorBoundary extends React.PureComponent {
 | 
					export default class ErrorBoundary extends React.PureComponent {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -11,24 +12,42 @@ export default class ErrorBoundary extends React.PureComponent {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  state = {
 | 
					  state = {
 | 
				
			||||||
    hasError: false,
 | 
					    hasError: false,
 | 
				
			||||||
 | 
					    errorMessage: undefined,
 | 
				
			||||||
    stackTrace: undefined,
 | 
					    stackTrace: undefined,
 | 
				
			||||||
 | 
					    mappedStackTrace: undefined,
 | 
				
			||||||
    componentStack: undefined,
 | 
					    componentStack: undefined,
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  componentDidCatch (error, info) {
 | 
					  componentDidCatch (error, info) {
 | 
				
			||||||
    this.setState({
 | 
					    this.setState({
 | 
				
			||||||
      hasError: true,
 | 
					      hasError: true,
 | 
				
			||||||
 | 
					      errorMessage: error.toString(),
 | 
				
			||||||
      stackTrace: error.stack,
 | 
					      stackTrace: error.stack,
 | 
				
			||||||
      componentStack: info && info.componentStack,
 | 
					      componentStack: info && info.componentStack,
 | 
				
			||||||
      copied: false,
 | 
					      mappedStackTrace: undefined,
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    StackTrace.fromError(error).then((stackframes) => {
 | 
				
			||||||
 | 
					      this.setState({
 | 
				
			||||||
 | 
					        mappedStackTrace: stackframes.map((sf) => sf.toString()).join('\n'),
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    }).catch(() => {
 | 
				
			||||||
 | 
					      this.setState({
 | 
				
			||||||
 | 
					        mappedStackTrace: undefined,
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  handleCopyStackTrace = () => {
 | 
					  handleCopyStackTrace = () => {
 | 
				
			||||||
    const { stackTrace } = this.state;
 | 
					    const { errorMessage, stackTrace, mappedStackTrace } = this.state;
 | 
				
			||||||
    const textarea = document.createElement('textarea');
 | 
					    const textarea = document.createElement('textarea');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    textarea.textContent    = stackTrace;
 | 
					    let contents = [errorMessage, stackTrace];
 | 
				
			||||||
 | 
					    if (mappedStackTrace) {
 | 
				
			||||||
 | 
					      contents.push(mappedStackTrace);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    textarea.textContent    = contents.join('\n\n\n');
 | 
				
			||||||
    textarea.style.position = 'fixed';
 | 
					    textarea.style.position = 'fixed';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    document.body.appendChild(textarea);
 | 
					    document.body.appendChild(textarea);
 | 
				
			||||||
 | 
				
			|||||||
@ -153,6 +153,7 @@
 | 
				
			|||||||
    "rimraf": "^3.0.2",
 | 
					    "rimraf": "^3.0.2",
 | 
				
			||||||
    "sass": "^1.25.0",
 | 
					    "sass": "^1.25.0",
 | 
				
			||||||
    "sass-loader": "^8.0.2",
 | 
					    "sass-loader": "^8.0.2",
 | 
				
			||||||
 | 
					    "stacktrace-js": "^2.0.2",
 | 
				
			||||||
    "stringz": "^2.0.0",
 | 
					    "stringz": "^2.0.0",
 | 
				
			||||||
    "substring-trie": "^1.0.2",
 | 
					    "substring-trie": "^1.0.2",
 | 
				
			||||||
    "terser-webpack-plugin": "^2.3.5",
 | 
					    "terser-webpack-plugin": "^2.3.5",
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										41
									
								
								yarn.lock
									
									
									
									
									
								
							
							
						
						
									
										41
									
								
								yarn.lock
									
									
									
									
									
								
							@ -3694,6 +3694,13 @@ error-ex@^1.2.0, error-ex@^1.3.1:
 | 
				
			|||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    is-arrayish "^0.2.1"
 | 
					    is-arrayish "^0.2.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					error-stack-parser@^2.0.6:
 | 
				
			||||||
 | 
					  version "2.0.6"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/error-stack-parser/-/error-stack-parser-2.0.6.tgz#5a99a707bd7a4c58a797902d48d82803ede6aad8"
 | 
				
			||||||
 | 
					  integrity sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ==
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    stackframe "^1.1.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
es-abstract@^1.13.0, es-abstract@^1.15.0, es-abstract@^1.17.0, es-abstract@^1.17.0-next.1, es-abstract@^1.5.1:
 | 
					es-abstract@^1.13.0, es-abstract@^1.15.0, es-abstract@^1.17.0, es-abstract@^1.17.0-next.1, es-abstract@^1.5.1:
 | 
				
			||||||
  version "1.17.0"
 | 
					  version "1.17.0"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.0.tgz#f42a517d0036a5591dbb2c463591dc8bb50309b1"
 | 
					  resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.0.tgz#f42a517d0036a5591dbb2c463591dc8bb50309b1"
 | 
				
			||||||
@ -9723,6 +9730,11 @@ source-list-map@^2.0.0:
 | 
				
			|||||||
  resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34"
 | 
					  resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34"
 | 
				
			||||||
  integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==
 | 
					  integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					source-map@0.5.6:
 | 
				
			||||||
 | 
					  version "0.5.6"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412"
 | 
				
			||||||
 | 
					  integrity sha1-dc449SvwczxafwwRjYEzSiu19BI=
 | 
				
			||||||
 | 
					
 | 
				
			||||||
source-map-resolve@^0.5.0:
 | 
					source-map-resolve@^0.5.0:
 | 
				
			||||||
  version "0.5.2"
 | 
					  version "0.5.2"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259"
 | 
					  resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259"
 | 
				
			||||||
@ -9868,11 +9880,40 @@ stable@~0.1.6:
 | 
				
			|||||||
  resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf"
 | 
					  resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf"
 | 
				
			||||||
  integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==
 | 
					  integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					stack-generator@^2.0.5:
 | 
				
			||||||
 | 
					  version "2.0.5"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/stack-generator/-/stack-generator-2.0.5.tgz#fb00e5b4ee97de603e0773ea78ce944d81596c36"
 | 
				
			||||||
 | 
					  integrity sha512-/t1ebrbHkrLrDuNMdeAcsvynWgoH/i4o8EGGfX7dEYDoTXOYVAkEpFdtshlvabzc6JlJ8Kf9YdFEoz7JkzGN9Q==
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    stackframe "^1.1.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
stack-utils@^1.0.1:
 | 
					stack-utils@^1.0.1:
 | 
				
			||||||
  version "1.0.2"
 | 
					  version "1.0.2"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.2.tgz#33eba3897788558bebfc2db059dc158ec36cebb8"
 | 
					  resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.2.tgz#33eba3897788558bebfc2db059dc158ec36cebb8"
 | 
				
			||||||
  integrity sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==
 | 
					  integrity sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					stackframe@^1.1.1:
 | 
				
			||||||
 | 
					  version "1.1.1"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.1.1.tgz#ffef0a3318b1b60c3b58564989aca5660729ec71"
 | 
				
			||||||
 | 
					  integrity sha512-0PlYhdKh6AfFxRyK/v+6/k+/mMfyiEBbTM5L94D0ZytQnJ166wuwoTYLHFWGbs2dpA8Rgq763KGWmN1EQEYHRQ==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					stacktrace-gps@^3.0.4:
 | 
				
			||||||
 | 
					  version "3.0.4"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/stacktrace-gps/-/stacktrace-gps-3.0.4.tgz#7688dc2fc09ffb3a13165ebe0dbcaf41bcf0c69a"
 | 
				
			||||||
 | 
					  integrity sha512-qIr8x41yZVSldqdqe6jciXEaSCKw1U8XTXpjDuy0ki/apyTn/r3w9hDAAQOhZdxvsC93H+WwwEu5cq5VemzYeg==
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    source-map "0.5.6"
 | 
				
			||||||
 | 
					    stackframe "^1.1.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					stacktrace-js@^2.0.2:
 | 
				
			||||||
 | 
					  version "2.0.2"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/stacktrace-js/-/stacktrace-js-2.0.2.tgz#4ca93ea9f494752d55709a081d400fdaebee897b"
 | 
				
			||||||
 | 
					  integrity sha512-Je5vBeY4S1r/RnLydLl0TBTi3F2qdfWmYsGvtfZgEI+SCprPppaIhQf5nGcal4gI4cGpCV/duLcAzT1np6sQqg==
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    error-stack-parser "^2.0.6"
 | 
				
			||||||
 | 
					    stack-generator "^2.0.5"
 | 
				
			||||||
 | 
					    stacktrace-gps "^3.0.4"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static-extend@^0.1.1:
 | 
					static-extend@^0.1.1:
 | 
				
			||||||
  version "0.1.2"
 | 
					  version "0.1.2"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6"
 | 
					  resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6"
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user