prefetchHref function
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;
}