#255677: Keep reference to Knockout object until its model object is GCed
authorJaroslav Tulach <jtulach@netbeans.org>
Sun, 04 Oct 2015 14:55:01 +0200
changeset 10072ea65c6d3a8b
parent 1006 a0f79e32d526
child 1008 c535c36881af
#255677: Keep reference to Knockout object until its model object is GCed
ko4j/src/main/java/org/netbeans/html/ko4j/KOTech.java
ko4j/src/main/java/org/netbeans/html/ko4j/Knockout.java
     1.1 --- a/ko4j/src/main/java/org/netbeans/html/ko4j/KOTech.java	Fri Oct 02 08:57:14 2015 +0200
     1.2 +++ b/ko4j/src/main/java/org/netbeans/html/ko4j/KOTech.java	Sun Oct 04 14:55:01 2015 +0200
     1.3 @@ -66,6 +66,10 @@
     1.4      
     1.5      @Override
     1.6      public Object wrapModel(Object model, PropertyBinding[] propArr, FunctionBinding[] funcArr) {
     1.7 +        return createKO(model, propArr, funcArr, null);
     1.8 +    }
     1.9 +
    1.10 +    final Object createKO(Object model, PropertyBinding[] propArr, FunctionBinding[] funcArr, Knockout[] ko) {
    1.11          String[] propNames = new String[propArr.length];
    1.12          boolean[] propReadOnly = new boolean[propArr.length];
    1.13          Object[] propValues = new Object[propArr.length];
    1.14 @@ -83,8 +87,12 @@
    1.15              funcNames[i] = funcArr[i].getFunctionName();
    1.16          }
    1.17          Object ret = getJSObject();
    1.18 -        new Knockout(model, ret, propArr, funcArr).wrapModel(
    1.19 -            ret, 
    1.20 +        Knockout newKO = new Knockout(model, ret, propArr, funcArr);
    1.21 +        if (ko != null) {
    1.22 +            ko[0] = newKO;
    1.23 +        }
    1.24 +        newKO.wrapModel(
    1.25 +            ret,
    1.26              propNames, propReadOnly, propValues,
    1.27              funcNames
    1.28          );
     2.1 --- a/ko4j/src/main/java/org/netbeans/html/ko4j/Knockout.java	Fri Oct 02 08:57:14 2015 +0200
     2.2 +++ b/ko4j/src/main/java/org/netbeans/html/ko4j/Knockout.java	Sun Oct 04 14:55:01 2015 +0200
     2.3 @@ -44,6 +44,9 @@
     2.4  
     2.5  import java.lang.ref.ReferenceQueue;
     2.6  import java.lang.ref.WeakReference;
     2.7 +import java.util.Collections;
     2.8 +import java.util.HashSet;
     2.9 +import java.util.Set;
    2.10  import net.java.html.js.JavaScriptBody;
    2.11  import net.java.html.js.JavaScriptResource;
    2.12  import net.java.html.json.Model;
    2.13 @@ -62,6 +65,7 @@
    2.14  @JavaScriptResource("knockout-3.2.0.debug.js")
    2.15  final class Knockout extends WeakReference<Object> {
    2.16      private static final ReferenceQueue<Object> QUEUE = new ReferenceQueue();
    2.17 +    private static final Set<Knockout> active = Collections.synchronizedSet(new HashSet<Knockout>());
    2.18      
    2.19      private PropertyBinding[] props;
    2.20      private FunctionBinding[] funcs;
    2.21 @@ -79,6 +83,7 @@
    2.22          for (int i = 0; i < funcs.length; i++) {
    2.23              this.funcs[i] = funcs[i].weak();
    2.24          }
    2.25 +        active.add(this);
    2.26      }
    2.27      
    2.28      static void cleanUp() {
    2.29 @@ -87,6 +92,7 @@
    2.30              if (ko == null) {
    2.31                  return;
    2.32              }
    2.33 +            active.remove(ko);
    2.34              clean(ko.js);
    2.35              ko.js = null;
    2.36              ko.props = null;