diff --git a/lib/src/async_import_cache.dart b/lib/src/async_import_cache.dart index 0deb6285f..f49fa8600 100644 --- a/lib/src/async_import_cache.dart +++ b/lib/src/async_import_cache.dart @@ -52,19 +52,21 @@ final class AsyncImportCache { /// The canonicalized URLs for each non-canonical URL that's resolved using a /// relative importer. /// - /// The map's keys have four parts: + /// The map's keys have five parts: /// - /// 1. The URL passed to [canonicalize] (the same as in [_canonicalizeCache]). + /// 1. The URL passed to [_canonicalize] (the same as in [_canonicalizeCache]). /// 2. Whether the canonicalization is for an `@import` rule. - /// 3. The `baseImporter` passed to [canonicalize]. - /// 4. The `baseUrl` passed to [canonicalize]. + /// 3. The `importer` passed to [_canonicalize]. + /// 4. The `baseUrl` passed to [_canonicalize]. + /// 5. The `resolveUrl` passed to [_canonicalize]. /// /// The map's values are the same as the return value of [canonicalize]. final _relativeCanonicalizeCache = <( Uri, { bool forImport, - AsyncImporter baseImporter, - Uri? baseUrl + AsyncImporter importer, + Uri? baseUrl, + bool resolveUrl }), AsyncCanonicalizeResult?>{}; @@ -153,18 +155,37 @@ final class AsyncImportCache { "in the browser."; } - if (baseImporter != null && url.scheme == '') { - var relativeResult = await putIfAbsentAsync( - _relativeCanonicalizeCache, - ( - url, - forImport: forImport, - baseImporter: baseImporter, - baseUrl: baseUrl - ), - () => _canonicalize(baseImporter, baseUrl?.resolveUri(url) ?? url, - baseUrl, forImport)); - if (relativeResult != null) return relativeResult; + if (url.scheme == '') { + if (baseImporter != null) { + var relativeResult = await putIfAbsentAsync( + _relativeCanonicalizeCache, + ( + url, + forImport: forImport, + importer: baseImporter, + baseUrl: baseUrl, + resolveUrl: true + ), + () => _canonicalize(baseImporter, url, baseUrl, forImport, + resolveUrl: true)); + if (relativeResult != null) return relativeResult; + } + + for (var importer in _importers) { + var relativeResult = await putIfAbsentAsync( + _relativeCanonicalizeCache, + ( + url, + forImport: forImport, + importer: importer, + baseUrl: baseUrl, + resolveUrl: false + ), + () => _canonicalize(importer, url, baseUrl, forImport)); + if (relativeResult != null) return relativeResult; + } + + return null; } return await putIfAbsentAsync( diff --git a/lib/src/import_cache.dart b/lib/src/import_cache.dart index e34f0a7ee..d63800135 100644 --- a/lib/src/import_cache.dart +++ b/lib/src/import_cache.dart @@ -5,7 +5,7 @@ // DO NOT EDIT. This file was generated from async_import_cache.dart. // See tool/grind/synchronize.dart for details. // -// Checksum: d157b83599dbc07a80ac6cb5ffdf5dde03b60376 +// Checksum: 6bdfe30b15772673fb523f03165a2f4f94544a46 // // ignore_for_file: unused_import @@ -54,19 +54,21 @@ final class ImportCache { /// The canonicalized URLs for each non-canonical URL that's resolved using a /// relative importer. /// - /// The map's keys have four parts: + /// The map's keys have five parts: /// - /// 1. The URL passed to [canonicalize] (the same as in [_canonicalizeCache]). + /// 1. The URL passed to [_canonicalize] (the same as in [_canonicalizeCache]). /// 2. Whether the canonicalization is for an `@import` rule. - /// 3. The `baseImporter` passed to [canonicalize]. - /// 4. The `baseUrl` passed to [canonicalize]. + /// 3. The `importer` passed to [_canonicalize]. + /// 4. The `baseUrl` passed to [_canonicalize]. + /// 5. The `resolveUrl` passed to [_canonicalize]. /// /// The map's values are the same as the return value of [canonicalize]. final _relativeCanonicalizeCache = <( Uri, { bool forImport, - Importer baseImporter, - Uri? baseUrl + Importer importer, + Uri? baseUrl, + bool resolveUrl }), CanonicalizeResult?>{}; @@ -153,17 +155,33 @@ final class ImportCache { "in the browser."; } - if (baseImporter != null && url.scheme == '') { - var relativeResult = _relativeCanonicalizeCache.putIfAbsent( - ( - url, - forImport: forImport, - baseImporter: baseImporter, - baseUrl: baseUrl - ), - () => _canonicalize(baseImporter, baseUrl?.resolveUri(url) ?? url, - baseUrl, forImport)); - if (relativeResult != null) return relativeResult; + if (url.scheme == '') { + if (baseImporter != null) { + var relativeResult = _relativeCanonicalizeCache.putIfAbsent( + ( + url, + forImport: forImport, + importer: baseImporter, + baseUrl: baseUrl, + resolveUrl: true + ), + () => _canonicalize(baseImporter, url, baseUrl, forImport, + resolveUrl: true)); + if (relativeResult != null) return relativeResult; + } + + for (var importer in _importers) { + var relativeResult = _relativeCanonicalizeCache.putIfAbsent(( + url, + forImport: forImport, + importer: importer, + baseUrl: baseUrl, + resolveUrl: false + ), () => _canonicalize(importer, url, baseUrl, forImport)); + if (relativeResult != null) return relativeResult; + } + + return null; } return _canonicalizeCache.putIfAbsent((url, forImport: forImport), () {