fix: push renderer in effects even if it's `null`

This is needed because effects record the renderer they were created with.
But if we interlieve a DOM renderer with a Custom one, current_renderer
could be a custom one when the effect reruns and if we don't push `null`
it will use the custom_renderer methods instead of the DOM ones.
pull/18359/head
paoloricciuti 4 weeks ago
parent 131fae3c2d
commit e5beb7297d

@ -20,8 +20,9 @@ export function set_renderer(value) {
*/
export function push_renderer(value) {
var previous_hydrating = hydrating;
var should_disable_hydration = hydrating && value != null;
// this is to allow hydration code to treeshake
if (hydrating) {
if (should_disable_hydration) {
set_hydrating(false);
}
var previous_renderer = current_renderer;
@ -29,7 +30,7 @@ export function push_renderer(value) {
return () => {
current_renderer = previous_renderer;
if (previous_hydrating) {
if (should_disable_hydration) {
set_hydrating(previous_hydrating);
}
};

@ -230,7 +230,7 @@ export class Boundary {
this.#pending_effect = branch(() => pending(this.#anchor));
queue_micro_task(() => {
var pop_renderer = this.#effect.r !== null ? push_renderer(this.#effect.r) : null;
var pop_renderer = push_renderer(this.#effect.r);
var fragment = (this.#offscreen_fragment = create_fragment());
var anchor = create_text();
@ -324,7 +324,7 @@ export class Boundary {
set_active_reaction(this.#effect);
set_component_context(this.#effect.ctx);
var pop_renderer = this.#effect.r !== null ? push_renderer(this.#effect.r) : null;
var pop_renderer = push_renderer(this.#effect.r);
try {
Batch.ensure();
@ -368,7 +368,7 @@ export class Boundary {
}
if (this.#offscreen_fragment) {
var pop_renderer = this.#effect.r !== null ? push_renderer(this.#effect.r) : null;
var pop_renderer = push_renderer(this.#effect.r);
insert_before(this.#anchor, this.#offscreen_fragment);
this.#offscreen_fragment = null;
pop_renderer?.();

@ -96,7 +96,7 @@ export class BranchManager {
// if this batch was made obsolete, bail
if (!this.#batches.has(batch)) return;
var pop_renderer = this.#renderer !== null ? push_renderer(this.#renderer) : null;
var pop_renderer = push_renderer(this.#renderer);
var key = /** @type {Key} */ (this.#batches.get(batch));

@ -267,7 +267,7 @@ export function each(node, flags, get_collection, get_key, render_fn, fallback_f
return;
}
var pop_renderer = renderer !== null ? push_renderer(renderer) : null;
var pop_renderer = push_renderer(renderer);
state.pending.delete(batch);

@ -513,7 +513,7 @@ export function destroy_block_effect_children(signal) {
export function destroy_effect(effect, remove_dom = true) {
var removed = false;
var pop_renderer = effect.r !== null ? push_renderer(effect.r) : null;
var pop_renderer = push_renderer(effect.r);
if (
(remove_dom || (effect.f & HEAD_EFFECT) !== 0) &&
@ -738,7 +738,7 @@ export function aborted(effect = /** @type {Effect} */ (active_effect)) {
export function move_effect(effect, fragment) {
if (!effect.nodes) return;
var pop_renderer = effect.r !== null ? push_renderer(effect.r) : null;
var pop_renderer = push_renderer(effect.r);
/** @type {TemplateNode | null} */
var node = effect.nodes.start;

@ -446,7 +446,7 @@ export function update_effect(effect) {
active_effect = effect;
is_updating_effect = true;
var pop_renderer = effect.r !== null ? push_renderer(effect.r) : null;
var pop_renderer = push_renderer(effect.r);
if (DEV) {
var previous_component_fn = dev_current_component_function;

Loading…
Cancel
Save