embedClickListenersInPageSource static method

String embedClickListenersInPageSource(
  1. String pageUrl,
  2. String pageSource
)

Embeds click listeners inside the page and calls Dart callback when triggered

Implementation

static String embedClickListenersInPageSource(
    String pageUrl, String pageSource) {
  return embedInHtmlSource(
    source: pageSource,
    whatToEmbed: '''
    <base href="$pageUrl">
    <script>

    document.addEventListener('click', e => {
      if (frameElement && document.activeElement && document.activeElement.href) {
        e.preventDefault()

        var returnedObject = JSON.stringify({method: 'get', href: document.activeElement.href});
        frameElement.contentWindow.$webOnClickInsideIframeCallback && frameElement.contentWindow.$webOnClickInsideIframeCallback(returnedObject)
      }
    })
    document.addEventListener('submit', e => {
      if (frameElement && document.activeElement && document.activeElement.form && document.activeElement.form.action) {
        e.preventDefault()

        if (document.activeElement.form.method === 'post') {
          var formData = new FormData(document.activeElement.form);

          var returnedObject = JSON.stringify({method: 'post', href: document.activeElement.form.action, body: [...formData]});
          frameElement.contentWindow.$webOnClickInsideIframeCallback && frameElement.contentWindow.$webOnClickInsideIframeCallback(returnedObject)
        } else {
          var urlWithQueryParams = document.activeElement.form.action + '?' + new URLSearchParams(new FormData(document.activeElement.form))

          var returnedObject = JSON.stringify({method: 'get', href: urlWithQueryParams});
          frameElement.contentWindow.$webOnClickInsideIframeCallback && frameElement.contentWindow.$webOnClickInsideIframeCallback(returnedObject)
        }
      }
    })
    </script>
    ''',
    position: EmbedPosition.belowHeadOpenTag,
  );
}