From 085c06e043b0436230181b67d9c54463d752dde7 Mon Sep 17 00:00:00 2001 From: Shannon Date: Thu, 24 Aug 2017 16:22:50 +1000 Subject: [PATCH] Adds EventState to the event args instead of trying to change the AdditionalData which is a breaking change. Updates FileService and ContentService to use one event arg insteance for both before/after events so that the EventState flows and so we are allocating less objects. --- .../Events/CancellableEventArgs.cs | 22 ++- src/Umbraco.Core/Events/MoveEventArgs.cs | 21 ++- .../Events/RecycleBinEventArgs.cs | 2 +- src/Umbraco.Core/Services/ContentService.cs | 134 ++++++++++++------ src/Umbraco.Core/Services/FileService.cs | 58 ++++---- .../Routing/RedirectTrackingEventHandler.cs | 1 + 6 files changed, 158 insertions(+), 80 deletions(-) diff --git a/src/Umbraco.Core/Events/CancellableEventArgs.cs b/src/Umbraco.Core/Events/CancellableEventArgs.cs index 451c3e80f4..a245aeb367 100644 --- a/src/Umbraco.Core/Events/CancellableEventArgs.cs +++ b/src/Umbraco.Core/Events/CancellableEventArgs.cs @@ -18,7 +18,8 @@ namespace Umbraco.Core.Events { CanCancel = canCancel; Messages = messages; - AdditionalData = additionalData; + AdditionalData = new ReadOnlyDictionary(additionalData); + EventState = new Dictionary(); } public CancellableEventArgs(bool canCancel, EventMessages eventMessages) @@ -26,7 +27,8 @@ namespace Umbraco.Core.Events if (eventMessages == null) throw new ArgumentNullException("eventMessages"); CanCancel = canCancel; Messages = eventMessages; - AdditionalData = new Dictionary(); + AdditionalData = new ReadOnlyDictionary(new Dictionary()); + EventState = new Dictionary(); } public CancellableEventArgs(bool canCancel) @@ -34,7 +36,8 @@ namespace Umbraco.Core.Events CanCancel = canCancel; //create a standalone messages Messages = new EventMessages(); - AdditionalData = new Dictionary(); + AdditionalData = new ReadOnlyDictionary(new Dictionary()); + EventState = new Dictionary(); } public CancellableEventArgs(EventMessages eventMessages) @@ -92,12 +95,19 @@ namespace Umbraco.Core.Events public EventMessages Messages { get; private set; } /// - /// In some cases raised evens might need to contain additional arbitrary data which can be read by event subscribers + /// In some cases raised evens might need to contain additional arbitrary readonly data which can be read by event subscribers /// /// - /// This also allows for storing stateful data between a start ("ing") event and a end ("ed") event for event handlers + /// This allows for a bit of flexibility in our event raising - it's not pretty but we need to maintain backwards compatibility + /// so we cannot change the strongly typed nature for some events. /// - public IDictionary AdditionalData { get; private set; } + public ReadOnlyDictionary AdditionalData { get; private set; } + + /// + /// This can be used by event subscribers to store state in the event args so they easily deal with custom state data between a starting ("ing") + /// event and an ending ("ed") event + /// + public IDictionary EventState { get; private set; } public bool Equals(CancellableEventArgs other) { diff --git a/src/Umbraco.Core/Events/MoveEventArgs.cs b/src/Umbraco.Core/Events/MoveEventArgs.cs index 228e1ca2f7..1fd9c8671a 100644 --- a/src/Umbraco.Core/Events/MoveEventArgs.cs +++ b/src/Umbraco.Core/Events/MoveEventArgs.cs @@ -6,6 +6,8 @@ namespace Umbraco.Core.Events { public class MoveEventArgs : CancellableObjectEventArgs, IEquatable> { + private IEnumerable> _moveInfoCollection; + /// /// Constructor accepting a collection of MoveEventInfo objects /// @@ -107,7 +109,24 @@ namespace Umbraco.Core.Events /// /// Gets all MoveEventInfo objects used to create the object /// - public IEnumerable> MoveInfoCollection { get; private set; } + public IEnumerable> MoveInfoCollection + { + get { return _moveInfoCollection; } + set + { + var first = _moveInfoCollection.FirstOrDefault(); + if (first == null) + { + throw new InvalidOperationException("MoveInfoCollection must have at least one item"); + } + + _moveInfoCollection = value; + + //assign the legacy props + EventObject = first.Entity; + ParentId = first.NewParentId; + } + } /// /// The entity being moved diff --git a/src/Umbraco.Core/Events/RecycleBinEventArgs.cs b/src/Umbraco.Core/Events/RecycleBinEventArgs.cs index c6d7c659b7..62c00d7c5b 100644 --- a/src/Umbraco.Core/Events/RecycleBinEventArgs.cs +++ b/src/Umbraco.Core/Events/RecycleBinEventArgs.cs @@ -107,7 +107,7 @@ namespace Umbraco.Core.Events /// /// Boolean indicating whether the Recycle Bin was emptied successfully /// - public bool RecycleBinEmptiedSuccessfully { get; private set; } + public bool RecycleBinEmptiedSuccessfully { get; set; } /// /// Boolean indicating whether this event was fired for the Content's Recycle Bin. diff --git a/src/Umbraco.Core/Services/ContentService.cs b/src/Umbraco.Core/Services/ContentService.cs index 3cf8dfcff4..09e6068ce1 100644 --- a/src/Umbraco.Core/Services/ContentService.cs +++ b/src/Umbraco.Core/Services/ContentService.cs @@ -166,7 +166,8 @@ namespace Umbraco.Core.Services using (var uow = UowProvider.GetUnitOfWork()) { - if (uow.Events.DispatchCancelable(Creating, this, new NewEventArgs(content, contentTypeAlias, parentId))) + var newEventArgs = new NewEventArgs(content, contentTypeAlias, parentId); + if (uow.Events.DispatchCancelable(Creating, this, newEventArgs)) { uow.Commit(); content.WasCancelled = true; @@ -175,8 +176,8 @@ namespace Umbraco.Core.Services content.CreatorId = userId; content.WriterId = userId; - - uow.Events.Dispatch(Created, this, new NewEventArgs(content, false, contentTypeAlias, parentId)); + newEventArgs.CanCancel = false; + uow.Events.Dispatch(Created, this, newEventArgs); Audit(uow, AuditType.New, string.Format("Content '{0}' was created", name), content.CreatorId, content.Id); uow.Commit(); @@ -209,7 +210,8 @@ namespace Umbraco.Core.Services using (var uow = UowProvider.GetUnitOfWork()) { - if (uow.Events.DispatchCancelable(Creating, this, new NewEventArgs(content, contentTypeAlias, parent))) + var newEventArgs = new NewEventArgs(content, contentTypeAlias, parent); + if (uow.Events.DispatchCancelable(Creating, this, newEventArgs)) { uow.Commit(); content.WasCancelled = true; @@ -218,8 +220,8 @@ namespace Umbraco.Core.Services content.CreatorId = userId; content.WriterId = userId; - - uow.Events.Dispatch(Created, this, new NewEventArgs(content, false, contentTypeAlias, parent)); + newEventArgs.CanCancel = false; + uow.Events.Dispatch(Created, this, newEventArgs); Audit(uow, AuditType.New, string.Format("Content '{0}' was created", name), content.CreatorId, content.Id); uow.Commit(); @@ -250,14 +252,16 @@ namespace Umbraco.Core.Services { //NOTE: I really hate the notion of these Creating/Created events - they are so inconsistent, I've only just found // out that in these 'WithIdentity' methods, the Saving/Saved events were not fired, wtf. Anyways, they're added now. - if (uow.Events.DispatchCancelable(Creating, this, new NewEventArgs(content, contentTypeAlias, parentId))) + var newEventArgs = new NewEventArgs(content, contentTypeAlias, parentId); + if (uow.Events.DispatchCancelable(Creating, this, newEventArgs)) { uow.Commit(); content.WasCancelled = true; return content; } - if (uow.Events.DispatchCancelable(Saving, this, new SaveEventArgs(content))) + var saveEventArgs = new SaveEventArgs(content); + if (uow.Events.DispatchCancelable(Saving, this, saveEventArgs)) { uow.Commit(); content.WasCancelled = true; @@ -270,9 +274,10 @@ namespace Umbraco.Core.Services repository.AddOrUpdate(content); repository.AddOrUpdatePreviewXml(content, c => _entitySerializer.Serialize(this, _dataTypeService, _userService, c)); - - uow.Events.Dispatch(Saved, this, new SaveEventArgs(content, false)); - uow.Events.Dispatch(Created, this, new NewEventArgs(content, false, contentTypeAlias, parentId)); + saveEventArgs.CanCancel = false; + uow.Events.Dispatch(Saved, this, saveEventArgs); + newEventArgs.CanCancel = false; + uow.Events.Dispatch(Created, this, newEventArgs); Audit(uow, AuditType.New, string.Format("Content '{0}' was created with Id {1}", name, content.Id), content.CreatorId, content.Id); uow.Commit(); @@ -305,14 +310,16 @@ namespace Umbraco.Core.Services { //NOTE: I really hate the notion of these Creating/Created events - they are so inconsistent, I've only just found // out that in these 'WithIdentity' methods, the Saving/Saved events were not fired, wtf. Anyways, they're added now. - if (uow.Events.DispatchCancelable(Creating, this, new NewEventArgs(content, contentTypeAlias, parent))) + var newEventArgs = new NewEventArgs(content, contentTypeAlias, parent); + if (uow.Events.DispatchCancelable(Creating, this, newEventArgs)) { uow.Commit(); content.WasCancelled = true; return content; } - if (uow.Events.DispatchCancelable(Saving, this, new SaveEventArgs(content))) + var saveEventArgs = new SaveEventArgs(content); + if (uow.Events.DispatchCancelable(Saving, this, saveEventArgs)) { uow.Commit(); content.WasCancelled = true; @@ -325,9 +332,10 @@ namespace Umbraco.Core.Services repository.AddOrUpdate(content); repository.AddOrUpdatePreviewXml(content, c => _entitySerializer.Serialize(this, _dataTypeService, _userService, c)); - - uow.Events.Dispatch(Saved, this, new SaveEventArgs(content, false)); - uow.Events.Dispatch(Created, this, new NewEventArgs(content, false, contentTypeAlias, parent)); + saveEventArgs.CanCancel = false; + uow.Events.Dispatch(Saved, this, saveEventArgs); + newEventArgs.CanCancel = false; + uow.Events.Dispatch(Created, this, newEventArgs); Audit(uow, AuditType.New, string.Format("Content '{0}' was created with Id {1}", name, content.Id), content.CreatorId, content.Id); uow.Commit(); @@ -1018,14 +1026,16 @@ namespace Umbraco.Core.Services //see: http://issues.umbraco.org/issue/U4-9336 content.EnsureValidPath(Logger, entity => GetById(entity.ParentId), QuickUpdate); var originalPath = content.Path; - if (uow.Events.DispatchCancelable(Trashing, this, new MoveEventArgs(evtMsgs, new MoveEventInfo(content, originalPath, Constants.System.RecycleBinContent)), "Trashing")) + var moveEventInfo = new MoveEventInfo(content, originalPath, Constants.System.RecycleBinContent); + var moveEventArgs = new MoveEventArgs(evtMsgs, moveEventInfo); + if (uow.Events.DispatchCancelable(Trashing, this, moveEventArgs, "Trashing")) { uow.Commit(); return OperationStatus.Cancelled(evtMsgs); } var moveInfo = new List> { - new MoveEventInfo(content, originalPath, Constants.System.RecycleBinContent) + moveEventInfo }; //get descendents to process of the content item that is being moved to trash - must be done before changing the state below @@ -1052,11 +1062,13 @@ namespace Umbraco.Core.Services descendant.WriterId = userId; descendant.ChangeTrashedState(true, descendant.ParentId); repository.AddOrUpdate(descendant); - + moveInfo.Add(new MoveEventInfo(descendant, descendant.Path, descendant.ParentId)); } - uow.Events.Dispatch(Trashed, this, new MoveEventArgs(false, evtMsgs, moveInfo.ToArray()), "Trashed"); + moveEventArgs.CanCancel = false; + moveEventArgs.MoveInfoCollection = moveInfo; + uow.Events.Dispatch(Trashed, this, moveEventArgs, "Trashed"); Audit(uow, AuditType.Move, "Move Content to Recycle Bin performed by user", userId, content.Id); uow.Commit(); @@ -1183,7 +1195,8 @@ namespace Umbraco.Core.Services using (var uow = UowProvider.GetUnitOfWork()) { - if (raiseEvents && uow.Events.DispatchCancelable(Saving, this, new SaveEventArgs(asArray, evtMsgs))) + var saveEventArgs = new SaveEventArgs(asArray, evtMsgs); + if (raiseEvents && uow.Events.DispatchCancelable(Saving, this, saveEventArgs)) { uow.Commit(); return OperationStatus.Cancelled(evtMsgs); @@ -1224,7 +1237,10 @@ namespace Umbraco.Core.Services } if (raiseEvents) - uow.Events.Dispatch(Saved, this, new SaveEventArgs(asArray, false, evtMsgs)); + { + saveEventArgs.CanCancel = false; + uow.Events.Dispatch(Saved, this, saveEventArgs); + } Audit(uow, AuditType.Save, "Bulk Save content performed by user", userId == -1 ? 0 : userId, Constants.System.Root); uow.Commit(); @@ -1250,7 +1266,8 @@ namespace Umbraco.Core.Services { using (var uow = UowProvider.GetUnitOfWork()) { - if (uow.Events.DispatchCancelable(Deleting, this, new DeleteEventArgs(content, evtMsgs), "Deleting")) + var deleteEventArgs = new DeleteEventArgs(content, evtMsgs); + if (uow.Events.DispatchCancelable(Deleting, this, deleteEventArgs, "Deleting")) { uow.Commit(); return OperationStatus.Cancelled(evtMsgs); @@ -1273,8 +1290,8 @@ namespace Umbraco.Core.Services repository.Delete(content); - var args = new DeleteEventArgs(content, false, evtMsgs); - uow.Events.Dispatch(Deleted, this, args, "Deleted"); + deleteEventArgs.CanCancel = false; + uow.Events.Dispatch(Deleted, this, deleteEventArgs, "Deleted"); Audit(uow, AuditType.Delete, "Delete Content performed by user", userId, content.Id); uow.Commit(); @@ -1402,7 +1419,8 @@ namespace Umbraco.Core.Services { using (var uow = UowProvider.GetUnitOfWork()) { - if (uow.Events.DispatchCancelable(DeletingVersions, this, new DeleteRevisionsEventArgs(id, dateToRetain: versionDate), "DeletingVersions")) + var deleteRevisionsEventArgs = new DeleteRevisionsEventArgs(id, dateToRetain: versionDate); + if (uow.Events.DispatchCancelable(DeletingVersions, this, deleteRevisionsEventArgs, "DeletingVersions")) { uow.Commit(); return; @@ -1410,8 +1428,8 @@ namespace Umbraco.Core.Services var repository = RepositoryFactory.CreateContentRepository(uow); repository.DeleteVersions(id, versionDate); - - uow.Events.Dispatch(DeletedVersions, this, new DeleteRevisionsEventArgs(id, false, dateToRetain: versionDate), "DeletedVersions"); + deleteRevisionsEventArgs.CanCancel = false; + uow.Events.Dispatch(DeletedVersions, this, deleteRevisionsEventArgs, "DeletedVersions"); Audit(uow, AuditType.Delete, "Delete Content by version date performed by user", userId, Constants.System.Root); uow.Commit(); @@ -1490,7 +1508,9 @@ namespace Umbraco.Core.Services using (var uow = UowProvider.GetUnitOfWork()) { - if (uow.Events.DispatchCancelable(Moving, this, new MoveEventArgs(new MoveEventInfo(content, content.Path, parentId)), "Moving")) + var moveEventInfo = new MoveEventInfo(content, content.Path, parentId); + var moveEventArgs = new MoveEventArgs(moveEventInfo); + if (uow.Events.DispatchCancelable(Moving, this, moveEventArgs, "Moving")) { uow.Commit(); return; @@ -1502,7 +1522,9 @@ namespace Umbraco.Core.Services //call private method that does the recursive moving PerformMove(content, parentId, userId, moveInfo); - uow.Events.Dispatch(Moved, this, new MoveEventArgs(false, moveInfo.ToArray()), "Moved"); + moveEventArgs.MoveInfoCollection = moveInfo; + moveEventArgs.CanCancel = false; + uow.Events.Dispatch(Moved, this, moveEventArgs, "Moved"); Audit(uow, AuditType.Move, "Move Content performed by user", userId, content.Id); uow.Commit(); @@ -1531,15 +1553,17 @@ namespace Umbraco.Core.Services var files = ((ContentRepository)repository).GetFilesInRecycleBinForUploadField(); - if (uow.Events.DispatchCancelable(EmptyingRecycleBin, this, new RecycleBinEventArgs(nodeObjectType, entities, files))) + var recycleBinEventArgs = new RecycleBinEventArgs(nodeObjectType, entities, files); + if (uow.Events.DispatchCancelable(EmptyingRecycleBin, this, recycleBinEventArgs)) { uow.Commit(); return; } var success = repository.EmptyRecycleBin(); - - uow.Events.Dispatch(EmptiedRecycleBin, this, new RecycleBinEventArgs(nodeObjectType, entities, files, success)); + recycleBinEventArgs.CanCancel = false; + recycleBinEventArgs.RecycleBinEmptiedSuccessfully = success; + uow.Events.Dispatch(EmptiedRecycleBin, this, recycleBinEventArgs); Audit(uow, AuditType.Delete, "Empty Content Recycle Bin performed by user", 0, Constants.System.RecycleBinContent); uow.Commit(); @@ -1586,7 +1610,8 @@ namespace Umbraco.Core.Services using (var uow = UowProvider.GetUnitOfWork()) { - if (uow.Events.DispatchCancelable(Copying, this, new CopyEventArgs(content, copy, parentId))) + var copyEventArgs = new CopyEventArgs(content, copy, true, parentId, relateToOriginal); + if (uow.Events.DispatchCancelable(Copying, this, copyEventArgs)) { uow.Commit(); return null; @@ -1627,7 +1652,8 @@ namespace Umbraco.Core.Services Copy(child, copy.Id, relateToOriginal, true, userId); } } - uow.Events.Dispatch(Copied, this, new CopyEventArgs(content, copy, false, parentId, relateToOriginal)); + copyEventArgs.CanCancel = false; + uow.Events.Dispatch(Copied, this, copyEventArgs); Audit(uow, AuditType.Copy, "Copy Content performed by user", content.WriterId, content.Id); uow.Commit(); } @@ -1647,7 +1673,8 @@ namespace Umbraco.Core.Services { using (var uow = UowProvider.GetUnitOfWork()) { - if (uow.Events.DispatchCancelable(SendingToPublish, this, new SendToPublishEventArgs(content))) + var sendToPublishEventArgs = new SendToPublishEventArgs(content); + if (uow.Events.DispatchCancelable(SendingToPublish, this, sendToPublishEventArgs)) { uow.Commit(); return false; @@ -1655,8 +1682,8 @@ namespace Umbraco.Core.Services //Save before raising event Save(content, userId); - - uow.Events.Dispatch(SentToPublish, this, new SendToPublishEventArgs(content, false)); + sendToPublishEventArgs.CanCancel = false; + uow.Events.Dispatch(SentToPublish, this, sendToPublishEventArgs); Audit(uow, AuditType.SendToPublish, "Send to Publish performed by user", content.WriterId, content.Id); uow.Commit(); @@ -1683,7 +1710,8 @@ namespace Umbraco.Core.Services using (var uow = UowProvider.GetUnitOfWork()) { - if (uow.Events.DispatchCancelable(RollingBack, this, new RollbackEventArgs(content))) + var rollbackEventArgs = new RollbackEventArgs(content); + if (uow.Events.DispatchCancelable(RollingBack, this, rollbackEventArgs)) { uow.Commit(); return content; @@ -1697,8 +1725,8 @@ namespace Umbraco.Core.Services repository.AddOrUpdate(content); repository.AddOrUpdatePreviewXml(content, c => _entitySerializer.Serialize(this, _dataTypeService, _userService, c)); - - uow.Events.Dispatch(RolledBack, this, new RollbackEventArgs(content, false)); + rollbackEventArgs.CanCancel = false; + uow.Events.Dispatch(RolledBack, this, rollbackEventArgs); Audit(uow, AuditType.RollBack, "Content rollback performed by user", content.WriterId, content.Id); uow.Commit(); @@ -1729,7 +1757,8 @@ namespace Umbraco.Core.Services using (var uow = UowProvider.GetUnitOfWork()) { var asArray = items.ToArray(); - if (raiseEvents && uow.Events.DispatchCancelable(Saving, this, new SaveEventArgs(asArray))) + var saveEventArgs = new SaveEventArgs(asArray); + if (raiseEvents && uow.Events.DispatchCancelable(Saving, this, saveEventArgs)) { uow.Commit(); return false; @@ -1774,7 +1803,10 @@ namespace Umbraco.Core.Services } if (raiseEvents) - uow.Events.Dispatch(Saved, this, new SaveEventArgs(asArray, false)); + { + saveEventArgs.CanCancel = false; + uow.Events.Dispatch(Saved, this, saveEventArgs); + } if (shouldBePublished.Any()) { @@ -2138,7 +2170,8 @@ namespace Umbraco.Core.Services { using (var uow = UowProvider.GetUnitOfWork()) { - if (raiseEvents && uow.Events.DispatchCancelable(Saving, this, new SaveEventArgs(content, evtMsgs))) + var saveEventArgs = new SaveEventArgs(content, evtMsgs); + if (raiseEvents && uow.Events.DispatchCancelable(Saving, this, saveEventArgs)) { uow.Commit(); return Attempt.Fail(new PublishStatus(content, PublishStatusType.FailedCancelledByEvent, evtMsgs)); @@ -2193,7 +2226,10 @@ namespace Umbraco.Core.Services } if (raiseEvents) - uow.Events.Dispatch(Saved, this, new SaveEventArgs(content, false, evtMsgs)); + { + saveEventArgs.CanCancel = false; + uow.Events.Dispatch(Saved, this, saveEventArgs); + } //Save xml to db and call following method to fire event through PublishingStrategy to update cache if (published) @@ -2232,7 +2268,8 @@ namespace Umbraco.Core.Services { using (var uow = UowProvider.GetUnitOfWork()) { - if (raiseEvents && uow.Events.DispatchCancelable(Saving, this, new SaveEventArgs(content, evtMsgs))) + var saveEventArgs = new SaveEventArgs(content, evtMsgs); + if (raiseEvents && uow.Events.DispatchCancelable(Saving, this, saveEventArgs)) { uow.Commit(); return OperationStatus.Cancelled(evtMsgs); @@ -2261,7 +2298,10 @@ namespace Umbraco.Core.Services repository.AddOrUpdatePreviewXml(content, c => _entitySerializer.Serialize(this, _dataTypeService, _userService, c)); if (raiseEvents) - uow.Events.Dispatch(Saved, this, new SaveEventArgs(content, false, evtMsgs)); + { + saveEventArgs.CanCancel = false; + uow.Events.Dispatch(Saved, this, saveEventArgs); + } Audit(uow, AuditType.Save, "Save Content performed by user", userId, content.Id); uow.Commit(); diff --git a/src/Umbraco.Core/Services/FileService.cs b/src/Umbraco.Core/Services/FileService.cs index 08e18672f0..916c036a69 100644 --- a/src/Umbraco.Core/Services/FileService.cs +++ b/src/Umbraco.Core/Services/FileService.cs @@ -70,7 +70,8 @@ namespace Umbraco.Core.Services { using (var uow = UowProvider.GetUnitOfWork()) { - if (uow.Events.DispatchCancelable(SavingStylesheet, this, new SaveEventArgs(stylesheet))) + var saveEventArgs = new SaveEventArgs(stylesheet); + if (uow.Events.DispatchCancelable(SavingStylesheet, this, saveEventArgs)) { uow.Commit(); return; @@ -78,8 +79,8 @@ namespace Umbraco.Core.Services var repository = RepositoryFactory.CreateStylesheetRepository(uow); repository.AddOrUpdate(stylesheet); - - uow.Events.Dispatch(SavedStylesheet, this, new SaveEventArgs(stylesheet, false)); + saveEventArgs.CanCancel = false; + uow.Events.Dispatch(SavedStylesheet, this, saveEventArgs); Audit(uow, AuditType.Save, "Save Stylesheet performed by user", userId, -1); uow.Commit(); @@ -103,15 +104,16 @@ namespace Umbraco.Core.Services return; } - if (uow.Events.DispatchCancelable(DeletingStylesheet, this, new DeleteEventArgs(stylesheet))) + var deleteEventArgs = new DeleteEventArgs(stylesheet); + if (uow.Events.DispatchCancelable(DeletingStylesheet, this, deleteEventArgs)) { uow.Commit(); return; } repository.Delete(stylesheet); - - uow.Events.Dispatch(DeletedStylesheet, this, new DeleteEventArgs(stylesheet, false)); + deleteEventArgs.CanCancel = false; + uow.Events.Dispatch(DeletedStylesheet, this, deleteEventArgs); Audit(uow, AuditType.Delete, string.Format("Delete Stylesheet performed by user"), userId, -1); uow.Commit(); @@ -171,7 +173,8 @@ namespace Umbraco.Core.Services { using (var uow = UowProvider.GetUnitOfWork()) { - if (uow.Events.DispatchCancelable(SavingScript, this, new SaveEventArgs