How crossOrigin Enables Full JavaScript Stack Traces
When loading JavaScript files hosted on third-party domains or
Content Delivery Networks (CDNs), modern web browsers mask runtime error
details to prevent cross-origin data leakage, displaying only a generic
"Script error." with no stack trace. This article explains
how applying the crossOrigin attribute to your
<script> tags, alongside the appropriate server-side
headers, bypasses this security restriction and restores detailed error
messages, line numbers, and full stack traces for monitoring and
debugging.
The Problem: The “Script Error.” Mask
Browsers enforce the Same-Origin Policy to protect user data. When a
script originates from a domain different from the host webpage (such as
a CDN like cdn.example.com loaded on
example.com), the browser assumes the resource might
contain sensitive information.
If an unhandled exception occurs inside a cross-origin script, the
browser’s global error handler (window.onerror) receives
sanitized parameters: - Message:
"Script error." - URL: "" -
Line Number: 0 - Column
Number: 0 - Error Object:
null
This security measure prevents malicious sites from gleaning information about third-party scripts by intentionally triggering and inspecting error messages. However, it also blinds frontend error tracking tools (such as Sentry, LogRocket, or Datadog) from logging usable debugging information.
How the
crossOrigin Attribute Works
The crossOrigin attribute instructs the browser to fetch
the external script using standard Cross-Origin Resource Sharing (CORS)
rules instead of the default opaque cross-origin request mode.
You can specify the attribute on your script tag like this:
<script src="https://cdn.example.com/app.js" crossorigin="anonymous"></script>The attribute accepts two values: - anonymous
(or empty crossorigin): Performs a CORS request
without sending user credentials (cookies, HTTP basic authentication, or
client certificates). - use-credentials:
Performs a CORS request that includes user credentials.
By explicitly declaring CORS mode, the browser treats the script as an inspected, trusted resource rather than an opaque one.
The Server-Side Requirement
Adding the crossOrigin attribute to the client-side
markup is only half of the solution. The server or CDN delivering the
JavaScript file must respond with the appropriate CORS HTTP header:
Access-Control-Allow-Origin: *
(Or specify the exact origin instead of the wildcard
*)
If the crossorigin attribute is present on the
<script> tag but the server fails to return the
Access-Control-Allow-Origin header, the browser will block
the script from executing entirely, resulting in a network CORS
error.
The Result: Full Stack Trace Visibility
Once the client sends a CORS request via the crossOrigin
attribute and the server validates it with the appropriate header, the
browser unmasks runtime errors.
Global error listeners now receive complete information: -
event.message / msg: The
actual error message (e.g.,
TypeError: Cannot read property 'map' of undefined). -
event.filename / url: The
exact file path. - event.lineno /
colno: Accurate line and column numbers. -
event.error.stack: The full JavaScript
stack trace detailing every function call leading up to the failure.
This enables accurate error logging, simplifies debugging, and allows modern source maps to translate production stack traces back to original source code.