From 83318b6bf5a2828f861225a6e5dc3348b789bb15 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Fri, 23 Nov 2018 23:14:53 -0500 Subject: [PATCH] window dimension bindings --- src/compile/render-dom/index.ts | 2 +- src/compile/render-dom/wrappers/Window.ts | 33 ++++++++----------- .../_config.js | 10 +++--- 3 files changed, 21 insertions(+), 24 deletions(-) diff --git a/src/compile/render-dom/index.ts b/src/compile/render-dom/index.ts index c18b28a976..27897ac6f7 100644 --- a/src/compile/render-dom/index.ts +++ b/src/compile/render-dom/index.ts @@ -199,7 +199,7 @@ export default function dom( } `); - if (component.writable_declarations.has(x.as)) { + if (component.writable_declarations.has(x.as) && !renderer.readonly.has(x.as)) { body.push(deindent` set ${x.as}(value) { this.$set({ ${x.name}: value }); diff --git a/src/compile/render-dom/wrappers/Window.ts b/src/compile/render-dom/wrappers/Window.ts index 3432f8079c..dfaaaa56ec 100644 --- a/src/compile/render-dom/wrappers/Window.ts +++ b/src/compile/render-dom/wrappers/Window.ts @@ -109,30 +109,25 @@ export default class WindowWrapper extends Wrapper { }); } - const handler_body = deindent` - ${event === 'scroll' && deindent` - if (${lock}) return; - ${lock} = true; - `} - ${component.options.dev && `component._updatingReadonlyProperty = true;`} - - #component.set({ - ${props.map(prop => `${prop.name}: this.${prop.value}`)} - }); - - ${component.options.dev && `component._updatingReadonlyProperty = false;`} - ${event === 'scroll' && `${lock} = false;`} - `; + component.declarations.push(handler_name); + component.partly_hoisted.push(deindent` + function ${handler_name}() { + ${event === 'scroll' && deindent` + if (${lock}) return; + ${lock} = true; + `} + ${props.map(prop => `${prop.name} = window.${prop.value}; $$make_dirty('${prop.name}');`)} + ${event === 'scroll' && `${lock} = false;`} + } + `); block.builders.init.addBlock(deindent` - function ${handler_name}(event) { - ${handler_body} - } - window.addEventListener("${event}", ${handler_name}); + window.addEventListener("${event}", ctx.${handler_name}); + @after_render(ctx.${handler_name}); `); block.builders.destroy.addBlock(deindent` - window.removeEventListener("${event}", ${handler_name}); + window.removeEventListener("${event}", ctx.${handler_name}); `); }); diff --git a/test/runtime/samples/dev-warning-readonly-window-binding/_config.js b/test/runtime/samples/dev-warning-readonly-window-binding/_config.js index 0df03ec3b6..91c7959e98 100644 --- a/test/runtime/samples/dev-warning-readonly-window-binding/_config.js +++ b/test/runtime/samples/dev-warning-readonly-window-binding/_config.js @@ -1,14 +1,16 @@ export default { + solo: 1, + compileOptions: { dev: true }, - test ( assert, component ) { + test(assert, component) { try { component.width = 99; - throw new Error( 'Expected an error' ); - } catch ( err ) { - assert.equal( err.message, `: Cannot set read-only property 'width'` ); + throw new Error('Expected an error'); + } catch (err) { + assert.equal(err.message, `: Cannot set read-only property 'width'`); } } }; \ No newline at end of file