aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJohannes Dahlström <johannesd@vaadin.com>2012-06-19 11:24:20 +0300
committerJohannes Dahlström <johannesd@vaadin.com>2012-06-19 11:24:20 +0300
commit0d06d0f434ac8c616fb08a16de5c8fa53cc03954 (patch)
tree3fa197445ed79a86642a022d54950d8e0eedbbaf /src
parent37a934c2f0c0a8edb7c580ff3a5b351778256368 (diff)
parent6750c529283be82e4f868ca6f389927e577189cf (diff)
downloadvaadin-framework-0d06d0f434ac8c616fb08a16de5c8fa53cc03954.tar.gz
vaadin-framework-0d06d0f434ac8c616fb08a16de5c8fa53cc03954.zip
Merge remote-tracking branch 'origin/master'
Diffstat (limited to 'src')
-rw-r--r--src/com/vaadin/annotations/LoadScripts.java8
-rw-r--r--src/com/vaadin/terminal/gwt/client/JavaScriptConnectorHelper.java54
-rw-r--r--src/com/vaadin/terminal/gwt/client/JavaScriptExtension.java6
-rw-r--r--src/com/vaadin/terminal/gwt/client/extensions/javascriptmanager/JavaScriptManagerConnector.java31
-rw-r--r--src/com/vaadin/terminal/gwt/client/ui/JavaScriptComponentConnector.java23
-rw-r--r--src/com/vaadin/ui/JavaScript.java17
6 files changed, 94 insertions, 45 deletions
diff --git a/src/com/vaadin/annotations/LoadScripts.java b/src/com/vaadin/annotations/LoadScripts.java
index f2b72407f7..84ac2d2fb7 100644
--- a/src/com/vaadin/annotations/LoadScripts.java
+++ b/src/com/vaadin/annotations/LoadScripts.java
@@ -8,8 +8,16 @@ import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
+/**
+ * Temporary hack used for ensuring external javascript libraries are included.
+ * To add a javascript, add this annotation to your Root class.
+ *
+ * @deprecated Will be removed in favor of a more robust solution before version
+ * 7.0.0
+ */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
+@Deprecated
public @interface LoadScripts {
public String[] value();
diff --git a/src/com/vaadin/terminal/gwt/client/JavaScriptConnectorHelper.java b/src/com/vaadin/terminal/gwt/client/JavaScriptConnectorHelper.java
index d2a2a5329e..bd62a759cb 100644
--- a/src/com/vaadin/terminal/gwt/client/JavaScriptConnectorHelper.java
+++ b/src/com/vaadin/terminal/gwt/client/JavaScriptConnectorHelper.java
@@ -14,6 +14,7 @@ import java.util.Set;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.core.client.JsArray;
import com.google.gwt.json.client.JSONArray;
+import com.google.gwt.user.client.Element;
import com.vaadin.terminal.gwt.client.communication.MethodInvocation;
import com.vaadin.terminal.gwt.client.communication.StateChangeEvent;
import com.vaadin.terminal.gwt.client.communication.StateChangeEvent.StateChangeHandler;
@@ -44,7 +45,9 @@ public class JavaScriptConnectorHelper {
// Wildcard rpc object
rpcObjects.put("", JavaScriptObject.createObject());
+ }
+ public void init() {
connector.addStateChangeHandler(new StateChangeHandler() {
public void onStateChanged(StateChangeEvent stateChangeEvent) {
JavaScriptObject wrapper = getConnectorWrapper();
@@ -81,7 +84,7 @@ public class JavaScriptConnectorHelper {
// Init after setting up callbacks & rpc
if (!inited) {
- init();
+ initJavaScript();
inited = true;
}
@@ -104,7 +107,7 @@ public class JavaScriptConnectorHelper {
return object;
}
- private boolean init() {
+ private boolean initJavaScript() {
ApplicationConfiguration conf = connector.getConnection()
.getConfiguration();
ArrayList<String> attemptedNames = new ArrayList<String>();
@@ -146,17 +149,13 @@ public class JavaScriptConnectorHelper {
private JavaScriptObject getConnectorWrapper() {
if (connectorWrapper == null) {
- connectorWrapper = createConnectorWrapper();
+ connectorWrapper = createConnectorWrapper(this, nativeState,
+ rpcMap, connector.getConnectorId(), rpcObjects);
}
return connectorWrapper;
}
- protected JavaScriptObject createConnectorWrapper() {
- return createConnectorWrapper(this, nativeState, rpcMap,
- connector.getConnectorId(), rpcObjects);
- }
-
private static native void fireNativeStateChange(
JavaScriptObject connectorWrapper)
/*-{
@@ -174,6 +173,9 @@ public class JavaScriptConnectorHelper {
'getConnectorId': function() {
return connectorId;
},
+ 'getParentId': $entry(function(connectorId) {
+ return h.@com.vaadin.terminal.gwt.client.JavaScriptConnectorHelper::getParentId(Ljava/lang/String;)(connectorId);
+ }),
'getState': function() {
return nativeState;
},
@@ -183,6 +185,9 @@ public class JavaScriptConnectorHelper {
}
return rpcObjects.@java.util.Map::get(Ljava/lang/Object;)(iface);
}),
+ 'getWidgetElement': $entry(function(connectorId) {
+ return h.@com.vaadin.terminal.gwt.client.JavaScriptConnectorHelper::getWidgetElement(Ljava/lang/String;)(connectorId);
+ }),
'registerRpc': function(iface, rpcHandler) {
//registerRpc(handler) -> registerRpc('', handler);
if (!rpcHandler) {
@@ -206,6 +211,37 @@ public class JavaScriptConnectorHelper {
});
}-*/;
+ private String getParentId(String connectorId) {
+ ServerConnector target = getConnector(connectorId);
+ if (target == null) {
+ return null;
+ }
+ ServerConnector parent = target.getParent();
+ if (parent == null) {
+ return null;
+ } else {
+ return parent.getConnectorId();
+ }
+ }
+
+ private Element getWidgetElement(String connectorId) {
+ ServerConnector target = getConnector(connectorId);
+ if (target instanceof ComponentConnector) {
+ return ((ComponentConnector) target).getWidget().getElement();
+ } else {
+ return null;
+ }
+ }
+
+ private ServerConnector getConnector(String connectorId) {
+ if (connectorId == null || connectorId.length() == 0) {
+ return connector;
+ }
+
+ return ConnectorMap.get(connector.getConnection())
+ .getConnector(connectorId);
+ }
+
private void fireRpc(String iface, String method,
JsArray<JavaScriptObject> arguments) {
if (iface == null) {
@@ -304,7 +340,7 @@ public class JavaScriptConnectorHelper {
private static native void invokeCallback(JavaScriptObject connector,
String name, JavaScriptObject arguments)
/*-{
- connector[name](arguments);
+ connector[name].apply(connector, arguments);
}-*/;
private static native void invokeJsRpc(JavaScriptObject rpcMap,
diff --git a/src/com/vaadin/terminal/gwt/client/JavaScriptExtension.java b/src/com/vaadin/terminal/gwt/client/JavaScriptExtension.java
index e3dafab9bd..61c50dbcb4 100644
--- a/src/com/vaadin/terminal/gwt/client/JavaScriptExtension.java
+++ b/src/com/vaadin/terminal/gwt/client/JavaScriptExtension.java
@@ -15,6 +15,12 @@ public class JavaScriptExtension extends AbstractExtensionConnector implements
private final JavaScriptConnectorHelper helper = new JavaScriptConnectorHelper(
this);
+ @Override
+ protected void init() {
+ super.init();
+ helper.init();
+ }
+
public JavaScriptConnectorHelper getJavascriptConnectorHelper() {
return helper;
}
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/src/com/vaadin/terminal/gwt/client/ui/JavaScriptComponentConnector.java b/src/com/vaadin/terminal/gwt/client/ui/JavaScriptComponentConnector.java
index 47afe95771..ab5280fee9 100644
--- a/src/com/vaadin/terminal/gwt/client/ui/JavaScriptComponentConnector.java
+++ b/src/com/vaadin/terminal/gwt/client/ui/JavaScriptComponentConnector.java
@@ -3,8 +3,6 @@
*/
package com.vaadin.terminal.gwt.client.ui;
-import com.google.gwt.core.client.JavaScriptObject;
-import com.google.gwt.user.client.Element;
import com.vaadin.terminal.gwt.client.JavaScriptConnectorHelper;
import com.vaadin.terminal.gwt.client.communication.HasJavaScriptConnectorHelper;
import com.vaadin.ui.AbstractJavaScriptComponent;
@@ -20,28 +18,19 @@ public class JavaScriptComponentConnector extends AbstractComponentConnector
java.util.ArrayList<String> attemptedNames) {
getWidget().showNoInitFound(attemptedNames);
}
-
- @Override
- protected JavaScriptObject createConnectorWrapper() {
- JavaScriptObject connectorWrapper = super.createConnectorWrapper();
- addGetWidgetElement(connectorWrapper, getWidget().getElement());
- return connectorWrapper;
- }
};
- private static native void addGetWidgetElement(
- JavaScriptObject connectorWrapper, Element element)
- /*-{
- connectorWrapper.getWidgetElement = function() {
- return element;
- };
- }-*/;
-
@Override
public JavaScriptWidget getWidget() {
return (JavaScriptWidget) super.getWidget();
}
+ @Override
+ protected void init() {
+ super.init();
+ helper.init();
+ }
+
public JavaScriptConnectorHelper getJavascriptConnectorHelper() {
return helper;
}
diff --git a/src/com/vaadin/ui/JavaScript.java b/src/com/vaadin/ui/JavaScript.java
index fb1dba2f20..234f37f8a6 100644
--- a/src/com/vaadin/ui/JavaScript.java
+++ b/src/com/vaadin/ui/JavaScript.java
@@ -10,7 +10,6 @@ import java.util.Map;
import com.vaadin.external.json.JSONArray;
import com.vaadin.external.json.JSONException;
import com.vaadin.terminal.AbstractExtension;
-import com.vaadin.terminal.Extension;
import com.vaadin.terminal.gwt.client.communication.ServerRpc;
import com.vaadin.terminal.gwt.client.extensions.javascriptmanager.ExecuteJavaScriptRpc;
import com.vaadin.terminal.gwt.client.extensions.javascriptmanager.JavaScriptManagerState;
@@ -65,20 +64,4 @@ public class JavaScript extends AbstractExtension {
return Root.getCurrentRoot().getJavaScript();
}
- private static JavaScript getJavascript(Root root) {
- // TODO Add caching to avoid iterating collection every time
- // Caching should use weak references to avoid memory leaks -> cache
- // should be transient to avoid serialization problems
- for (Extension extension : root.getExtensions()) {
- if (extension instanceof JavaScript) {
- return (JavaScript) extension;
- }
- }
-
- // Extend root if it isn't yet done
- JavaScript javascript = new JavaScript();
- javascript.extend(root);
- return javascript;
- }
-
}