diff options
author | Lluis Sanchez <llsan@microsoft.com> | 2022-10-27 14:07:30 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-10-27 14:07:30 +0300 |
commit | ee62ae03ad9571f44cb69f50380219b6524672cf (patch) | |
tree | 45fc774082fdde5daf67bf0f6510a7d0700f6279 | |
parent | 9eaab025099bc82c0fc31379afa95786aa7fcdfa (diff) | |
parent | 3752481f197aae34e4f6aa837743ef4597581793 (diff) |
Merge pull request #197 from mono/dev/lluis/fix-notification-nre
Fix NRE when unloading an add-in
-rw-r--r-- | Mono.Addins/Mono.Addins/ExtensionContextTransaction.cs | 4 | ||||
-rw-r--r-- | Test/FileContentExtension/FileContentExtension.addin.xml | 27 | ||||
-rw-r--r-- | Test/UnitTests/SimpleApp.addin.xml | 4 | ||||
-rw-r--r-- | Test/UnitTests/TestEvents.cs | 8 | ||||
-rw-r--r-- | Test/UnitTests/TestMultithreading.cs | 8 | ||||
-rw-r--r-- | Version.props | 2 |
6 files changed, 48 insertions, 5 deletions
diff --git a/Mono.Addins/Mono.Addins/ExtensionContextTransaction.cs b/Mono.Addins/Mono.Addins/ExtensionContextTransaction.cs index ba2a245..99cba20 100644 --- a/Mono.Addins/Mono.Addins/ExtensionContextTransaction.cs +++ b/Mono.Addins/Mono.Addins/ExtensionContextTransaction.cs @@ -165,7 +165,9 @@ namespace Mono.Addins { foreach (var node in childrenChanged) { - if (node.NotifyChildrenChanged()) + // It may happen that a node is removed while updating its parent. In this case the parent + // will be set to null, and then there is no need to notify changes + if (node.Parent != null && node.NotifyChildrenChanged()) NotifyExtensionsChangedEvent(node.GetPath()); } } diff --git a/Test/FileContentExtension/FileContentExtension.addin.xml b/Test/FileContentExtension/FileContentExtension.addin.xml index b3f1144..6675368 100644 --- a/Test/FileContentExtension/FileContentExtension.addin.xml +++ b/Test/FileContentExtension/FileContentExtension.addin.xml @@ -65,6 +65,33 @@ <Node id="n4" type="test" /> </Extension> + <Extension path="/SimpleApp/ItemTree"> + <ItemSet label="i1"> + <Item /> + <ItemSet label="i2"> + <Item /> + <ItemSet label="i1"> + <Item /> + <ItemSet label="i2"> + <Item /> + <ItemSet label="i1"> + <Item /> + <ItemSet label="i2"> + <Item /> + <ItemSet label="i1"> + <Item /> + <ItemSet label="i2"> + <Item /> + </ItemSet> + </ItemSet> + </ItemSet> + </ItemSet> + </ItemSet> + </ItemSet> + </ItemSet> + </ItemSet> + </Extension> + <Module> <Dependencies> <Addin id="SystemInfoExtension" version="0.1.0" /> diff --git a/Test/UnitTests/SimpleApp.addin.xml b/Test/UnitTests/SimpleApp.addin.xml index 7cf285c..86524f4 100644 --- a/Test/UnitTests/SimpleApp.addin.xml +++ b/Test/UnitTests/SimpleApp.addin.xml @@ -48,6 +48,10 @@ <ExtensionNode type="UnitTests.ItemSetNode" /> </ExtensionPoint> + <ExtensionPoint path = "/SimpleApp/ItemTree"> + <ExtensionNode type="UnitTests.ItemSetNode" /> + </ExtensionPoint> + <ExtensionPoint path = "/SimpleApp/NodeWithChildren"> <ExtensionNode name="Node"> <ExtensionNode name="Child" /> diff --git a/Test/UnitTests/TestEvents.cs b/Test/UnitTests/TestEvents.cs index 2b6cd73..c0ca45a 100644 --- a/Test/UnitTests/TestEvents.cs +++ b/Test/UnitTests/TestEvents.cs @@ -171,6 +171,7 @@ namespace UnitTests // All addins are enabled Assert.AreEqual (4, AddinManager.GetExtensionNodes ("/SimpleApp/Writers").Count, "count 1"); + AddinManager.GetExtensionNodes ("/SimpleApp/ItemTree"); string[] addinExtensions = new string[] { "/SimpleApp/Writers", @@ -178,7 +179,7 @@ namespace UnitTests "/SimpleApp.Core/TypeExtensions/SimpleApp.ISampleExtender", "/SimpleApp.Core/TypeExtensions/SimpleApp.IWriterWithMetadata", "/SimpleApp/NodesWithAttribute", - "/SimpleApp/DataExtensionWithAttribute", + "/SimpleApp/DataExtensionWithAttribute" }; InitChangedExtensionEvent (addinExtensions); @@ -209,7 +210,8 @@ namespace UnitTests "/SimpleApp/NodeWithChildren", "/SystemInformation/Modules", "/SimpleApp/DefaultInsertAfter", - "/SimpleApp/DefaultInsertBefore"); + "/SimpleApp/DefaultInsertBefore", + "/SimpleApp/ItemTree"); notifyCount = addCount = removeCount = eventCount = 0; AddinManager.Registry.DisableAddin ("SimpleApp.FileContentExtension,0.1.0"); @@ -220,7 +222,7 @@ namespace UnitTests Assert.AreEqual (1, notifyCount, "notifyCount 3"); Assert.AreEqual (0, addCount, "addCount 3"); Assert.AreEqual (1, removeCount, "removeCount 3"); - Assert.AreEqual (6, eventCount, "eventCount 3"); + Assert.AreEqual (7, eventCount, "eventCount 3"); // Now unregister diff --git a/Test/UnitTests/TestMultithreading.cs b/Test/UnitTests/TestMultithreading.cs index 646cdef..64a560a 100644 --- a/Test/UnitTests/TestMultithreading.cs +++ b/Test/UnitTests/TestMultithreading.cs @@ -7,6 +7,7 @@ using SimpleApp; using System.Threading; using System.Diagnostics; using System.Linq; +using System.Collections.Generic; namespace UnitTests { @@ -62,6 +63,7 @@ namespace UnitTests testData.StartThreads ((index, data) => { while (!data.Stopped) { + LoadAll(AddinManager.GetExtensionNodes<ItemSetNode>("/SimpleApp/ItemTree")); var writers = AddinManager.GetExtensionObjects<IWriter> ("/SimpleApp/Writers"); testData.Counters [index] = writers.Length; } @@ -87,6 +89,12 @@ namespace UnitTests } } + void LoadAll(IEnumerable<ExtensionNode> nodes) + { + foreach (var n in nodes.OfType<ItemSetNode>()) + LoadAll(n.GetChildNodes()); + } + [Test] public void EventsMultithread() { diff --git a/Version.props b/Version.props index 1f5e3c5..d6968ef 100644 --- a/Version.props +++ b/Version.props @@ -1,6 +1,6 @@ <Project> <PropertyGroup> - <PackageVersion>1.4</PackageVersion> + <PackageVersion>1.4.1</PackageVersion> <Authors>Microsoft</Authors> <Owners>microsoft, xamarin</Owners> <PackageLicenseUrl>https://github.com/mono/mono-addins/blob/main/COPYING</PackageLicenseUrl> |