prefetchHref function

Future<bool> prefetchHref(
  1. String href, {
  2. int? insertIndex,
  3. bool? preLoad,
})

Prefetch a HREF using a link element into head DOM node.

href The path to the CSS source file. insertIndex optional index of insertion inside head node.

Implementation

Future<bool> prefetchHref(
  String href, {
  int? insertIndex,
  bool? preLoad,
}) async {
  var rel = 'prefetch';

  if (preLoad ?? false) {
    rel = 'preload';
  }

  var linkInDom = getLinkElementByHREF(href, rel);

  var prevCall = _prefetchedHref[href];

  if (prevCall != null) {
    if (linkInDom != null) {
      return prevCall;
    } else {
      var removed = _prefetchedHref.remove(href);
      assert(removed != null);
    }
  }

  if (linkInDom != null) {
    return true;
  }

  var head = document.querySelector('head') as HTMLHeadElement?;

  var script = HTMLLinkElement()
    ..rel = rel
    ..href = href;

  var completer = Completer<bool>();

  void complete(bool loaded) {
    if (!completer.isCompleted) completer.complete(loaded);
  }

  script.onLoad.listen((e) => complete(true), onError: (e) => complete(false));
  // A failed load fires an `error` event (not an error in `onLoad`):
  script.onError.listen((e) => complete(false));

  if (insertIndex != null) {
    insertIndex = Math.min(insertIndex, head!.children.length);

    head.insertChild(insertIndex, script);
  } else {
    head!.appendChild(script);
  }

  var call = completer.future;
  _prefetchedHref[href] = call;

  return call;
}