# HG changeset patch # User Jaroslav Tulach # Date 1443963301 -7200 # Node ID 2ea65c6d3a8b83fd0f058a41a9728b50d6f3aee8 # Parent a0f79e32d5269a5a69be572215096f8e01151f18 #255677: Keep reference to Knockout object until its model object is GCed diff -r a0f79e32d526 -r 2ea65c6d3a8b ko4j/src/main/java/org/netbeans/html/ko4j/KOTech.java --- a/ko4j/src/main/java/org/netbeans/html/ko4j/KOTech.java Fri Oct 02 08:57:14 2015 +0200 +++ b/ko4j/src/main/java/org/netbeans/html/ko4j/KOTech.java Sun Oct 04 14:55:01 2015 +0200 @@ -66,6 +66,10 @@ @Override public Object wrapModel(Object model, PropertyBinding[] propArr, FunctionBinding[] funcArr) { + return createKO(model, propArr, funcArr, null); + } + + final Object createKO(Object model, PropertyBinding[] propArr, FunctionBinding[] funcArr, Knockout[] ko) { String[] propNames = new String[propArr.length]; boolean[] propReadOnly = new boolean[propArr.length]; Object[] propValues = new Object[propArr.length]; @@ -83,8 +87,12 @@ funcNames[i] = funcArr[i].getFunctionName(); } Object ret = getJSObject(); - new Knockout(model, ret, propArr, funcArr).wrapModel( - ret, + Knockout newKO = new Knockout(model, ret, propArr, funcArr); + if (ko != null) { + ko[0] = newKO; + } + newKO.wrapModel( + ret, propNames, propReadOnly, propValues, funcNames ); diff -r a0f79e32d526 -r 2ea65c6d3a8b ko4j/src/main/java/org/netbeans/html/ko4j/Knockout.java --- a/ko4j/src/main/java/org/netbeans/html/ko4j/Knockout.java Fri Oct 02 08:57:14 2015 +0200 +++ b/ko4j/src/main/java/org/netbeans/html/ko4j/Knockout.java Sun Oct 04 14:55:01 2015 +0200 @@ -44,6 +44,9 @@ import java.lang.ref.ReferenceQueue; import java.lang.ref.WeakReference; +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; import net.java.html.js.JavaScriptBody; import net.java.html.js.JavaScriptResource; import net.java.html.json.Model; @@ -62,6 +65,7 @@ @JavaScriptResource("knockout-3.2.0.debug.js") final class Knockout extends WeakReference { private static final ReferenceQueue QUEUE = new ReferenceQueue(); + private static final Set active = Collections.synchronizedSet(new HashSet()); private PropertyBinding[] props; private FunctionBinding[] funcs; @@ -79,6 +83,7 @@ for (int i = 0; i < funcs.length; i++) { this.funcs[i] = funcs[i].weak(); } + active.add(this); } static void cleanUp() { @@ -87,6 +92,7 @@ if (ko == null) { return; } + active.remove(ko); clean(ko.js); ko.js = null; ko.props = null;