From 7bc208e49053c73fd7b0558df697972e8e9c7495 Mon Sep 17 00:00:00 2001 From: Sebastiaan Janssen Date: Tue, 14 Jul 2015 15:32:08 +0200 Subject: [PATCH 1/5] U4-6825 Can't blank out values using the built-in EditProfile snippet #U4-6825 Fixed --- src/Umbraco.Web/Security/MembershipHelper.cs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/Umbraco.Web/Security/MembershipHelper.cs b/src/Umbraco.Web/Security/MembershipHelper.cs index f066476948..918a2c1542 100644 --- a/src/Umbraco.Web/Security/MembershipHelper.cs +++ b/src/Umbraco.Web/Security/MembershipHelper.cs @@ -105,9 +105,7 @@ namespace Umbraco.Web.Security .Where(p => member.ContentType.PropertyTypeExists(p.Alias)) .Where(property => member.Properties.Contains(property.Alias)) //needs to be editable - .Where(p => member.ContentType.MemberCanEditProperty(p.Alias)) - //needs to have a value - .Where(p => p.Value != null)) + .Where(p => member.ContentType.MemberCanEditProperty(p.Alias))) { member.Properties[property.Alias].Value = property.Value; } From bf3a08cf85aba9f7aef1893f0152c86b75b939c2 Mon Sep 17 00:00:00 2001 From: Stephan Date: Tue, 14 Jul 2015 15:55:56 +0200 Subject: [PATCH 2/5] DisposableObject - cleanup & use --- src/Umbraco.Core/DisposableObject.cs | 67 ++++++++----------- .../Scheduling/BackgroundTaskRunnerTests.cs | 2 +- .../Scheduling/LatchedBackgroundTaskBase.cs | 31 ++------- 3 files changed, 34 insertions(+), 66 deletions(-) diff --git a/src/Umbraco.Core/DisposableObject.cs b/src/Umbraco.Core/DisposableObject.cs index f054b53c98..516a9712e5 100644 --- a/src/Umbraco.Core/DisposableObject.cs +++ b/src/Umbraco.Core/DisposableObject.cs @@ -4,69 +4,58 @@ using System.Threading; namespace Umbraco.Core { /// - /// Abstract implementation of logic commonly required to safely handle disposable unmanaged resources. + /// Abstract implementation of IDisposable. /// + /// + /// Can also be used as a pattern for when inheriting is not possible. + /// + /// See also: https://msdn.microsoft.com/en-us/library/b1yfkh5e%28v=vs.110%29.aspx + /// See also: https://lostechies.com/chrispatterson/2012/11/29/idisposable-done-right/ + /// + /// Note: if an object's ctor throws, it will never be disposed, and so if that ctor + /// has allocated disposable objects, it should take care of disposing them. + /// public abstract class DisposableObject : IDisposable { private bool _disposed; - private readonly ReaderWriterLockSlim _disposalLocker = new ReaderWriterLockSlim(); + private readonly object _locko = new object(); - /// - /// Gets a value indicating whether this instance is disposed. - /// - /// - /// true if this instance is disposed; otherwise, false. - /// - public bool IsDisposed - { - get { return _disposed; } - } + // gets a value indicating whether this instance is disposed. + // for internal tests only (not thread safe) + //TODO make this internal + rename "Disposed" when we can break compatibility + public bool IsDisposed { get { return _disposed; } } - /// - /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. - /// - /// 2 + // implements IDisposable public void Dispose() { Dispose(true); - - // Use SupressFinalize in case a subclass of this type implements a finalizer. GC.SuppressFinalize(this); } + // finalizer ~DisposableObject() { - // Run dispose but let the class know it was due to the finalizer running. Dispose(false); } - protected virtual void Dispose(bool disposing) + //TODO make this private, non-virtual when we can break compatibility + protected virtual void Dispose(bool disposing) { - // Only operate if we haven't already disposed - if (IsDisposed || !disposing) return; + lock (_locko) + { + if (_disposed) return; + _disposed = true; + } - using (new WriteLock(_disposalLocker)) - { - // Check again now we're inside the lock - if (IsDisposed) return; + DisposeUnmanagedResources(); - // Call to actually release resources. This method is only - // kept separate so that the entire disposal logic can be used as a VS snippet - DisposeResources(); - - // Indicate that the instance has been disposed. - _disposed = true; - } + if (disposing) + DisposeResources(); } - /// - /// Handles the disposal of resources. Derived from abstract class which handles common required locking logic. - /// protected abstract void DisposeResources(); protected virtual void DisposeUnmanagedResources() - { - - } + { } } } \ No newline at end of file diff --git a/src/Umbraco.Tests/Scheduling/BackgroundTaskRunnerTests.cs b/src/Umbraco.Tests/Scheduling/BackgroundTaskRunnerTests.cs index bb6b613afd..258c5adef9 100644 --- a/src/Umbraco.Tests/Scheduling/BackgroundTaskRunnerTests.cs +++ b/src/Umbraco.Tests/Scheduling/BackgroundTaskRunnerTests.cs @@ -603,7 +603,7 @@ namespace Umbraco.Tests.Scheduling runner.Shutdown(false, true); // check that task has been disposed (timer has been killed, etc) - Assert.IsTrue(task.Disposed); + Assert.IsTrue(task.IsDisposed); } } diff --git a/src/Umbraco.Web/Scheduling/LatchedBackgroundTaskBase.cs b/src/Umbraco.Web/Scheduling/LatchedBackgroundTaskBase.cs index 1fdb72bbb0..3315fa7c34 100644 --- a/src/Umbraco.Web/Scheduling/LatchedBackgroundTaskBase.cs +++ b/src/Umbraco.Web/Scheduling/LatchedBackgroundTaskBase.cs @@ -1,13 +1,13 @@ using System; using System.Threading; using System.Threading.Tasks; +using Umbraco.Core; namespace Umbraco.Web.Scheduling { - internal abstract class LatchedBackgroundTaskBase : ILatchedBackgroundTask + internal abstract class LatchedBackgroundTaskBase : DisposableObject, ILatchedBackgroundTask { private readonly ManualResetEventSlim _latch; - private bool _disposed; protected LatchedBackgroundTaskBase() { @@ -51,34 +51,13 @@ namespace Umbraco.Web.Scheduling public abstract bool RunsOnShutdown { get; } - public void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - } - - // the task is going to be disposed again after execution, + // the task is going to be disposed after execution, // unless it is latched again, thus indicating it wants to // remain active - protected virtual void Dispose(bool disposing) + protected override void DisposeResources() { - if (disposing == false) return; - - // lock on _latch instead of creating a new object as _latch is - // private, non-null, readonly - so safe here - lock (_latch) - { - if (_disposed) return; - _disposed = true; - _latch.Dispose(); - DisposeResources(); - } + _latch.Dispose(); } - - protected virtual void DisposeResources() - { } - - public bool Disposed { get { return _disposed; } } } } From a7871abbd9eabaf56877e161a2884c0baeb16e2d Mon Sep 17 00:00:00 2001 From: Sebastiaan Janssen Date: Tue, 14 Jul 2015 16:50:45 +0200 Subject: [PATCH 3/5] Update Examine and ClientDependency to latest version --- build/NuSpecs/UmbracoCms.Core.nuspec | 4 +- .../Configuration/UmbracoVersion.cs | 2 +- src/Umbraco.Tests/Umbraco.Tests.csproj | 6 +-- src/Umbraco.Tests/packages.config | 18 +++---- src/Umbraco.Web.UI/Umbraco.Web.UI.csproj | 13 ++--- src/Umbraco.Web.UI/packages.config | 50 +++++++++---------- src/Umbraco.Web/Umbraco.Web.csproj | 12 ++--- src/Umbraco.Web/packages.config | 18 +++---- src/UmbracoExamine/UmbracoExamine.csproj | 6 +-- src/UmbracoExamine/packages.config | 2 +- src/umbraco.MacroEngines/packages.config | 10 ++-- .../umbraco.MacroEngines.csproj | 6 +-- src/umbraco.cms/packages.config | 8 +-- src/umbraco.cms/umbraco.cms.csproj | 6 +-- src/umbraco.controls/packages.config | 2 +- src/umbraco.controls/umbraco.controls.csproj | 6 +-- src/umbraco.editorControls/packages.config | 2 +- .../umbraco.editorControls.csproj | 6 +-- 18 files changed, 89 insertions(+), 88 deletions(-) diff --git a/build/NuSpecs/UmbracoCms.Core.nuspec b/build/NuSpecs/UmbracoCms.Core.nuspec index 546c9259f6..03ccbc05be 100644 --- a/build/NuSpecs/UmbracoCms.Core.nuspec +++ b/build/NuSpecs/UmbracoCms.Core.nuspec @@ -28,11 +28,11 @@ - + - + diff --git a/src/Umbraco.Core/Configuration/UmbracoVersion.cs b/src/Umbraco.Core/Configuration/UmbracoVersion.cs index a548f759c7..3f8305589e 100644 --- a/src/Umbraco.Core/Configuration/UmbracoVersion.cs +++ b/src/Umbraco.Core/Configuration/UmbracoVersion.cs @@ -5,7 +5,7 @@ namespace Umbraco.Core.Configuration { public class UmbracoVersion { - private static readonly Version Version = new Version("7.2.6"); + private static readonly Version Version = new Version("7.2.7"); /// /// Gets the current version of Umbraco. diff --git a/src/Umbraco.Tests/Umbraco.Tests.csproj b/src/Umbraco.Tests/Umbraco.Tests.csproj index 18b9b8d006..15d7dd9d36 100644 --- a/src/Umbraco.Tests/Umbraco.Tests.csproj +++ b/src/Umbraco.Tests/Umbraco.Tests.csproj @@ -58,9 +58,9 @@ ..\packages\AutoMapper.3.0.0\lib\net40\AutoMapper.Net4.dll - - False - ..\packages\Examine.0.1.63.0\lib\Examine.dll + + ..\packages\Examine.0.1.64.0\lib\Examine.dll + True False diff --git a/src/Umbraco.Tests/packages.config b/src/Umbraco.Tests/packages.config index 58d314c3b1..36db9dbf5f 100644 --- a/src/Umbraco.Tests/packages.config +++ b/src/Umbraco.Tests/packages.config @@ -2,25 +2,25 @@ - - + + - - - + + + - + - - + + - + \ No newline at end of file diff --git a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj index 9649fd42e1..3a51c4afcb 100644 --- a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj +++ b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj @@ -47,6 +47,7 @@ ..\ true true + bin\ @@ -114,9 +115,9 @@ False ..\packages\AutoMapper.3.0.0\lib\net40\AutoMapper.Net4.dll - - False - ..\packages\ClientDependency.1.8.3.1\lib\net45\ClientDependency.Core.dll + + ..\packages\ClientDependency.1.8.4\lib\net45\ClientDependency.Core.dll + True False @@ -126,8 +127,8 @@ False ..\packages\dotless.1.4.1.0\lib\dotless.Core.dll - - ..\packages\Examine.0.1.63.0\lib\Examine.dll + + ..\packages\Examine.0.1.64.0\lib\Examine.dll True @@ -2540,7 +2541,7 @@ xcopy "$(ProjectDir)"..\packages\SqlServerCE.4.0.0.0\x86\*.* "$(TargetDir)x86\" True True - 7260 + 7270 / http://localhost:7270 False diff --git a/src/Umbraco.Web.UI/packages.config b/src/Umbraco.Web.UI/packages.config index 4a754f6758..935087b304 100644 --- a/src/Umbraco.Web.UI/packages.config +++ b/src/Umbraco.Web.UI/packages.config @@ -1,28 +1,28 @@  - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj index 7c0482b4ed..ae91b4e5f9 100644 --- a/src/Umbraco.Web/Umbraco.Web.csproj +++ b/src/Umbraco.Web/Umbraco.Web.csproj @@ -104,9 +104,9 @@ ..\packages\AutoMapper.3.0.0\lib\net40\AutoMapper.Net4.dll - - False - ..\packages\ClientDependency.1.8.3.1\lib\net45\ClientDependency.Core.dll + + ..\packages\ClientDependency.1.8.4\lib\net45\ClientDependency.Core.dll + True False @@ -115,9 +115,9 @@ ..\packages\dotless.1.4.1.0\lib\dotless.Core.dll - - False - ..\packages\Examine.0.1.63.0\lib\Examine.dll + + ..\packages\Examine.0.1.64.0\lib\Examine.dll + True False diff --git a/src/Umbraco.Web/packages.config b/src/Umbraco.Web/packages.config index 315d780852..53f3c712d8 100644 --- a/src/Umbraco.Web/packages.config +++ b/src/Umbraco.Web/packages.config @@ -1,24 +1,24 @@  - + - - + + - - - + + + - + - - + + \ No newline at end of file diff --git a/src/UmbracoExamine/UmbracoExamine.csproj b/src/UmbracoExamine/UmbracoExamine.csproj index b913c2bdf2..b7a8532077 100644 --- a/src/UmbracoExamine/UmbracoExamine.csproj +++ b/src/UmbracoExamine/UmbracoExamine.csproj @@ -82,9 +82,9 @@ ..\Solution Items\TheFARM-Public.snk - - False - ..\packages\Examine.0.1.63.0\lib\Examine.dll + + ..\packages\Examine.0.1.64.0\lib\Examine.dll + True False diff --git a/src/UmbracoExamine/packages.config b/src/UmbracoExamine/packages.config index efa216d153..7964077e96 100644 --- a/src/UmbracoExamine/packages.config +++ b/src/UmbracoExamine/packages.config @@ -1,6 +1,6 @@  - + \ No newline at end of file diff --git a/src/umbraco.MacroEngines/packages.config b/src/umbraco.MacroEngines/packages.config index 9951ba7e01..3088dabfd1 100644 --- a/src/umbraco.MacroEngines/packages.config +++ b/src/umbraco.MacroEngines/packages.config @@ -1,15 +1,15 @@  - - + + - - + + - + diff --git a/src/umbraco.MacroEngines/umbraco.MacroEngines.csproj b/src/umbraco.MacroEngines/umbraco.MacroEngines.csproj index a34198b5ce..8f63ddc7b3 100644 --- a/src/umbraco.MacroEngines/umbraco.MacroEngines.csproj +++ b/src/umbraco.MacroEngines/umbraco.MacroEngines.csproj @@ -45,9 +45,9 @@ false - - False - ..\packages\Examine.0.1.63.0\lib\Examine.dll + + ..\packages\Examine.0.1.64.0\lib\Examine.dll + True False diff --git a/src/umbraco.cms/packages.config b/src/umbraco.cms/packages.config index bdaf00b95d..539757211e 100644 --- a/src/umbraco.cms/packages.config +++ b/src/umbraco.cms/packages.config @@ -1,8 +1,8 @@  - - + + - - + + \ No newline at end of file diff --git a/src/umbraco.cms/umbraco.cms.csproj b/src/umbraco.cms/umbraco.cms.csproj index 7f81309863..708c5f4d27 100644 --- a/src/umbraco.cms/umbraco.cms.csproj +++ b/src/umbraco.cms/umbraco.cms.csproj @@ -106,9 +106,9 @@ false - - False - ..\packages\ClientDependency.1.8.3.1\lib\net45\ClientDependency.Core.dll + + ..\packages\ClientDependency.1.8.4\lib\net45\ClientDependency.Core.dll + True False diff --git a/src/umbraco.controls/packages.config b/src/umbraco.controls/packages.config index 0859f3d4e9..1e49726191 100644 --- a/src/umbraco.controls/packages.config +++ b/src/umbraco.controls/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/src/umbraco.controls/umbraco.controls.csproj b/src/umbraco.controls/umbraco.controls.csproj index a5c08e525a..3980e5ed27 100644 --- a/src/umbraco.controls/umbraco.controls.csproj +++ b/src/umbraco.controls/umbraco.controls.csproj @@ -68,9 +68,9 @@ false - - False - ..\packages\ClientDependency.1.8.3.1\lib\net45\ClientDependency.Core.dll + + ..\packages\ClientDependency.1.8.4\lib\net45\ClientDependency.Core.dll + True diff --git a/src/umbraco.editorControls/packages.config b/src/umbraco.editorControls/packages.config index 0859f3d4e9..1e49726191 100644 --- a/src/umbraco.editorControls/packages.config +++ b/src/umbraco.editorControls/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/src/umbraco.editorControls/umbraco.editorControls.csproj b/src/umbraco.editorControls/umbraco.editorControls.csproj index 1266015268..f49aac9dcb 100644 --- a/src/umbraco.editorControls/umbraco.editorControls.csproj +++ b/src/umbraco.editorControls/umbraco.editorControls.csproj @@ -114,9 +114,9 @@ {651E1350-91B6-44B7-BD60-7207006D7003} Umbraco.Web - - False - ..\packages\ClientDependency.1.8.3.1\lib\net45\ClientDependency.Core.dll + + ..\packages\ClientDependency.1.8.4\lib\net45\ClientDependency.Core.dll + True System From 1e3dd4c5cdfca3e3c0758964bb19146545193e93 Mon Sep 17 00:00:00 2001 From: Stephan Date: Tue, 14 Jul 2015 19:23:38 +0200 Subject: [PATCH 4/5] Cleanup new umbracoApplicationUrl config --- src/Umbraco.Core/ApplicationContext.cs | 2 +- .../config/umbracoSettings.Release.config | 7 ++++++- src/Umbraco.Web.UI/config/umbracoSettings.config | 11 ++++++++--- src/Umbraco.Web/UmbracoModule.cs | 3 +-- 4 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/Umbraco.Core/ApplicationContext.cs b/src/Umbraco.Core/ApplicationContext.cs index eec91fe345..93d502c8d3 100644 --- a/src/Umbraco.Core/ApplicationContext.cs +++ b/src/Umbraco.Core/ApplicationContext.cs @@ -160,7 +160,7 @@ namespace Umbraco.Core /// - has the SystemDirectories.Umbraco path /// - does not end with a slash /// It is initialized on the first request made to the server, by UmbracoModule.EnsureApplicationUrl: - /// - if umbracoSettings:settings/web.routing/@appUrl is set, use the value (new setting) + /// - if umbracoSettings:settings/web.routing/@umbracoApplicationUrl is set, use the value (new setting) /// - if umbracoSettings:settings/scheduledTasks/@baseUrl is set, use the value (backward compatibility) /// - otherwise, use the url of the (first) request. /// Not locking, does not matter if several threads write to this. diff --git a/src/Umbraco.Web.UI/config/umbracoSettings.Release.config b/src/Umbraco.Web.UI/config/umbracoSettings.Release.config index 4c21cedd54..08033d16eb 100644 --- a/src/Umbraco.Web.UI/config/umbracoSettings.Release.config +++ b/src/Umbraco.Web.UI/config/umbracoSettings.Release.config @@ -147,10 +147,15 @@ By default you can call any content Id in the url and show the content with that id, for example: http://mysite.com/1092 or http://mysite.com/1092.aspx would render the content with id 1092. Setting this setting to true stops that behavior + @umbracoApplicationUrl + The url of the Umbraco application. By default, Umbraco will figure it out from the first request. + Configure it here if you need anything specific. Needs to be a complete url with scheme and umbraco + path, eg http://mysite.com/umbraco. NOT just "mysite.com" or "mysite.com/umbraco" or "http://mysite.com". --> + internalRedirectPreservesTemplate="false" disableAlternativeTemplates="false" disableFindContentByIdPath="false" + umbracoApplicationUrl=""> diff --git a/src/Umbraco.Web.UI/config/umbracoSettings.config b/src/Umbraco.Web.UI/config/umbracoSettings.config index 255dce6542..546ecf42fe 100644 --- a/src/Umbraco.Web.UI/config/umbracoSettings.config +++ b/src/Umbraco.Web.UI/config/umbracoSettings.config @@ -276,10 +276,15 @@ By default you can call any content Id in the url and show the content with that id, for example: http://mysite.com/1092 or http://mysite.com/1092.aspx would render the content with id 1092. Setting this setting to true stops that behavior + @umbracoApplicationUrl + The url of the Umbraco application. By default, Umbraco will figure it out from the first request. + Configure it here if you need anything specific. Needs to be a complete url with scheme and umbraco + path, eg http://mysite.com/umbraco. NOT just "mysite.com" or "mysite.com/umbraco" or "http://mysite.com". --> - + \ No newline at end of file diff --git a/src/Umbraco.Web/UmbracoModule.cs b/src/Umbraco.Web/UmbracoModule.cs index fd75430ec0..6f89864d9e 100644 --- a/src/Umbraco.Web/UmbracoModule.cs +++ b/src/Umbraco.Web/UmbracoModule.cs @@ -51,9 +51,8 @@ namespace Umbraco.Web // use ports from request // otherwise, // if non-standard ports used, - // user may need to set baseUrl manually per + // user may need to set umbracoApplicationUrl manually per // http://our.umbraco.org/documentation/Using-Umbraco/Config-files/umbracoSettings/#ScheduledTasks - // TODO update the doc, prefer web.routing/@appUrl to scheduledTasks/@baseUrl var port = (request.IsSecureConnection == false && GlobalSettings.UseSSL == false) || (request.IsSecureConnection && GlobalSettings.UseSSL) ? ":" + request.ServerVariables["SERVER_PORT"] From 3062eedb4f01b8b978e2d3086a0ead7f5b4e1a6e Mon Sep 17 00:00:00 2001 From: Stephan Date: Tue, 14 Jul 2015 19:27:38 +0200 Subject: [PATCH 5/5] content - ensure backward compatibility --- src/Umbraco.Web/umbraco.presentation/content.cs | 11 +++++++++-- .../umbraco/preview/PreviewContent.cs | 4 ++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/Umbraco.Web/umbraco.presentation/content.cs b/src/Umbraco.Web/umbraco.presentation/content.cs index 0bb67bc517..7673a9d75d 100644 --- a/src/Umbraco.Web/umbraco.presentation/content.cs +++ b/src/Umbraco.Web/umbraco.presentation/content.cs @@ -192,7 +192,7 @@ namespace umbraco var node = GetPreviewOrPublishedNode(d, xmlContentCopy, false); var attr = ((XmlElement)node).GetAttributeNode("sortOrder"); attr.Value = d.sortOrder.ToString(); - xmlContentCopy = AddOrUpdateXmlNode(xmlContentCopy, d.Id, d.Level, parentId, node); + xmlContentCopy = GetAddOrUpdateXmlNode(xmlContentCopy, d.Id, d.Level, parentId, node); // update sitemapprovider if (updateSitemapProvider && SiteMap.Provider is UmbracoSiteMapProvider) @@ -1183,8 +1183,15 @@ order by umbracoNode.level, umbracoNode.sortOrder"; #region Manage change + //TODO remove as soon as we can break backward compatibility + [Obsolete("Use GetAddOrUpdateXmlNode which returns an updated Xml document.", false)] + public static void AddOrUpdateXmlNode(XmlDocument xml, int id, int level, int parentId, XmlNode docNode) + { + GetAddOrUpdateXmlNode(xml, id, level, parentId, docNode); + } + // adds or updates a node (docNode) into a cache (xml) - public static XmlDocument AddOrUpdateXmlNode(XmlDocument xml, int id, int level, int parentId, XmlNode docNode) + public static XmlDocument GetAddOrUpdateXmlNode(XmlDocument xml, int id, int level, int parentId, XmlNode docNode) { // sanity checks if (id != docNode.AttributeValue("id")) diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/preview/PreviewContent.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/preview/PreviewContent.cs index b44128fa18..e2a2588620 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/preview/PreviewContent.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/preview/PreviewContent.cs @@ -102,7 +102,7 @@ namespace umbraco.presentation.preview if (document.Content.Published == false && ApplicationContext.Current.Services.ContentService.HasPublishedVersion(document.Id)) previewXml.Attributes.Append(XmlContent.CreateAttribute("isDraft")); - XmlContent = content.AddOrUpdateXmlNode(XmlContent, document.Id, document.Level, parentId, previewXml); + XmlContent = content.GetAddOrUpdateXmlNode(XmlContent, document.Id, document.Level, parentId, previewXml); } if (includeSubs) @@ -112,7 +112,7 @@ namespace umbraco.presentation.preview var previewXml = XmlContent.ReadNode(XmlReader.Create(new StringReader(prevNode.Xml))); if (prevNode.IsDraft) previewXml.Attributes.Append(XmlContent.CreateAttribute("isDraft")); - XmlContent = content.AddOrUpdateXmlNode(XmlContent, prevNode.NodeId, prevNode.Level, prevNode.ParentId, previewXml); + XmlContent = content.GetAddOrUpdateXmlNode(XmlContent, prevNode.NodeId, prevNode.Level, prevNode.ParentId, previewXml); } }