Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 25 additions & 0 deletions scripts/aem.js
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,29 @@ function sampleRUM(checkpoint, data) {
return errData;
};

// rejections coming from `el.onerror = reject` (e.g. loadScript/loadCSS) carry a
// DOM Event as reason, which serializes to nothing useful. Report a locator for
// the failing element instead - tag name plus resource URL, rather than the
// outerHTML, which would put attribute values and inline script or style content
// into the beacon. Only string parts are kept, since `href` on an SVG element is
// an SVGAnimatedString rather than a URL. Falls back to the event type, and is
// capped so that a long (e.g. data:) URL cannot bloat the payload.
const dataFromEventObj = (event) => {
const errData = { source: 'Unhandled Rejection', target: 'Unknown' };
try {
const el = event.target;
const locator = el && el.tagName
? [el.tagName.toLowerCase(), el.src, el.href]
.filter((part) => part && typeof part === 'string')
.join('@')
: el && el.toString();
errData.target = (locator || event.type).slice(0, 200);
} catch (err) {
/* event structure was not as expected */
}
return errData;
};

window.addEventListener('error', ({ error }) => {
const errData = dataFromErrorObj(error);
sampleRUM('error', errData);
Expand All @@ -77,6 +100,8 @@ function sampleRUM(checkpoint, data) {
};
if (reason instanceof Error) {
errData = dataFromErrorObj(reason);
} else if (reason instanceof Event) {
errData = dataFromEventObj(reason);
}
sampleRUM('error', errData);
});
Expand Down
Loading