Merge pull request #8459 from dotnet-maestro-bot/merge/release/2.2-to-master
[automated] Merge branch 'release/2.2' => 'master'
This commit is contained in:
commit
d677a32a53
|
|
@ -2,7 +2,9 @@
|
||||||
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using Microsoft.AspNetCore.Http;
|
||||||
using Microsoft.AspNetCore.Mvc.Internal;
|
using Microsoft.AspNetCore.Mvc.Internal;
|
||||||
using Microsoft.AspNetCore.Mvc.ModelBinding;
|
using Microsoft.AspNetCore.Mvc.ModelBinding;
|
||||||
using Microsoft.AspNetCore.Routing.Template;
|
using Microsoft.AspNetCore.Routing.Template;
|
||||||
|
|
@ -112,7 +114,8 @@ namespace Microsoft.AspNetCore.Mvc.ApplicationModels
|
||||||
if (property.BindingInfo != null &&
|
if (property.BindingInfo != null &&
|
||||||
property.BindingInfo.BinderModelName == null &&
|
property.BindingInfo.BinderModelName == null &&
|
||||||
property.BindingInfo.BindingSource != null &&
|
property.BindingInfo.BindingSource != null &&
|
||||||
!property.BindingInfo.BindingSource.IsGreedy)
|
!property.BindingInfo.BindingSource.IsGreedy &&
|
||||||
|
!IsFormFile(property.ParameterType))
|
||||||
{
|
{
|
||||||
var metadata = _modelMetadataProvider.GetMetadataForProperty(
|
var metadata = _modelMetadataProvider.GetMetadataForProperty(
|
||||||
controllerModel.ControllerType,
|
controllerModel.ControllerType,
|
||||||
|
|
@ -133,6 +136,7 @@ namespace Microsoft.AspNetCore.Mvc.ApplicationModels
|
||||||
if (bindingInfo?.BindingSource != null &&
|
if (bindingInfo?.BindingSource != null &&
|
||||||
bindingInfo.BinderModelName == null &&
|
bindingInfo.BinderModelName == null &&
|
||||||
!bindingInfo.BindingSource.IsGreedy &&
|
!bindingInfo.BindingSource.IsGreedy &&
|
||||||
|
!IsFormFile(parameter.ParameterType) &&
|
||||||
IsComplexTypeParameter(parameter))
|
IsComplexTypeParameter(parameter))
|
||||||
{
|
{
|
||||||
parameter.BindingInfo.BinderModelName = string.Empty;
|
parameter.BindingInfo.BinderModelName = string.Empty;
|
||||||
|
|
@ -166,5 +170,11 @@ namespace Microsoft.AspNetCore.Mvc.ApplicationModels
|
||||||
.GetMetadataForType(parameter.ParameterInfo.ParameterType);
|
.GetMetadataForType(parameter.ParameterInfo.ParameterType);
|
||||||
return metadata.IsComplexType && !metadata.IsCollectionType;
|
return metadata.IsComplexType && !metadata.IsCollectionType;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static bool IsFormFile(Type parameterType)
|
||||||
|
{
|
||||||
|
return typeof(IFormFile).IsAssignableFrom(parameterType) ||
|
||||||
|
typeof(IEnumerable<IFormFile>).IsAssignableFrom(parameterType);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -33,11 +33,12 @@ namespace Microsoft.AspNetCore.Mvc.Infrastructure
|
||||||
|
|
||||||
_actionDescriptorChangeProviders = actionDescriptorChangeProviders.ToArray();
|
_actionDescriptorChangeProviders = actionDescriptorChangeProviders.ToArray();
|
||||||
|
|
||||||
|
_lock = new object();
|
||||||
|
|
||||||
|
// IMPORTANT: this needs to be the last thing we do in the constructor. Change notifications can happen immediately!
|
||||||
ChangeToken.OnChange(
|
ChangeToken.OnChange(
|
||||||
GetCompositeChangeToken,
|
GetCompositeChangeToken,
|
||||||
UpdateCollection);
|
UpdateCollection);
|
||||||
|
|
||||||
_lock = new object();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
|
||||||
|
|
@ -58,6 +58,8 @@ namespace Microsoft.AspNetCore.Mvc.Internal
|
||||||
|
|
||||||
ConventionalEndpointInfos = new List<MvcEndpointInfo>();
|
ConventionalEndpointInfos = new List<MvcEndpointInfo>();
|
||||||
|
|
||||||
|
// IMPORTANT: this needs to be the last thing we do in the constructor. Change notifications can happen immediately!
|
||||||
|
//
|
||||||
// It's possible for someone to override the collection provider without providing
|
// It's possible for someone to override the collection provider without providing
|
||||||
// change notifications. If that's the case we won't process changes.
|
// change notifications. If that's the case we won't process changes.
|
||||||
if (actions is ActionDescriptorCollectionProvider collectionProviderWithChangeToken)
|
if (actions is ActionDescriptorCollectionProvider collectionProviderWithChangeToken)
|
||||||
|
|
|
||||||
|
|
@ -14,6 +14,7 @@ using Microsoft.AspNetCore.Mvc.Razor.Infrastructure;
|
||||||
using Microsoft.AspNetCore.Mvc.Razor.Internal;
|
using Microsoft.AspNetCore.Mvc.Razor.Internal;
|
||||||
using Microsoft.AspNetCore.Mvc.Razor.TagHelpers;
|
using Microsoft.AspNetCore.Mvc.Razor.TagHelpers;
|
||||||
using Microsoft.AspNetCore.Mvc.Rendering;
|
using Microsoft.AspNetCore.Mvc.Rendering;
|
||||||
|
using Microsoft.AspNetCore.Mvc.ViewFeatures;
|
||||||
using Microsoft.AspNetCore.Razor.Language;
|
using Microsoft.AspNetCore.Razor.Language;
|
||||||
using Microsoft.AspNetCore.Razor.TagHelpers;
|
using Microsoft.AspNetCore.Razor.TagHelpers;
|
||||||
using Microsoft.Extensions.Caching.Memory;
|
using Microsoft.Extensions.Caching.Memory;
|
||||||
|
|
@ -228,9 +229,10 @@ namespace Microsoft.Extensions.DependencyInjection
|
||||||
// TagHelperComponents manager
|
// TagHelperComponents manager
|
||||||
services.TryAddScoped<ITagHelperComponentManager, TagHelperComponentManager>();
|
services.TryAddScoped<ITagHelperComponentManager, TagHelperComponentManager>();
|
||||||
|
|
||||||
// Consumed by the Cache tag helper to cache results across the lifetime of the application.
|
// Infrastructure for MVC TagHelpers
|
||||||
services.TryAddSingleton<IMemoryCache, MemoryCache>();
|
services.TryAddSingleton<IMemoryCache, MemoryCache>();
|
||||||
services.TryAddSingleton<TagHelperMemoryCacheProvider>();
|
services.TryAddSingleton<TagHelperMemoryCacheProvider>();
|
||||||
|
services.TryAddSingleton<IFileVersionProvider, DefaultFileVersionProvider>();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -3,9 +3,9 @@
|
||||||
|
|
||||||
using System.Security.Cryptography;
|
using System.Security.Cryptography;
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Mvc.TagHelpers.Internal
|
namespace Microsoft.AspNetCore.Mvc.Razor.Infrastructure
|
||||||
{
|
{
|
||||||
public static class CryptographyAlgorithms
|
internal static class CryptographyAlgorithms
|
||||||
{
|
{
|
||||||
public static SHA256 CreateSHA256()
|
public static SHA256 CreateSHA256()
|
||||||
{
|
{
|
||||||
|
|
@ -2,59 +2,46 @@
|
||||||
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
|
using Microsoft.AspNetCore.Hosting;
|
||||||
using Microsoft.AspNetCore.Http;
|
using Microsoft.AspNetCore.Http;
|
||||||
|
using Microsoft.AspNetCore.Mvc.ViewFeatures;
|
||||||
using Microsoft.AspNetCore.WebUtilities;
|
using Microsoft.AspNetCore.WebUtilities;
|
||||||
using Microsoft.Extensions.Caching.Memory;
|
using Microsoft.Extensions.Caching.Memory;
|
||||||
using Microsoft.Extensions.FileProviders;
|
using Microsoft.Extensions.FileProviders;
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Mvc.TagHelpers.Internal
|
namespace Microsoft.AspNetCore.Mvc.Razor.Infrastructure
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Provides version hash for a specified file.
|
/// Provides version hash for a specified file.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class FileVersionProvider
|
internal class DefaultFileVersionProvider : IFileVersionProvider
|
||||||
{
|
{
|
||||||
private const string VersionKey = "v";
|
private const string VersionKey = "v";
|
||||||
private static readonly char[] QueryStringAndFragmentTokens = new [] { '?', '#' };
|
private static readonly char[] QueryStringAndFragmentTokens = new [] { '?', '#' };
|
||||||
private readonly IFileProvider _fileProvider;
|
|
||||||
private readonly IMemoryCache _cache;
|
|
||||||
private readonly PathString _requestPathBase;
|
|
||||||
|
|
||||||
/// <summary>
|
public DefaultFileVersionProvider(
|
||||||
/// Creates a new instance of <see cref="FileVersionProvider"/>.
|
IHostingEnvironment hostingEnvironment,
|
||||||
/// </summary>
|
TagHelperMemoryCacheProvider cacheProvider)
|
||||||
/// <param name="fileProvider">The file provider to get and watch files.</param>
|
|
||||||
/// <param name="cache"><see cref="IMemoryCache"/> where versioned urls of files are cached.</param>
|
|
||||||
/// <param name="requestPathBase">The base path for the current HTTP request.</param>
|
|
||||||
public FileVersionProvider(
|
|
||||||
IFileProvider fileProvider,
|
|
||||||
IMemoryCache cache,
|
|
||||||
PathString requestPathBase)
|
|
||||||
{
|
{
|
||||||
if (fileProvider == null)
|
if (hostingEnvironment == null)
|
||||||
{
|
{
|
||||||
throw new ArgumentNullException(nameof(fileProvider));
|
throw new ArgumentNullException(nameof(hostingEnvironment));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cache == null)
|
if (cacheProvider == null)
|
||||||
{
|
{
|
||||||
throw new ArgumentNullException(nameof(cache));
|
throw new ArgumentNullException(nameof(cacheProvider));
|
||||||
}
|
}
|
||||||
|
|
||||||
_fileProvider = fileProvider;
|
FileProvider = hostingEnvironment.WebRootFileProvider;
|
||||||
_cache = cache;
|
Cache = cacheProvider.Cache;
|
||||||
_requestPathBase = requestPathBase;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
public IFileProvider FileProvider { get; }
|
||||||
/// Adds version query parameter to the specified file path.
|
|
||||||
/// </summary>
|
public IMemoryCache Cache { get; }
|
||||||
/// <param name="path">The path of the file to which version should be added.</param>
|
|
||||||
/// <returns>Path containing the version query string.</returns>
|
public string AddFileVersionToPath(PathString requestPathBase, string path)
|
||||||
/// <remarks>
|
|
||||||
/// The version query string is appended with the key "v".
|
|
||||||
/// </remarks>
|
|
||||||
public string AddFileVersionToPath(string path)
|
|
||||||
{
|
{
|
||||||
if (path == null)
|
if (path == null)
|
||||||
{
|
{
|
||||||
|
|
@ -75,22 +62,22 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers.Internal
|
||||||
return path;
|
return path;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_cache.TryGetValue(path, out string value))
|
if (Cache.TryGetValue(path, out string value))
|
||||||
{
|
{
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
var cacheEntryOptions = new MemoryCacheEntryOptions();
|
var cacheEntryOptions = new MemoryCacheEntryOptions();
|
||||||
cacheEntryOptions.AddExpirationToken(_fileProvider.Watch(resolvedPath));
|
cacheEntryOptions.AddExpirationToken(FileProvider.Watch(resolvedPath));
|
||||||
var fileInfo = _fileProvider.GetFileInfo(resolvedPath);
|
var fileInfo = FileProvider.GetFileInfo(resolvedPath);
|
||||||
|
|
||||||
if (!fileInfo.Exists &&
|
if (!fileInfo.Exists &&
|
||||||
_requestPathBase.HasValue &&
|
requestPathBase.HasValue &&
|
||||||
resolvedPath.StartsWith(_requestPathBase.Value, StringComparison.OrdinalIgnoreCase))
|
resolvedPath.StartsWith(requestPathBase.Value, StringComparison.OrdinalIgnoreCase))
|
||||||
{
|
{
|
||||||
var requestPathBaseRelativePath = resolvedPath.Substring(_requestPathBase.Value.Length);
|
var requestPathBaseRelativePath = resolvedPath.Substring(requestPathBase.Value.Length);
|
||||||
cacheEntryOptions.AddExpirationToken(_fileProvider.Watch(requestPathBaseRelativePath));
|
cacheEntryOptions.AddExpirationToken(FileProvider.Watch(requestPathBaseRelativePath));
|
||||||
fileInfo = _fileProvider.GetFileInfo(requestPathBaseRelativePath);
|
fileInfo = FileProvider.GetFileInfo(requestPathBaseRelativePath);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fileInfo.Exists)
|
if (fileInfo.Exists)
|
||||||
|
|
@ -104,7 +91,7 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers.Internal
|
||||||
}
|
}
|
||||||
|
|
||||||
cacheEntryOptions.SetSize(value.Length * sizeof(char));
|
cacheEntryOptions.SetSize(value.Length * sizeof(char));
|
||||||
value = _cache.Set(path, value, cacheEntryOptions);
|
value = Cache.Set(path, value, cacheEntryOptions);
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -15,7 +15,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Infrastructure
|
||||||
/// This API supports the MVC's infrastructure and is not intended to be used
|
/// This API supports the MVC's infrastructure and is not intended to be used
|
||||||
/// directly from your code. This API may change in future releases.
|
/// directly from your code. This API may change in future releases.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public IMemoryCache Cache { get; } = new MemoryCache(new MemoryCacheOptions
|
public IMemoryCache Cache { get; internal set; } = new MemoryCache(new MemoryCacheOptions
|
||||||
{
|
{
|
||||||
SizeLimit = 10 * 1024 * 1024 // 10MB
|
SizeLimit = 10 * 1024 * 1024 // 10MB
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,9 @@
|
||||||
using System.Runtime.CompilerServices;
|
using System.Runtime.CompilerServices;
|
||||||
|
|
||||||
[assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.RazorPages, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
|
[assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.RazorPages, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
|
||||||
|
[assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.TagHelpers, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
|
||||||
|
|
||||||
[assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.Test, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
|
[assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.Test, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
|
||||||
[assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.Razor.Test, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
|
[assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.Razor.Test, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
|
||||||
[assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.RazorPages.Test, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
|
[assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.RazorPages.Test, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
|
||||||
|
[assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.TagHelpers.Test, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,7 @@ using System.Collections.Generic;
|
||||||
using System.Globalization;
|
using System.Globalization;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using Microsoft.AspNetCore.Http;
|
using Microsoft.AspNetCore.Http;
|
||||||
|
using Microsoft.AspNetCore.Mvc.Razor.Infrastructure;
|
||||||
using Microsoft.AspNetCore.Mvc.TagHelpers.Internal;
|
using Microsoft.AspNetCore.Mvc.TagHelpers.Internal;
|
||||||
using Microsoft.AspNetCore.Razor.TagHelpers;
|
using Microsoft.AspNetCore.Razor.TagHelpers;
|
||||||
using Microsoft.AspNetCore.Routing;
|
using Microsoft.AspNetCore.Routing;
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@ using Microsoft.AspNetCore.Hosting;
|
||||||
using Microsoft.AspNetCore.Mvc.Razor.Infrastructure;
|
using Microsoft.AspNetCore.Mvc.Razor.Infrastructure;
|
||||||
using Microsoft.AspNetCore.Mvc.Razor.TagHelpers;
|
using Microsoft.AspNetCore.Mvc.Razor.TagHelpers;
|
||||||
using Microsoft.AspNetCore.Mvc.Routing;
|
using Microsoft.AspNetCore.Mvc.Routing;
|
||||||
using Microsoft.AspNetCore.Mvc.TagHelpers.Internal;
|
using Microsoft.AspNetCore.Mvc.ViewFeatures;
|
||||||
using Microsoft.AspNetCore.Razor.TagHelpers;
|
using Microsoft.AspNetCore.Razor.TagHelpers;
|
||||||
using Microsoft.Extensions.Caching.Memory;
|
using Microsoft.Extensions.Caching.Memory;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
|
|
@ -29,8 +29,6 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
||||||
private const string AppendVersionAttributeName = "asp-append-version";
|
private const string AppendVersionAttributeName = "asp-append-version";
|
||||||
private const string SrcAttributeName = "src";
|
private const string SrcAttributeName = "src";
|
||||||
|
|
||||||
private FileVersionProvider _fileVersionProvider;
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Creates a new <see cref="ImageTagHelper"/>.
|
/// Creates a new <see cref="ImageTagHelper"/>.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
@ -55,6 +53,7 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="hostingEnvironment">The <see cref="IHostingEnvironment"/>.</param>
|
/// <param name="hostingEnvironment">The <see cref="IHostingEnvironment"/>.</param>
|
||||||
/// <param name="cacheProvider">The <see cref="TagHelperMemoryCacheProvider"/>.</param>
|
/// <param name="cacheProvider">The <see cref="TagHelperMemoryCacheProvider"/>.</param>
|
||||||
|
/// <param name="fileVersionProvider">The <see cref="IFileVersionProvider"/>.</param>
|
||||||
/// <param name="htmlEncoder">The <see cref="HtmlEncoder"/> to use.</param>
|
/// <param name="htmlEncoder">The <see cref="HtmlEncoder"/> to use.</param>
|
||||||
/// <param name="urlHelperFactory">The <see cref="IUrlHelperFactory"/>.</param>
|
/// <param name="urlHelperFactory">The <see cref="IUrlHelperFactory"/>.</param>
|
||||||
// Decorated with ActivatorUtilitiesConstructor since we want to influence tag helper activation
|
// Decorated with ActivatorUtilitiesConstructor since we want to influence tag helper activation
|
||||||
|
|
@ -63,12 +62,14 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
||||||
public ImageTagHelper(
|
public ImageTagHelper(
|
||||||
IHostingEnvironment hostingEnvironment,
|
IHostingEnvironment hostingEnvironment,
|
||||||
TagHelperMemoryCacheProvider cacheProvider,
|
TagHelperMemoryCacheProvider cacheProvider,
|
||||||
|
IFileVersionProvider fileVersionProvider,
|
||||||
HtmlEncoder htmlEncoder,
|
HtmlEncoder htmlEncoder,
|
||||||
IUrlHelperFactory urlHelperFactory)
|
IUrlHelperFactory urlHelperFactory)
|
||||||
: base(urlHelperFactory, htmlEncoder)
|
: base(urlHelperFactory, htmlEncoder)
|
||||||
{
|
{
|
||||||
HostingEnvironment = hostingEnvironment;
|
HostingEnvironment = hostingEnvironment;
|
||||||
Cache = cacheProvider.Cache;
|
Cache = cacheProvider.Cache;
|
||||||
|
FileVersionProvider = fileVersionProvider;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
|
|
@ -96,6 +97,8 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
||||||
|
|
||||||
protected internal IMemoryCache Cache { get; }
|
protected internal IMemoryCache Cache { get; }
|
||||||
|
|
||||||
|
internal IFileVersionProvider FileVersionProvider { get; private set; }
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public override void Process(TagHelperContext context, TagHelperOutput output)
|
public override void Process(TagHelperContext context, TagHelperOutput output)
|
||||||
{
|
{
|
||||||
|
|
@ -121,18 +124,15 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
||||||
// not function properly.
|
// not function properly.
|
||||||
Src = output.Attributes[SrcAttributeName].Value as string;
|
Src = output.Attributes[SrcAttributeName].Value as string;
|
||||||
|
|
||||||
output.Attributes.SetAttribute(SrcAttributeName, _fileVersionProvider.AddFileVersionToPath(Src));
|
output.Attributes.SetAttribute(SrcAttributeName, FileVersionProvider.AddFileVersionToPath(ViewContext.HttpContext.Request.PathBase, Src));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void EnsureFileVersionProvider()
|
private void EnsureFileVersionProvider()
|
||||||
{
|
{
|
||||||
if (_fileVersionProvider == null)
|
if (FileVersionProvider == null)
|
||||||
{
|
{
|
||||||
_fileVersionProvider = new FileVersionProvider(
|
FileVersionProvider = ViewContext.HttpContext.RequestServices.GetRequiredService<IFileVersionProvider>();
|
||||||
HostingEnvironment.WebRootFileProvider,
|
|
||||||
Cache,
|
|
||||||
ViewContext.HttpContext.Request.PathBase);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -12,6 +12,7 @@ using Microsoft.AspNetCore.Mvc.Razor.Infrastructure;
|
||||||
using Microsoft.AspNetCore.Mvc.Razor.TagHelpers;
|
using Microsoft.AspNetCore.Mvc.Razor.TagHelpers;
|
||||||
using Microsoft.AspNetCore.Mvc.Routing;
|
using Microsoft.AspNetCore.Mvc.Routing;
|
||||||
using Microsoft.AspNetCore.Mvc.TagHelpers.Internal;
|
using Microsoft.AspNetCore.Mvc.TagHelpers.Internal;
|
||||||
|
using Microsoft.AspNetCore.Mvc.ViewFeatures;
|
||||||
using Microsoft.AspNetCore.Razor.TagHelpers;
|
using Microsoft.AspNetCore.Razor.TagHelpers;
|
||||||
using Microsoft.Extensions.Caching.Memory;
|
using Microsoft.Extensions.Caching.Memory;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
|
|
@ -53,8 +54,6 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
||||||
private const string IntegrityAttributeName = "integrity";
|
private const string IntegrityAttributeName = "integrity";
|
||||||
private static readonly Func<Mode, Mode, int> Compare = (a, b) => a - b;
|
private static readonly Func<Mode, Mode, int> Compare = (a, b) => a - b;
|
||||||
|
|
||||||
private FileVersionProvider _fileVersionProvider;
|
|
||||||
|
|
||||||
private static readonly ModeAttributes<Mode>[] ModeDetails = new[] {
|
private static readonly ModeAttributes<Mode>[] ModeDetails = new[] {
|
||||||
// Regular src with file version alone
|
// Regular src with file version alone
|
||||||
new ModeAttributes<Mode>(Mode.AppendVersion, new[] { AppendVersionAttributeName }),
|
new ModeAttributes<Mode>(Mode.AppendVersion, new[] { AppendVersionAttributeName }),
|
||||||
|
|
@ -123,6 +122,7 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="hostingEnvironment">The <see cref="IHostingEnvironment"/>.</param>
|
/// <param name="hostingEnvironment">The <see cref="IHostingEnvironment"/>.</param>
|
||||||
/// <param name="cacheProvider"></param>
|
/// <param name="cacheProvider"></param>
|
||||||
|
/// <param name="fileVersionProvider">The <see cref="IFileVersionProvider"/>.</param>
|
||||||
/// <param name="htmlEncoder">The <see cref="HtmlEncoder"/>.</param>
|
/// <param name="htmlEncoder">The <see cref="HtmlEncoder"/>.</param>
|
||||||
/// <param name="javaScriptEncoder">The <see cref="JavaScriptEncoder"/>.</param>
|
/// <param name="javaScriptEncoder">The <see cref="JavaScriptEncoder"/>.</param>
|
||||||
/// <param name="urlHelperFactory">The <see cref="IUrlHelperFactory"/>.</param>
|
/// <param name="urlHelperFactory">The <see cref="IUrlHelperFactory"/>.</param>
|
||||||
|
|
@ -132,6 +132,7 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
||||||
public LinkTagHelper(
|
public LinkTagHelper(
|
||||||
IHostingEnvironment hostingEnvironment,
|
IHostingEnvironment hostingEnvironment,
|
||||||
TagHelperMemoryCacheProvider cacheProvider,
|
TagHelperMemoryCacheProvider cacheProvider,
|
||||||
|
IFileVersionProvider fileVersionProvider,
|
||||||
HtmlEncoder htmlEncoder,
|
HtmlEncoder htmlEncoder,
|
||||||
JavaScriptEncoder javaScriptEncoder,
|
JavaScriptEncoder javaScriptEncoder,
|
||||||
IUrlHelperFactory urlHelperFactory)
|
IUrlHelperFactory urlHelperFactory)
|
||||||
|
|
@ -140,6 +141,7 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
||||||
HostingEnvironment = hostingEnvironment;
|
HostingEnvironment = hostingEnvironment;
|
||||||
JavaScriptEncoder = javaScriptEncoder;
|
JavaScriptEncoder = javaScriptEncoder;
|
||||||
Cache = cacheProvider.Cache;
|
Cache = cacheProvider.Cache;
|
||||||
|
FileVersionProvider = fileVersionProvider;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
|
|
@ -242,6 +244,8 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
||||||
protected internal GlobbingUrlBuilder GlobbingUrlBuilder { get; set; }
|
protected internal GlobbingUrlBuilder GlobbingUrlBuilder { get; set; }
|
||||||
#pragma warning restore PUB0001
|
#pragma warning restore PUB0001
|
||||||
|
|
||||||
|
internal IFileVersionProvider FileVersionProvider { get; private set; }
|
||||||
|
|
||||||
// Shared writer for determining the string content of a TagHelperAttribute's Value.
|
// Shared writer for determining the string content of a TagHelperAttribute's Value.
|
||||||
private StringWriter StringWriter
|
private StringWriter StringWriter
|
||||||
{
|
{
|
||||||
|
|
@ -299,7 +303,7 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
||||||
var existingAttribute = output.Attributes[index];
|
var existingAttribute = output.Attributes[index];
|
||||||
output.Attributes[index] = new TagHelperAttribute(
|
output.Attributes[index] = new TagHelperAttribute(
|
||||||
existingAttribute.Name,
|
existingAttribute.Name,
|
||||||
_fileVersionProvider.AddFileVersionToPath(Href),
|
FileVersionProvider.AddFileVersionToPath(ViewContext.HttpContext.Request.PathBase, Href),
|
||||||
existingAttribute.ValueStyle);
|
existingAttribute.ValueStyle);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -468,7 +472,7 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
||||||
var valueToWrite = fallbackHrefs[i];
|
var valueToWrite = fallbackHrefs[i];
|
||||||
if (AppendVersion == true)
|
if (AppendVersion == true)
|
||||||
{
|
{
|
||||||
valueToWrite = _fileVersionProvider.AddFileVersionToPath(fallbackHrefs[i]);
|
valueToWrite = FileVersionProvider.AddFileVersionToPath(ViewContext.HttpContext.Request.PathBase, fallbackHrefs[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Must HTML-encode the href attribute value to ensure the written <link/> element is valid. Must also
|
// Must HTML-encode the href attribute value to ensure the written <link/> element is valid. Must also
|
||||||
|
|
@ -495,12 +499,9 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
||||||
|
|
||||||
private void EnsureFileVersionProvider()
|
private void EnsureFileVersionProvider()
|
||||||
{
|
{
|
||||||
if (_fileVersionProvider == null)
|
if (FileVersionProvider == null)
|
||||||
{
|
{
|
||||||
_fileVersionProvider = new FileVersionProvider(
|
FileVersionProvider = ViewContext.HttpContext.RequestServices.GetRequiredService<IFileVersionProvider>();
|
||||||
HostingEnvironment.WebRootFileProvider,
|
|
||||||
Cache,
|
|
||||||
ViewContext.HttpContext.Request.PathBase);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -540,7 +541,7 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
||||||
{
|
{
|
||||||
if (AppendVersion == true)
|
if (AppendVersion == true)
|
||||||
{
|
{
|
||||||
hrefValue = _fileVersionProvider.AddFileVersionToPath(hrefValue);
|
hrefValue = FileVersionProvider.AddFileVersionToPath(ViewContext.HttpContext.Request.PathBase, hrefValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
builder
|
builder
|
||||||
|
|
|
||||||
|
|
@ -7,11 +7,11 @@ using System.IO;
|
||||||
using System.Text.Encodings.Web;
|
using System.Text.Encodings.Web;
|
||||||
using Microsoft.AspNetCore.Hosting;
|
using Microsoft.AspNetCore.Hosting;
|
||||||
using Microsoft.AspNetCore.Html;
|
using Microsoft.AspNetCore.Html;
|
||||||
using Microsoft.AspNetCore.Mvc.Razor;
|
|
||||||
using Microsoft.AspNetCore.Mvc.Razor.Infrastructure;
|
using Microsoft.AspNetCore.Mvc.Razor.Infrastructure;
|
||||||
using Microsoft.AspNetCore.Mvc.Razor.TagHelpers;
|
using Microsoft.AspNetCore.Mvc.Razor.TagHelpers;
|
||||||
using Microsoft.AspNetCore.Mvc.Routing;
|
using Microsoft.AspNetCore.Mvc.Routing;
|
||||||
using Microsoft.AspNetCore.Mvc.TagHelpers.Internal;
|
using Microsoft.AspNetCore.Mvc.TagHelpers.Internal;
|
||||||
|
using Microsoft.AspNetCore.Mvc.ViewFeatures;
|
||||||
using Microsoft.AspNetCore.Razor.TagHelpers;
|
using Microsoft.AspNetCore.Razor.TagHelpers;
|
||||||
using Microsoft.Extensions.Caching.Memory;
|
using Microsoft.Extensions.Caching.Memory;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
|
|
@ -44,7 +44,6 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
||||||
private const string IntegrityAttributeName = "integrity";
|
private const string IntegrityAttributeName = "integrity";
|
||||||
private const string AppendVersionAttributeName = "asp-append-version";
|
private const string AppendVersionAttributeName = "asp-append-version";
|
||||||
private static readonly Func<Mode, Mode, int> Compare = (a, b) => a - b;
|
private static readonly Func<Mode, Mode, int> Compare = (a, b) => a - b;
|
||||||
private FileVersionProvider _fileVersionProvider;
|
|
||||||
private StringWriter _stringWriter;
|
private StringWriter _stringWriter;
|
||||||
|
|
||||||
private static readonly ModeAttributes<Mode>[] ModeDetails = new[] {
|
private static readonly ModeAttributes<Mode>[] ModeDetails = new[] {
|
||||||
|
|
@ -107,6 +106,7 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="hostingEnvironment">The <see cref="IHostingEnvironment"/>.</param>
|
/// <param name="hostingEnvironment">The <see cref="IHostingEnvironment"/>.</param>
|
||||||
/// <param name="cacheProvider">The <see cref="TagHelperMemoryCacheProvider"/>.</param>
|
/// <param name="cacheProvider">The <see cref="TagHelperMemoryCacheProvider"/>.</param>
|
||||||
|
/// <param name="fileVersionProvider">The <see cref="IFileVersionProvider"/>.</param>
|
||||||
/// <param name="htmlEncoder">The <see cref="HtmlEncoder"/>.</param>
|
/// <param name="htmlEncoder">The <see cref="HtmlEncoder"/>.</param>
|
||||||
/// <param name="javaScriptEncoder">The <see cref="JavaScriptEncoder"/>.</param>
|
/// <param name="javaScriptEncoder">The <see cref="JavaScriptEncoder"/>.</param>
|
||||||
/// <param name="urlHelperFactory">The <see cref="IUrlHelperFactory"/>.</param>
|
/// <param name="urlHelperFactory">The <see cref="IUrlHelperFactory"/>.</param>
|
||||||
|
|
@ -116,6 +116,7 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
||||||
public ScriptTagHelper(
|
public ScriptTagHelper(
|
||||||
IHostingEnvironment hostingEnvironment,
|
IHostingEnvironment hostingEnvironment,
|
||||||
TagHelperMemoryCacheProvider cacheProvider,
|
TagHelperMemoryCacheProvider cacheProvider,
|
||||||
|
IFileVersionProvider fileVersionProvider,
|
||||||
HtmlEncoder htmlEncoder,
|
HtmlEncoder htmlEncoder,
|
||||||
JavaScriptEncoder javaScriptEncoder,
|
JavaScriptEncoder javaScriptEncoder,
|
||||||
IUrlHelperFactory urlHelperFactory)
|
IUrlHelperFactory urlHelperFactory)
|
||||||
|
|
@ -124,6 +125,8 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
||||||
HostingEnvironment = hostingEnvironment;
|
HostingEnvironment = hostingEnvironment;
|
||||||
Cache = cacheProvider.Cache;
|
Cache = cacheProvider.Cache;
|
||||||
JavaScriptEncoder = javaScriptEncoder;
|
JavaScriptEncoder = javaScriptEncoder;
|
||||||
|
|
||||||
|
FileVersionProvider = fileVersionProvider;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
|
|
@ -201,6 +204,8 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
||||||
|
|
||||||
protected internal IMemoryCache Cache { get; private set; }
|
protected internal IMemoryCache Cache { get; private set; }
|
||||||
|
|
||||||
|
internal IFileVersionProvider FileVersionProvider { get; private set; }
|
||||||
|
|
||||||
protected JavaScriptEncoder JavaScriptEncoder { get; }
|
protected JavaScriptEncoder JavaScriptEncoder { get; }
|
||||||
|
|
||||||
// Internal for ease of use when testing.
|
// Internal for ease of use when testing.
|
||||||
|
|
@ -265,7 +270,7 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
||||||
var existingAttribute = output.Attributes[index];
|
var existingAttribute = output.Attributes[index];
|
||||||
output.Attributes[index] = new TagHelperAttribute(
|
output.Attributes[index] = new TagHelperAttribute(
|
||||||
existingAttribute.Name,
|
existingAttribute.Name,
|
||||||
_fileVersionProvider.AddFileVersionToPath(Src),
|
FileVersionProvider.AddFileVersionToPath(ViewContext.HttpContext.Request.PathBase, Src),
|
||||||
existingAttribute.ValueStyle);
|
existingAttribute.ValueStyle);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -383,7 +388,7 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
||||||
{
|
{
|
||||||
if (AppendVersion == true)
|
if (AppendVersion == true)
|
||||||
{
|
{
|
||||||
srcValue = _fileVersionProvider.AddFileVersionToPath(srcValue);
|
srcValue = FileVersionProvider.AddFileVersionToPath(ViewContext.HttpContext.Request.PathBase, srcValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
return srcValue;
|
return srcValue;
|
||||||
|
|
@ -428,12 +433,9 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
||||||
|
|
||||||
private void EnsureFileVersionProvider()
|
private void EnsureFileVersionProvider()
|
||||||
{
|
{
|
||||||
if (_fileVersionProvider == null)
|
if (FileVersionProvider == null)
|
||||||
{
|
{
|
||||||
_fileVersionProvider = new FileVersionProvider(
|
FileVersionProvider = ViewContext.HttpContext.RequestServices.GetRequiredService<IFileVersionProvider>();
|
||||||
HostingEnvironment.WebRootFileProvider,
|
|
||||||
Cache,
|
|
||||||
ViewContext.HttpContext.Request.PathBase);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,21 @@
|
||||||
|
// Copyright (c) .NET Foundation. All rights reserved.
|
||||||
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
|
using Microsoft.AspNetCore.Http;
|
||||||
|
|
||||||
|
namespace Microsoft.AspNetCore.Mvc.ViewFeatures
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Provides version hash for a specified file.
|
||||||
|
/// </summary>
|
||||||
|
public interface IFileVersionProvider
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Adds version query parameter to the specified file path.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="requestPathBase">The base path for the current HTTP request.</param>
|
||||||
|
/// <param name="path">The path of the file to which version should be added.</param>
|
||||||
|
/// <returns>Path containing the version query string.</returns>
|
||||||
|
string AddFileVersionToPath(PathString requestPathBase, string path);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -686,7 +686,7 @@ Environment.NewLine + "int b";
|
||||||
convention.InferBoundPropertyModelPrefixes(controller);
|
convention.InferBoundPropertyModelPrefixes(controller);
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
var property = Assert.Single(controller.ControllerProperties);
|
var property = Assert.Single(controller.ControllerProperties, p => p.Name == nameof(ControllerWithBoundProperty.TestProperty));
|
||||||
Assert.Equal(string.Empty, property.BindingInfo.BinderModelName);
|
Assert.Equal(string.Empty, property.BindingInfo.BinderModelName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -720,6 +720,87 @@ Environment.NewLine + "int b";
|
||||||
Assert.Equal(string.Empty, parameter.BindingInfo.BinderModelName);
|
Assert.Equal(string.Empty, parameter.BindingInfo.BinderModelName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void InferParameterModelPrefixes_DoesNotSetModelPrefix_ForFormFileParametersAnnotatedWithFromForm()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var action = GetActionModel(
|
||||||
|
typeof(ParameterBindingController),
|
||||||
|
nameof(ParameterBindingController.FromFormFormFileParameters),
|
||||||
|
TestModelMetadataProvider.CreateDefaultProvider());
|
||||||
|
var convention = GetConvention();
|
||||||
|
|
||||||
|
// Act
|
||||||
|
convention.InferParameterModelPrefixes(action);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.Collection(
|
||||||
|
action.Parameters,
|
||||||
|
parameter =>
|
||||||
|
{
|
||||||
|
Assert.Equal("p1", parameter.Name);
|
||||||
|
Assert.Null(parameter.BindingInfo.BinderModelName);
|
||||||
|
},
|
||||||
|
parameter =>
|
||||||
|
{
|
||||||
|
Assert.Equal("p2", parameter.Name);
|
||||||
|
Assert.Null(parameter.BindingInfo.BinderModelName);
|
||||||
|
},
|
||||||
|
parameter =>
|
||||||
|
{
|
||||||
|
Assert.Equal("p3", parameter.Name);
|
||||||
|
Assert.Null(parameter.BindingInfo.BinderModelName);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void InferParameterModelPrefixes_DoesNotSetModelPrefix_ForFormFileParameters()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var action = GetActionModel(
|
||||||
|
typeof(ParameterBindingController),
|
||||||
|
nameof(ParameterBindingController.FormFileParameters),
|
||||||
|
TestModelMetadataProvider.CreateDefaultProvider());
|
||||||
|
var convention = GetConvention();
|
||||||
|
|
||||||
|
// Act
|
||||||
|
convention.InferParameterModelPrefixes(action);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.Collection(
|
||||||
|
action.Parameters,
|
||||||
|
parameter =>
|
||||||
|
{
|
||||||
|
Assert.Equal("p1", parameter.Name);
|
||||||
|
Assert.Null(parameter.BindingInfo.BinderModelName);
|
||||||
|
},
|
||||||
|
parameter =>
|
||||||
|
{
|
||||||
|
Assert.Equal("p2", parameter.Name);
|
||||||
|
Assert.Null(parameter.BindingInfo.BinderModelName);
|
||||||
|
},
|
||||||
|
parameter =>
|
||||||
|
{
|
||||||
|
Assert.Equal("p3", parameter.Name);
|
||||||
|
Assert.Null(parameter.BindingInfo.BinderModelName);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void InferBoundPropertyModelPrefixes_DoesNotSetModelPrefix_ForFormFileCollectionPropertiesAnnotatedWithFromForm()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var controller = GetControllerModel(typeof(ControllerWithBoundProperty));
|
||||||
|
var convention = GetConvention();
|
||||||
|
|
||||||
|
// Act
|
||||||
|
convention.InferBoundPropertyModelPrefixes(controller);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
var parameter = Assert.Single(controller.ControllerProperties, p => p.Name == nameof(ControllerWithBoundProperty.Files));
|
||||||
|
Assert.Null(parameter.BindingInfo.BinderModelName);
|
||||||
|
}
|
||||||
|
|
||||||
private static InferParameterBindingInfoConvention GetConvention(
|
private static InferParameterBindingInfoConvention GetConvention(
|
||||||
IModelMetadataProvider modelMetadataProvider = null)
|
IModelMetadataProvider modelMetadataProvider = null)
|
||||||
{
|
{
|
||||||
|
|
@ -861,6 +942,10 @@ Environment.NewLine + "int b";
|
||||||
|
|
||||||
[HttpGet]
|
[HttpGet]
|
||||||
public IActionResult ParameterWithRequestPredicateProvider([CustomRequestPredicateAndPropertyFilterProvider] int value) => null;
|
public IActionResult ParameterWithRequestPredicateProvider([CustomRequestPredicateAndPropertyFilterProvider] int value) => null;
|
||||||
|
|
||||||
|
public IActionResult FromFormFormFileParameters([FromForm] IFormFile p1, [FromForm] IFormFile[] p2, [FromForm] IFormFileCollection p3) => null;
|
||||||
|
|
||||||
|
public IActionResult FormFileParameters(IFormFile p1, IFormFile[] p2, IFormFileCollection p3) => null;
|
||||||
}
|
}
|
||||||
|
|
||||||
[ApiController]
|
[ApiController]
|
||||||
|
|
@ -955,6 +1040,9 @@ Environment.NewLine + "int b";
|
||||||
[FromQuery]
|
[FromQuery]
|
||||||
public TestModel TestProperty { get; set; }
|
public TestModel TestProperty { get; set; }
|
||||||
|
|
||||||
|
[FromForm]
|
||||||
|
public IList<IFormFile> Files { get; set; }
|
||||||
|
|
||||||
public IActionResult SomeAction([FromQuery] TestModel test) => null;
|
public IActionResult SomeAction([FromQuery] TestModel test) => null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4,16 +4,18 @@
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
|
using Microsoft.AspNetCore.Hosting;
|
||||||
using Microsoft.AspNetCore.Http;
|
using Microsoft.AspNetCore.Http;
|
||||||
|
using Microsoft.AspNetCore.Mvc.Razor.Infrastructure;
|
||||||
using Microsoft.Extensions.Caching.Memory;
|
using Microsoft.Extensions.Caching.Memory;
|
||||||
using Microsoft.Extensions.FileProviders;
|
using Microsoft.Extensions.FileProviders;
|
||||||
using Microsoft.Extensions.Primitives;
|
using Microsoft.Extensions.Primitives;
|
||||||
using Moq;
|
using Moq;
|
||||||
using Xunit;
|
using Xunit;
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Mvc.TagHelpers.Internal
|
namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
||||||
{
|
{
|
||||||
public class FileVersionProviderTest
|
public class DefaultFileVersionProviderTest
|
||||||
{
|
{
|
||||||
[Theory]
|
[Theory]
|
||||||
[InlineData("/hello/world", "/hello/world?v=f4OxZX_x_FO5LcGBSKHWXfwtSx-j1ncoSt3SABJtkGk")]
|
[InlineData("/hello/world", "/hello/world?v=f4OxZX_x_FO5LcGBSKHWXfwtSx-j1ncoSt3SABJtkGk")]
|
||||||
|
|
@ -25,13 +27,11 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers.Internal
|
||||||
{
|
{
|
||||||
// Arrange
|
// Arrange
|
||||||
var fileProvider = GetMockFileProvider(filePath);
|
var fileProvider = GetMockFileProvider(filePath);
|
||||||
var fileVersionProvider = new FileVersionProvider(
|
var fileVersionProvider = GetFileVersionProvider(fileProvider);
|
||||||
fileProvider,
|
var requestPath = GetRequestPathBase();
|
||||||
new MemoryCache(new MemoryCacheOptions()),
|
|
||||||
GetRequestPathBase());
|
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
var result = fileVersionProvider.AddFileVersionToPath(filePath);
|
var result = fileVersionProvider.AddFileVersionToPath(requestPath, filePath);
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
Assert.Equal(expected, result);
|
Assert.Equal(expected, result);
|
||||||
|
|
@ -46,14 +46,12 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers.Internal
|
||||||
path,
|
path,
|
||||||
pathStartsWithAppName: false,
|
pathStartsWithAppName: false,
|
||||||
fileDoesNotExist: true);
|
fileDoesNotExist: true);
|
||||||
var fileVersionProvider = new FileVersionProvider(
|
var fileVersionProvider = GetFileVersionProvider(fileProvider);
|
||||||
fileProvider,
|
|
||||||
new MemoryCache(new MemoryCacheOptions()),
|
|
||||||
GetRequestPathBase());
|
|
||||||
var mockFileProvider = Mock.Get(fileProvider);
|
var mockFileProvider = Mock.Get(fileProvider);
|
||||||
|
var requestPath = GetRequestPathBase();
|
||||||
|
|
||||||
// Act 1
|
// Act 1
|
||||||
var result = fileVersionProvider.AddFileVersionToPath(path);
|
var result = fileVersionProvider.AddFileVersionToPath(requestPath, path);
|
||||||
|
|
||||||
// Assert 1
|
// Assert 1
|
||||||
Assert.Equal(path, result);
|
Assert.Equal(path, result);
|
||||||
|
|
@ -61,7 +59,7 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers.Internal
|
||||||
mockFileProvider.Verify(f => f.Watch(It.IsAny<string>()), Times.Once());
|
mockFileProvider.Verify(f => f.Watch(It.IsAny<string>()), Times.Once());
|
||||||
|
|
||||||
// Act 2
|
// Act 2
|
||||||
result = fileVersionProvider.AddFileVersionToPath(path);
|
result = fileVersionProvider.AddFileVersionToPath(requestPath, path);
|
||||||
|
|
||||||
// Assert 2
|
// Assert 2
|
||||||
Assert.Equal(path, result);
|
Assert.Equal(path, result);
|
||||||
|
|
@ -78,14 +76,12 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers.Internal
|
||||||
var fileProvider = GetMockFileProvider(
|
var fileProvider = GetMockFileProvider(
|
||||||
"file.txt",
|
"file.txt",
|
||||||
pathStartsWithAppName);
|
pathStartsWithAppName);
|
||||||
var fileVersionProvider = new FileVersionProvider(
|
var fileVersionProvider = GetFileVersionProvider(fileProvider);
|
||||||
fileProvider,
|
|
||||||
new MemoryCache(new MemoryCacheOptions()),
|
|
||||||
GetRequestPathBase());
|
|
||||||
var mockFileProvider = Mock.Get(fileProvider);
|
var mockFileProvider = Mock.Get(fileProvider);
|
||||||
|
var requestPath = GetRequestPathBase();
|
||||||
|
|
||||||
// Act 1
|
// Act 1
|
||||||
var result = fileVersionProvider.AddFileVersionToPath(path);
|
var result = fileVersionProvider.AddFileVersionToPath(requestPath, path);
|
||||||
|
|
||||||
// Assert 1
|
// Assert 1
|
||||||
Assert.Equal($"{path}?v=f4OxZX_x_FO5LcGBSKHWXfwtSx-j1ncoSt3SABJtkGk", result);
|
Assert.Equal($"{path}?v=f4OxZX_x_FO5LcGBSKHWXfwtSx-j1ncoSt3SABJtkGk", result);
|
||||||
|
|
@ -93,7 +89,7 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers.Internal
|
||||||
mockFileProvider.Verify(f => f.Watch(It.IsAny<string>()), Times.Once());
|
mockFileProvider.Verify(f => f.Watch(It.IsAny<string>()), Times.Once());
|
||||||
|
|
||||||
// Act 2
|
// Act 2
|
||||||
result = fileVersionProvider.AddFileVersionToPath(path);
|
result = fileVersionProvider.AddFileVersionToPath(requestPath, path);
|
||||||
|
|
||||||
// Assert 2
|
// Assert 2
|
||||||
Assert.Equal($"{path}?v=f4OxZX_x_FO5LcGBSKHWXfwtSx-j1ncoSt3SABJtkGk", result);
|
Assert.Equal($"{path}?v=f4OxZX_x_FO5LcGBSKHWXfwtSx-j1ncoSt3SABJtkGk", result);
|
||||||
|
|
@ -106,13 +102,11 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers.Internal
|
||||||
{
|
{
|
||||||
// Arrange
|
// Arrange
|
||||||
var fileProvider = new TestFileProvider();
|
var fileProvider = new TestFileProvider();
|
||||||
var fileVersionProvider = new FileVersionProvider(
|
var fileVersionProvider = GetFileVersionProvider(fileProvider);
|
||||||
fileProvider,
|
var requestPath = GetRequestPathBase();
|
||||||
new MemoryCache(new MemoryCacheOptions()),
|
|
||||||
GetRequestPathBase());
|
|
||||||
|
|
||||||
// Act 1 - File does not exist
|
// Act 1 - File does not exist
|
||||||
var result = fileVersionProvider.AddFileVersionToPath("file.txt");
|
var result = fileVersionProvider.AddFileVersionToPath(requestPath, "file.txt");
|
||||||
|
|
||||||
// Assert 1
|
// Assert 1
|
||||||
Assert.Equal("file.txt", result);
|
Assert.Equal("file.txt", result);
|
||||||
|
|
@ -120,7 +114,7 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers.Internal
|
||||||
// Act 2 - File gets added
|
// Act 2 - File gets added
|
||||||
fileProvider.AddFile("file.txt", "Hello World!");
|
fileProvider.AddFile("file.txt", "Hello World!");
|
||||||
fileProvider.GetChangeToken("file.txt").HasChanged = true;
|
fileProvider.GetChangeToken("file.txt").HasChanged = true;
|
||||||
result = fileVersionProvider.AddFileVersionToPath("file.txt");
|
result = fileVersionProvider.AddFileVersionToPath(requestPath, "file.txt");
|
||||||
|
|
||||||
// Assert 2
|
// Assert 2
|
||||||
Assert.Equal("file.txt?v=f4OxZX_x_FO5LcGBSKHWXfwtSx-j1ncoSt3SABJtkGk", result);
|
Assert.Equal("file.txt?v=f4OxZX_x_FO5LcGBSKHWXfwtSx-j1ncoSt3SABJtkGk", result);
|
||||||
|
|
@ -131,14 +125,12 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers.Internal
|
||||||
{
|
{
|
||||||
// Arrange
|
// Arrange
|
||||||
var fileProvider = new TestFileProvider();
|
var fileProvider = new TestFileProvider();
|
||||||
var fileVersionProvider = new FileVersionProvider(
|
var requestPath = GetRequestPathBase();
|
||||||
fileProvider,
|
var fileVersionProvider = GetFileVersionProvider(fileProvider);
|
||||||
new MemoryCache(new MemoryCacheOptions()),
|
|
||||||
GetRequestPathBase());
|
|
||||||
fileProvider.AddFile("file.txt", "Hello World!");
|
fileProvider.AddFile("file.txt", "Hello World!");
|
||||||
|
|
||||||
// Act 1 - File exists
|
// Act 1 - File exists
|
||||||
var result = fileVersionProvider.AddFileVersionToPath("file.txt");
|
var result = fileVersionProvider.AddFileVersionToPath(requestPath, "file.txt");
|
||||||
|
|
||||||
// Assert 1
|
// Assert 1
|
||||||
Assert.Equal("file.txt?v=f4OxZX_x_FO5LcGBSKHWXfwtSx-j1ncoSt3SABJtkGk", result);
|
Assert.Equal("file.txt?v=f4OxZX_x_FO5LcGBSKHWXfwtSx-j1ncoSt3SABJtkGk", result);
|
||||||
|
|
@ -146,7 +138,7 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers.Internal
|
||||||
// Act 2
|
// Act 2
|
||||||
fileProvider.DeleteFile("file.txt");
|
fileProvider.DeleteFile("file.txt");
|
||||||
fileProvider.GetChangeToken("file.txt").HasChanged = true;
|
fileProvider.GetChangeToken("file.txt").HasChanged = true;
|
||||||
result = fileVersionProvider.AddFileVersionToPath("file.txt");
|
result = fileVersionProvider.AddFileVersionToPath(requestPath, "file.txt");
|
||||||
|
|
||||||
// Assert 2
|
// Assert 2
|
||||||
Assert.Equal("file.txt", result);
|
Assert.Equal("file.txt", result);
|
||||||
|
|
@ -157,14 +149,12 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers.Internal
|
||||||
{
|
{
|
||||||
// Arrange
|
// Arrange
|
||||||
var fileProvider = new TestFileProvider();
|
var fileProvider = new TestFileProvider();
|
||||||
var fileVersionProvider = new FileVersionProvider(
|
var requestPath = GetRequestPathBase("/wwwroot/");
|
||||||
fileProvider,
|
var fileVersionProvider = GetFileVersionProvider(fileProvider);
|
||||||
new MemoryCache(new MemoryCacheOptions()),
|
|
||||||
GetRequestPathBase("/wwwroot/"));
|
|
||||||
fileProvider.AddFile("file.txt", "Hello World!");
|
fileProvider.AddFile("file.txt", "Hello World!");
|
||||||
|
|
||||||
// Act 1 - File exists
|
// Act 1 - File exists
|
||||||
var result = fileVersionProvider.AddFileVersionToPath("/wwwroot/file.txt");
|
var result = fileVersionProvider.AddFileVersionToPath(requestPath, "/wwwroot/file.txt");
|
||||||
|
|
||||||
// Assert 1
|
// Assert 1
|
||||||
Assert.Equal("/wwwroot/file.txt?v=f4OxZX_x_FO5LcGBSKHWXfwtSx-j1ncoSt3SABJtkGk", result);
|
Assert.Equal("/wwwroot/file.txt?v=f4OxZX_x_FO5LcGBSKHWXfwtSx-j1ncoSt3SABJtkGk", result);
|
||||||
|
|
@ -172,7 +162,7 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers.Internal
|
||||||
// Act 2
|
// Act 2
|
||||||
fileProvider.DeleteFile("file.txt");
|
fileProvider.DeleteFile("file.txt");
|
||||||
fileProvider.GetChangeToken("file.txt").HasChanged = true;
|
fileProvider.GetChangeToken("file.txt").HasChanged = true;
|
||||||
result = fileVersionProvider.AddFileVersionToPath("/wwwroot/file.txt");
|
result = fileVersionProvider.AddFileVersionToPath(requestPath, "/wwwroot/file.txt");
|
||||||
|
|
||||||
// Assert 2
|
// Assert 2
|
||||||
Assert.Equal("/wwwroot/file.txt", result);
|
Assert.Equal("/wwwroot/file.txt", result);
|
||||||
|
|
@ -192,14 +182,11 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers.Internal
|
||||||
|
|
||||||
var fileProvider = new TestFileProvider();
|
var fileProvider = new TestFileProvider();
|
||||||
fileProvider.AddFile("/hello/world", mockFile.Object);
|
fileProvider.AddFile("/hello/world", mockFile.Object);
|
||||||
|
var requestPath = GetRequestPathBase();
|
||||||
var fileVersionProvider = new FileVersionProvider(
|
var fileVersionProvider = GetFileVersionProvider(fileProvider);
|
||||||
fileProvider,
|
|
||||||
new MemoryCache(new MemoryCacheOptions()),
|
|
||||||
GetRequestPathBase());
|
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
var result = fileVersionProvider.AddFileVersionToPath("/hello/world");
|
var result = fileVersionProvider.AddFileVersionToPath(requestPath, "/hello/world");
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
Assert.True(stream.Disposed);
|
Assert.True(stream.Disposed);
|
||||||
|
|
@ -216,13 +203,11 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers.Internal
|
||||||
{
|
{
|
||||||
// Arrange
|
// Arrange
|
||||||
var fileProvider = GetMockFileProvider(filePath, pathStartsWithAppBase);
|
var fileProvider = GetMockFileProvider(filePath, pathStartsWithAppBase);
|
||||||
var fileVersionProvider = new FileVersionProvider(
|
var requestPath = GetRequestPathBase(requestPathBase);
|
||||||
fileProvider,
|
var fileVersionProvider = GetFileVersionProvider(fileProvider);
|
||||||
new MemoryCache(new MemoryCacheOptions()),
|
|
||||||
GetRequestPathBase(requestPathBase));
|
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
var result = fileVersionProvider.AddFileVersionToPath(filePath);
|
var result = fileVersionProvider.AddFileVersionToPath(requestPath, filePath);
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
Assert.Equal(filePath + "?v=f4OxZX_x_FO5LcGBSKHWXfwtSx-j1ncoSt3SABJtkGk", result);
|
Assert.Equal(filePath + "?v=f4OxZX_x_FO5LcGBSKHWXfwtSx-j1ncoSt3SABJtkGk", result);
|
||||||
|
|
@ -234,13 +219,11 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers.Internal
|
||||||
// Arrange
|
// Arrange
|
||||||
var filePath = "http://contoso.com/hello/world";
|
var filePath = "http://contoso.com/hello/world";
|
||||||
var fileProvider = GetMockFileProvider(filePath, false, true);
|
var fileProvider = GetMockFileProvider(filePath, false, true);
|
||||||
var fileVersionProvider = new FileVersionProvider(
|
var requestPath = GetRequestPathBase();
|
||||||
fileProvider,
|
var fileVersionProvider = GetFileVersionProvider(fileProvider);
|
||||||
new MemoryCache(new MemoryCacheOptions()),
|
|
||||||
GetRequestPathBase());
|
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
var result = fileVersionProvider.AddFileVersionToPath(filePath);
|
var result = fileVersionProvider.AddFileVersionToPath(requestPath, filePath);
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
Assert.Equal("http://contoso.com/hello/world", result);
|
Assert.Equal("http://contoso.com/hello/world", result);
|
||||||
|
|
@ -252,15 +235,14 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers.Internal
|
||||||
// Arrange
|
// Arrange
|
||||||
var filePath = "/hello/world";
|
var filePath = "/hello/world";
|
||||||
var fileProvider = GetMockFileProvider(filePath);
|
var fileProvider = GetMockFileProvider(filePath);
|
||||||
var memoryCache = new MemoryCache(new MemoryCacheOptions());
|
var fileVersionProvider = GetFileVersionProvider(fileProvider);
|
||||||
memoryCache.Set(filePath, "FromCache");
|
var cacheEntryOptions = new MemoryCacheEntryOptions();
|
||||||
var fileVersionProvider = new FileVersionProvider(
|
cacheEntryOptions.SetSize(1);
|
||||||
fileProvider,
|
fileVersionProvider.Cache.Set(filePath, "FromCache", cacheEntryOptions);
|
||||||
memoryCache,
|
var requestPath = GetRequestPathBase();
|
||||||
GetRequestPathBase());
|
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
var result = fileVersionProvider.AddFileVersionToPath(filePath);
|
var result = fileVersionProvider.AddFileVersionToPath(requestPath, filePath);
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
Assert.Equal("FromCache", result);
|
Assert.Equal("FromCache", result);
|
||||||
|
|
@ -290,13 +272,12 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers.Internal
|
||||||
.Returns(cacheEntry)
|
.Returns(cacheEntry)
|
||||||
.Verifiable();
|
.Verifiable();
|
||||||
|
|
||||||
var fileVersionProvider = new FileVersionProvider(
|
var requestPath = GetRequestPathBase(requestPathBase);
|
||||||
fileProvider,
|
|
||||||
cache.Object,
|
var fileVersionProvider = GetFileVersionProvider(fileProvider, cache.Object);
|
||||||
GetRequestPathBase(requestPathBase));
|
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
var result = fileVersionProvider.AddFileVersionToPath(filePath);
|
var result = fileVersionProvider.AddFileVersionToPath(requestPath, filePath);
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
Assert.Equal(expected, result);
|
Assert.Equal(expected, result);
|
||||||
|
|
@ -305,6 +286,20 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers.Internal
|
||||||
cache.VerifyAll();
|
cache.VerifyAll();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static DefaultFileVersionProvider GetFileVersionProvider(
|
||||||
|
IFileProvider fileProvider,
|
||||||
|
IMemoryCache memoryCache = null)
|
||||||
|
{
|
||||||
|
var hostingEnv = Mock.Of<IHostingEnvironment>(e => e.WebRootFileProvider == fileProvider);
|
||||||
|
var cacheProvider = new TagHelperMemoryCacheProvider();
|
||||||
|
if (memoryCache != null)
|
||||||
|
{
|
||||||
|
cacheProvider.Cache = memoryCache;
|
||||||
|
}
|
||||||
|
|
||||||
|
return new DefaultFileVersionProvider(hostingEnv, cacheProvider);
|
||||||
|
}
|
||||||
|
|
||||||
private static IFileProvider GetMockFileProvider(
|
private static IFileProvider GetMockFileProvider(
|
||||||
string filePath,
|
string filePath,
|
||||||
bool pathStartsWithAppName = false,
|
bool pathStartsWithAppName = false,
|
||||||
|
|
@ -19,7 +19,6 @@ using Microsoft.AspNetCore.Mvc.ViewEngines;
|
||||||
using Microsoft.AspNetCore.Mvc.ViewFeatures;
|
using Microsoft.AspNetCore.Mvc.ViewFeatures;
|
||||||
using Microsoft.AspNetCore.Razor.TagHelpers;
|
using Microsoft.AspNetCore.Razor.TagHelpers;
|
||||||
using Microsoft.AspNetCore.Routing;
|
using Microsoft.AspNetCore.Routing;
|
||||||
using Microsoft.Extensions.Caching.Memory;
|
|
||||||
using Microsoft.Extensions.FileProviders;
|
using Microsoft.Extensions.FileProviders;
|
||||||
using Microsoft.Extensions.Primitives;
|
using Microsoft.Extensions.Primitives;
|
||||||
using Microsoft.Extensions.WebEncoders.Testing;
|
using Microsoft.Extensions.WebEncoders.Testing;
|
||||||
|
|
@ -58,8 +57,6 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
||||||
outputAttributes,
|
outputAttributes,
|
||||||
getChildContentAsync: (useCachedResult, encoder) => Task.FromResult<TagHelperContent>(
|
getChildContentAsync: (useCachedResult, encoder) => Task.FromResult<TagHelperContent>(
|
||||||
new DefaultTagHelperContent()));
|
new DefaultTagHelperContent()));
|
||||||
var hostingEnvironment = MakeHostingEnvironment();
|
|
||||||
var viewContext = MakeViewContext();
|
|
||||||
var urlHelper = new Mock<IUrlHelper>();
|
var urlHelper = new Mock<IUrlHelper>();
|
||||||
|
|
||||||
// Ensure expanded path does not look like an absolute path on Linux, avoiding
|
// Ensure expanded path does not look like an absolute path on Linux, avoiding
|
||||||
|
|
@ -72,16 +69,9 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
||||||
.Setup(f => f.GetUrlHelper(It.IsAny<ActionContext>()))
|
.Setup(f => f.GetUrlHelper(It.IsAny<ActionContext>()))
|
||||||
.Returns(urlHelper.Object);
|
.Returns(urlHelper.Object);
|
||||||
|
|
||||||
var helper = new ImageTagHelper(
|
var helper = GetHelper(urlHelperFactory: urlHelperFactory.Object);
|
||||||
hostingEnvironment,
|
helper.AppendVersion = true;
|
||||||
new TagHelperMemoryCacheProvider(),
|
helper.Src = src;
|
||||||
new HtmlTestEncoder(),
|
|
||||||
urlHelperFactory.Object)
|
|
||||||
{
|
|
||||||
ViewContext = viewContext,
|
|
||||||
AppendVersion = true,
|
|
||||||
Src = src,
|
|
||||||
};
|
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
helper.Process(context, output);
|
helper.Process(context, output);
|
||||||
|
|
@ -123,19 +113,9 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
||||||
{ "src", "testimage.png?v=f4OxZX_x_FO5LcGBSKHWXfwtSx-j1ncoSt3SABJtkGk" }
|
{ "src", "testimage.png?v=f4OxZX_x_FO5LcGBSKHWXfwtSx-j1ncoSt3SABJtkGk" }
|
||||||
});
|
});
|
||||||
|
|
||||||
var hostingEnvironment = MakeHostingEnvironment();
|
var helper = GetHelper();
|
||||||
var viewContext = MakeViewContext();
|
helper.Src = "testimage.png";
|
||||||
|
helper.AppendVersion = true;
|
||||||
var helper = new ImageTagHelper(
|
|
||||||
hostingEnvironment,
|
|
||||||
new TagHelperMemoryCacheProvider(),
|
|
||||||
new HtmlTestEncoder(),
|
|
||||||
MakeUrlHelperFactory())
|
|
||||||
{
|
|
||||||
ViewContext = viewContext,
|
|
||||||
Src = "testimage.png",
|
|
||||||
AppendVersion = true,
|
|
||||||
};
|
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
helper.Process(context, output);
|
helper.Process(context, output);
|
||||||
|
|
@ -171,12 +151,9 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
||||||
var hostingEnvironment = MakeHostingEnvironment();
|
var hostingEnvironment = MakeHostingEnvironment();
|
||||||
var viewContext = MakeViewContext();
|
var viewContext = MakeViewContext();
|
||||||
|
|
||||||
var helper = new ImageTagHelper(hostingEnvironment, new TagHelperMemoryCacheProvider(), new HtmlTestEncoder(), MakeUrlHelperFactory())
|
var helper = GetHelper();
|
||||||
{
|
helper.Src = "/images/test-image.png";
|
||||||
ViewContext = viewContext,
|
helper.AppendVersion = true;
|
||||||
Src = "/images/test-image.png",
|
|
||||||
AppendVersion = true
|
|
||||||
};
|
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
helper.Process(context, output);
|
helper.Process(context, output);
|
||||||
|
|
@ -207,12 +184,8 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
||||||
var hostingEnvironment = MakeHostingEnvironment();
|
var hostingEnvironment = MakeHostingEnvironment();
|
||||||
var viewContext = MakeViewContext();
|
var viewContext = MakeViewContext();
|
||||||
|
|
||||||
var helper = new ImageTagHelper(hostingEnvironment, new TagHelperMemoryCacheProvider(), new HtmlTestEncoder(), MakeUrlHelperFactory())
|
var helper = GetHelper();
|
||||||
{
|
helper.Src = "/images/test-image.png";
|
||||||
ViewContext = viewContext,
|
|
||||||
Src = "/images/test-image.png",
|
|
||||||
AppendVersion = false
|
|
||||||
};
|
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
helper.Process(context, output);
|
helper.Process(context, output);
|
||||||
|
|
@ -243,12 +216,9 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
||||||
var hostingEnvironment = MakeHostingEnvironment();
|
var hostingEnvironment = MakeHostingEnvironment();
|
||||||
var viewContext = MakeViewContext("/bar");
|
var viewContext = MakeViewContext("/bar");
|
||||||
|
|
||||||
var helper = new ImageTagHelper(hostingEnvironment, new TagHelperMemoryCacheProvider(), new HtmlTestEncoder(), MakeUrlHelperFactory())
|
var helper = GetHelper();
|
||||||
{
|
helper.Src = "/bar/images/image.jpg";
|
||||||
ViewContext = viewContext,
|
helper.AppendVersion = true;
|
||||||
Src = "/bar/images/image.jpg",
|
|
||||||
AppendVersion = true
|
|
||||||
};
|
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
helper.Process(context, output);
|
helper.Process(context, output);
|
||||||
|
|
@ -281,6 +251,29 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
||||||
return viewContext;
|
return viewContext;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static ImageTagHelper GetHelper(
|
||||||
|
IHostingEnvironment hostingEnvironment = null,
|
||||||
|
IUrlHelperFactory urlHelperFactory = null,
|
||||||
|
ViewContext viewContext = null)
|
||||||
|
{
|
||||||
|
hostingEnvironment = hostingEnvironment ?? MakeHostingEnvironment();
|
||||||
|
urlHelperFactory = urlHelperFactory ?? MakeUrlHelperFactory();
|
||||||
|
viewContext = viewContext ?? MakeViewContext();
|
||||||
|
|
||||||
|
var cacheProvider = new TagHelperMemoryCacheProvider();
|
||||||
|
var fileVersionProvider = new DefaultFileVersionProvider(hostingEnvironment, cacheProvider);
|
||||||
|
|
||||||
|
return new ImageTagHelper(
|
||||||
|
hostingEnvironment,
|
||||||
|
new TagHelperMemoryCacheProvider(),
|
||||||
|
fileVersionProvider,
|
||||||
|
new HtmlTestEncoder(),
|
||||||
|
urlHelperFactory)
|
||||||
|
{
|
||||||
|
ViewContext = viewContext,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
private static TagHelperContext MakeTagHelperContext(
|
private static TagHelperContext MakeTagHelperContext(
|
||||||
TagHelperAttributeList attributes)
|
TagHelperAttributeList attributes)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,7 @@ using Microsoft.AspNetCore.Mvc.Razor.Infrastructure;
|
||||||
using Microsoft.AspNetCore.Mvc.Rendering;
|
using Microsoft.AspNetCore.Mvc.Rendering;
|
||||||
using Microsoft.AspNetCore.Mvc.Routing;
|
using Microsoft.AspNetCore.Mvc.Routing;
|
||||||
using Microsoft.AspNetCore.Mvc.TagHelpers;
|
using Microsoft.AspNetCore.Mvc.TagHelpers;
|
||||||
|
using Microsoft.AspNetCore.Mvc.ViewFeatures;
|
||||||
using Microsoft.Extensions.Caching.Memory;
|
using Microsoft.Extensions.Caching.Memory;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
using Moq;
|
using Moq;
|
||||||
|
|
@ -22,6 +23,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Internal
|
||||||
private readonly TagHelperMemoryCacheProvider CacheProvider = new TagHelperMemoryCacheProvider();
|
private readonly TagHelperMemoryCacheProvider CacheProvider = new TagHelperMemoryCacheProvider();
|
||||||
private readonly IMemoryCache MemoryCache = new MemoryCache(new MemoryCacheOptions());
|
private readonly IMemoryCache MemoryCache = new MemoryCache(new MemoryCacheOptions());
|
||||||
private readonly IHostingEnvironment HostingEnvironment = Mock.Of<IHostingEnvironment>();
|
private readonly IHostingEnvironment HostingEnvironment = Mock.Of<IHostingEnvironment>();
|
||||||
|
private readonly IFileVersionProvider FileVersionProvider = Mock.Of<IFileVersionProvider>();
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public void ScriptTagHelper_DoesNotUseMemoryCacheInstanceFromDI()
|
public void ScriptTagHelper_DoesNotUseMemoryCacheInstanceFromDI()
|
||||||
|
|
@ -34,6 +36,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Internal
|
||||||
|
|
||||||
Assert.Same(CacheProvider.Cache, scriptTagHelper.Cache);
|
Assert.Same(CacheProvider.Cache, scriptTagHelper.Cache);
|
||||||
Assert.Same(HostingEnvironment, scriptTagHelper.HostingEnvironment);
|
Assert.Same(HostingEnvironment, scriptTagHelper.HostingEnvironment);
|
||||||
|
Assert.Same(FileVersionProvider, scriptTagHelper.FileVersionProvider);
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
|
|
@ -47,6 +50,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Internal
|
||||||
|
|
||||||
Assert.Same(CacheProvider.Cache, linkTagHelper.Cache);
|
Assert.Same(CacheProvider.Cache, linkTagHelper.Cache);
|
||||||
Assert.Same(HostingEnvironment, linkTagHelper.HostingEnvironment);
|
Assert.Same(HostingEnvironment, linkTagHelper.HostingEnvironment);
|
||||||
|
Assert.Same(FileVersionProvider, linkTagHelper.FileVersionProvider);
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
|
|
@ -60,6 +64,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Internal
|
||||||
|
|
||||||
Assert.Same(CacheProvider.Cache, imageTagHelper.Cache);
|
Assert.Same(CacheProvider.Cache, imageTagHelper.Cache);
|
||||||
Assert.Same(HostingEnvironment, imageTagHelper.HostingEnvironment);
|
Assert.Same(HostingEnvironment, imageTagHelper.HostingEnvironment);
|
||||||
|
Assert.Same(FileVersionProvider, imageTagHelper.FileVersionProvider);
|
||||||
}
|
}
|
||||||
|
|
||||||
private ViewContext CreateViewContext()
|
private ViewContext CreateViewContext()
|
||||||
|
|
@ -71,6 +76,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Internal
|
||||||
.AddSingleton(HtmlEncoder.Default)
|
.AddSingleton(HtmlEncoder.Default)
|
||||||
.AddSingleton(JavaScriptEncoder.Default)
|
.AddSingleton(JavaScriptEncoder.Default)
|
||||||
.AddSingleton(Mock.Of<IUrlHelperFactory>())
|
.AddSingleton(Mock.Of<IUrlHelperFactory>())
|
||||||
|
.AddSingleton(FileVersionProvider)
|
||||||
.BuildServiceProvider();
|
.BuildServiceProvider();
|
||||||
|
|
||||||
var viewContext = new ViewContext
|
var viewContext = new ViewContext
|
||||||
|
|
|
||||||
|
|
@ -55,8 +55,6 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
||||||
{ "href", hrefOutput },
|
{ "href", hrefOutput },
|
||||||
};
|
};
|
||||||
var output = MakeTagHelperOutput("link", outputAttributes);
|
var output = MakeTagHelperOutput("link", outputAttributes);
|
||||||
var hostingEnvironment = MakeHostingEnvironment();
|
|
||||||
var viewContext = MakeViewContext();
|
|
||||||
var urlHelper = new Mock<IUrlHelper>();
|
var urlHelper = new Mock<IUrlHelper>();
|
||||||
|
|
||||||
// Ensure expanded path does not look like an absolute path on Linux, avoiding
|
// Ensure expanded path does not look like an absolute path on Linux, avoiding
|
||||||
|
|
@ -69,17 +67,9 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
||||||
.Setup(f => f.GetUrlHelper(It.IsAny<ActionContext>()))
|
.Setup(f => f.GetUrlHelper(It.IsAny<ActionContext>()))
|
||||||
.Returns(urlHelper.Object);
|
.Returns(urlHelper.Object);
|
||||||
|
|
||||||
var helper = new LinkTagHelper(
|
var helper = GetHelper(urlHelperFactory: urlHelperFactory.Object);
|
||||||
hostingEnvironment,
|
helper.AppendVersion = true;
|
||||||
new TagHelperMemoryCacheProvider(),
|
helper.Href = href;
|
||||||
new HtmlTestEncoder(),
|
|
||||||
new JavaScriptTestEncoder(),
|
|
||||||
urlHelperFactory.Object)
|
|
||||||
{
|
|
||||||
ViewContext = viewContext,
|
|
||||||
AppendVersion = true,
|
|
||||||
Href = href,
|
|
||||||
};
|
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
helper.Process(context, output);
|
helper.Process(context, output);
|
||||||
|
|
@ -163,23 +153,14 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
||||||
new TagHelperAttribute("rel", new HtmlString("stylesheet"))
|
new TagHelperAttribute("rel", new HtmlString("stylesheet"))
|
||||||
}));
|
}));
|
||||||
var output = MakeTagHelperOutput("link", combinedOutputAttributes);
|
var output = MakeTagHelperOutput("link", combinedOutputAttributes);
|
||||||
var hostingEnvironment = MakeHostingEnvironment();
|
|
||||||
var viewContext = MakeViewContext();
|
|
||||||
|
|
||||||
var helper = new LinkTagHelper(
|
var helper = GetHelper();
|
||||||
hostingEnvironment,
|
helper.FallbackHref = "test.css";
|
||||||
new TagHelperMemoryCacheProvider(),
|
helper.FallbackTestClass = "hidden";
|
||||||
new HtmlTestEncoder(),
|
helper.FallbackTestProperty = "visibility";
|
||||||
new JavaScriptTestEncoder(),
|
helper.FallbackTestValue = "hidden";
|
||||||
MakeUrlHelperFactory())
|
helper.Href = "test.css";
|
||||||
{
|
|
||||||
ViewContext = viewContext,
|
|
||||||
FallbackHref = "test.css",
|
|
||||||
FallbackTestClass = "hidden",
|
|
||||||
FallbackTestProperty = "visibility",
|
|
||||||
FallbackTestValue = "hidden",
|
|
||||||
Href = "test.css",
|
|
||||||
};
|
|
||||||
var expectedAttributes = new TagHelperAttributeList(output.Attributes);
|
var expectedAttributes = new TagHelperAttributeList(output.Attributes);
|
||||||
expectedAttributes.Add(new TagHelperAttribute("href", "test.css"));
|
expectedAttributes.Add(new TagHelperAttribute("href", "test.css"));
|
||||||
|
|
||||||
|
|
@ -320,8 +301,6 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
||||||
// Arrange
|
// Arrange
|
||||||
var context = MakeTagHelperContext(attributes);
|
var context = MakeTagHelperContext(attributes);
|
||||||
var output = MakeTagHelperOutput("link");
|
var output = MakeTagHelperOutput("link");
|
||||||
var hostingEnvironment = MakeHostingEnvironment();
|
|
||||||
var viewContext = MakeViewContext();
|
|
||||||
var globbingUrlBuilder = new Mock<GlobbingUrlBuilder>(
|
var globbingUrlBuilder = new Mock<GlobbingUrlBuilder>(
|
||||||
new TestFileProvider(),
|
new TestFileProvider(),
|
||||||
Mock.Of<IMemoryCache>(),
|
Mock.Of<IMemoryCache>(),
|
||||||
|
|
@ -329,16 +308,9 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
||||||
globbingUrlBuilder.Setup(g => g.BuildUrlList(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>()))
|
globbingUrlBuilder.Setup(g => g.BuildUrlList(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>()))
|
||||||
.Returns(new[] { "/common.css" });
|
.Returns(new[] { "/common.css" });
|
||||||
|
|
||||||
var helper = new LinkTagHelper(
|
var helper = GetHelper();
|
||||||
hostingEnvironment,
|
helper.GlobbingUrlBuilder = globbingUrlBuilder.Object;
|
||||||
new TagHelperMemoryCacheProvider(),
|
|
||||||
new HtmlTestEncoder(),
|
|
||||||
new JavaScriptTestEncoder(),
|
|
||||||
MakeUrlHelperFactory())
|
|
||||||
{
|
|
||||||
ViewContext = viewContext,
|
|
||||||
GlobbingUrlBuilder = globbingUrlBuilder.Object
|
|
||||||
};
|
|
||||||
setProperties(helper);
|
setProperties(helper);
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
|
|
@ -417,8 +389,6 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
||||||
// Arrange
|
// Arrange
|
||||||
var context = MakeTagHelperContext(attributes);
|
var context = MakeTagHelperContext(attributes);
|
||||||
var output = MakeTagHelperOutput("link");
|
var output = MakeTagHelperOutput("link");
|
||||||
var hostingEnvironment = MakeHostingEnvironment();
|
|
||||||
var viewContext = MakeViewContext();
|
|
||||||
var globbingUrlBuilder = new Mock<GlobbingUrlBuilder>(
|
var globbingUrlBuilder = new Mock<GlobbingUrlBuilder>(
|
||||||
new TestFileProvider(),
|
new TestFileProvider(),
|
||||||
Mock.Of<IMemoryCache>(),
|
Mock.Of<IMemoryCache>(),
|
||||||
|
|
@ -426,16 +396,8 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
||||||
globbingUrlBuilder.Setup(g => g.BuildUrlList(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>()))
|
globbingUrlBuilder.Setup(g => g.BuildUrlList(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>()))
|
||||||
.Returns(new[] { "/common.css" });
|
.Returns(new[] { "/common.css" });
|
||||||
|
|
||||||
var helper = new LinkTagHelper(
|
var helper = GetHelper();
|
||||||
hostingEnvironment,
|
helper.GlobbingUrlBuilder = globbingUrlBuilder.Object;
|
||||||
new TagHelperMemoryCacheProvider(),
|
|
||||||
new HtmlTestEncoder(),
|
|
||||||
new JavaScriptTestEncoder(),
|
|
||||||
MakeUrlHelperFactory())
|
|
||||||
{
|
|
||||||
ViewContext = viewContext,
|
|
||||||
GlobbingUrlBuilder = globbingUrlBuilder.Object
|
|
||||||
};
|
|
||||||
setProperties(helper);
|
setProperties(helper);
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
|
|
@ -469,23 +431,13 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
||||||
{ "rel", new HtmlString("stylesheet") },
|
{ "rel", new HtmlString("stylesheet") },
|
||||||
{ "data-extra", new HtmlString("something") },
|
{ "data-extra", new HtmlString("something") },
|
||||||
});
|
});
|
||||||
var hostingEnvironment = MakeHostingEnvironment();
|
|
||||||
var viewContext = MakeViewContext();
|
|
||||||
|
|
||||||
var helper = new LinkTagHelper(
|
var helper = GetHelper();
|
||||||
hostingEnvironment,
|
helper.FallbackHref = "test.css";
|
||||||
new TagHelperMemoryCacheProvider(),
|
helper.FallbackTestClass = "hidden";
|
||||||
new HtmlTestEncoder(),
|
helper.FallbackTestProperty = "visibility";
|
||||||
new JavaScriptTestEncoder(),
|
helper.FallbackTestValue = "hidden";
|
||||||
MakeUrlHelperFactory())
|
helper.Href = "test.css";
|
||||||
{
|
|
||||||
ViewContext = viewContext,
|
|
||||||
FallbackHref = "test.css",
|
|
||||||
FallbackTestClass = "hidden",
|
|
||||||
FallbackTestProperty = "visibility",
|
|
||||||
FallbackTestValue = "hidden",
|
|
||||||
Href = "test.css",
|
|
||||||
};
|
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
helper.Process(context, output);
|
helper.Process(context, output);
|
||||||
|
|
@ -580,18 +532,8 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
||||||
// Arrange
|
// Arrange
|
||||||
var context = MakeTagHelperContext(attributes);
|
var context = MakeTagHelperContext(attributes);
|
||||||
var output = MakeTagHelperOutput("link");
|
var output = MakeTagHelperOutput("link");
|
||||||
var hostingEnvironment = MakeHostingEnvironment();
|
|
||||||
var viewContext = MakeViewContext();
|
|
||||||
|
|
||||||
var helper = new LinkTagHelper(
|
var helper = GetHelper();
|
||||||
hostingEnvironment,
|
|
||||||
new TagHelperMemoryCacheProvider(),
|
|
||||||
new HtmlTestEncoder(),
|
|
||||||
new JavaScriptTestEncoder(),
|
|
||||||
MakeUrlHelperFactory())
|
|
||||||
{
|
|
||||||
ViewContext = viewContext,
|
|
||||||
};
|
|
||||||
setProperties(helper);
|
setProperties(helper);
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
|
|
@ -610,18 +552,8 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
||||||
// Arrange
|
// Arrange
|
||||||
var context = MakeTagHelperContext();
|
var context = MakeTagHelperContext();
|
||||||
var output = MakeTagHelperOutput("link");
|
var output = MakeTagHelperOutput("link");
|
||||||
var hostingEnvironment = MakeHostingEnvironment();
|
|
||||||
var viewContext = MakeViewContext();
|
|
||||||
|
|
||||||
var helper = new LinkTagHelper(
|
var helper = GetHelper();
|
||||||
hostingEnvironment,
|
|
||||||
new TagHelperMemoryCacheProvider(),
|
|
||||||
new HtmlTestEncoder(),
|
|
||||||
new JavaScriptTestEncoder(),
|
|
||||||
MakeUrlHelperFactory())
|
|
||||||
{
|
|
||||||
ViewContext = viewContext,
|
|
||||||
};
|
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
helper.Process(context, output);
|
helper.Process(context, output);
|
||||||
|
|
@ -650,8 +582,6 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
||||||
{
|
{
|
||||||
{ "rel", new HtmlString("stylesheet") },
|
{ "rel", new HtmlString("stylesheet") },
|
||||||
});
|
});
|
||||||
var hostingEnvironment = MakeHostingEnvironment();
|
|
||||||
var viewContext = MakeViewContext();
|
|
||||||
var globbingUrlBuilder = new Mock<GlobbingUrlBuilder>(
|
var globbingUrlBuilder = new Mock<GlobbingUrlBuilder>(
|
||||||
new TestFileProvider(),
|
new TestFileProvider(),
|
||||||
Mock.Of<IMemoryCache>(),
|
Mock.Of<IMemoryCache>(),
|
||||||
|
|
@ -659,18 +589,11 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
||||||
globbingUrlBuilder.Setup(g => g.BuildUrlList(null, "**/*.css", null))
|
globbingUrlBuilder.Setup(g => g.BuildUrlList(null, "**/*.css", null))
|
||||||
.Returns(new[] { "/base.css" });
|
.Returns(new[] { "/base.css" });
|
||||||
|
|
||||||
var helper = new LinkTagHelper(
|
var helper = GetHelper();
|
||||||
hostingEnvironment,
|
|
||||||
new TagHelperMemoryCacheProvider(),
|
helper.GlobbingUrlBuilder = globbingUrlBuilder.Object;
|
||||||
new HtmlTestEncoder(),
|
helper.Href = "/css/site.css";
|
||||||
new JavaScriptTestEncoder(),
|
helper.HrefInclude = "**/*.css";
|
||||||
MakeUrlHelperFactory())
|
|
||||||
{
|
|
||||||
GlobbingUrlBuilder = globbingUrlBuilder.Object,
|
|
||||||
ViewContext = viewContext,
|
|
||||||
Href = "/css/site.css",
|
|
||||||
HrefInclude = "**/*.css",
|
|
||||||
};
|
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
helper.Process(context, output);
|
helper.Process(context, output);
|
||||||
|
|
@ -713,8 +636,6 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
||||||
{ "literal", "all HTML encoded" },
|
{ "literal", "all HTML encoded" },
|
||||||
{ new TagHelperAttribute("mixed", mixed, HtmlAttributeValueStyle.SingleQuotes) },
|
{ new TagHelperAttribute("mixed", mixed, HtmlAttributeValueStyle.SingleQuotes) },
|
||||||
});
|
});
|
||||||
var hostingEnvironment = MakeHostingEnvironment();
|
|
||||||
var viewContext = MakeViewContext();
|
|
||||||
var globbingUrlBuilder = new Mock<GlobbingUrlBuilder>(
|
var globbingUrlBuilder = new Mock<GlobbingUrlBuilder>(
|
||||||
new TestFileProvider(),
|
new TestFileProvider(),
|
||||||
Mock.Of<IMemoryCache>(),
|
Mock.Of<IMemoryCache>(),
|
||||||
|
|
@ -722,18 +643,10 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
||||||
globbingUrlBuilder.Setup(g => g.BuildUrlList(null, "**/*.css", null))
|
globbingUrlBuilder.Setup(g => g.BuildUrlList(null, "**/*.css", null))
|
||||||
.Returns(new[] { "/base.css" });
|
.Returns(new[] { "/base.css" });
|
||||||
|
|
||||||
var helper = new LinkTagHelper(
|
var helper = GetHelper();
|
||||||
hostingEnvironment,
|
helper.GlobbingUrlBuilder = globbingUrlBuilder.Object;
|
||||||
new TagHelperMemoryCacheProvider(),
|
helper.Href = "/css/site.css";
|
||||||
new HtmlTestEncoder(),
|
helper.HrefInclude = "**/*.css";
|
||||||
new JavaScriptTestEncoder(),
|
|
||||||
MakeUrlHelperFactory())
|
|
||||||
{
|
|
||||||
GlobbingUrlBuilder = globbingUrlBuilder.Object,
|
|
||||||
Href = "/css/site.css",
|
|
||||||
HrefInclude = "**/*.css",
|
|
||||||
ViewContext = viewContext,
|
|
||||||
};
|
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
helper.Process(context, output);
|
helper.Process(context, output);
|
||||||
|
|
@ -760,20 +673,11 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
||||||
{
|
{
|
||||||
{ "rel", new HtmlString("stylesheet") },
|
{ "rel", new HtmlString("stylesheet") },
|
||||||
});
|
});
|
||||||
var hostingEnvironment = MakeHostingEnvironment();
|
|
||||||
var viewContext = MakeViewContext();
|
|
||||||
|
|
||||||
var helper = new LinkTagHelper(
|
var helper = GetHelper();
|
||||||
hostingEnvironment,
|
|
||||||
new TagHelperMemoryCacheProvider(),
|
helper.Href = "/css/site.css";
|
||||||
new HtmlTestEncoder(),
|
helper.AppendVersion = true;
|
||||||
new JavaScriptTestEncoder(),
|
|
||||||
MakeUrlHelperFactory())
|
|
||||||
{
|
|
||||||
ViewContext = viewContext,
|
|
||||||
Href = "/css/site.css",
|
|
||||||
AppendVersion = true
|
|
||||||
};
|
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
helper.Process(context, output);
|
helper.Process(context, output);
|
||||||
|
|
@ -798,20 +702,12 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
||||||
{
|
{
|
||||||
{ "rel", new HtmlString("stylesheet") },
|
{ "rel", new HtmlString("stylesheet") },
|
||||||
});
|
});
|
||||||
var hostingEnvironment = MakeHostingEnvironment();
|
|
||||||
var viewContext = MakeViewContext("/bar");
|
var viewContext = MakeViewContext("/bar");
|
||||||
|
|
||||||
var helper = new LinkTagHelper(
|
var helper = GetHelper();
|
||||||
hostingEnvironment,
|
helper.ViewContext = viewContext;
|
||||||
new TagHelperMemoryCacheProvider(),
|
helper.Href = "/bar/css/site.css";
|
||||||
new HtmlTestEncoder(),
|
helper.AppendVersion = true;
|
||||||
new JavaScriptTestEncoder(),
|
|
||||||
MakeUrlHelperFactory())
|
|
||||||
{
|
|
||||||
ViewContext = viewContext,
|
|
||||||
Href = "/bar/css/site.css",
|
|
||||||
AppendVersion = true
|
|
||||||
};
|
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
helper.Process(context, output);
|
helper.Process(context, output);
|
||||||
|
|
@ -850,8 +746,6 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
||||||
{
|
{
|
||||||
{ "rel", new HtmlString("stylesheet") },
|
{ "rel", new HtmlString("stylesheet") },
|
||||||
});
|
});
|
||||||
var hostingEnvironment = MakeHostingEnvironment();
|
|
||||||
var viewContext = MakeViewContext();
|
|
||||||
var globbingUrlBuilder = new Mock<GlobbingUrlBuilder>(
|
var globbingUrlBuilder = new Mock<GlobbingUrlBuilder>(
|
||||||
new TestFileProvider(),
|
new TestFileProvider(),
|
||||||
Mock.Of<IMemoryCache>(),
|
Mock.Of<IMemoryCache>(),
|
||||||
|
|
@ -859,22 +753,14 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
||||||
globbingUrlBuilder.Setup(g => g.BuildUrlList(null, "**/fallback.css", null))
|
globbingUrlBuilder.Setup(g => g.BuildUrlList(null, "**/fallback.css", null))
|
||||||
.Returns(new[] { "/fallback.css" });
|
.Returns(new[] { "/fallback.css" });
|
||||||
|
|
||||||
var helper = new LinkTagHelper(
|
var helper = GetHelper();
|
||||||
MakeHostingEnvironment(),
|
helper.AppendVersion = true;
|
||||||
new TagHelperMemoryCacheProvider(),
|
helper.Href = "/css/site.css";
|
||||||
new HtmlTestEncoder(),
|
helper.FallbackHrefInclude = "**/fallback.css";
|
||||||
new JavaScriptTestEncoder(),
|
helper.FallbackTestClass = "hidden";
|
||||||
MakeUrlHelperFactory())
|
helper.FallbackTestProperty = "visibility";
|
||||||
{
|
helper.FallbackTestValue = "hidden";
|
||||||
AppendVersion = true,
|
helper.GlobbingUrlBuilder = globbingUrlBuilder.Object;
|
||||||
Href = "/css/site.css",
|
|
||||||
FallbackHrefInclude = "**/fallback.css",
|
|
||||||
FallbackTestClass = "hidden",
|
|
||||||
FallbackTestProperty = "visibility",
|
|
||||||
FallbackTestValue = "hidden",
|
|
||||||
GlobbingUrlBuilder = globbingUrlBuilder.Object,
|
|
||||||
ViewContext = viewContext,
|
|
||||||
};
|
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
helper.Process(context, output);
|
helper.Process(context, output);
|
||||||
|
|
@ -929,8 +815,6 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
||||||
{ "mixed", mixed },
|
{ "mixed", mixed },
|
||||||
{ "rel", new HtmlString("stylesheet") },
|
{ "rel", new HtmlString("stylesheet") },
|
||||||
});
|
});
|
||||||
var hostingEnvironment = MakeHostingEnvironment();
|
|
||||||
var viewContext = MakeViewContext();
|
|
||||||
var globbingUrlBuilder = new Mock<GlobbingUrlBuilder>(
|
var globbingUrlBuilder = new Mock<GlobbingUrlBuilder>(
|
||||||
new TestFileProvider(),
|
new TestFileProvider(),
|
||||||
Mock.Of<IMemoryCache>(),
|
Mock.Of<IMemoryCache>(),
|
||||||
|
|
@ -938,22 +822,15 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
||||||
globbingUrlBuilder.Setup(g => g.BuildUrlList(null, "**/fallback.css", null))
|
globbingUrlBuilder.Setup(g => g.BuildUrlList(null, "**/fallback.css", null))
|
||||||
.Returns(new[] { "/fallback.css" });
|
.Returns(new[] { "/fallback.css" });
|
||||||
|
|
||||||
var helper = new LinkTagHelper(
|
var helper = GetHelper();
|
||||||
MakeHostingEnvironment(),
|
|
||||||
new TagHelperMemoryCacheProvider(),
|
helper.AppendVersion = true;
|
||||||
new HtmlTestEncoder(),
|
helper.FallbackHrefInclude = "**/fallback.css";
|
||||||
new JavaScriptTestEncoder(),
|
helper.FallbackTestClass = "hidden";
|
||||||
MakeUrlHelperFactory())
|
helper.FallbackTestProperty = "visibility";
|
||||||
{
|
helper.FallbackTestValue = "hidden";
|
||||||
AppendVersion = true,
|
helper.GlobbingUrlBuilder = globbingUrlBuilder.Object;
|
||||||
FallbackHrefInclude = "**/fallback.css",
|
helper.Href = "/css/site.css";
|
||||||
FallbackTestClass = "hidden",
|
|
||||||
FallbackTestProperty = "visibility",
|
|
||||||
FallbackTestValue = "hidden",
|
|
||||||
GlobbingUrlBuilder = globbingUrlBuilder.Object,
|
|
||||||
Href = "/css/site.css",
|
|
||||||
ViewContext = viewContext,
|
|
||||||
};
|
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
helper.Process(context, output);
|
helper.Process(context, output);
|
||||||
|
|
@ -981,8 +858,6 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
||||||
{
|
{
|
||||||
{ "rel", new HtmlString("stylesheet") },
|
{ "rel", new HtmlString("stylesheet") },
|
||||||
});
|
});
|
||||||
var hostingEnvironment = MakeHostingEnvironment();
|
|
||||||
var viewContext = MakeViewContext();
|
|
||||||
var globbingUrlBuilder = new Mock<GlobbingUrlBuilder>(
|
var globbingUrlBuilder = new Mock<GlobbingUrlBuilder>(
|
||||||
new TestFileProvider(),
|
new TestFileProvider(),
|
||||||
Mock.Of<IMemoryCache>(),
|
Mock.Of<IMemoryCache>(),
|
||||||
|
|
@ -990,19 +865,12 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
||||||
globbingUrlBuilder.Setup(g => g.BuildUrlList(null, "**/*.css", null))
|
globbingUrlBuilder.Setup(g => g.BuildUrlList(null, "**/*.css", null))
|
||||||
.Returns(new[] { "/base.css" });
|
.Returns(new[] { "/base.css" });
|
||||||
|
|
||||||
var helper = new LinkTagHelper(
|
var helper = GetHelper();
|
||||||
hostingEnvironment,
|
|
||||||
new TagHelperMemoryCacheProvider(),
|
helper.GlobbingUrlBuilder = globbingUrlBuilder.Object;
|
||||||
new HtmlTestEncoder(),
|
helper.Href = "/css/site.css";
|
||||||
new JavaScriptTestEncoder(),
|
helper.HrefInclude = "**/*.css";
|
||||||
MakeUrlHelperFactory())
|
helper.AppendVersion = true;
|
||||||
{
|
|
||||||
GlobbingUrlBuilder = globbingUrlBuilder.Object,
|
|
||||||
ViewContext = viewContext,
|
|
||||||
Href = "/css/site.css",
|
|
||||||
HrefInclude = "**/*.css",
|
|
||||||
AppendVersion = true
|
|
||||||
};
|
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
helper.Process(context, output);
|
helper.Process(context, output);
|
||||||
|
|
@ -1016,12 +884,36 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
||||||
content);
|
content);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static LinkTagHelper GetHelper(
|
||||||
|
IHostingEnvironment hostingEnvironment = null,
|
||||||
|
IUrlHelperFactory urlHelperFactory = null,
|
||||||
|
ViewContext viewContext = null)
|
||||||
|
{
|
||||||
|
hostingEnvironment = hostingEnvironment ?? MakeHostingEnvironment();
|
||||||
|
urlHelperFactory = urlHelperFactory ?? MakeUrlHelperFactory();
|
||||||
|
viewContext = viewContext ?? MakeViewContext();
|
||||||
|
|
||||||
|
var memoryCacheProvider = new TagHelperMemoryCacheProvider();
|
||||||
|
var fileVersionProvider = new DefaultFileVersionProvider(hostingEnvironment, memoryCacheProvider);
|
||||||
|
|
||||||
|
return new LinkTagHelper(
|
||||||
|
hostingEnvironment,
|
||||||
|
memoryCacheProvider,
|
||||||
|
fileVersionProvider,
|
||||||
|
new HtmlTestEncoder(),
|
||||||
|
new JavaScriptTestEncoder(),
|
||||||
|
urlHelperFactory)
|
||||||
|
{
|
||||||
|
ViewContext = viewContext,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
private static ViewContext MakeViewContext(string requestPathBase = null)
|
private static ViewContext MakeViewContext(string requestPathBase = null)
|
||||||
{
|
{
|
||||||
var actionContext = new ActionContext(new DefaultHttpContext(), new RouteData(), new ActionDescriptor());
|
var actionContext = new ActionContext(new DefaultHttpContext(), new RouteData(), new ActionDescriptor());
|
||||||
if (requestPathBase != null)
|
if (requestPathBase != null)
|
||||||
{
|
{
|
||||||
actionContext.HttpContext.Request.PathBase = new Http.PathString(requestPathBase);
|
actionContext.HttpContext.Request.PathBase = new PathString(requestPathBase);
|
||||||
}
|
}
|
||||||
|
|
||||||
var metadataProvider = new EmptyModelMetadataProvider();
|
var metadataProvider = new EmptyModelMetadataProvider();
|
||||||
|
|
|
||||||
|
|
@ -56,8 +56,6 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
||||||
{ "src", srcOutput },
|
{ "src", srcOutput },
|
||||||
};
|
};
|
||||||
var output = MakeTagHelperOutput("script", outputAttributes);
|
var output = MakeTagHelperOutput("script", outputAttributes);
|
||||||
var hostingEnvironment = MakeHostingEnvironment();
|
|
||||||
var viewContext = MakeViewContext();
|
|
||||||
var urlHelper = new Mock<IUrlHelper>();
|
var urlHelper = new Mock<IUrlHelper>();
|
||||||
|
|
||||||
// Ensure expanded path does not look like an absolute path on Linux, avoiding
|
// Ensure expanded path does not look like an absolute path on Linux, avoiding
|
||||||
|
|
@ -70,17 +68,9 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
||||||
.Setup(f => f.GetUrlHelper(It.IsAny<ActionContext>()))
|
.Setup(f => f.GetUrlHelper(It.IsAny<ActionContext>()))
|
||||||
.Returns(urlHelper.Object);
|
.Returns(urlHelper.Object);
|
||||||
|
|
||||||
var helper = new ScriptTagHelper(
|
var helper = GetHelper(urlHelperFactory: urlHelperFactory.Object);
|
||||||
hostingEnvironment,
|
helper.AppendVersion = true;
|
||||||
new TagHelperMemoryCacheProvider(),
|
helper.Src = src;
|
||||||
new HtmlTestEncoder(),
|
|
||||||
new JavaScriptTestEncoder(),
|
|
||||||
urlHelperFactory.Object)
|
|
||||||
{
|
|
||||||
ViewContext = viewContext,
|
|
||||||
AppendVersion = true,
|
|
||||||
Src = src,
|
|
||||||
};
|
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
helper.Process(context, output);
|
helper.Process(context, output);
|
||||||
|
|
@ -107,7 +97,6 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
||||||
new TagHelperAttribute("asp-fallback-test", "isavailable()"),
|
new TagHelperAttribute("asp-fallback-test", "isavailable()"),
|
||||||
}));
|
}));
|
||||||
var tagHelperContext = MakeTagHelperContext(allAttributes);
|
var tagHelperContext = MakeTagHelperContext(allAttributes);
|
||||||
var viewContext = MakeViewContext();
|
|
||||||
var combinedOutputAttributes = new TagHelperAttributeList(
|
var combinedOutputAttributes = new TagHelperAttributeList(
|
||||||
outputAttributes.Concat(
|
outputAttributes.Concat(
|
||||||
new[]
|
new[]
|
||||||
|
|
@ -115,20 +104,12 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
||||||
new TagHelperAttribute("data-extra", new HtmlString("something"))
|
new TagHelperAttribute("data-extra", new HtmlString("something"))
|
||||||
}));
|
}));
|
||||||
var output = MakeTagHelperOutput("script", combinedOutputAttributes);
|
var output = MakeTagHelperOutput("script", combinedOutputAttributes);
|
||||||
var hostingEnvironment = MakeHostingEnvironment();
|
|
||||||
|
|
||||||
var helper = new ScriptTagHelper(
|
var helper = GetHelper();
|
||||||
hostingEnvironment,
|
helper.FallbackSrc = "~/blank.js";
|
||||||
new TagHelperMemoryCacheProvider(),
|
helper.FallbackTestExpression = "http://www.example.com/blank.js";
|
||||||
new HtmlTestEncoder(),
|
helper.Src = "/blank.js";
|
||||||
new JavaScriptTestEncoder(),
|
|
||||||
MakeUrlHelperFactory())
|
|
||||||
{
|
|
||||||
ViewContext = viewContext,
|
|
||||||
FallbackSrc = "~/blank.js",
|
|
||||||
FallbackTestExpression = "http://www.example.com/blank.js",
|
|
||||||
Src = "/blank.js",
|
|
||||||
};
|
|
||||||
var expectedAttributes = new TagHelperAttributeList(output.Attributes);
|
var expectedAttributes = new TagHelperAttributeList(output.Attributes);
|
||||||
expectedAttributes.Add(new TagHelperAttribute("src", "/blank.js"));
|
expectedAttributes.Add(new TagHelperAttribute("src", "/blank.js"));
|
||||||
|
|
||||||
|
|
@ -301,8 +282,6 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
||||||
// Arrange
|
// Arrange
|
||||||
var context = MakeTagHelperContext(attributes);
|
var context = MakeTagHelperContext(attributes);
|
||||||
var output = MakeTagHelperOutput("script");
|
var output = MakeTagHelperOutput("script");
|
||||||
var hostingEnvironment = MakeHostingEnvironment();
|
|
||||||
var viewContext = MakeViewContext();
|
|
||||||
var globbingUrlBuilder = new Mock<GlobbingUrlBuilder>(
|
var globbingUrlBuilder = new Mock<GlobbingUrlBuilder>(
|
||||||
new TestFileProvider(),
|
new TestFileProvider(),
|
||||||
Mock.Of<IMemoryCache>(),
|
Mock.Of<IMemoryCache>(),
|
||||||
|
|
@ -310,16 +289,8 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
||||||
globbingUrlBuilder.Setup(g => g.BuildUrlList(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>()))
|
globbingUrlBuilder.Setup(g => g.BuildUrlList(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>()))
|
||||||
.Returns(new[] { "/common.js" });
|
.Returns(new[] { "/common.js" });
|
||||||
|
|
||||||
var helper = new ScriptTagHelper(
|
var helper = GetHelper();
|
||||||
hostingEnvironment,
|
helper.GlobbingUrlBuilder = globbingUrlBuilder.Object;
|
||||||
new TagHelperMemoryCacheProvider(),
|
|
||||||
new HtmlTestEncoder(),
|
|
||||||
new JavaScriptTestEncoder(),
|
|
||||||
MakeUrlHelperFactory())
|
|
||||||
{
|
|
||||||
ViewContext = viewContext,
|
|
||||||
GlobbingUrlBuilder = globbingUrlBuilder.Object
|
|
||||||
};
|
|
||||||
setProperties(helper);
|
setProperties(helper);
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
|
|
@ -398,8 +369,6 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
||||||
// Arrange
|
// Arrange
|
||||||
var context = MakeTagHelperContext(attributes);
|
var context = MakeTagHelperContext(attributes);
|
||||||
var output = MakeTagHelperOutput("script");
|
var output = MakeTagHelperOutput("script");
|
||||||
var hostingEnvironment = MakeHostingEnvironment();
|
|
||||||
var viewContext = MakeViewContext();
|
|
||||||
var globbingUrlBuilder = new Mock<GlobbingUrlBuilder>(
|
var globbingUrlBuilder = new Mock<GlobbingUrlBuilder>(
|
||||||
new TestFileProvider(),
|
new TestFileProvider(),
|
||||||
Mock.Of<IMemoryCache>(),
|
Mock.Of<IMemoryCache>(),
|
||||||
|
|
@ -407,16 +376,8 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
||||||
globbingUrlBuilder.Setup(g => g.BuildUrlList(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>()))
|
globbingUrlBuilder.Setup(g => g.BuildUrlList(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>()))
|
||||||
.Returns(new[] { "/common.js" });
|
.Returns(new[] { "/common.js" });
|
||||||
|
|
||||||
var helper = new ScriptTagHelper(
|
var helper = GetHelper();
|
||||||
hostingEnvironment,
|
helper.GlobbingUrlBuilder = globbingUrlBuilder.Object;
|
||||||
new TagHelperMemoryCacheProvider(),
|
|
||||||
new HtmlTestEncoder(),
|
|
||||||
new JavaScriptTestEncoder(),
|
|
||||||
MakeUrlHelperFactory())
|
|
||||||
{
|
|
||||||
ViewContext = viewContext,
|
|
||||||
GlobbingUrlBuilder = globbingUrlBuilder.Object
|
|
||||||
};
|
|
||||||
setProperties(helper);
|
setProperties(helper);
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
|
|
@ -503,18 +464,8 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
||||||
var tagHelperContext = MakeTagHelperContext(attributes);
|
var tagHelperContext = MakeTagHelperContext(attributes);
|
||||||
var output = MakeTagHelperOutput("script");
|
var output = MakeTagHelperOutput("script");
|
||||||
var logger = new Mock<ILogger<ScriptTagHelper>>();
|
var logger = new Mock<ILogger<ScriptTagHelper>>();
|
||||||
var hostingEnvironment = MakeHostingEnvironment();
|
|
||||||
var viewContext = MakeViewContext();
|
|
||||||
|
|
||||||
var helper = new ScriptTagHelper(
|
var helper = GetHelper();
|
||||||
hostingEnvironment,
|
|
||||||
new TagHelperMemoryCacheProvider(),
|
|
||||||
new HtmlTestEncoder(),
|
|
||||||
new JavaScriptTestEncoder(),
|
|
||||||
MakeUrlHelperFactory())
|
|
||||||
{
|
|
||||||
ViewContext = viewContext,
|
|
||||||
};
|
|
||||||
setProperties(helper);
|
setProperties(helper);
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
|
|
@ -535,15 +486,7 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
||||||
var viewContext = MakeViewContext();
|
var viewContext = MakeViewContext();
|
||||||
var output = MakeTagHelperOutput("script");
|
var output = MakeTagHelperOutput("script");
|
||||||
|
|
||||||
var helper = new ScriptTagHelper(
|
var helper = GetHelper();
|
||||||
MakeHostingEnvironment(),
|
|
||||||
new TagHelperMemoryCacheProvider(),
|
|
||||||
new HtmlTestEncoder(),
|
|
||||||
new JavaScriptTestEncoder(),
|
|
||||||
MakeUrlHelperFactory())
|
|
||||||
{
|
|
||||||
ViewContext = viewContext,
|
|
||||||
};
|
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
helper.Process(tagHelperContext, output);
|
helper.Process(tagHelperContext, output);
|
||||||
|
|
@ -569,8 +512,6 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
||||||
new TagHelperAttribute("asp-fallback-test", "isavailable()"),
|
new TagHelperAttribute("asp-fallback-test", "isavailable()"),
|
||||||
});
|
});
|
||||||
|
|
||||||
var viewContext = MakeViewContext();
|
|
||||||
|
|
||||||
var output = MakeTagHelperOutput("src",
|
var output = MakeTagHelperOutput("src",
|
||||||
attributes: new TagHelperAttributeList
|
attributes: new TagHelperAttributeList
|
||||||
{
|
{
|
||||||
|
|
@ -578,20 +519,10 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
||||||
new TagHelperAttribute("data-more", "else"),
|
new TagHelperAttribute("data-more", "else"),
|
||||||
});
|
});
|
||||||
|
|
||||||
var hostingEnvironment = MakeHostingEnvironment();
|
var helper = GetHelper();
|
||||||
|
helper.FallbackSrc = "~/blank.js";
|
||||||
var helper = new ScriptTagHelper(
|
helper.FallbackTestExpression = "http://www.example.com/blank.js";
|
||||||
hostingEnvironment,
|
helper.Src = "/blank.js";
|
||||||
new TagHelperMemoryCacheProvider(),
|
|
||||||
new HtmlTestEncoder(),
|
|
||||||
new JavaScriptTestEncoder(),
|
|
||||||
MakeUrlHelperFactory())
|
|
||||||
{
|
|
||||||
ViewContext = viewContext,
|
|
||||||
FallbackSrc = "~/blank.js",
|
|
||||||
FallbackTestExpression = "http://www.example.com/blank.js",
|
|
||||||
Src = "/blank.js",
|
|
||||||
};
|
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
helper.Process(tagHelperContext, output);
|
helper.Process(tagHelperContext, output);
|
||||||
|
|
@ -615,8 +546,6 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
||||||
new TagHelperAttribute("asp-src-include", "**/*.js")
|
new TagHelperAttribute("asp-src-include", "**/*.js")
|
||||||
});
|
});
|
||||||
var output = MakeTagHelperOutput("script", attributes: new TagHelperAttributeList());
|
var output = MakeTagHelperOutput("script", attributes: new TagHelperAttributeList());
|
||||||
var hostingEnvironment = MakeHostingEnvironment();
|
|
||||||
var viewContext = MakeViewContext();
|
|
||||||
var globbingUrlBuilder = new Mock<GlobbingUrlBuilder>(
|
var globbingUrlBuilder = new Mock<GlobbingUrlBuilder>(
|
||||||
new TestFileProvider(),
|
new TestFileProvider(),
|
||||||
Mock.Of<IMemoryCache>(),
|
Mock.Of<IMemoryCache>(),
|
||||||
|
|
@ -624,18 +553,10 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
||||||
globbingUrlBuilder.Setup(g => g.BuildUrlList(null, "**/*.js", null))
|
globbingUrlBuilder.Setup(g => g.BuildUrlList(null, "**/*.js", null))
|
||||||
.Returns(new[] { "/common.js" });
|
.Returns(new[] { "/common.js" });
|
||||||
|
|
||||||
var helper = new ScriptTagHelper(
|
var helper = GetHelper();
|
||||||
hostingEnvironment,
|
helper.GlobbingUrlBuilder = globbingUrlBuilder.Object;
|
||||||
new TagHelperMemoryCacheProvider(),
|
helper.Src = "/js/site.js";
|
||||||
new HtmlTestEncoder(),
|
helper.SrcInclude = "**/*.js";
|
||||||
new JavaScriptTestEncoder(),
|
|
||||||
MakeUrlHelperFactory())
|
|
||||||
{
|
|
||||||
GlobbingUrlBuilder = globbingUrlBuilder.Object,
|
|
||||||
ViewContext = viewContext,
|
|
||||||
Src = "/js/site.js",
|
|
||||||
SrcInclude = "**/*.js",
|
|
||||||
};
|
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
helper.Process(context, output);
|
helper.Process(context, output);
|
||||||
|
|
@ -678,8 +599,6 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
||||||
{ "literal", "all HTML encoded"},
|
{ "literal", "all HTML encoded"},
|
||||||
{ new TagHelperAttribute("mixed", mixed, HtmlAttributeValueStyle.SingleQuotes) },
|
{ new TagHelperAttribute("mixed", mixed, HtmlAttributeValueStyle.SingleQuotes) },
|
||||||
});
|
});
|
||||||
var hostingEnvironment = MakeHostingEnvironment();
|
|
||||||
var viewContext = MakeViewContext();
|
|
||||||
var globbingUrlBuilder = new Mock<GlobbingUrlBuilder>(
|
var globbingUrlBuilder = new Mock<GlobbingUrlBuilder>(
|
||||||
new TestFileProvider(),
|
new TestFileProvider(),
|
||||||
Mock.Of<IMemoryCache>(),
|
Mock.Of<IMemoryCache>(),
|
||||||
|
|
@ -687,18 +606,10 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
||||||
globbingUrlBuilder.Setup(g => g.BuildUrlList(null, "**/*.js", null))
|
globbingUrlBuilder.Setup(g => g.BuildUrlList(null, "**/*.js", null))
|
||||||
.Returns(new[] { "/common.js" });
|
.Returns(new[] { "/common.js" });
|
||||||
|
|
||||||
var helper = new ScriptTagHelper(
|
var helper = GetHelper();
|
||||||
hostingEnvironment,
|
helper.GlobbingUrlBuilder = globbingUrlBuilder.Object;
|
||||||
new TagHelperMemoryCacheProvider(),
|
helper.Src = "/js/site.js";
|
||||||
new HtmlTestEncoder(),
|
helper.SrcInclude = "**/*.js";
|
||||||
new JavaScriptTestEncoder(),
|
|
||||||
MakeUrlHelperFactory())
|
|
||||||
{
|
|
||||||
GlobbingUrlBuilder = globbingUrlBuilder.Object,
|
|
||||||
Src = "/js/site.js",
|
|
||||||
SrcInclude = "**/*.js",
|
|
||||||
ViewContext = viewContext,
|
|
||||||
};
|
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
helper.Process(context, output);
|
helper.Process(context, output);
|
||||||
|
|
@ -722,20 +633,9 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
||||||
});
|
});
|
||||||
var output = MakeTagHelperOutput("script", attributes: new TagHelperAttributeList());
|
var output = MakeTagHelperOutput("script", attributes: new TagHelperAttributeList());
|
||||||
|
|
||||||
var hostingEnvironment = MakeHostingEnvironment();
|
var helper = GetHelper();
|
||||||
var viewContext = MakeViewContext();
|
helper.Src = "/js/site.js";
|
||||||
|
helper.AppendVersion = true;
|
||||||
var helper = new ScriptTagHelper(
|
|
||||||
MakeHostingEnvironment(),
|
|
||||||
new TagHelperMemoryCacheProvider(),
|
|
||||||
new HtmlTestEncoder(),
|
|
||||||
new JavaScriptTestEncoder(),
|
|
||||||
MakeUrlHelperFactory())
|
|
||||||
{
|
|
||||||
ViewContext = viewContext,
|
|
||||||
AppendVersion = true,
|
|
||||||
Src = "/js/site.js",
|
|
||||||
};
|
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
helper.Process(context, output);
|
helper.Process(context, output);
|
||||||
|
|
@ -756,20 +656,11 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
||||||
new TagHelperAttribute("asp-append-version", "true")
|
new TagHelperAttribute("asp-append-version", "true")
|
||||||
});
|
});
|
||||||
var output = MakeTagHelperOutput("script", attributes: new TagHelperAttributeList());
|
var output = MakeTagHelperOutput("script", attributes: new TagHelperAttributeList());
|
||||||
var hostingEnvironment = MakeHostingEnvironment();
|
|
||||||
var viewContext = MakeViewContext("/bar");
|
var viewContext = MakeViewContext("/bar");
|
||||||
|
|
||||||
var helper = new ScriptTagHelper(
|
var helper = GetHelper(viewContext: viewContext);
|
||||||
MakeHostingEnvironment(),
|
helper.Src = "/bar/js/site.js";
|
||||||
new TagHelperMemoryCacheProvider(),
|
helper.AppendVersion = true;
|
||||||
new HtmlTestEncoder(),
|
|
||||||
new JavaScriptTestEncoder(),
|
|
||||||
MakeUrlHelperFactory())
|
|
||||||
{
|
|
||||||
ViewContext = viewContext,
|
|
||||||
AppendVersion = true,
|
|
||||||
Src = "/bar/js/site.js",
|
|
||||||
};
|
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
helper.Process(context, output);
|
helper.Process(context, output);
|
||||||
|
|
@ -792,22 +683,12 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
||||||
new TagHelperAttribute("asp-append-version", "true")
|
new TagHelperAttribute("asp-append-version", "true")
|
||||||
});
|
});
|
||||||
var output = MakeTagHelperOutput("script", attributes: new TagHelperAttributeList());
|
var output = MakeTagHelperOutput("script", attributes: new TagHelperAttributeList());
|
||||||
var hostingEnvironment = MakeHostingEnvironment();
|
|
||||||
var viewContext = MakeViewContext();
|
|
||||||
|
|
||||||
var helper = new ScriptTagHelper(
|
var helper = GetHelper();
|
||||||
MakeHostingEnvironment(),
|
helper.FallbackSrc = "fallback.js";
|
||||||
new TagHelperMemoryCacheProvider(),
|
helper.FallbackTestExpression = "isavailable()";
|
||||||
new HtmlTestEncoder(),
|
helper.AppendVersion = true;
|
||||||
new JavaScriptTestEncoder(),
|
helper.Src = "/js/site.js";
|
||||||
MakeUrlHelperFactory())
|
|
||||||
{
|
|
||||||
ViewContext = viewContext,
|
|
||||||
FallbackSrc = "fallback.js",
|
|
||||||
FallbackTestExpression = "isavailable()",
|
|
||||||
AppendVersion = true,
|
|
||||||
Src = "/js/site.js",
|
|
||||||
};
|
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
helper.Process(context, output);
|
helper.Process(context, output);
|
||||||
|
|
@ -855,22 +736,12 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
||||||
{ "literal", "all HTML encoded" },
|
{ "literal", "all HTML encoded" },
|
||||||
{ new TagHelperAttribute("mixed", mixed, HtmlAttributeValueStyle.SingleQuotes) },
|
{ new TagHelperAttribute("mixed", mixed, HtmlAttributeValueStyle.SingleQuotes) },
|
||||||
});
|
});
|
||||||
var hostingEnvironment = MakeHostingEnvironment();
|
|
||||||
var viewContext = MakeViewContext();
|
|
||||||
|
|
||||||
var helper = new ScriptTagHelper(
|
var helper = GetHelper();
|
||||||
MakeHostingEnvironment(),
|
helper.AppendVersion = true;
|
||||||
new TagHelperMemoryCacheProvider(),
|
helper.FallbackSrc = "fallback.js";
|
||||||
new HtmlTestEncoder(),
|
helper.FallbackTestExpression = "isavailable()";
|
||||||
new JavaScriptTestEncoder(),
|
helper.Src = "/js/site.js";
|
||||||
MakeUrlHelperFactory())
|
|
||||||
{
|
|
||||||
AppendVersion = true,
|
|
||||||
FallbackSrc = "fallback.js",
|
|
||||||
FallbackTestExpression = "isavailable()",
|
|
||||||
Src = "/js/site.js",
|
|
||||||
ViewContext = viewContext,
|
|
||||||
};
|
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
helper.Process(context, output);
|
helper.Process(context, output);
|
||||||
|
|
@ -897,8 +768,6 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
||||||
new TagHelperAttribute("asp-append-version", "true")
|
new TagHelperAttribute("asp-append-version", "true")
|
||||||
});
|
});
|
||||||
var output = MakeTagHelperOutput("script", attributes: new TagHelperAttributeList());
|
var output = MakeTagHelperOutput("script", attributes: new TagHelperAttributeList());
|
||||||
var hostingEnvironment = MakeHostingEnvironment();
|
|
||||||
var viewContext = MakeViewContext();
|
|
||||||
var globbingUrlBuilder = new Mock<GlobbingUrlBuilder>(
|
var globbingUrlBuilder = new Mock<GlobbingUrlBuilder>(
|
||||||
new TestFileProvider(),
|
new TestFileProvider(),
|
||||||
Mock.Of<IMemoryCache>(),
|
Mock.Of<IMemoryCache>(),
|
||||||
|
|
@ -906,19 +775,11 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
||||||
globbingUrlBuilder.Setup(g => g.BuildUrlList(null, "*.js", null))
|
globbingUrlBuilder.Setup(g => g.BuildUrlList(null, "*.js", null))
|
||||||
.Returns(new[] { "/common.js" });
|
.Returns(new[] { "/common.js" });
|
||||||
|
|
||||||
var helper = new ScriptTagHelper(
|
var helper = GetHelper();
|
||||||
MakeHostingEnvironment(),
|
helper.GlobbingUrlBuilder = globbingUrlBuilder.Object;
|
||||||
new TagHelperMemoryCacheProvider(),
|
helper.SrcInclude = "*.js";
|
||||||
new HtmlTestEncoder(),
|
helper.AppendVersion = true;
|
||||||
new JavaScriptTestEncoder(),
|
helper.Src = "/js/site.js";
|
||||||
MakeUrlHelperFactory())
|
|
||||||
{
|
|
||||||
GlobbingUrlBuilder = globbingUrlBuilder.Object,
|
|
||||||
ViewContext = viewContext,
|
|
||||||
SrcInclude = "*.js",
|
|
||||||
AppendVersion = true,
|
|
||||||
Src = "/js/site.js",
|
|
||||||
};
|
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
helper.Process(context, output);
|
helper.Process(context, output);
|
||||||
|
|
@ -930,6 +791,30 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
||||||
Assert.Equal(expectedContent, content);
|
Assert.Equal(expectedContent, content);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static ScriptTagHelper GetHelper(
|
||||||
|
IHostingEnvironment hostingEnvironment = null,
|
||||||
|
IUrlHelperFactory urlHelperFactory = null,
|
||||||
|
ViewContext viewContext = null)
|
||||||
|
{
|
||||||
|
hostingEnvironment = hostingEnvironment ?? MakeHostingEnvironment();
|
||||||
|
urlHelperFactory = urlHelperFactory ?? MakeUrlHelperFactory();
|
||||||
|
viewContext = viewContext ?? MakeViewContext();
|
||||||
|
|
||||||
|
var memoryCacheProvider = new TagHelperMemoryCacheProvider();
|
||||||
|
var fileVersionProvider = new DefaultFileVersionProvider(hostingEnvironment, memoryCacheProvider);
|
||||||
|
|
||||||
|
return new ScriptTagHelper(
|
||||||
|
hostingEnvironment,
|
||||||
|
memoryCacheProvider,
|
||||||
|
fileVersionProvider,
|
||||||
|
new HtmlTestEncoder(),
|
||||||
|
new JavaScriptTestEncoder(),
|
||||||
|
urlHelperFactory)
|
||||||
|
{
|
||||||
|
ViewContext = viewContext,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
private TagHelperContext MakeTagHelperContext(
|
private TagHelperContext MakeTagHelperContext(
|
||||||
TagHelperAttributeList attributes = null,
|
TagHelperAttributeList attributes = null,
|
||||||
string content = null)
|
string content = null)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue