Example #1
0
  return function (elem) {
    if (elem[$rendering] || !elem[$connected]) {
      return;
    }

    // Flag as rendering. This prevents anything from trying to render - or
    // queueing a render - while there is a pending render.
    elem[$rendering] = true;

    // Call the updated() callback to see if we should render.
    let shouldRender = true;
    if (updated) {
      const prev = elem[$props];
      elem[$props] = props(elem);
      shouldRender = updated(elem, prev);
    }

    // Even though this would ideally be checked in the updated() callback,
    // it may not be, so we ensure that there is a point in proceeding.
    if (!render) {
      elem[$rendering] = false;
      return;
    }

    // Try and get the current shadow root (will be setup if not).
    let sr = elem[$shadowRoot];

    // Setup the shadow root if it hasn't been setup yet.
    if (!sr) {
      if (shadowDomV1) {
        sr = elem.attachShadow({ mode: 'open' });
      } else if (shadowDomV0) {
        sr = elem.createShadowRoot();
      } else {
        sr = elem;
      }

      elem[$shadowRoot] = sr;
    }

    if (shouldRender) {
      patchInner(sr, render, elem);
      if (rendered) {
        rendered(elem);
      }
    }

    elem[$rendering] = false;
  };
Example #2
0
  return function (elem) {
    if (!render) {
      return;
    }

    if (!elem[shadowRoot]) {
      let sr;

      if (shadowDomV1) {
        sr = elem.attachShadow({ mode: 'open' });
      } else if (shadowDomV0) {
        sr = elem.createShadowRoot();
      } else {
        sr = elem;
      }

      elem[shadowRoot] = sr;
    }

    patchInner(elem[shadowRoot], render, elem);
  };