diff options
author | Leif Åstrand <leif@vaadin.com> | 2012-06-15 12:44:01 +0300 |
---|---|---|
committer | Leif Åstrand <leif@vaadin.com> | 2012-06-15 12:44:01 +0300 |
commit | 5422622f3536f060f21a000ff2193d6565f944c9 (patch) | |
tree | b5d0894a3837ca82dc3fd6355bdf616a2870636d /src/com/vaadin | |
parent | cbf51da8e72d4269c97fd5a17ed09a9d2b7eeb69 (diff) | |
download | vaadin-framework-5422622f3536f060f21a000ff2193d6565f944c9.tar.gz vaadin-framework-5422622f3536f060f21a000ff2193d6565f944c9.zip |
Add support for callbacks in other objects (e.g. "foo.bar") (#6730)
Diffstat (limited to 'src/com/vaadin')
-rw-r--r-- | src/com/vaadin/terminal/gwt/client/extensions/javascriptmanager/JavaScriptManagerConnector.java | 31 |
1 files changed, 29 insertions, 2 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) |