diff options
-rw-r--r-- | src/com/vaadin/terminal/gwt/client/extensions/javascriptmanager/JavaScriptManagerConnector.java | 31 | ||||
-rw-r--r-- | tests/testbench/com/vaadin/tests/extensions/JavascriptManagerTest.java | 7 |
2 files changed, 33 insertions, 5 deletions
diff --git a/src/com/vaadin/terminal/gwt/client/extensions/javascriptmanager/JavaScriptManagerConnector.java b/src/com/vaadin/terminal/gwt/client/extensions/javascriptmanager/JavaScriptManagerConnector.java index 72bd253ecb..d0bd4a1bf1 100644 --- a/src/com/vaadin/terminal/gwt/client/extensions/javascriptmanager/JavaScriptManagerConnector.java +++ b/src/com/vaadin/terminal/gwt/client/extensions/javascriptmanager/JavaScriptManagerConnector.java @@ -52,7 +52,18 @@ public class JavaScriptManagerConnector extends AbstractExtensionConnector { private native void addCallback(String name) /*-{ var m = this; - $wnd[name] = $entry(function() { + var target = $wnd; + var parts = name.split('.'); + + for(var i = 0; i < parts.length - 1; i++) { + var part = parts[i]; + if (target[part] === undefined) { + target[part] = {}; + } + target = target[part]; + } + + target[parts[parts.length - 1]] = $entry(function() { //Must make a copy because arguments is an array-like object (not instanceof Array), causing suboptimal JSON encoding var args = Array.prototype.slice.call(arguments, 0); m.@com.vaadin.terminal.gwt.client.extensions.javascriptmanager.JavaScriptManagerConnector::sendRpc(Ljava/lang/String;Lcom/google/gwt/core/client/JsArray;)(name, args); @@ -60,9 +71,25 @@ public class JavaScriptManagerConnector extends AbstractExtensionConnector { }-*/; // TODO only remove what we actually added + // TODO We might leave empty objects behind, but there's no good way of + // knowing whether they are unused private native void removeCallback(String name) /*-{ - delete $wnd[name]; + var target = $wnd; + var parts = name.split('.'); + + for(var i = 0; i < parts.length - 1; i++) { + var part = parts[i]; + if (target[part] === undefined) { + $wnd.console.log(part,'not defined in',target); + // No longer attached -> nothing more to do + return; + } + target = target[part]; + } + + $wnd.console.log('removing',parts[parts.length - 1],'from',target); + delete target[parts[parts.length - 1]]; }-*/; private static native void eval(String Script) diff --git a/tests/testbench/com/vaadin/tests/extensions/JavascriptManagerTest.java b/tests/testbench/com/vaadin/tests/extensions/JavascriptManagerTest.java index be4675eb2d..65f0735ab5 100644 --- a/tests/testbench/com/vaadin/tests/extensions/JavascriptManagerTest.java +++ b/tests/testbench/com/vaadin/tests/extensions/JavascriptManagerTest.java @@ -20,8 +20,8 @@ public class JavascriptManagerTest extends AbstractTestRoot { @Override protected void setup(WrappedRequest request) { addComponent(log); - JavaScript js = JavaScript.getCurrent(); - js.addCallback("testing", new JavaScriptCallback() { + final JavaScript js = JavaScript.getCurrent(); + js.addCallback("testing.doTest", new JavaScriptCallback() { public void call(JSONArray arguments) throws JSONException { log.log("Got " + arguments.length() + " arguments"); log.log("Argument 1 as a number: " + arguments.getInt(0)); @@ -30,9 +30,10 @@ public class JavascriptManagerTest extends AbstractTestRoot { + arguments.getJSONObject(2).getBoolean("p")); log.log("Argument 4 is JSONObject.NULL: " + (arguments.get(3) == JSONObject.NULL)); + js.removeCallback("testing.doTest"); } }); - js.execute("window.testing(42, 'text', {p: true}, null)"); + js.execute("window.testing.doTest(42, 'text', {p: true}, null)"); } @Override |