getAll static method

Future<List<Favicon>> getAll(
  1. String url, {
  2. List<String>? suffixes,
})

Implementation

static Future<List<Favicon>> getAll(
  String url, {
  List<String>? suffixes,
}) async {
  var favicons = <Favicon>[];
  var iconUrls = <String>[];

  var uri = Uri.parse(url);
  var document = parse((await http.get(uri)).body);

  // Look for icons in tags
  for (var rel in ['icon', 'shortcut icon']) {
    for (var iconTag in document.querySelectorAll("link[rel='$rel']")) {
      if (iconTag.attributes['href'] != null) {
        var iconUrl = iconTag.attributes['href']!.trim();

        // Fix scheme relative URLs
        if (iconUrl.startsWith('//')) {
          iconUrl = uri.scheme + ':' + iconUrl;
        }

        // Fix relative URLs
        if (iconUrl.startsWith('/')) {
          iconUrl = uri.scheme + '://' + uri.host + iconUrl;
        }

        // Fix naked URLs
        if (!iconUrl.startsWith('http')) {
          iconUrl = uri.scheme + '://' + uri.host + '/' + iconUrl;
        }

        // Remove query strings
        iconUrl = iconUrl.split('?').first;

        // Verify so the icon actually exists
        if (await _verifyImage(iconUrl)) {
          iconUrls.add(iconUrl);
        }
      }
    }
  }

  // Look for icon by predefined URL
  var iconUrl = uri.scheme + '://' + uri.host + '/favicon.ico';
  if (await _verifyImage(iconUrl)) {
    iconUrls.add(iconUrl);
  }

  // Deduplicate
  iconUrls = iconUrls.toSet().toList();

  // Filter on suffixes
  if (suffixes != null) {
    iconUrls.removeWhere((url) => !suffixes.contains(url.split('.').last));
  }

  // Fetch dimensions
  for (var iconUrl in iconUrls) {
    // No need for size calculation on vector images
    if (iconUrl.endsWith('.svg')) {
      favicons.add(Favicon(iconUrl));
      continue;
    }

    // Image library lacks read support for Ico, assume standard size
    // https://github.com/brendan-duncan/image/issues/212
    if (iconUrl.endsWith('.ico')) {
      favicons.add(Favicon(iconUrl, width: 16, height: 16));
      continue;
    }

    var image = decodeImage((await http.get(Uri.parse(iconUrl))).bodyBytes);
    if (image != null) {
      favicons
          .add(Favicon(iconUrl, width: image.width, height: image.height));
    }
  }

  return favicons..sort();
}