mirror of https://github.com/sveltejs/svelte
parent
39d65a47fc
commit
b1dbb94d30
@ -0,0 +1,25 @@
|
||||
import { flushSync } from 'svelte';
|
||||
import { test } from '../../assert';
|
||||
|
||||
const tick = () => Promise.resolve();
|
||||
|
||||
// Check that rendering a custom element and setting a property before it is registered
|
||||
// does not break the "when to set this as a property" logic
|
||||
export default test({
|
||||
async test({ assert, target }) {
|
||||
target.innerHTML = '<custom-element></custom-element>';
|
||||
await tick();
|
||||
await tick();
|
||||
|
||||
const ce_root = target.querySelector('custom-element').shadowRoot;
|
||||
|
||||
ce_root.querySelector('button')?.click();
|
||||
flushSync();
|
||||
await tick();
|
||||
await tick();
|
||||
|
||||
const inner_ce_root = ce_root.querySelectorAll('set-property-before-mounted');
|
||||
assert.htmlEqual(inner_ce_root[0].shadowRoot.innerHTML, 'object|{"foo":"bar"}');
|
||||
assert.htmlEqual(inner_ce_root[1].shadowRoot.innerHTML, 'object|{"foo":"bar"}');
|
||||
}
|
||||
});
|
||||
@ -0,0 +1,31 @@
|
||||
<svelte:options customElement="custom-element" />
|
||||
|
||||
<script lang="ts">
|
||||
import { onMount } from 'svelte';
|
||||
|
||||
class CustomElement extends HTMLElement {
|
||||
constructor() {
|
||||
super();
|
||||
this.attachShadow({ mode: 'open' });
|
||||
Object.defineProperty(this, 'property', {
|
||||
set: (value) => {
|
||||
this.shadowRoot.innerHTML = typeof value + '|' + JSON.stringify(value);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
onMount(async () => {
|
||||
customElements.define('set-property-before-mounted', CustomElement);
|
||||
});
|
||||
|
||||
let property = $state();
|
||||
</script>
|
||||
|
||||
<button onclick={() => (property = { foo: 'bar' })}>Update</button>
|
||||
<!-- one that's there before it's registered -->
|
||||
<set-property-before-mounted {property}></set-property-before-mounted>
|
||||
<!-- and one that's after registration but sets property to an object right away -->
|
||||
{#if property}
|
||||
<set-property-before-mounted {property}></set-property-before-mounted>
|
||||
{/if}
|
||||
Loading…
Reference in new issue