getAll static method
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();
}