1.1 --- a/json-tck/src/main/java/net/java/html/json/tests/GCTest.java Wed Nov 12 10:48:12 2014 +0100
1.2 +++ b/json-tck/src/main/java/net/java/html/json/tests/GCTest.java Wed Nov 12 10:56:18 2014 +0100
1.3 @@ -90,6 +90,10 @@
1.4 Reference<?> ref = new WeakReference<Object>(removed);
1.5 removed = null;
1.6 assertGC(ref, "Can removed object disappear?");
1.7 +
1.8 + ref = new WeakReference<Object>(m);
1.9 + m = null;
1.10 + assertNotGC(ref, "Root model cannot GC");
1.11 } finally {
1.12 Utils.exposeHTML(GCTest.class, "");
1.13 }
1.14 @@ -108,11 +112,27 @@
1.15 + "}\n"
1.16 + "return arr.length;";
1.17 Object cnt = Utils.executeScript(GCTest.class, gc, Math.pow(2.0, i));
1.18 - System.err.println("cnt: " + cnt);
1.19 System.gc();
1.20 System.runFinalization();
1.21 }
1.22 throw new OutOfMemoryError(msg);
1.23 }
1.24
1.25 + private void assertNotGC(Reference<?> ref, String msg) throws Exception {
1.26 + for (int i = 0; i < 10; i++) {
1.27 + if (ref.get() == null) {
1.28 + throw new IllegalStateException(msg);
1.29 + }
1.30 + String gc = "var max = arguments[0];\n"
1.31 + + "var arr = [];\n"
1.32 + + "for (var i = 0; i < max; i++) {\n"
1.33 + + " arr.push(i);\n"
1.34 + + "}\n"
1.35 + + "return arr.length;";
1.36 + Object cnt = Utils.executeScript(GCTest.class, gc, Math.pow(2.0, i));
1.37 + System.gc();
1.38 + System.runFinalization();
1.39 + }
1.40 + }
1.41 +
1.42 }
2.1 --- a/ko4j/src/main/java/org/netbeans/html/ko4j/FXContext.java Wed Nov 12 10:48:12 2014 +0100
2.2 +++ b/ko4j/src/main/java/org/netbeans/html/ko4j/FXContext.java Wed Nov 12 10:56:18 2014 +0100
2.3 @@ -135,7 +135,10 @@
2.4
2.5 @Override
2.6 public void applyBindings(Object data) {
2.7 - Knockout.applyBindings(data);
2.8 + Object ko = Knockout.applyBindings(data);
2.9 + if (ko instanceof Knockout) {
2.10 + ((Knockout)ko).hold();
2.11 + }
2.12 }
2.13
2.14 @Override
3.1 --- a/ko4j/src/main/java/org/netbeans/html/ko4j/Knockout.java Wed Nov 12 10:48:12 2014 +0100
3.2 +++ b/ko4j/src/main/java/org/netbeans/html/ko4j/Knockout.java Wed Nov 12 10:56:18 2014 +0100
3.3 @@ -62,6 +62,7 @@
3.4 final class Knockout extends WeakReference<Object> {
3.5 private final PropertyBinding[] props;
3.6 private final FunctionBinding[] funcs;
3.7 + private Object strong;
3.8
3.9 public Knockout(Object model, PropertyBinding[] props, FunctionBinding[] funcs) {
3.10 super(model);
3.11 @@ -75,6 +76,10 @@
3.12 }
3.13 }
3.14
3.15 + final void hold() {
3.16 + strong = get();
3.17 + }
3.18 +
3.19 final Object getValue(int index) {
3.20 return props[index].getValue();
3.21 }
3.22 @@ -108,11 +113,12 @@
3.23 Object model, String prop, Object oldValue, Object newValue
3.24 );
3.25
3.26 - @JavaScriptBody(args = { "bindings" }, wait4js = false, body =
3.27 + @JavaScriptBody(args = { "bindings" }, body =
3.28 "ko['cleanNode'](window['document']['body']);\n" +
3.29 - "ko['applyBindings'](bindings);\n"
3.30 + "ko['applyBindings'](bindings);\n" +
3.31 + "return bindings['ko4j'];\n"
3.32 )
3.33 - native static void applyBindings(Object bindings);
3.34 + native static Object applyBindings(Object bindings);
3.35
3.36 @JavaScriptBody(args = { "cnt" }, body =
3.37 "var arr = new Array(cnt);\n" +