<!doctype html>
  <html lang="en">
  <body>
    <outer-custom-el></outer-custom-el>
    <p>Tests CSS container queries don't break when using nested shadow DOM</p>
    <p>PASS if not crash</p>
  </body>
  <script>
    var ShadowHostBase = class extends HTMLElement {
      createRenderRoot() {
        const renderRoot = this.shadowRoot ?? this.attachShadow(this.constructor.shadowRootOptions);
        renderRoot.adoptedStyleSheets = this.constructor.styles;
        return renderRoot;
      }
      connectedCallback() {
        this.renderRoot ??= this.createRenderRoot();
        this.update();
      }
      update() {
        const htmlContent = this.render();
        const template = document.createElement("template");
        template.innerHTML = htmlContent;
        this.renderRoot.appendChild(template.content.cloneNode(true));
      }
    };
    ShadowHostBase.shadowRootOptions = { mode: "open" };
    var SecondShadowHost = class extends ShadowHostBase {
      render() {
        return `
        <div>
          <span part="label">Nested span with label part</span>
        </div>
        `;
      }
    };
    var secondShadowHostStyles = `div:hover span {
    }`;
    var prepareStyleSheets = (textStyle) => {
      const style = new CSSStyleSheet();
      style.replaceSync(textStyle);
      return [style];
    };
    SecondShadowHost.styles = prepareStyleSheets(secondShadowHostStyles);
    customElements.define("inner-custom-el", SecondShadowHost);
    var firstShadowHostStyles = `* {
      @container style(--foo: bar) {
        ::part(baz) {}
      }
    }`;
    var FirstShadowHost = class extends ShadowHostBase {
      render() {
        return `
        <inner-custom-el>
        </inner-custom-el>
      `;
      }
    };
    FirstShadowHost.styles = prepareStyleSheets(firstShadowHostStyles);
    customElements.define("outer-custom-el", FirstShadowHost);

    if (window.testRunner) {
      testRunner.dumpAsText();
      testRunner.waitUntilDone();
    }
    window.onload = async () => {
      await customElements.whenDefined('outer-custom-el');
      await customElements.whenDefined('inner-custom-el');
      const button = document.querySelector('outer-custom-el').shadowRoot.querySelector('inner-custom-el');
      const rect = button.getBoundingClientRect();
      if (window.eventSender) {
        // The action below triggers the hover behaviour. In combination with the styles defined earlier,
        // this triggers styleForContainer and used to crash.
        eventSender.mouseMoveTo(rect.x + rect.width / 2, rect.y + rect.height / 2);
      }
      testRunner.notifyDone();
    };
  </script>
</html>
