diff --git a/src/compiler/code_generator.ts b/src/compiler/code_generator.ts index b401ff5d..136aa81d 100644 --- a/src/compiler/code_generator.ts +++ b/src/compiler/code_generator.ts @@ -1140,7 +1140,7 @@ export class CodeGenerator { if (this.target.loopLevel || !this.hasSafeContext) { ctxStr = generateId("ctx"); this.helpers.add("capture"); - this.define(ctxStr, `capture(ctx, this)`); + this.define(ctxStr, `capture(ctx)`); } let slotStr: string[] = []; for (let slotName in ast.slots) { @@ -1316,7 +1316,7 @@ export class CodeGenerator { if (this.target.loopLevel || !this.hasSafeContext) { ctxStr = generateId("ctx"); this.helpers.add("capture"); - this.define(ctxStr, `capture(ctx, this)`); + this.define(ctxStr, `capture(ctx)`); } let id = generateId("comp"); this.staticDefs.push({ diff --git a/src/runtime/template_helpers.ts b/src/runtime/template_helpers.ts index a6944918..82a68e1a 100644 --- a/src/runtime/template_helpers.ts +++ b/src/runtime/template_helpers.ts @@ -46,8 +46,8 @@ function callSlot( return slotBDom || text(""); } -function capture(ctx: any, component: any): any { - const result = ObjectCreate(component); +function capture(ctx: any): any { + const result = ObjectCreate(ctx); for (let k in ctx) { result[k] = ctx[k]; } @@ -114,7 +114,7 @@ class LazyValue { constructor(fn: any, ctx: any, component: any, node: any, key: any) { this.fn = fn; - this.ctx = capture(ctx, component); + this.ctx = capture(ctx); this.component = component; this.node = node; this.key = key; diff --git a/tests/components/__snapshots__/error_handling.test.ts.snap b/tests/components/__snapshots__/error_handling.test.ts.snap index ee7453ff..c61822c0 100644 --- a/tests/components/__snapshots__/error_handling.test.ts.snap +++ b/tests/components/__snapshots__/error_handling.test.ts.snap @@ -941,7 +941,7 @@ exports[`can catch errors catching error, rethrow, render parent -- a main comp ctx[\`cp\`] = v_block1[i1]; const key1 = ctx['cp'].id; const v1 = ctx['cp']; - const ctx1 = capture(ctx, this); + const ctx1 = capture(ctx); c_block1[i1] = withKey(comp2({onError: ()=>this.cleanUp(v1.id),slots: markRaw({'default': {__render: slot1.bind(this), __ctx: ctx1}})}, key + \`__2__\${key1}\`, node, this, null), key1); } return list(c_block1); @@ -1019,7 +1019,7 @@ exports[`can catch errors catching in child makes parent render 1`] = ` ctx[\`elem\`] = v_block1[i1]; const key1 = ctx['elem'][0]; const v1 = ctx['elem']; - const ctx1 = capture(ctx, this); + const ctx1 = capture(ctx); c_block1[i1] = withKey(comp2({onError: (_error)=>this.onError(v1[0],_error),slots: markRaw({'default': {__render: slot1.bind(this), __ctx: ctx1}})}, key + \`__2__\${key1}\`, node, this, null), key1); } return list(c_block1); diff --git a/tests/components/__snapshots__/refs.test.ts.snap b/tests/components/__snapshots__/refs.test.ts.snap index bb4e4c41..e90390d4 100644 --- a/tests/components/__snapshots__/refs.test.ts.snap +++ b/tests/components/__snapshots__/refs.test.ts.snap @@ -78,7 +78,7 @@ exports[`refs refs are properly bound in slots 1`] = ` return function template(ctx, node, key = \\"\\") { let txt1 = ctx['state'].val; - const ctx1 = capture(ctx, this); + const ctx1 = capture(ctx); const b3 = comp1({slots: markRaw({'footer': {__render: slot1.bind(this), __ctx: ctx1}})}, key + \`__1\`, node, this, null); return block1([txt1], [b3]); } diff --git a/tests/components/__snapshots__/slots.test.ts.snap b/tests/components/__snapshots__/slots.test.ts.snap index 501445bf..4eab0079 100644 --- a/tests/components/__snapshots__/slots.test.ts.snap +++ b/tests/components/__snapshots__/slots.test.ts.snap @@ -54,7 +54,7 @@ exports[`slots can define and call slots 1`] = ` } return function template(ctx, node, key = \\"\\") { - const ctx1 = capture(ctx, this); + const ctx1 = capture(ctx); const b4 = comp1({slots: markRaw({'header': {__render: slot1.bind(this), __ctx: ctx1}, 'footer': {__render: slot2.bind(this), __ctx: ctx1}})}, key + \`__1\`, node, this, null); return block1([], [b4]); } @@ -89,7 +89,7 @@ exports[`slots can define and call slots with bound params 1`] = ` } return function template(ctx, node, key = \\"\\") { - const ctx1 = capture(ctx, this); + const ctx1 = capture(ctx); return comp1({slots: markRaw({'abc': {__render: slot1.bind(this), __ctx: ctx1, getValue: bind(this, ctx['getValue'])}})}, key + \`__1\`, node, this, null); } }" @@ -129,7 +129,7 @@ exports[`slots can define and call slots with params 1`] = ` } return function template(ctx, node, key = \\"\\") { - const ctx1 = capture(ctx, this); + const ctx1 = capture(ctx); const b4 = comp1({slots: markRaw({'header': {__render: slot1.bind(this), __ctx: ctx1, param: ctx['var']}, 'footer': {__render: slot2.bind(this), __ctx: ctx1, param: '5'}})}, key + \`__1\`, node, this, null); return block1([], [b4]); } @@ -363,7 +363,7 @@ exports[`slots default content is not rendered if named slot is provided 1`] = ` } return function template(ctx, node, key = \\"\\") { - const ctx1 = capture(ctx, this); + const ctx1 = capture(ctx); const b3 = comp1({slots: markRaw({'header': {__render: slot1.bind(this), __ctx: ctx1}})}, key + \`__1\`, node, this, null); return block1([], [b3]); } @@ -442,7 +442,7 @@ exports[`slots default slot next to named slot, with default content 1`] = ` } return function template(ctx, node, key = \\"\\") { - const ctx1 = capture(ctx, this); + const ctx1 = capture(ctx); const b3 = comp1({slots: markRaw({'footer': {__render: slot1.bind(this), __ctx: ctx1}})}, key + \`__1\`, node, this, null); return block1([], [b3]); } @@ -619,7 +619,7 @@ exports[`slots dynamic slot in multiple locations 1`] = ` } return function template(ctx, node, key = \\"\\") { - const ctx1 = capture(ctx, this); + const ctx1 = capture(ctx); return comp2({location: ctx['state'].location,slots: markRaw({'coffee': {__render: slot1.bind(this), __ctx: ctx1}})}, key + \`__2\`, node, this, null); } }" @@ -685,7 +685,7 @@ exports[`slots dynamic t-slot call 1`] = ` } return function template(ctx, node, key = \\"\\") { - const ctx1 = capture(ctx, this); + const ctx1 = capture(ctx); const b6 = comp1({slots: markRaw({'slot1': {__render: slot1.bind(this), __ctx: ctx1}, 'slot2': {__render: slot2.bind(this), __ctx: ctx1}})}, key + \`__1\`, node, this, null); return block1([], [b6]); } @@ -732,7 +732,7 @@ exports[`slots dynamic t-slot call with default 1`] = ` } return function template(ctx, node, key = \\"\\") { - const ctx1 = capture(ctx, this); + const ctx1 = capture(ctx); const b6 = comp1({slots: markRaw({'slot1': {__render: slot1.bind(this), __ctx: ctx1}, 'slot2': {__render: slot2.bind(this), __ctx: ctx1}})}, key + \`__1\`, node, this, null); return block1([], [b6]); } @@ -865,7 +865,7 @@ exports[`slots mix of slots, t-call, t-call with body, and giving own props chil } return function template(ctx, node, key = \\"\\") { - const ctx1 = capture(ctx, this); + const ctx1 = capture(ctx); return comp1({slots: markRaw({'default': {__render: slot1.bind(this), __ctx: ctx1}})}, key + \`__2\`, node, this, null); } }" @@ -991,7 +991,7 @@ exports[`slots multiple roots are allowed in a named slot 1`] = ` } return function template(ctx, node, key = \\"\\") { - const ctx1 = capture(ctx, this); + const ctx1 = capture(ctx); const b5 = comp1({slots: markRaw({'content': {__render: slot1.bind(this), __ctx: ctx1}})}, key + \`__1\`, node, this, null); return block1([], [b5]); } @@ -1031,7 +1031,7 @@ exports[`slots multiple slots containing components 1`] = ` } return function template(ctx, node, key = \\"\\") { - const ctx1 = capture(ctx, this); + const ctx1 = capture(ctx); return comp3({slots: markRaw({'s1': {__render: slot1.bind(this), __ctx: ctx1}, 's2': {__render: slot2.bind(this), __ctx: ctx1}})}, key + \`__3\`, node, this, null); } }" @@ -1085,7 +1085,7 @@ exports[`slots named slot inside slot 1`] = ` } function slot2(ctx, node, key = \\"\\") { - const ctx2 = capture(ctx, this); + const ctx2 = capture(ctx); return comp1({slots: markRaw({'brol': {__render: slot3.bind(this), __ctx: ctx2}})}, key + \`__1\`, node, this, null); } @@ -1095,7 +1095,7 @@ exports[`slots named slot inside slot 1`] = ` } return function template(ctx, node, key = \\"\\") { - const ctx1 = capture(ctx, this); + const ctx1 = capture(ctx); const b5 = comp2({slots: markRaw({'brol': {__render: slot1.bind(this), __ctx: ctx1}, 'default': {__render: slot2.bind(this), __ctx: ctx1}})}, key + \`__2\`, node, this, null); return block1([], [b5]); } @@ -1136,7 +1136,7 @@ exports[`slots named slot inside slot, part 3 1`] = ` } function slot2(ctx, node, key = \\"\\") { - const ctx2 = capture(ctx, this); + const ctx2 = capture(ctx); return comp1({slots: markRaw({'brol': {__render: slot3.bind(this), __ctx: ctx2}})}, key + \`__1\`, node, this, null); } @@ -1146,7 +1146,7 @@ exports[`slots named slot inside slot, part 3 1`] = ` } return function template(ctx, node, key = \\"\\") { - const ctx1 = capture(ctx, this); + const ctx1 = capture(ctx); const b5 = comp2({slots: markRaw({'brol': {__render: slot1.bind(this), __ctx: ctx1}, 'default': {__render: slot2.bind(this), __ctx: ctx1}})}, key + \`__2\`, node, this, null); return block1([], [b5]); } @@ -1221,7 +1221,7 @@ exports[`slots named slots inside slot, again 1`] = ` } function slot2(ctx, node, key = \\"\\") { - const ctx2 = capture(ctx, this); + const ctx2 = capture(ctx); return comp1({slots: markRaw({'brol2': {__render: slot3.bind(this), __ctx: ctx2}})}, key + \`__1\`, node, this, null); } @@ -1231,7 +1231,7 @@ exports[`slots named slots inside slot, again 1`] = ` } return function template(ctx, node, key = \\"\\") { - const ctx1 = capture(ctx, this); + const ctx1 = capture(ctx); const b5 = comp2({slots: markRaw({'brol1': {__render: slot1.bind(this), __ctx: ctx1}, 'default': {__render: slot2.bind(this), __ctx: ctx1}})}, key + \`__2\`, node, this, null); return block1([], [b5]); } @@ -1569,7 +1569,7 @@ exports[`slots simple dynamic slot with slot scope 1`] = ` } return function template(ctx, node, key = \\"\\") { - const ctx1 = capture(ctx, this); + const ctx1 = capture(ctx); return comp1({slots: markRaw({'slotName': {__render: slot1.bind(this), __ctx: ctx1, __scope: \\"slotScope\\"}})}, key + \`__1\`, node, this, null); } }" @@ -1599,7 +1599,7 @@ exports[`slots simple named and empty slot -- 2 1`] = ` const comp1 = app.createComponent(\`Child\`, true, true, false, true); return function template(ctx, node, key = \\"\\") { - const ctx1 = capture(ctx, this); + const ctx1 = capture(ctx); return comp1({slots: markRaw({'myEmptySlot': {myProp: 'myProp text'}})}, key + \`__1\`, node, this, null); } }" @@ -1636,7 +1636,7 @@ exports[`slots simple named and empty slot 1`] = ` } return function template(ctx, node, key = \\"\\") { - const ctx1 = capture(ctx, this); + const ctx1 = capture(ctx); return comp1({slots: markRaw({'myEmptySlot': {}, 'default': {__render: slot1.bind(this), __ctx: ctx1}})}, key + \`__1\`, node, this, null); } }" @@ -1676,7 +1676,7 @@ exports[`slots simple slot with slot scope 1`] = ` } return function template(ctx, node, key = \\"\\") { - const ctx1 = capture(ctx, this); + const ctx1 = capture(ctx); return comp1({slots: markRaw({'slotName': {__render: slot1.bind(this), __ctx: ctx1, __scope: \\"slotScope\\"}})}, key + \`__1\`, node, this, null); } }" @@ -1712,7 +1712,7 @@ exports[`slots slot and (inline) t-call 1`] = ` } return function template(ctx, node, key = \\"\\") { - const ctx1 = capture(ctx, this); + const ctx1 = capture(ctx); const b3 = comp1({slots: markRaw({'default': {__render: slot1.bind(this), __ctx: ctx1}})}, key + \`__2\`, node, this, null); return block1([], [b3]); } @@ -1762,7 +1762,7 @@ exports[`slots slot and t-call 1`] = ` } return function template(ctx, node, key = \\"\\") { - const ctx1 = capture(ctx, this); + const ctx1 = capture(ctx); const b3 = comp1({slots: markRaw({'default': {__render: slot1.bind(this), __ctx: ctx1}})}, key + \`__2\`, node, this, null); return block1([], [b3]); } @@ -1997,7 +1997,7 @@ exports[`slots slot content is bound to caller (variation) 1`] = ` } return function template(ctx, node, key = \\"\\") { - const ctx1 = capture(ctx, this); + const ctx1 = capture(ctx); return comp1({slots: markRaw({'default': {__render: slot1.bind(this), __ctx: ctx1}})}, key + \`__1\`, node, this, null); } }" @@ -2224,7 +2224,7 @@ exports[`slots slot preserves properly parented relationship, even through t-cal } return function template(ctx, node, key = \\"\\") { - const ctx1 = capture(ctx, this); + const ctx1 = capture(ctx); const b3 = comp1({slots: markRaw({'default': {__render: slot1.bind(this), __ctx: ctx1}})}, key + \`__2\`, node, this, null); return block1([], [b3]); } @@ -2285,7 +2285,7 @@ exports[`slots slot with slot scope and t-props 1`] = ` } return function template(ctx, node, key = \\"\\") { - const ctx1 = capture(ctx, this); + const ctx1 = capture(ctx); return comp1({slots: markRaw({'slotName': {__render: slot1.bind(this), __ctx: ctx1, __scope: \\"info\\"}})}, key + \`__1\`, node, this, null); } }" @@ -2387,7 +2387,7 @@ exports[`slots slots are rendered with proper context 1`] = ` return function template(ctx, node, key = \\"\\") { let txt1 = ctx['state'].val; - const ctx1 = capture(ctx, this); + const ctx1 = capture(ctx); const b3 = comp1({slots: markRaw({'footer': {__render: slot1.bind(this), __ctx: ctx1}})}, key + \`__1\`, node, this, null); return block1([txt1], [b3]); } @@ -2431,7 +2431,7 @@ exports[`slots slots are rendered with proper context, part 2 1`] = ` for (let i1 = 0; i1 < l_block2; i1++) { ctx[\`user\`] = v_block2[i1]; const key1 = ctx['user'].id; - const ctx1 = capture(ctx, this); + const ctx1 = capture(ctx); const b7 = comp1({to: '/user/'+ctx['user'].id,slots: markRaw({'default': {__render: slot1.bind(this), __ctx: ctx1}})}, key + \`__1__\${key1}\`, node, this, null); c_block2[i1] = withKey(block3([], [b7]), key1); } @@ -2480,7 +2480,7 @@ exports[`slots slots are rendered with proper context, part 3 1`] = ` ctx[\`user\`] = v_block2[i1]; const key1 = ctx['user'].id; setContextValue(ctx, \\"userdescr\\", 'User '+ctx['user'].name); - const ctx1 = capture(ctx, this); + const ctx1 = capture(ctx); const b5 = comp1({to: '/user/'+ctx['user'].id,slots: markRaw({'default': {__render: slot1.bind(this), __ctx: ctx1}})}, key + \`__1__\${key1}\`, node, this, null); c_block2[i1] = withKey(block3([], [b5]), key1); } @@ -2523,7 +2523,7 @@ exports[`slots slots are rendered with proper context, part 4 1`] = ` ctx = Object.create(ctx); ctx[isBoundary] = 1 setContextValue(ctx, \\"userdescr\\", 'User '+ctx['state'].user.name); - const ctx1 = capture(ctx, this); + const ctx1 = capture(ctx); const b3 = comp1({to: '/user/'+ctx['state'].user.id,slots: markRaw({'default': {__render: slot1.bind(this), __ctx: ctx1}})}, key + \`__1\`, node, this, null); return block1([], [b3]); } @@ -2565,7 +2565,7 @@ exports[`slots slots in slots, with vars 1`] = ` ctx = Object.create(ctx); ctx[isBoundary] = 1 setContextValue(ctx, \\"test\\", ctx['state'].name); - const ctx1 = capture(ctx, this); + const ctx1 = capture(ctx); const b3 = comp1({slots: markRaw({'default': {__render: slot1.bind(this), __ctx: ctx1}})}, key + \`__1\`, node, this, null); return block1([], [b3]); } @@ -2627,7 +2627,7 @@ exports[`slots slots in t-foreach and re-rendering 1`] = ` ctx[\`n\`] = v_block2[i1]; ctx[\`n_index\`] = i1; const key1 = ctx['n_index']; - const ctx1 = capture(ctx, this); + const ctx1 = capture(ctx); c_block2[i1] = withKey(comp1({slots: markRaw({'default': {__render: slot1.bind(this), __ctx: ctx1}})}, key + \`__1__\${key1}\`, node, this, null), key1); } const b2 = list(c_block2); @@ -2682,7 +2682,7 @@ exports[`slots slots in t-foreach in t-foreach 1`] = ` for (let i2 = 0; i2 < l_block6; i2++) { ctx[\`node2\`] = v_block6[i2]; const key2 = ctx['node2'].key; - const ctx1 = capture(ctx, this); + const ctx1 = capture(ctx); c_block6[i2] = withKey(comp1({slots: markRaw({'default': {__render: slot1.bind(this), __ctx: ctx1}})}, key + \`__1__\${key1}__\${key2}\`, node, this, null), key2); } ctx = ctx.__proto__; @@ -2734,7 +2734,7 @@ exports[`slots slots in t-foreach with t-set and re-rendering 1`] = ` ctx[\`n_index\`] = i1; const key1 = ctx['n_index']; setContextValue(ctx, \\"dummy\\", ctx['n_index']); - const ctx1 = capture(ctx, this); + const ctx1 = capture(ctx); c_block2[i1] = withKey(comp1({slots: markRaw({'default': {__render: slot1.bind(this), __ctx: ctx1}})}, key + \`__1__\${key1}\`, node, this, null), key1); } const b2 = list(c_block2); @@ -2774,7 +2774,7 @@ exports[`slots t-debug on a t-set-slot (defining a slot) 1`] = ` } return function template(ctx, node, key = \\"\\") { - const ctx1 = capture(ctx, this); + const ctx1 = capture(ctx); const b3 = comp1({slots: markRaw({'content': {__render: slot1.bind(this), __ctx: ctx1}})}, key + \`__1\`, node, this, null); return block1([], [b3]); } @@ -2813,7 +2813,7 @@ exports[`slots t-set t-value in a slot 1`] = ` } return function template(ctx, node, key = \\"\\") { - const ctx1 = capture(ctx, this); + const ctx1 = capture(ctx); const b3 = comp1({slots: markRaw({'default': {__render: slot1.bind(this), __ctx: ctx1}})}, key + \`__1\`, node, this, null); return block1([], [b3]); } @@ -2847,7 +2847,7 @@ exports[`slots t-set-slot=default has priority over rest of the content 1`] = ` } return function template(ctx, node, key = \\"\\") { - const ctx1 = capture(ctx, this); + const ctx1 = capture(ctx); return comp1({slots: markRaw({'default': {__render: slot1.bind(this), __ctx: ctx1}})}, key + \`__1\`, node, this, null); } }" @@ -2905,7 +2905,7 @@ exports[`slots t-slot in recursive templates 1`] = ` } return function template(ctx, node, key = \\"\\") { - const ctx1 = capture(ctx, this); + const ctx1 = capture(ctx); return comp1({slots: markRaw({'default': {__render: slot1.bind(this), __ctx: ctx1}})}, key + \`__2\`, node, this, null); } }" @@ -3083,7 +3083,7 @@ exports[`slots t-slot within dynamic t-call 1`] = ` } return function template(ctx, node, key = \\"\\") { - const ctx1 = capture(ctx, this); + const ctx1 = capture(ctx); const b3 = comp1({slots: markRaw({'default': {__render: slot1.bind(this), __ctx: ctx1}})}, key + \`__2\`, node, this, null); return block1([], [b3]); } diff --git a/tests/components/__snapshots__/t_call.test.ts.snap b/tests/components/__snapshots__/t_call.test.ts.snap index 4210e59f..f56af038 100644 --- a/tests/components/__snapshots__/t_call.test.ts.snap +++ b/tests/components/__snapshots__/t_call.test.ts.snap @@ -558,7 +558,7 @@ exports[`t-call t-call-context: ComponentNode is not looked up in the context 2` const refs = this.__owl__.refs; const ref1 = (el) => refs[\`myRef\`] = el; const b2 = block2([ref1]); - const ctx1 = capture(ctx, this); + const ctx1 = capture(ctx); const b7 = comp1({prop: bind(this, ctx['method']),slots: markRaw({'default': {__render: slot1.bind(this), __ctx: ctx1}})}, key + \`__1\`, node, this, null); return multi([b2, b7]); } @@ -576,3 +576,51 @@ exports[`t-call t-call-context: ComponentNode is not looked up in the context 3` } }" `; + +exports[`t-call t-call-context: slots don't make component available again when context is captured 1`] = ` +"function anonymous(app, bdom, helpers +) { + let { text, createBlock, list, multi, html, toggler, comment } = bdom; + const callTemplate_1 = app.getTemplate(\`template\`); + + return function template(ctx, node, key = \\"\\") { + let ctx1 = {}; + return callTemplate_1.call(this, ctx1, node, key + \`__1\`); + } +}" +`; + +exports[`t-call t-call-context: slots don't make component available again when context is captured 2`] = ` +"function anonymous(app, bdom, helpers +) { + let { text, createBlock, list, multi, html, toggler, comment } = bdom; + let { isBoundary, withDefault, setContextValue, capture, markRaw } = helpers; + const comp1 = app.createComponent(\`Child\`, true, true, false, true); + + function slot1(ctx, node, key = \\"\\") { + return text(ctx['someValue']); + } + + return function template(ctx, node, key = \\"\\") { + ctx = Object.create(ctx); + ctx[isBoundary] = 1 + setContextValue(ctx, \\"dummy\\", 0); + const ctx1 = capture(ctx); + const props1 = {slots: markRaw({'default': {__render: slot1.bind(this), __ctx: ctx1}})}; + helpers.validateProps(\`Child\`, props1, this); + return comp1(props1, key + \`__1\`, node, this, null); + } +}" +`; + +exports[`t-call t-call-context: slots don't make component available again when context is captured 3`] = ` +"function anonymous(app, bdom, helpers +) { + let { text, createBlock, list, multi, html, toggler, comment } = bdom; + let { callSlot } = helpers; + + return function template(ctx, node, key = \\"\\") { + return callSlot(ctx, node, key, 'default', false, {}); + } +}" +`; diff --git a/tests/components/__snapshots__/t_foreach.test.ts.snap b/tests/components/__snapshots__/t_foreach.test.ts.snap index 9e322886..c612e6bf 100644 --- a/tests/components/__snapshots__/t_foreach.test.ts.snap +++ b/tests/components/__snapshots__/t_foreach.test.ts.snap @@ -175,7 +175,7 @@ exports[`list of components order is correct when slots are not of same type 1`] } return function template(ctx, node, key = \\"\\") { - const ctx1 = capture(ctx, this); + const ctx1 = capture(ctx); return comp1({slots: markRaw({'a': {__render: slot1.bind(this), __ctx: ctx1, active: !ctx['state'].active}, 'b': {__render: slot2.bind(this), __ctx: ctx1, active: true}, 'c': {__render: slot3.bind(this), __ctx: ctx1, active: ctx['state'].active}})}, key + \`__1\`, node, this, null); } }" diff --git a/tests/components/__snapshots__/t_on.test.ts.snap b/tests/components/__snapshots__/t_on.test.ts.snap index 89b74f1d..5b30afd3 100644 --- a/tests/components/__snapshots__/t_on.test.ts.snap +++ b/tests/components/__snapshots__/t_on.test.ts.snap @@ -401,7 +401,7 @@ exports[`t-on t-on on t-set-slots 1`] = ` const b2 = text(\` [\`); const b3 = text(ctx['state'].count); const b4 = text(\`] \`); - const ctx1 = capture(ctx, this); + const ctx1 = capture(ctx); const b8 = comp1({slots: markRaw({'myslot': {__render: slot1.bind(this), __ctx: ctx1}})}, key + \`__1\`, node, this, null); return multi([b2, b3, b4, b8]); } diff --git a/tests/components/__snapshots__/t_set.test.ts.snap b/tests/components/__snapshots__/t_set.test.ts.snap index 2b71897f..e25f5d4b 100644 --- a/tests/components/__snapshots__/t_set.test.ts.snap +++ b/tests/components/__snapshots__/t_set.test.ts.snap @@ -21,7 +21,7 @@ exports[`t-set slot setted value (with t-set) not accessible with t-esc 1`] = ` ctx[isBoundary] = 1 setContextValue(ctx, \\"iter\\", 'source'); let txt1 = ctx['iter']; - const ctx1 = capture(ctx, this); + const ctx1 = capture(ctx); const b2 = comp1({slots: markRaw({'default': {__render: slot1.bind(this), __ctx: ctx1}})}, key + \`__1\`, node, this, null); let txt2 = ctx['iter']; return block1([txt1, txt2], [b2]); @@ -70,7 +70,7 @@ exports[`t-set slots with a t-set with a component in body 1`] = ` } return function template(ctx, node, key = \\"\\") { - const ctx1 = capture(ctx, this); + const ctx1 = capture(ctx); return comp2({slots: markRaw({'default': {__render: slot1.bind(this), __ctx: ctx1}})}, key + \`__2\`, node, this, null); } }" @@ -127,7 +127,7 @@ exports[`t-set slots with an t-set with a component in body 1`] = ` } return function template(ctx, node, key = \\"\\") { - const ctx1 = capture(ctx, this); + const ctx1 = capture(ctx); return comp2({slots: markRaw({'default': {__render: slot1.bind(this), __ctx: ctx1}})}, key + \`__2\`, node, this, null); } }" @@ -178,7 +178,7 @@ exports[`t-set slots with an unused t-set with a component in body 1`] = ` } return function template(ctx, node, key = \\"\\") { - const ctx1 = capture(ctx, this); + const ctx1 = capture(ctx); return comp2({slots: markRaw({'default': {__render: slot1.bind(this), __ctx: ctx1}})}, key + \`__2\`, node, this, null); } }" diff --git a/tests/components/t_call.test.ts b/tests/components/t_call.test.ts index 83b1ec1a..9a425677 100644 --- a/tests/components/t_call.test.ts +++ b/tests/components/t_call.test.ts @@ -316,7 +316,7 @@ describe("t-call", () => { expect(fixture.innerHTML).toBe("childaaronchildlucas"); }); - test.only("t-call-context: ComponentNode is not looked up in the context", async () => { + test("t-call-context: ComponentNode is not looked up in the context", async () => { let child: any; class Child extends Component { static template = xml``; @@ -357,4 +357,30 @@ describe("t-call", () => { expect(Object.keys(child.__owl__.refs)).toEqual([]); expect(Object.keys(root.__owl__.refs)).toEqual(["myRef", "myRef2"]); }); + + test("t-call-context: slots don't make component available again when context is captured", async () => { + class Child extends Component { + static template = xml``; + } + + class Root extends Component { + static template = xml``; + static components = { Child }; + someValue = "Hello"; + } + + await mount(Root, fixture, { + test: true, + templates: ` + + + + + + + + `, + }); + expect(fixture.innerHTML).toBe(""); + }); }); diff --git a/tests/misc/__snapshots__/portal.test.ts.snap b/tests/misc/__snapshots__/portal.test.ts.snap index e9c7b38b..19b2f544 100644 --- a/tests/misc/__snapshots__/portal.test.ts.snap +++ b/tests/misc/__snapshots__/portal.test.ts.snap @@ -20,7 +20,7 @@ exports[`Portal Add and remove portals 1`] = ` for (let i1 = 0; i1 < l_block1; i1++) { ctx[\`portalId\`] = v_block1[i1]; const key1 = ctx['portalId']; - const ctx1 = capture(ctx, this); + const ctx1 = capture(ctx); c_block1[i1] = withKey(comp1({target: '#outside',slots: {'default': {__render: slot1.bind(this), __ctx: ctx1}}}, key + \`__1__\${key1}\`, node, ctx, Portal), key1); } return list(c_block1); @@ -49,7 +49,7 @@ exports[`Portal Add and remove portals on div 1`] = ` for (let i1 = 0; i1 < l_block1; i1++) { ctx[\`portalId\`] = v_block1[i1]; const key1 = ctx['portalId']; - const ctx1 = capture(ctx, this); + const ctx1 = capture(ctx); c_block1[i1] = withKey(comp1({target: '#outside',slots: {'default': {__render: slot1.bind(this), __ctx: ctx1}}}, key + \`__1__\${key1}\`, node, ctx, Portal), key1); } return list(c_block1); @@ -80,7 +80,7 @@ exports[`Portal Add and remove portals with t-foreach 1`] = ` ctx[\`portalId\`] = v_block1[i1]; const key1 = ctx['portalId']; let txt1 = ctx['portalId']; - const ctx1 = capture(ctx, this); + const ctx1 = capture(ctx); const b6 = comp1({target: '#outside',slots: {'default': {__render: slot1.bind(this), __ctx: ctx1}}}, key + \`__1__\${key1}\`, node, ctx, Portal); c_block1[i1] = withKey(block2([txt1], [b6]), key1); } @@ -112,7 +112,7 @@ exports[`Portal Add and remove portals with t-foreach and destroy 1`] = ` ctx[\`portalId\`] = v_block1[i1]; const key1 = ctx['portalId']; let txt1 = ctx['portalId']; - const ctx1 = capture(ctx, this); + const ctx1 = capture(ctx); const b6 = comp1({target: '#outside',slots: {'default': {__render: slot1.bind(this), __ctx: ctx1}}}, key + \`__1__\${key1}\`, node, ctx, Portal); c_block1[i1] = withKey(block2([txt1], [b6]), key1); } @@ -145,7 +145,7 @@ exports[`Portal Add and remove portals with t-foreach inside div 1`] = ` ctx[\`portalId\`] = v_block2[i1]; const key1 = ctx['portalId']; let txt1 = ctx['portalId']; - const ctx1 = capture(ctx, this); + const ctx1 = capture(ctx); const b7 = comp1({target: '#outside',slots: {'default': {__render: slot1.bind(this), __ctx: ctx1}}}, key + \`__1__\${key1}\`, node, ctx, Portal); c_block2[i1] = withKey(block3([txt1], [b7]), key1); } @@ -431,7 +431,7 @@ exports[`Portal conditional use of Portal with child and div 2`] = ` for (let i1 = 0; i1 < l_block2; i1++) { ctx[\`elem\`] = v_block2[i1]; const key1 = ctx['elem']; - const ctx1 = capture(ctx, this); + const ctx1 = capture(ctx); c_block2[i1] = withKey(comp1({target: '#outside',slots: {'default': {__render: slot1.bind(this), __ctx: ctx1}}}, key + \`__1__\${key1}\`, node, ctx, Portal), key1); } const b2 = list(c_block2); @@ -481,7 +481,7 @@ exports[`Portal conditional use of Portal with child and div, variation 2`] = ` for (let i1 = 0; i1 < l_block3; i1++) { ctx[\`elem\`] = v_block3[i1]; const key1 = ctx['elem']; - const ctx1 = capture(ctx, this); + const ctx1 = capture(ctx); c_block3[i1] = withKey(comp1({target: '#outside',slots: {'default': {__render: slot1.bind(this), __ctx: ctx1}}}, key + \`__1__\${key1}\`, node, ctx, Portal), key1); } const b3 = list(c_block3);