From cf631e60dd9650436ca864f3fd33ae55add4fc25 Mon Sep 17 00:00:00 2001 From: Stephan Date: Tue, 8 Jan 2019 07:55:38 +0100 Subject: [PATCH 1/4] Fix nuspec --- build/NuSpecs/UmbracoCms.nuspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/NuSpecs/UmbracoCms.nuspec b/build/NuSpecs/UmbracoCms.nuspec index 55703d1509..fc417147d3 100644 --- a/build/NuSpecs/UmbracoCms.nuspec +++ b/build/NuSpecs/UmbracoCms.nuspec @@ -22,7 +22,7 @@ not want this to happen as the alpha of the next major is, really, the next major already. --> - + From 429423c07f7255d3bd359dec210f32e64e039049 Mon Sep 17 00:00:00 2001 From: Stephan Date: Tue, 8 Jan 2019 12:52:16 +0100 Subject: [PATCH 2/4] Unwrap wrapped filesystems --- src/Umbraco.Core/IO/FileSystemExtensions.cs | 28 +++++++++++++++++++++ src/Umbraco.Core/IO/FileSystemWrapper.cs | 2 +- src/Umbraco.Core/IO/ShadowWrapper.cs | 2 ++ src/Umbraco.Tests/IO/FileSystemsTests.cs | 10 ++++++++ 4 files changed, 41 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Core/IO/FileSystemExtensions.cs b/src/Umbraco.Core/IO/FileSystemExtensions.cs index 4b73e64e80..ade2c58b38 100644 --- a/src/Umbraco.Core/IO/FileSystemExtensions.cs +++ b/src/Umbraco.Core/IO/FileSystemExtensions.cs @@ -65,5 +65,33 @@ namespace Umbraco.Core.IO } fs.DeleteFile(tempFile); } + + /// + /// Unwraps a filesystem. + /// + /// + /// A filesystem can be wrapped in a (public) or a (internal), + /// and this method deals with the various wrappers and + /// + public static IFileSystem Unwrap(this IFileSystem filesystem) + { + var unwrapping = true; + while (unwrapping) + { + switch (filesystem) + { + case FileSystemWrapper wrapper: + filesystem = wrapper.InnerFileSystem; + break; + case ShadowWrapper shadow: + filesystem = shadow.InnerFileSystem; + break; + default: + unwrapping = false; + break; + } + } + return filesystem; + } } } diff --git a/src/Umbraco.Core/IO/FileSystemWrapper.cs b/src/Umbraco.Core/IO/FileSystemWrapper.cs index a493b7166b..14d028c16d 100644 --- a/src/Umbraco.Core/IO/FileSystemWrapper.cs +++ b/src/Umbraco.Core/IO/FileSystemWrapper.cs @@ -21,7 +21,7 @@ namespace Umbraco.Core.IO InnerFileSystem = innerFileSystem; } - public IFileSystem InnerFileSystem { get; internal set; } + internal IFileSystem InnerFileSystem { get; set; } public IEnumerable GetDirectories(string path) { diff --git a/src/Umbraco.Core/IO/ShadowWrapper.cs b/src/Umbraco.Core/IO/ShadowWrapper.cs index 94bd61b162..6493238391 100644 --- a/src/Umbraco.Core/IO/ShadowWrapper.cs +++ b/src/Umbraco.Core/IO/ShadowWrapper.cs @@ -75,6 +75,8 @@ namespace Umbraco.Core.IO } } + public IFileSystem InnerFileSystem => _innerFileSystem; + private IFileSystem FileSystem { get diff --git a/src/Umbraco.Tests/IO/FileSystemsTests.cs b/src/Umbraco.Tests/IO/FileSystemsTests.cs index d1aeb1a3fa..52de1bbcfa 100644 --- a/src/Umbraco.Tests/IO/FileSystemsTests.cs +++ b/src/Umbraco.Tests/IO/FileSystemsTests.cs @@ -86,6 +86,16 @@ namespace Umbraco.Tests.IO Assert.AreSame(fileSystem1, fileSystem2); } + [Test] + public void Can_Unwrap_MediaFileSystem() + { + var fileSystem = _factory.GetInstance(); + var unwrapped = fileSystem.Unwrap(); + Assert.IsNotNull(unwrapped); + var physical = unwrapped as PhysicalFileSystem; + Assert.IsNotNull(physical); + } + [Test] public void Can_Delete_MediaFiles() { From 2422000b3ebfc24a1d35cf5cadd8141979ef80cf Mon Sep 17 00:00:00 2001 From: Warren Buckley Date: Tue, 8 Jan 2019 16:20:11 +0000 Subject: [PATCH 3/4] Updates RemoteDashboard so FINALLY the main image on the left loads in V8 backoffice * Adds a new filter that uses the Angular $sce.trustAsHtml() function --- .../src/common/filters/safehtml.filter.js | 6 ++++++ .../src/views/dashboard/default/StartupDashboardIntro.html | 4 ++-- 2 files changed, 8 insertions(+), 2 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/common/filters/safehtml.filter.js diff --git a/src/Umbraco.Web.UI.Client/src/common/filters/safehtml.filter.js b/src/Umbraco.Web.UI.Client/src/common/filters/safehtml.filter.js new file mode 100644 index 0000000000..50d8574306 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/common/filters/safehtml.filter.js @@ -0,0 +1,6 @@ +angular.module('umbraco.filters') + .filter('safe_html', ['$sce', function($sce){ + return function(text) { + return $sce.trustAsHtml(text); + }; + }]); \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/views/dashboard/default/StartupDashboardIntro.html b/src/Umbraco.Web.UI.Client/src/views/dashboard/default/StartupDashboardIntro.html index 72cc3ddb06..0478e6ba3c 100644 --- a/src/Umbraco.Web.UI.Client/src/views/dashboard/default/StartupDashboardIntro.html +++ b/src/Umbraco.Web.UI.Client/src/views/dashboard/default/StartupDashboardIntro.html @@ -19,7 +19,7 @@
-
+
@@ -65,7 +65,7 @@ - + \ No newline at end of file From 349f48aa2dcb65a3619aaa21130005519fb54444 Mon Sep 17 00:00:00 2001 From: Stephan Date: Tue, 8 Jan 2019 20:49:21 +0100 Subject: [PATCH 4/4] Refactor task runner maindom hooks --- .../Scheduling/BackgroundTaskRunner.cs | 91 +++++++++---------- 1 file changed, 44 insertions(+), 47 deletions(-) diff --git a/src/Umbraco.Web/Scheduling/BackgroundTaskRunner.cs b/src/Umbraco.Web/Scheduling/BackgroundTaskRunner.cs index a73734fab8..528c87b2bb 100644 --- a/src/Umbraco.Web/Scheduling/BackgroundTaskRunner.cs +++ b/src/Umbraco.Web/Scheduling/BackgroundTaskRunner.cs @@ -4,7 +4,6 @@ using System.Threading.Tasks; using System.Threading.Tasks.Dataflow; using System.Web.Hosting; using Umbraco.Core; -using Umbraco.Core.Composing; using Umbraco.Core.Events; using Umbraco.Core.Logging; @@ -15,7 +14,43 @@ namespace Umbraco.Web.Scheduling /// /// This class exists for logging purposes - the one you want to use is BackgroundTaskRunner{T}. public abstract class BackgroundTaskRunner - { } + { + /// + /// Creates a hook, to hook the task runner into the main domain. + /// + /// The object. + /// A method to execute when hooking into the main domain. + /// A method to execute when the main domain releases. + /// + public MainDomHook CreateMainDomHook(IMainDom mainDom, Action install, Action release) + { + return new MainDomHook(mainDom, install, release); + } + + public class MainDomHook + { + public MainDomHook(IMainDom mainDom, Action install, Action release) + { + MainDom = mainDom; + Install = install; + Release = release; + } + + public IMainDom MainDom { get; } + public Action Install { get; } + public Action Release { get; } + + internal bool Register() + { + if (MainDom != null) + return MainDom.Register(Install, Release); + + // tests + Install?.Invoke(); + return true; + } + } + } /// /// Manages a queue of tasks of type and runs them in the background. @@ -55,42 +90,6 @@ namespace Umbraco.Web.Scheduling private bool _terminated; // remember we've terminated private readonly TaskCompletionSource _terminatedSource = new TaskCompletionSource(); // enable awaiting termination - // fixme - this is temp - // at the moment MainDom is internal so we have to find a way to hook into it - temp - public class MainDomHook - { - private MainDomHook(MainDom mainDom, Action install, Action release) - { - MainDom = mainDom; - Install = install; - Release = release; - } - - internal MainDom MainDom { get; } - public Action Install { get; } - public Action Release { get; } - - public static MainDomHook Create(Action install, Action release) - { - return new MainDomHook(Core.Composing.Current.Factory.GetInstance(), install, release); - } - - public static MainDomHook CreateForTest(Action install, Action release) - { - return new MainDomHook(null, install, release); - } - - public bool Register() - { - if (MainDom != null) - return MainDom.Register(Install, Release); - - // tests - Install?.Invoke(); - return true; - } - } - /// /// Initializes a new instance of the class. /// @@ -129,11 +128,9 @@ namespace Umbraco.Web.Scheduling /// An optional main domain hook. public BackgroundTaskRunner(string name, BackgroundTaskRunnerOptions options, ILogger logger, MainDomHook hook = null) { - if (options == null) throw new ArgumentNullException(nameof(options)); - if (logger == null) throw new ArgumentNullException(nameof(logger)); - _options = options; + _options = options ?? throw new ArgumentNullException(nameof(options)); + _logger = logger ?? throw new ArgumentNullException(nameof(logger)); _logPrefix = "[" + name + "] "; - _logger = logger; if (options.Hosted) HostingEnvironment.RegisterObject(this); @@ -319,7 +316,7 @@ namespace Umbraco.Web.Scheduling } /// - /// Shuts the taks runner down. + /// Shuts the tasks runner down. /// /// True for force the runner to stop. /// True to wait until the runner has stopped. @@ -355,7 +352,7 @@ namespace Umbraco.Web.Scheduling // tasks in the queue will be executed... if (wait == false) return; - _runningTask?.Wait(); // wait for whatever is running to end... + _runningTask?.Wait(CancellationToken.None); // wait for whatever is running to end... } private async Task Pump() @@ -648,13 +645,13 @@ namespace Umbraco.Web.Scheduling #endregion /// - /// Requests a registered object to unregister. + /// Requests a registered object to un-register. /// - /// true to indicate the registered object should unregister from the hosting + /// true to indicate the registered object should un-register from the hosting /// environment before returning; otherwise, false. /// /// "When the application manager needs to stop a registered object, it will call the Stop method." - /// The application manager will call the Stop method to ask a registered object to unregister. During + /// The application manager will call the Stop method to ask a registered object to un-register. During /// processing of the Stop method, the registered object must call the HostingEnvironment.UnregisterObject method. /// public void Stop(bool immediate)