diff --git a/tests/scriptlets/abort-current-inline-script.test.js b/tests/scriptlets/abort-current-inline-script.test.js index 71199fe7..44158c17 100644 --- a/tests/scriptlets/abort-current-inline-script.test.js +++ b/tests/scriptlets/abort-current-inline-script.test.js @@ -92,6 +92,20 @@ test('works with chained properties', (assert) => { assert.strictEqual(window.hit, 'FIRED', 'hit fired'); }); +test('Works with an empty object in chain', (assert) => { + const scriptletArgs = ['window.aaa.bbb']; + + window.onerror = onError(assert); + window.aaa = {}; + + runScriptlet(name, scriptletArgs); + + window.aaa.bbb = 1; + addAndRemoveInlineScript('window.aaa.bbb = 4'); + + assert.strictEqual(window.hit, 'FIRED', 'hit fired'); +}); + test('should not work if chained properties are undefined', (assert) => { window.onerror = onError(assert); const chainProperty = 'a.b.c'; diff --git a/tests/scriptlets/abort-on-property-read.test.js b/tests/scriptlets/abort-on-property-read.test.js index 155d13c7..ed54b930 100644 --- a/tests/scriptlets/abort-on-property-read.test.js +++ b/tests/scriptlets/abort-on-property-read.test.js @@ -86,3 +86,18 @@ test('dot notation deferred defenition', (assert) => { ); assert.strictEqual(window.hit, 'FIRED', 'hit fired'); }); + +test('Works with an empty object in chain', (assert) => { + window.aaa = {}; + const scriptletArgs = [CHAIN_PROPERTY]; + runScriptlet(name, scriptletArgs); + + window.aaa.bbb = 'value'; + + assert.throws( + () => window.aaa.bbb, + /ReferenceError/, + `should throw Reference error when try to access property ${CHAIN_PROPERTY}`, + ); + assert.strictEqual(window.hit, 'FIRED', 'hit fired'); +}); diff --git a/tests/scriptlets/abort-on-property-write.test.js b/tests/scriptlets/abort-on-property-write.test.js index 6a022a4b..c6d9dfca 100644 --- a/tests/scriptlets/abort-on-property-write.test.js +++ b/tests/scriptlets/abort-on-property-write.test.js @@ -92,3 +92,21 @@ test('dot notation deferred defenition', (assert) => { ); assert.strictEqual(window.hit, 'FIRED', 'hit fired'); }); + +test('Works with an empty object in chain', (assert) => { + const CHAIN_PROPERTY = 'window.aaa.bbb'; + const scriptletArgs = [CHAIN_PROPERTY]; + window.aaa = {}; + runScriptlet(name, scriptletArgs); + + window.aaa.bbb = 'value'; + + assert.throws( + () => { + window.aaa.bbb = 'new value'; + }, + /ReferenceError/, + `should throw Reference error when try to access property ${CHAIN_PROPERTY}`, + ); + assert.strictEqual(window.hit, 'FIRED', 'hit fired'); +}); diff --git a/tests/scriptlets/abort-on-stack-trace.test.js b/tests/scriptlets/abort-on-stack-trace.test.js index 2e54a7f4..fed6be20 100644 --- a/tests/scriptlets/abort-on-stack-trace.test.js +++ b/tests/scriptlets/abort-on-stack-trace.test.js @@ -65,6 +65,28 @@ test('simple, matches stack', (assert) => { assert.strictEqual(window.hit, 'FIRED', 'hit fired'); }); +test('simple, matches stack with an empty object in chain', (assert) => { + const PROPERTY = 'window.aaa.bbb'; + window.aaa = {}; + const scriptletArgs = [PROPERTY]; + runScriptlet(name, scriptletArgs); + + window.aaa.bbb = 'value'; + + assert.throws( + () => window.aaa.bbb, + /ReferenceError/, + `Reference error thrown when trying to access property ${PROPERTY}`, + ); + assert.throws( + // eslint-disable-next-line no-return-assign + () => window.aaa.bbb = 'new value', + /ReferenceError/, + `Reference error thrown when trying to reassign property ${PROPERTY}`, + ); + assert.strictEqual(window.hit, 'FIRED', 'hit fired'); +}); + test('simple, does NOT match stack', (assert) => { window[PROPERTY] = 'value'; const noStackMatch = 'no_match.js'; diff --git a/tests/scriptlets/debug-current-inline-script.test.js b/tests/scriptlets/debug-current-inline-script.test.js index 7c0bc3af..770c0845 100644 --- a/tests/scriptlets/debug-current-inline-script.test.js +++ b/tests/scriptlets/debug-current-inline-script.test.js @@ -45,6 +45,20 @@ test('works', (assert) => { assert.strictEqual(window.hit, 'FIRED', 'hit fired'); }); +test('works with an empty object in chain', (assert) => { + window.onerror = onError(assert); + const property = 'window.aaa.bbb'; + const scriptletArgs = [property]; + + window.aaa = {}; + runScriptlet(name, scriptletArgs); + window.aaa.bbb = 'value'; + + addAndRemoveInlineScript('window.aaa.bbb;'); + + assert.strictEqual(window.hit, 'FIRED', 'hit fired'); +}); + test('works with chained properties', (assert) => { window.onerror = onError(assert); const chainProperty = 'aaa.bbb.ccc'; diff --git a/tests/scriptlets/debug-on-property-read.test.js b/tests/scriptlets/debug-on-property-read.test.js index b0f2d53e..b6b1f9f1 100644 --- a/tests/scriptlets/debug-on-property-read.test.js +++ b/tests/scriptlets/debug-on-property-read.test.js @@ -49,3 +49,14 @@ test('dot notation deferred defenition', (assert) => { console.log(window.aaa.bbb); assert.strictEqual(window.hit, 'FIRED', 'hit fired'); }); + +test('works with an empty object in chain', (assert) => { + const scriptletArgs = [CHAIN_PROPERTY]; + + window.aaa = {}; + runScriptlet(name, scriptletArgs); + window.aaa.bbb = 'value'; + + console.log(window.aaa.bbb); + assert.strictEqual(window.hit, 'FIRED', 'hit fired'); +}); diff --git a/tests/scriptlets/debug-on-property-write.test.js b/tests/scriptlets/debug-on-property-write.test.js index 01f073d2..61108ae2 100644 --- a/tests/scriptlets/debug-on-property-write.test.js +++ b/tests/scriptlets/debug-on-property-write.test.js @@ -48,3 +48,14 @@ test('dot notation deferred defenition', (assert) => { window.aaa.bbb = 'new value'; assert.strictEqual(window.hit, 'FIRED', 'hit fired'); }); + +test('works with an empty object in chain', (assert) => { + const scriptletArgs = [CHAIN_PROPERTY]; + + window.aaa = {}; + runScriptlet(name, scriptletArgs); + window.aaa.bbb = 'value'; + + window.aaa.bbb = 'new value'; + assert.strictEqual(window.hit, 'FIRED', 'hit fired'); +}); diff --git a/tests/scriptlets/log-on-stack-trace.test.js b/tests/scriptlets/log-on-stack-trace.test.js index ccd6e52e..fc8eaf17 100644 --- a/tests/scriptlets/log-on-stack-trace.test.js +++ b/tests/scriptlets/log-on-stack-trace.test.js @@ -68,3 +68,27 @@ test('logs specific message', (assert) => { assert.strictEqual(window.hit, 'FIRED', 'hit fired'); }); + +test('works with an empty object in chain', (assert) => { + const PROPERTY = 'window.aaa.bbb'; + const scriptletArgs = [PROPERTY]; + + window.aaa = {}; + runScriptlet(name, scriptletArgs); + window.aaa.bbb = 'value'; + + assert.strictEqual( + window.aaa.bbb, + 'value', + 'Property is accessible', + ); + + window.aaa.bbb = 'new value'; + assert.strictEqual( + window.aaa.bbb, + 'new value', + 'Property is writeable', + ); + + assert.strictEqual(window.hit, 'FIRED', 'hit fired'); +});