| File: Builder\ResourcePreloadCollection.cs | Web Access |
| Project: src\aspnetcore\src\Components\Endpoints\src\Microsoft.AspNetCore.Components.Endpoints.csproj (Microsoft.AspNetCore.Components.Endpoints) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System.Diagnostics.CodeAnalysis; namespace Microsoft.AspNetCore.Components.Endpoints; internal class ResourcePreloadCollection { private readonly Dictionary<string, List<PreloadAsset>> _storage = new(); public ResourcePreloadCollection(ResourceAssetCollection assets) { foreach (var asset in assets) { if (asset.Properties == null) { continue; } // Use preloadgroup property to identify assets that should be preloaded string? group = null; foreach (var property in asset.Properties) { if (property.Name.Equals("preloadgroup", StringComparison.OrdinalIgnoreCase)) { group = property.Value ?? string.Empty; break; } } if (group == null) { continue; } var preloadAsset = CreateAsset(asset.Url, asset.Properties); if (!_storage.TryGetValue(group, out var groupHeaders)) { groupHeaders = _storage[group] = new List<PreloadAsset>(); } groupHeaders.Add(preloadAsset); } foreach (var group in _storage) { group.Value.Sort((a, b) => a.PreloadOrder.CompareTo(b.PreloadOrder)); } } private static PreloadAsset CreateAsset(string url, IEnumerable<ResourceAssetProperty> properties) { var resourceAsset = new PreloadAsset(url); foreach (var property in properties) { if (property.Name.Equals("label", StringComparison.OrdinalIgnoreCase)) { resourceAsset.Label = property.Value; } else if (property.Name.Equals("integrity", StringComparison.OrdinalIgnoreCase)) { resourceAsset.Integrity = property.Value; } else if (property.Name.Equals("preloadgroup", StringComparison.OrdinalIgnoreCase)) { resourceAsset.PreloadGroup = property.Value; } else if (property.Name.Equals("preloadrel", StringComparison.OrdinalIgnoreCase)) { resourceAsset.PreloadRel = property.Value; } else if (property.Name.Equals("preloadas", StringComparison.OrdinalIgnoreCase)) { resourceAsset.PreloadAs = property.Value; } else if (property.Name.Equals("preloadpriority", StringComparison.OrdinalIgnoreCase)) { resourceAsset.PreloadPriority = property.Value; } else if (property.Name.Equals("preloadcrossorigin", StringComparison.OrdinalIgnoreCase)) { resourceAsset.PreloadCrossorigin = property.Value; } else if (property.Name.Equals("preloadorder", StringComparison.OrdinalIgnoreCase)) { if (!int.TryParse(property.Value, out int order)) { order = 0; } resourceAsset.PreloadOrder = order; } } return resourceAsset; } public bool TryGetAssets(string group, [MaybeNullWhen(false)] out List<PreloadAsset> assets) => _storage.TryGetValue(group, out assets); } internal sealed class PreloadAsset(string url) { public string Url { get; } = url; public string? Label { get; set; } public string? Integrity { get; set; } public string? PreloadGroup { get; set; } public string? PreloadRel { get; set; } public string? PreloadAs { get; set; } public string? PreloadPriority { get; set; } public string? PreloadCrossorigin { get; set; } public int PreloadOrder { get; set; } }