From c6e1e7b3e5ee677a13e213ef7c99410988cc5934 Mon Sep 17 00:00:00 2001 From: Bjarke Berg Date: Fri, 14 Feb 2020 13:04:49 +0100 Subject: [PATCH] Untangled UrlProvider from UmbracoContext --- src/Umbraco.Abstractions/IUmbracoContext.cs | 5 - .../Templates/HtmlImageSourceParser.cs | 10 +- .../Templates/HtmlLocalLinkParser.cs | 12 +- .../MultiUrlPickerPropertyEditor.cs | 7 +- .../MultiUrlPickerValueEditor.cs | 10 +- .../MultiUrlPickerValueConverter.cs | 7 +- .../Cache/DistributedCacheBinderTests.cs | 6 +- .../PublishedContentCacheTests.cs | 6 +- .../PublishedContentSnapshotTestBase.cs | 6 +- .../PublishedContentTestBase.cs | 6 +- .../PublishedContent/PublishedContentTests.cs | 6 +- .../Routing/GetContentUrlsTests.cs | 45 +++++- .../Routing/MediaUrlProviderTests.cs | 39 +++-- src/Umbraco.Tests/Routing/UrlProviderTests.cs | 116 ++++++++------ .../Routing/UrlsProviderWithDomainsTests.cs | 146 ++++++++++-------- .../Routing/UrlsWithNestedDomains.cs | 34 +++- .../Scoping/ScopedNuCacheTests.cs | 6 +- .../Security/BackOfficeCookieManagerTests.cs | 13 +- .../Templates/HtmlImageSourceParserTests.cs | 19 ++- .../Templates/HtmlLocalLinkParserTests.cs | 17 +- src/Umbraco.Tests/TestHelpers/BaseWebTest.cs | 5 +- .../TestControllerActivatorBase.cs | 8 +- src/Umbraco.Tests/TestHelpers/TestHelper.cs | 12 +- .../TestHelpers/TestObjects-Mocks.cs | 9 +- .../TestHelpers/TestWithDatabaseBase.cs | 8 +- .../Objects/TestUmbracoContextFactory.cs | 15 +- .../Testing/TestingTests/MockTests.cs | 15 +- src/Umbraco.Tests/Testing/UmbracoTestBase.cs | 14 ++ .../AuthenticationControllerTests.cs | 5 +- .../Web/Controllers/ContentControllerTests.cs | 21 ++- .../Web/Controllers/UsersControllerTests.cs | 16 +- ...RenderIndexActionSelectorAttributeTests.cs | 24 +-- .../Web/Mvc/SurfaceControllerTests.cs | 24 +-- .../Web/Mvc/UmbracoViewPageTests.cs | 6 +- .../Web/WebExtensionMethodTests.cs | 18 +-- src/Umbraco.Web/Composing/Current.cs | 1 + .../Editors/AuthenticationController.cs | 18 ++- .../BackOfficeNotificationsController.cs | 16 +- src/Umbraco.Web/Editors/CodeFileController.cs | 6 +- src/Umbraco.Web/Editors/ContentController.cs | 6 +- .../Editors/ContentControllerBase.cs | 6 +- .../Editors/ContentTypeController.cs | 18 ++- .../Editors/ContentTypeControllerBase.cs | 19 ++- .../Editors/CurrentUserController.cs | 6 +- .../Editors/DashboardController.cs | 6 +- src/Umbraco.Web/Editors/DataTypeController.cs | 18 ++- .../Editors/DictionaryController.cs | 16 +- src/Umbraco.Web/Editors/EntityController.cs | 8 +- src/Umbraco.Web/Editors/LogController.cs | 6 +- .../Editors/MacroRenderingController.cs | 7 +- src/Umbraco.Web/Editors/MacrosController.cs | 6 +- src/Umbraco.Web/Editors/MediaController.cs | 6 +- .../Editors/MediaTypeController.cs | 18 ++- src/Umbraco.Web/Editors/MemberController.cs | 6 +- .../Editors/MemberTypeController.cs | 17 +- src/Umbraco.Web/Editors/PackageController.cs | 6 +- .../Editors/PackageInstallController.cs | 6 +- .../Editors/RelationTypeController.cs | 6 +- src/Umbraco.Web/Editors/SectionController.cs | 7 +- src/Umbraco.Web/Editors/TemplateController.cs | 16 +- .../Editors/TemplateQueryController.cs | 6 +- src/Umbraco.Web/Editors/TinyMceController.cs | 6 +- src/Umbraco.Web/Editors/TourController.cs | 6 +- .../UmbracoAuthorizedJsonController.cs | 16 +- src/Umbraco.Web/Editors/UsersController.cs | 6 +- .../Models/Mapping/ContentMapDefinition.cs | 6 +- .../Mapping/RedirectUrlMapDefinition.cs | 13 +- .../Mvc/RedirectToUmbracoPageResult.cs | 41 ++--- src/Umbraco.Web/Mvc/SurfaceController.cs | 18 +-- .../Profiling/WebProfilingController.cs | 16 +- .../RichTextPreValueController.cs | 18 ++- src/Umbraco.Web/PublishedContentExtensions.cs | 2 +- src/Umbraco.Web/PublishedElementExtensions.cs | 10 +- src/Umbraco.Web/Routing/AliasUrlProvider.cs | 9 +- .../Routing/DefaultMediaUrlProvider.cs | 8 +- src/Umbraco.Web/Routing/DefaultUrlProvider.cs | 12 +- src/Umbraco.Web/Routing/IMediaUrlProvider.cs | 3 +- src/Umbraco.Web/Routing/IUrlProvider.cs | 6 +- src/Umbraco.Web/Routing/PublishedRouter.cs | 12 +- src/Umbraco.Web/Routing/UrlProvider.cs | 48 ++---- .../Routing/UrlProviderExtensions.cs | 13 +- src/Umbraco.Web/Runtime/WebInitialComposer.cs | 1 + .../Trees/ApplicationTreeController.cs | 5 +- .../Trees/ContentTreeController.cs | 16 +- .../Trees/ContentTreeControllerBase.cs | 14 +- .../Trees/ContentTypeTreeController.cs | 15 +- .../Trees/DataTypeTreeController.cs | 15 +- src/Umbraco.Web/Trees/MediaTreeController.cs | 15 +- .../Trees/MediaTypeTreeController.cs | 15 +- .../Trees/TemplatesTreeController.cs | 15 +- src/Umbraco.Web/Trees/TreeController.cs | 15 +- src/Umbraco.Web/Trees/TreeControllerBase.cs | 15 +- src/Umbraco.Web/UmbracoContext.cs | 25 +-- src/Umbraco.Web/UmbracoContextFactory.cs | 13 +- .../WebApi/UmbracoApiController.cs | 5 +- .../WebApi/UmbracoApiControllerBase.cs | 10 +- .../WebApi/UmbracoAuthorizedApiController.cs | 5 +- 97 files changed, 934 insertions(+), 507 deletions(-) diff --git a/src/Umbraco.Abstractions/IUmbracoContext.cs b/src/Umbraco.Abstractions/IUmbracoContext.cs index b38a031f88..88dd7c2009 100644 --- a/src/Umbraco.Abstractions/IUmbracoContext.cs +++ b/src/Umbraco.Abstractions/IUmbracoContext.cs @@ -62,11 +62,6 @@ namespace Umbraco.Web /// bool IsFrontEndUmbracoRequest { get; } - /// - /// Gets the url provider. - /// - IPublishedUrlProvider UrlProvider { get; } - /// /// Gets/sets the PublishedRequest object /// diff --git a/src/Umbraco.Abstractions/Templates/HtmlImageSourceParser.cs b/src/Umbraco.Abstractions/Templates/HtmlImageSourceParser.cs index 74333cf533..79d65e0829 100644 --- a/src/Umbraco.Abstractions/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.Abstractions/Templates/HtmlLocalLinkParser.cs b/src/Umbraco.Abstractions/Templates/HtmlLocalLinkParser.cs index fd9177569a..3f62291ff1 100644 --- a/src/Umbraco.Abstractions/Templates/HtmlLocalLinkParser.cs +++ b/src/Umbraco.Abstractions/Templates/HtmlLocalLinkParser.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Text.RegularExpressions; using Umbraco.Core; +using Umbraco.Web.Routing; namespace Umbraco.Web.Templates { @@ -15,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) @@ -61,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)) { @@ -69,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 = "#"; @@ -80,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.Infrastructure/PropertyEditors/MultiUrlPickerPropertyEditor.cs b/src/Umbraco.Infrastructure/PropertyEditors/MultiUrlPickerPropertyEditor.cs index 203003548f..1be4067763 100644 --- a/src/Umbraco.Infrastructure/PropertyEditors/MultiUrlPickerPropertyEditor.cs +++ b/src/Umbraco.Infrastructure/PropertyEditors/MultiUrlPickerPropertyEditor.cs @@ -6,6 +6,7 @@ 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,18 +24,20 @@ namespace Umbraco.Web.PropertyEditors 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, IUmbracoContextAccessor umbracoContextAccessor) + 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, _umbracoContextAccessor); + protected override IDataValueEditor CreateValueEditor() => new MultiUrlPickerValueEditor(_entityService.Value, _publishedSnapshotAccessor, Logger, DataTypeService, LocalizationService, LocalizedTextService, ShortStringHelper, Attribute, _umbracoContextAccessor, _publishedUrlProvider); } } diff --git a/src/Umbraco.Infrastructure/PropertyEditors/MultiUrlPickerValueEditor.cs b/src/Umbraco.Infrastructure/PropertyEditors/MultiUrlPickerValueEditor.cs index f34a6a0139..f3d2255b6b 100644 --- a/src/Umbraco.Infrastructure/PropertyEditors/MultiUrlPickerValueEditor.cs +++ b/src/Umbraco.Infrastructure/PropertyEditors/MultiUrlPickerValueEditor.cs @@ -14,6 +14,8 @@ using Umbraco.Core.Strings; using Umbraco.Web.Models.ContentEditing; using Umbraco.Web.PublishedCache; using Umbraco.Core; +using Umbraco.Web.Routing; + namespace Umbraco.Web.PropertyEditors { public class MultiUrlPickerValueEditor : DataValueEditor, IDataValueReference @@ -21,15 +23,17 @@ 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, IUmbracoContextAccessor umbracoContextAccessor) + 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) @@ -85,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(_umbracoContextAccessor.UmbracoContext.UrlProvider) ?? "#"; + url = _publishedSnapshotAccessor.PublishedSnapshot.Content.GetById(entity.Key)?.Url(_publishedUrlProvider) ?? "#"; trashed = documentEntity.Trashed; } else if(entity is IContentEntitySlim contentEntity) @@ -93,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(_umbracoContextAccessor.UmbracoContext.UrlProvider) ?? "#"; + url = _publishedSnapshotAccessor.PublishedSnapshot.Media.GetById(entity.Key)?.Url(_publishedUrlProvider) ?? "#"; trashed = contentEntity.Trashed; } else diff --git a/src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/MultiUrlPickerValueConverter.cs b/src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/MultiUrlPickerValueConverter.cs index c5b7e48057..72beb0106a 100644 --- a/src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/MultiUrlPickerValueConverter.cs +++ b/src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/MultiUrlPickerValueConverter.cs @@ -8,6 +8,7 @@ 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 { @@ -17,13 +18,15 @@ namespace Umbraco.Web.PropertyEditors.ValueConverters private readonly IProfilingLogger _proflog; private readonly IJsonSerializer _jsonSerializer; private readonly IUmbracoContextAccessor _umbracoContextAccessor; + private readonly IPublishedUrlProvider _publishedUrlProvider; - public MultiUrlPickerValueConverter(IPublishedSnapshotAccessor publishedSnapshotAccessor, IProfilingLogger proflog, IJsonSerializer jsonSerializer, IUmbracoContextAccessor umbracoContextAccessor) + 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); @@ -72,7 +75,7 @@ namespace Umbraco.Web.PropertyEditors.ValueConverters { continue; } - url = content.Url(_umbracoContextAccessor.UmbracoContext.UrlProvider); + url = content.Url(_publishedUrlProvider); } links.Add( diff --git a/src/Umbraco.Tests/Cache/DistributedCacheBinderTests.cs b/src/Umbraco.Tests/Cache/DistributedCacheBinderTests.cs index 8edef0faaa..e427961245 100644 --- a/src/Umbraco.Tests/Cache/DistributedCacheBinderTests.cs +++ b/src/Umbraco.Tests/Cache/DistributedCacheBinderTests.cs @@ -161,13 +161,11 @@ namespace Umbraco.Tests.Cache Mock.Of(), new TestVariationContextAccessor(), new TestDefaultCultureAccessor(), - TestObjects.GetUmbracoSettings(), TestObjects.GetGlobalSettings(), - new UrlProviderCollection(Enumerable.Empty()), - new MediaUrlProviderCollection(Enumerable.Empty()), Mock.Of(), IOHelper, - httpContextAccessor); + httpContextAccessor, + PublishedUrlProvider); // 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 0178b416af..dbc4482687 100644 --- a/src/Umbraco.Tests/Cache/PublishedCache/PublishedContentCacheTests.cs +++ b/src/Umbraco.Tests/Cache/PublishedCache/PublishedContentCacheTests.cs @@ -80,12 +80,10 @@ namespace Umbraco.Tests.Cache.PublishedCache httpContextAccessor, publishedSnapshotService.Object, new WebSecurity(httpContextAccessor, Mock.Of(), globalSettings, IOHelper), - umbracoSettings, - Enumerable.Empty(), - Enumerable.Empty(), globalSettings, new TestVariationContextAccessor(), - IOHelper); + IOHelper, + PublishedUrlProvider); _cache = _umbracoContext.Content; } diff --git a/src/Umbraco.Tests/PublishedContent/PublishedContentSnapshotTestBase.cs b/src/Umbraco.Tests/PublishedContent/PublishedContentSnapshotTestBase.cs index efc01856fd..fef97156c4 100644 --- a/src/Umbraco.Tests/PublishedContent/PublishedContentSnapshotTestBase.cs +++ b/src/Umbraco.Tests/PublishedContent/PublishedContentSnapshotTestBase.cs @@ -74,12 +74,10 @@ namespace Umbraco.Tests.PublishedContent httpContextAccessor, publishedSnapshotService.Object, new WebSecurity(httpContextAccessor, Current.Services.UserService, globalSettings, IOHelper), - TestObjects.GetUmbracoSettings(), - Enumerable.Empty(), - Enumerable.Empty(), globalSettings, new TestVariationContextAccessor(), - IOHelper); + IOHelper, + PublishedUrlProvider); return umbracoContext; } 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 d6bd61dc8a..3c85850460 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 @@ -54,7 +59,8 @@ namespace Umbraco.Tests.Routing umbContext, GetLangService("en-US", "fr-FR"), GetTextService(), ServiceContext.ContentService, VariationContextAccessor, - Logger).ToList(); + Logger, + PublishedUrlProvider).ToList(); Assert.AreEqual(1, urls.Count); Assert.AreEqual("content/itemNotPublished", urls[0].Text); @@ -72,14 +78,25 @@ 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()) }); + var umbContext = GetUmbracoContext("http://localhost:8000"); + var umbracoContextAccessor = new TestUmbracoContextAccessor(umbContext); + var urlProvider = new DefaultUrlProvider(umbracoSettings.RequestHandler, Logger, TestObjects.GetGlobalSettings(), new SiteDomainHelper(), umbracoContextAccessor); + var publishedUrlProvider = new UrlProvider( + new Lazy(() => 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, umbContext, GetLangService("en-US", "fr-FR"), GetTextService(), ServiceContext.ContentService, - VariationContextAccessor, Logger).ToList(); + VariationContextAccessor, + Logger, + publishedUrlProvider).ToList(); Assert.AreEqual(1, urls.Count); Assert.AreEqual("/home/", urls[0].Text); @@ -104,14 +121,26 @@ 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()) }); + + var umbContext = GetUmbracoContext("http://localhost:8000"); + var umbracoContextAccessor = new TestUmbracoContextAccessor(umbContext); + var urlProvider = new DefaultUrlProvider(umbracoSettings.RequestHandler, Logger, TestObjects.GetGlobalSettings(), new SiteDomainHelper(), umbracoContextAccessor); + var publishedUrlProvider = new UrlProvider( + new Lazy(() => 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, umbContext, GetLangService("en-US", "fr-FR"), GetTextService(), ServiceContext.ContentService, - VariationContextAccessor, Logger).ToList(); + VariationContextAccessor, + Logger, + 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 78ff71678d..089670ab61 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; @@ -41,7 +43,7 @@ namespace Umbraco.Tests.Routing 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); + _mediaUrlProvider = new DefaultMediaUrlProvider(new Lazy(() => propertyEditors)); } public override void TearDown() @@ -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 Lazy(() => 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/UrlProviderTests.cs b/src/Umbraco.Tests/Routing/UrlProviderTests.cs index 1cecf74c3f..cdca1e49bf 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,13 @@ 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()) - }, 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); + + var publishedUrlProvider = GetPublishedUrlProvider(umbracoContext, urlProvider); var requestHandlerMock = Mock.Get(umbracoSettings.RequestHandler); requestHandlerMock.Setup(x => x.AddTrailingSlash).Returns(false);// (cached routes have none) @@ -67,14 +73,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 +99,17 @@ namespace Umbraco.Tests.Routing Assert.AreEqual(0, cachedIds.Count); } + private IPublishedUrlProvider GetPublishedUrlProvider(IUmbracoContext umbracoContext, DefaultUrlProvider urlProvider) + { + return new UrlProvider( + new Lazy(() => 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 +126,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()) - }, 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); + var publishedUrlProvider = GetPublishedUrlProvider(umbracoContext, urlProvider); - var result = umbracoContext.UrlProvider.GetUrl(nodeId); + var result = publishedUrlProvider.GetUrl(nodeId); Assert.AreEqual(niceUrlMatch, result); } @@ -137,13 +155,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()) - }, 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); + var publishedUrlProvider = GetPublishedUrlProvider(umbracoContext, urlProvider); - var result = umbracoContext.UrlProvider.GetUrl(nodeId); + var result = publishedUrlProvider.GetUrl(nodeId); Assert.AreEqual(niceUrlMatch, result); } @@ -177,15 +196,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()) - }, + + 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); + 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 +252,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()) - }, + + 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); + 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 +308,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()) - }, + 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); - 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 +331,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()) - }, 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); + 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 +352,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()) - }, globalSettings: globalSettings.Object); + var urlProvider = new DefaultUrlProvider(umbracoSettings.RequestHandler, Logger, globalSettings.Object, + new SiteDomainHelper(), UmbracoContextAccessor); + 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 0a34fb8041..96d3ebf785 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()) - }, 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); + 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); } @@ -210,20 +213,21 @@ namespace Umbraco.Tests.Routing public void Get_Url_SimpleWithSchemeAndPath(int nodeId, string currentUrl, bool absolute, string expected) { var settings = SettingsForTests.GenerateMockUmbracoSettings(); - + 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()) - }, 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); + 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()) - }, 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); + 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); } @@ -266,20 +271,21 @@ namespace Umbraco.Tests.Routing public void Get_Url_NestedDomains(int nodeId, string currentUrl, bool absolute, string expected) { var settings = SettingsForTests.GenerateMockUmbracoSettings(); - + 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()) - }, 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); + 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); } @@ -287,29 +293,30 @@ namespace Umbraco.Tests.Routing public void Get_Url_DomainsAndCache() { var settings = SettingsForTests.GenerateMockUmbracoSettings(); - + 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()) - }, 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); + 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) @@ -350,24 +357,25 @@ namespace Umbraco.Tests.Routing public void Get_Url_Relative_Or_Absolute() { var settings = SettingsForTests.GenerateMockUmbracoSettings(); - + 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()) - }, 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); + 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()) - }, 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); + 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 Lazy(() => 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 6587b2e4f6..40e9ac1c01 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()) - }, 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); + 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 Lazy(() => 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/Scoping/ScopedNuCacheTests.cs b/src/Umbraco.Tests/Scoping/ScopedNuCacheTests.cs index ac76b2ac2b..0bdeb1c3a9 100644 --- a/src/Umbraco.Tests/Scoping/ScopedNuCacheTests.cs +++ b/src/Umbraco.Tests/Scoping/ScopedNuCacheTests.cs @@ -123,12 +123,10 @@ namespace Umbraco.Tests.Scoping httpContextAccessor, service, new WebSecurity(httpContextAccessor, Current.Services.UserService, globalSettings, IOHelper), - umbracoSettings ?? SettingsForTests.GetDefaultUmbracoSettings(), - urlProviders ?? Enumerable.Empty(), - Enumerable.Empty(), globalSettings, new TestVariationContextAccessor(), - IOHelper); + IOHelper, + PublishedUrlProvider); if (setSingleton) Umbraco.Web.Composing.Current.UmbracoContextAccessor.UmbracoContext = umbracoContext; diff --git a/src/Umbraco.Tests/Security/BackOfficeCookieManagerTests.cs b/src/Umbraco.Tests/Security/BackOfficeCookieManagerTests.cs index bd0443585c..81b62473a3 100644 --- a/src/Umbraco.Tests/Security/BackOfficeCookieManagerTests.cs +++ b/src/Umbraco.Tests/Security/BackOfficeCookieManagerTests.cs @@ -34,9 +34,10 @@ namespace Umbraco.Tests.Security var umbracoContext = new UmbracoContext( httpContextAccessor, Mock.Of(), - new WebSecurity(httpContextAccessor, Current.Services.UserService, globalSettings, IOHelper), - TestObjects.GetUmbracoSettings(), new List(), Enumerable.Empty(), globalSettings, - new TestVariationContextAccessor(), IOHelper); + new WebSecurity(httpContextAccessor, Current.Services.UserService, globalSettings, IOHelper), globalSettings, + new TestVariationContextAccessor(), + IOHelper, + PublishedUrlProvider); var runtime = Mock.Of(x => x.Level == RuntimeLevel.Install); var mgr = new BackOfficeCookieManager( @@ -56,8 +57,10 @@ namespace Umbraco.Tests.Security httpContextAccessor, Mock.Of(), new WebSecurity(httpContextAccessor, Current.Services.UserService, globalSettings, IOHelper), - TestObjects.GetUmbracoSettings(), new List(), Enumerable.Empty(), globalSettings, - new TestVariationContextAccessor(), IOHelper); + globalSettings, + new TestVariationContextAccessor(), + IOHelper, + PublishedUrlProvider); var runtime = Mock.Of(x => x.Level == RuntimeLevel.Run); var mgr = new BackOfficeCookieManager(Mock.Of(accessor => accessor.UmbracoContext == umbCtx), runtime, TestObjects.GetGlobalSettings(), IOHelper, AppCaches.RequestCache); diff --git a/src/Umbraco.Tests/Templates/HtmlImageSourceParserTests.cs b/src/Umbraco.Tests/Templates/HtmlImageSourceParserTests.cs index 23dde26069..68d92268da 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); + + var publishedUrlProvider = new UrlProvider(new Lazy(() => 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 f5e32711bc..15e6ee9da8 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,16 +64,20 @@ 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); + var publishedUrlProvider = new UrlProvider(new Lazy(() => 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); @@ -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 06879c1647..e8b4a993c4 100644 --- a/src/Umbraco.Tests/TestHelpers/BaseWebTest.cs +++ b/src/Umbraco.Tests/TestHelpers/BaseWebTest.cs @@ -100,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 442f50aa3a..5cb57d82c0 100644 --- a/src/Umbraco.Tests/TestHelpers/ControllerTesting/TestControllerActivatorBase.cs +++ b/src/Umbraco.Tests/TestHelpers/ControllerTesting/TestControllerActivatorBase.cs @@ -141,18 +141,16 @@ namespace Umbraco.Tests.TestHelpers.ControllerTesting 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); + TestHelper.IOHelper, + Mock.Of()); //replace it 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(httpContext, Mock.Of(), Mock.Of(), Mock.Of(), Mock.Of(), Mock.Of(), Mock.Of(), AppCaches.Disabled, Mock.Of(), new MockShortStringHelper(), Mock.Of()); diff --git a/src/Umbraco.Tests/TestHelpers/TestHelper.cs b/src/Umbraco.Tests/TestHelpers/TestHelper.cs index 5fa87fe661..5dc8ba2a11 100644 --- a/src/Umbraco.Tests/TestHelpers/TestHelper.cs +++ b/src/Umbraco.Tests/TestHelpers/TestHelper.cs @@ -32,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 @@ -101,6 +102,8 @@ namespace Umbraco.Tests.TestHelpers public static IIOHelper IOHelper { get; } = new IOHelper(GetHostingEnvironment()); public static IMainDom MainDom { get; } = new MainDom(Mock.Of(), GetHostingEnvironment(), new MainDomSemaphoreLock(Mock.Of(), GetHostingEnvironment())); + public static IWebRoutingSection WebRoutingSection => SettingsForTests.GetDefaultUmbracoSettings().WebRouting; + /// /// Maps the given making it rooted on . must start with ~/ /// @@ -353,7 +356,7 @@ namespace Umbraco.Tests.TestHelpers httpContextMock.Setup(x => x.DisposeOnPipelineCompleted(It.IsAny())) .Returns(Mock.Of()); - + httpContextBase = httpContextMock.Object; } @@ -363,5 +366,12 @@ namespace Umbraco.Tests.TestHelpers 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 776a0f94a4..e6846d0ec0 100644 --- a/src/Umbraco.Tests/TestHelpers/TestObjects-Mocks.cs +++ b/src/Umbraco.Tests/TestHelpers/TestObjects-Mocks.cs @@ -119,10 +119,7 @@ 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(); @@ -133,13 +130,11 @@ namespace Umbraco.Tests.TestHelpers publishedSnapshotService, new TestVariationContextAccessor(), new TestDefaultCultureAccessor(), - umbracoSettings, globalSettings, - urlProviders, - mediaUrlProviders, Mock.Of(), TestHelper.IOHelper, - httpContextAccessor); + httpContextAccessor, + Mock.Of()); return umbracoContextFactory.EnsureUmbracoContext().UmbracoContext; } diff --git a/src/Umbraco.Tests/TestHelpers/TestWithDatabaseBase.cs b/src/Umbraco.Tests/TestHelpers/TestWithDatabaseBase.cs index 450128c29f..f427cb83c2 100644 --- a/src/Umbraco.Tests/TestHelpers/TestWithDatabaseBase.cs +++ b/src/Umbraco.Tests/TestHelpers/TestWithDatabaseBase.cs @@ -354,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; @@ -379,12 +379,10 @@ namespace Umbraco.Tests.TestHelpers service, new WebSecurity(httpContextAccessor, Factory.GetInstance(), Factory.GetInstance(), IOHelper), - umbracoSettings ?? Factory.GetInstance(), - urlProviders ?? Enumerable.Empty(), - mediaUrlProviders ?? Enumerable.Empty(), globalSettings ?? Factory.GetInstance(), new TestVariationContextAccessor(), - IOHelper); + IOHelper, + PublishedUrlProvider); if (setSingleton) Umbraco.Web.Composing.Current.UmbracoContextAccessor.UmbracoContext = umbracoContext; diff --git a/src/Umbraco.Tests/Testing/Objects/TestUmbracoContextFactory.cs b/src/Umbraco.Tests/Testing/Objects/TestUmbracoContextFactory.cs index 816409b1cc..1fd24a0e5c 100644 --- a/src/Umbraco.Tests/Testing/Objects/TestUmbracoContextFactory.cs +++ b/src/Umbraco.Tests/Testing/Objects/TestUmbracoContextFactory.cs @@ -16,16 +16,15 @@ namespace Umbraco.Tests.Testing.Objects /// public class TestUmbracoContextFactory { - public static IUmbracoContextFactory Create(IGlobalSettings globalSettings = null, IUrlProvider urlProvider = null, - IMediaUrlProvider mediaUrlProvider = null, + public static IUmbracoContextFactory Create(IGlobalSettings globalSettings = null, IUmbracoContextAccessor umbracoContextAccessor = null, - IHttpContextAccessor httpContextAccessor = 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(); @@ -42,13 +41,11 @@ namespace Umbraco.Tests.Testing.Objects 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, - httpContextAccessor); + httpContextAccessor, + publishedUrlProvider); return umbracoContextFactory; } diff --git a/src/Umbraco.Tests/Testing/TestingTests/MockTests.cs b/src/Umbraco.Tests/Testing/TestingTests/MockTests.cs index 33a5fca070..fdea605419 100644 --- a/src/Umbraco.Tests/Testing/TestingTests/MockTests.cs +++ b/src/Umbraco.Tests/Testing/TestingTests/MockTests.cs @@ -79,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 Lazy(() => 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(); @@ -104,7 +110,7 @@ namespace Umbraco.Tests.Testing.TestingTests 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(); } @@ -112,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 481beb37f3..ba18d136f3 100644 --- a/src/Umbraco.Tests/Testing/UmbracoTestBase.cs +++ b/src/Umbraco.Tests/Testing/UmbracoTestBase.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Globalization; using System.IO; +using System.Linq; using System.Reflection; using System.Web.Routing; using System.Xml.Linq; @@ -114,6 +115,7 @@ namespace Umbraco.Tests.Testing protected IJsonSerializer JsonNetSerializer { get; } = new JsonNetSerializer(); protected IIOHelper IOHelper { get; private set; } + protected IPublishedUrlProvider PublishedUrlProvider => Factory.GetInstance(); protected IDataTypeService DataTypeService => Factory.GetInstance(); protected IPasswordHasher PasswordHasher => Factory.GetInstance(); protected Lazy PropertyEditorCollection => new Lazy(() => Factory.GetInstance()); @@ -298,6 +300,18 @@ namespace Umbraco.Tests.Testing Composition.RegisterUnique(); Composition.RegisterUnique(); Composition.RegisterUnique(); + Composition.RegisterUnique(factory => + new UrlProvider( + new Lazy(() => factory.GetInstance()), + TestObjects.GetUmbracoSettings().WebRouting, + new UrlProviderCollection(Enumerable.Empty()), + new MediaUrlProviderCollection(Enumerable.Empty()), + factory.GetInstance() + + )); + + + } protected virtual void ComposeMisc() 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(), Factory.GetInstance(), Factory.GetInstance(), - Factory.GetInstance() + Factory.GetInstance(), + Factory.GetInstance() ); return usersController; } diff --git a/src/Umbraco.Tests/Web/Mvc/RenderIndexActionSelectorAttributeTests.cs b/src/Umbraco.Tests/Web/Mvc/RenderIndexActionSelectorAttributeTests.cs index ef6136939a..c9587d4c4a 100644 --- a/src/Umbraco.Tests/Web/Mvc/RenderIndexActionSelectorAttributeTests.cs +++ b/src/Umbraco.Tests/Web/Mvc/RenderIndexActionSelectorAttributeTests.cs @@ -70,13 +70,11 @@ namespace Umbraco.Tests.Web.Mvc Mock.Of(), new TestVariationContextAccessor(), new TestDefaultCultureAccessor(), - TestObjects.GetUmbracoSettings(), globalSettings, - new UrlProviderCollection(Enumerable.Empty()), - new MediaUrlProviderCollection(Enumerable.Empty()), Mock.Of(), TestHelper.IOHelper, - httpContextAccessor); + httpContextAccessor, + Mock.Of()); var umbracoContextReference = umbracoContextFactory.EnsureUmbracoContext(); var umbCtx = umbracoContextReference.UmbracoContext; @@ -103,13 +101,11 @@ namespace Umbraco.Tests.Web.Mvc Mock.Of(), new TestVariationContextAccessor(), new TestDefaultCultureAccessor(), - TestObjects.GetUmbracoSettings(), globalSettings, - new UrlProviderCollection(Enumerable.Empty()), - new MediaUrlProviderCollection(Enumerable.Empty()), Mock.Of(), TestHelper.IOHelper, - httpContextAccessor); + httpContextAccessor, + Mock.Of()); var umbracoContextReference = umbracoContextFactory.EnsureUmbracoContext(); var umbCtx = umbracoContextReference.UmbracoContext; @@ -136,13 +132,11 @@ namespace Umbraco.Tests.Web.Mvc Mock.Of(), new TestVariationContextAccessor(), new TestDefaultCultureAccessor(), - TestObjects.GetUmbracoSettings(), globalSettings, - new UrlProviderCollection(Enumerable.Empty()), - new MediaUrlProviderCollection(Enumerable.Empty()), Mock.Of(), TestHelper.IOHelper, - httpContextAccessor); + httpContextAccessor, + Mock.Of()); var umbracoContextReference = umbracoContextFactory.EnsureUmbracoContext(); var umbCtx = umbracoContextReference.UmbracoContext; @@ -169,13 +163,11 @@ namespace Umbraco.Tests.Web.Mvc Mock.Of(), new TestVariationContextAccessor(), new TestDefaultCultureAccessor(), - TestObjects.GetUmbracoSettings(), globalSettings, - new UrlProviderCollection(Enumerable.Empty()), - new MediaUrlProviderCollection(Enumerable.Empty()), Mock.Of(), TestHelper.IOHelper, - httpContextAccessor); + httpContextAccessor, + Mock.Of()); var umbracoContextReference = umbracoContextFactory.EnsureUmbracoContext(); var umbCtx = umbracoContextReference.UmbracoContext; diff --git a/src/Umbraco.Tests/Web/Mvc/SurfaceControllerTests.cs b/src/Umbraco.Tests/Web/Mvc/SurfaceControllerTests.cs index b0393999e8..334488bde1 100644 --- a/src/Umbraco.Tests/Web/Mvc/SurfaceControllerTests.cs +++ b/src/Umbraco.Tests/Web/Mvc/SurfaceControllerTests.cs @@ -46,13 +46,11 @@ namespace Umbraco.Tests.Web.Mvc Mock.Of(), new TestVariationContextAccessor(), new TestDefaultCultureAccessor(), - TestObjects.GetUmbracoSettings(), globalSettings, - new UrlProviderCollection(Enumerable.Empty()), - new MediaUrlProviderCollection(Enumerable.Empty()), Mock.Of(), IOHelper, - httpContextAccessor); + httpContextAccessor, + PublishedUrlProvider); var umbracoContextReference = umbracoContextFactory.EnsureUmbracoContext(); var umbracoContext = umbracoContextReference.UmbracoContext; @@ -77,13 +75,11 @@ namespace Umbraco.Tests.Web.Mvc Mock.Of(), new TestVariationContextAccessor(), new TestDefaultCultureAccessor(), - TestObjects.GetUmbracoSettings(), globalSettings, - new UrlProviderCollection(Enumerable.Empty()), - new MediaUrlProviderCollection(Enumerable.Empty()), Mock.Of(), IOHelper, - httpContextAccessor); + httpContextAccessor, + PublishedUrlProvider); var umbracoContextReference = umbracoContextFactory.EnsureUmbracoContext(); var umbCtx = umbracoContextReference.UmbracoContext; @@ -111,13 +107,11 @@ namespace Umbraco.Tests.Web.Mvc publishedSnapshotService.Object, new TestVariationContextAccessor(), new TestDefaultCultureAccessor(), - Mock.Of(section => section.WebRouting == Mock.Of(routingSection => routingSection.UrlProviderMode == "Auto")), globalSettings, - new UrlProviderCollection(Enumerable.Empty()), - new MediaUrlProviderCollection(Enumerable.Empty()), Mock.Of(), IOHelper, - httpContextAccessor); + httpContextAccessor, + PublishedUrlProvider); var umbracoContextReference = umbracoContextFactory.EnsureUmbracoContext(); var umbracoContext = umbracoContextReference.UmbracoContext; @@ -152,13 +146,11 @@ namespace Umbraco.Tests.Web.Mvc Mock.Of(), new TestVariationContextAccessor(), new TestDefaultCultureAccessor(), - Mock.Of(section => section.WebRouting == webRoutingSettings), globalSettings, - new UrlProviderCollection(Enumerable.Empty()), - new MediaUrlProviderCollection(Enumerable.Empty()), Mock.Of(), IOHelper, - httpContextAccessor); + httpContextAccessor, + PublishedUrlProvider); var umbracoContextReference = umbracoContextFactory.EnsureUmbracoContext(); var umbracoContext = umbracoContextReference.UmbracoContext; diff --git a/src/Umbraco.Tests/Web/Mvc/UmbracoViewPageTests.cs b/src/Umbraco.Tests/Web/Mvc/UmbracoViewPageTests.cs index eaa892ac45..040fae8294 100644 --- a/src/Umbraco.Tests/Web/Mvc/UmbracoViewPageTests.cs +++ b/src/Umbraco.Tests/Web/Mvc/UmbracoViewPageTests.cs @@ -442,12 +442,10 @@ namespace Umbraco.Tests.Web.Mvc httpContextAccessor, _service, new WebSecurity(httpContextAccessor, Current.Services.UserService, globalSettings, IOHelper), - TestObjects.GetUmbracoSettings(), - Enumerable.Empty(), - Enumerable.Empty(), globalSettings, new TestVariationContextAccessor(), - IOHelper); + IOHelper, + PublishedUrlProvider); //if (setSingleton) //{ diff --git a/src/Umbraco.Tests/Web/WebExtensionMethodTests.cs b/src/Umbraco.Tests/Web/WebExtensionMethodTests.cs index fb04ee49bb..5e81de5c83 100644 --- a/src/Umbraco.Tests/Web/WebExtensionMethodTests.cs +++ b/src/Umbraco.Tests/Web/WebExtensionMethodTests.cs @@ -33,12 +33,10 @@ namespace Umbraco.Tests.Web httpContextAccessor, Mock.Of(), new WebSecurity(httpContextAccessor, Current.Services.UserService, TestObjects.GetGlobalSettings(), IOHelper), - TestObjects.GetUmbracoSettings(), - new List(), - Enumerable.Empty(), TestObjects.GetGlobalSettings(), new TestVariationContextAccessor(), - IOHelper); + IOHelper, + PublishedUrlProvider); var r1 = new RouteData(); r1.DataTokens.Add(Core.Constants.Web.UmbracoContextDataToken, umbCtx); @@ -55,12 +53,10 @@ namespace Umbraco.Tests.Web httpContextAccessor, Mock.Of(), new WebSecurity(httpContextAccessor, Current.Services.UserService, TestObjects.GetGlobalSettings(), IOHelper), - TestObjects.GetUmbracoSettings(), - new List(), - Enumerable.Empty(), TestObjects.GetGlobalSettings(), new TestVariationContextAccessor(), - IOHelper); + IOHelper, + PublishedUrlProvider); var r1 = new RouteData(); r1.DataTokens.Add(Core.Constants.Web.UmbracoContextDataToken, umbCtx); @@ -87,12 +83,10 @@ namespace Umbraco.Tests.Web httpContextAccessor, Mock.Of(), new WebSecurity(httpContextAccessor, Current.Services.UserService, TestObjects.GetGlobalSettings(), IOHelper), - TestObjects.GetUmbracoSettings(), - new List(), - Enumerable.Empty(), TestObjects.GetGlobalSettings(), new TestVariationContextAccessor(), - IOHelper); + IOHelper, + PublishedUrlProvider); var httpContext = Mock.Of(); diff --git a/src/Umbraco.Web/Composing/Current.cs b/src/Umbraco.Web/Composing/Current.cs index f9b0edb49a..40985e97bf 100644 --- a/src/Umbraco.Web/Composing/Current.cs +++ b/src/Umbraco.Web/Composing/Current.cs @@ -259,6 +259,7 @@ namespace Umbraco.Web.Composing public static IHostingEnvironment HostingEnvironment => Factory.GetInstance(); public static IIpResolver IpResolver => Factory.GetInstance(); public static IUmbracoVersion UmbracoVersion => Factory.GetInstance(); + public static IPublishedUrlProvider PublishedUrlProvider => Factory.GetInstance(); #endregion } diff --git a/src/Umbraco.Web/Editors/AuthenticationController.cs b/src/Umbraco.Web/Editors/AuthenticationController.cs index f17f7c1eba..dbfb6f81a4 100644 --- a/src/Umbraco.Web/Editors/AuthenticationController.cs +++ b/src/Umbraco.Web/Editors/AuthenticationController.cs @@ -28,6 +28,7 @@ using Umbraco.Core.Mapping; using Umbraco.Web.Models.Identity; using Umbraco.Core.Configuration.UmbracoSettings; using Umbraco.Core.IO; +using Umbraco.Web.Routing; namespace Umbraco.Web.Editors { @@ -47,8 +48,21 @@ namespace Umbraco.Web.Editors private readonly IUmbracoSettingsSection _umbracoSettingsSection; private readonly IIOHelper _ioHelper; - public AuthenticationController(IUserPasswordConfiguration passwordConfiguration, IGlobalSettings globalSettings, IUmbracoContextAccessor umbracoContextAccessor, ISqlContext sqlContext, ServiceContext services, AppCaches appCaches, IProfilingLogger logger, IRuntimeState runtimeState, UmbracoHelper umbracoHelper, UmbracoMapper umbracoMapper, IUmbracoSettingsSection umbracoSettingsSection, IIOHelper ioHelper) - : base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, umbracoMapper) + public AuthenticationController( + IUserPasswordConfiguration passwordConfiguration, + IGlobalSettings globalSettings, + IUmbracoContextAccessor umbracoContextAccessor, + ISqlContext sqlContext, + ServiceContext services, + AppCaches appCaches, + IProfilingLogger logger, + IRuntimeState runtimeState, + UmbracoHelper umbracoHelper, + UmbracoMapper umbracoMapper, + IUmbracoSettingsSection umbracoSettingsSection, + IIOHelper ioHelper, + IPublishedUrlProvider publishedUrlProvider) + : base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, umbracoMapper, publishedUrlProvider) { _passwordConfiguration = passwordConfiguration ?? throw new ArgumentNullException(nameof(passwordConfiguration)); _runtimeState = runtimeState ?? throw new ArgumentNullException(nameof(runtimeState)); diff --git a/src/Umbraco.Web/Editors/BackOfficeNotificationsController.cs b/src/Umbraco.Web/Editors/BackOfficeNotificationsController.cs index 883af8e351..eb6b76ab46 100644 --- a/src/Umbraco.Web/Editors/BackOfficeNotificationsController.cs +++ b/src/Umbraco.Web/Editors/BackOfficeNotificationsController.cs @@ -6,6 +6,7 @@ using Umbraco.Core.Mapping; using Umbraco.Core.Persistence; using Umbraco.Core.Services; using Umbraco.Core.Strings; +using Umbraco.Web.Routing; using Umbraco.Web.WebApi; using Umbraco.Web.WebApi.Filters; @@ -20,8 +21,19 @@ namespace Umbraco.Web.Editors [PrefixlessBodyModelValidator] public abstract class BackOfficeNotificationsController : UmbracoAuthorizedJsonController { - protected BackOfficeNotificationsController(IGlobalSettings globalSettings, IUmbracoContextAccessor umbracoContextAccessor, ISqlContext sqlContext, ServiceContext services, AppCaches appCaches, IProfilingLogger logger, IRuntimeState runtimeState, UmbracoHelper umbracoHelper, IShortStringHelper shortStringHelper, UmbracoMapper umbracoMapper) - : base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, shortStringHelper, umbracoMapper) + protected BackOfficeNotificationsController( + IGlobalSettings globalSettings, + IUmbracoContextAccessor umbracoContextAccessor, + ISqlContext sqlContext, + ServiceContext services, + AppCaches appCaches, + IProfilingLogger logger, + IRuntimeState runtimeState, + UmbracoHelper umbracoHelper, + IShortStringHelper shortStringHelper, + UmbracoMapper umbracoMapper, + IPublishedUrlProvider publishedUrlProvider) + : base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, shortStringHelper, umbracoMapper, publishedUrlProvider) { } } diff --git a/src/Umbraco.Web/Editors/CodeFileController.cs b/src/Umbraco.Web/Editors/CodeFileController.cs index 659c0a28f9..f127b0cd14 100644 --- a/src/Umbraco.Web/Editors/CodeFileController.cs +++ b/src/Umbraco.Web/Editors/CodeFileController.cs @@ -24,6 +24,7 @@ using Umbraco.Web.Trees; using Stylesheet = Umbraco.Core.Models.Stylesheet; using StylesheetRule = Umbraco.Web.Models.ContentEditing.StylesheetRule; using Umbraco.Core.Mapping; +using Umbraco.Web.Routing; namespace Umbraco.Web.Editors { @@ -49,8 +50,9 @@ namespace Umbraco.Web.Editors IShortStringHelper shortStringHelper, UmbracoMapper umbracoMapper, IIOHelper ioHelper, - IFileSystems fileSystems) - : base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, shortStringHelper, umbracoMapper) + IFileSystems fileSystems, + IPublishedUrlProvider publishedUrlProvider) + : base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, shortStringHelper, umbracoMapper, publishedUrlProvider) { _ioHelper = ioHelper; _fileSystems = fileSystems; diff --git a/src/Umbraco.Web/Editors/ContentController.cs b/src/Umbraco.Web/Editors/ContentController.cs index 5a6cad75b5..ce90955823 100644 --- a/src/Umbraco.Web/Editors/ContentController.cs +++ b/src/Umbraco.Web/Editors/ContentController.cs @@ -70,8 +70,10 @@ namespace Umbraco.Web.Editors IProfilingLogger logger, IRuntimeState runtimeState, UmbracoHelper umbracoHelper, - IShortStringHelper shortStringHelper, UmbracoMapper umbracoMapper) - : base(cultureDictionary, globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, shortStringHelper, umbracoMapper) + IShortStringHelper shortStringHelper, + UmbracoMapper umbracoMapper, + IPublishedUrlProvider publishedUrlProvider) + : base(cultureDictionary, globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, shortStringHelper, umbracoMapper, publishedUrlProvider) { _propertyEditors = propertyEditors ?? throw new ArgumentNullException(nameof(propertyEditors)); _allLangs = new Lazy>(() => Services.LocalizationService.GetAllLanguages().ToDictionary(x => x.IsoCode, x => x, StringComparer.InvariantCultureIgnoreCase)); diff --git a/src/Umbraco.Web/Editors/ContentControllerBase.cs b/src/Umbraco.Web/Editors/ContentControllerBase.cs index 147d28f00b..83d5a87323 100644 --- a/src/Umbraco.Web/Editors/ContentControllerBase.cs +++ b/src/Umbraco.Web/Editors/ContentControllerBase.cs @@ -17,6 +17,7 @@ using Umbraco.Core.Services; using Umbraco.Core.Strings; using Umbraco.Web.Composing; using Umbraco.Web.Models.ContentEditing; +using Umbraco.Web.Routing; using Umbraco.Web.WebApi; using Umbraco.Web.WebApi.Filters; @@ -41,8 +42,9 @@ namespace Umbraco.Web.Editors IRuntimeState runtimeState, UmbracoHelper umbracoHelper, IShortStringHelper shortStringHelper, - UmbracoMapper umbracoMapper) - :base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, shortStringHelper, umbracoMapper) + UmbracoMapper umbracoMapper, + IPublishedUrlProvider publishedUrlProvider) + :base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, shortStringHelper, umbracoMapper, publishedUrlProvider) { CultureDictionary = cultureDictionary; } diff --git a/src/Umbraco.Web/Editors/ContentTypeController.cs b/src/Umbraco.Web/Editors/ContentTypeController.cs index 60849a5afb..8cbe51054a 100644 --- a/src/Umbraco.Web/Editors/ContentTypeController.cs +++ b/src/Umbraco.Web/Editors/ContentTypeController.cs @@ -30,6 +30,7 @@ using Umbraco.Web.WebApi; using Umbraco.Web.WebApi.Filters; using Constants = Umbraco.Core.Constants; using Umbraco.Core.Mapping; +using Umbraco.Web.Routing; namespace Umbraco.Web.Editors { @@ -56,12 +57,19 @@ namespace Umbraco.Web.Editors ICultureDictionary cultureDictionary, IGlobalSettings globalSettings, IUmbracoContextAccessor umbracoContextAccessor, - ISqlContext sqlContext, PropertyEditorCollection propertyEditors, - ServiceContext services, AppCaches appCaches, - IProfilingLogger logger, IRuntimeState runtimeState, UmbracoHelper umbracoHelper, + ISqlContext sqlContext, + PropertyEditorCollection propertyEditors, + ServiceContext services, + AppCaches appCaches, + IProfilingLogger logger, + IRuntimeState runtimeState, + UmbracoHelper umbracoHelper, IScopeProvider scopeProvider, - IShortStringHelper shortStringHelper, UmbracoMapper umbracoMapper, IIOHelper ioHelper) - : base(cultureDictionary, globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, shortStringHelper, umbracoMapper) + IShortStringHelper shortStringHelper, + UmbracoMapper umbracoMapper, + IIOHelper ioHelper, + IPublishedUrlProvider publishedUrlProvider) + : base(cultureDictionary, globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, shortStringHelper, umbracoMapper, publishedUrlProvider) { _serializer = serializer; _globalSettings = globalSettings; diff --git a/src/Umbraco.Web/Editors/ContentTypeControllerBase.cs b/src/Umbraco.Web/Editors/ContentTypeControllerBase.cs index 5213953fee..4abd7d8c02 100644 --- a/src/Umbraco.Web/Editors/ContentTypeControllerBase.cs +++ b/src/Umbraco.Web/Editors/ContentTypeControllerBase.cs @@ -18,6 +18,7 @@ using Umbraco.Core.Services; using Umbraco.Core.Strings; using Umbraco.Web.Models.ContentEditing; using Umbraco.Web.Mvc; +using Umbraco.Web.Routing; using Umbraco.Web.WebApi; namespace Umbraco.Web.Editors @@ -30,8 +31,20 @@ namespace Umbraco.Web.Editors public abstract class ContentTypeControllerBase : UmbracoAuthorizedJsonController where TContentType : class, IContentTypeComposition { - protected ContentTypeControllerBase(ICultureDictionary cultureDictionary, IGlobalSettings globalSettings, IUmbracoContextAccessor umbracoContextAccessor, ISqlContext sqlContext, ServiceContext services, AppCaches appCaches, IProfilingLogger logger, IRuntimeState runtimeState, UmbracoHelper umbracoHelper, IShortStringHelper shortStringHelper, UmbracoMapper umbracoMapper) - : base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, shortStringHelper, umbracoMapper) + protected ContentTypeControllerBase( + ICultureDictionary cultureDictionary, + IGlobalSettings globalSettings, + IUmbracoContextAccessor umbracoContextAccessor, + ISqlContext sqlContext, + ServiceContext services, + AppCaches appCaches, + IProfilingLogger logger, + IRuntimeState runtimeState, + UmbracoHelper umbracoHelper, + IShortStringHelper shortStringHelper, + UmbracoMapper umbracoMapper, + IPublishedUrlProvider publishedUrlProvider) + : base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, shortStringHelper, umbracoMapper, publishedUrlProvider) { CultureDictionary = cultureDictionary; } @@ -550,6 +563,6 @@ namespace Umbraco.Web.Editors forDisplay.Errors = ModelState.ToErrorDictionary(); return new HttpResponseException(Request.CreateValidationErrorResponse(forDisplay)); - } + } } } diff --git a/src/Umbraco.Web/Editors/CurrentUserController.cs b/src/Umbraco.Web/Editors/CurrentUserController.cs index 94406d828b..36f39940cb 100644 --- a/src/Umbraco.Web/Editors/CurrentUserController.cs +++ b/src/Umbraco.Web/Editors/CurrentUserController.cs @@ -23,6 +23,7 @@ using Umbraco.Web.WebApi.Filters; using Umbraco.Core.Mapping; using Umbraco.Core.Configuration.UmbracoSettings; using Umbraco.Core.Models; +using Umbraco.Web.Routing; namespace Umbraco.Web.Editors { @@ -51,8 +52,9 @@ namespace Umbraco.Web.Editors UmbracoMapper umbracoMapper, IUmbracoSettingsSection umbracoSettingsSection, IIOHelper ioHelper, - IImageUrlGenerator imageUrlGenerator) - : base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, shortStringHelper, umbracoMapper) + IImageUrlGenerator imageUrlGenerator, + IPublishedUrlProvider publishedUrlProvider) + : base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, shortStringHelper, umbracoMapper, publishedUrlProvider) { _mediaFileSystem = mediaFileSystem; _umbracoSettingsSection = umbracoSettingsSection ?? throw new ArgumentNullException(nameof(umbracoSettingsSection)); diff --git a/src/Umbraco.Web/Editors/DashboardController.cs b/src/Umbraco.Web/Editors/DashboardController.cs index 158b0b40e7..8c955b5c29 100644 --- a/src/Umbraco.Web/Editors/DashboardController.cs +++ b/src/Umbraco.Web/Editors/DashboardController.cs @@ -21,6 +21,7 @@ using Umbraco.Core.Dashboards; using Umbraco.Core.Strings; using Umbraco.Web.Services; using Umbraco.Core.Mapping; +using Umbraco.Web.Routing; namespace Umbraco.Web.Editors { @@ -52,8 +53,9 @@ namespace Umbraco.Web.Editors UmbracoHelper umbracoHelper, IUmbracoVersion umbracoVersion, IShortStringHelper shortStringHelper, - UmbracoMapper umbracoMapper) - : base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, umbracoMapper) + UmbracoMapper umbracoMapper, + IPublishedUrlProvider publishedUrlProvider) + : base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, umbracoMapper,publishedUrlProvider) { _dashboardService = dashboardService; _umbracoVersion = umbracoVersion; diff --git a/src/Umbraco.Web/Editors/DataTypeController.cs b/src/Umbraco.Web/Editors/DataTypeController.cs index 448fbbc2e2..3d205dcaed 100644 --- a/src/Umbraco.Web/Editors/DataTypeController.cs +++ b/src/Umbraco.Web/Editors/DataTypeController.cs @@ -24,6 +24,7 @@ using Constants = Umbraco.Core.Constants; using Umbraco.Core.Mapping; using System.Web.Http.Controllers; using Umbraco.Core.Configuration.UmbracoSettings; +using Umbraco.Web.Routing; namespace Umbraco.Web.Editors { @@ -44,8 +45,21 @@ namespace Umbraco.Web.Editors private readonly PropertyEditorCollection _propertyEditors; private readonly IUmbracoSettingsSection _umbracoSettingsSection; - public DataTypeController(PropertyEditorCollection propertyEditors, IGlobalSettings globalSettings, IUmbracoContextAccessor umbracoContextAccessor, ISqlContext sqlContext, ServiceContext services, AppCaches appCaches, IProfilingLogger logger, IRuntimeState runtimeState, UmbracoHelper umbracoHelper, IShortStringHelper shortStringHelper, UmbracoMapper umbracoMapper, IUmbracoSettingsSection umbracoSettingsSection) - : base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, shortStringHelper, umbracoMapper) + public DataTypeController( + PropertyEditorCollection propertyEditors, + IGlobalSettings globalSettings, + IUmbracoContextAccessor umbracoContextAccessor, + ISqlContext sqlContext, + ServiceContext services, + AppCaches appCaches, + IProfilingLogger logger, + IRuntimeState runtimeState, + UmbracoHelper umbracoHelper, + IShortStringHelper shortStringHelper, + UmbracoMapper umbracoMapper, + IUmbracoSettingsSection umbracoSettingsSection, + IPublishedUrlProvider publishedUrlProvider) + : base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, shortStringHelper, umbracoMapper, publishedUrlProvider) { _propertyEditors = propertyEditors; _umbracoSettingsSection = umbracoSettingsSection ?? throw new ArgumentNullException(nameof(umbracoSettingsSection)); diff --git a/src/Umbraco.Web/Editors/DictionaryController.cs b/src/Umbraco.Web/Editors/DictionaryController.cs index 89137ea2d7..8d835b74b8 100644 --- a/src/Umbraco.Web/Editors/DictionaryController.cs +++ b/src/Umbraco.Web/Editors/DictionaryController.cs @@ -15,6 +15,7 @@ using Umbraco.Core.Services; using Umbraco.Core.Strings; using Umbraco.Web.Models.ContentEditing; using Umbraco.Web.Mvc; +using Umbraco.Web.Routing; using Umbraco.Web.WebApi; using Umbraco.Web.WebApi.Filters; using Constants = Umbraco.Core.Constants; @@ -34,8 +35,19 @@ namespace Umbraco.Web.Editors [EnableOverrideAuthorization] public class DictionaryController : BackOfficeNotificationsController { - public DictionaryController(IGlobalSettings globalSettings, IUmbracoContextAccessor umbracoContextAccessor, ISqlContext sqlContext, ServiceContext services, AppCaches appCaches, IProfilingLogger logger, IRuntimeState runtimeState, UmbracoHelper umbracoHelper, IShortStringHelper shortStringHelper, UmbracoMapper umbracoMapper) - : base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, shortStringHelper, umbracoMapper) + public DictionaryController( + IGlobalSettings globalSettings, + IUmbracoContextAccessor umbracoContextAccessor, + ISqlContext sqlContext, + ServiceContext services, + AppCaches appCaches, + IProfilingLogger logger, + IRuntimeState runtimeState, + UmbracoHelper umbracoHelper, + IShortStringHelper shortStringHelper, + UmbracoMapper umbracoMapper, + IPublishedUrlProvider publishedUrlProvider) + : base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, shortStringHelper, umbracoMapper, publishedUrlProvider) { } diff --git a/src/Umbraco.Web/Editors/EntityController.cs b/src/Umbraco.Web/Editors/EntityController.cs index 9b0c1f064f..ee8d08fc07 100644 --- a/src/Umbraco.Web/Editors/EntityController.cs +++ b/src/Umbraco.Web/Editors/EntityController.cs @@ -31,6 +31,7 @@ using Umbraco.Web.WebApi; using Umbraco.Web.WebApi.Filters; using Constants = Umbraco.Core.Constants; using Umbraco.Core.Mapping; +using Umbraco.Web.Routing; namespace Umbraco.Web.Editors { @@ -66,8 +67,9 @@ namespace Umbraco.Web.Editors SearchableTreeCollection searchableTreeCollection, UmbracoTreeSearcher treeSearcher, IShortStringHelper shortStringHelper, - UmbracoMapper umbracoMapper) - : base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, shortStringHelper, umbracoMapper) + UmbracoMapper umbracoMapper, + IPublishedUrlProvider publishedUrlProvider) + : base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, shortStringHelper, umbracoMapper, publishedUrlProvider) { _treeService = treeService; _searchableTreeCollection = searchableTreeCollection; @@ -347,7 +349,7 @@ namespace Umbraco.Web.Editors { culture = culture ?? ClientCulture(); - var url = UmbracoContext.UrlProvider.GetUrl(id, culture: culture); + var url = PublishedUrlProvider.GetUrl(id, culture: culture); var anchorValues = Services.ContentService.GetAnchorValuesFromRTEs(id, culture); return new UrlAndAnchors(url, anchorValues); } diff --git a/src/Umbraco.Web/Editors/LogController.cs b/src/Umbraco.Web/Editors/LogController.cs index 0f7f19e658..7bcc0baa01 100644 --- a/src/Umbraco.Web/Editors/LogController.cs +++ b/src/Umbraco.Web/Editors/LogController.cs @@ -13,6 +13,7 @@ using Umbraco.Core.Services; using Umbraco.Core.Strings; using Umbraco.Web.Models.ContentEditing; using Umbraco.Web.Mvc; +using Umbraco.Web.Routing; using Umbraco.Web.WebApi.Filters; namespace Umbraco.Web.Editors @@ -38,8 +39,9 @@ namespace Umbraco.Web.Editors IMediaFileSystem mediaFileSystem, IShortStringHelper shortStringHelper, UmbracoMapper umbracoMapper, - IImageUrlGenerator imageUrlGenerator) - : base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, shortStringHelper, umbracoMapper) + IImageUrlGenerator imageUrlGenerator, + IPublishedUrlProvider publishedUrlProvider) + : base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, shortStringHelper, umbracoMapper, publishedUrlProvider) { _mediaFileSystem = mediaFileSystem; _imageUrlGenerator = imageUrlGenerator; diff --git a/src/Umbraco.Web/Editors/MacroRenderingController.cs b/src/Umbraco.Web/Editors/MacroRenderingController.cs index d96533b165..950a7cb0ef 100644 --- a/src/Umbraco.Web/Editors/MacroRenderingController.cs +++ b/src/Umbraco.Web/Editors/MacroRenderingController.cs @@ -20,6 +20,7 @@ using Umbraco.Core.Models.PublishedContent; using Umbraco.Core.Persistence; using Umbraco.Core.Services; using Umbraco.Core.Strings; +using Umbraco.Web.Routing; namespace Umbraco.Web.Editors { @@ -52,7 +53,8 @@ namespace Umbraco.Web.Editors UmbracoMapper umbracoMapper, IUmbracoComponentRenderer componentRenderer, IVariationContextAccessor variationContextAccessor, - IMacroService macroService) + IMacroService macroService, + IPublishedUrlProvider publishedUrlProvider) : base( globalSettings, umbracoContextAccessor, @@ -63,7 +65,8 @@ namespace Umbraco.Web.Editors runtimeState, umbracoHelper, shortStringHelper, - umbracoMapper) + umbracoMapper, + publishedUrlProvider) { _componentRenderer = componentRenderer; _variationContextAccessor = variationContextAccessor; diff --git a/src/Umbraco.Web/Editors/MacrosController.cs b/src/Umbraco.Web/Editors/MacrosController.cs index 5965ca40ee..67e75f17c2 100644 --- a/src/Umbraco.Web/Editors/MacrosController.cs +++ b/src/Umbraco.Web/Editors/MacrosController.cs @@ -22,6 +22,7 @@ using Umbraco.Core.Mapping; using System.Web.Http.Controllers; using Umbraco.Core.IO; using Umbraco.Core.PropertyEditors; +using Umbraco.Web.Routing; namespace Umbraco.Web.Editors { @@ -50,8 +51,9 @@ namespace Umbraco.Web.Editors IShortStringHelper shortStringHelper, UmbracoMapper umbracoMapper, ParameterEditorCollection parameterEditorCollection, - IIOHelper ioHelper) - : base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, shortStringHelper, umbracoMapper) + IIOHelper ioHelper, + IPublishedUrlProvider publishedUrlProvider) + : base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, shortStringHelper, umbracoMapper, publishedUrlProvider) { _parameterEditorCollection = parameterEditorCollection; _ioHelper = ioHelper; diff --git a/src/Umbraco.Web/Editors/MediaController.cs b/src/Umbraco.Web/Editors/MediaController.cs index 51c7794373..328a1be238 100644 --- a/src/Umbraco.Web/Editors/MediaController.cs +++ b/src/Umbraco.Web/Editors/MediaController.cs @@ -37,6 +37,7 @@ using Umbraco.Web.Editors.Filters; using Umbraco.Web.WebApi.Filters; using Constants = Umbraco.Core.Constants; using Umbraco.Core.Mapping; +using Umbraco.Web.Routing; namespace Umbraco.Web.Editors { @@ -67,8 +68,9 @@ namespace Umbraco.Web.Editors IShortStringHelper shortStringHelper, UmbracoMapper umbracoMapper, IUmbracoSettingsSection umbracoSettingsSection, - IIOHelper ioHelper) - : base(cultureDictionary, globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, shortStringHelper, umbracoMapper) + IIOHelper ioHelper, + IPublishedUrlProvider publishedUrlProvider) + : base(cultureDictionary, globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, shortStringHelper, umbracoMapper, publishedUrlProvider) { _propertyEditors = propertyEditors ?? throw new ArgumentNullException(nameof(propertyEditors)); _mediaFileSystem = mediaFileSystem; diff --git a/src/Umbraco.Web/Editors/MediaTypeController.cs b/src/Umbraco.Web/Editors/MediaTypeController.cs index d244a17f2a..7aa2c028a2 100644 --- a/src/Umbraco.Web/Editors/MediaTypeController.cs +++ b/src/Umbraco.Web/Editors/MediaTypeController.cs @@ -22,6 +22,7 @@ using Umbraco.Web.Composing; using Constants = Umbraco.Core.Constants; using IMediaType = Umbraco.Core.Models.IMediaType; using Umbraco.Core.Mapping; +using Umbraco.Web.Routing; namespace Umbraco.Web.Editors { @@ -41,8 +42,21 @@ namespace Umbraco.Web.Editors private readonly IShortStringHelper _shortStringHelper; private readonly IEntityService _entityService; - public MediaTypeController(ICultureDictionary cultureDictionary, IGlobalSettings globalSettings, IUmbracoContextAccessor umbracoContextAccessor, ISqlContext sqlContext, ServiceContext services, AppCaches appCaches, IProfilingLogger logger, IRuntimeState runtimeState, UmbracoHelper umbracoHelper, IShortStringHelper shortStringHelper, UmbracoMapper umbracoMapper, IEntityService entityService) - : base(cultureDictionary, globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, shortStringHelper, umbracoMapper) + public MediaTypeController( + ICultureDictionary cultureDictionary, + IGlobalSettings globalSettings, + IUmbracoContextAccessor umbracoContextAccessor, + ISqlContext sqlContext, + ServiceContext services, + AppCaches appCaches, + IProfilingLogger logger, + IRuntimeState runtimeState, + UmbracoHelper umbracoHelper, + IShortStringHelper shortStringHelper, + UmbracoMapper umbracoMapper, + IEntityService entityService, + IPublishedUrlProvider publishedUrlProvider) + : base(cultureDictionary, globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, shortStringHelper, umbracoMapper, publishedUrlProvider) { _shortStringHelper = shortStringHelper; _entityService = entityService ?? throw new ArgumentNullException(nameof(entityService)); diff --git a/src/Umbraco.Web/Editors/MemberController.cs b/src/Umbraco.Web/Editors/MemberController.cs index 526924933a..9493047a56 100644 --- a/src/Umbraco.Web/Editors/MemberController.cs +++ b/src/Umbraco.Web/Editors/MemberController.cs @@ -33,6 +33,7 @@ using Umbraco.Web.WebApi.Filters; using Constants = Umbraco.Core.Constants; using Umbraco.Core.Strings; using Umbraco.Core.Mapping; +using Umbraco.Web.Routing; namespace Umbraco.Web.Editors { @@ -58,8 +59,9 @@ namespace Umbraco.Web.Editors IRuntimeState runtimeState, UmbracoHelper umbracoHelper, IShortStringHelper shortStringHelper, - UmbracoMapper umbracoMapper) - : base(cultureDictionary, globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, shortStringHelper, umbracoMapper) + UmbracoMapper umbracoMapper, + IPublishedUrlProvider publishedUrlProvider) + : base(cultureDictionary, globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, shortStringHelper, umbracoMapper, publishedUrlProvider) { _passwordConfig = passwordConfig ?? throw new ArgumentNullException(nameof(passwordConfig)); _propertyEditors = propertyEditors ?? throw new ArgumentNullException(nameof(propertyEditors)); diff --git a/src/Umbraco.Web/Editors/MemberTypeController.cs b/src/Umbraco.Web/Editors/MemberTypeController.cs index 1270e5fc0a..9176de3e37 100644 --- a/src/Umbraco.Web/Editors/MemberTypeController.cs +++ b/src/Umbraco.Web/Editors/MemberTypeController.cs @@ -19,6 +19,7 @@ using Umbraco.Web.Mvc; using Umbraco.Web.WebApi.Filters; using Constants = Umbraco.Core.Constants; using Umbraco.Core.Mapping; +using Umbraco.Web.Routing; namespace Umbraco.Web.Editors { @@ -29,8 +30,20 @@ namespace Umbraco.Web.Editors [UmbracoTreeAuthorize(new string[] { Constants.Trees.MemberTypes, Constants.Trees.Members})] public class MemberTypeController : ContentTypeControllerBase { - public MemberTypeController(ICultureDictionary cultureDictionary, IGlobalSettings globalSettings, IUmbracoContextAccessor umbracoContextAccessor, ISqlContext sqlContext, ServiceContext services, AppCaches appCaches, IProfilingLogger logger, IRuntimeState runtimeState, UmbracoHelper umbracoHelper, IShortStringHelper shortStringHelper, UmbracoMapper umbracoMapper) - : base(cultureDictionary, globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, shortStringHelper, umbracoMapper) + public MemberTypeController( + ICultureDictionary cultureDictionary, + IGlobalSettings globalSettings, + IUmbracoContextAccessor umbracoContextAccessor, + ISqlContext sqlContext, + ServiceContext services, + AppCaches appCaches, + IProfilingLogger logger, + IRuntimeState runtimeState, + UmbracoHelper umbracoHelper, + IShortStringHelper shortStringHelper, + UmbracoMapper umbracoMapper, + IPublishedUrlProvider publishedUrlProvider) + : base(cultureDictionary, globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, shortStringHelper, umbracoMapper, publishedUrlProvider) { } diff --git a/src/Umbraco.Web/Editors/PackageController.cs b/src/Umbraco.Web/Editors/PackageController.cs index e2679b240c..a43bae566f 100644 --- a/src/Umbraco.Web/Editors/PackageController.cs +++ b/src/Umbraco.Web/Editors/PackageController.cs @@ -19,6 +19,7 @@ using Umbraco.Core.Persistence; using Umbraco.Core.Services; using Umbraco.Core.Strings; using Umbraco.Web.Mvc; +using Umbraco.Web.Routing; using Umbraco.Web.WebApi; using Umbraco.Web.WebApi.Filters; @@ -45,8 +46,9 @@ namespace Umbraco.Web.Editors UmbracoHelper umbracoHelper, IShortStringHelper shortStringHelper, UmbracoMapper umbracoMapper, - IIOHelper ioHelper) - : base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, shortStringHelper, umbracoMapper) + IIOHelper ioHelper, + IPublishedUrlProvider publishedUrlProvider) + : base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, shortStringHelper, umbracoMapper, publishedUrlProvider) { _ioHelper = ioHelper; } diff --git a/src/Umbraco.Web/Editors/PackageInstallController.cs b/src/Umbraco.Web/Editors/PackageInstallController.cs index c51a19387a..4563547346 100644 --- a/src/Umbraco.Web/Editors/PackageInstallController.cs +++ b/src/Umbraco.Web/Editors/PackageInstallController.cs @@ -22,6 +22,7 @@ using Umbraco.Web.JavaScript; using Umbraco.Web.Models; using Umbraco.Web.Models.ContentEditing; using Umbraco.Web.Mvc; +using Umbraco.Web.Routing; using Umbraco.Web.WebApi; using Umbraco.Web.WebApi.Filters; using File = System.IO.File; @@ -51,8 +52,9 @@ namespace Umbraco.Web.Editors IShortStringHelper shortStringHelper, IUmbracoVersion umbracoVersion, UmbracoMapper umbracoMapper, - IIOHelper ioHelper) - : base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, shortStringHelper, umbracoMapper) + IIOHelper ioHelper, + IPublishedUrlProvider publishedUrlProvider) + : base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, shortStringHelper, umbracoMapper, publishedUrlProvider) { _umbracoVersion = umbracoVersion; _ioHelper = ioHelper; diff --git a/src/Umbraco.Web/Editors/RelationTypeController.cs b/src/Umbraco.Web/Editors/RelationTypeController.cs index 9910bce2d0..26d9f60cf9 100644 --- a/src/Umbraco.Web/Editors/RelationTypeController.cs +++ b/src/Umbraco.Web/Editors/RelationTypeController.cs @@ -18,6 +18,7 @@ using Umbraco.Web.WebApi; using Umbraco.Web.WebApi.Filters; using Constants = Umbraco.Core.Constants; using Umbraco.Core.Mapping; +using Umbraco.Web.Routing; namespace Umbraco.Web.Editors { @@ -39,8 +40,9 @@ namespace Umbraco.Web.Editors IRuntimeState runtimeState, UmbracoHelper umbracoHelper, IShortStringHelper shortStringHelper, - UmbracoMapper umbracoMapper) - : base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, shortStringHelper, umbracoMapper) + UmbracoMapper umbracoMapper, + IPublishedUrlProvider publishedUrlProvider) + : base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, shortStringHelper, umbracoMapper, publishedUrlProvider) { } diff --git a/src/Umbraco.Web/Editors/SectionController.cs b/src/Umbraco.Web/Editors/SectionController.cs index a4d41fcb35..88da2a1166 100644 --- a/src/Umbraco.Web/Editors/SectionController.cs +++ b/src/Umbraco.Web/Editors/SectionController.cs @@ -14,6 +14,7 @@ using Section = Umbraco.Web.Models.ContentEditing.Section; using Umbraco.Web.Models.Trees; using Umbraco.Web.Services; using Umbraco.Core.Mapping; +using Umbraco.Web.Routing; namespace Umbraco.Web.Editors { @@ -28,8 +29,8 @@ namespace Umbraco.Web.Editors private readonly ITreeService _treeService; public SectionController(IGlobalSettings globalSettings, IUmbracoContextAccessor umbracoContextAccessor, ISqlContext sqlContext, ServiceContext services, AppCaches appCaches, IProfilingLogger logger, IRuntimeState runtimeState, - IDashboardService dashboardService, ISectionService sectionService, ITreeService treeService, UmbracoHelper umbracoHelper, IShortStringHelper shortStringHelper, UmbracoMapper umbracoMapper) - : base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, shortStringHelper, umbracoMapper) + IDashboardService dashboardService, ISectionService sectionService, ITreeService treeService, UmbracoHelper umbracoHelper, IShortStringHelper shortStringHelper, UmbracoMapper umbracoMapper, IPublishedUrlProvider publishedUrlProvider) + : base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, shortStringHelper, umbracoMapper, publishedUrlProvider) { _dashboardService = dashboardService; _sectionService = sectionService; @@ -44,7 +45,7 @@ namespace Umbraco.Web.Editors // this is a bit nasty since we'll be proxying via the app tree controller but we sort of have to do that // since tree's by nature are controllers and require request contextual data - var appTreeController = new ApplicationTreeController(GlobalSettings, UmbracoContextAccessor, SqlContext, Services, AppCaches, Logger, RuntimeState, _treeService, _sectionService, Umbraco, Mapper) + var appTreeController = new ApplicationTreeController(GlobalSettings, UmbracoContextAccessor, SqlContext, Services, AppCaches, Logger, RuntimeState, _treeService, _sectionService, Umbraco, Mapper, PublishedUrlProvider) { ControllerContext = ControllerContext }; diff --git a/src/Umbraco.Web/Editors/TemplateController.cs b/src/Umbraco.Web/Editors/TemplateController.cs index 2250b16485..fe86cabd01 100644 --- a/src/Umbraco.Web/Editors/TemplateController.cs +++ b/src/Umbraco.Web/Editors/TemplateController.cs @@ -16,6 +16,7 @@ using Umbraco.Core.Services; using Umbraco.Core.Strings; using Umbraco.Web.Models.ContentEditing; using Umbraco.Web.Mvc; +using Umbraco.Web.Routing; using Umbraco.Web.WebApi.Filters; using Constants = Umbraco.Core.Constants; @@ -25,8 +26,19 @@ namespace Umbraco.Web.Editors [UmbracoTreeAuthorize(Constants.Trees.Templates)] public class TemplateController : BackOfficeNotificationsController { - public TemplateController(IGlobalSettings globalSettings, IUmbracoContextAccessor umbracoContextAccessor, ISqlContext sqlContext, ServiceContext services, AppCaches appCaches, IProfilingLogger logger, IRuntimeState runtimeState, UmbracoHelper umbracoHelper, IShortStringHelper shortStringHelper, UmbracoMapper umbracoMapper) - : base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, shortStringHelper, umbracoMapper) + public TemplateController( + IGlobalSettings globalSettings, + IUmbracoContextAccessor umbracoContextAccessor, + ISqlContext sqlContext, + ServiceContext services, + AppCaches appCaches, + IProfilingLogger logger, + IRuntimeState runtimeState, + UmbracoHelper umbracoHelper, + IShortStringHelper shortStringHelper, + UmbracoMapper umbracoMapper, + IPublishedUrlProvider publishedUrlProvider) + : base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, shortStringHelper, umbracoMapper, publishedUrlProvider) { } diff --git a/src/Umbraco.Web/Editors/TemplateQueryController.cs b/src/Umbraco.Web/Editors/TemplateQueryController.cs index 193c8391c8..ed8023cc8d 100644 --- a/src/Umbraco.Web/Editors/TemplateQueryController.cs +++ b/src/Umbraco.Web/Editors/TemplateQueryController.cs @@ -14,6 +14,7 @@ using Umbraco.Core.Services; using Umbraco.Core.Strings; using Umbraco.Web.Models.TemplateQuery; using Umbraco.Web.Mvc; +using Umbraco.Web.Routing; using Umbraco.Web.WebApi; namespace Umbraco.Web.Editors @@ -38,8 +39,9 @@ namespace Umbraco.Web.Editors UmbracoHelper umbracoHelper, IVariationContextAccessor variationContextAccessor, IShortStringHelper shortStringHelper, - UmbracoMapper umbracoMapper) - : base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, shortStringHelper, umbracoMapper) + UmbracoMapper umbracoMapper, + IPublishedUrlProvider publishedUrlProvider) + : base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, shortStringHelper, umbracoMapper, publishedUrlProvider) { _variationContextAccessor = variationContextAccessor; } diff --git a/src/Umbraco.Web/Editors/TinyMceController.cs b/src/Umbraco.Web/Editors/TinyMceController.cs index 4621f1d447..fdb67df1bf 100644 --- a/src/Umbraco.Web/Editors/TinyMceController.cs +++ b/src/Umbraco.Web/Editors/TinyMceController.cs @@ -16,6 +16,7 @@ using Umbraco.Core.Persistence; using Umbraco.Core.Services; using Umbraco.Core.Strings; using Umbraco.Web.Mvc; +using Umbraco.Web.Routing; using Umbraco.Web.WebApi; using Umbraco.Web.WebApi.Filters; using Constants = Umbraco.Core.Constants; @@ -45,8 +46,9 @@ namespace Umbraco.Web.Editors UmbracoMapper umbracoMapper, IShortStringHelper shortStringHelper, IUmbracoSettingsSection umbracoSettingsSection, - IIOHelper ioHelper) - : base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, umbracoMapper) + IIOHelper ioHelper, + IPublishedUrlProvider publishedUrlProvider) + : base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, umbracoMapper, publishedUrlProvider) { _shortStringHelper = shortStringHelper ?? throw new ArgumentNullException(nameof(shortStringHelper)); _umbracoSettingsSection = umbracoSettingsSection ?? throw new ArgumentNullException(nameof(umbracoSettingsSection)); diff --git a/src/Umbraco.Web/Editors/TourController.cs b/src/Umbraco.Web/Editors/TourController.cs index 97553b5143..c5be44b809 100644 --- a/src/Umbraco.Web/Editors/TourController.cs +++ b/src/Umbraco.Web/Editors/TourController.cs @@ -16,6 +16,7 @@ using Umbraco.Core.Services; using Umbraco.Core.Strings; using Umbraco.Web.Models; using Umbraco.Web.Mvc; +using Umbraco.Web.Routing; using Umbraco.Web.Tour; namespace Umbraco.Web.Editors @@ -42,8 +43,9 @@ namespace Umbraco.Web.Editors TourFilterCollection filters, IUmbracoSettingsSection umbracoSettingsSection, IIOHelper ioHelper, - ICurrentUserAccessor currentUserAccessor) - : base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, shortStringHelper, umbracoMapper) + ICurrentUserAccessor currentUserAccessor, + IPublishedUrlProvider publishedUrlProvider) + : base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, shortStringHelper, umbracoMapper, publishedUrlProvider) { _filters = filters; _umbracoSettingsSection = umbracoSettingsSection ?? throw new ArgumentNullException(nameof(umbracoSettingsSection)); diff --git a/src/Umbraco.Web/Editors/UmbracoAuthorizedJsonController.cs b/src/Umbraco.Web/Editors/UmbracoAuthorizedJsonController.cs index fb4fd929f8..d55a901525 100644 --- a/src/Umbraco.Web/Editors/UmbracoAuthorizedJsonController.cs +++ b/src/Umbraco.Web/Editors/UmbracoAuthorizedJsonController.cs @@ -8,6 +8,7 @@ using Umbraco.Core.Persistence; using Umbraco.Core.Services; using Umbraco.Core.Strings; using Umbraco.Web.Composing; +using Umbraco.Web.Routing; using Umbraco.Web.WebApi; using Umbraco.Web.WebApi.Filters; @@ -29,8 +30,19 @@ namespace Umbraco.Web.Editors ShortStringHelper = Current.ShortStringHelper; } - protected UmbracoAuthorizedJsonController(IGlobalSettings globalSettings, IUmbracoContextAccessor umbracoContextAccessor, ISqlContext sqlContext, ServiceContext services, AppCaches appCaches, IProfilingLogger logger, IRuntimeState runtimeState, UmbracoHelper umbracoHelper, IShortStringHelper shortStringHelper, UmbracoMapper umbracoMapper) - : base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, umbracoMapper) + protected UmbracoAuthorizedJsonController( + IGlobalSettings globalSettings, + IUmbracoContextAccessor umbracoContextAccessor, + ISqlContext sqlContext, + ServiceContext services, + AppCaches appCaches, + IProfilingLogger logger, + IRuntimeState runtimeState, + UmbracoHelper umbracoHelper, + IShortStringHelper shortStringHelper, + UmbracoMapper umbracoMapper, + IPublishedUrlProvider publishedUrlProvider) + : base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, umbracoMapper, publishedUrlProvider) { ShortStringHelper = shortStringHelper ?? throw new ArgumentNullException(nameof(shortStringHelper)); } diff --git a/src/Umbraco.Web/Editors/UsersController.cs b/src/Umbraco.Web/Editors/UsersController.cs index 822e44bce8..3390677a08 100644 --- a/src/Umbraco.Web/Editors/UsersController.cs +++ b/src/Umbraco.Web/Editors/UsersController.cs @@ -35,6 +35,7 @@ using IUser = Umbraco.Core.Models.Membership.IUser; using Task = System.Threading.Tasks.Task; using Umbraco.Core.Mapping; using Umbraco.Core.Configuration.UmbracoSettings; +using Umbraco.Web.Routing; namespace Umbraco.Web.Editors { @@ -64,8 +65,9 @@ namespace Umbraco.Web.Editors UmbracoMapper umbracoMapper, IUmbracoSettingsSection umbracoSettingsSection, IIOHelper ioHelper, - IImageUrlGenerator imageUrlGenerator) - : base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, shortStringHelper, umbracoMapper) + IImageUrlGenerator imageUrlGenerator, + IPublishedUrlProvider publishedUrlProvider) + : base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, shortStringHelper, umbracoMapper, publishedUrlProvider) { _mediaFileSystem = mediaFileSystem; _umbracoSettingsSection = umbracoSettingsSection ?? throw new ArgumentNullException(nameof(umbracoSettingsSection)); diff --git a/src/Umbraco.Web/Models/Mapping/ContentMapDefinition.cs b/src/Umbraco.Web/Models/Mapping/ContentMapDefinition.cs index 40249a4750..58fc0c5c1e 100644 --- a/src/Umbraco.Web/Models/Mapping/ContentMapDefinition.cs +++ b/src/Umbraco.Web/Models/Mapping/ContentMapDefinition.cs @@ -31,6 +31,7 @@ namespace Umbraco.Web.Models.Mapping private readonly ILogger _logger; private readonly IUserService _userService; private readonly IVariationContextAccessor _variationContextAccessor; + private readonly IPublishedUrlProvider _publishedUrlProvider; private readonly TabsAndPropertiesMapper _tabsAndPropertiesMapper; private readonly ContentSavedStateMapper _stateMapper; private readonly ContentBasicSavedStateMapper _basicStateMapper; @@ -38,7 +39,7 @@ namespace Umbraco.Web.Models.Mapping public ContentMapDefinition(CommonMapper commonMapper, ICultureDictionary cultureDictionary, ILocalizedTextService localizedTextService, IContentService contentService, IContentTypeService contentTypeService, IFileService fileService, IUmbracoContextAccessor umbracoContextAccessor, IPublishedRouter publishedRouter, ILocalizationService localizationService, ILogger logger, - IUserService userService, IVariationContextAccessor variationContextAccessor, IContentTypeBaseServiceProvider contentTypeBaseServiceProvider) + IUserService userService, IVariationContextAccessor variationContextAccessor, IContentTypeBaseServiceProvider contentTypeBaseServiceProvider, IPublishedUrlProvider publishedUrlProvider) { _commonMapper = commonMapper; _cultureDictionary = cultureDictionary; @@ -52,6 +53,7 @@ namespace Umbraco.Web.Models.Mapping _logger = logger; _userService = userService; _variationContextAccessor = variationContextAccessor; + _publishedUrlProvider = publishedUrlProvider; _tabsAndPropertiesMapper = new TabsAndPropertiesMapper(cultureDictionary, localizedTextService, contentTypeBaseServiceProvider); _stateMapper = new ContentSavedStateMapper(); @@ -177,7 +179,7 @@ namespace Umbraco.Web.Models.Mapping var urls = umbracoContext == null ? new[] { UrlInfo.Message("Cannot generate urls without a current Umbraco Context") } - : source.GetContentUrls(_publishedRouter, umbracoContext, _localizationService, _localizedTextService, _contentService, _variationContextAccessor, _logger).ToArray(); + : source.GetContentUrls(_publishedRouter, umbracoContext, _localizationService, _localizedTextService, _contentService, _variationContextAccessor, _logger, _publishedUrlProvider).ToArray(); return urls; } diff --git a/src/Umbraco.Web/Models/Mapping/RedirectUrlMapDefinition.cs b/src/Umbraco.Web/Models/Mapping/RedirectUrlMapDefinition.cs index c7d65ed56d..9386c60918 100644 --- a/src/Umbraco.Web/Models/Mapping/RedirectUrlMapDefinition.cs +++ b/src/Umbraco.Web/Models/Mapping/RedirectUrlMapDefinition.cs @@ -1,20 +1,19 @@ using Umbraco.Core.Mapping; using Umbraco.Core.Models; using Umbraco.Web.Models.ContentEditing; +using Umbraco.Web.Routing; namespace Umbraco.Web.Models.Mapping { internal class RedirectUrlMapDefinition : IMapDefinition { - private readonly IUmbracoContextAccessor _umbracoContextAccessor; + private readonly IPublishedUrlProvider _publishedUrlProvider; - public RedirectUrlMapDefinition(IUmbracoContextAccessor umbracoContextAccessor) + public RedirectUrlMapDefinition(IPublishedUrlProvider publishedUrlProvider) { - _umbracoContextAccessor = umbracoContextAccessor; + _publishedUrlProvider = publishedUrlProvider; } - private IUmbracoContext UmbracoContext => _umbracoContextAccessor.UmbracoContext; - public void DefineMaps(UmbracoMapper mapper) { mapper.Define((source, context) => new ContentRedirectUrl(), Map); @@ -26,8 +25,8 @@ namespace Umbraco.Web.Models.Mapping target.ContentId = source.ContentId; target.CreateDateUtc = source.CreateDateUtc; target.Culture = source.Culture; - target.DestinationUrl = source.ContentId > 0 ? UmbracoContext?.UrlProvider?.GetUrl(source.ContentId, culture: source.Culture) : "#"; - target.OriginalUrl = UmbracoContext?.UrlProvider?.GetUrlFromRoute(source.ContentId, source.Url, source.Culture); + target.DestinationUrl = source.ContentId > 0 ? _publishedUrlProvider?.GetUrl(source.ContentId, culture: source.Culture) : "#"; + target.OriginalUrl = _publishedUrlProvider?.GetUrlFromRoute(source.ContentId, source.Url, source.Culture); target.RedirectId = source.Key; } } diff --git a/src/Umbraco.Web/Mvc/RedirectToUmbracoPageResult.cs b/src/Umbraco.Web/Mvc/RedirectToUmbracoPageResult.cs index 437eec4e5c..46d6019860 100644 --- a/src/Umbraco.Web/Mvc/RedirectToUmbracoPageResult.cs +++ b/src/Umbraco.Web/Mvc/RedirectToUmbracoPageResult.cs @@ -7,6 +7,7 @@ using Umbraco.Core; using Umbraco.Core.Models; using Umbraco.Core.Models.PublishedContent; using Umbraco.Web.Composing; +using Umbraco.Web.Routing; namespace Umbraco.Web.Mvc { @@ -18,7 +19,7 @@ namespace Umbraco.Web.Mvc private IPublishedContent _publishedContent; private readonly int _pageId; private NameValueCollection _queryStringValues; - private readonly IUmbracoContextAccessor _umbracoContextAccessor; + private IPublishedUrlProvider _publishedUrlProvider; private string _url; public string Url @@ -32,7 +33,7 @@ namespace Umbraco.Web.Mvc throw new InvalidOperationException(string.Format("Cannot redirect, no entity was found for id {0}", _pageId)); } - var result = _umbracoContextAccessor.UmbracoContext.UrlProvider.GetUrl(PublishedContent.Id); + var result = _publishedUrlProvider.GetUrl(PublishedContent.Id); if (result != "#") { _url = result; @@ -67,7 +68,7 @@ namespace Umbraco.Web.Mvc /// /// public RedirectToUmbracoPageResult(int pageId) - : this(pageId, Current.UmbracoContextAccessor) + : this(pageId, Current.PublishedUrlProvider) { } @@ -77,7 +78,7 @@ namespace Umbraco.Web.Mvc /// /// public RedirectToUmbracoPageResult(int pageId, NameValueCollection queryStringValues) - : this(pageId, queryStringValues, Current.UmbracoContextAccessor) + : this(pageId, queryStringValues, Current.PublishedUrlProvider) { } @@ -87,7 +88,7 @@ namespace Umbraco.Web.Mvc /// /// public RedirectToUmbracoPageResult(int pageId, string queryString) - : this(pageId, queryString, Current.UmbracoContextAccessor) + : this(pageId, queryString, Current.PublishedUrlProvider) { } @@ -96,7 +97,7 @@ namespace Umbraco.Web.Mvc /// /// public RedirectToUmbracoPageResult(IPublishedContent publishedContent) - : this(publishedContent, Current.UmbracoContextAccessor) + : this(publishedContent, Current.PublishedUrlProvider) { } @@ -106,7 +107,7 @@ namespace Umbraco.Web.Mvc /// /// public RedirectToUmbracoPageResult(IPublishedContent publishedContent, NameValueCollection queryStringValues) - : this(publishedContent, queryStringValues, Current.UmbracoContextAccessor) + : this(publishedContent, queryStringValues, Current.PublishedUrlProvider) { } @@ -116,7 +117,7 @@ namespace Umbraco.Web.Mvc /// /// public RedirectToUmbracoPageResult(IPublishedContent publishedContent, string queryString) - : this(publishedContent, queryString, Current.UmbracoContextAccessor) + : this(publishedContent, queryString, Current.PublishedUrlProvider) { } @@ -125,10 +126,10 @@ namespace Umbraco.Web.Mvc /// /// /// - public RedirectToUmbracoPageResult(int pageId, IUmbracoContextAccessor umbracoContextAccessor) + public RedirectToUmbracoPageResult(int pageId, IPublishedUrlProvider publishedUrlProvider) { _pageId = pageId; - _umbracoContextAccessor = umbracoContextAccessor; + _publishedUrlProvider = publishedUrlProvider; } /// @@ -137,11 +138,11 @@ namespace Umbraco.Web.Mvc /// /// /// - public RedirectToUmbracoPageResult(int pageId, NameValueCollection queryStringValues, IUmbracoContextAccessor umbracoContextAccessor) + public RedirectToUmbracoPageResult(int pageId, NameValueCollection queryStringValues, IPublishedUrlProvider publishedUrlProvider) { _pageId = pageId; _queryStringValues = queryStringValues; - _umbracoContextAccessor = umbracoContextAccessor; + _publishedUrlProvider = publishedUrlProvider; } /// @@ -150,11 +151,11 @@ namespace Umbraco.Web.Mvc /// /// /// - public RedirectToUmbracoPageResult(int pageId, string queryString, IUmbracoContextAccessor umbracoContextAccessor) + public RedirectToUmbracoPageResult(int pageId, string queryString, IPublishedUrlProvider publishedUrlProvider) { _pageId = pageId; _queryStringValues = ParseQueryString(queryString); - _umbracoContextAccessor = umbracoContextAccessor; + _publishedUrlProvider = publishedUrlProvider; } /// @@ -162,11 +163,11 @@ namespace Umbraco.Web.Mvc /// /// /// - public RedirectToUmbracoPageResult(IPublishedContent publishedContent, IUmbracoContextAccessor umbracoContextAccessor) + public RedirectToUmbracoPageResult(IPublishedContent publishedContent, IPublishedUrlProvider publishedUrlProvider) { _publishedContent = publishedContent; _pageId = publishedContent.Id; - _umbracoContextAccessor = umbracoContextAccessor; + _publishedUrlProvider = publishedUrlProvider; } /// @@ -175,12 +176,12 @@ namespace Umbraco.Web.Mvc /// /// /// - public RedirectToUmbracoPageResult(IPublishedContent publishedContent, NameValueCollection queryStringValues, IUmbracoContextAccessor umbracoContextAccessor) + public RedirectToUmbracoPageResult(IPublishedContent publishedContent, NameValueCollection queryStringValues, IPublishedUrlProvider publishedUrlProvider) { _publishedContent = publishedContent; _pageId = publishedContent.Id; _queryStringValues = queryStringValues; - _umbracoContextAccessor = umbracoContextAccessor; + _publishedUrlProvider = publishedUrlProvider; } /// @@ -189,12 +190,12 @@ namespace Umbraco.Web.Mvc /// /// /// - public RedirectToUmbracoPageResult(IPublishedContent publishedContent, string queryString, IUmbracoContextAccessor umbracoContextAccessor) + public RedirectToUmbracoPageResult(IPublishedContent publishedContent, string queryString, IPublishedUrlProvider publishedUrlProvider) { _publishedContent = publishedContent; _pageId = publishedContent.Id; _queryStringValues = ParseQueryString(queryString); - _umbracoContextAccessor = umbracoContextAccessor; + _publishedUrlProvider = publishedUrlProvider; } public override void ExecuteResult(ControllerContext context) diff --git a/src/Umbraco.Web/Mvc/SurfaceController.cs b/src/Umbraco.Web/Mvc/SurfaceController.cs index 4fc53de4ae..c03d59058c 100644 --- a/src/Umbraco.Web/Mvc/SurfaceController.cs +++ b/src/Umbraco.Web/Mvc/SurfaceController.cs @@ -31,7 +31,7 @@ namespace Umbraco.Web.Mvc /// protected RedirectToUmbracoPageResult RedirectToUmbracoPage(int pageId) { - return new RedirectToUmbracoPageResult(pageId, Current.UmbracoContextAccessor); + return new RedirectToUmbracoPageResult(pageId, Current.PublishedUrlProvider); } /// @@ -42,7 +42,7 @@ namespace Umbraco.Web.Mvc /// protected RedirectToUmbracoPageResult RedirectToUmbracoPage(int pageId, NameValueCollection queryStringValues) { - return new RedirectToUmbracoPageResult(pageId, queryStringValues, Current.UmbracoContextAccessor); + return new RedirectToUmbracoPageResult(pageId, queryStringValues, Current.PublishedUrlProvider); } /// @@ -53,7 +53,7 @@ namespace Umbraco.Web.Mvc /// protected RedirectToUmbracoPageResult RedirectToUmbracoPage(int pageId, string queryString) { - return new RedirectToUmbracoPageResult(pageId, queryString, Current.UmbracoContextAccessor); + return new RedirectToUmbracoPageResult(pageId, queryString, Current.PublishedUrlProvider); } /// @@ -63,7 +63,7 @@ namespace Umbraco.Web.Mvc /// protected RedirectToUmbracoPageResult RedirectToUmbracoPage(IPublishedContent publishedContent) { - return new RedirectToUmbracoPageResult(publishedContent, Current.UmbracoContextAccessor); + return new RedirectToUmbracoPageResult(publishedContent, Current.PublishedUrlProvider); } /// @@ -74,7 +74,7 @@ namespace Umbraco.Web.Mvc /// protected RedirectToUmbracoPageResult RedirectToUmbracoPage(IPublishedContent publishedContent, NameValueCollection queryStringValues) { - return new RedirectToUmbracoPageResult(publishedContent, queryStringValues, Current.UmbracoContextAccessor); + return new RedirectToUmbracoPageResult(publishedContent, queryStringValues, Current.PublishedUrlProvider); } /// @@ -85,7 +85,7 @@ namespace Umbraco.Web.Mvc /// protected RedirectToUmbracoPageResult RedirectToUmbracoPage(IPublishedContent publishedContent, string queryString) { - return new RedirectToUmbracoPageResult(publishedContent, queryString, Current.UmbracoContextAccessor); + return new RedirectToUmbracoPageResult(publishedContent, queryString, Current.PublishedUrlProvider); } /// @@ -94,7 +94,7 @@ namespace Umbraco.Web.Mvc /// protected RedirectToUmbracoPageResult RedirectToCurrentUmbracoPage() { - return new RedirectToUmbracoPageResult(CurrentPage, Current.UmbracoContextAccessor); + return new RedirectToUmbracoPageResult(CurrentPage, Current.PublishedUrlProvider); } /// @@ -104,7 +104,7 @@ namespace Umbraco.Web.Mvc /// protected RedirectToUmbracoPageResult RedirectToCurrentUmbracoPage(NameValueCollection queryStringValues) { - return new RedirectToUmbracoPageResult(CurrentPage, queryStringValues, Current.UmbracoContextAccessor); + return new RedirectToUmbracoPageResult(CurrentPage, queryStringValues, Current.PublishedUrlProvider); } /// @@ -114,7 +114,7 @@ namespace Umbraco.Web.Mvc /// protected RedirectToUmbracoPageResult RedirectToCurrentUmbracoPage(string queryString) { - return new RedirectToUmbracoPageResult(CurrentPage, queryString, Current.UmbracoContextAccessor); + return new RedirectToUmbracoPageResult(CurrentPage, queryString, Current.PublishedUrlProvider); } /// diff --git a/src/Umbraco.Web/Profiling/WebProfilingController.cs b/src/Umbraco.Web/Profiling/WebProfilingController.cs index fefe52391c..7bc28f28ea 100644 --- a/src/Umbraco.Web/Profiling/WebProfilingController.cs +++ b/src/Umbraco.Web/Profiling/WebProfilingController.cs @@ -7,6 +7,7 @@ using Umbraco.Core.Persistence; using Umbraco.Core.Services; using Umbraco.Core.Strings; using Umbraco.Web.Editors; +using Umbraco.Web.Routing; using Umbraco.Web.WebApi.Filters; namespace Umbraco.Web.Profiling @@ -19,8 +20,19 @@ namespace Umbraco.Web.Profiling { private readonly IRuntimeState _runtimeState; - public WebProfilingController(IGlobalSettings globalSettings, IUmbracoContextAccessor umbracoContextAccessor, ISqlContext sqlContext, ServiceContext services, AppCaches appCaches, IProfilingLogger logger, IRuntimeState runtimeState, UmbracoHelper umbracoHelper, IShortStringHelper shortStringHelper, UmbracoMapper umbracoMapper) - : base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, shortStringHelper, umbracoMapper) + public WebProfilingController( + IGlobalSettings globalSettings, + IUmbracoContextAccessor umbracoContextAccessor, + ISqlContext sqlContext, + ServiceContext services, + AppCaches appCaches, + IProfilingLogger logger, + IRuntimeState runtimeState, + UmbracoHelper umbracoHelper, + IShortStringHelper shortStringHelper, + UmbracoMapper umbracoMapper, + IPublishedUrlProvider publishedUrlProvider) + : base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, shortStringHelper, umbracoMapper, publishedUrlProvider) { _runtimeState = runtimeState; } diff --git a/src/Umbraco.Web/PropertyEditors/RichTextPreValueController.cs b/src/Umbraco.Web/PropertyEditors/RichTextPreValueController.cs index 1c41479dcd..5d7ca9bdb0 100644 --- a/src/Umbraco.Web/PropertyEditors/RichTextPreValueController.cs +++ b/src/Umbraco.Web/PropertyEditors/RichTextPreValueController.cs @@ -13,6 +13,7 @@ using Umbraco.Web.Editors; using Umbraco.Web.Models.ContentEditing; using Umbraco.Web.Mvc; using Umbraco.Core.Mapping; +using Umbraco.Web.Routing; namespace Umbraco.Web.PropertyEditors { @@ -24,8 +25,21 @@ namespace Umbraco.Web.PropertyEditors { private readonly IIOHelper _ioHelper; - public RichTextPreValueController(IGlobalSettings globalSettings, IUmbracoContextAccessor umbracoContextAccessor, ISqlContext sqlContext, ServiceContext services, AppCaches appCaches, IProfilingLogger logger, IRuntimeState runtimeState, UmbracoHelper umbracoHelper, IShortStringHelper shortStringHelper, IIOHelper ioHelper, UmbracoMapper umbracoMapper) - : base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, shortStringHelper, umbracoMapper) + public RichTextPreValueController( + IGlobalSettings globalSettings, + IUmbracoContextAccessor umbracoContextAccessor, + ISqlContext sqlContext, + ServiceContext services, + AppCaches appCaches, + IProfilingLogger logger, + IRuntimeState runtimeState, + UmbracoHelper umbracoHelper, + IShortStringHelper shortStringHelper, + IIOHelper ioHelper, + UmbracoMapper umbracoMapper, + IPublishedUrlProvider publishedUrlProvider + ) + : base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, shortStringHelper, umbracoMapper, publishedUrlProvider) { _ioHelper = ioHelper; } diff --git a/src/Umbraco.Web/PublishedContentExtensions.cs b/src/Umbraco.Web/PublishedContentExtensions.cs index 0d60ed5914..e5b1285346 100644 --- a/src/Umbraco.Web/PublishedContentExtensions.cs +++ b/src/Umbraco.Web/PublishedContentExtensions.cs @@ -718,7 +718,7 @@ namespace Umbraco.Web if (umbracoContext == null) throw new InvalidOperationException("Cannot resolve a Url when Current.UmbracoContext is null."); - return content.Url(Current.UmbracoContext.UrlProvider, culture, mode); + return content.Url(Current.PublishedUrlProvider, culture, mode); } #endregion diff --git a/src/Umbraco.Web/PublishedElementExtensions.cs b/src/Umbraco.Web/PublishedElementExtensions.cs index 49e686835f..2785e7832d 100644 --- a/src/Umbraco.Web/PublishedElementExtensions.cs +++ b/src/Umbraco.Web/PublishedElementExtensions.cs @@ -114,14 +114,12 @@ namespace Umbraco.Web /// public static string MediaUrl(this IPublishedContent content, string culture = null, UrlMode mode = UrlMode.Default, string propertyAlias = Constants.Conventions.Media.File) { - var umbracoContext = Composing.Current.UmbracoContext; + var publishedUrlProvider = Current.PublishedUrlProvider; - if (umbracoContext == null) - throw new InvalidOperationException("Cannot resolve a Url when Current.UmbracoContext is null."); - if (umbracoContext.UrlProvider == null) - throw new InvalidOperationException("Cannot resolve a Url when Current.UmbracoContext.UrlProvider is null."); + if (publishedUrlProvider== null) + throw new InvalidOperationException("Cannot resolve a Url when Current.PublishedUrlProvider is null."); - return umbracoContext.UrlProvider.GetMediaUrl(content, mode, culture, propertyAlias); + return publishedUrlProvider.GetMediaUrl(content, mode, culture, propertyAlias); } #endregion diff --git a/src/Umbraco.Web/Routing/AliasUrlProvider.cs b/src/Umbraco.Web/Routing/AliasUrlProvider.cs index 849a85dd2c..4c5d108698 100644 --- a/src/Umbraco.Web/Routing/AliasUrlProvider.cs +++ b/src/Umbraco.Web/Routing/AliasUrlProvider.cs @@ -16,12 +16,14 @@ namespace Umbraco.Web.Routing private readonly IGlobalSettings _globalSettings; private readonly IRequestHandlerSection _requestConfig; private readonly ISiteDomainHelper _siteDomainHelper; + private readonly IUmbracoContextAccessor _umbracoContextAccessor; - public AliasUrlProvider(IGlobalSettings globalSettings, IRequestHandlerSection requestConfig, ISiteDomainHelper siteDomainHelper) + public AliasUrlProvider(IGlobalSettings globalSettings, IRequestHandlerSection requestConfig, ISiteDomainHelper siteDomainHelper, IUmbracoContextAccessor umbracoContextAccessor) { _globalSettings = globalSettings; _requestConfig = requestConfig; _siteDomainHelper = siteDomainHelper; + _umbracoContextAccessor = umbracoContextAccessor; } // note - at the moment we seem to accept pretty much anything as an alias @@ -31,7 +33,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 } @@ -51,8 +53,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.Web/Routing/DefaultMediaUrlProvider.cs b/src/Umbraco.Web/Routing/DefaultMediaUrlProvider.cs index c7c987e0e5..18802e4061 100644 --- a/src/Umbraco.Web/Routing/DefaultMediaUrlProvider.cs +++ b/src/Umbraco.Web/Routing/DefaultMediaUrlProvider.cs @@ -10,15 +10,15 @@ namespace Umbraco.Web.Routing /// public class DefaultMediaUrlProvider : IMediaUrlProvider { - private readonly PropertyEditorCollection _propertyEditors; + private readonly Lazy _propertyEditors; - public DefaultMediaUrlProvider(PropertyEditorCollection propertyEditors) + public DefaultMediaUrlProvider(Lazy propertyEditors) { _propertyEditors = propertyEditors ?? throw new ArgumentNullException(nameof(propertyEditors)); } /// - 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,7 +33,7 @@ namespace Umbraco.Web.Routing var propType = prop.PropertyType; string path = null; - if (_propertyEditors.TryGet(propType.EditorAlias, out var editor) + if (_propertyEditors.Value.TryGet(propType.EditorAlias, out var editor) && editor is IDataEditorWithMediaPath dataEditor) { path = dataEditor.GetMediaPath(value); diff --git a/src/Umbraco.Web/Routing/DefaultUrlProvider.cs b/src/Umbraco.Web/Routing/DefaultUrlProvider.cs index 43d4d5dd90..40d7e116a8 100644 --- a/src/Umbraco.Web/Routing/DefaultUrlProvider.cs +++ b/src/Umbraco.Web/Routing/DefaultUrlProvider.cs @@ -17,22 +17,25 @@ namespace Umbraco.Web.Routing private readonly ILogger _logger; private readonly IGlobalSettings _globalSettings; private readonly ISiteDomainHelper _siteDomainHelper; + private readonly IUmbracoContextAccessor _umbracoContextAccessor; - public DefaultUrlProvider(IRequestHandlerSection requestSettings, ILogger logger, IGlobalSettings globalSettings, ISiteDomainHelper siteDomainHelper) + public DefaultUrlProvider(IRequestHandlerSection requestSettings, ILogger logger, IGlobalSettings globalSettings, ISiteDomainHelper siteDomainHelper, IUmbracoContextAccessor umbracoContextAccessor) { _requestSettings = requestSettings; _logger = logger; _globalSettings = globalSettings; _siteDomainHelper = siteDomainHelper; + _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); @@ -68,7 +71,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. @@ -76,8 +79,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.Web/Routing/IMediaUrlProvider.cs b/src/Umbraco.Web/Routing/IMediaUrlProvider.cs index 0c128057f1..e54e9aa253 100644 --- a/src/Umbraco.Web/Routing/IMediaUrlProvider.cs +++ b/src/Umbraco.Web/Routing/IMediaUrlProvider.cs @@ -11,7 +11,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 +25,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.Web/Routing/IUrlProvider.cs b/src/Umbraco.Web/Routing/IUrlProvider.cs index 16c1a1c91c..ba1d48a113 100644 --- a/src/Umbraco.Web/Routing/IUrlProvider.cs +++ b/src/Umbraco.Web/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.Web/Routing/PublishedRouter.cs b/src/Umbraco.Web/Routing/PublishedRouter.cs index 833d0a9977..7d827b935e 100644 --- a/src/Umbraco.Web/Routing/PublishedRouter.cs +++ b/src/Umbraco.Web/Routing/PublishedRouter.cs @@ -28,8 +28,8 @@ namespace Umbraco.Web.Routing private readonly IVariationContextAccessor _variationContextAccessor; private readonly ILogger _logger; private readonly IUmbracoSettingsSection _umbracoSettingsSection; - private readonly IUserService _userService; private readonly IHttpContextAccessor _httpContextAccessor; + private readonly IPublishedUrlProvider _publishedUrlProvider; /// /// Initializes a new instance of the class. @@ -42,8 +42,8 @@ namespace Umbraco.Web.Routing ServiceContext services, IProfilingLogger proflog, IUmbracoSettingsSection umbracoSettingsSection, - IUserService userService, - IHttpContextAccessor httpContextAccessor) + IHttpContextAccessor httpContextAccessor, + IPublishedUrlProvider publishedUrlProvider) { _webRoutingSection = webRoutingSection ?? throw new ArgumentNullException(nameof(webRoutingSection)); _contentFinders = contentFinders ?? throw new ArgumentNullException(nameof(contentFinders)); @@ -53,8 +53,8 @@ namespace Umbraco.Web.Routing _variationContextAccessor = variationContextAccessor ?? throw new ArgumentNullException(nameof(variationContextAccessor)); _logger = proflog; _umbracoSettingsSection = umbracoSettingsSection ?? throw new ArgumentNullException(nameof(umbracoSettingsSection)); - _userService = userService ?? throw new ArgumentNullException(nameof(userService)); _httpContextAccessor = httpContextAccessor; + _publishedUrlProvider = publishedUrlProvider; } /// @@ -754,14 +754,14 @@ namespace Umbraco.Web.Routing var redirectUrl = "#"; if (redirectId > 0) { - redirectUrl = request.UmbracoContext.UrlProvider.GetUrl(redirectId); + redirectUrl = _publishedUrlProvider.GetUrl(redirectId); } else { // might be a UDI instead of an int Id var redirectUdi = request.PublishedContent.Value(Constants.Conventions.Content.Redirect); if (redirectUdi != null) - redirectUrl = request.UmbracoContext.UrlProvider.GetUrl(redirectUdi.Guid); + redirectUrl = _publishedUrlProvider.GetUrl(redirectUdi.Guid); } if (redirectUrl != "#") request.SetRedirect(redirectUrl); diff --git a/src/Umbraco.Web/Routing/UrlProvider.cs b/src/Umbraco.Web/Routing/UrlProvider.cs index 2ce673dcce..9664eb1919 100644 --- a/src/Umbraco.Web/Routing/UrlProvider.cs +++ b/src/Umbraco.Web/Routing/UrlProvider.cs @@ -4,7 +4,6 @@ using System.Linq; using Umbraco.Core.Configuration.UmbracoSettings; using Umbraco.Core; using Umbraco.Core.Models.PublishedContent; -using Umbraco.Web.Composing; namespace Umbraco.Web.Routing { @@ -17,18 +16,18 @@ 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(Lazy 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)); @@ -41,25 +40,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 Lazy _umbracoContextAccessor; private readonly IEnumerable _urlProviders; private readonly IEnumerable _mediaUrlProviders; private readonly IVariationContextAccessor _variationContextAccessor; @@ -73,9 +55,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.Value.UmbracoContext.Content.GetById(id); + private IPublishedContent GetDocument(Guid id) => _umbracoContextAccessor.Value.UmbracoContext.Content.GetById(id); + private IPublishedContent GetMedia(Guid id) => _umbracoContextAccessor.Value.UmbracoContext.Media.GetById(id); /// /// Gets the url of a published content. @@ -131,9 +113,9 @@ namespace Umbraco.Web.Routing } if (current == null) - current = _umbracoContext.CleanedUmbracoUrl; + current = _umbracoContextAccessor.Value.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 } @@ -143,7 +125,7 @@ namespace Umbraco.Web.Routing var provider = _urlProviders.OfType().FirstOrDefault(); var url = provider == null ? route // what else? - : provider.GetUrlFromRoute(route, Current.UmbracoContext, id, _umbracoContext.CleanedUmbracoUrl, Mode, culture)?.Text; + : provider.GetUrlFromRoute(route, _umbracoContextAccessor.Value.UmbracoContext, id, _umbracoContextAccessor.Value.UmbracoContext.CleanedUmbracoUrl, Mode, culture)?.Text; return url ?? "#"; } @@ -163,7 +145,7 @@ namespace Umbraco.Web.Routing /// public IEnumerable GetOtherUrls(int id) { - return GetOtherUrls(id, _umbracoContext.CleanedUmbracoUrl); + return GetOtherUrls(id, _umbracoContextAccessor.Value.UmbracoContext.CleanedUmbracoUrl); } /// @@ -178,7 +160,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 @@ -232,10 +214,10 @@ namespace Umbraco.Web.Routing } if (current == null) - current = _umbracoContext.CleanedUmbracoUrl; + current = _umbracoContextAccessor.Value.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.Web/Routing/UrlProviderExtensions.cs b/src/Umbraco.Web/Routing/UrlProviderExtensions.cs index e4359ad03e..b53676ca1d 100644 --- a/src/Umbraco.Web/Routing/UrlProviderExtensions.cs +++ b/src/Umbraco.Web/Routing/UrlProviderExtensions.cs @@ -25,7 +25,8 @@ namespace Umbraco.Web.Routing ILocalizedTextService textService, IContentService contentService, IVariationContextAccessor variationContextAccessor, - ILogger logger) + ILogger logger, + IPublishedUrlProvider publishedUrlProvider) { if (content == null) throw new ArgumentNullException(nameof(content)); if (publishedRouter == null) throw new ArgumentNullException(nameof(publishedRouter)); @@ -34,6 +35,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 (variationContextAccessor == null) throw new ArgumentNullException(nameof(variationContextAccessor)); if (content.Published == false) @@ -59,7 +61,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)) + foreach (var cultureUrl in GetContentUrlsByCulture(content, cultures, publishedRouter, umbracoContext, contentService, textService, variationContextAccessor, logger, publishedUrlProvider)) { urls.Add(cultureUrl); } @@ -77,7 +79,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; } @@ -100,7 +102,8 @@ namespace Umbraco.Web.Routing IContentService contentService, ILocalizedTextService textService, IVariationContextAccessor variationContextAccessor, - ILogger logger) + ILogger logger, + IPublishedUrlProvider publishedUrlProvider) { foreach (var culture in cultures) { @@ -113,7 +116,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.Web/Runtime/WebInitialComposer.cs b/src/Umbraco.Web/Runtime/WebInitialComposer.cs index cb65fcd30d..c36e1fc597 100644 --- a/src/Umbraco.Web/Runtime/WebInitialComposer.cs +++ b/src/Umbraco.Web/Runtime/WebInitialComposer.cs @@ -99,6 +99,7 @@ namespace Umbraco.Web.Runtime // register the umbraco context factory composition.RegisterUnique(); + composition.RegisterUnique(); // register a per-request HttpContextBase object // is per-request so only one wrapper is created per request diff --git a/src/Umbraco.Web/Trees/ApplicationTreeController.cs b/src/Umbraco.Web/Trees/ApplicationTreeController.cs index dea6642376..8ee39b49e5 100644 --- a/src/Umbraco.Web/Trees/ApplicationTreeController.cs +++ b/src/Umbraco.Web/Trees/ApplicationTreeController.cs @@ -18,6 +18,7 @@ using Umbraco.Core.Persistence; using Umbraco.Core.Services; using Umbraco.Web.Models.Trees; using Umbraco.Web.Mvc; +using Umbraco.Web.Routing; using Umbraco.Web.Services; using Umbraco.Web.WebApi; using Umbraco.Web.WebApi.Filters; @@ -37,8 +38,8 @@ namespace Umbraco.Web.Trees public ApplicationTreeController(IGlobalSettings globalSettings, IUmbracoContextAccessor umbracoContextAccessor, ISqlContext sqlContext, ServiceContext services, AppCaches appCaches, IProfilingLogger logger, - IRuntimeState runtimeState, ITreeService treeService, ISectionService sectionService, UmbracoHelper umbracoHelper, UmbracoMapper umbracoMapper) - : base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, umbracoMapper) + IRuntimeState runtimeState, ITreeService treeService, ISectionService sectionService, UmbracoHelper umbracoHelper, UmbracoMapper umbracoMapper, IPublishedUrlProvider publishedUrlProvider) + : base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, umbracoMapper, publishedUrlProvider) { _treeService = treeService; _sectionService = sectionService; diff --git a/src/Umbraco.Web/Trees/ContentTreeController.cs b/src/Umbraco.Web/Trees/ContentTreeController.cs index 73f0fd13a7..bb7613422e 100644 --- a/src/Umbraco.Web/Trees/ContentTreeController.cs +++ b/src/Umbraco.Web/Trees/ContentTreeController.cs @@ -20,6 +20,7 @@ using Umbraco.Core.Logging; using Umbraco.Core.Persistence; using Constants = Umbraco.Core.Constants; using Umbraco.Core.Mapping; +using Umbraco.Web.Routing; namespace Umbraco.Web.Trees { @@ -51,7 +52,20 @@ namespace Umbraco.Web.Trees protected override int[] UserStartNodes => _userStartNodes ?? (_userStartNodes = Security.CurrentUser.CalculateContentStartNodeIds(Services.EntityService)); - public ContentTreeController(UmbracoTreeSearcher treeSearcher, ActionCollection actions, 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 ContentTreeController( + UmbracoTreeSearcher treeSearcher, + ActionCollection actions, + 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) { _treeSearcher = treeSearcher; _actions = actions; diff --git a/src/Umbraco.Web/Trees/ContentTreeControllerBase.cs b/src/Umbraco.Web/Trees/ContentTreeControllerBase.cs index 7642ee103e..71196b84c3 100644 --- a/src/Umbraco.Web/Trees/ContentTreeControllerBase.cs +++ b/src/Umbraco.Web/Trees/ContentTreeControllerBase.cs @@ -22,13 +22,25 @@ using Umbraco.Core.Cache; using Umbraco.Core.Configuration; using Umbraco.Core.Persistence; using Umbraco.Core.Mapping; +using Umbraco.Web.Routing; namespace Umbraco.Web.Trees { public abstract class ContentTreeControllerBase : TreeController { - protected ContentTreeControllerBase(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) + protected ContentTreeControllerBase( + 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.Web/Trees/ContentTypeTreeController.cs b/src/Umbraco.Web/Trees/ContentTypeTreeController.cs index a932fbc594..f150eb8ba0 100644 --- a/src/Umbraco.Web/Trees/ContentTypeTreeController.cs +++ b/src/Umbraco.Web/Trees/ContentTypeTreeController.cs @@ -14,6 +14,7 @@ using Umbraco.Core.Services; using Umbraco.Web.Actions; using Umbraco.Web.Models.ContentEditing; using Umbraco.Web.Models.Trees; +using Umbraco.Web.Routing; using Umbraco.Web.Search; using Umbraco.Web.WebApi.Filters; @@ -27,7 +28,19 @@ namespace Umbraco.Web.Trees { private readonly UmbracoTreeSearcher _treeSearcher; - public ContentTypeTreeController(UmbracoTreeSearcher treeSearcher, 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 ContentTypeTreeController( + UmbracoTreeSearcher treeSearcher, + 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) { _treeSearcher = treeSearcher; } diff --git a/src/Umbraco.Web/Trees/DataTypeTreeController.cs b/src/Umbraco.Web/Trees/DataTypeTreeController.cs index f9b5dd729d..7c4da2cf0f 100644 --- a/src/Umbraco.Web/Trees/DataTypeTreeController.cs +++ b/src/Umbraco.Web/Trees/DataTypeTreeController.cs @@ -18,6 +18,7 @@ using Umbraco.Core.Persistence; using Umbraco.Web.Search; using Constants = Umbraco.Core.Constants; using Umbraco.Core.Mapping; +using Umbraco.Web.Routing; namespace Umbraco.Web.Trees { @@ -29,7 +30,19 @@ namespace Umbraco.Web.Trees { private readonly UmbracoTreeSearcher _treeSearcher; - public DataTypeTreeController(UmbracoTreeSearcher treeSearcher, 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 DataTypeTreeController( + UmbracoTreeSearcher treeSearcher, + 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) { _treeSearcher = treeSearcher; } diff --git a/src/Umbraco.Web/Trees/MediaTreeController.cs b/src/Umbraco.Web/Trees/MediaTreeController.cs index dfe1b5cb5a..6983e84dd8 100644 --- a/src/Umbraco.Web/Trees/MediaTreeController.cs +++ b/src/Umbraco.Web/Trees/MediaTreeController.cs @@ -21,6 +21,7 @@ using Umbraco.Core.Logging; using Umbraco.Core.Persistence; using Constants = Umbraco.Core.Constants; using Umbraco.Core.Mapping; +using Umbraco.Web.Routing; namespace Umbraco.Web.Trees { @@ -40,7 +41,19 @@ namespace Umbraco.Web.Trees { private readonly UmbracoTreeSearcher _treeSearcher; - public MediaTreeController(UmbracoTreeSearcher treeSearcher, 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 MediaTreeController( + UmbracoTreeSearcher treeSearcher, + 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) { _treeSearcher = treeSearcher; } diff --git a/src/Umbraco.Web/Trees/MediaTypeTreeController.cs b/src/Umbraco.Web/Trees/MediaTypeTreeController.cs index a7e65037be..1c7f6ca3ae 100644 --- a/src/Umbraco.Web/Trees/MediaTypeTreeController.cs +++ b/src/Umbraco.Web/Trees/MediaTypeTreeController.cs @@ -16,6 +16,7 @@ using Umbraco.Core.Logging; using Umbraco.Core.Persistence; using Umbraco.Web.Search; using Umbraco.Core.Mapping; +using Umbraco.Web.Routing; namespace Umbraco.Web.Trees { @@ -27,7 +28,19 @@ namespace Umbraco.Web.Trees { private readonly UmbracoTreeSearcher _treeSearcher; - public MediaTypeTreeController(UmbracoTreeSearcher treeSearcher, 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 MediaTypeTreeController( + UmbracoTreeSearcher treeSearcher, + 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) { _treeSearcher = treeSearcher; } diff --git a/src/Umbraco.Web/Trees/TemplatesTreeController.cs b/src/Umbraco.Web/Trees/TemplatesTreeController.cs index d7247208c7..6c8b23030e 100644 --- a/src/Umbraco.Web/Trees/TemplatesTreeController.cs +++ b/src/Umbraco.Web/Trees/TemplatesTreeController.cs @@ -15,6 +15,7 @@ using Umbraco.Web.Actions; using Umbraco.Web.Models.ContentEditing; using Umbraco.Web.Models.Trees; using Umbraco.Web.Mvc; +using Umbraco.Web.Routing; using Umbraco.Web.Search; using Umbraco.Web.WebApi.Filters; using Constants = Umbraco.Core.Constants; @@ -29,7 +30,19 @@ namespace Umbraco.Web.Trees { private readonly UmbracoTreeSearcher _treeSearcher; - public TemplatesTreeController(UmbracoTreeSearcher treeSearcher, 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 TemplatesTreeController( + UmbracoTreeSearcher treeSearcher, + 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) { _treeSearcher = treeSearcher; } diff --git a/src/Umbraco.Web/Trees/TreeController.cs b/src/Umbraco.Web/Trees/TreeController.cs index b580ebdb34..7185cbaf13 100644 --- a/src/Umbraco.Web/Trees/TreeController.cs +++ b/src/Umbraco.Web/Trees/TreeController.cs @@ -7,6 +7,7 @@ using Umbraco.Core.Logging; using Umbraco.Core.Mapping; using Umbraco.Core.Persistence; using Umbraco.Core.Services; +using Umbraco.Web.Routing; namespace Umbraco.Web.Trees { @@ -19,8 +20,18 @@ namespace Umbraco.Web.Trees private readonly TreeAttribute _treeAttribute; - protected TreeController(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) + protected TreeController( + 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) { _treeAttribute = GetTreeAttribute(); } diff --git a/src/Umbraco.Web/Trees/TreeControllerBase.cs b/src/Umbraco.Web/Trees/TreeControllerBase.cs index a0a736f68a..b6e71c058a 100644 --- a/src/Umbraco.Web/Trees/TreeControllerBase.cs +++ b/src/Umbraco.Web/Trees/TreeControllerBase.cs @@ -17,6 +17,7 @@ using Umbraco.Web.WebApi; using Umbraco.Web.WebApi.Filters; using Umbraco.Core.Services; using Umbraco.Core.Mapping; +using Umbraco.Web.Routing; namespace Umbraco.Web.Trees { @@ -33,8 +34,18 @@ namespace Umbraco.Web.Trees { } - protected TreeControllerBase(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) + protected TreeControllerBase( + 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.Web/UmbracoContext.cs b/src/Umbraco.Web/UmbracoContext.cs index cc5da6e4a6..4cafc1e4b2 100644 --- a/src/Umbraco.Web/UmbracoContext.cs +++ b/src/Umbraco.Web/UmbracoContext.cs @@ -21,6 +21,7 @@ namespace Umbraco.Web private readonly IHttpContextAccessor _httpContextAccessor; private readonly IGlobalSettings _globalSettings; private readonly IIOHelper _ioHelper; + private readonly IPublishedUrlProvider _publishedUrlProvider; private readonly Lazy _publishedSnapshot; private string _previewToken; private bool? _previewing; @@ -32,23 +33,19 @@ namespace Umbraco.Web internal UmbracoContext(IHttpContextAccessor httpContextAccessor, IPublishedSnapshotService publishedSnapshotService, IWebSecurity webSecurity, - IUmbracoSettingsSection umbracoSettings, - IEnumerable urlProviders, - IEnumerable mediaUrlProviders, IGlobalSettings globalSettings, IVariationContextAccessor variationContextAccessor, - IIOHelper ioHelper) + IIOHelper ioHelper, + IPublishedUrlProvider publishedUrlProvider) { if (httpContextAccessor == null) throw new ArgumentNullException(nameof(httpContextAccessor)); if (publishedSnapshotService == null) throw new ArgumentNullException(nameof(publishedSnapshotService)); if (webSecurity == null) throw new ArgumentNullException(nameof(webSecurity)); - if (umbracoSettings == null) throw new ArgumentNullException(nameof(umbracoSettings)); - if (urlProviders == null) throw new ArgumentNullException(nameof(urlProviders)); - if (mediaUrlProviders == null) throw new ArgumentNullException(nameof(mediaUrlProviders)); VariationContextAccessor = variationContextAccessor ?? throw new ArgumentNullException(nameof(variationContextAccessor)); _httpContextAccessor = httpContextAccessor; _globalSettings = globalSettings ?? throw new ArgumentNullException(nameof(globalSettings)); _ioHelper = ioHelper ?? throw new ArgumentNullException(nameof(ioHelper)); + _publishedUrlProvider = publishedUrlProvider; // ensure that this instance is disposed when the request terminates, though we *also* ensure // this happens in the Umbraco module since the UmbracoCOntext is added to the HttpContext items. @@ -76,7 +73,6 @@ namespace Umbraco.Web // OriginalRequestUrl = GetRequestFromContext()?.Url ?? new Uri("http://localhost"); CleanedUmbracoUrl = UriUtility.UriToUmbraco(OriginalRequestUrl); - UrlProvider = new UrlProvider(this, umbracoSettings.WebRouting, urlProviders, mediaUrlProviders, variationContextAccessor); } /// @@ -132,11 +128,6 @@ namespace Umbraco.Web /// public bool IsFrontEndUmbracoRequest => PublishedRequest != null; - /// - /// Gets the url provider. - /// - public IPublishedUrlProvider UrlProvider { get; } - /// /// Gets/sets the PublishedRequest object /// @@ -188,7 +179,7 @@ namespace Umbraco.Web /// The url for the content. public string Url(int contentId, string culture = null) { - return UrlProvider.GetUrl(contentId, culture: culture); + return _publishedUrlProvider.GetUrl(contentId, culture: culture); } /// @@ -199,7 +190,7 @@ namespace Umbraco.Web /// The url for the content. public string Url(Guid contentId, string culture = null) { - return UrlProvider.GetUrl(contentId, culture: culture); + return _publishedUrlProvider.GetUrl(contentId, culture: culture); } /// @@ -211,7 +202,7 @@ namespace Umbraco.Web /// The url for the content. public string Url(int contentId, UrlMode mode, string culture = null) { - return UrlProvider.GetUrl(contentId, mode, culture); + return _publishedUrlProvider.GetUrl(contentId, mode, culture); } /// @@ -223,7 +214,7 @@ namespace Umbraco.Web /// The url for the content. public string Url(Guid contentId, UrlMode mode, string culture = null) { - return UrlProvider.GetUrl(contentId, mode, culture); + return _publishedUrlProvider.GetUrl(contentId, mode, culture); } #endregion diff --git a/src/Umbraco.Web/UmbracoContextFactory.cs b/src/Umbraco.Web/UmbracoContextFactory.cs index 8751ed441a..40bf1bbdc7 100644 --- a/src/Umbraco.Web/UmbracoContextFactory.cs +++ b/src/Umbraco.Web/UmbracoContextFactory.cs @@ -28,31 +28,26 @@ namespace Umbraco.Web private readonly IVariationContextAccessor _variationContextAccessor; private readonly IDefaultCultureAccessor _defaultCultureAccessor; - private readonly IUmbracoSettingsSection _umbracoSettings; private readonly IGlobalSettings _globalSettings; - private readonly UrlProviderCollection _urlProviders; - private readonly MediaUrlProviderCollection _mediaUrlProviders; private readonly IUserService _userService; private readonly IIOHelper _ioHelper; private readonly IHttpContextAccessor _httpContextAccessor; + private readonly IPublishedUrlProvider _publishedUrlProvider; /// /// Initializes a new instance of the class. /// - public UmbracoContextFactory(IUmbracoContextAccessor umbracoContextAccessor, IPublishedSnapshotService publishedSnapshotService, IVariationContextAccessor variationContextAccessor, IDefaultCultureAccessor defaultCultureAccessor, IUmbracoSettingsSection umbracoSettings, IGlobalSettings globalSettings, UrlProviderCollection urlProviders, MediaUrlProviderCollection mediaUrlProviders, IUserService userService, IIOHelper ioHelper, IHttpContextAccessor httpContextAccessor) + public UmbracoContextFactory(IUmbracoContextAccessor umbracoContextAccessor, IPublishedSnapshotService publishedSnapshotService, IVariationContextAccessor variationContextAccessor, IDefaultCultureAccessor defaultCultureAccessor, IGlobalSettings globalSettings, IUserService userService, IIOHelper ioHelper, IHttpContextAccessor httpContextAccessor, IPublishedUrlProvider publishedUrlProvider) { _umbracoContextAccessor = umbracoContextAccessor ?? throw new ArgumentNullException(nameof(umbracoContextAccessor)); _publishedSnapshotService = publishedSnapshotService ?? throw new ArgumentNullException(nameof(publishedSnapshotService)); _variationContextAccessor = variationContextAccessor ?? throw new ArgumentNullException(nameof(variationContextAccessor)); _defaultCultureAccessor = defaultCultureAccessor ?? throw new ArgumentNullException(nameof(defaultCultureAccessor)); - - _umbracoSettings = umbracoSettings ?? throw new ArgumentNullException(nameof(umbracoSettings)); _globalSettings = globalSettings ?? throw new ArgumentNullException(nameof(globalSettings)); - _urlProviders = urlProviders ?? throw new ArgumentNullException(nameof(urlProviders)); - _mediaUrlProviders = mediaUrlProviders ?? throw new ArgumentNullException(nameof(mediaUrlProviders)); _userService = userService ?? throw new ArgumentNullException(nameof(userService)); _ioHelper = ioHelper; _httpContextAccessor = httpContextAccessor; + _publishedUrlProvider = publishedUrlProvider; } private IUmbracoContext CreateUmbracoContext() @@ -71,7 +66,7 @@ namespace Umbraco.Web var webSecurity = new WebSecurity(_httpContextAccessor, _userService, _globalSettings, _ioHelper); - return new UmbracoContext(_httpContextAccessor, _publishedSnapshotService, webSecurity, _umbracoSettings, _urlProviders, _mediaUrlProviders, _globalSettings, _variationContextAccessor, _ioHelper); + return new UmbracoContext(_httpContextAccessor, _publishedSnapshotService, webSecurity, _globalSettings, _variationContextAccessor, _ioHelper, _publishedUrlProvider); } /// diff --git a/src/Umbraco.Web/WebApi/UmbracoApiController.cs b/src/Umbraco.Web/WebApi/UmbracoApiController.cs index 37ccbaec28..1541389a4f 100644 --- a/src/Umbraco.Web/WebApi/UmbracoApiController.cs +++ b/src/Umbraco.Web/WebApi/UmbracoApiController.cs @@ -7,6 +7,7 @@ using Umbraco.Core.Logging; using Umbraco.Core.Mapping; using Umbraco.Core.Persistence; using Umbraco.Core.Services; +using Umbraco.Web.Routing; namespace Umbraco.Web.WebApi { @@ -19,8 +20,8 @@ namespace Umbraco.Web.WebApi { } - protected UmbracoApiController(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) + protected UmbracoApiController(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.Web/WebApi/UmbracoApiControllerBase.cs b/src/Umbraco.Web/WebApi/UmbracoApiControllerBase.cs index 4ac773e8c8..3087630edd 100644 --- a/src/Umbraco.Web/WebApi/UmbracoApiControllerBase.cs +++ b/src/Umbraco.Web/WebApi/UmbracoApiControllerBase.cs @@ -10,6 +10,7 @@ using Umbraco.Core.Logging; using Umbraco.Core.Mapping; using Umbraco.Core.Persistence; using Umbraco.Core.Services; +using Umbraco.Web.Routing; using Umbraco.Web.Security; using Umbraco.Web.WebApi.Filters; @@ -22,6 +23,7 @@ namespace Umbraco.Web.WebApi [FeatureAuthorize] public abstract class UmbracoApiControllerBase : ApiController { + // note: all Umbraco controllers have two constructors: one with all dependencies, which should be used, // and one with auto dependencies, ie no dependencies - and then dependencies are automatically obtained // here from the Current service locator - this is obviously evil, but it allows us to add new dependencies @@ -41,14 +43,15 @@ namespace Umbraco.Web.WebApi Current.Factory.GetInstance(), Current.Factory.GetInstance(), Current.Factory.GetInstance(), - Current.Factory.GetInstance() + Current.Factory.GetInstance(), + Current.Factory.GetInstance() ) { } /// /// Initializes a new instance of the class with all its dependencies. /// - protected UmbracoApiControllerBase(IGlobalSettings globalSettings, IUmbracoContextAccessor umbracoContextAccessor, ISqlContext sqlContext, ServiceContext services, AppCaches appCaches, IProfilingLogger logger, IRuntimeState runtimeState, UmbracoHelper umbracoHelper, UmbracoMapper umbracoMapper) + protected UmbracoApiControllerBase(IGlobalSettings globalSettings, IUmbracoContextAccessor umbracoContextAccessor, ISqlContext sqlContext, ServiceContext services, AppCaches appCaches, IProfilingLogger logger, IRuntimeState runtimeState, UmbracoHelper umbracoHelper, UmbracoMapper umbracoMapper, IPublishedUrlProvider publishedUrlProvider) { UmbracoContextAccessor = umbracoContextAccessor; GlobalSettings = globalSettings; @@ -59,6 +62,7 @@ namespace Umbraco.Web.WebApi RuntimeState = runtimeState; Umbraco = umbracoHelper; Mapper = umbracoMapper; + PublishedUrlProvider = publishedUrlProvider; } /// @@ -128,6 +132,8 @@ namespace Umbraco.Web.WebApi /// public UmbracoMapper Mapper { get; } + protected IPublishedUrlProvider PublishedUrlProvider { get; } + /// /// Gets the web security helper. /// diff --git a/src/Umbraco.Web/WebApi/UmbracoAuthorizedApiController.cs b/src/Umbraco.Web/WebApi/UmbracoAuthorizedApiController.cs index f41b4cd01a..ff24a2a6f5 100644 --- a/src/Umbraco.Web/WebApi/UmbracoAuthorizedApiController.cs +++ b/src/Umbraco.Web/WebApi/UmbracoAuthorizedApiController.cs @@ -9,6 +9,7 @@ using Umbraco.Core.Services; using Umbraco.Web.Models.Identity; using Umbraco.Web.Security; using Umbraco.Core.Mapping; +using Umbraco.Web.Routing; namespace Umbraco.Web.WebApi { @@ -36,8 +37,8 @@ namespace Umbraco.Web.WebApi { } - protected UmbracoAuthorizedApiController(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) + protected UmbracoAuthorizedApiController(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) { }