112 lines
3.2 KiB
JavaScript
112 lines
3.2 KiB
JavaScript
(function() {
|
|
var currentPage = '';
|
|
|
|
function messageFor(error) {
|
|
if (!error) {
|
|
return 'unknown error';
|
|
}
|
|
if (error.message) {
|
|
return error.message;
|
|
}
|
|
return String(error);
|
|
}
|
|
|
|
function setPage(pageName) {
|
|
currentPage = pageName || '';
|
|
document.documentElement.setAttribute('data-crank-page', currentPage || 'unknown');
|
|
}
|
|
|
|
function markBootstrapState(pageName, status, details) {
|
|
document.documentElement.setAttribute('data-crank-bootstrap-page', pageName || currentPage || 'unknown');
|
|
document.documentElement.setAttribute('data-crank-bootstrap-state', status);
|
|
if (status === 'error' && details) {
|
|
document.documentElement.setAttribute('data-crank-bootstrap-error', details);
|
|
return;
|
|
}
|
|
document.documentElement.removeAttribute('data-crank-bootstrap-error');
|
|
}
|
|
|
|
function report(stage, error, pageName) {
|
|
var resolvedPage = pageName || currentPage || 'unknown';
|
|
console.error('[CrankUI][' + resolvedPage + '][' + stage + ']', error);
|
|
window.dispatchEvent(new CustomEvent('crank:ui-error', {
|
|
detail: {
|
|
page: resolvedPage,
|
|
stage: stage,
|
|
message: messageFor(error),
|
|
},
|
|
}));
|
|
}
|
|
|
|
function bootstrap(pageName, init) {
|
|
function run() {
|
|
setPage(pageName);
|
|
markBootstrapState(pageName, 'pending');
|
|
try {
|
|
var result = init();
|
|
if (result && typeof result.then === 'function') {
|
|
result.then(function() {
|
|
markBootstrapState(pageName, 'ready');
|
|
}).catch(function(error) {
|
|
markBootstrapState(pageName, 'error', messageFor(error));
|
|
report('bootstrap', error, pageName);
|
|
});
|
|
return;
|
|
}
|
|
markBootstrapState(pageName, 'ready');
|
|
} catch (error) {
|
|
markBootstrapState(pageName, 'error', messageFor(error));
|
|
report('bootstrap', error, pageName);
|
|
}
|
|
}
|
|
|
|
if (document.readyState === 'loading') {
|
|
document.addEventListener('DOMContentLoaded', run, { once: true });
|
|
return;
|
|
}
|
|
run();
|
|
}
|
|
|
|
function ensureTestId(element, value) {
|
|
if (!element || !value) {
|
|
return;
|
|
}
|
|
element.setAttribute('data-testid', value);
|
|
}
|
|
|
|
function ensureShellTestIds() {
|
|
document.querySelectorAll('.nav-avatar').forEach(function(element) {
|
|
ensureTestId(element, 'shell-avatar');
|
|
});
|
|
document.querySelectorAll('.user-dropdown-name').forEach(function(element) {
|
|
ensureTestId(element, 'shell-user-name');
|
|
});
|
|
document.querySelectorAll('.user-dropdown-role').forEach(function(element) {
|
|
ensureTestId(element, 'shell-user-role');
|
|
});
|
|
ensureTestId(document.getElementById('ws-current-name'), 'shell-workspace-name');
|
|
}
|
|
|
|
window.addEventListener('error', function(event) {
|
|
if (!currentPage) {
|
|
return;
|
|
}
|
|
report('runtime', event.error || new Error(event.message || 'window error'));
|
|
});
|
|
|
|
window.addEventListener('unhandledrejection', function(event) {
|
|
if (!currentPage) {
|
|
return;
|
|
}
|
|
report('unhandledrejection', event.reason || new Error('unhandled rejection'));
|
|
});
|
|
|
|
window.CrankDiagnostics = {
|
|
bootstrap: bootstrap,
|
|
ensureTestId: ensureTestId,
|
|
ensureShellTestIds: ensureShellTestIds,
|
|
report: report,
|
|
setPage: setPage,
|
|
};
|
|
}());
|