diff --git a/.editorconfig b/.editorconfig
index 5a35b71ce6..29ad74b4d6 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -25,16 +25,22 @@ dotnet_naming_rule.private_members_with_underscore.severity = suggestion
dotnet_naming_symbols.private_fields.applicable_kinds = field
dotnet_naming_symbols.private_fields.applicable_accessibilities = private
+# dotnet_naming_symbols.private_fields.required_modifiers = abstract,async,readonly,static # all except const
dotnet_naming_style.prefix_underscore.capitalization = camel_case
dotnet_naming_style.prefix_underscore.required_prefix = _
+
+
+
+
+
# https://github.com/MicrosoftDocs/visualstudio-docs/blob/master/docs/ide/editorconfig-code-style-settings-reference.md
[*.cs]
csharp_style_var_for_built_in_types = true:suggestion
csharp_style_var_when_type_is_apparent = true:suggestion
csharp_style_var_elsewhere = true:suggestion
-csharp_prefer_braces = false : none
+csharp_prefer_braces = false : none
-[*.{js,less}]
-trim_trailing_whitespace = false
+[*.{js,less}]
+trim_trailing_whitespace = false
diff --git a/src/Umbraco.Abstractions/Cache/DictionaryAppCache.cs b/src/Umbraco.Abstractions/Cache/DictionaryAppCache.cs
index fd360b303d..d372916240 100644
--- a/src/Umbraco.Abstractions/Cache/DictionaryAppCache.cs
+++ b/src/Umbraco.Abstractions/Cache/DictionaryAppCache.cs
@@ -1,4 +1,5 @@
using System;
+using System.Collections;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Text.RegularExpressions;
@@ -101,5 +102,9 @@ namespace Umbraco.Core.Cache
var compiled = new Regex(regex, RegexOptions.Compiled);
_items.RemoveAll(kvp => compiled.IsMatch(kvp.Key));
}
+
+ public IEnumerator> GetEnumerator() => _items.GetEnumerator();
+
+ IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}
}
diff --git a/src/Umbraco.Abstractions/Cache/HttpRequestAppCache.cs b/src/Umbraco.Abstractions/Cache/HttpRequestAppCache.cs
index 87d87ad1c9..e698d93ebe 100644
--- a/src/Umbraco.Abstractions/Cache/HttpRequestAppCache.cs
+++ b/src/Umbraco.Abstractions/Cache/HttpRequestAppCache.cs
@@ -171,5 +171,20 @@ namespace Umbraco.Core.Cache
}
#endregion
+
+ public IEnumerator> GetEnumerator()
+ {
+ if (!TryGetContextItems(out var items))
+ {
+ yield break;
+ }
+
+ foreach (DictionaryEntry item in items)
+ {
+ yield return new KeyValuePair(item.Key.ToString(), item.Value);
+ }
+ }
+
+ IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}
}
diff --git a/src/Umbraco.Abstractions/Cache/IRequestCache.cs b/src/Umbraco.Abstractions/Cache/IRequestCache.cs
index 5ed32b5ba0..7ed7f8251c 100644
--- a/src/Umbraco.Abstractions/Cache/IRequestCache.cs
+++ b/src/Umbraco.Abstractions/Cache/IRequestCache.cs
@@ -1,6 +1,8 @@
+using System.Collections.Generic;
+
namespace Umbraco.Core.Cache
{
- public interface IRequestCache : IAppCache
+ public interface IRequestCache : IAppCache, IEnumerable>
{
bool Set(string key, object value);
bool Remove(string key);
diff --git a/src/Umbraco.Abstractions/Cache/NoAppCache.cs b/src/Umbraco.Abstractions/Cache/NoAppCache.cs
index 5ca8f47059..60bc6fb8b8 100644
--- a/src/Umbraco.Abstractions/Cache/NoAppCache.cs
+++ b/src/Umbraco.Abstractions/Cache/NoAppCache.cs
@@ -1,4 +1,5 @@
using System;
+using System.Collections;
using System.Collections.Generic;
using System.Linq;
@@ -84,5 +85,9 @@ namespace Umbraco.Core.Cache
///
public virtual void ClearByRegex(string regex)
{ }
+
+ public IEnumerator> GetEnumerator() => new Dictionary().GetEnumerator();
+
+ IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}
}
diff --git a/src/Umbraco.Abstractions/CompositionExtensions.cs b/src/Umbraco.Abstractions/CompositionExtensions.cs
index 67f277734b..bea78f82ed 100644
--- a/src/Umbraco.Abstractions/CompositionExtensions.cs
+++ b/src/Umbraco.Abstractions/CompositionExtensions.cs
@@ -1,4 +1,5 @@
using Umbraco.Core.Composing;
+using Umbraco.Core.PropertyEditors;
using Umbraco.Web.Dashboards;
namespace Umbraco.Core
@@ -22,6 +23,15 @@ namespace Umbraco.Core
public static DashboardCollectionBuilder Dashboards(this Composition composition)
=> composition.WithCollectionBuilder();
+
+ ///
+ /// Gets the content finders collection builder.
+ ///
+ /// The composition.
+ ///
+ public static MediaUrlGeneratorCollectionBuilder MediaUrlGenerators(this Composition composition)
+ => composition.WithCollectionBuilder();
+
#endregion
}
}
diff --git a/src/Umbraco.Abstractions/Constants-Web.cs b/src/Umbraco.Abstractions/Constants-Web.cs
index 64216ba571..a1e138116d 100644
--- a/src/Umbraco.Abstractions/Constants-Web.cs
+++ b/src/Umbraco.Abstractions/Constants-Web.cs
@@ -19,6 +19,21 @@
public const string PreviewCookieName = "UMB_PREVIEW";
public const string InstallerCookieName = "umb_installId";
+
+ ///
+ /// The cookie name that is used to store the validation value
+ ///
+ public const string CsrfValidationCookieName = "UMB-XSRF-V";
+
+ ///
+ /// The cookie name that is set for angular to use to pass in to the header value for "X-UMB-XSRF-TOKEN"
+ ///
+ public const string AngularCookieName = "UMB-XSRF-TOKEN";
+
+ ///
+ /// The header name that angular uses to pass in the token to validate the cookie
+ ///
+ public const string AngularHeadername = "X-UMB-XSRF-TOKEN";
}
}
}
diff --git a/src/Umbraco.Abstractions/ContentApps/ContentAppFactoryCollection.cs b/src/Umbraco.Abstractions/ContentApps/ContentAppFactoryCollection.cs
index f8f57ce4fd..4e85e51af3 100644
--- a/src/Umbraco.Abstractions/ContentApps/ContentAppFactoryCollection.cs
+++ b/src/Umbraco.Abstractions/ContentApps/ContentAppFactoryCollection.cs
@@ -4,7 +4,6 @@ using Umbraco.Core;
using Umbraco.Core.Composing;
using Umbraco.Core.Models.ContentEditing;
using Umbraco.Core.Logging;
-using Umbraco.Core.Models.Identity;
using Umbraco.Core.Models.Membership;
namespace Umbraco.Web.ContentApps
@@ -12,18 +11,18 @@ namespace Umbraco.Web.ContentApps
public class ContentAppFactoryCollection : BuilderCollectionBase
{
private readonly ILogger _logger;
- private readonly ICurrentUserAccessor _currentUserAccessor;
+ private readonly IUmbracoContextAccessor _umbracoContextAccessor;
- public ContentAppFactoryCollection(IEnumerable items, ILogger logger, ICurrentUserAccessor currentUserAccessor)
+ public ContentAppFactoryCollection(IEnumerable items, ILogger logger, IUmbracoContextAccessor umbracoContextAccessor)
: base(items)
{
_logger = logger;
- _currentUserAccessor = currentUserAccessor;
+ _umbracoContextAccessor = umbracoContextAccessor;
}
private IEnumerable GetCurrentUserGroups()
{
- var currentUser = _currentUserAccessor.TryGetCurrentUser();
+ var currentUser = _umbracoContextAccessor.UmbracoContext?.Security?.CurrentUser;
return currentUser == null
? Enumerable.Empty()
: currentUser.Groups;
diff --git a/src/Umbraco.Abstractions/ContentApps/ContentAppFactoryCollectionBuilder.cs b/src/Umbraco.Abstractions/ContentApps/ContentAppFactoryCollectionBuilder.cs
index 0e21823b90..f3d3a149d5 100644
--- a/src/Umbraco.Abstractions/ContentApps/ContentAppFactoryCollectionBuilder.cs
+++ b/src/Umbraco.Abstractions/ContentApps/ContentAppFactoryCollectionBuilder.cs
@@ -19,8 +19,8 @@ namespace Umbraco.Web.ContentApps
{
// get the logger just-in-time - see note below for manifest parser
var logger = factory.GetInstance();
- var currentUserAccessor = factory.GetInstance();
- return new ContentAppFactoryCollection(CreateItems(factory), logger, currentUserAccessor);
+ var umbracoContextAccessor = factory.GetInstance();
+ return new ContentAppFactoryCollection(CreateItems(factory), logger, umbracoContextAccessor);
}
protected override IEnumerable CreateItems(IFactory factory)
diff --git a/src/Umbraco.Abstractions/Cookie/ICookieManager.cs b/src/Umbraco.Abstractions/Cookie/ICookieManager.cs
new file mode 100644
index 0000000000..4822d8ce74
--- /dev/null
+++ b/src/Umbraco.Abstractions/Cookie/ICookieManager.cs
@@ -0,0 +1,7 @@
+namespace Umbraco.Core.Cookie
+{
+ public interface ICookieManager
+ {
+ void ExpireCookie(string angularCookieName);
+ }
+}
diff --git a/src/Umbraco.Web/HybridAccessorBase.cs b/src/Umbraco.Abstractions/HybridAccessorBase.cs
similarity index 71%
rename from src/Umbraco.Web/HybridAccessorBase.cs
rename to src/Umbraco.Abstractions/HybridAccessorBase.cs
index ec18b6f3d4..ad33fbf067 100644
--- a/src/Umbraco.Web/HybridAccessorBase.cs
+++ b/src/Umbraco.Abstractions/HybridAccessorBase.cs
@@ -1,6 +1,7 @@
using System;
-using System.Runtime.Remoting.Messaging;
using Umbraco.Core;
+using Umbraco.Core.Cache;
+using Umbraco.Core.Scoping;
namespace Umbraco.Web
{
@@ -16,13 +17,13 @@ namespace Umbraco.Web
public abstract class HybridAccessorBase
where T : class
{
+ private readonly IRequestCache _requestCache;
+
// ReSharper disable StaticMemberInGenericType
private static readonly object Locker = new object();
private static bool _registered;
// ReSharper restore StaticMemberInGenericType
- private readonly IHttpContextAccessor _httpContextAccessor;
-
protected abstract string ItemKey { get; }
// read
@@ -42,17 +43,16 @@ namespace Umbraco.Web
// yes! flows with async!
private T NonContextValue
{
- get => (T) CallContext.LogicalGetData(ItemKey);
+ get => CallContext.GetData(ItemKey);
set
{
- if (value == null) CallContext.FreeNamedDataSlot(ItemKey);
- else CallContext.LogicalSetData(ItemKey, value);
+ CallContext.SetData(ItemKey, value);
}
}
- protected HybridAccessorBase(IHttpContextAccessor httpContextAccessor)
+ protected HybridAccessorBase(IRequestCache requestCache)
{
- _httpContextAccessor = httpContextAccessor ?? throw new ArgumentNullException(nameof(httpContextAccessor));
+ _requestCache = requestCache ?? throw new ArgumentNullException(nameof(requestCache));
lock (Locker)
{
@@ -65,15 +65,14 @@ namespace Umbraco.Web
var itemKey = ItemKey; // virtual
SafeCallContext.Register(() =>
{
- var value = CallContext.LogicalGetData(itemKey);
- CallContext.FreeNamedDataSlot(itemKey);
+ var value = CallContext.GetData(itemKey);
return value;
}, o =>
{
if (o == null) return;
var value = o as T;
if (value == null) throw new ArgumentException($"Expected type {typeof(T).FullName}, got {o.GetType().FullName}", nameof(o));
- CallContext.LogicalSetData(itemKey, value);
+ CallContext.SetData(itemKey, value);
});
}
@@ -81,20 +80,23 @@ namespace Umbraco.Web
{
get
{
- var httpContext = _httpContextAccessor.HttpContext;
- if (httpContext == null) return NonContextValue;
- return (T) httpContext.Items[ItemKey];
+ if (!_requestCache.IsAvailable)
+ {
+ return NonContextValue;
+ }
+ return (T) _requestCache.Get(ItemKey);
}
set
{
- var httpContext = _httpContextAccessor.HttpContext;
- if (httpContext == null)
+ if (!_requestCache.IsAvailable)
+ {
NonContextValue = value;
+ }
else if (value == null)
- httpContext.Items.Remove(ItemKey);
+ _requestCache.Remove(ItemKey);
else
- httpContext.Items[ItemKey] = value;
+ _requestCache.Set(ItemKey, value);
}
}
}
diff --git a/src/Umbraco.Web/HybridEventMessagesAccessor.cs b/src/Umbraco.Abstractions/HybridEventMessagesAccessor.cs
similarity index 70%
rename from src/Umbraco.Web/HybridEventMessagesAccessor.cs
rename to src/Umbraco.Abstractions/HybridEventMessagesAccessor.cs
index fddde403d8..b2700eb137 100644
--- a/src/Umbraco.Web/HybridEventMessagesAccessor.cs
+++ b/src/Umbraco.Abstractions/HybridEventMessagesAccessor.cs
@@ -1,4 +1,5 @@
-using Umbraco.Core.Events;
+using Umbraco.Core.Cache;
+using Umbraco.Core.Events;
namespace Umbraco.Web
{
@@ -6,8 +7,8 @@ namespace Umbraco.Web
{
protected override string ItemKey => "Umbraco.Core.Events.HybridEventMessagesAccessor";
- public HybridEventMessagesAccessor(IHttpContextAccessor httpContextAccessor)
- : base(httpContextAccessor)
+ public HybridEventMessagesAccessor(IRequestCache requestCache)
+ : base(requestCache)
{ }
public EventMessages EventMessages
diff --git a/src/Umbraco.Abstractions/IUmbracoContext.cs b/src/Umbraco.Abstractions/IUmbracoContext.cs
index b38a031f88..66b3dc3965 100644
--- a/src/Umbraco.Abstractions/IUmbracoContext.cs
+++ b/src/Umbraco.Abstractions/IUmbracoContext.cs
@@ -1,5 +1,4 @@
using System;
-using System.Web;
using Umbraco.Core.Models.PublishedContent;
using Umbraco.Web.PublishedCache;
using Umbraco.Web.Routing;
@@ -16,11 +15,6 @@ namespace Umbraco.Web
///
DateTime ObjectCreated { get; }
- ///
- /// This is used internally for debugging and also used to define anything required to distinguish this request from another.
- ///
- Guid UmbracoRequestId { get; }
-
///
/// Gets the WebSecurity class
///
@@ -62,11 +56,6 @@ namespace Umbraco.Web
///
bool IsFrontEndUmbracoRequest { get; }
- ///
- /// Gets the url provider.
- ///
- IPublishedUrlProvider UrlProvider { get; }
-
///
/// Gets/sets the PublishedRequest object
///
@@ -88,40 +77,6 @@ namespace Umbraco.Web
///
bool InPreviewMode { get; }
- ///
- /// Gets the url of a content identified by its identifier.
- ///
- /// The content identifier.
- ///
- /// The url for the content.
- string Url(int contentId, string culture = null);
-
- ///
- /// Gets the url of a content identified by its identifier.
- ///
- /// The content identifier.
- ///
- /// The url for the content.
- string Url(Guid contentId, string culture = null);
-
- ///
- /// Gets the url of a content identified by its identifier, in a specified mode.
- ///
- /// The content identifier.
- /// The mode.
- ///
- /// The url for the content.
- string Url(int contentId, UrlMode mode, string culture = null);
-
- ///
- /// Gets the url of a content identified by its identifier, in a specified mode.
- ///
- /// The content identifier.
- /// The mode.
- ///
- /// The url for the content.
- string Url(Guid contentId, UrlMode mode, string culture = null);
-
IDisposable ForcedPreview(bool preview);
void Dispose();
}
diff --git a/src/Umbraco.Abstractions/Models/ContentEditing/LinkDisplay.cs b/src/Umbraco.Abstractions/Models/ContentEditing/LinkDisplay.cs
index 650b7b8db5..5b6379288f 100644
--- a/src/Umbraco.Abstractions/Models/ContentEditing/LinkDisplay.cs
+++ b/src/Umbraco.Abstractions/Models/ContentEditing/LinkDisplay.cs
@@ -4,7 +4,7 @@ using Umbraco.Core;
namespace Umbraco.Web.Models.ContentEditing
{
[DataContract(Name = "link", Namespace = "")]
- internal class LinkDisplay
+ public class LinkDisplay
{
[DataMember(Name = "icon")]
public string Icon { get; set; }
diff --git a/src/Umbraco.Abstractions/Models/IDataEditorWithMediaPath.cs b/src/Umbraco.Abstractions/Models/IDataEditorWithMediaPath.cs
deleted file mode 100644
index e8af1b0ac3..0000000000
--- a/src/Umbraco.Abstractions/Models/IDataEditorWithMediaPath.cs
+++ /dev/null
@@ -1,19 +0,0 @@
-namespace Umbraco.Core.PropertyEditors
-{
- ///
- /// Must be implemented by property editors that store media and return media paths
- ///
- ///
- /// Currently there are only 2x core editors that do this: upload and image cropper.
- /// It would be possible for developers to know implement their own media property editors whereas previously this was not possible.
- ///
- public interface IDataEditorWithMediaPath
- {
- ///
- /// Returns the media path for the value stored for a property
- ///
- ///
- ///
- string GetMediaPath(object value);
- }
-}
diff --git a/src/Umbraco.Abstractions/Models/IMediaUrlGenerator.cs b/src/Umbraco.Abstractions/Models/IMediaUrlGenerator.cs
new file mode 100644
index 0000000000..41e1be8d6c
--- /dev/null
+++ b/src/Umbraco.Abstractions/Models/IMediaUrlGenerator.cs
@@ -0,0 +1,18 @@
+namespace Umbraco.Core.PropertyEditors
+{
+ ///
+ /// Used to generate paths to media items for a specified property editor alias
+ ///
+ public interface IMediaUrlGenerator
+ {
+ ///
+ /// Tries to get a media path for a given property editor alias
+ ///
+ /// The property editor alias
+ /// The value of the property
+ ///
+ /// True if a media path was returned
+ ///
+ bool TryGetMediaPath(string alias, object value, out string mediaPath);
+ }
+}
diff --git a/src/Umbraco.Abstractions/Models/Identity/ICurrentUserAccessor.cs b/src/Umbraco.Abstractions/Models/Identity/ICurrentUserAccessor.cs
deleted file mode 100644
index 49b2c6d9f9..0000000000
--- a/src/Umbraco.Abstractions/Models/Identity/ICurrentUserAccessor.cs
+++ /dev/null
@@ -1,13 +0,0 @@
-using Umbraco.Core.Models.Membership;
-
-namespace Umbraco.Core.Models.Identity
-{
- public interface ICurrentUserAccessor
- {
- ///
- /// Returns the current user or null if no user is currently authenticated.
- ///
- /// The current user or null
- IUser TryGetCurrentUser();
- }
-}
diff --git a/src/Umbraco.Web/Models/PublishedContent/HttpContextVariationContextAccessor.cs b/src/Umbraco.Abstractions/Models/PublishedContent/HttpContextVariationContextAccessor.cs
similarity index 50%
rename from src/Umbraco.Web/Models/PublishedContent/HttpContextVariationContextAccessor.cs
rename to src/Umbraco.Abstractions/Models/PublishedContent/HttpContextVariationContextAccessor.cs
index 0007b346c5..09604281dc 100644
--- a/src/Umbraco.Web/Models/PublishedContent/HttpContextVariationContextAccessor.cs
+++ b/src/Umbraco.Abstractions/Models/PublishedContent/HttpContextVariationContextAccessor.cs
@@ -1,4 +1,5 @@
-using Umbraco.Core.Models.PublishedContent;
+using Umbraco.Core.Cache;
+using Umbraco.Core.Models.PublishedContent;
namespace Umbraco.Web.Models.PublishedContent
{
@@ -7,22 +8,22 @@ namespace Umbraco.Web.Models.PublishedContent
///
public class HttpContextVariationContextAccessor : IVariationContextAccessor
{
- public const string ContextKey = "Umbraco.Web.Models.PublishedContent.DefaultVariationContextAccessor";
- public readonly IHttpContextAccessor HttpContextAccessor;
+ private readonly IRequestCache _requestCache;
+ private const string ContextKey = "Umbraco.Web.Models.PublishedContent.DefaultVariationContextAccessor";
///
/// Initializes a new instance of the class.
///
- public HttpContextVariationContextAccessor(IHttpContextAccessor httpContextAccessor)
+ public HttpContextVariationContextAccessor(IRequestCache requestCache)
{
- HttpContextAccessor = httpContextAccessor;
+ _requestCache = requestCache;
}
///
public VariationContext VariationContext
{
- get => (VariationContext) HttpContextAccessor.HttpContext?.Items[ContextKey];
- set => HttpContextAccessor.HttpContext.Items[ContextKey] = value;
+ get => (VariationContext) _requestCache.Get(ContextKey);
+ set => _requestCache.Set(ContextKey, value);
}
}
}
diff --git a/src/Umbraco.Web/Models/PublishedContent/HybridVariationContextAccessor.cs b/src/Umbraco.Abstractions/Models/PublishedContent/HybridVariationContextAccessor.cs
similarity index 64%
rename from src/Umbraco.Web/Models/PublishedContent/HybridVariationContextAccessor.cs
rename to src/Umbraco.Abstractions/Models/PublishedContent/HybridVariationContextAccessor.cs
index cb002e11b0..6f97c1dc5c 100644
--- a/src/Umbraco.Web/Models/PublishedContent/HybridVariationContextAccessor.cs
+++ b/src/Umbraco.Abstractions/Models/PublishedContent/HybridVariationContextAccessor.cs
@@ -1,14 +1,15 @@
-using Umbraco.Core.Models.PublishedContent;
+using Umbraco.Core.Cache;
+using Umbraco.Core.Models.PublishedContent;
namespace Umbraco.Web.Models.PublishedContent
{
///
/// Implements a hybrid .
///
- internal class HybridVariationContextAccessor : HybridAccessorBase, IVariationContextAccessor
+ public class HybridVariationContextAccessor : HybridAccessorBase, IVariationContextAccessor
{
- public HybridVariationContextAccessor(IHttpContextAccessor httpContextAccessor)
- : base(httpContextAccessor)
+ public HybridVariationContextAccessor(IRequestCache requestCache)
+ : base(requestCache)
{ }
///
@@ -23,4 +24,4 @@ namespace Umbraco.Web.Models.PublishedContent
set => Value = value;
}
}
-}
\ No newline at end of file
+}
diff --git a/src/Umbraco.Web/Models/PublishedContent/PublishedValueFallback.cs b/src/Umbraco.Abstractions/Models/PublishedContent/PublishedValueFallback.cs
similarity index 97%
rename from src/Umbraco.Web/Models/PublishedContent/PublishedValueFallback.cs
rename to src/Umbraco.Abstractions/Models/PublishedContent/PublishedValueFallback.cs
index 7b467b6d15..7c207c23c0 100644
--- a/src/Umbraco.Web/Models/PublishedContent/PublishedValueFallback.cs
+++ b/src/Umbraco.Abstractions/Models/PublishedContent/PublishedValueFallback.cs
@@ -182,7 +182,7 @@ namespace Umbraco.Web.Models.PublishedContent
// if we found a content with the property having a value, return that property value
if (property != null && property.HasValue(culture, segment))
{
- value = property.Value(culture, segment);
+ value = property.Value(this, culture, segment);
return true;
}
@@ -216,7 +216,7 @@ namespace Umbraco.Web.Models.PublishedContent
if (property.HasValue(culture2, segment))
{
- value = property.Value(culture2, segment);
+ value = property.Value(this, culture2, segment);
return true;
}
@@ -250,7 +250,7 @@ namespace Umbraco.Web.Models.PublishedContent
if (content.HasValue(alias, culture2, segment))
{
- value = content.Value(alias, culture2, segment);
+ value = content.Value(this, alias, culture2, segment);
return true;
}
@@ -287,7 +287,7 @@ namespace Umbraco.Web.Models.PublishedContent
if (content.HasValue(alias, culture2, segment))
{
- value = content.Value(alias, culture2, segment);
+ value = content.Value(this, alias, culture2, segment);
return true;
}
diff --git a/src/Umbraco.Infrastructure/Models/PublishedContent/VariationContextAccessorExtensions.cs b/src/Umbraco.Abstractions/Models/PublishedContent/VariationContextAccessorExtensions.cs
similarity index 100%
rename from src/Umbraco.Infrastructure/Models/PublishedContent/VariationContextAccessorExtensions.cs
rename to src/Umbraco.Abstractions/Models/PublishedContent/VariationContextAccessorExtensions.cs
diff --git a/src/Umbraco.Abstractions/Models/Trees/ActionMenuItem.cs b/src/Umbraco.Abstractions/Models/Trees/ActionMenuItem.cs
index 9354417155..fe760fb94d 100644
--- a/src/Umbraco.Abstractions/Models/Trees/ActionMenuItem.cs
+++ b/src/Umbraco.Abstractions/Models/Trees/ActionMenuItem.cs
@@ -1,6 +1,4 @@
-using System;
-using System.Diagnostics.CodeAnalysis;
-using Umbraco.Core;
+using Umbraco.Core;
using Umbraco.Core.Services;
namespace Umbraco.Web.Models.Trees
diff --git a/src/Umbraco.Web/Models/Trees/CreateChildEntity.cs b/src/Umbraco.Abstractions/Models/Trees/CreateChildEntity.cs
similarity index 100%
rename from src/Umbraco.Web/Models/Trees/CreateChildEntity.cs
rename to src/Umbraco.Abstractions/Models/Trees/CreateChildEntity.cs
diff --git a/src/Umbraco.Web/Models/Trees/ExportMember.cs b/src/Umbraco.Abstractions/Models/Trees/ExportMember.cs
similarity index 100%
rename from src/Umbraco.Web/Models/Trees/ExportMember.cs
rename to src/Umbraco.Abstractions/Models/Trees/ExportMember.cs
diff --git a/src/Umbraco.Abstractions/PropertyEditors/MediaUrlGeneratorCollection.cs b/src/Umbraco.Abstractions/PropertyEditors/MediaUrlGeneratorCollection.cs
new file mode 100644
index 0000000000..0374ca5cd2
--- /dev/null
+++ b/src/Umbraco.Abstractions/PropertyEditors/MediaUrlGeneratorCollection.cs
@@ -0,0 +1,28 @@
+using System.Collections.Generic;
+using Umbraco.Core.Composing;
+
+namespace Umbraco.Core.PropertyEditors
+{
+ public class MediaUrlGeneratorCollection : BuilderCollectionBase
+ {
+ public MediaUrlGeneratorCollection(IEnumerable items) : base(items)
+ {
+ }
+
+ public bool TryGetMediaPath(string alias, object value, out string mediaPath)
+ {
+ foreach(var generator in this)
+ {
+ if (generator.TryGetMediaPath(alias, value, out var mp))
+ {
+ mediaPath = mp;
+ return true;
+ }
+ }
+ mediaPath = null;
+ return false;
+ }
+
+
+ }
+}
diff --git a/src/Umbraco.Abstractions/PropertyEditors/MediaUrlGeneratorCollectionBuilder.cs b/src/Umbraco.Abstractions/PropertyEditors/MediaUrlGeneratorCollectionBuilder.cs
new file mode 100644
index 0000000000..40a68fd4e3
--- /dev/null
+++ b/src/Umbraco.Abstractions/PropertyEditors/MediaUrlGeneratorCollectionBuilder.cs
@@ -0,0 +1,9 @@
+using Umbraco.Core.Composing;
+
+namespace Umbraco.Core.PropertyEditors
+{
+ public class MediaUrlGeneratorCollectionBuilder : LazyCollectionBuilderBase
+ {
+ protected override MediaUrlGeneratorCollectionBuilder This => this;
+ }
+}
diff --git a/src/Umbraco.Web/PublishedCache/UmbracoContextPublishedSnapshotAccessor.cs b/src/Umbraco.Abstractions/PublishedCache/UmbracoContextPublishedSnapshotAccessor.cs
similarity index 99%
rename from src/Umbraco.Web/PublishedCache/UmbracoContextPublishedSnapshotAccessor.cs
rename to src/Umbraco.Abstractions/PublishedCache/UmbracoContextPublishedSnapshotAccessor.cs
index 76936dd2cb..7e0ebc6f13 100644
--- a/src/Umbraco.Web/PublishedCache/UmbracoContextPublishedSnapshotAccessor.cs
+++ b/src/Umbraco.Abstractions/PublishedCache/UmbracoContextPublishedSnapshotAccessor.cs
@@ -1,5 +1,4 @@
using System;
-
namespace Umbraco.Web.PublishedCache
{
public class UmbracoContextPublishedSnapshotAccessor : IPublishedSnapshotAccessor
diff --git a/src/Umbraco.Abstractions/PublishedContentExtensions.cs b/src/Umbraco.Abstractions/PublishedContentExtensions.cs
index 2b02456cdd..84ee8c314b 100644
--- a/src/Umbraco.Abstractions/PublishedContentExtensions.cs
+++ b/src/Umbraco.Abstractions/PublishedContentExtensions.cs
@@ -5,6 +5,7 @@ using Umbraco.Composing;
using Umbraco.Core.Configuration.UmbracoSettings;
using Umbraco.Core.Models.PublishedContent;
using Umbraco.Core.Services;
+using Umbraco.Web;
using Umbraco.Web.PublishedCache;
using Umbraco.Web.Routing;
@@ -1087,6 +1088,8 @@ namespace Umbraco.Core
#endregion
+ #region Url
+
///
/// Gets the url of the content item.
///
@@ -1117,5 +1120,6 @@ namespace Umbraco.Core
}
}
+ #endregion
}
}
diff --git a/src/Umbraco.Abstractions/Routing/AliasUrlProvider.cs b/src/Umbraco.Abstractions/Routing/AliasUrlProvider.cs
index b9ae2a8db0..c9cc3d5156 100644
--- a/src/Umbraco.Abstractions/Routing/AliasUrlProvider.cs
+++ b/src/Umbraco.Abstractions/Routing/AliasUrlProvider.cs
@@ -16,16 +16,18 @@ namespace Umbraco.Web.Routing
private readonly IGlobalSettings _globalSettings;
private readonly IRequestHandlerSection _requestConfig;
private readonly ISiteDomainHelper _siteDomainHelper;
+ private readonly IUmbracoContextAccessor _umbracoContextAccessor;
private readonly UriUtility _uriUtility;
private readonly IPublishedValueFallback _publishedValueFallback;
- public AliasUrlProvider(IGlobalSettings globalSettings, IRequestHandlerSection requestConfig, ISiteDomainHelper siteDomainHelper, UriUtility uriUtility, IPublishedValueFallback publishedValueFallback)
+ public AliasUrlProvider(IGlobalSettings globalSettings, IRequestHandlerSection requestConfig, ISiteDomainHelper siteDomainHelper, UriUtility uriUtility, IPublishedValueFallback publishedValueFallback, IUmbracoContextAccessor umbracoContextAccessor)
{
_globalSettings = globalSettings;
_requestConfig = requestConfig;
_siteDomainHelper = siteDomainHelper;
_uriUtility = uriUtility;
_publishedValueFallback = publishedValueFallback;
+ _umbracoContextAccessor = umbracoContextAccessor;
}
// note - at the moment we seem to accept pretty much anything as an alias
@@ -35,7 +37,7 @@ namespace Umbraco.Web.Routing
#region GetUrl
///
- public UrlInfo GetUrl(IUmbracoContext umbracoContext, IPublishedContent content, UrlMode mode, string culture, Uri current)
+ public UrlInfo GetUrl(IPublishedContent content, UrlMode mode, string culture, Uri current)
{
return null; // we have nothing to say
}
@@ -55,8 +57,9 @@ namespace Umbraco.Web.Routing
/// Other urls are those that GetUrl would not return in the current context, but would be valid
/// urls for the node in other contexts (different domain for current request, umbracoUrlAlias...).
///
- public IEnumerable GetOtherUrls(IUmbracoContext umbracoContext, int id, Uri current)
+ public IEnumerable GetOtherUrls(int id, Uri current)
{
+ var umbracoContext = _umbracoContextAccessor.UmbracoContext;
var node = umbracoContext.Content.GetById(id);
if (node == null)
yield break;
diff --git a/src/Umbraco.Abstractions/Routing/ContentFinderByRedirectUrl.cs b/src/Umbraco.Abstractions/Routing/ContentFinderByRedirectUrl.cs
index dffecd021e..5b3e0a5d99 100644
--- a/src/Umbraco.Abstractions/Routing/ContentFinderByRedirectUrl.cs
+++ b/src/Umbraco.Abstractions/Routing/ContentFinderByRedirectUrl.cs
@@ -17,13 +17,13 @@ namespace Umbraco.Web.Routing
{
private readonly IRedirectUrlService _redirectUrlService;
private readonly ILogger _logger;
- private readonly IUmbracoContextAccessor _umbracoContextAccessor;
+ private readonly IPublishedUrlProvider _publishedUrlProvider;
- public ContentFinderByRedirectUrl(IRedirectUrlService redirectUrlService, ILogger logger, IUmbracoContextAccessor umbracoContextAccessor)
+ public ContentFinderByRedirectUrl(IRedirectUrlService redirectUrlService, ILogger logger, IPublishedUrlProvider publishedUrlProvider)
{
_redirectUrlService = redirectUrlService;
_logger = logger;
- _umbracoContextAccessor = umbracoContextAccessor;
+ _publishedUrlProvider = publishedUrlProvider;
}
///
@@ -47,7 +47,7 @@ namespace Umbraco.Web.Routing
}
var content = frequest.UmbracoContext.Content.GetById(redirectUrl.ContentId);
- var url = content == null ? "#" : content.Url(_umbracoContextAccessor.UmbracoContext.UrlProvider, redirectUrl.Culture);
+ var url = content == null ? "#" : content.Url(_publishedUrlProvider, redirectUrl.Culture);
if (url.StartsWith("#"))
{
_logger.Debug("Route {Route} matches content {ContentId} which has no url.", route, redirectUrl.ContentId);
diff --git a/src/Umbraco.Abstractions/Routing/DefaultMediaUrlProvider.cs b/src/Umbraco.Abstractions/Routing/DefaultMediaUrlProvider.cs
index a9f78978d8..3e6413ff90 100644
--- a/src/Umbraco.Abstractions/Routing/DefaultMediaUrlProvider.cs
+++ b/src/Umbraco.Abstractions/Routing/DefaultMediaUrlProvider.cs
@@ -1,5 +1,4 @@
using System;
-using Umbraco.Core.Composing;
using Umbraco.Core.Models.PublishedContent;
using Umbraco.Core.PropertyEditors;
@@ -10,17 +9,17 @@ namespace Umbraco.Web.Routing
///
public class DefaultMediaUrlProvider : IMediaUrlProvider
{
- private readonly PropertyEditorCollection _propertyEditors;
private readonly UriUtility _uriUtility;
+ private readonly MediaUrlGeneratorCollection _mediaPathGenerators;
- public DefaultMediaUrlProvider(PropertyEditorCollection propertyEditors, UriUtility uriUtility)
+ public DefaultMediaUrlProvider(MediaUrlGeneratorCollection mediaPathGenerators, UriUtility uriUtility)
{
- _propertyEditors = propertyEditors ?? throw new ArgumentNullException(nameof(propertyEditors));
+ _mediaPathGenerators = mediaPathGenerators ?? throw new ArgumentNullException(nameof(mediaPathGenerators));
_uriUtility = uriUtility;
}
///
- public virtual UrlInfo GetMediaUrl(IUmbracoContext umbracoContext, IPublishedContent content,
+ public virtual UrlInfo GetMediaUrl(IPublishedContent content,
string propertyAlias, UrlMode mode, string culture, Uri current)
{
var prop = content.GetProperty(propertyAlias);
@@ -33,25 +32,23 @@ namespace Umbraco.Web.Routing
}
var propType = prop.PropertyType;
- string path = null;
- if (_propertyEditors.TryGet(propType.EditorAlias, out var editor)
- && editor is IDataEditorWithMediaPath dataEditor)
+ if (_mediaPathGenerators.TryGetMediaPath(propType.EditorAlias, value, out var path))
{
- path = dataEditor.GetMediaPath(value);
+ var url = AssembleUrl(path, current, mode);
+ return UrlInfo.Url(url.ToString(), culture);
}
- var url = AssembleUrl(path, current, mode);
- return url == null ? null : UrlInfo.Url(url.ToString(), culture);
+ return null;
}
private Uri AssembleUrl(string path, Uri current, UrlMode mode)
{
- if (string.IsNullOrEmpty(path))
- return null;
+ if (string.IsNullOrWhiteSpace(path))
+ throw new ArgumentException($"{nameof(path)} cannot be null or whitespace", nameof(path));
// the stored path is absolute so we just return it as is
- if(Uri.IsWellFormedUriString(path, UriKind.Absolute))
+ if (Uri.IsWellFormedUriString(path, UriKind.Absolute))
return new Uri(path);
Uri uri;
diff --git a/src/Umbraco.Abstractions/Routing/DefaultUrlProvider.cs b/src/Umbraco.Abstractions/Routing/DefaultUrlProvider.cs
index 7ab73ab400..81102810e8 100644
--- a/src/Umbraco.Abstractions/Routing/DefaultUrlProvider.cs
+++ b/src/Umbraco.Abstractions/Routing/DefaultUrlProvider.cs
@@ -1,6 +1,5 @@
using System;
using System.Collections.Generic;
-using System.Linq;
using Umbraco.Core.Configuration;
using Umbraco.Core.Configuration.UmbracoSettings;
using Umbraco.Core.Logging;
@@ -17,24 +16,27 @@ namespace Umbraco.Web.Routing
private readonly ILogger _logger;
private readonly IGlobalSettings _globalSettings;
private readonly ISiteDomainHelper _siteDomainHelper;
+ private readonly IUmbracoContextAccessor _umbracoContextAccessor;
private readonly UriUtility _uriUtility;
- public DefaultUrlProvider(IRequestHandlerSection requestSettings, ILogger logger, IGlobalSettings globalSettings, ISiteDomainHelper siteDomainHelper, UriUtility uriUtility)
+ public DefaultUrlProvider(IRequestHandlerSection requestSettings, ILogger logger, IGlobalSettings globalSettings, ISiteDomainHelper siteDomainHelper, IUmbracoContextAccessor umbracoContextAccessor, UriUtility uriUtility)
{
_requestSettings = requestSettings;
_logger = logger;
_globalSettings = globalSettings;
_siteDomainHelper = siteDomainHelper;
_uriUtility = uriUtility;
+ _umbracoContextAccessor = umbracoContextAccessor;
}
#region GetUrl
///
- public virtual UrlInfo GetUrl(IUmbracoContext umbracoContext, IPublishedContent content, UrlMode mode, string culture, Uri current)
+ public virtual UrlInfo GetUrl(IPublishedContent content, UrlMode mode, string culture, Uri current)
{
if (!current.IsAbsoluteUri) throw new ArgumentException("Current url must be absolute.", nameof(current));
+ var umbracoContext = _umbracoContextAccessor.UmbracoContext;
// will not use cache if previewing
var route = umbracoContext.Content.GetRouteById(content.Id, culture);
@@ -70,7 +72,7 @@ namespace Umbraco.Web.Routing
///
/// Gets the other urls of a published content.
///
- /// The Umbraco context.
+ /// The Umbraco context.
/// The published content id.
/// The current absolute url.
/// The other urls for the published content.
@@ -78,8 +80,9 @@ namespace Umbraco.Web.Routing
/// Other urls are those that GetUrl would not return in the current context, but would be valid
/// urls for the node in other contexts (different domain for current request, umbracoUrlAlias...).
///
- public virtual IEnumerable GetOtherUrls(IUmbracoContext umbracoContext, int id, Uri current)
+ public virtual IEnumerable GetOtherUrls(int id, Uri current)
{
+ var umbracoContext = _umbracoContextAccessor.UmbracoContext;
var node = umbracoContext.Content.GetById(id);
if (node == null)
yield break;
diff --git a/src/Umbraco.Abstractions/Routing/IMediaUrlProvider.cs b/src/Umbraco.Abstractions/Routing/IMediaUrlProvider.cs
index 0c128057f1..1b966c6fdd 100644
--- a/src/Umbraco.Abstractions/Routing/IMediaUrlProvider.cs
+++ b/src/Umbraco.Abstractions/Routing/IMediaUrlProvider.cs
@@ -1,6 +1,7 @@
using System;
using Umbraco.Core.Models.PublishedContent;
+
namespace Umbraco.Web.Routing
{
///
@@ -11,7 +12,6 @@ namespace Umbraco.Web.Routing
///
/// Gets the url of a media item.
///
- /// The Umbraco context.
/// The published content.
/// The property alias to resolve the url from.
/// The url mode.
@@ -26,6 +26,6 @@ namespace Umbraco.Web.Routing
/// e.g. a cdn url provider will most likely always return an absolute url.
/// If the provider is unable to provide a url, it returns null.
///
- UrlInfo GetMediaUrl(IUmbracoContext umbracoContext, IPublishedContent content, string propertyAlias, UrlMode mode, string culture, Uri current);
+ UrlInfo GetMediaUrl(IPublishedContent content, string propertyAlias, UrlMode mode, string culture, Uri current);
}
}
diff --git a/src/Umbraco.Abstractions/Routing/IUrlProvider.cs b/src/Umbraco.Abstractions/Routing/IUrlProvider.cs
index 16c1a1c91c..ba1d48a113 100644
--- a/src/Umbraco.Abstractions/Routing/IUrlProvider.cs
+++ b/src/Umbraco.Abstractions/Routing/IUrlProvider.cs
@@ -12,7 +12,6 @@ namespace Umbraco.Web.Routing
///
/// Gets the url of a published content.
///
- /// The Umbraco context.
/// The published content.
/// The url mode.
/// A culture.
@@ -24,12 +23,11 @@ namespace Umbraco.Web.Routing
/// when no culture is specified, the current culture.
/// If the provider is unable to provide a url, it should return null.
///
- UrlInfo GetUrl(IUmbracoContext umbracoContext, IPublishedContent content, UrlMode mode, string culture, Uri current);
+ UrlInfo GetUrl(IPublishedContent content, UrlMode mode, string culture, Uri current);
///
/// Gets the other urls of a published content.
///
- /// The Umbraco context.
/// The published content id.
/// The current absolute url.
/// The other urls for the published content.
@@ -37,6 +35,6 @@ namespace Umbraco.Web.Routing
/// Other urls are those that GetUrl would not return in the current context, but would be valid
/// urls for the node in other contexts (different domain for current request, umbracoUrlAlias...).
///
- IEnumerable GetOtherUrls(IUmbracoContext umbracoContext, int id, Uri current);
+ IEnumerable GetOtherUrls(int id, Uri current);
}
}
diff --git a/src/Umbraco.Abstractions/Routing/UrlProvider.cs b/src/Umbraco.Abstractions/Routing/UrlProvider.cs
index 29f0fb39d4..80169e54e2 100644
--- a/src/Umbraco.Abstractions/Routing/UrlProvider.cs
+++ b/src/Umbraco.Abstractions/Routing/UrlProvider.cs
@@ -16,18 +16,19 @@ namespace Umbraco.Web.Routing
#region Ctor and configuration
///
- /// InitialiIUrlProviderzes a new instance of the class with an Umbraco context and a list of url providers.
+ /// Initializes a new instance of the class with an Umbraco context and a list of url providers.
///
- /// The Umbraco context.
+ /// The Umbraco context accessor.
/// Routing settings.
/// The list of url providers.
/// The list of media url providers.
/// The current variation accessor.
- public UrlProvider(IUmbracoContext umbracoContext, IWebRoutingSection routingSettings, IEnumerable urlProviders, IEnumerable mediaUrlProviders, IVariationContextAccessor variationContextAccessor)
+ ///
+ public UrlProvider(IUmbracoContextAccessor umbracoContextAccessor, IWebRoutingSection routingSettings, UrlProviderCollection urlProviders, MediaUrlProviderCollection mediaUrlProviders, IVariationContextAccessor variationContextAccessor)
{
if (routingSettings == null) throw new ArgumentNullException(nameof(routingSettings));
- _umbracoContext = umbracoContext ?? throw new ArgumentNullException(nameof(umbracoContext));
+ _umbracoContextAccessor = umbracoContextAccessor ?? throw new ArgumentNullException(nameof(umbracoContextAccessor));
_urlProviders = urlProviders;
_mediaUrlProviders = mediaUrlProviders;
_variationContextAccessor = variationContextAccessor ?? throw new ArgumentNullException(nameof(variationContextAccessor));
@@ -40,25 +41,8 @@ namespace Umbraco.Web.Routing
}
}
- ///
- /// Initializes a new instance of the class with an Umbraco context and a list of url providers.
- ///
- /// The Umbraco context.
- /// The list of url providers.
- /// The list of media url providers
- /// The current variation accessor.
- /// An optional provider mode.
- public UrlProvider(IUmbracoContext umbracoContext, IEnumerable urlProviders, IEnumerable mediaUrlProviders, IVariationContextAccessor variationContextAccessor, UrlMode mode = UrlMode.Auto)
- {
- _umbracoContext = umbracoContext ?? throw new ArgumentNullException(nameof(umbracoContext));
- _urlProviders = urlProviders;
- _mediaUrlProviders = mediaUrlProviders;
- _variationContextAccessor = variationContextAccessor;
- Mode = mode;
- }
-
- private readonly IUmbracoContext _umbracoContext;
+ private readonly IUmbracoContextAccessor _umbracoContextAccessor;
private readonly IEnumerable _urlProviders;
private readonly IEnumerable _mediaUrlProviders;
private readonly IVariationContextAccessor _variationContextAccessor;
@@ -72,9 +56,9 @@ namespace Umbraco.Web.Routing
#region GetUrl
- private IPublishedContent GetDocument(int id) => _umbracoContext.Content.GetById(id);
- private IPublishedContent GetDocument(Guid id) => _umbracoContext.Content.GetById(id);
- private IPublishedContent GetMedia(Guid id) => _umbracoContext.Media.GetById(id);
+ private IPublishedContent GetDocument(int id) => _umbracoContextAccessor.UmbracoContext.Content.GetById(id);
+ private IPublishedContent GetDocument(Guid id) => _umbracoContextAccessor.UmbracoContext.Content.GetById(id);
+ private IPublishedContent GetMedia(Guid id) => _umbracoContextAccessor.UmbracoContext.Media.GetById(id);
///
/// Gets the url of a published content.
@@ -130,9 +114,9 @@ namespace Umbraco.Web.Routing
}
if (current == null)
- current = _umbracoContext.CleanedUmbracoUrl;
+ current = _umbracoContextAccessor.UmbracoContext.CleanedUmbracoUrl;
- var url = _urlProviders.Select(provider => provider.GetUrl(_umbracoContext, content, mode, culture, current))
+ var url = _urlProviders.Select(provider => provider.GetUrl(content, mode, culture, current))
.FirstOrDefault(u => u != null);
return url?.Text ?? "#"; // legacy wants this
}
@@ -142,7 +126,7 @@ namespace Umbraco.Web.Routing
var provider = _urlProviders.OfType().FirstOrDefault();
var url = provider == null
? route // what else?
- : provider.GetUrlFromRoute(route, _umbracoContext, id, _umbracoContext.CleanedUmbracoUrl, Mode, culture)?.Text;
+ : provider.GetUrlFromRoute(route, _umbracoContextAccessor.UmbracoContext, id, _umbracoContextAccessor.UmbracoContext.CleanedUmbracoUrl, Mode, culture)?.Text;
return url ?? "#";
}
@@ -162,7 +146,7 @@ namespace Umbraco.Web.Routing
///
public IEnumerable GetOtherUrls(int id)
{
- return GetOtherUrls(id, _umbracoContext.CleanedUmbracoUrl);
+ return GetOtherUrls(id, _umbracoContextAccessor.UmbracoContext.CleanedUmbracoUrl);
}
///
@@ -177,7 +161,7 @@ namespace Umbraco.Web.Routing
///
public IEnumerable GetOtherUrls(int id, Uri current)
{
- return _urlProviders.SelectMany(provider => provider.GetOtherUrls(_umbracoContext, id, current) ?? Enumerable.Empty());
+ return _urlProviders.SelectMany(provider => provider.GetOtherUrls(id, current) ?? Enumerable.Empty());
}
#endregion
@@ -231,10 +215,10 @@ namespace Umbraco.Web.Routing
}
if (current == null)
- current = _umbracoContext.CleanedUmbracoUrl;
+ current = _umbracoContextAccessor.UmbracoContext.CleanedUmbracoUrl;
var url = _mediaUrlProviders.Select(provider =>
- provider.GetMediaUrl(_umbracoContext, content, propertyAlias, mode, culture, current))
+ provider.GetMediaUrl(content, propertyAlias, mode, culture, current))
.FirstOrDefault(u => u != null);
return url?.Text ?? "";
diff --git a/src/Umbraco.Abstractions/Routing/UrlProviderExtensions.cs b/src/Umbraco.Abstractions/Routing/UrlProviderExtensions.cs
index c3b71ac028..a7f8a97c6d 100644
--- a/src/Umbraco.Abstractions/Routing/UrlProviderExtensions.cs
+++ b/src/Umbraco.Abstractions/Routing/UrlProviderExtensions.cs
@@ -26,7 +26,8 @@ namespace Umbraco.Web.Routing
IContentService contentService,
IVariationContextAccessor variationContextAccessor,
ILogger logger,
- UriUtility uriUtility)
+ UriUtility uriUtility,
+ IPublishedUrlProvider publishedUrlProvider)
{
if (content == null) throw new ArgumentNullException(nameof(content));
if (publishedRouter == null) throw new ArgumentNullException(nameof(publishedRouter));
@@ -35,6 +36,7 @@ namespace Umbraco.Web.Routing
if (textService == null) throw new ArgumentNullException(nameof(textService));
if (contentService == null) throw new ArgumentNullException(nameof(contentService));
if (logger == null) throw new ArgumentNullException(nameof(logger));
+ if (publishedUrlProvider == null) throw new ArgumentNullException(nameof(publishedUrlProvider));
if (uriUtility == null) throw new ArgumentNullException(nameof(uriUtility));
if (variationContextAccessor == null) throw new ArgumentNullException(nameof(variationContextAccessor));
@@ -61,7 +63,7 @@ namespace Umbraco.Web.Routing
//get all URLs for all cultures
//in a HashSet, so de-duplicates too
- foreach (var cultureUrl in GetContentUrlsByCulture(content, cultures, publishedRouter, umbracoContext, contentService, textService, variationContextAccessor, logger, uriUtility))
+ foreach (var cultureUrl in GetContentUrlsByCulture(content, cultures, publishedRouter, umbracoContext, contentService, textService, variationContextAccessor, logger, uriUtility, publishedUrlProvider))
{
urls.Add(cultureUrl);
}
@@ -79,7 +81,7 @@ namespace Umbraco.Web.Routing
// get the 'other' urls - ie not what you'd get with GetUrl() but urls that would route to the document, nevertheless.
// for these 'other' urls, we don't check whether they are routable, collide, anything - we just report them.
- foreach (var otherUrl in umbracoContext.UrlProvider.GetOtherUrls(content.Id).OrderBy(x => x.Text).ThenBy(x => x.Culture))
+ foreach (var otherUrl in publishedUrlProvider.GetOtherUrls(content.Id).OrderBy(x => x.Text).ThenBy(x => x.Culture))
if (urls.Add(otherUrl)) //avoid duplicates
yield return otherUrl;
}
@@ -103,7 +105,8 @@ namespace Umbraco.Web.Routing
ILocalizedTextService textService,
IVariationContextAccessor variationContextAccessor,
ILogger logger,
- UriUtility uriUtility)
+ UriUtility uriUtility,
+ IPublishedUrlProvider publishedUrlProvider)
{
foreach (var culture in cultures)
{
@@ -116,7 +119,7 @@ namespace Umbraco.Web.Routing
string url;
try
{
- url = umbracoContext.UrlProvider.GetUrl(content.Id, culture: culture);
+ url = publishedUrlProvider.GetUrl(content.Id, culture: culture);
}
catch (Exception ex)
{
diff --git a/src/Umbraco.Infrastructure/Scoping/CallContext.cs b/src/Umbraco.Abstractions/Scoping/CallContext.cs
similarity index 100%
rename from src/Umbraco.Infrastructure/Scoping/CallContext.cs
rename to src/Umbraco.Abstractions/Scoping/CallContext.cs
diff --git a/src/Umbraco.Web/Templates/HtmlImageSourceParser.cs b/src/Umbraco.Abstractions/Templates/HtmlImageSourceParser.cs
similarity index 91%
rename from src/Umbraco.Web/Templates/HtmlImageSourceParser.cs
rename to src/Umbraco.Abstractions/Templates/HtmlImageSourceParser.cs
index 74333cf533..79d65e0829 100644
--- a/src/Umbraco.Web/Templates/HtmlImageSourceParser.cs
+++ b/src/Umbraco.Abstractions/Templates/HtmlImageSourceParser.cs
@@ -2,6 +2,7 @@
using System.Collections.Generic;
using System.Text.RegularExpressions;
using Umbraco.Core;
+using Umbraco.Web.Routing;
namespace Umbraco.Web.Templates
{
@@ -13,10 +14,11 @@ namespace Umbraco.Web.Templates
this._getMediaUrl = getMediaUrl;
}
- private readonly IUmbracoContextAccessor _umbracoContextAccessor;
- public HtmlImageSourceParser(IUmbracoContextAccessor umbracoContextAccessor)
+ private readonly IPublishedUrlProvider _publishedUrlProvider;
+
+ public HtmlImageSourceParser(IPublishedUrlProvider publishedUrlProvider)
{
- _umbracoContextAccessor = umbracoContextAccessor;
+ _publishedUrlProvider = publishedUrlProvider;
}
private static readonly Regex ResolveImgPattern = new Regex(@"(]*src="")([^""\?]*)((?:\?[^""]*)?""[^>]*data-udi="")([^""]*)(""[^>]*>)",
@@ -54,7 +56,7 @@ namespace Umbraco.Web.Templates
public string EnsureImageSources(string text)
{
if(_getMediaUrl == null)
- _getMediaUrl = (guid) => _umbracoContextAccessor.UmbracoContext.UrlProvider.GetMediaUrl(guid);
+ _getMediaUrl = (guid) => _publishedUrlProvider.GetMediaUrl(guid);
return ResolveImgPattern.Replace(text, match =>
{
diff --git a/src/Umbraco.Web/Templates/HtmlLocalLinkParser.cs b/src/Umbraco.Abstractions/Templates/HtmlLocalLinkParser.cs
similarity index 90%
rename from src/Umbraco.Web/Templates/HtmlLocalLinkParser.cs
rename to src/Umbraco.Abstractions/Templates/HtmlLocalLinkParser.cs
index ef89088a7a..3f62291ff1 100644
--- a/src/Umbraco.Web/Templates/HtmlLocalLinkParser.cs
+++ b/src/Umbraco.Abstractions/Templates/HtmlLocalLinkParser.cs
@@ -2,8 +2,6 @@
using System.Collections.Generic;
using System.Text.RegularExpressions;
using Umbraco.Core;
-using Umbraco.Core.Logging;
-using Umbraco.Web.PublishedCache;
using Umbraco.Web.Routing;
namespace Umbraco.Web.Templates
@@ -18,10 +16,12 @@ namespace Umbraco.Web.Templates
RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace);
private readonly IUmbracoContextAccessor _umbracoContextAccessor;
+ private readonly IPublishedUrlProvider _publishedUrlProvider;
- public HtmlLocalLinkParser(IUmbracoContextAccessor umbracoContextAccessor)
+ public HtmlLocalLinkParser(IUmbracoContextAccessor umbracoContextAccessor, IPublishedUrlProvider publishedUrlProvider)
{
_umbracoContextAccessor = umbracoContextAccessor;
+ _publishedUrlProvider = publishedUrlProvider;
}
internal IEnumerable FindUdisFromLocalLinks(string text)
@@ -64,7 +64,6 @@ namespace Umbraco.Web.Templates
if (_umbracoContextAccessor.UmbracoContext == null)
throw new InvalidOperationException("Could not parse internal links, there is no current UmbracoContext");
- var urlProvider = _umbracoContextAccessor.UmbracoContext.UrlProvider;
foreach((int? intId, GuidUdi udi, string tagValue) in FindLocalLinkIds(text))
{
@@ -72,9 +71,9 @@ namespace Umbraco.Web.Templates
{
var newLink = "#";
if (udi.EntityType == Constants.UdiEntityType.Document)
- newLink = urlProvider.GetUrl(udi.Guid);
+ newLink = _publishedUrlProvider.GetUrl(udi.Guid);
else if (udi.EntityType == Constants.UdiEntityType.Media)
- newLink = urlProvider.GetMediaUrl(udi.Guid);
+ newLink = _publishedUrlProvider.GetMediaUrl(udi.Guid);
if (newLink == null)
newLink = "#";
@@ -83,7 +82,7 @@ namespace Umbraco.Web.Templates
}
else if (intId.HasValue)
{
- var newLink = urlProvider.GetUrl(intId.Value);
+ var newLink = _publishedUrlProvider.GetUrl(intId.Value);
text = text.Replace(tagValue, "href=\"" + newLink);
}
}
diff --git a/src/Umbraco.Web/Templates/HtmlUrlParser.cs b/src/Umbraco.Abstractions/Templates/HtmlUrlParser.cs
similarity index 100%
rename from src/Umbraco.Web/Templates/HtmlUrlParser.cs
rename to src/Umbraco.Abstractions/Templates/HtmlUrlParser.cs
diff --git a/src/Umbraco.Abstractions/Umbraco.Abstractions.csproj b/src/Umbraco.Abstractions/Umbraco.Abstractions.csproj
index 2eff63c4b8..52322f979a 100644
--- a/src/Umbraco.Abstractions/Umbraco.Abstractions.csproj
+++ b/src/Umbraco.Abstractions/Umbraco.Abstractions.csproj
@@ -24,9 +24,4 @@
<_Parameter1>Umbraco.Tests.Benchmarks
-
-
-
-
-
diff --git a/src/Umbraco.Web/UmbracoContextReference.cs b/src/Umbraco.Abstractions/UmbracoContextReference.cs
similarity index 100%
rename from src/Umbraco.Web/UmbracoContextReference.cs
rename to src/Umbraco.Abstractions/UmbracoContextReference.cs
index 740f972bbf..bd021494e6 100644
--- a/src/Umbraco.Web/UmbracoContextReference.cs
+++ b/src/Umbraco.Abstractions/UmbracoContextReference.cs
@@ -22,9 +22,9 @@ namespace Umbraco.Web
///
internal UmbracoContextReference(IUmbracoContext umbracoContext, bool isRoot, IUmbracoContextAccessor umbracoContextAccessor)
{
- UmbracoContext = umbracoContext;
IsRoot = isRoot;
+ UmbracoContext = umbracoContext;
_umbracoContextAccessor = umbracoContextAccessor;
}
diff --git a/src/Umbraco.Examine.Lucene/BackOfficeExamineSearcher.cs b/src/Umbraco.Examine.Lucene/BackOfficeExamineSearcher.cs
index cfa9de5fa6..d73dc89948 100644
--- a/src/Umbraco.Examine.Lucene/BackOfficeExamineSearcher.cs
+++ b/src/Umbraco.Examine.Lucene/BackOfficeExamineSearcher.cs
@@ -9,6 +9,7 @@ using Umbraco.Core.Models;
using Umbraco.Core.Models.Identity;
using Umbraco.Core.Persistence;
using Umbraco.Core.Services;
+using Umbraco.Web;
using Umbraco.Web.Models.ContentEditing;
namespace Umbraco.Examine
@@ -17,19 +18,19 @@ namespace Umbraco.Examine
{
private readonly IExamineManager _examineManager;
private readonly ILocalizationService _languageService;
- private readonly ICurrentUserAccessor _currentUserAccessor;
+ private readonly IUmbracoContextAccessor _umbracoContextAccessor;
private readonly IEntityService _entityService;
private readonly IUmbracoTreeSearcherFields _treeSearcherFields;
public BackOfficeExamineSearcher(IExamineManager examineManager,
ILocalizationService languageService,
- ICurrentUserAccessor currentUserAccessor,
+ IUmbracoContextAccessor umbracoContextAccessor,
IEntityService entityService,
IUmbracoTreeSearcherFields treeSearcherFields)
{
_examineManager = examineManager;
_languageService = languageService;
- _currentUserAccessor = currentUserAccessor;
+ _umbracoContextAccessor = umbracoContextAccessor;
_entityService = entityService;
_treeSearcherFields = treeSearcherFields;
}
@@ -48,7 +49,7 @@ namespace Umbraco.Examine
query = "\"" + g.ToString() + "\"";
}
- var currentUser = _currentUserAccessor.TryGetCurrentUser();
+ var currentUser = _umbracoContextAccessor.UmbracoContext?.Security?.CurrentUser;
switch (entityType)
{
diff --git a/src/Umbraco.Web/Cache/DistributedCacheExtensions.cs b/src/Umbraco.Infrastructure/Cache/DistributedCacheExtensions.cs
similarity index 98%
rename from src/Umbraco.Web/Cache/DistributedCacheExtensions.cs
rename to src/Umbraco.Infrastructure/Cache/DistributedCacheExtensions.cs
index 1c3b6a1dcc..7cfac1b9a0 100644
--- a/src/Umbraco.Web/Cache/DistributedCacheExtensions.cs
+++ b/src/Umbraco.Infrastructure/Cache/DistributedCacheExtensions.cs
@@ -1,8 +1,5 @@
using System.Linq;
-using NPoco.Expressions;
-using Umbraco.Core.Cache;
using Umbraco.Core.Models;
-using Umbraco.Core.Serialization;
using Umbraco.Core.Services.Changes;
namespace Umbraco.Web.Cache
@@ -10,7 +7,7 @@ namespace Umbraco.Web.Cache
///
/// Extension methods for .
///
- internal static class DistributedCacheExtensions
+ public static class DistributedCacheExtensions
{
#region PublicAccessCache
diff --git a/src/Umbraco.Infrastructure/Compose/NotificationsComponent.cs b/src/Umbraco.Infrastructure/Compose/NotificationsComponent.cs
index 41fc097ff3..b39e5c03e9 100644
--- a/src/Umbraco.Infrastructure/Compose/NotificationsComponent.cs
+++ b/src/Umbraco.Infrastructure/Compose/NotificationsComponent.cs
@@ -148,13 +148,12 @@ namespace Umbraco.Web.Compose
///
public sealed class Notifier
{
- private readonly ICurrentUserAccessor _currentUserAccessor;
+ private readonly IUmbracoContextAccessor _umbracoContextAccessor;
private readonly IRuntimeState _runtimeState;
private readonly INotificationService _notificationService;
private readonly IUserService _userService;
private readonly ILocalizedTextService _textService;
private readonly IGlobalSettings _globalSettings;
- private readonly IContentSection _contentConfig;
private readonly ILogger _logger;
///
@@ -167,21 +166,20 @@ namespace Umbraco.Web.Compose
///
///
///
- public Notifier(ICurrentUserAccessor currentUserAccessor, IRuntimeState runtimeState, INotificationService notificationService, IUserService userService, ILocalizedTextService textService, IGlobalSettings globalSettings, IContentSection contentConfig, ILogger logger)
+ public Notifier(IUmbracoContextAccessor umbracoContextAccessor, IRuntimeState runtimeState, INotificationService notificationService, IUserService userService, ILocalizedTextService textService, IGlobalSettings globalSettings, ILogger logger)
{
- _currentUserAccessor = currentUserAccessor;
+ _umbracoContextAccessor = umbracoContextAccessor;
_runtimeState = runtimeState;
_notificationService = notificationService;
_userService = userService;
_textService = textService;
_globalSettings = globalSettings;
- _contentConfig = contentConfig;
_logger = logger;
}
public void Notify(IAction action, params IContent[] entities)
{
- var user = _currentUserAccessor.TryGetCurrentUser();
+ var user = _umbracoContextAccessor.UmbracoContext?.Security?.CurrentUser;
//if there is no current user, then use the admin
if (user == null)
diff --git a/src/Umbraco.Infrastructure/Migrations/PostMigrations/ClearCsrfCookies.cs b/src/Umbraco.Infrastructure/Migrations/PostMigrations/ClearCsrfCookies.cs
new file mode 100644
index 0000000000..ab9c946e05
--- /dev/null
+++ b/src/Umbraco.Infrastructure/Migrations/PostMigrations/ClearCsrfCookies.cs
@@ -0,0 +1,26 @@
+using Umbraco.Core;
+using Umbraco.Core.Cookie;
+using Umbraco.Core.Migrations;
+
+
+namespace Umbraco.Web.Migrations.PostMigrations
+{
+ ///
+ /// Clears Csrf tokens.
+ ///
+ public class ClearCsrfCookies : IMigration
+ {
+ private readonly ICookieManager _cookieManager;
+
+ public ClearCsrfCookies(ICookieManager cookieManager)
+ {
+ _cookieManager = cookieManager;
+ }
+
+ public void Migrate()
+ {
+ _cookieManager.ExpireCookie(Constants.Web.AngularCookieName);
+ _cookieManager.ExpireCookie(Constants.Web.CsrfValidationCookieName);
+ }
+ }
+}
diff --git a/src/Umbraco.Infrastructure/Migrations/PostMigrations/NoopPublishedSnapshotRebuilder.cs b/src/Umbraco.Infrastructure/Migrations/PostMigrations/NoopPublishedSnapshotRebuilder.cs
new file mode 100644
index 0000000000..cf53f161a4
--- /dev/null
+++ b/src/Umbraco.Infrastructure/Migrations/PostMigrations/NoopPublishedSnapshotRebuilder.cs
@@ -0,0 +1,12 @@
+namespace Umbraco.Core.Migrations.PostMigrations
+{
+ ///
+ /// Implements in Umbraco.Core (doing nothing).
+ ///
+ public class NoopPublishedSnapshotRebuilder : IPublishedSnapshotRebuilder
+ {
+ ///
+ public void Rebuild()
+ { }
+ }
+}
diff --git a/src/Umbraco.Infrastructure/Migrations/PostMigrations/PublishedSnapshotRebuilder.cs b/src/Umbraco.Infrastructure/Migrations/PostMigrations/PublishedSnapshotRebuilder.cs
index acc943b297..764e46af5d 100644
--- a/src/Umbraco.Infrastructure/Migrations/PostMigrations/PublishedSnapshotRebuilder.cs
+++ b/src/Umbraco.Infrastructure/Migrations/PostMigrations/PublishedSnapshotRebuilder.cs
@@ -1,12 +1,31 @@
-namespace Umbraco.Core.Migrations.PostMigrations
+using Umbraco.Core.Migrations.PostMigrations;
+using Umbraco.Web.Cache;
+using Umbraco.Web.PublishedCache;
+
+namespace Umbraco.Web.Migrations.PostMigrations
{
///
- /// Implements in Umbraco.Core (doing nothing).
+ /// Implements in Umbraco.Web (rebuilding).
///
public class PublishedSnapshotRebuilder : IPublishedSnapshotRebuilder
{
+ private readonly IPublishedSnapshotService _publishedSnapshotService;
+ private readonly DistributedCache _distributedCache;
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ public PublishedSnapshotRebuilder(IPublishedSnapshotService publishedSnapshotService, DistributedCache distributedCache)
+ {
+ _publishedSnapshotService = publishedSnapshotService;
+ _distributedCache = distributedCache;
+ }
+
///
public void Rebuild()
- { }
+ {
+ _publishedSnapshotService.Rebuild();
+ _distributedCache.RefreshAllPublishedSnapshot();
+ }
}
}
diff --git a/src/Umbraco.Web/Models/ContentTypeImportModel.cs b/src/Umbraco.Infrastructure/Models/ContentTypeImportModel.cs
similarity index 100%
rename from src/Umbraco.Web/Models/ContentTypeImportModel.cs
rename to src/Umbraco.Infrastructure/Models/ContentTypeImportModel.cs
diff --git a/src/Umbraco.Web/Models/ImageProcessorImageUrlGenerator.cs b/src/Umbraco.Infrastructure/Models/ImageProcessorImageUrlGenerator.cs
similarity index 98%
rename from src/Umbraco.Web/Models/ImageProcessorImageUrlGenerator.cs
rename to src/Umbraco.Infrastructure/Models/ImageProcessorImageUrlGenerator.cs
index e471e9aa4a..f88309d7e3 100644
--- a/src/Umbraco.Web/Models/ImageProcessorImageUrlGenerator.cs
+++ b/src/Umbraco.Infrastructure/Models/ImageProcessorImageUrlGenerator.cs
@@ -5,7 +5,7 @@ using Umbraco.Core.Models;
namespace Umbraco.Web.Models
{
- internal class ImageProcessorImageUrlGenerator : IImageUrlGenerator
+ public class ImageProcessorImageUrlGenerator : IImageUrlGenerator
{
public string GetImageUrl(ImageUrlGenerationOptions options)
{
diff --git a/src/Umbraco.Web/Models/LocalPackageInstallModel.cs b/src/Umbraco.Infrastructure/Models/LocalPackageInstallModel.cs
similarity index 100%
rename from src/Umbraco.Web/Models/LocalPackageInstallModel.cs
rename to src/Umbraco.Infrastructure/Models/LocalPackageInstallModel.cs
diff --git a/src/Umbraco.Infrastructure/Models/MediaExtensions.cs b/src/Umbraco.Infrastructure/Models/MediaExtensions.cs
index 08612d2810..41bcfdbc88 100644
--- a/src/Umbraco.Infrastructure/Models/MediaExtensions.cs
+++ b/src/Umbraco.Infrastructure/Models/MediaExtensions.cs
@@ -1,7 +1,5 @@
using System.Linq;
-using Umbraco.Core.Composing;
using Umbraco.Core.Configuration.UmbracoSettings;
-using Umbraco.Core.Logging;
using Umbraco.Core.PropertyEditors;
namespace Umbraco.Core.Models
@@ -11,17 +9,15 @@ namespace Umbraco.Core.Models
///
/// Gets the url of a media item.
///
- public static string GetUrl(this IMedia media, string propertyAlias, ILogger logger, PropertyEditorCollection propertyEditors)
+ public static string GetUrl(this IMedia media, string propertyAlias, MediaUrlGeneratorCollection mediaUrlGenerators)
{
if (!media.Properties.TryGetValue(propertyAlias, out var property))
return string.Empty;
- if (propertyEditors.TryGet(property.PropertyType.PropertyEditorAlias, out var editor)
- && editor is IDataEditorWithMediaPath dataEditor)
- {
- // TODO: would need to be adjusted to variations, when media become variants
- var value = property.GetValue();
- return dataEditor.GetMediaPath(value);
+ // TODO: would need to be adjusted to variations, when media become variants
+ if (mediaUrlGenerators.TryGetMediaPath(property.PropertyType.PropertyEditorAlias, property.GetValue(), out var mediaUrl))
+ {
+ return mediaUrl;
}
// Without knowing what it is, just adding a string here might not be very nice
@@ -31,10 +27,10 @@ namespace Umbraco.Core.Models
///
/// Gets the urls of a media item.
///
- public static string[] GetUrls(this IMedia media, IContentSection contentSection, ILogger logger, PropertyEditorCollection propertyEditors)
+ public static string[] GetUrls(this IMedia media, IContentSection contentSection, MediaUrlGeneratorCollection mediaUrlGenerators)
{
return contentSection.ImageAutoFillProperties
- .Select(field => media.GetUrl(field.Alias, logger, propertyEditors))
+ .Select(field => media.GetUrl(field.Alias, mediaUrlGenerators))
.Where(link => string.IsNullOrWhiteSpace(link) == false)
.ToArray();
}
diff --git a/src/Umbraco.Infrastructure/Persistence/Factories/ContentBaseFactory.cs b/src/Umbraco.Infrastructure/Persistence/Factories/ContentBaseFactory.cs
index 4ae859ba80..13f9d3ee5c 100644
--- a/src/Umbraco.Infrastructure/Persistence/Factories/ContentBaseFactory.cs
+++ b/src/Umbraco.Infrastructure/Persistence/Factories/ContentBaseFactory.cs
@@ -185,7 +185,7 @@ namespace Umbraco.Core.Persistence.Factories
///
/// Builds a dto from an IMedia item.
///
- public static MediaDto BuildDto(PropertyEditorCollection propertyEditors, IMedia entity)
+ public static MediaDto BuildDto(MediaUrlGeneratorCollection mediaUrlGenerators, IMedia entity)
{
var contentDto = BuildContentDto(entity, Constants.ObjectTypes.Media);
@@ -193,7 +193,7 @@ namespace Umbraco.Core.Persistence.Factories
{
NodeId = entity.Id,
ContentDto = contentDto,
- MediaVersionDto = BuildMediaVersionDto(propertyEditors, entity, contentDto)
+ MediaVersionDto = BuildMediaVersionDto(mediaUrlGenerators, entity, contentDto)
};
return dto;
@@ -287,7 +287,7 @@ namespace Umbraco.Core.Persistence.Factories
return dto;
}
- private static MediaVersionDto BuildMediaVersionDto(PropertyEditorCollection propertyEditors, IMedia entity, ContentDto contentDto)
+ private static MediaVersionDto BuildMediaVersionDto(MediaUrlGeneratorCollection mediaUrlGenerators, IMedia entity, ContentDto contentDto)
{
// try to get a path from the string being stored for media
// TODO: only considering umbracoFile
@@ -295,11 +295,9 @@ namespace Umbraco.Core.Persistence.Factories
string path = null;
if (entity.Properties.TryGetValue(Constants.Conventions.Media.File, out var property)
- && propertyEditors.TryGet(property.PropertyType.PropertyEditorAlias, out var editor)
- && editor is IDataEditorWithMediaPath dataEditor)
+ && mediaUrlGenerators.TryGetMediaPath(property.PropertyType.PropertyEditorAlias, property.GetValue(), out var mediaPath))
{
- var value = property.GetValue();
- path = dataEditor.GetMediaPath(value);
+ path = mediaPath;
}
var dto = new MediaVersionDto
diff --git a/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/MediaRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/MediaRepository.cs
index b0afc3b5f8..11f8c4d696 100644
--- a/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/MediaRepository.cs
+++ b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/MediaRepository.cs
@@ -25,6 +25,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
{
private readonly IMediaTypeRepository _mediaTypeRepository;
private readonly ITagRepository _tagRepository;
+ private readonly MediaUrlGeneratorCollection _mediaUrlGenerators;
private readonly MediaByGuidReadRepository _mediaByGuidReadRepository;
public MediaRepository(
@@ -37,12 +38,14 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
IRelationRepository relationRepository,
IRelationTypeRepository relationTypeRepository,
Lazy propertyEditorCollection,
+ MediaUrlGeneratorCollection mediaUrlGenerators,
DataValueReferenceFactoryCollection dataValueReferenceFactories,
IDataTypeService dataTypeService)
: base(scopeAccessor, cache, logger, languageRepository, relationRepository, relationTypeRepository, propertyEditorCollection, dataValueReferenceFactories, dataTypeService)
{
_mediaTypeRepository = mediaTypeRepository ?? throw new ArgumentNullException(nameof(mediaTypeRepository));
_tagRepository = tagRepository ?? throw new ArgumentNullException(nameof(tagRepository));
+ _mediaUrlGenerators = mediaUrlGenerators;
_mediaByGuidReadRepository = new MediaByGuidReadRepository(this, scopeAccessor, cache, logger);
}
@@ -239,7 +242,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
entity.SanitizeEntityPropertiesForXmlStorage();
// create the dto
- var dto = ContentBaseFactory.BuildDto(PropertyEditors, entity);
+ var dto = ContentBaseFactory.BuildDto(_mediaUrlGenerators, entity);
// derive path and level from parent
var parent = GetParentNodeDto(entity.ParentId);
@@ -330,7 +333,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
}
// create the dto
- var dto = ContentBaseFactory.BuildDto(PropertyEditors, entity);
+ var dto = ContentBaseFactory.BuildDto(_mediaUrlGenerators, entity);
// update the node dto
var nodeDto = dto.ContentDto.NodeDto;
diff --git a/src/Umbraco.Infrastructure/PropertyEditors/DataValueReferenceFactoryCollection.cs b/src/Umbraco.Infrastructure/PropertyEditors/DataValueReferenceFactoryCollection.cs
index 51dfe6c5c4..83f5badb9c 100644
--- a/src/Umbraco.Infrastructure/PropertyEditors/DataValueReferenceFactoryCollection.cs
+++ b/src/Umbraco.Infrastructure/PropertyEditors/DataValueReferenceFactoryCollection.cs
@@ -11,6 +11,9 @@ namespace Umbraco.Core.PropertyEditors
: base(items)
{ }
+ // TODO: We could further reduce circular dependencies with PropertyEditorCollection by not having IDataValueReference implemented
+ // by property editors and instead just use the already built in IDataValueReferenceFactory and/or refactor that into a more normal collection
+
public IEnumerable GetAllReferences(IPropertyCollection properties, PropertyEditorCollection propertyEditors)
{
var trackedRelations = new List();
diff --git a/src/Umbraco.Infrastructure/PropertyEditors/FileUploadPropertyEditor.cs b/src/Umbraco.Infrastructure/PropertyEditors/FileUploadPropertyEditor.cs
index 715d4b0d36..8c820c497c 100644
--- a/src/Umbraco.Infrastructure/PropertyEditors/FileUploadPropertyEditor.cs
+++ b/src/Umbraco.Infrastructure/PropertyEditors/FileUploadPropertyEditor.cs
@@ -19,7 +19,7 @@ namespace Umbraco.Web.PropertyEditors
"fileupload",
Group = Constants.PropertyEditors.Groups.Media,
Icon = "icon-download-alt")]
- public class FileUploadPropertyEditor : DataEditor, IDataEditorWithMediaPath
+ public class FileUploadPropertyEditor : DataEditor, IMediaUrlGenerator
{
private readonly IMediaFileSystem _mediaFileSystem;
private readonly IContentSection _contentSection;
@@ -52,7 +52,16 @@ namespace Umbraco.Web.PropertyEditors
return editor;
}
- public string GetMediaPath(object value) => value?.ToString();
+ public bool TryGetMediaPath(string alias, object value, out string mediaPath)
+ {
+ if (alias == Alias)
+ {
+ mediaPath = value?.ToString();
+ return true;
+ }
+ mediaPath = null;
+ return false;
+ }
///
/// Gets a value indicating whether a property is an upload field.
diff --git a/src/Umbraco.Infrastructure/PropertyEditors/ImageCropperPropertyEditor.cs b/src/Umbraco.Infrastructure/PropertyEditors/ImageCropperPropertyEditor.cs
index 66a1ae68ef..045a0fb3d2 100644
--- a/src/Umbraco.Infrastructure/PropertyEditors/ImageCropperPropertyEditor.cs
+++ b/src/Umbraco.Infrastructure/PropertyEditors/ImageCropperPropertyEditor.cs
@@ -26,7 +26,7 @@ namespace Umbraco.Web.PropertyEditors
HideLabel = false,
Group = Constants.PropertyEditors.Groups.Media,
Icon = "icon-crop")]
- public class ImageCropperPropertyEditor : DataEditor, IDataEditorWithMediaPath
+ public class ImageCropperPropertyEditor : DataEditor, IMediaUrlGenerator
{
private readonly IMediaFileSystem _mediaFileSystem;
private readonly IContentSection _contentSettings;
@@ -53,7 +53,16 @@ namespace Umbraco.Web.PropertyEditors
_autoFillProperties = new UploadAutoFillProperties(_mediaFileSystem, logger, _contentSettings);
}
- public string GetMediaPath(object value) => GetFileSrcFromPropertyValue(value, out _, false);
+ public bool TryGetMediaPath(string alias, object value, out string mediaPath)
+ {
+ if (alias == Alias)
+ {
+ mediaPath = GetFileSrcFromPropertyValue(value, out _, false);
+ return true;
+ }
+ mediaPath = null;
+ return false;
+ }
///
/// Creates the corresponding property value editor.
diff --git a/src/Umbraco.Web/PropertyEditors/MultiUrlPickerPropertyEditor.cs b/src/Umbraco.Infrastructure/PropertyEditors/MultiUrlPickerPropertyEditor.cs
similarity index 79%
rename from src/Umbraco.Web/PropertyEditors/MultiUrlPickerPropertyEditor.cs
rename to src/Umbraco.Infrastructure/PropertyEditors/MultiUrlPickerPropertyEditor.cs
index 1501abc071..1be4067763 100644
--- a/src/Umbraco.Web/PropertyEditors/MultiUrlPickerPropertyEditor.cs
+++ b/src/Umbraco.Infrastructure/PropertyEditors/MultiUrlPickerPropertyEditor.cs
@@ -1,12 +1,12 @@
using System;
using Umbraco.Core;
-using Umbraco.Web.Composing;
using Umbraco.Core.IO;
using Umbraco.Core.PropertyEditors;
using Umbraco.Core.Logging;
using Umbraco.Core.Services;
using Umbraco.Core.Strings;
using Umbraco.Web.PublishedCache;
+using Umbraco.Web.Routing;
namespace Umbraco.Web.PropertyEditors
{
@@ -23,17 +23,21 @@ namespace Umbraco.Web.PropertyEditors
private readonly Lazy _entityService;
private readonly IPublishedSnapshotAccessor _publishedSnapshotAccessor;
private readonly IIOHelper _ioHelper;
+ private readonly IUmbracoContextAccessor _umbracoContextAccessor;
+ private readonly IPublishedUrlProvider _publishedUrlProvider;
- public MultiUrlPickerPropertyEditor(ILogger logger, Lazy entityService, IPublishedSnapshotAccessor publishedSnapshotAccessor, IDataTypeService dataTypeService, ILocalizationService localizationService, ILocalizedTextService localizedTextService, IIOHelper ioHelper, IShortStringHelper shortStringHelper)
+ public MultiUrlPickerPropertyEditor(ILogger logger, Lazy entityService, IPublishedSnapshotAccessor publishedSnapshotAccessor, IDataTypeService dataTypeService, ILocalizationService localizationService, ILocalizedTextService localizedTextService, IIOHelper ioHelper, IShortStringHelper shortStringHelper, IUmbracoContextAccessor umbracoContextAccessor, IPublishedUrlProvider publishedUrlProvider)
: base(logger, dataTypeService, localizationService, localizedTextService, shortStringHelper, EditorType.PropertyValue)
{
_entityService = entityService ?? throw new ArgumentNullException(nameof(entityService));
_publishedSnapshotAccessor = publishedSnapshotAccessor ?? throw new ArgumentNullException(nameof(publishedSnapshotAccessor));
_ioHelper = ioHelper;
+ _umbracoContextAccessor = umbracoContextAccessor;
+ _publishedUrlProvider = publishedUrlProvider;
}
protected override IConfigurationEditor CreateConfigurationEditor() => new MultiUrlPickerConfigurationEditor(_ioHelper);
- protected override IDataValueEditor CreateValueEditor() => new MultiUrlPickerValueEditor(_entityService.Value, _publishedSnapshotAccessor, Logger, DataTypeService, LocalizationService, LocalizedTextService, ShortStringHelper, Attribute);
+ protected override IDataValueEditor CreateValueEditor() => new MultiUrlPickerValueEditor(_entityService.Value, _publishedSnapshotAccessor, Logger, DataTypeService, LocalizationService, LocalizedTextService, ShortStringHelper, Attribute, _umbracoContextAccessor, _publishedUrlProvider);
}
}
diff --git a/src/Umbraco.Web/PropertyEditors/MultiUrlPickerValueEditor.cs b/src/Umbraco.Infrastructure/PropertyEditors/MultiUrlPickerValueEditor.cs
similarity index 92%
rename from src/Umbraco.Web/PropertyEditors/MultiUrlPickerValueEditor.cs
rename to src/Umbraco.Infrastructure/PropertyEditors/MultiUrlPickerValueEditor.cs
index ab0f927f47..f3d2255b6b 100644
--- a/src/Umbraco.Web/PropertyEditors/MultiUrlPickerValueEditor.cs
+++ b/src/Umbraco.Infrastructure/PropertyEditors/MultiUrlPickerValueEditor.cs
@@ -11,9 +11,10 @@ using Umbraco.Core.Models.Entities;
using Umbraco.Core.PropertyEditors;
using Umbraco.Core.Services;
using Umbraco.Core.Strings;
-using Umbraco.Web.Composing;
using Umbraco.Web.Models.ContentEditing;
using Umbraco.Web.PublishedCache;
+using Umbraco.Core;
+using Umbraco.Web.Routing;
namespace Umbraco.Web.PropertyEditors
{
@@ -21,14 +22,18 @@ namespace Umbraco.Web.PropertyEditors
{
private readonly IEntityService _entityService;
private readonly ILogger _logger;
+ private readonly IUmbracoContextAccessor _umbracoContextAccessor;
+ private readonly IPublishedUrlProvider _publishedUrlProvider;
private readonly IPublishedSnapshotAccessor _publishedSnapshotAccessor;
- public MultiUrlPickerValueEditor(IEntityService entityService, IPublishedSnapshotAccessor publishedSnapshotAccessor, ILogger logger, IDataTypeService dataTypeService, ILocalizationService localizationService, ILocalizedTextService localizedTextService, IShortStringHelper shortStringHelper, DataEditorAttribute attribute)
+ public MultiUrlPickerValueEditor(IEntityService entityService, IPublishedSnapshotAccessor publishedSnapshotAccessor, ILogger logger, IDataTypeService dataTypeService, ILocalizationService localizationService, ILocalizedTextService localizedTextService, IShortStringHelper shortStringHelper, DataEditorAttribute attribute, IUmbracoContextAccessor umbracoContextAccessor, IPublishedUrlProvider publishedUrlProvider)
: base(dataTypeService, localizationService, localizedTextService, shortStringHelper, attribute)
{
_entityService = entityService ?? throw new ArgumentNullException(nameof(entityService));
_publishedSnapshotAccessor = publishedSnapshotAccessor ?? throw new ArgumentNullException(nameof(publishedSnapshotAccessor));
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
+ _umbracoContextAccessor = umbracoContextAccessor ?? throw new ArgumentNullException(nameof(umbracoContextAccessor));
+ _publishedUrlProvider = publishedUrlProvider;
}
public override object ToEditor(IProperty property, string culture = null, string segment = null)
@@ -84,7 +89,7 @@ namespace Umbraco.Web.PropertyEditors
icon = documentEntity.ContentTypeIcon;
published = culture == null ? documentEntity.Published : documentEntity.PublishedCultures.Contains(culture);
udi = new GuidUdi(Constants.UdiEntityType.Document, documentEntity.Key);
- url = _publishedSnapshotAccessor.PublishedSnapshot.Content.GetById(entity.Key)?.Url() ?? "#";
+ url = _publishedSnapshotAccessor.PublishedSnapshot.Content.GetById(entity.Key)?.Url(_publishedUrlProvider) ?? "#";
trashed = documentEntity.Trashed;
}
else if(entity is IContentEntitySlim contentEntity)
@@ -92,7 +97,7 @@ namespace Umbraco.Web.PropertyEditors
icon = contentEntity.ContentTypeIcon;
published = !contentEntity.Trashed;
udi = new GuidUdi(Constants.UdiEntityType.Media, contentEntity.Key);
- url = _publishedSnapshotAccessor.PublishedSnapshot.Media.GetById(entity.Key)?.Url() ?? "#";
+ url = _publishedSnapshotAccessor.PublishedSnapshot.Media.GetById(entity.Key)?.Url(_publishedUrlProvider) ?? "#";
trashed = contentEntity.Trashed;
}
else
@@ -160,7 +165,7 @@ namespace Umbraco.Web.PropertyEditors
}
[DataContract]
- internal class LinkDto
+ public class LinkDto
{
[DataMember(Name = "name")]
public string Name { get; set; }
diff --git a/src/Umbraco.Web/PropertyEditors/NestedContentPropertyEditor.cs b/src/Umbraco.Infrastructure/PropertyEditors/NestedContentPropertyEditor.cs
similarity index 99%
rename from src/Umbraco.Web/PropertyEditors/NestedContentPropertyEditor.cs
rename to src/Umbraco.Infrastructure/PropertyEditors/NestedContentPropertyEditor.cs
index f55e792189..70490af1a3 100644
--- a/src/Umbraco.Web/PropertyEditors/NestedContentPropertyEditor.cs
+++ b/src/Umbraco.Infrastructure/PropertyEditors/NestedContentPropertyEditor.cs
@@ -6,7 +6,6 @@ using System.Text.RegularExpressions;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Umbraco.Core;
-using Umbraco.Web.Composing;
using Umbraco.Core.IO;
using Umbraco.Core.Logging;
using Umbraco.Core.Models;
@@ -316,14 +315,14 @@ namespace Umbraco.Web.PropertyEditors
? $"'{row.PropType.Name}' cannot be null"
: row.PropType.MandatoryMessage;
validationResults.Add(new ValidationResult($"Item {(row.RowIndex + 1)}: {message}", new[] { row.PropKey }));
- }
+ }
else if (row.JsonRowValue[row.PropKey].ToString().IsNullOrWhiteSpace() || (row.JsonRowValue[row.PropKey].Type == JTokenType.Array && !row.JsonRowValue[row.PropKey].HasValues))
{
var message = string.IsNullOrWhiteSpace(row.PropType.MandatoryMessage)
? $"'{row.PropType.Name}' cannot be empty"
: row.PropType.MandatoryMessage;
validationResults.Add(new ValidationResult($"Item {(row.RowIndex + 1)}: {message}", new[] { row.PropKey }));
- }
+ }
}
// Check regex
diff --git a/src/Umbraco.Web/PropertyEditors/ValueConverters/ContentPickerValueConverter.cs b/src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/ContentPickerValueConverter.cs
similarity index 100%
rename from src/Umbraco.Web/PropertyEditors/ValueConverters/ContentPickerValueConverter.cs
rename to src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/ContentPickerValueConverter.cs
diff --git a/src/Umbraco.Web/PropertyEditors/ValueConverters/MediaPickerValueConverter.cs b/src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/MediaPickerValueConverter.cs
similarity index 100%
rename from src/Umbraco.Web/PropertyEditors/ValueConverters/MediaPickerValueConverter.cs
rename to src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/MediaPickerValueConverter.cs
diff --git a/src/Umbraco.Web/PropertyEditors/ValueConverters/MemberPickerValueConverter.cs b/src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/MemberPickerValueConverter.cs
similarity index 90%
rename from src/Umbraco.Web/PropertyEditors/ValueConverters/MemberPickerValueConverter.cs
rename to src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/MemberPickerValueConverter.cs
index cd69fd9de6..19cca866df 100644
--- a/src/Umbraco.Web/PropertyEditors/ValueConverters/MemberPickerValueConverter.cs
+++ b/src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/MemberPickerValueConverter.cs
@@ -2,9 +2,7 @@
using Umbraco.Core;
using Umbraco.Core.Models.PublishedContent;
using Umbraco.Core.PropertyEditors;
-using Umbraco.Web.Composing;
using Umbraco.Web.PublishedCache;
-using Umbraco.Web.Security;
namespace Umbraco.Web.PropertyEditors.ValueConverters
{
@@ -12,10 +10,12 @@ namespace Umbraco.Web.PropertyEditors.ValueConverters
public class MemberPickerValueConverter : PropertyValueConverterBase
{
private readonly IPublishedSnapshotAccessor _publishedSnapshotAccessor;
+ private readonly IUmbracoContextAccessor _umbracoContextAccessor;
- public MemberPickerValueConverter(IPublishedSnapshotAccessor publishedSnapshotAccessor)
+ public MemberPickerValueConverter(IPublishedSnapshotAccessor publishedSnapshotAccessor, IUmbracoContextAccessor umbracoContextAccessor)
{
_publishedSnapshotAccessor = publishedSnapshotAccessor ?? throw new ArgumentNullException(nameof(publishedSnapshotAccessor));
+ _umbracoContextAccessor = umbracoContextAccessor;
}
public override bool IsConverter(IPublishedPropertyType propertyType)
@@ -45,7 +45,7 @@ namespace Umbraco.Web.PropertyEditors.ValueConverters
if (source == null)
return null;
- if (Current.UmbracoContext != null)
+ if (_umbracoContextAccessor.UmbracoContext != null)
{
IPublishedContent member;
if (source is int id)
diff --git a/src/Umbraco.Web/PropertyEditors/ValueConverters/MultiNodeTreePickerValueConverter.cs b/src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/MultiNodeTreePickerValueConverter.cs
similarity index 96%
rename from src/Umbraco.Web/PropertyEditors/ValueConverters/MultiNodeTreePickerValueConverter.cs
rename to src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/MultiNodeTreePickerValueConverter.cs
index 46ebbd0abb..e35205b704 100644
--- a/src/Umbraco.Web/PropertyEditors/ValueConverters/MultiNodeTreePickerValueConverter.cs
+++ b/src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/MultiNodeTreePickerValueConverter.cs
@@ -3,13 +3,10 @@ using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using Umbraco.Core;
-using Umbraco.Core.Cache;
using Umbraco.Core.Models;
using Umbraco.Core.Models.PublishedContent;
using Umbraco.Core.PropertyEditors;
using Umbraco.Core.PropertyEditors.ValueConverters;
-using Umbraco.Core.Services;
-using Umbraco.Web.Composing;
using Umbraco.Web.PublishedCache;
namespace Umbraco.Web.PropertyEditors.ValueConverters
@@ -22,6 +19,7 @@ namespace Umbraco.Web.PropertyEditors.ValueConverters
public class MultiNodeTreePickerValueConverter : PropertyValueConverterBase
{
private readonly IPublishedSnapshotAccessor _publishedSnapshotAccessor;
+ private readonly IUmbracoContextAccessor _umbracoContextAccessor;
private static readonly List PropertiesToExclude = new List
{
@@ -29,9 +27,10 @@ namespace Umbraco.Web.PropertyEditors.ValueConverters
Constants.Conventions.Content.Redirect.ToLower(CultureInfo.InvariantCulture)
};
- public MultiNodeTreePickerValueConverter(IPublishedSnapshotAccessor publishedSnapshotAccessor)
+ public MultiNodeTreePickerValueConverter(IPublishedSnapshotAccessor publishedSnapshotAccessor, IUmbracoContextAccessor umbracoContextAccessor)
{
_publishedSnapshotAccessor = publishedSnapshotAccessor ?? throw new ArgumentNullException(nameof(publishedSnapshotAccessor));
+ _umbracoContextAccessor = umbracoContextAccessor;
}
public override bool IsConverter(IPublishedPropertyType propertyType)
@@ -70,7 +69,7 @@ namespace Umbraco.Web.PropertyEditors.ValueConverters
}
// TODO: Inject an UmbracoHelper and create a GetUmbracoHelper method based on either injected or singleton
- if (Current.UmbracoContext != null)
+ if (_umbracoContextAccessor.UmbracoContext != null)
{
if (propertyType.EditorAlias.Equals(Constants.PropertyEditors.Aliases.MultiNodeTreePicker))
{
diff --git a/src/Umbraco.Web/PropertyEditors/ValueConverters/MultiUrlPickerValueConverter.cs b/src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/MultiUrlPickerValueConverter.cs
similarity index 82%
rename from src/Umbraco.Web/PropertyEditors/ValueConverters/MultiUrlPickerValueConverter.cs
rename to src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/MultiUrlPickerValueConverter.cs
index 2ceac6cfa8..72beb0106a 100644
--- a/src/Umbraco.Web/PropertyEditors/ValueConverters/MultiUrlPickerValueConverter.cs
+++ b/src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/MultiUrlPickerValueConverter.cs
@@ -1,5 +1,3 @@
-using Newtonsoft.Json;
-using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Linq;
@@ -7,8 +5,10 @@ using Umbraco.Core;
using Umbraco.Core.Logging;
using Umbraco.Core.Models.PublishedContent;
using Umbraco.Core.PropertyEditors;
+using Umbraco.Core.Serialization;
using Umbraco.Web.Models;
using Umbraco.Web.PublishedCache;
+using Umbraco.Web.Routing;
namespace Umbraco.Web.PropertyEditors.ValueConverters
{
@@ -16,11 +16,17 @@ namespace Umbraco.Web.PropertyEditors.ValueConverters
{
private readonly IPublishedSnapshotAccessor _publishedSnapshotAccessor;
private readonly IProfilingLogger _proflog;
+ private readonly IJsonSerializer _jsonSerializer;
+ private readonly IUmbracoContextAccessor _umbracoContextAccessor;
+ private readonly IPublishedUrlProvider _publishedUrlProvider;
- public MultiUrlPickerValueConverter(IPublishedSnapshotAccessor publishedSnapshotAccessor, IProfilingLogger proflog)
+ public MultiUrlPickerValueConverter(IPublishedSnapshotAccessor publishedSnapshotAccessor, IProfilingLogger proflog, IJsonSerializer jsonSerializer, IUmbracoContextAccessor umbracoContextAccessor, IPublishedUrlProvider publishedUrlProvider)
{
_publishedSnapshotAccessor = publishedSnapshotAccessor ?? throw new ArgumentNullException(nameof(publishedSnapshotAccessor));
_proflog = proflog ?? throw new ArgumentNullException(nameof(proflog));
+ _jsonSerializer = jsonSerializer;
+ _umbracoContextAccessor = umbracoContextAccessor;
+ _publishedUrlProvider = publishedUrlProvider;
}
public override bool IsConverter(IPublishedPropertyType propertyType) => Constants.PropertyEditors.Aliases.MultiUrlPicker.Equals(propertyType.EditorAlias);
@@ -48,7 +54,7 @@ namespace Umbraco.Web.PropertyEditors.ValueConverters
}
var links = new List();
- var dtos = JsonConvert.DeserializeObject>(inter.ToString());
+ var dtos = _jsonSerializer.Deserialize>(inter.ToString());
foreach (var dto in dtos)
{
@@ -69,7 +75,7 @@ namespace Umbraco.Web.PropertyEditors.ValueConverters
{
continue;
}
- url = content.Url();
+ url = content.Url(_publishedUrlProvider);
}
links.Add(
diff --git a/src/Umbraco.Web/PropertyEditors/ValueConverters/NestedContentManyValueConverter.cs b/src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/NestedContentManyValueConverter.cs
similarity index 100%
rename from src/Umbraco.Web/PropertyEditors/ValueConverters/NestedContentManyValueConverter.cs
rename to src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/NestedContentManyValueConverter.cs
diff --git a/src/Umbraco.Web/PropertyEditors/ValueConverters/NestedContentSingleValueConverter.cs b/src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/NestedContentSingleValueConverter.cs
similarity index 100%
rename from src/Umbraco.Web/PropertyEditors/ValueConverters/NestedContentSingleValueConverter.cs
rename to src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/NestedContentSingleValueConverter.cs
diff --git a/src/Umbraco.Web/PropertyEditors/ValueConverters/NestedContentValueConverterBase.cs b/src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/NestedContentValueConverterBase.cs
similarity index 100%
rename from src/Umbraco.Web/PropertyEditors/ValueConverters/NestedContentValueConverterBase.cs
rename to src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/NestedContentValueConverterBase.cs
diff --git a/src/Umbraco.Web/PropertyEditors/ValueConverters/TextStringValueConverter.cs b/src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/TextStringValueConverter.cs
similarity index 98%
rename from src/Umbraco.Web/PropertyEditors/ValueConverters/TextStringValueConverter.cs
rename to src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/TextStringValueConverter.cs
index 939a658407..93d670601e 100644
--- a/src/Umbraco.Web/PropertyEditors/ValueConverters/TextStringValueConverter.cs
+++ b/src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/TextStringValueConverter.cs
@@ -3,7 +3,6 @@ using System.Linq;
using Umbraco.Core;
using Umbraco.Core.Models.PublishedContent;
using Umbraco.Core.PropertyEditors;
-using Umbraco.Web.Composing;
using Umbraco.Web.Templates;
namespace Umbraco.Web.PropertyEditors.ValueConverters
diff --git a/src/Umbraco.Infrastructure/Runtime/CoreInitialComposer.cs b/src/Umbraco.Infrastructure/Runtime/CoreInitialComposer.cs
index cb81db4766..e767ce5505 100644
--- a/src/Umbraco.Infrastructure/Runtime/CoreInitialComposer.cs
+++ b/src/Umbraco.Infrastructure/Runtime/CoreInitialComposer.cs
@@ -21,7 +21,10 @@ using Umbraco.Core.Serialization;
using Umbraco.Core.Services;
using Umbraco.Core.Strings;
using Umbraco.Core.Sync;
+using Umbraco.Web.Models.PublishedContent;
+using Umbraco.Web.PublishedCache;
using Umbraco.Web;
+using Umbraco.Web.PropertyEditors;
using Umbraco.Web.Services;
using IntegerValidator = Umbraco.Core.PropertyEditors.Validators.IntegerValidator;
@@ -77,6 +80,11 @@ namespace Umbraco.Core.Runtime
// properties and parameters derive from data editors
composition.DataEditors()
.Add(() => composition.TypeLoader.GetDataEditors());
+
+ composition.MediaUrlGenerators()
+ .Add()
+ .Add();
+
composition.RegisterUnique();
composition.RegisterUnique();
@@ -136,12 +144,17 @@ namespace Umbraco.Core.Runtime
composition.RegisterUnique();
// by default, register a noop rebuilder
- composition.RegisterUnique();
+ composition.RegisterUnique();
composition.SetCultureDictionaryFactory();
composition.Register(f => f.GetInstance().CreateDictionary(), Lifetime.Singleton);
composition.RegisterUnique();
+ // register the published snapshot accessor - the "current" published snapshot is in the umbraco context
+ composition.RegisterUnique();
+
+ composition.RegisterUnique();
+
composition.RegisterUnique();
// register core CMS dashboards and 3rd party types - will be ordered by weight attribute & merged with package.manifest dashboards
diff --git a/src/Umbraco.Tests/Cache/DistributedCacheBinderTests.cs b/src/Umbraco.Tests/Cache/DistributedCacheBinderTests.cs
index ab64a96a24..8db6b970bc 100644
--- a/src/Umbraco.Tests/Cache/DistributedCacheBinderTests.cs
+++ b/src/Umbraco.Tests/Cache/DistributedCacheBinderTests.cs
@@ -10,6 +10,7 @@ using Umbraco.Core.Models;
using Umbraco.Core.Models.Membership;
using Umbraco.Core.Serialization;
using Umbraco.Core.Services;
+using Umbraco.Tests.TestHelpers;
using Umbraco.Tests.Testing;
using Umbraco.Tests.Testing.Objects.Accessors;
using Umbraco.Web;
@@ -153,18 +154,18 @@ namespace Umbraco.Tests.Cache
};
+ var httpContextAccessor = TestHelper.GetHttpContextAccessor();
+
var umbracoContextFactory = new UmbracoContextFactory(
new TestUmbracoContextAccessor(),
Mock.Of(),
new TestVariationContextAccessor(),
new TestDefaultCultureAccessor(),
- TestObjects.GetUmbracoSettings(),
TestObjects.GetGlobalSettings(),
- new UrlProviderCollection(Enumerable.Empty()),
- new MediaUrlProviderCollection(Enumerable.Empty()),
Mock.Of(),
IOHelper,
- UriUtility);
+ UriUtility,
+ httpContextAccessor);
// just assert it does not throw
var refreshers = new DistributedCacheBinder(null, umbracoContextFactory, null);
diff --git a/src/Umbraco.Tests/Cache/PublishedCache/PublishedContentCacheTests.cs b/src/Umbraco.Tests/Cache/PublishedCache/PublishedContentCacheTests.cs
index 6463569c0d..a7ef0ff721 100644
--- a/src/Umbraco.Tests/Cache/PublishedCache/PublishedContentCacheTests.cs
+++ b/src/Umbraco.Tests/Cache/PublishedCache/PublishedContentCacheTests.cs
@@ -74,13 +74,12 @@ namespace Umbraco.Tests.Cache.PublishedCache
var publishedSnapshotService = new Mock();
publishedSnapshotService.Setup(x => x.CreatePublishedSnapshot(It.IsAny())).Returns(publishedShapshot);
+ var httpContext = _httpContextFactory.HttpContext;
+ var httpContextAccessor = TestHelper.GetHttpContextAccessor(httpContext);
_umbracoContext = new UmbracoContext(
- _httpContextFactory.HttpContext,
+ httpContextAccessor,
publishedSnapshotService.Object,
- new WebSecurity(_httpContextFactory.HttpContext, Mock.Of(), globalSettings, IOHelper),
- umbracoSettings,
- Enumerable.Empty(),
- Enumerable.Empty(),
+ new WebSecurity(httpContextAccessor, Mock.Of(), globalSettings, IOHelper),
globalSettings,
new TestVariationContextAccessor(),
IOHelper,
diff --git a/src/Umbraco.Tests/LegacyXmlPublishedCache/XmlPublishedContent.cs b/src/Umbraco.Tests/LegacyXmlPublishedCache/XmlPublishedContent.cs
index 4d6f57f490..b1ee6a7c4d 100644
--- a/src/Umbraco.Tests/LegacyXmlPublishedCache/XmlPublishedContent.cs
+++ b/src/Umbraco.Tests/LegacyXmlPublishedCache/XmlPublishedContent.cs
@@ -439,11 +439,6 @@ namespace Umbraco.Tests.LegacyXmlPublishedCache
return (IPublishedContent) appCache.Get(key, () => (new XmlPublishedContent(node, isPreviewing, appCache, contentTypeCache, variationContextAccessor)).CreateModel(Current.PublishedModelFactory));
}
- public static void ClearRequest()
- {
- Current.AppCaches.RequestCache.ClearByKey(CacheKeyPrefix);
- }
-
private const string CacheKeyPrefix = "CONTENTCACHE_XMLPUBLISHEDCONTENT_";
}
}
diff --git a/src/Umbraco.Tests/Persistence/Repositories/MediaRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/MediaRepositoryTest.cs
index ca24b051d0..efabddb2cd 100644
--- a/src/Umbraco.Tests/Persistence/Repositories/MediaRepositoryTest.cs
+++ b/src/Umbraco.Tests/Persistence/Repositories/MediaRepositoryTest.cs
@@ -44,8 +44,9 @@ namespace Umbraco.Tests.Persistence.Repositories
var entityRepository = new EntityRepository(scopeAccessor);
var relationRepository = new RelationRepository(scopeAccessor, Logger, relationTypeRepository, entityRepository);
var propertyEditors = new Lazy(() => new PropertyEditorCollection(new DataEditorCollection(Enumerable.Empty())));
+ var mediaUrlGenerators = new MediaUrlGeneratorCollection(Enumerable.Empty());
var dataValueReferences = new DataValueReferenceFactoryCollection(Enumerable.Empty());
- var repository = new MediaRepository(scopeAccessor, appCaches, Logger, mediaTypeRepository, tagRepository, Mock.Of(), relationRepository, relationTypeRepository, propertyEditors, dataValueReferences, DataTypeService);
+ var repository = new MediaRepository(scopeAccessor, appCaches, Logger, mediaTypeRepository, tagRepository, Mock.Of(), relationRepository, relationTypeRepository, propertyEditors, mediaUrlGenerators, dataValueReferences, DataTypeService);
return repository;
}
diff --git a/src/Umbraco.Tests/Persistence/Repositories/TagRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/TagRepositoryTest.cs
index 70c946dabe..d4341cd128 100644
--- a/src/Umbraco.Tests/Persistence/Repositories/TagRepositoryTest.cs
+++ b/src/Umbraco.Tests/Persistence/Repositories/TagRepositoryTest.cs
@@ -981,8 +981,9 @@ namespace Umbraco.Tests.Persistence.Repositories
var entityRepository = new EntityRepository(accessor);
var relationRepository = new RelationRepository(accessor, Logger, relationTypeRepository, entityRepository);
var propertyEditors = new Lazy(() => new PropertyEditorCollection(new DataEditorCollection(Enumerable.Empty())));
+ var mediaUrlGenerators = new MediaUrlGeneratorCollection(Enumerable.Empty());
var dataValueReferences = new DataValueReferenceFactoryCollection(Enumerable.Empty());
- var repository = new MediaRepository(accessor, AppCaches.Disabled, Logger, mediaTypeRepository, tagRepository, Mock.Of(), relationRepository, relationTypeRepository, propertyEditors, dataValueReferences, DataTypeService);
+ var repository = new MediaRepository(accessor, AppCaches.Disabled, Logger, mediaTypeRepository, tagRepository, Mock.Of(), relationRepository, relationTypeRepository, propertyEditors, mediaUrlGenerators, dataValueReferences, DataTypeService);
return repository;
}
}
diff --git a/src/Umbraco.Tests/Persistence/Repositories/UserRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/UserRepositoryTest.cs
index 909c6098fb..8b2514eec0 100644
--- a/src/Umbraco.Tests/Persistence/Repositories/UserRepositoryTest.cs
+++ b/src/Umbraco.Tests/Persistence/Repositories/UserRepositoryTest.cs
@@ -36,8 +36,9 @@ namespace Umbraco.Tests.Persistence.Repositories
var entityRepository = new EntityRepository(accessor);
var relationRepository = new RelationRepository(accessor, Logger, relationTypeRepository, entityRepository);
var propertyEditors = new Lazy(() => new PropertyEditorCollection(new DataEditorCollection(Enumerable.Empty())));
+ var mediaUrlGenerators = new MediaUrlGeneratorCollection(Enumerable.Empty());
var dataValueReferences = new DataValueReferenceFactoryCollection(Enumerable.Empty());
- var repository = new MediaRepository(accessor, AppCaches, Mock.Of(), mediaTypeRepository, tagRepository, Mock.Of(), relationRepository, relationTypeRepository, propertyEditors, dataValueReferences, DataTypeService);
+ var repository = new MediaRepository(accessor, AppCaches, Mock.Of(), mediaTypeRepository, tagRepository, Mock.Of(), relationRepository, relationTypeRepository, propertyEditors, mediaUrlGenerators, dataValueReferences, DataTypeService);
return repository;
}
diff --git a/src/Umbraco.Tests/PublishedContent/PublishedContentSnapshotTestBase.cs b/src/Umbraco.Tests/PublishedContent/PublishedContentSnapshotTestBase.cs
index ab0b8f3b1a..9281db2d29 100644
--- a/src/Umbraco.Tests/PublishedContent/PublishedContentSnapshotTestBase.cs
+++ b/src/Umbraco.Tests/PublishedContent/PublishedContentSnapshotTestBase.cs
@@ -68,13 +68,12 @@ namespace Umbraco.Tests.PublishedContent
var globalSettings = TestObjects.GetGlobalSettings();
var httpContext = GetHttpContextFactory("http://umbraco.local/", routeData).HttpContext;
+
+ var httpContextAccessor = TestHelper.GetHttpContextAccessor(httpContext);
var umbracoContext = new UmbracoContext(
- httpContext,
+ httpContextAccessor,
publishedSnapshotService.Object,
- new WebSecurity(httpContext, Current.Services.UserService, globalSettings, IOHelper),
- TestObjects.GetUmbracoSettings(),
- Enumerable.Empty(),
- Enumerable.Empty(),
+ new WebSecurity(httpContextAccessor, Current.Services.UserService, globalSettings, IOHelper),
globalSettings,
new TestVariationContextAccessor(),
IOHelper,
diff --git a/src/Umbraco.Tests/PublishedContent/PublishedContentTestBase.cs b/src/Umbraco.Tests/PublishedContent/PublishedContentTestBase.cs
index ee62bbe06f..fc184e8da0 100644
--- a/src/Umbraco.Tests/PublishedContent/PublishedContentTestBase.cs
+++ b/src/Umbraco.Tests/PublishedContent/PublishedContentTestBase.cs
@@ -15,6 +15,7 @@ using Umbraco.Core.Strings;
using Umbraco.Web;
using Umbraco.Web.Templates;
using Umbraco.Web.Models;
+using Umbraco.Web.Routing;
namespace Umbraco.Tests.PublishedContent
{
@@ -43,11 +44,12 @@ namespace Umbraco.Tests.PublishedContent
var converters = Factory.GetInstance();
var umbracoContextAccessor = Mock.Of();
+ var publishedUrlProvider = Mock.Of();
var logger = Mock.Of();
- var imageSourceParser = new HtmlImageSourceParser(umbracoContextAccessor);
+ var imageSourceParser = new HtmlImageSourceParser(publishedUrlProvider);
var pastedImages = new RichTextEditorPastedImages(umbracoContextAccessor, logger, IOHelper, Mock.Of(), Mock.Of(), Mock.Of(), ShortStringHelper);
- var localLinkParser = new HtmlLocalLinkParser(umbracoContextAccessor);
+ var localLinkParser = new HtmlLocalLinkParser(umbracoContextAccessor, publishedUrlProvider);
var dataTypeService = new TestObjects.TestDataTypeService(
new DataType(new RichTextPropertyEditor(
Mock.Of(),
diff --git a/src/Umbraco.Tests/PublishedContent/PublishedContentTests.cs b/src/Umbraco.Tests/PublishedContent/PublishedContentTests.cs
index 9a0527af2c..ecfcca0e0d 100644
--- a/src/Umbraco.Tests/PublishedContent/PublishedContentTests.cs
+++ b/src/Umbraco.Tests/PublishedContent/PublishedContentTests.cs
@@ -23,6 +23,7 @@ using Umbraco.Web.Models.PublishedContent;
using Umbraco.Web.PropertyEditors;
using Umbraco.Web.Templates;
using Umbraco.Web.Models;
+using Umbraco.Web.Routing;
using Current = Umbraco.Web.Composing.Current;
namespace Umbraco.Tests.PublishedContent
@@ -49,9 +50,10 @@ namespace Umbraco.Tests.PublishedContent
var mediaFileService = Mock.Of();
var contentTypeBaseServiceProvider = Mock.Of();
var umbracoContextAccessor = Mock.Of();
- var imageSourceParser = new HtmlImageSourceParser(umbracoContextAccessor);
+ var publishedUrlProvider = Mock.Of();
+ var imageSourceParser = new HtmlImageSourceParser(publishedUrlProvider);
var pastedImages = new RichTextEditorPastedImages(umbracoContextAccessor, logger, IOHelper, mediaService, contentTypeBaseServiceProvider, mediaFileService, ShortStringHelper);
- var linkParser = new HtmlLocalLinkParser(umbracoContextAccessor);
+ var linkParser = new HtmlLocalLinkParser(umbracoContextAccessor, publishedUrlProvider);
var localizationService = Mock.Of();
var dataTypeService = new TestObjects.TestDataTypeService(
diff --git a/src/Umbraco.Tests/Routing/GetContentUrlsTests.cs b/src/Umbraco.Tests/Routing/GetContentUrlsTests.cs
index 65fc139519..b9d669902d 100644
--- a/src/Umbraco.Tests/Routing/GetContentUrlsTests.cs
+++ b/src/Umbraco.Tests/Routing/GetContentUrlsTests.cs
@@ -1,4 +1,5 @@
-using System.Collections.Generic;
+using System;
+using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using Moq;
@@ -6,8 +7,12 @@ using NUnit.Framework;
using Umbraco.Core;
using Umbraco.Web.Composing;
using Umbraco.Core.Models;
+using Umbraco.Core.Models.PublishedContent;
using Umbraco.Core.Services;
+using Umbraco.Tests.TestHelpers;
using Umbraco.Tests.TestHelpers.Entities;
+using Umbraco.Tests.Testing.Objects.Accessors;
+using Umbraco.Web;
using Umbraco.Web.Routing;
namespace Umbraco.Tests.Routing
@@ -55,7 +60,8 @@ namespace Umbraco.Tests.Routing
GetLangService("en-US", "fr-FR"), GetTextService(), ServiceContext.ContentService,
VariationContextAccessor,
Logger,
- UriUtility).ToList();
+ UriUtility,
+ PublishedUrlProvider).ToList();
Assert.AreEqual(1, urls.Count);
Assert.AreEqual("content/itemNotPublished", urls[0].Text);
@@ -73,8 +79,18 @@ namespace Umbraco.Tests.Routing
var umbracoSettings = Current.Configs.Settings();
- var umbContext = GetUmbracoContext("http://localhost:8000",
- urlProviders: new []{ new DefaultUrlProvider(umbracoSettings.RequestHandler, Logger, TestObjects.GetGlobalSettings(), new SiteDomainHelper(), UriUtility) });
+ var umbContext = GetUmbracoContext("http://localhost:8000");
+ var umbracoContextAccessor = new TestUmbracoContextAccessor(umbContext);
+ var urlProvider = new DefaultUrlProvider(umbracoSettings.RequestHandler, Logger, TestObjects.GetGlobalSettings(), new SiteDomainHelper(),
+ umbracoContextAccessor, UriUtility);
+ var publishedUrlProvider = new UrlProvider(
+ umbracoContextAccessor,
+ TestHelper.WebRoutingSection,
+ new UrlProviderCollection(new []{urlProvider}),
+ new MediaUrlProviderCollection(Enumerable.Empty()),
+ Mock.Of()
+ );
+
var publishedRouter = CreatePublishedRouter(Factory,
contentFinders:new ContentFinderCollection(new[]{new ContentFinderByUrl(Logger) }));
var urls = content.GetContentUrls(publishedRouter,
@@ -82,7 +98,8 @@ namespace Umbraco.Tests.Routing
GetLangService("en-US", "fr-FR"), GetTextService(), ServiceContext.ContentService,
VariationContextAccessor,
Logger,
- UriUtility).ToList();
+ UriUtility,
+ publishedUrlProvider).ToList();
Assert.AreEqual(1, urls.Count);
Assert.AreEqual("/home/", urls[0].Text);
@@ -107,8 +124,18 @@ namespace Umbraco.Tests.Routing
var umbracoSettings = Current.Configs.Settings();
- var umbContext = GetUmbracoContext("http://localhost:8000",
- urlProviders: new[] { new DefaultUrlProvider(umbracoSettings.RequestHandler, Logger, TestObjects.GetGlobalSettings(), new SiteDomainHelper(), UriUtility) });
+
+ var umbContext = GetUmbracoContext("http://localhost:8000");
+ var umbracoContextAccessor = new TestUmbracoContextAccessor(umbContext);
+ var urlProvider = new DefaultUrlProvider(umbracoSettings.RequestHandler, Logger, TestObjects.GetGlobalSettings(), new SiteDomainHelper(), umbracoContextAccessor, UriUtility);
+ var publishedUrlProvider = new UrlProvider(
+ umbracoContextAccessor,
+ TestHelper.WebRoutingSection,
+ new UrlProviderCollection(new []{urlProvider}),
+ new MediaUrlProviderCollection(Enumerable.Empty()),
+ Mock.Of()
+ );
+
var publishedRouter = CreatePublishedRouter(Factory,
contentFinders: new ContentFinderCollection(new[] { new ContentFinderByUrl(Logger) }));
var urls = child.GetContentUrls(publishedRouter,
@@ -116,7 +143,9 @@ namespace Umbraco.Tests.Routing
GetLangService("en-US", "fr-FR"), GetTextService(), ServiceContext.ContentService,
VariationContextAccessor,
Logger,
- UriUtility).ToList();
+ UriUtility,
+ publishedUrlProvider
+ ).ToList();
Assert.AreEqual(1, urls.Count);
Assert.AreEqual("/home/sub1/", urls[0].Text);
diff --git a/src/Umbraco.Tests/Routing/MediaUrlProviderTests.cs b/src/Umbraco.Tests/Routing/MediaUrlProviderTests.cs
index 638830b12a..fb61fcffe8 100644
--- a/src/Umbraco.Tests/Routing/MediaUrlProviderTests.cs
+++ b/src/Umbraco.Tests/Routing/MediaUrlProviderTests.cs
@@ -15,6 +15,8 @@ using Umbraco.Core.Services;
using Umbraco.Tests.PublishedContent;
using Umbraco.Tests.TestHelpers;
using Umbraco.Tests.Testing;
+using Umbraco.Tests.Testing.Objects.Accessors;
+using Umbraco.Web;
using Umbraco.Web.PropertyEditors;
using Umbraco.Web.Routing;
@@ -36,11 +38,11 @@ namespace Umbraco.Tests.Routing
var dataTypeService = Mock.Of();
var umbracoSettingsSection = TestObjects.GetUmbracoSettings();
- var propertyEditors = new PropertyEditorCollection(new DataEditorCollection(new IDataEditor[]
+ var propertyEditors = new MediaUrlGeneratorCollection(new IMediaUrlGenerator[]
{
new FileUploadPropertyEditor(logger, mediaFileSystemMock, contentSection, dataTypeService, LocalizationService, LocalizedTextService, ShortStringHelper, umbracoSettingsSection),
new ImageCropperPropertyEditor(logger, mediaFileSystemMock, contentSection, dataTypeService, LocalizationService, IOHelper, ShortStringHelper, LocalizedTextService, umbracoSettingsSection),
- }));
+ });
_mediaUrlProvider = new DefaultMediaUrlProvider(propertyEditors, UriUtility);
}
@@ -56,10 +58,10 @@ namespace Umbraco.Tests.Routing
{
const string expected = "/media/rfeiw584/test.jpg";
- var umbracoContext = GetUmbracoContext("/", mediaUrlProviders: new[] { _mediaUrlProvider });
+ var umbracoContext = GetUmbracoContext("/");
var publishedContent = CreatePublishedContent(Constants.PropertyEditors.Aliases.UploadField, expected, null);
- var resolvedUrl = umbracoContext.UrlProvider.GetMediaUrl(publishedContent, UrlMode.Auto);
+ var resolvedUrl = GetPublishedUrlProvider(umbracoContext).GetMediaUrl(publishedContent, UrlMode.Auto);
Assert.AreEqual(expected, resolvedUrl);
}
@@ -75,10 +77,10 @@ namespace Umbraco.Tests.Routing
Src = expected
});
- var umbracoContext = GetUmbracoContext("/", mediaUrlProviders: new[] { _mediaUrlProvider });
+ var umbracoContext = GetUmbracoContext("/");
var publishedContent = CreatePublishedContent(Constants.PropertyEditors.Aliases.ImageCropper, imageCropperValue, configuration);
- var resolvedUrl = umbracoContext.UrlProvider.GetMediaUrl(publishedContent, UrlMode.Auto);
+ var resolvedUrl = GetPublishedUrlProvider(umbracoContext).GetMediaUrl(publishedContent, UrlMode.Auto);
Assert.AreEqual(expected, resolvedUrl);
}
@@ -89,10 +91,10 @@ namespace Umbraco.Tests.Routing
const string mediaUrl = "/media/rfeiw584/test.jpg";
var expected = $"http://localhost{mediaUrl}";
- var umbracoContext = GetUmbracoContext("http://localhost", mediaUrlProviders: new[] { _mediaUrlProvider });
+ var umbracoContext = GetUmbracoContext("http://localhost");
var publishedContent = CreatePublishedContent(Constants.PropertyEditors.Aliases.UploadField, mediaUrl, null);
- var resolvedUrl = umbracoContext.UrlProvider.GetMediaUrl(publishedContent, UrlMode.Absolute);
+ var resolvedUrl = GetPublishedUrlProvider(umbracoContext).GetMediaUrl(publishedContent, UrlMode.Absolute);
Assert.AreEqual(expected, resolvedUrl);
}
@@ -102,10 +104,10 @@ namespace Umbraco.Tests.Routing
{
const string expected = "http://localhost/media/rfeiw584/test.jpg";
- var umbracoContext = GetUmbracoContext("http://localhost", mediaUrlProviders: new[] { _mediaUrlProvider });
+ var umbracoContext = GetUmbracoContext("http://localhost");
var publishedContent = CreatePublishedContent(Constants.PropertyEditors.Aliases.UploadField, expected, null);
- var resolvedUrl = umbracoContext.UrlProvider.GetMediaUrl(publishedContent, UrlMode.Relative);
+ var resolvedUrl = GetPublishedUrlProvider(umbracoContext).GetMediaUrl(publishedContent, UrlMode.Relative);
Assert.AreEqual(expected, resolvedUrl);
}
@@ -113,10 +115,10 @@ namespace Umbraco.Tests.Routing
[Test]
public void Get_Media_Url_Returns_Empty_String_When_PropertyType_Is_Not_Supported()
{
- var umbracoContext = GetUmbracoContext("/", mediaUrlProviders: new[] { _mediaUrlProvider });
+ var umbracoContext = GetUmbracoContext("/");
var publishedContent = CreatePublishedContent(Constants.PropertyEditors.Aliases.Boolean, "0", null);
- var resolvedUrl = umbracoContext.UrlProvider.GetMediaUrl(publishedContent, UrlMode.Absolute, propertyAlias: "test");
+ var resolvedUrl = GetPublishedUrlProvider(umbracoContext).GetMediaUrl(publishedContent, UrlMode.Absolute, propertyAlias: "test");
Assert.AreEqual(string.Empty, resolvedUrl);
}
@@ -124,7 +126,7 @@ namespace Umbraco.Tests.Routing
[Test]
public void Get_Media_Url_Can_Resolve_Variant_Property_Url()
{
- var umbracoContext = GetUmbracoContext("http://localhost", mediaUrlProviders: new[] { _mediaUrlProvider });
+ var umbracoContext = GetUmbracoContext("http://localhost");
var umbracoFilePropertyType = CreatePropertyType(Constants.PropertyEditors.Aliases.UploadField, null, ContentVariation.Culture);
@@ -143,10 +145,21 @@ namespace Umbraco.Tests.Routing
var contentType = new PublishedContentType(666, "alias", PublishedItemType.Content, Enumerable.Empty(), new [] { umbracoFilePropertyType }, ContentVariation.Culture);
var publishedContent = new SolidPublishedContent(contentType) {Properties = new[] {property}};
- var resolvedUrl = umbracoContext.UrlProvider.GetMediaUrl(publishedContent, UrlMode.Auto, "da");
+ var resolvedUrl = GetPublishedUrlProvider(umbracoContext).GetMediaUrl(publishedContent, UrlMode.Auto, "da");
Assert.AreEqual(daMediaUrl, resolvedUrl);
}
+ private IPublishedUrlProvider GetPublishedUrlProvider(IUmbracoContext umbracoContext)
+ {
+ return new UrlProvider(
+ new TestUmbracoContextAccessor(umbracoContext),
+ TestHelper.WebRoutingSection,
+ new UrlProviderCollection(Enumerable.Empty()),
+ new MediaUrlProviderCollection(new []{_mediaUrlProvider}),
+ Mock.Of()
+ );
+ }
+
private static IPublishedContent CreatePublishedContent(string propertyEditorAlias, string propertyValue, object dataTypeConfiguration)
{
var umbracoFilePropertyType = CreatePropertyType(propertyEditorAlias, dataTypeConfiguration, ContentVariation.Nothing);
diff --git a/src/Umbraco.Tests/Routing/RenderRouteHandlerTests.cs b/src/Umbraco.Tests/Routing/RenderRouteHandlerTests.cs
index a5b5ba29a2..02639e593d 100644
--- a/src/Umbraco.Tests/Routing/RenderRouteHandlerTests.cs
+++ b/src/Umbraco.Tests/Routing/RenderRouteHandlerTests.cs
@@ -144,6 +144,7 @@ namespace Umbraco.Tests.Routing
var routeData = new RouteData() {Route = route};
var umbracoContext = GetUmbracoContext("~/dummy-page", template.Id, routeData, true);
var httpContext = GetHttpContextFactory(url, routeData).HttpContext;
+ var httpContextAccessor = TestHelper.GetHttpContextAccessor(httpContext);
var publishedRouter = CreatePublishedRouter();
var frequest = publishedRouter.CreateRequest(umbracoContext);
frequest.PublishedContent = umbracoContext.Content.GetById(1172);
@@ -156,7 +157,7 @@ namespace Umbraco.Tests.Routing
var handler = new RenderRouteHandler(umbracoContext, new TestControllerFactory(umbracoContextAccessor, Mock.Of(), context =>
{
var membershipHelper = new MembershipHelper(
- httpContext, Mock.Of(), Mock.Of(), Mock.Of(), Mock.Of(), Mock.Of(), Mock.Of(), AppCaches.Disabled, Mock.Of(), ShortStringHelper, Mock.Of());
+ httpContextAccessor, Mock.Of(), Mock.Of(), Mock.Of(), Mock.Of(), Mock.Of(), Mock.Of(), AppCaches.Disabled, Mock.Of(), ShortStringHelper, Mock.Of());
return new CustomDocumentController(Factory.GetInstance(),
umbracoContextAccessor,
Factory.GetInstance(),
diff --git a/src/Umbraco.Tests/Routing/UmbracoModuleTests.cs b/src/Umbraco.Tests/Routing/UmbracoModuleTests.cs
index 2874e51edd..de7e6d52b6 100644
--- a/src/Umbraco.Tests/Routing/UmbracoModuleTests.cs
+++ b/src/Umbraco.Tests/Routing/UmbracoModuleTests.cs
@@ -43,7 +43,8 @@ namespace Umbraco.Tests.Routing
null, // FIXME: PublishedRouter complexities...
Mock.Of(),
new RoutableDocumentFilter(globalSettings, IOHelper),
- UriUtility
+ UriUtility,
+ AppCaches.RequestCache
);
runtime.Level = RuntimeLevel.Run;
diff --git a/src/Umbraco.Tests/Routing/UrlProviderTests.cs b/src/Umbraco.Tests/Routing/UrlProviderTests.cs
index 58faeb1f30..481d03bce5 100644
--- a/src/Umbraco.Tests/Routing/UrlProviderTests.cs
+++ b/src/Umbraco.Tests/Routing/UrlProviderTests.cs
@@ -13,6 +13,8 @@ using Umbraco.Tests.LegacyXmlPublishedCache;
using Umbraco.Tests.PublishedContent;
using Umbraco.Tests.TestHelpers;
using Umbraco.Tests.Testing;
+using Umbraco.Tests.Testing.Objects.Accessors;
+using Umbraco.Web;
using Umbraco.Web.PublishedCache;
using Umbraco.Web.Routing;
@@ -22,6 +24,8 @@ namespace Umbraco.Tests.Routing
[UmbracoTest(Database = UmbracoTestOptions.Database.NewSchemaPerFixture)]
public class UrlProviderTests : BaseWebTest
{
+ private IUmbracoContextAccessor UmbracoContextAccessor { get; } = new TestUmbracoContextAccessor();
+
protected override void Compose()
{
base.Compose();
@@ -46,11 +50,12 @@ namespace Umbraco.Tests.Routing
var umbracoSettings = Current.Configs.Settings();
- var umbracoContext = GetUmbracoContext("/test", 1111, urlProviders: new[]
- {
- new DefaultUrlProvider(umbracoSettings.RequestHandler, Logger, globalSettings.Object, new SiteDomainHelper(), UriUtility)
- }, globalSettings: globalSettings.Object);
+ var umbracoContext = GetUmbracoContext("/test", 1111, globalSettings: globalSettings.Object);
+ var umbracoContextAccessor = new TestUmbracoContextAccessor(umbracoContext);
+ var urlProvider = new DefaultUrlProvider(umbracoSettings.RequestHandler, Logger, globalSettings.Object,
+ new SiteDomainHelper(), umbracoContextAccessor, UriUtility);
+ var publishedUrlProvider = GetPublishedUrlProvider(umbracoContext, urlProvider);
var requestHandlerMock = Mock.Get(umbracoSettings.RequestHandler);
requestHandlerMock.Setup(x => x.AddTrailingSlash).Returns(false);// (cached routes have none)
@@ -67,14 +72,14 @@ namespace Umbraco.Tests.Routing
foreach (var sample in samples)
{
- var result = umbracoContext.UrlProvider.GetUrl(sample.Key);
+ var result = publishedUrlProvider.GetUrl(sample.Key);
Assert.AreEqual(sample.Value, result);
}
var randomSample = new KeyValuePair(1177, "/home/sub1/custom-sub-1");
for (int i = 0; i < 5; i++)
{
- var result = umbracoContext.UrlProvider.GetUrl(randomSample.Key);
+ var result = publishedUrlProvider.GetUrl(randomSample.Key);
Assert.AreEqual(randomSample.Value, result);
}
@@ -93,6 +98,17 @@ namespace Umbraco.Tests.Routing
Assert.AreEqual(0, cachedIds.Count);
}
+ private IPublishedUrlProvider GetPublishedUrlProvider(IUmbracoContext umbracoContext, DefaultUrlProvider urlProvider)
+ {
+ return new UrlProvider(
+ new TestUmbracoContextAccessor(umbracoContext),
+ TestHelper.WebRoutingSection,
+ new UrlProviderCollection(new []{urlProvider}),
+ new MediaUrlProviderCollection(Enumerable.Empty()),
+ Mock.Of()
+ );
+ }
+
// test hideTopLevelNodeFromPath false
[TestCase(1046, "/home/")]
[TestCase(1173, "/home/sub1/")]
@@ -109,13 +125,14 @@ namespace Umbraco.Tests.Routing
var umbracoSettings = Current.Configs.Settings();
- var umbracoContext = GetUmbracoContext("/test", 1111, urlProviders: new[]
- {
- new DefaultUrlProvider(umbracoSettings.RequestHandler, Logger, globalSettings.Object, new SiteDomainHelper(), UriUtility)
- }, globalSettings: globalSettings.Object);
+ var umbracoContext = GetUmbracoContext("/test", 1111, globalSettings: globalSettings.Object);
+ var umbracoContextAccessor = new TestUmbracoContextAccessor(umbracoContext);
+ var urlProvider = new DefaultUrlProvider(umbracoSettings.RequestHandler, Logger, globalSettings.Object,
+ new SiteDomainHelper(), umbracoContextAccessor, UriUtility);
+ var publishedUrlProvider = GetPublishedUrlProvider(umbracoContext, urlProvider);
- var result = umbracoContext.UrlProvider.GetUrl(nodeId);
+ var result = publishedUrlProvider.GetUrl(nodeId);
Assert.AreEqual(niceUrlMatch, result);
}
@@ -137,13 +154,14 @@ namespace Umbraco.Tests.Routing
var umbracoSettings = Current.Configs.Settings();
- var umbracoContext = GetUmbracoContext("/test", 1111, urlProviders: new[]
- {
- new DefaultUrlProvider(umbracoSettings.RequestHandler, Logger, globalSettings.Object, new SiteDomainHelper(), UriUtility)
- }, globalSettings: globalSettings.Object);
+ var umbracoContext = GetUmbracoContext("/test", 1111, globalSettings: globalSettings.Object);
+ var umbracoContextAccessor = new TestUmbracoContextAccessor(umbracoContext);
+ var urlProvider = new DefaultUrlProvider(umbracoSettings.RequestHandler, Logger, globalSettings.Object,
+ new SiteDomainHelper(), umbracoContextAccessor, UriUtility);
+ var publishedUrlProvider = GetPublishedUrlProvider(umbracoContext, urlProvider);
- var result = umbracoContext.UrlProvider.GetUrl(nodeId);
+ var result = publishedUrlProvider.GetUrl(nodeId);
Assert.AreEqual(niceUrlMatch, result);
}
@@ -177,15 +195,17 @@ namespace Umbraco.Tests.Routing
snapshotService.Setup(x => x.CreatePublishedSnapshot(It.IsAny()))
.Returns(snapshot);
- var umbracoContext = GetUmbracoContext(currentUri, umbracoSettings: umbracoSettings,
- urlProviders: new[] {
- new DefaultUrlProvider(umbracoSettings.RequestHandler, Logger, globalSettings.Object, new SiteDomainHelper(), UriUtility)
- },
+
+ var umbracoContext = GetUmbracoContext(currentUri,
globalSettings: globalSettings.Object,
snapshotService: snapshotService.Object);
+ var umbracoContextAccessor = new TestUmbracoContextAccessor(umbracoContext);
+ var urlProvider = new DefaultUrlProvider(umbracoSettings.RequestHandler, Logger, globalSettings.Object,
+ new SiteDomainHelper(), umbracoContextAccessor, UriUtility);
+ var publishedUrlProvider = GetPublishedUrlProvider(umbracoContext, urlProvider);
//even though we are asking for a specific culture URL, there are no domains assigned so all that can be returned is a normal relative url.
- var url = umbracoContext.UrlProvider.GetUrl(1234, culture: "fr-FR");
+ var url = publishedUrlProvider.GetUrl(1234, culture: "fr-FR");
Assert.AreEqual("/home/test-fr/", url);
}
@@ -231,15 +251,17 @@ namespace Umbraco.Tests.Routing
snapshotService.Setup(x => x.CreatePublishedSnapshot(It.IsAny()))
.Returns(snapshot);
- var umbracoContext = GetUmbracoContext(currentUri, umbracoSettings: umbracoSettings,
- urlProviders: new[] {
- new DefaultUrlProvider(umbracoSettings.RequestHandler, Logger, globalSettings.Object, new SiteDomainHelper(), UriUtility)
- },
+
+ var umbracoContext = GetUmbracoContext(currentUri,
globalSettings: globalSettings.Object,
snapshotService: snapshotService.Object);
+ var umbracoContextAccessor = new TestUmbracoContextAccessor(umbracoContext);
+ var urlProvider = new DefaultUrlProvider(umbracoSettings.RequestHandler, Logger, globalSettings.Object,
+ new SiteDomainHelper(), umbracoContextAccessor, UriUtility);
+ var publishedUrlProvider = GetPublishedUrlProvider(umbracoContext, urlProvider);
- var url = umbracoContext.UrlProvider.GetUrl(1234, culture: "fr-FR");
+ var url = publishedUrlProvider.GetUrl(1234, culture: "fr-FR");
Assert.AreEqual("/home/test-fr/", url);
}
@@ -285,15 +307,16 @@ namespace Umbraco.Tests.Routing
snapshotService.Setup(x => x.CreatePublishedSnapshot(It.IsAny()))
.Returns(snapshot);
- var umbracoContext = GetUmbracoContext(currentUri, umbracoSettings: umbracoSettings,
- urlProviders: new[] {
- new DefaultUrlProvider(umbracoSettings.RequestHandler, Logger, globalSettings.Object, new SiteDomainHelper(), UriUtility)
- },
+ var umbracoContext = GetUmbracoContext(currentUri,
globalSettings: globalSettings.Object,
snapshotService: snapshotService.Object);
+ var umbracoContextAccessor = new TestUmbracoContextAccessor(umbracoContext);
+ var urlProvider = new DefaultUrlProvider(umbracoSettings.RequestHandler, Logger, globalSettings.Object,
+ new SiteDomainHelper(), umbracoContextAccessor, UriUtility);
- var url = umbracoContext.UrlProvider.GetUrl(1234, culture: "fr-FR");
+ var publishedUrlProvider = GetPublishedUrlProvider(umbracoContext, urlProvider);
+ var url = publishedUrlProvider.GetUrl(1234, culture: "fr-FR");
//the current uri is not the culture specific domain we want, so the result is an absolute path to the culture specific domain
Assert.AreEqual("http://example.fr/home/test-fr/", url);
@@ -307,15 +330,17 @@ namespace Umbraco.Tests.Routing
var umbracoSettings = Current.Configs.Settings();
- var umbracoContext = GetUmbracoContext("http://example.com/test", 1111, umbracoSettings: umbracoSettings, urlProviders: new[]
- {
- new DefaultUrlProvider(umbracoSettings.RequestHandler, Logger, globalSettings.Object, new SiteDomainHelper(), UriUtility)
- }, globalSettings: globalSettings.Object);
- Assert.AreEqual("/home/sub1/custom-sub-1/", umbracoContext.UrlProvider.GetUrl(1177));
+ var umbracoContext = GetUmbracoContext("http://example.com/test", 1111, globalSettings: globalSettings.Object);
+ var umbracoContextAccessor = new TestUmbracoContextAccessor(umbracoContext);
+ var urlProvider = new DefaultUrlProvider(umbracoSettings.RequestHandler, Logger, globalSettings.Object,
+ new SiteDomainHelper(), umbracoContextAccessor, UriUtility);
+ var publishedUrlProvider = GetPublishedUrlProvider(umbracoContext, urlProvider);
- umbracoContext.UrlProvider.Mode = UrlMode.Absolute;
- Assert.AreEqual("http://example.com/home/sub1/custom-sub-1/", umbracoContext.UrlProvider.GetUrl(1177));
+ Assert.AreEqual("/home/sub1/custom-sub-1/", publishedUrlProvider.GetUrl(1177));
+
+ publishedUrlProvider.Mode = UrlMode.Absolute;
+ Assert.AreEqual("http://example.com/home/sub1/custom-sub-1/", publishedUrlProvider.GetUrl(1177));
}
[Test]
@@ -326,18 +351,18 @@ namespace Umbraco.Tests.Routing
var umbracoSettings = Current.Configs.Settings();
- var umbracoContext = GetUmbracoContext("http://example.com/test", 1111, urlProviders: new[]
- {
- new DefaultUrlProvider(umbracoSettings.RequestHandler, Logger, globalSettings.Object, new SiteDomainHelper(), UriUtility)
- }, globalSettings: globalSettings.Object);
+ var urlProvider = new DefaultUrlProvider(umbracoSettings.RequestHandler, Logger, globalSettings.Object,
+ new SiteDomainHelper(), UmbracoContextAccessor, UriUtility);
+ var umbracoContext = GetUmbracoContext("http://example.com/test", 1111, globalSettings: globalSettings.Object);
+ var publishedUrlProvider = GetPublishedUrlProvider(umbracoContext, urlProvider);
//mock the Umbraco settings that we need
- Assert.AreEqual("#", umbracoContext.UrlProvider.GetUrl(999999));
+ Assert.AreEqual("#", publishedUrlProvider.GetUrl(999999));
- umbracoContext.UrlProvider.Mode = UrlMode.Absolute;
+ publishedUrlProvider.Mode = UrlMode.Absolute;
- Assert.AreEqual("#", umbracoContext.UrlProvider.GetUrl(999999));
+ Assert.AreEqual("#", publishedUrlProvider.GetUrl(999999));
}
}
}
diff --git a/src/Umbraco.Tests/Routing/UrlsProviderWithDomainsTests.cs b/src/Umbraco.Tests/Routing/UrlsProviderWithDomainsTests.cs
index 8fc099c90d..ab2883ac37 100644
--- a/src/Umbraco.Tests/Routing/UrlsProviderWithDomainsTests.cs
+++ b/src/Umbraco.Tests/Routing/UrlsProviderWithDomainsTests.cs
@@ -4,13 +4,14 @@ using System.Linq;
using Moq;
using NUnit.Framework;
using Umbraco.Core;
-using Umbraco.Core.Composing;
using Umbraco.Core.Configuration;
using Umbraco.Core.Models;
using Umbraco.Core.Models.PublishedContent;
using Umbraco.Core.Services;
using Umbraco.Tests.LegacyXmlPublishedCache;
using Umbraco.Tests.TestHelpers;
+using Umbraco.Tests.Testing.Objects.Accessors;
+using Umbraco.Web;
using Umbraco.Web.Routing;
namespace Umbraco.Tests.Routing
@@ -18,6 +19,7 @@ namespace Umbraco.Tests.Routing
[TestFixture]
public class UrlsProviderWithDomainsTests : UrlRoutingTestBase
{
+ private IUmbracoContextAccessor UmbracoContextAccessor { get; } = new TestUmbracoContextAccessor();
protected override void Compose()
{
base.Compose();
@@ -181,16 +183,17 @@ namespace Umbraco.Tests.Routing
var globalSettings = Mock.Get(Factory.GetInstance()); //this will modify the IGlobalSettings instance stored in the container
globalSettings.Setup(x => x.HideTopLevelNodeFromPath).Returns(false); // ignored w/domains
- var umbracoContext = GetUmbracoContext("/test", 1111, umbracoSettings: settings, urlProviders: new[]
- {
- new DefaultUrlProvider(settings.RequestHandler, Logger, globalSettings.Object, new SiteDomainHelper(), UriUtility)
- }, globalSettings:globalSettings.Object);
+ var umbracoContext = GetUmbracoContext("/test", 1111, globalSettings:globalSettings.Object);
+ var umbracoContextAccessor = new TestUmbracoContextAccessor(umbracoContext);
+ var urlProvider = new DefaultUrlProvider(settings.RequestHandler, Logger, globalSettings.Object,
+ new SiteDomainHelper(), umbracoContextAccessor, UriUtility);
+ var publishedUrlProvider = GetPublishedUrlProvider(umbracoContext, urlProvider);
SetDomains1();
var currentUri = new Uri(currentUrl);
var mode = absolute ? UrlMode.Absolute : UrlMode.Auto;
- var result = umbracoContext.UrlProvider.GetUrl(nodeId, mode, current: currentUri);
+ var result = publishedUrlProvider.GetUrl(nodeId, mode, current: currentUri);
Assert.AreEqual(expected, result);
}
@@ -214,16 +217,17 @@ namespace Umbraco.Tests.Routing
var globalSettings = Mock.Get(Factory.GetInstance()); //this will modify the IGlobalSettings instance stored in the container
globalSettings.Setup(x => x.HideTopLevelNodeFromPath).Returns(false); // ignored w/domains
- var umbracoContext = GetUmbracoContext("/test", 1111, umbracoSettings: settings, urlProviders: new[]
- {
- new DefaultUrlProvider(settings.RequestHandler, Logger, globalSettings.Object, new SiteDomainHelper(), UriUtility)
- }, globalSettings:globalSettings.Object);
+ var umbracoContext = GetUmbracoContext("/test", 1111, globalSettings:globalSettings.Object);
+ var umbracoContextAccessor = new TestUmbracoContextAccessor(umbracoContext);
+ var urlProvider = new DefaultUrlProvider(settings.RequestHandler, Logger, globalSettings.Object,
+ new SiteDomainHelper(), umbracoContextAccessor, UriUtility);
+ var publishedUrlProvider = GetPublishedUrlProvider(umbracoContext, urlProvider);
SetDomains2();
var currentUri = new Uri(currentUrl);
var mode = absolute ? UrlMode.Absolute : UrlMode.Auto;
- var result = umbracoContext.UrlProvider.GetUrl(nodeId, mode, current : currentUri);
+ var result = publishedUrlProvider.GetUrl(nodeId, mode, current : currentUri);
Assert.AreEqual(expected, result);
}
@@ -239,16 +243,17 @@ namespace Umbraco.Tests.Routing
var globalSettings = Mock.Get(Factory.GetInstance()); //this will modify the IGlobalSettings instance stored in the container
globalSettings.Setup(x => x.HideTopLevelNodeFromPath).Returns(false); // ignored w/domains
- var umbracoContext = GetUmbracoContext("/test", 1111, umbracoSettings: settings, urlProviders: new[]
- {
- new DefaultUrlProvider(settings.RequestHandler, Logger, globalSettings.Object, new SiteDomainHelper(), UriUtility)
- }, globalSettings:globalSettings.Object);
+ var umbracoContext = GetUmbracoContext("/test", 1111, globalSettings:globalSettings.Object);
+ var umbracoContextAccessor = new TestUmbracoContextAccessor(umbracoContext);
+ var urlProvider = new DefaultUrlProvider(settings.RequestHandler, Logger, globalSettings.Object,
+ new SiteDomainHelper(), umbracoContextAccessor, UriUtility);
+ var publishedUrlProvider = GetPublishedUrlProvider(umbracoContext, urlProvider);
SetDomains3();
var currentUri = new Uri(currentUrl);
var mode = absolute ? UrlMode.Absolute : UrlMode.Auto;
- var result = umbracoContext.UrlProvider.GetUrl(nodeId, mode, current : currentUri);
+ var result = publishedUrlProvider.GetUrl(nodeId, mode, current : currentUri);
Assert.AreEqual(expected, result);
}
@@ -270,16 +275,17 @@ namespace Umbraco.Tests.Routing
var globalSettings = Mock.Get(Factory.GetInstance()); //this will modify the IGlobalSettings instance stored in the container
globalSettings.Setup(x => x.HideTopLevelNodeFromPath).Returns(false); // ignored w/domains
- var umbracoContext = GetUmbracoContext("/test", 1111, umbracoSettings: settings, urlProviders: new[]
- {
- new DefaultUrlProvider(settings.RequestHandler, Logger, globalSettings.Object, new SiteDomainHelper(), UriUtility)
- }, globalSettings:globalSettings.Object);
+ var umbracoContext = GetUmbracoContext("/test", 1111, globalSettings:globalSettings.Object);
+ var umbracoContextAccessor = new TestUmbracoContextAccessor(umbracoContext);
+ var urlProvider = new DefaultUrlProvider(settings.RequestHandler, Logger, globalSettings.Object,
+ new SiteDomainHelper(), umbracoContextAccessor, UriUtility);
+ var publishedUrlProvider = GetPublishedUrlProvider(umbracoContext, urlProvider);
SetDomains4();
var currentUri = new Uri(currentUrl);
var mode = absolute ? UrlMode.Absolute : UrlMode.Auto;
- var result = umbracoContext.UrlProvider.GetUrl(nodeId, mode, current : currentUri);
+ var result = publishedUrlProvider.GetUrl(nodeId, mode, current : currentUri);
Assert.AreEqual(expected, result);
}
@@ -291,25 +297,26 @@ namespace Umbraco.Tests.Routing
var globalSettings = Mock.Get(Factory.GetInstance()); //this will modify the IGlobalSettings instance stored in the container
globalSettings.Setup(x => x.HideTopLevelNodeFromPath).Returns(false); // ignored w/domains
- var umbracoContext = GetUmbracoContext("/test", 1111, umbracoSettings: settings, urlProviders: new[]
- {
- new DefaultUrlProvider(settings.RequestHandler, Logger, globalSettings.Object, new SiteDomainHelper(), UriUtility)
- }, globalSettings:globalSettings.Object);
+ var umbracoContext = GetUmbracoContext("/test", 1111, globalSettings:globalSettings.Object);
+ var umbracoContextAccessor = new TestUmbracoContextAccessor(umbracoContext);
+ var urlProvider = new DefaultUrlProvider(settings.RequestHandler, Logger, globalSettings.Object,
+ new SiteDomainHelper(), umbracoContextAccessor, UriUtility);
+ var publishedUrlProvider = GetPublishedUrlProvider(umbracoContext, urlProvider);
SetDomains4();
string ignore;
- ignore = umbracoContext.UrlProvider.GetUrl(1001, UrlMode.Auto, current: new Uri("http://domain1.com"));
- ignore = umbracoContext.UrlProvider.GetUrl(10011, UrlMode.Auto, current: new Uri("http://domain1.com"));
- ignore = umbracoContext.UrlProvider.GetUrl(100111, UrlMode.Auto, current: new Uri("http://domain1.com"));
- ignore = umbracoContext.UrlProvider.GetUrl(10012, UrlMode.Auto, current: new Uri("http://domain1.com"));
- ignore = umbracoContext.UrlProvider.GetUrl(100121, UrlMode.Auto, current: new Uri("http://domain1.com"));
- ignore = umbracoContext.UrlProvider.GetUrl(10013, UrlMode.Auto, current: new Uri("http://domain1.com"));
- ignore = umbracoContext.UrlProvider.GetUrl(1002, UrlMode.Auto, current: new Uri("http://domain1.com"));
- ignore = umbracoContext.UrlProvider.GetUrl(1001, UrlMode.Auto, current: new Uri("http://domain2.com"));
- ignore = umbracoContext.UrlProvider.GetUrl(10011, UrlMode.Auto, current: new Uri("http://domain2.com"));
- ignore = umbracoContext.UrlProvider.GetUrl(100111, UrlMode.Auto, current: new Uri("http://domain2.com"));
- ignore = umbracoContext.UrlProvider.GetUrl(1002, UrlMode.Auto, current: new Uri("http://domain2.com"));
+ ignore = publishedUrlProvider.GetUrl(1001, UrlMode.Auto, current: new Uri("http://domain1.com"));
+ ignore = publishedUrlProvider.GetUrl(10011, UrlMode.Auto, current: new Uri("http://domain1.com"));
+ ignore = publishedUrlProvider.GetUrl(100111, UrlMode.Auto, current: new Uri("http://domain1.com"));
+ ignore = publishedUrlProvider.GetUrl(10012, UrlMode.Auto, current: new Uri("http://domain1.com"));
+ ignore = publishedUrlProvider.GetUrl(100121, UrlMode.Auto, current: new Uri("http://domain1.com"));
+ ignore = publishedUrlProvider.GetUrl(10013, UrlMode.Auto, current: new Uri("http://domain1.com"));
+ ignore = publishedUrlProvider.GetUrl(1002, UrlMode.Auto, current: new Uri("http://domain1.com"));
+ ignore = publishedUrlProvider.GetUrl(1001, UrlMode.Auto, current: new Uri("http://domain2.com"));
+ ignore = publishedUrlProvider.GetUrl(10011, UrlMode.Auto, current: new Uri("http://domain2.com"));
+ ignore = publishedUrlProvider.GetUrl(100111, UrlMode.Auto, current: new Uri("http://domain2.com"));
+ ignore = publishedUrlProvider.GetUrl(1002, UrlMode.Auto, current: new Uri("http://domain2.com"));
var cache = umbracoContext.Content as PublishedContentCache;
if (cache == null) throw new Exception("Unsupported IPublishedContentCache, only the Xml one is supported.");
@@ -328,15 +335,15 @@ namespace Umbraco.Tests.Routing
CheckRoute(cachedRoutes, cachedIds, 1002, "/1002");
// use the cache
- Assert.AreEqual("/", umbracoContext.UrlProvider.GetUrl(1001, UrlMode.Auto, current: new Uri("http://domain1.com")));
- Assert.AreEqual("/en/", umbracoContext.UrlProvider.GetUrl(10011, UrlMode.Auto, current: new Uri("http://domain1.com")));
- Assert.AreEqual("/en/1001-1-1/", umbracoContext.UrlProvider.GetUrl(100111, UrlMode.Auto, current: new Uri("http://domain1.com")));
- Assert.AreEqual("/fr/", umbracoContext.UrlProvider.GetUrl(10012, UrlMode.Auto, current: new Uri("http://domain1.com")));
- Assert.AreEqual("/fr/1001-2-1/", umbracoContext.UrlProvider.GetUrl(100121, UrlMode.Auto, current: new Uri("http://domain1.com")));
- Assert.AreEqual("/1001-3/", umbracoContext.UrlProvider.GetUrl(10013, UrlMode.Auto, current: new Uri("http://domain1.com")));
- Assert.AreEqual("/1002/", umbracoContext.UrlProvider.GetUrl(1002, UrlMode.Auto, current: new Uri("http://domain1.com")));
+ Assert.AreEqual("/", publishedUrlProvider.GetUrl(1001, UrlMode.Auto, current: new Uri("http://domain1.com")));
+ Assert.AreEqual("/en/", publishedUrlProvider.GetUrl(10011, UrlMode.Auto, current: new Uri("http://domain1.com")));
+ Assert.AreEqual("/en/1001-1-1/", publishedUrlProvider.GetUrl(100111, UrlMode.Auto, current: new Uri("http://domain1.com")));
+ Assert.AreEqual("/fr/", publishedUrlProvider.GetUrl(10012, UrlMode.Auto, current: new Uri("http://domain1.com")));
+ Assert.AreEqual("/fr/1001-2-1/", publishedUrlProvider.GetUrl(100121, UrlMode.Auto, current: new Uri("http://domain1.com")));
+ Assert.AreEqual("/1001-3/", publishedUrlProvider.GetUrl(10013, UrlMode.Auto, current: new Uri("http://domain1.com")));
+ Assert.AreEqual("/1002/", publishedUrlProvider.GetUrl(1002, UrlMode.Auto, current: new Uri("http://domain1.com")));
- Assert.AreEqual("http://domain1.com/fr/1001-2-1/", umbracoContext.UrlProvider.GetUrl(100121, UrlMode.Auto, current: new Uri("http://domain2.com")));
+ Assert.AreEqual("http://domain1.com/fr/1001-2-1/", publishedUrlProvider.GetUrl(100121, UrlMode.Auto, current: new Uri("http://domain2.com")));
}
private static void CheckRoute(IDictionary routes, IDictionary ids, int id, string route)
@@ -354,20 +361,21 @@ namespace Umbraco.Tests.Routing
var globalSettings = Mock.Get(Factory.GetInstance()); //this will modify the IGlobalSettings instance stored in the container
globalSettings.Setup(x => x.HideTopLevelNodeFromPath).Returns(false); // ignored w/domains
- var umbracoContext = GetUmbracoContext("http://domain1.com/test", 1111, umbracoSettings: settings, urlProviders: new[]
- {
- new DefaultUrlProvider(settings.RequestHandler, Logger, globalSettings.Object, new SiteDomainHelper(), UriUtility)
- }, globalSettings:globalSettings.Object);
+ var umbracoContext = GetUmbracoContext("http://domain1.com/test", 1111, globalSettings:globalSettings.Object);
+ var umbracoContextAccessor = new TestUmbracoContextAccessor(umbracoContext);
+ var urlProvider = new DefaultUrlProvider(settings.RequestHandler, Logger, globalSettings.Object,
+ new SiteDomainHelper(), umbracoContextAccessor, UriUtility);
+ var publishedUrlProvider = GetPublishedUrlProvider(umbracoContext, urlProvider);
SetDomains4();
- Assert.AreEqual("/en/1001-1-1/", umbracoContext.UrlProvider.GetUrl(100111));
- Assert.AreEqual("http://domain3.com/en/1003-1-1/", umbracoContext.UrlProvider.GetUrl(100311));
+ Assert.AreEqual("/en/1001-1-1/", publishedUrlProvider.GetUrl(100111));
+ Assert.AreEqual("http://domain3.com/en/1003-1-1/", publishedUrlProvider.GetUrl(100311));
- umbracoContext.UrlProvider.Mode = UrlMode.Absolute;
+ publishedUrlProvider.Mode = UrlMode.Absolute;
- Assert.AreEqual("http://domain1.com/en/1001-1-1/", umbracoContext.UrlProvider.GetUrl(100111));
- Assert.AreEqual("http://domain3.com/en/1003-1-1/", umbracoContext.UrlProvider.GetUrl(100311));
+ Assert.AreEqual("http://domain1.com/en/1001-1-1/", publishedUrlProvider.GetUrl(100111));
+ Assert.AreEqual("http://domain3.com/en/1003-1-1/", publishedUrlProvider.GetUrl(100311));
}
[Test]
@@ -378,17 +386,18 @@ namespace Umbraco.Tests.Routing
var globalSettings = Mock.Get(Factory.GetInstance()); //this will modify the IGlobalSettings instance stored in the container
globalSettings.Setup(x => x.HideTopLevelNodeFromPath).Returns(false); // ignored w/domains
- var umbracoContext = GetUmbracoContext("http://domain1.com/en/test", 1111, umbracoSettings: settings, urlProviders: new[]
- {
- new DefaultUrlProvider(settings.RequestHandler, Logger, globalSettings.Object, new SiteDomainHelper(), UriUtility)
- }, globalSettings:globalSettings.Object);
+ var umbracoContext = GetUmbracoContext("http://domain1.com/en/test", 1111, globalSettings:globalSettings.Object);
+ var umbracoContextAccessor = new TestUmbracoContextAccessor(umbracoContext);
+ var urlProvider = new DefaultUrlProvider(settings.RequestHandler, Logger, globalSettings.Object,
+ new SiteDomainHelper(), umbracoContextAccessor, UriUtility);
+ var publishedUrlProvider = GetPublishedUrlProvider(umbracoContext, urlProvider);
SetDomains5();
- var url = umbracoContext.UrlProvider.GetUrl(100111, UrlMode.Absolute);
+ var url = publishedUrlProvider.GetUrl(100111, UrlMode.Absolute);
Assert.AreEqual("http://domain1.com/en/1001-1-1/", url);
- var result = umbracoContext.UrlProvider.GetOtherUrls(100111).ToArray();
+ var result = publishedUrlProvider.GetOtherUrls(100111).ToArray();
foreach (var x in result) Console.WriteLine(x);
@@ -396,5 +405,16 @@ namespace Umbraco.Tests.Routing
Assert.AreEqual(result[0].Text, "http://domain1b.com/en/1001-1-1/");
Assert.AreEqual(result[1].Text, "http://domain1a.com/en/1001-1-1/");
}
+
+ private IPublishedUrlProvider GetPublishedUrlProvider(IUmbracoContext umbracoContext, DefaultUrlProvider urlProvider)
+ {
+ return new UrlProvider(
+ new TestUmbracoContextAccessor(umbracoContext),
+ TestHelper.WebRoutingSection,
+ new UrlProviderCollection(new []{urlProvider}),
+ new MediaUrlProviderCollection(Enumerable.Empty()),
+ Mock.Of()
+ );
+ }
}
}
diff --git a/src/Umbraco.Tests/Routing/UrlsWithNestedDomains.cs b/src/Umbraco.Tests/Routing/UrlsWithNestedDomains.cs
index c472e8d697..ad6e7b5408 100644
--- a/src/Umbraco.Tests/Routing/UrlsWithNestedDomains.cs
+++ b/src/Umbraco.Tests/Routing/UrlsWithNestedDomains.cs
@@ -1,8 +1,8 @@
using System;
+using System.Linq;
using Moq;
using NUnit.Framework;
using Umbraco.Core;
-using Umbraco.Core.Composing;
using Umbraco.Core.Configuration;
using Umbraco.Core.Models;
using Umbraco.Core.Models.PublishedContent;
@@ -10,6 +10,8 @@ using Umbraco.Tests.TestHelpers;
using Umbraco.Web.Routing;
using Umbraco.Core.Services;
using Umbraco.Tests.LegacyXmlPublishedCache;
+using Umbraco.Tests.Testing.Objects.Accessors;
+using Umbraco.Web;
namespace Umbraco.Tests.Routing
{
@@ -41,11 +43,13 @@ namespace Umbraco.Tests.Routing
const string url = "http://domain1.com/1001-1/1001-1-1";
// get the nice url for 100111
- var umbracoContext = GetUmbracoContext(url, 9999, umbracoSettings: settings, urlProviders: new []
- {
- new DefaultUrlProvider(settings.RequestHandler, Logger, globalSettings.Object, new SiteDomainHelper(), UriUtility)
- }, globalSettings:globalSettings.Object);
- Assert.AreEqual("http://domain2.com/1001-1-1/", umbracoContext.UrlProvider.GetUrl(100111, UrlMode.Absolute));
+ var umbracoContext = GetUmbracoContext(url, 9999, globalSettings:globalSettings.Object);
+ var umbracoContextAccessor = new TestUmbracoContextAccessor(umbracoContext);
+ var urlProvider = new DefaultUrlProvider(settings.RequestHandler, Logger, globalSettings.Object,
+ new SiteDomainHelper(), umbracoContextAccessor, UriUtility);
+ var publishedUrlProvider = GetPublishedUrlProvider(umbracoContext, urlProvider);
+
+ Assert.AreEqual("http://domain2.com/1001-1-1/", publishedUrlProvider.GetUrl(100111, UrlMode.Absolute));
// check that the proper route has been cached
var cache = umbracoContext.Content as PublishedContentCache;
@@ -72,10 +76,15 @@ namespace Umbraco.Tests.Routing
//Assert.AreEqual("1001/1001-1/1001-1-1", cachedRoutes[100111]); // yes
// what's the nice url now?
- Assert.AreEqual("http://domain2.com/1001-1-1/", umbracoContext.UrlProvider.GetUrl(100111)); // good
+ Assert.AreEqual("http://domain2.com/1001-1-1/", publishedUrlProvider.GetUrl(100111)); // good
//Assert.AreEqual("http://domain1.com/1001-1/1001-1-1", routingContext.NiceUrlProvider.GetNiceUrl(100111, true)); // bad
}
+ private IPublishedUrlProvider GetPublishedUrlProvider(IUmbracoContext umbracoContext, object urlProvider)
+ {
+ throw new NotImplementedException();
+ }
+
void SetDomains1()
{
SetupDomainServiceMock(new[]
@@ -86,6 +95,17 @@ namespace Umbraco.Tests.Routing
}
+ private IPublishedUrlProvider GetPublishedUrlProvider(IUmbracoContext umbracoContext, DefaultUrlProvider urlProvider)
+ {
+ return new UrlProvider(
+ new TestUmbracoContextAccessor(umbracoContext),
+ TestHelper.WebRoutingSection,
+ new UrlProviderCollection(new []{urlProvider}),
+ new MediaUrlProviderCollection(Enumerable.Empty()),
+ Mock.Of()
+ );
+ }
+
protected override string GetXmlContent(int templateId)
{
return @"
diff --git a/src/Umbraco.Tests/Runtimes/StandaloneTests.cs b/src/Umbraco.Tests/Runtimes/StandaloneTests.cs
index b0e0c1138b..6811f9f8de 100644
--- a/src/Umbraco.Tests/Runtimes/StandaloneTests.cs
+++ b/src/Umbraco.Tests/Runtimes/StandaloneTests.cs
@@ -193,10 +193,8 @@ namespace Umbraco.Tests.Runtimes
Assert.AreEqual("test", content.Name);
// need an UmbracoCOntext to access the cache
- // FIXME: not exactly pretty, should not depend on HttpContext
- var httpContext = Mock.Of();
var umbracoContextFactory = factory.GetInstance();
- var umbracoContextReference = umbracoContextFactory.EnsureUmbracoContext(httpContext);
+ var umbracoContextReference = umbracoContextFactory.EnsureUmbracoContext();
var umbracoContext = umbracoContextReference.UmbracoContext;
// assert that there is no published document
diff --git a/src/Umbraco.Tests/Scoping/ScopedNuCacheTests.cs b/src/Umbraco.Tests/Scoping/ScopedNuCacheTests.cs
index 6af0c39ea5..d0b63f8492 100644
--- a/src/Umbraco.Tests/Scoping/ScopedNuCacheTests.cs
+++ b/src/Umbraco.Tests/Scoping/ScopedNuCacheTests.cs
@@ -117,15 +117,12 @@ namespace Umbraco.Tests.Scoping
var service = PublishedSnapshotService as PublishedSnapshotService;
var httpContext = GetHttpContextFactory(url, routeData).HttpContext;
-
+ var httpContextAccessor = TestHelper.GetHttpContextAccessor(httpContext);
var globalSettings = TestObjects.GetGlobalSettings();
var umbracoContext = new UmbracoContext(
- httpContext,
+ httpContextAccessor,
service,
- new WebSecurity(httpContext, Current.Services.UserService, globalSettings, IOHelper),
- umbracoSettings ?? SettingsForTests.GetDefaultUmbracoSettings(),
- urlProviders ?? Enumerable.Empty(),
- Enumerable.Empty(),
+ new WebSecurity(httpContextAccessor, Current.Services.UserService, globalSettings, IOHelper),
globalSettings,
new TestVariationContextAccessor(),
IOHelper,
diff --git a/src/Umbraco.Tests/Security/BackOfficeCookieManagerTests.cs b/src/Umbraco.Tests/Security/BackOfficeCookieManagerTests.cs
index 6511008dba..30c61350b9 100644
--- a/src/Umbraco.Tests/Security/BackOfficeCookieManagerTests.cs
+++ b/src/Umbraco.Tests/Security/BackOfficeCookieManagerTests.cs
@@ -7,8 +7,8 @@ using Microsoft.Owin;
using Moq;
using NUnit.Framework;
using Umbraco.Core;
-using Umbraco.Web.Composing;
using Umbraco.Tests.TestHelpers;
+using Umbraco.Web.Composing;
using Umbraco.Tests.Testing;
using Umbraco.Tests.Testing.Objects.Accessors;
using Umbraco.Web;
@@ -29,17 +29,19 @@ namespace Umbraco.Tests.Security
//should force app ctx to show not-configured
ConfigurationManager.AppSettings.Set(Constants.AppSettings.ConfigurationStatus, "");
+ var httpContextAccessor = TestHelper.GetHttpContextAccessor();
var globalSettings = TestObjects.GetGlobalSettings();
var umbracoContext = new UmbracoContext(
- Mock.Of(),
+ httpContextAccessor,
Mock.Of(),
- new WebSecurity(Mock.Of(), Current.Services.UserService, globalSettings, IOHelper),
- TestObjects.GetUmbracoSettings(), new List(), Enumerable.Empty(), globalSettings,
- new TestVariationContextAccessor(), IOHelper, UriUtility);
+ new WebSecurity(httpContextAccessor, Current.Services.UserService, globalSettings, IOHelper), globalSettings,
+ new TestVariationContextAccessor(),
+ IOHelper,
+ UriUtility);
var runtime = Mock.Of(x => x.Level == RuntimeLevel.Install);
var mgr = new BackOfficeCookieManager(
- Mock.Of(accessor => accessor.UmbracoContext == umbracoContext), runtime, TestObjects.GetGlobalSettings(), TestHelper.IOHelper);
+ Mock.Of(accessor => accessor.UmbracoContext == umbracoContext), runtime, TestObjects.GetGlobalSettings(), IOHelper, AppCaches.RequestCache);
var result = mgr.ShouldAuthenticateRequest(Mock.Of(), new Uri("http://localhost/umbraco"));
@@ -49,16 +51,19 @@ namespace Umbraco.Tests.Security
[Test]
public void ShouldAuthenticateRequest_When_Configured()
{
+ var httpContextAccessor = TestHelper.GetHttpContextAccessor();
var globalSettings = TestObjects.GetGlobalSettings();
var umbCtx = new UmbracoContext(
- Mock.Of(),
+ httpContextAccessor,
Mock.Of(),
- new WebSecurity(Mock.Of(), Current.Services.UserService, globalSettings, IOHelper),
- TestObjects.GetUmbracoSettings(), new List(), Enumerable.Empty(), globalSettings,
- new TestVariationContextAccessor(), IOHelper, UriUtility);
+ new WebSecurity(httpContextAccessor, Current.Services.UserService, globalSettings, IOHelper),
+ globalSettings,
+ new TestVariationContextAccessor(),
+ IOHelper,
+ UriUtility);
var runtime = Mock.Of(x => x.Level == RuntimeLevel.Run);
- var mgr = new BackOfficeCookieManager(Mock.Of(accessor => accessor.UmbracoContext == umbCtx), runtime, TestObjects.GetGlobalSettings(), TestHelper.IOHelper);
+ var mgr = new BackOfficeCookieManager(Mock.Of(accessor => accessor.UmbracoContext == umbCtx), runtime, TestObjects.GetGlobalSettings(), IOHelper, AppCaches.RequestCache);
var request = new Mock();
request.Setup(owinRequest => owinRequest.Uri).Returns(new Uri("http://localhost/umbraco"));
diff --git a/src/Umbraco.Tests/Services/ContentTypeServiceVariantsTests.cs b/src/Umbraco.Tests/Services/ContentTypeServiceVariantsTests.cs
index 8653aa3c58..2c22b98262 100644
--- a/src/Umbraco.Tests/Services/ContentTypeServiceVariantsTests.cs
+++ b/src/Umbraco.Tests/Services/ContentTypeServiceVariantsTests.cs
@@ -20,6 +20,7 @@ using Umbraco.Core.Services;
using Umbraco.Core.Strings;
using Umbraco.Core.Sync;
using Umbraco.Tests.Strings;
+using Umbraco.Tests.TestHelpers;
using Umbraco.Tests.TestHelpers.Entities;
using Umbraco.Tests.Testing;
using Umbraco.Web.PublishedCache;
diff --git a/src/Umbraco.Tests/Templates/HtmlImageSourceParserTests.cs b/src/Umbraco.Tests/Templates/HtmlImageSourceParserTests.cs
index 141a0a916d..43d97523d2 100644
--- a/src/Umbraco.Tests/Templates/HtmlImageSourceParserTests.cs
+++ b/src/Umbraco.Tests/Templates/HtmlImageSourceParserTests.cs
@@ -13,6 +13,7 @@ using System.Linq;
using Umbraco.Core.Models;
using Umbraco.Core;
using System.Diagnostics;
+using Umbraco.Tests.TestHelpers;
namespace Umbraco.Tests.Templates
{
@@ -28,8 +29,7 @@ namespace Umbraco.Tests.Templates
";
- var umbracoContextAccessor = new TestUmbracoContextAccessor();
- var imageSourceParser = new HtmlImageSourceParser(umbracoContextAccessor);
+ var imageSourceParser = new HtmlImageSourceParser(Mock.Of());
var result = imageSourceParser.FindUdisFromDataAttributes(input).ToList();
Assert.AreEqual(2, result.Count);
@@ -40,8 +40,7 @@ namespace Umbraco.Tests.Templates
[Test]
public void Remove_Image_Sources()
{
- var umbracoContextAccessor = new TestUmbracoContextAccessor();
- var imageSourceParser = new HtmlImageSourceParser(umbracoContextAccessor);
+ var imageSourceParser = new HtmlImageSourceParser(Mock.Of());
var result = imageSourceParser.RemoveImageSources(@"
@@ -69,21 +68,27 @@ namespace Umbraco.Tests.Templates
var media = new Mock();
media.Setup(x => x.ContentType).Returns(mediaType);
var mediaUrlProvider = new Mock();
- mediaUrlProvider.Setup(x => x.GetMediaUrl(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()))
+ mediaUrlProvider.Setup(x => x.GetMediaUrl(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()))
.Returns(UrlInfo.Url("/media/1001/my-image.jpg"));
var umbracoContextAccessor = new TestUmbracoContextAccessor();
var umbracoContextFactory = TestUmbracoContextFactory.Create(
- mediaUrlProvider: mediaUrlProvider.Object,
umbracoContextAccessor: umbracoContextAccessor);
- using (var reference = umbracoContextFactory.EnsureUmbracoContext(Mock.Of()))
+
+ var publishedUrlProvider = new UrlProvider(umbracoContextAccessor,
+ TestHelper.WebRoutingSection,
+ new UrlProviderCollection(Enumerable.Empty()),
+ new MediaUrlProviderCollection(new []{mediaUrlProvider.Object}),
+ Mock.Of()
+ );
+ using (var reference = umbracoContextFactory.EnsureUmbracoContext())
{
var mediaCache = Mock.Get(reference.UmbracoContext.Media);
mediaCache.Setup(x => x.GetById(It.IsAny())).Returns(media.Object);
- var imageSourceParser = new HtmlImageSourceParser(umbracoContextAccessor);
+ var imageSourceParser = new HtmlImageSourceParser(publishedUrlProvider);
var result = imageSourceParser.EnsureImageSources(@"
diff --git a/src/Umbraco.Tests/Templates/HtmlLocalLinkParserTests.cs b/src/Umbraco.Tests/Templates/HtmlLocalLinkParserTests.cs
index 5560e39152..f350a5d702 100644
--- a/src/Umbraco.Tests/Templates/HtmlLocalLinkParserTests.cs
+++ b/src/Umbraco.Tests/Templates/HtmlLocalLinkParserTests.cs
@@ -6,6 +6,7 @@ using System.Web;
using Umbraco.Core;
using Umbraco.Core.Models;
using Umbraco.Core.Models.PublishedContent;
+using Umbraco.Tests.TestHelpers;
using Umbraco.Tests.Testing.Objects;
using Umbraco.Tests.Testing.Objects.Accessors;
using Umbraco.Web;
@@ -30,7 +31,7 @@ namespace Umbraco.Tests.Templates
";
var umbracoContextAccessor = new TestUmbracoContextAccessor();
- var parser = new HtmlLocalLinkParser(umbracoContextAccessor);
+ var parser = new HtmlLocalLinkParser(umbracoContextAccessor, Mock.Of());
var result = parser.FindUdisFromLocalLinks(input).ToList();
@@ -52,7 +53,7 @@ namespace Umbraco.Tests.Templates
//setup a mock url provider which we'll use for testing
var contentUrlProvider = new Mock();
contentUrlProvider
- .Setup(x => x.GetUrl(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()))
+ .Setup(x => x.GetUrl( It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()))
.Returns(UrlInfo.Url("/my-test-url"));
var contentType = new PublishedContentType(666, "alias", PublishedItemType.Content, Enumerable.Empty(), Enumerable.Empty(), ContentVariation.Nothing);
var publishedContent = new Mock();
@@ -63,17 +64,21 @@ namespace Umbraco.Tests.Templates
var media = new Mock();
media.Setup(x => x.ContentType).Returns(mediaType);
var mediaUrlProvider = new Mock();
- mediaUrlProvider.Setup(x => x.GetMediaUrl(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()))
+ mediaUrlProvider.Setup(x => x.GetMediaUrl(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()))
.Returns(UrlInfo.Url("/media/1001/my-image.jpg"));
var umbracoContextAccessor = new TestUmbracoContextAccessor();
var umbracoContextFactory = TestUmbracoContextFactory.Create(
- urlProvider: contentUrlProvider.Object,
- mediaUrlProvider: mediaUrlProvider.Object,
umbracoContextAccessor: umbracoContextAccessor);
- using (var reference = umbracoContextFactory.EnsureUmbracoContext(Mock.Of()))
+ var publishedUrlProvider = new UrlProvider(umbracoContextAccessor,
+ TestHelper.WebRoutingSection,
+ new UrlProviderCollection(new []{contentUrlProvider.Object}),
+ new MediaUrlProviderCollection(new []{mediaUrlProvider.Object}),
+ Mock.Of()
+ );
+ using (var reference = umbracoContextFactory.EnsureUmbracoContext())
{
var contentCache = Mock.Get(reference.UmbracoContext.Content);
contentCache.Setup(x => x.GetById(It.IsAny())).Returns(publishedContent.Object);
@@ -83,7 +88,7 @@ namespace Umbraco.Tests.Templates
mediaCache.Setup(x => x.GetById(It.IsAny())).Returns(media.Object);
mediaCache.Setup(x => x.GetById(It.IsAny())).Returns(media.Object);
- var linkParser = new HtmlLocalLinkParser(umbracoContextAccessor);
+ var linkParser = new HtmlLocalLinkParser(umbracoContextAccessor, publishedUrlProvider);
var output = linkParser.EnsureInternalLinks(input);
diff --git a/src/Umbraco.Tests/TestHelpers/BaseWebTest.cs b/src/Umbraco.Tests/TestHelpers/BaseWebTest.cs
index 9697f7dfd4..e8b4a993c4 100644
--- a/src/Umbraco.Tests/TestHelpers/BaseWebTest.cs
+++ b/src/Umbraco.Tests/TestHelpers/BaseWebTest.cs
@@ -29,6 +29,7 @@ namespace Umbraco.Tests.TestHelpers
protected override void Compose()
{
base.Compose();
+ base.Compose();
Composition.RegisterUnique();
Composition.RegisterUnique();
@@ -99,8 +100,9 @@ namespace Umbraco.Tests.TestHelpers
container?.TryGetInstance() ?? ServiceContext.CreatePartial(),
new ProfilingLogger(Mock.Of(), Mock.Of()),
container?.TryGetInstance() ?? Current.Factory.GetInstance(),
- Mock.Of(),
- Mock.Of());
+ Mock.Of(),
+ Mock.Of()
+ );
}
}
}
diff --git a/src/Umbraco.Tests/TestHelpers/ControllerTesting/TestControllerActivatorBase.cs b/src/Umbraco.Tests/TestHelpers/ControllerTesting/TestControllerActivatorBase.cs
index 5892b3e59c..055203b1cc 100644
--- a/src/Umbraco.Tests/TestHelpers/ControllerTesting/TestControllerActivatorBase.cs
+++ b/src/Umbraco.Tests/TestHelpers/ControllerTesting/TestControllerActivatorBase.cs
@@ -137,12 +137,10 @@ namespace Umbraco.Tests.TestHelpers.ControllerTesting
var umbracoContextAccessor = Umbraco.Web.Composing.Current.UmbracoContextAccessor;
- var umbCtx = new UmbracoContext(httpContext,
+ var httpContextAccessor = TestHelper.GetHttpContextAccessor(httpContext);
+ var umbCtx = new UmbracoContext(httpContextAccessor,
publishedSnapshotService.Object,
webSecurity.Object,
- Mock.Of(section => section.WebRouting == Mock.Of(routingSection => routingSection.UrlProviderMode == "Auto")),
- Enumerable.Empty(),
- Enumerable.Empty(),
globalSettings,
new TestVariationContextAccessor(),
TestHelper.IOHelper,
@@ -152,10 +150,10 @@ namespace Umbraco.Tests.TestHelpers.ControllerTesting
umbracoContextAccessor.UmbracoContext = umbCtx;
var urlHelper = new Mock();
- urlHelper.Setup(provider => provider.GetUrl(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()))
+ urlHelper.Setup(provider => provider.GetUrl(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()))
.Returns(UrlInfo.Url("/hello/world/1234"));
- var membershipHelper = new MembershipHelper(umbCtx.HttpContext, Mock.Of(), Mock.Of(), Mock.Of(), Mock.Of(), Mock.Of(), Mock.Of(), AppCaches.Disabled, Mock.Of(), new MockShortStringHelper(), Mock.Of());
+ var membershipHelper = new MembershipHelper(httpContextAccessor, Mock.Of(), Mock.Of(), Mock.Of(), Mock.Of(), Mock.Of(), Mock.Of(), AppCaches.Disabled, Mock.Of(), new MockShortStringHelper(), Mock.Of());
var umbHelper = new UmbracoHelper(Mock.Of(),
Mock.Of(),
diff --git a/src/Umbraco.Tests/TestHelpers/FakeHttpContextFactory.cs b/src/Umbraco.Tests/TestHelpers/FakeHttpContextFactory.cs
index 45f7042e31..cc14a7a023 100644
--- a/src/Umbraco.Tests/TestHelpers/FakeHttpContextFactory.cs
+++ b/src/Umbraco.Tests/TestHelpers/FakeHttpContextFactory.cs
@@ -109,12 +109,13 @@ namespace Umbraco.Tests.TestHelpers
requestContextMock.Setup(x => x.HttpContext).Returns(httpContextMock.Object);
- if (routeData != null)
+
+ if (routeData is null)
{
- requestContextMock.Setup(x => x.RouteData).Returns(routeData);
+ routeData = new RouteData();
}
-
+ requestContextMock.Setup(x => x.RouteData).Returns(routeData);
}
}
diff --git a/src/Umbraco.Tests/TestHelpers/TestHelper.cs b/src/Umbraco.Tests/TestHelpers/TestHelper.cs
index 6fa20943cb..41b97ac580 100644
--- a/src/Umbraco.Tests/TestHelpers/TestHelper.cs
+++ b/src/Umbraco.Tests/TestHelpers/TestHelper.cs
@@ -6,6 +6,7 @@ using System.IO;
using System.Linq;
using System.Reflection;
using System.Threading;
+using System.Web;
using Moq;
using NUnit.Framework;
using Umbraco.Core;
@@ -31,6 +32,7 @@ using Umbraco.Net;
using Umbraco.Tests.Testing.Objects.Accessors;
using Umbraco.Web;
using Umbraco.Web.Hosting;
+using Umbraco.Web.Routing;
using File = System.IO.File;
namespace Umbraco.Tests.TestHelpers
@@ -102,6 +104,8 @@ namespace Umbraco.Tests.TestHelpers
public static IMainDom MainDom { get; } = new MainDom(Mock.Of(), GetHostingEnvironment(), new MainDomSemaphoreLock(Mock.Of(), GetHostingEnvironment()));
public static UriUtility UriUtility { get; } = new UriUtility(GetHostingEnvironment());
+ public static IWebRoutingSection WebRoutingSection => SettingsForTests.GetDefaultUmbracoSettings().WebRouting;
+
///
/// Maps the given making it rooted on . must start with ~/
///
@@ -345,5 +349,31 @@ namespace Umbraco.Tests.TestHelpers
{
return new DictionaryAppCache();
}
+
+ public static IHttpContextAccessor GetHttpContextAccessor(HttpContextBase httpContextBase = null)
+ {
+ if (httpContextBase is null)
+ {
+ var httpContextMock = new Mock();
+
+ httpContextMock.Setup(x => x.DisposeOnPipelineCompleted(It.IsAny()))
+ .Returns(Mock.Of());
+
+ httpContextBase = httpContextMock.Object;
+ }
+
+ var mock = new Mock();
+
+ mock.Setup(x => x.HttpContext).Returns(httpContextBase);
+
+ return mock.Object;
+ }
+
+ public static IPublishedUrlProvider GetPublishedUrlProvider()
+ {
+ var mock = new Mock();
+
+ return mock.Object;
+ }
}
}
diff --git a/src/Umbraco.Tests/TestHelpers/TestObjects-Mocks.cs b/src/Umbraco.Tests/TestHelpers/TestObjects-Mocks.cs
index a969d3f8a4..25588bed62 100644
--- a/src/Umbraco.Tests/TestHelpers/TestObjects-Mocks.cs
+++ b/src/Umbraco.Tests/TestHelpers/TestObjects-Mocks.cs
@@ -111,7 +111,6 @@ namespace Umbraco.Tests.TestHelpers
/// This should be the minimum Umbraco context.
public IUmbracoContext GetUmbracoContextMock(IUmbracoContextAccessor accessor = null)
{
- var httpContext = Mock.Of();
var publishedSnapshotMock = new Mock();
publishedSnapshotMock.Setup(x => x.Members).Returns(Mock.Of());
@@ -120,27 +119,24 @@ namespace Umbraco.Tests.TestHelpers
publishedSnapshotServiceMock.Setup(x => x.CreatePublishedSnapshot(It.IsAny())).Returns(publishedSnapshot);
var publishedSnapshotService = publishedSnapshotServiceMock.Object;
- var umbracoSettings = GetUmbracoSettings();
var globalSettings = GetGlobalSettings();
- var urlProviders = new UrlProviderCollection(Enumerable.Empty());
- var mediaUrlProviders = new MediaUrlProviderCollection(Enumerable.Empty());
if (accessor == null) accessor = new TestUmbracoContextAccessor();
+ var httpContextAccessor = TestHelper.GetHttpContextAccessor();
+
var umbracoContextFactory = new UmbracoContextFactory(
accessor,
publishedSnapshotService,
new TestVariationContextAccessor(),
new TestDefaultCultureAccessor(),
- umbracoSettings,
globalSettings,
- urlProviders,
- mediaUrlProviders,
Mock.Of(),
TestHelper.IOHelper,
- TestHelper.UriUtility);
+ TestHelper.UriUtility,
+ httpContextAccessor);
- return umbracoContextFactory.EnsureUmbracoContext(httpContext).UmbracoContext;
+ return umbracoContextFactory.EnsureUmbracoContext().UmbracoContext;
}
public IUmbracoSettingsSection GetUmbracoSettings()
@@ -339,15 +335,6 @@ namespace Umbraco.Tests.TestHelpers
#endregion
- public IHttpContextAccessor GetHttpContextAccessor(HttpContextBase httpContextBase = null)
- {
- var mock = new Mock();
- var httpContext = UmbracoContextFactory.EnsureHttpContext(httpContextBase);
-
- mock.Setup(x => x.HttpContext).Returns(httpContext);
-
- return mock.Object;
- }
}
}
diff --git a/src/Umbraco.Tests/TestHelpers/TestWithDatabaseBase.cs b/src/Umbraco.Tests/TestHelpers/TestWithDatabaseBase.cs
index 15863a0c23..c2a44026d6 100644
--- a/src/Umbraco.Tests/TestHelpers/TestWithDatabaseBase.cs
+++ b/src/Umbraco.Tests/TestHelpers/TestWithDatabaseBase.cs
@@ -159,14 +159,7 @@ namespace Umbraco.Tests.TestHelpers
return @"Datasource=|DataDirectory|UmbracoNPocoTests.sdf;Flush Interval=1;";
}
- protected FakeHttpContextFactory GetHttpContextFactory(string url, RouteData routeData = null)
- {
- var factory = routeData != null
- ? new FakeHttpContextFactory(url, routeData)
- : new FakeHttpContextFactory(url);
- return factory;
- }
///
/// Creates the SqlCe database if required
@@ -361,7 +354,7 @@ namespace Umbraco.Tests.TestHelpers
}
}
- protected IUmbracoContext GetUmbracoContext(string url, int templateId = 1234, RouteData routeData = null, bool setSingleton = false, IUmbracoSettingsSection umbracoSettings = null, IEnumerable urlProviders = null, IEnumerable mediaUrlProviders = null, IGlobalSettings globalSettings = null, IPublishedSnapshotService snapshotService = null)
+ protected IUmbracoContext GetUmbracoContext(string url, int templateId = 1234, RouteData routeData = null, bool setSingleton = false, IGlobalSettings globalSettings = null, IPublishedSnapshotService snapshotService = null)
{
// ensure we have a PublishedCachesService
var service = snapshotService ?? PublishedSnapshotService as XmlPublishedSnapshotService;
@@ -380,15 +373,12 @@ namespace Umbraco.Tests.TestHelpers
}
var httpContext = GetHttpContextFactory(url, routeData).HttpContext;
-
+ var httpContextAccessor = TestHelper.GetHttpContextAccessor(httpContext);
var umbracoContext = new UmbracoContext(
- httpContext,
+ httpContextAccessor,
service,
- new WebSecurity(httpContext, Factory.GetInstance(),
+ new WebSecurity(httpContextAccessor, Factory.GetInstance(),
Factory.GetInstance(), IOHelper),
- umbracoSettings ?? Factory.GetInstance(),
- urlProviders ?? Enumerable.Empty(),
- mediaUrlProviders ?? Enumerable.Empty(),
globalSettings ?? Factory.GetInstance(),
new TestVariationContextAccessor(),
IOHelper,
diff --git a/src/Umbraco.Tests/Testing/Objects/TestUmbracoContextFactory.cs b/src/Umbraco.Tests/Testing/Objects/TestUmbracoContextFactory.cs
index 1e742f2145..26bed55cbc 100644
--- a/src/Umbraco.Tests/Testing/Objects/TestUmbracoContextFactory.cs
+++ b/src/Umbraco.Tests/Testing/Objects/TestUmbracoContextFactory.cs
@@ -16,14 +16,15 @@ namespace Umbraco.Tests.Testing.Objects
///
public class TestUmbracoContextFactory
{
- public static IUmbracoContextFactory Create(IGlobalSettings globalSettings = null, IUrlProvider urlProvider = null,
- IMediaUrlProvider mediaUrlProvider = null,
- IUmbracoContextAccessor umbracoContextAccessor = null)
+ public static IUmbracoContextFactory Create(IGlobalSettings globalSettings = null,
+ IUmbracoContextAccessor umbracoContextAccessor = null,
+ IHttpContextAccessor httpContextAccessor = null,
+ IPublishedUrlProvider publishedUrlProvider = null)
{
if (globalSettings == null) globalSettings = SettingsForTests.GenerateMockGlobalSettings();
- if (urlProvider == null) urlProvider = Mock.Of();
- if (mediaUrlProvider == null) mediaUrlProvider = Mock.Of();
if (umbracoContextAccessor == null) umbracoContextAccessor = new TestUmbracoContextAccessor();
+ if (httpContextAccessor == null) httpContextAccessor = TestHelper.GetHttpContextAccessor();
+ if (publishedUrlProvider == null) publishedUrlProvider = TestHelper.GetPublishedUrlProvider();
var contentCache = new Mock();
var mediaCache = new Mock();
@@ -33,18 +34,18 @@ namespace Umbraco.Tests.Testing.Objects
var snapshotService = new Mock();
snapshotService.Setup(x => x.CreatePublishedSnapshot(It.IsAny())).Returns(snapshot.Object);
+
+
var umbracoContextFactory = new UmbracoContextFactory(
umbracoContextAccessor,
snapshotService.Object,
new TestVariationContextAccessor(),
new TestDefaultCultureAccessor(),
- Mock.Of(section => section.WebRouting == Mock.Of(routingSection => routingSection.UrlProviderMode == "Auto")),
globalSettings,
- new UrlProviderCollection(new[] { urlProvider }),
- new MediaUrlProviderCollection(new[] { mediaUrlProvider }),
Mock.Of(),
TestHelper.IOHelper,
- TestHelper.UriUtility);
+ TestHelper.UriUtility,
+ httpContextAccessor);
return umbracoContextFactory;
}
diff --git a/src/Umbraco.Tests/Testing/TestingTests/MockTests.cs b/src/Umbraco.Tests/Testing/TestingTests/MockTests.cs
index b712bcafc8..bd7c2f2ab1 100644
--- a/src/Umbraco.Tests/Testing/TestingTests/MockTests.cs
+++ b/src/Umbraco.Tests/Testing/TestingTests/MockTests.cs
@@ -57,8 +57,6 @@ namespace Umbraco.Tests.Testing.TestingTests
[Test]
public void Can_Mock_Umbraco_Helper()
{
- var umbracoContext = TestObjects.GetUmbracoContextMock();
-
// unless we can inject them in MembershipHelper, we need need this
Composition.Register(_ => Mock.Of());
Composition.Register(_ => Mock.Of());
@@ -72,7 +70,7 @@ namespace Umbraco.Tests.Testing.TestingTests
Mock.Of(),
Mock.Of(),
Mock.Of(),
- new MembershipHelper(Mock.Of(), Mock.Of(), Mock.Of(), Mock.Of(), Mock.Of(), Mock.Of(), Mock.Of(), AppCaches.Disabled, Mock.Of(), ShortStringHelper, Mock.Of()));
+ new MembershipHelper(Mock.Of(), Mock.Of(), Mock.Of(), Mock.Of(), Mock.Of(), Mock.Of(), Mock.Of(), AppCaches.Disabled, Mock.Of(), ShortStringHelper, Mock.Of()));
Assert.Pass();
}
@@ -81,12 +79,18 @@ namespace Umbraco.Tests.Testing.TestingTests
{
var umbracoContext = TestObjects.GetUmbracoContextMock();
+
var urlProviderMock = new Mock();
- urlProviderMock.Setup(provider => provider.GetUrl(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()))
+ urlProviderMock.Setup(provider => provider.GetUrl(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()))
.Returns(UrlInfo.Url("/hello/world/1234"));
var urlProvider = urlProviderMock.Object;
- var theUrlProvider = new UrlProvider(umbracoContext, new [] { urlProvider }, Enumerable.Empty(), umbracoContext.VariationContextAccessor);
+ var theUrlProvider = new UrlProvider(
+ new TestUmbracoContextAccessor(umbracoContext),
+ TestHelper.WebRoutingSection,
+ new UrlProviderCollection(new [] { urlProvider }),
+ new MediaUrlProviderCollection( Enumerable.Empty())
+ , umbracoContext.VariationContextAccessor);
var contentType = new PublishedContentType(666, "alias", PublishedItemType.Content, Enumerable.Empty(), Enumerable.Empty(), ContentVariation.Nothing);
var publishedContent = Mock.Of();
@@ -98,17 +102,15 @@ namespace Umbraco.Tests.Testing.TestingTests
[Test]
public void Can_Mock_UmbracoApiController_Dependencies_With_Injected_UmbracoMapper()
{
- var umbracoContext = TestObjects.GetUmbracoContextMock();
-
var logger = Mock.Of();
var memberService = Mock.Of();
var memberTypeService = Mock.Of();
var membershipProvider = new MembersMembershipProvider(memberService, memberTypeService, Mock.Of(), TestHelper.GetHostingEnvironment(), TestHelper.GetIpResolver());
- var membershipHelper = new MembershipHelper(Mock.Of(), Mock.Of(), membershipProvider, Mock.Of(), memberService, memberTypeService, Mock.Of(), AppCaches.Disabled, logger, ShortStringHelper, Mock.Of());
+ var membershipHelper = new MembershipHelper(Mock.Of(), Mock.Of(), membershipProvider, Mock.Of(), memberService, memberTypeService, Mock.Of(), AppCaches.Disabled, logger, ShortStringHelper, Mock.Of());
var umbracoHelper = new UmbracoHelper(Mock.Of(), Mock.Of(), Mock.Of(), Mock.Of(), Mock.Of(), membershipHelper);
var umbracoMapper = new UmbracoMapper(new MapDefinitionCollection(new[] { Mock.Of() }));
- var umbracoApiController = new FakeUmbracoApiController(Mock.Of(), Mock.Of(), Mock.Of(), ServiceContext.CreatePartial(), AppCaches.NoCache, logger, Mock.Of(), umbracoHelper, umbracoMapper);
+ var umbracoApiController = new FakeUmbracoApiController(Mock.Of(), Mock.Of(), Mock.Of(), ServiceContext.CreatePartial(), AppCaches.NoCache, logger, Mock.Of(), umbracoHelper, umbracoMapper, Mock.Of());
Assert.Pass();
}
@@ -116,6 +118,7 @@ namespace Umbraco.Tests.Testing.TestingTests
internal class FakeUmbracoApiController : UmbracoApiController
{
- public FakeUmbracoApiController(IGlobalSettings globalSettings, IUmbracoContextAccessor umbracoContextAccessor, ISqlContext sqlContext, ServiceContext services, AppCaches appCaches, IProfilingLogger logger, IRuntimeState runtimeState, UmbracoHelper umbracoHelper, UmbracoMapper umbracoMapper) : base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, umbracoMapper) { }
+ public FakeUmbracoApiController(IGlobalSettings globalSettings, IUmbracoContextAccessor umbracoContextAccessor, ISqlContext sqlContext, ServiceContext services, AppCaches appCaches, IProfilingLogger logger, IRuntimeState runtimeState, UmbracoHelper umbracoHelper, UmbracoMapper umbracoMapper, IPublishedUrlProvider publishedUrlProvider)
+ : base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, umbracoMapper, publishedUrlProvider) { }
}
}
diff --git a/src/Umbraco.Tests/Testing/UmbracoTestBase.cs b/src/Umbraco.Tests/Testing/UmbracoTestBase.cs
index 2e6f4c4c41..bbc16b29ec 100644
--- a/src/Umbraco.Tests/Testing/UmbracoTestBase.cs
+++ b/src/Umbraco.Tests/Testing/UmbracoTestBase.cs
@@ -2,7 +2,9 @@
using System.Collections.Generic;
using System.Globalization;
using System.IO;
+using System.Linq;
using System.Reflection;
+using System.Web.Routing;
using System.Xml.Linq;
using Examine;
using Moq;
@@ -114,6 +116,7 @@ namespace Umbraco.Tests.Testing
protected IIOHelper IOHelper { get; private set; }
protected UriUtility UriUtility => new UriUtility(HostingEnvironment);
+ protected IPublishedUrlProvider PublishedUrlProvider => Factory.GetInstance();
protected IDataTypeService DataTypeService => Factory.GetInstance();
protected IPasswordHasher PasswordHasher => Factory.GetInstance();
protected Lazy PropertyEditorCollection => new Lazy(() => Factory.GetInstance());
@@ -196,7 +199,6 @@ namespace Umbraco.Tests.Testing
Composition.RegisterUnique(backOfficeInfo);
Composition.RegisterUnique(ipResolver);
Composition.RegisterUnique();
- Composition.RegisterUnique();
Composition.RegisterUnique(TestHelper.ShortStringHelper);
@@ -297,6 +299,18 @@ namespace Umbraco.Tests.Testing
Composition.RegisterUnique();
Composition.RegisterUnique();
Composition.RegisterUnique();
+ Composition.RegisterUnique(factory =>
+ new UrlProvider(
+ factory.GetInstance(),
+ TestObjects.GetUmbracoSettings().WebRouting,
+ new UrlProviderCollection(Enumerable.Empty()),
+ new MediaUrlProviderCollection(Enumerable.Empty()),
+ factory.GetInstance()
+
+ ));
+
+
+
}
protected virtual void ComposeMisc()
@@ -321,6 +335,9 @@ namespace Umbraco.Tests.Testing
// manifest
Composition.ManifestValueValidators();
Composition.ManifestFilters();
+ Composition.MediaUrlGenerators()
+ .Add()
+ .Add();
}
@@ -447,11 +464,20 @@ namespace Umbraco.Tests.Testing
Composition.RegisterUnique();
- Composition.RegisterUnique(TestObjects.GetHttpContextAccessor());
+ Composition.RegisterUnique(TestHelper.GetHttpContextAccessor(GetHttpContextFactory("/").HttpContext));
}
#endregion
+ protected FakeHttpContextFactory GetHttpContextFactory(string url, RouteData routeData = null)
+ {
+ var factory = routeData != null
+ ? new FakeHttpContextFactory(url, routeData)
+ : new FakeHttpContextFactory(url);
+
+ return factory;
+ }
+
#region Initialize
protected virtual void InitializeApplication(bool withApplication)
diff --git a/src/Umbraco.Tests/Web/Controllers/AuthenticationControllerTests.cs b/src/Umbraco.Tests/Web/Controllers/AuthenticationControllerTests.cs
index 7753b0495f..2c75b9070d 100644
--- a/src/Umbraco.Tests/Web/Controllers/AuthenticationControllerTests.cs
+++ b/src/Umbraco.Tests/Web/Controllers/AuthenticationControllerTests.cs
@@ -34,6 +34,7 @@ using Umbraco.Web.Models.ContentEditing;
using IUser = Umbraco.Core.Models.Membership.IUser;
using Umbraco.Core.Configuration.UmbracoSettings;
using Umbraco.Core.IO;
+using Umbraco.Web.Routing;
namespace Umbraco.Tests.Web.Controllers
{
@@ -89,7 +90,9 @@ namespace Umbraco.Tests.Web.Controllers
helper,
Factory.GetInstance(),
Factory.GetInstance(),
- Factory.GetInstance());
+ Factory.GetInstance(),
+ Factory.GetInstance()
+ );
return usersController;
}
diff --git a/src/Umbraco.Tests/Web/Controllers/ContentControllerTests.cs b/src/Umbraco.Tests/Web/Controllers/ContentControllerTests.cs
index 75960a93cf..778819c742 100644
--- a/src/Umbraco.Tests/Web/Controllers/ContentControllerTests.cs
+++ b/src/Umbraco.Tests/Web/Controllers/ContentControllerTests.cs
@@ -35,6 +35,7 @@ using Umbraco.Web.WebApi;
using Umbraco.Web.Composing;
using Task = System.Threading.Tasks.Task;
using Umbraco.Core.Mapping;
+using Umbraco.Web.Routing;
namespace Umbraco.Tests.Web.Controllers
{
@@ -270,7 +271,8 @@ namespace Umbraco.Tests.Web.Controllers
Factory.GetInstance(),
helper,
ShortStringHelper,
- Factory.GetInstance());
+ Factory.GetInstance(),
+ Factory.GetInstance());
return controller;
}
@@ -306,7 +308,8 @@ namespace Umbraco.Tests.Web.Controllers
Factory.GetInstance(),
helper,
ShortStringHelper,
- Factory.GetInstance());
+ Factory.GetInstance(),
+ Factory.GetInstance());
return controller;
}
@@ -350,7 +353,8 @@ namespace Umbraco.Tests.Web.Controllers
Factory.GetInstance(),
helper,
ShortStringHelper,
- Factory.GetInstance());
+ Factory.GetInstance(),
+ Factory.GetInstance());
return controller;
}
@@ -399,7 +403,8 @@ namespace Umbraco.Tests.Web.Controllers
Factory.GetInstance(),
helper,
ShortStringHelper,
- Factory.GetInstance());
+ Factory.GetInstance(),
+ Factory.GetInstance());
return controller;
}
@@ -440,7 +445,9 @@ namespace Umbraco.Tests.Web.Controllers
Factory.GetInstance(),
helper,
ShortStringHelper,
- Factory.GetInstance());
+ Factory.GetInstance(),
+ Factory.GetInstance()
+ );
return controller;
}
@@ -487,7 +494,9 @@ namespace Umbraco.Tests.Web.Controllers
Factory.GetInstance(),
helper,
ShortStringHelper,
- Factory.GetInstance());
+ Factory.GetInstance(),
+ Factory.GetInstance()
+ );
return controller;
}
diff --git a/src/Umbraco.Tests/Web/Controllers/UsersControllerTests.cs b/src/Umbraco.Tests/Web/Controllers/UsersControllerTests.cs
index 0dec6560b8..decbd59183 100644
--- a/src/Umbraco.Tests/Web/Controllers/UsersControllerTests.cs
+++ b/src/Umbraco.Tests/Web/Controllers/UsersControllerTests.cs
@@ -36,6 +36,7 @@ using Umbraco.Web.Models.ContentEditing;
using IUser = Umbraco.Core.Models.Membership.IUser;
using Umbraco.Core.Mapping;
using Umbraco.Core.Configuration.UmbracoSettings;
+using Umbraco.Web.Routing;
namespace Umbraco.Tests.Web.Controllers
{
@@ -91,7 +92,9 @@ namespace Umbraco.Tests.Web.Controllers
Factory.GetInstance(),
Factory.GetInstance(),
Factory.GetInstance(),
- Factory.GetInstance()
+ Factory.GetInstance(),
+ Factory.GetInstance()
+
);
return usersController;
}
@@ -162,8 +165,9 @@ namespace Umbraco.Tests.Web.Controllers
Factory.GetInstance(),
Factory.GetInstance(),
Factory.GetInstance(),
- Factory.GetInstance()
- );
+ Factory.GetInstance(),
+ Factory.GetInstance()
+ );
return usersController;
}
@@ -204,7 +208,8 @@ namespace Umbraco.Tests.Web.Controllers
Factory.GetInstance(),
Factory.GetInstance(),
Factory.GetInstance(),
- Factory.GetInstance()
+ Factory.GetInstance(),
+ Factory.GetInstance()
);
return usersController;
}
@@ -281,7 +286,8 @@ namespace Umbraco.Tests.Web.Controllers
Factory.GetInstance