Skip to content

Commit 0128a7e

Browse files
committed
fix(responsible): Restrict error construction to known errors
1 parent 29e54df commit 0128a7e

File tree

2 files changed

+35
-2
lines changed

2 files changed

+35
-2
lines changed

lib/core/utils/respondable.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22
(function (exports) {
33
'use strict';
44
var messages = {},
5-
subscribers = {};
5+
subscribers = {},
6+
errorTypes = Object.freeze(['EvalError', 'RangeError', 'ReferenceError',
7+
'SyntaxError', 'TypeError', 'URIError']);
68

79
/**
810
* get the unique string to be used to identify our instance of aXe
@@ -154,7 +156,8 @@
154156
*/
155157
function buildErrorObject(error) {
156158
var msg = error.message || 'Unknown error occurred';
157-
var ErrConstructor = window[error.name] || Error;
159+
var errorName = errorTypes.includes(error.name) ? error.name : 'Error';
160+
var ErrConstructor = window[errorName] || Error;
158161

159162
if (error.stack) {
160163
msg += '\n' + error.stack.replace(error.message, '');

test/core/utils/respondable.js

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,36 @@ describe('axe.utils.respondable', function () {
332332
assert.isTrue(success);
333333
});
334334

335+
it('should create an Error if an invalid error type is passed', function () {
336+
var success = false;
337+
var event = document.createEvent('Event');
338+
window.evil = function () {};
339+
// Define that the event name is 'build'.
340+
event.initEvent('message', true, true);
341+
event.data = JSON.stringify({
342+
_respondable: true,
343+
_source: 'axe.2.0.0',
344+
topic: 'Death star',
345+
error: {
346+
name: 'evil',
347+
message: 'The exhaust port is open!',
348+
trail: '... boom'
349+
},
350+
uuid: mockUUID
351+
});
352+
event.source = window;
353+
354+
axe.utils.respondable(window, 'Death star', null, true, function (data) {
355+
success = true;
356+
assert.instanceOf(data, Error);
357+
assert.equal(data.message, 'The exhaust port is open!');
358+
});
359+
360+
document.dispatchEvent(event);
361+
assert.isTrue(success);
362+
window.evil = undefined;
363+
});
364+
335365
it('uses respondable.isInFrame() to check if the page is in a frame or not', function() {
336366
assert.equal(axe.utils.respondable.isInFrame(), !!window.frameElement);
337367

0 commit comments

Comments
 (0)