MediaWiki:Common.js

From WikiPhone
Revision as of 21:29, 10 November 2025 by CaptainChris (talk | contribs)
Jump to navigation Jump to search

Note: After publishing, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
  • Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
  • Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5.
/* Any JavaScript here will be loaded for all users on every page load. */


(function () {
  function findIframe() {
    return (
      document.querySelector('iframe[key="wikiphone"]') ||
      Array.from(document.querySelectorAll('iframe')).find(el =>
        (el.getAttribute('src') || '').includes('/jonesfamilyfarmsrecordings')
      )
    );
  }

  function setH(iframe, h) {
    const height = Math.max(200, Math.floor(h || 0));
    if (iframe.style.height !== height + 'px') {
      iframe.style.height = height + 'px';
    }
  }

  function wireSameOrigin(iframe) {
    try {
      const doc = iframe.contentDocument || iframe.contentWindow?.document;
      if (!doc) return false;

      const measure = () => {
        const b = doc.body, e = doc.documentElement;
        const h = Math.max(
          b.scrollHeight, b.offsetHeight,
          e.clientHeight, e.scrollHeight, e.offsetHeight
        );
        setH(iframe, h);
      };

      const ro = new ResizeObserver(measure);
      ro.observe(doc.documentElement);
      ro.observe(doc.body);

      iframe.addEventListener('load', measure);
      window.addEventListener('resize', measure);
      measure();
      return true;
    } catch {
      return false;
    }
  }

  function wireCrossOrigin(iframe) {
    window.addEventListener('message', (event) => {
      const d = event.data;
      if (!d || typeof d !== 'object') return;
      if (d.type === 'wikiphone:height' && typeof d.height === 'number') {
        setH(iframe, d.height);
      }
    });

    const ping = () => {
      try { iframe.contentWindow?.postMessage({ type: 'wikiphone:getHeight' }, '*'); } catch {}
    };

    iframe.addEventListener('load', () => {
      setH(iframe, 400);
      let n = 0;
      const t = setInterval(() => {
        ping();
        if (++n >= 20) clearInterval(t);
      }, 500);
    });

    setInterval(ping, 1500);
  }

  function styleIframe(iframe) {
    iframe.style.display = 'block';
    iframe.style.width = '100vw';
    iframe.style.maxWidth = '100%';
    iframe.style.marginLeft = 'calc(-50vw + 50%)';
    iframe.style.border = 'none';
    iframe.style.overflow = 'hidden';
    iframe.setAttribute('scrolling', 'no');
  }

  function initWith(iframe) {
    if (!iframe.__wikiphoneWired) {
      iframe.__wikiphoneWired = true;
      styleIframe(iframe);
      const ok = wireSameOrigin(iframe);
      if (!ok) wireCrossOrigin(iframe);
    }
  }

  function boot() {
    const existing = findIframe();
    if (existing) initWith(existing);

    const mo = new MutationObserver(() => {
      const el = findIframe();
      if (el) initWith(el);
    });
    mo.observe(document.documentElement, { childList: true, subtree: true });
  }

  if (document.readyState === 'loading') {
    document.addEventListener('DOMContentLoaded', boot);
  } else {
    boot();
  }
})();