]> source.dussan.org Git - vaadin-framework.git/commitdiff
JavascriptManager -> JavaScript and changes based on review (#6730)
authorLeif Åstrand <leif@vaadin.com>
Thu, 14 Jun 2012 14:29:49 +0000 (17:29 +0300)
committerLeif Åstrand <leif@vaadin.com>
Thu, 14 Jun 2012 14:29:49 +0000 (17:29 +0300)
src/com/vaadin/terminal/JavascriptRpcHelper.java
src/com/vaadin/terminal/gwt/client/JavascriptConnectorHelper.java
src/com/vaadin/terminal/gwt/client/JavascriptExtension.java
src/com/vaadin/terminal/gwt/client/extensions/javascriptmanager/ExecuteJavaScriptRpc.java [new file with mode: 0644]
src/com/vaadin/terminal/gwt/client/extensions/javascriptmanager/JavascriptManagerConnector.java
src/com/vaadin/terminal/gwt/client/ui/root/RootConnector.java
src/com/vaadin/terminal/gwt/client/ui/root/VRoot.java
src/com/vaadin/ui/JavaScript.java [new file with mode: 0644]
src/com/vaadin/ui/JavascriptManager.java [deleted file]
src/com/vaadin/ui/Root.java
tests/testbench/com/vaadin/tests/extensions/JavascriptManagerTest.java

index b5664628334f6d543be7683c803ff29113679d25..937f7e3a54ebe3142ab1c4c7e30d269e236aa2b6 100644 (file)
@@ -12,8 +12,8 @@ import java.util.Map;
 import com.vaadin.external.json.JSONArray;
 import com.vaadin.external.json.JSONException;
 import com.vaadin.tools.ReflectTools;
+import com.vaadin.ui.JavaScript.JavascriptCallbackRpc;
 import com.vaadin.ui.JavascriptCallback;
-import com.vaadin.ui.JavascriptManager.JavascriptCallbackRpc;
 
 public class JavascriptRpcHelper {
 
index ab0e62222c07e2bef38d6c7350b7755438babaa2..36f7c47959a2213c8b847ef95a39c4986eda6e4c 100644 (file)
@@ -109,7 +109,7 @@ public class JavascriptConnectorHelper {
             'getCallback': function(name) {
                 return $entry(function() {
                     var args = [name, Array.prototype.slice.call(arguments, 0)];
-                    var iface = "com.vaadin.ui.JavascriptManager$JavascriptCallbackRpc";
+                    var iface = "com.vaadin.ui.JavaScript$JavascriptCallbackRpc";
                     var method = "call";
                     h.@com.vaadin.terminal.gwt.client.JavascriptConnectorHelper::fireRpc(Ljava/lang/String;Ljava/lang/String;Lcom/google/gwt/core/client/JsArray;)(iface, method, args);
                 });
@@ -173,8 +173,8 @@ public class JavascriptConnectorHelper {
 
     public void invokeJsRpc(MethodInvocation invocation,
             JSONArray parametersJson) {
-        if ("com.vaadin.ui.JavascriptManager$JavascriptCallbackRpc"
-                .equals(invocation.getInterfaceName())
+        if ("com.vaadin.ui.JavaScript$JavascriptCallbackRpc".equals(invocation
+                .getInterfaceName())
                 && "call".equals(invocation.getMethodName())) {
             invokeJsRpc(rpcMap, parametersJson.get(0).isString().stringValue(),
                     null, parametersJson.get(1).isArray().getJavaScriptObject());
index 6c098a52f6b97094a9e16af2bed18062801a5b1c..74c3d7da45f75a51406878c952b599cbbaebdc91 100644 (file)
@@ -7,11 +7,11 @@ package com.vaadin.terminal.gwt.client;
 import com.vaadin.terminal.AbstractJavascriptExtension;
 import com.vaadin.terminal.gwt.client.communication.HasJavascriptConnectorHelper;
 import com.vaadin.terminal.gwt.client.communication.StateChangeEvent;
-import com.vaadin.terminal.gwt.client.ui.AbstractConnector;
+import com.vaadin.terminal.gwt.client.extensions.AbstractExtensionConnector;
 import com.vaadin.terminal.gwt.client.ui.Connect;
 
 @Connect(AbstractJavascriptExtension.class)
-public class JavascriptExtension extends AbstractConnector implements
+public class JavascriptExtension extends AbstractExtensionConnector implements
         HasJavascriptConnectorHelper {
     private final JavascriptConnectorHelper helper = new JavascriptConnectorHelper(
             this);
diff --git a/src/com/vaadin/terminal/gwt/client/extensions/javascriptmanager/ExecuteJavaScriptRpc.java b/src/com/vaadin/terminal/gwt/client/extensions/javascriptmanager/ExecuteJavaScriptRpc.java
new file mode 100644 (file)
index 0000000..f118558
--- /dev/null
@@ -0,0 +1,11 @@
+/* 
+@VaadinApache2LicenseForJavaFiles@
+ */
+
+package com.vaadin.terminal.gwt.client.extensions.javascriptmanager;
+
+import com.vaadin.terminal.gwt.client.communication.ClientRpc;
+
+public interface ExecuteJavaScriptRpc extends ClientRpc {
+    public void executeJavaScript(String script);
+}
index a74cd762dee5260d703196141aaf8a1c6bcf7155..10c4847bac819833c84b25c65c74378cf280605d 100644 (file)
@@ -14,12 +14,21 @@ import com.vaadin.terminal.gwt.client.communication.MethodInvocation;
 import com.vaadin.terminal.gwt.client.communication.StateChangeEvent;
 import com.vaadin.terminal.gwt.client.extensions.AbstractExtensionConnector;
 import com.vaadin.terminal.gwt.client.ui.Connect;
-import com.vaadin.ui.JavascriptManager;
+import com.vaadin.ui.JavaScript;
 
-@Connect(JavascriptManager.class)
+@Connect(JavaScript.class)
 public class JavascriptManagerConnector extends AbstractExtensionConnector {
     private Set<String> currentNames = new HashSet<String>();
 
+    @Override
+    protected void init() {
+        registerRpc(ExecuteJavaScriptRpc.class, new ExecuteJavaScriptRpc() {
+            public void executeJavaScript(String script) {
+                eval(script);
+            }
+        });
+    }
+
     @Override
     public void onStateChanged(StateChangeEvent stateChangeEvent) {
         super.onStateChanged(stateChangeEvent);
@@ -56,6 +65,13 @@ public class JavascriptManagerConnector extends AbstractExtensionConnector {
         delete $wnd[name];
     }-*/;
 
+    private static native void eval(String script)
+    /*-{
+      if(script) {
+         $wnd.eval(script);
+      }
+    }-*/;
+
     public void sendRpc(String name, JsArray<JavaScriptObject> arguments) {
         Object[] parameters = new Object[] { name, new JSONArray(arguments) };
 
@@ -63,12 +79,10 @@ public class JavascriptManagerConnector extends AbstractExtensionConnector {
          * Must invoke manually as the RPC interface can't be used in GWT
          * because of the JSONArray parameter
          */
-        getConnection()
-                .addMethodInvocationToQueue(
-                        new MethodInvocation(
-                                getConnectorId(),
-                                "com.vaadin.ui.JavascriptManager$JavascriptCallbackRpc",
-                                "call", parameters), true);
+        getConnection().addMethodInvocationToQueue(
+                new MethodInvocation(getConnectorId(),
+                        "com.vaadin.ui.JavaScript$JavascriptCallbackRpc",
+                        "call", parameters), true);
     }
 
     @Override
index 9be41a962348d60ce0c9297a4b848c5623295636..eebbe971a4012c8fadc4a81f23ae2bf4c3023889 100644 (file)
@@ -168,9 +168,6 @@ public class RootConnector extends AbstractComponentContainerConnector
                             getWidget().id, client);
                 }
                 getWidget().actionHandler.updateActionMap(childUidl);
-            } else if (tag == "execJS") {
-                String script = childUidl.getStringAttribute("script");
-                VRoot.eval(script);
             } else if (tag == "notifications") {
                 for (final Iterator<?> it = childUidl.getChildIterator(); it
                         .hasNext();) {
index 12a69d5556e5def175505be9dbf18876d438a64d..85e6f7f91a542f5be85483550888226bfba6ccb3 100644 (file)
@@ -187,21 +187,6 @@ public class VRoot extends SimplePanel implements ResizeHandler,
          $wnd.location.reload();
      }-*/;
 
-    /**
-     * Evaluate the given script in the browser document.
-     * 
-     * @param script
-     *            Script to be executed.
-     */
-    static native void eval(String script)
-    /*-{
-      try {
-         if (script == null) return;
-         $wnd.eval(script);
-      } catch (e) {
-      }
-    }-*/;
-
     /**
      * Returns true if the body is NOT generated, i.e if someone else has made
      * the page that we're running in. Otherwise we're in charge of the whole
diff --git a/src/com/vaadin/ui/JavaScript.java b/src/com/vaadin/ui/JavaScript.java
new file mode 100644 (file)
index 0000000..dcd8540
--- /dev/null
@@ -0,0 +1,84 @@
+/* 
+@VaadinApache2LicenseForJavaFiles@
+ */
+
+package com.vaadin.ui;
+
+import java.util.HashMap;
+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;
+
+public class JavaScript extends AbstractExtension {
+    private Map<String, JavascriptCallback> callbacks = new HashMap<String, JavascriptCallback>();
+
+    // Can not be defined in client package as this JSONArray is not available
+    // in GWT
+    public interface JavascriptCallbackRpc extends ServerRpc {
+        public void call(String name, JSONArray arguments);
+    }
+
+    public JavaScript() {
+        registerRpc(new JavascriptCallbackRpc() {
+            public void call(String name, JSONArray arguments) {
+                JavascriptCallback callback = callbacks.get(name);
+                // TODO handle situation if name is not registered
+                try {
+                    callback.call(arguments);
+                } catch (JSONException e) {
+                    throw new IllegalArgumentException(e);
+                }
+            }
+        });
+    }
+
+    @Override
+    public JavascriptManagerState getState() {
+        return (JavascriptManagerState) super.getState();
+    }
+
+    public void addCallback(String name, JavascriptCallback callback) {
+        callbacks.put(name, callback);
+        if (getState().getNames().add(name)) {
+            requestRepaint();
+        }
+    }
+
+    public void removeCallback(String name) {
+        callbacks.remove(name);
+        if (getState().getNames().remove(name)) {
+            requestRepaint();
+        }
+    }
+
+    public void execute(String script) {
+        getRpcProxy(ExecuteJavaScriptRpc.class).executeJavaScript(script);
+    }
+
+    public static JavaScript getCurrent() {
+        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;
+    }
+
+}
diff --git a/src/com/vaadin/ui/JavascriptManager.java b/src/com/vaadin/ui/JavascriptManager.java
deleted file mode 100644 (file)
index 72295dc..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-/* 
-@VaadinApache2LicenseForJavaFiles@
- */
-
-package com.vaadin.ui;
-
-import java.util.HashMap;
-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.gwt.client.communication.ServerRpc;
-import com.vaadin.terminal.gwt.client.extensions.javascriptmanager.JavascriptManagerState;
-
-public class JavascriptManager extends AbstractExtension {
-    private Map<String, JavascriptCallback> callbacks = new HashMap<String, JavascriptCallback>();
-
-    // Can not be defined in client package as this JSONArray is not available
-    // in GWT
-    public interface JavascriptCallbackRpc extends ServerRpc {
-        public void call(String name, JSONArray arguments);
-    }
-
-    public JavascriptManager() {
-        registerRpc(new JavascriptCallbackRpc() {
-            public void call(String name, JSONArray arguments) {
-                JavascriptCallback callback = callbacks.get(name);
-                // TODO handle situation if name is not registered
-                try {
-                    callback.call(arguments);
-                } catch (JSONException e) {
-                    throw new IllegalArgumentException(e);
-                }
-            }
-        });
-    }
-
-    @Override
-    public JavascriptManagerState getState() {
-        return (JavascriptManagerState) super.getState();
-    }
-
-    public void addCallback(String name, JavascriptCallback javascriptCallback) {
-        callbacks.put(name, javascriptCallback);
-        if (getState().getNames().add(name)) {
-            requestRepaint();
-        }
-    }
-
-    public void removeCallback(String name) {
-        callbacks.remove(name);
-        if (getState().getNames().remove(name)) {
-            requestRepaint();
-        }
-    }
-
-}
index 9814084cbcf7b167f750d100c0b7e427aee33541..60408fe1dcb8b80bf319dc1ffe63c00c7c411070 100644 (file)
@@ -356,12 +356,6 @@ public abstract class Root extends AbstractComponentContainer implements
      */
     private List<Notification> notifications;
 
-    /**
-     * A list of javascript commands that are waiting to be sent to the client.
-     * Cleared (set to null) when the commands have been sent.
-     */
-    private List<String> jsExecQueue = null;
-
     /**
      * List of windows in this root.
      */
@@ -408,7 +402,7 @@ public abstract class Root extends AbstractComponentContainer implements
     private DirtyConnectorTracker dirtyConnectorTracker = new DirtyConnectorTracker(
             this);
 
-    private JavascriptManager javascriptManager;
+    private JavaScript javaScript;
 
     private RootServerRpc rpc = new RootServerRpc() {
         public void click(MouseEventDetails mouseDetails) {
@@ -557,16 +551,6 @@ public abstract class Root extends AbstractComponentContainer implements
             notifications = null;
         }
 
-        // Add executable javascripts if needed
-        if (jsExecQueue != null) {
-            for (String script : jsExecQueue) {
-                target.startTag("execJS");
-                target.addAttribute("script", script);
-                target.endTag("execJS");
-            }
-            jsExecQueue = null;
-        }
-
         if (scrollIntoView != null) {
             target.addAttribute("scrollTo", scrollIntoView);
             scrollIntoView = null;
@@ -1000,15 +984,12 @@ public abstract class Root extends AbstractComponentContainer implements
      * 
      * @param script
      *            JavaScript snippet that will be executed.
+     * 
+     * @deprecated as of 7.0, use getJavaScript().execute(String) instead
      */
+    @Deprecated
     public void executeJavaScript(String script) {
-        if (jsExecQueue == null) {
-            jsExecQueue = new ArrayList<String>();
-        }
-
-        jsExecQueue.add(script);
-
-        requestRepaint();
+        getJavaScript().execute(script);
     }
 
     /**
@@ -1592,14 +1573,14 @@ public abstract class Root extends AbstractComponentContainer implements
         return dirtyConnectorTracker;
     }
 
-    public JavascriptManager getJavascriptManager() {
-        if (javascriptManager == null) {
+    public JavaScript getJavaScript() {
+        if (javaScript == null) {
             // Create and attach on first use
-            javascriptManager = new JavascriptManager();
-            addExtension(javascriptManager);
+            javaScript = new JavaScript();
+            addExtension(javaScript);
         }
 
-        return javascriptManager;
+        return javaScript;
     }
 
 }
index c84d37cd0fbe55fcaab94763e5a5a7da541710a7..0270f7ed8fe559525148c66f533415b0730f37c6 100644 (file)
@@ -10,6 +10,7 @@ import com.vaadin.external.json.JSONObject;
 import com.vaadin.terminal.WrappedRequest;
 import com.vaadin.tests.components.AbstractTestRoot;
 import com.vaadin.tests.util.Log;
+import com.vaadin.ui.JavaScript;
 import com.vaadin.ui.JavascriptCallback;
 
 public class JavascriptManagerTest extends AbstractTestRoot {
@@ -19,7 +20,8 @@ public class JavascriptManagerTest extends AbstractTestRoot {
     @Override
     protected void setup(WrappedRequest request) {
         addComponent(log);
-        getJavascriptManager().addCallback("testing", new JavascriptCallback() {
+        JavaScript js = JavaScript.getCurrent();
+        js.addCallback("testing", 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,7 +32,7 @@ public class JavascriptManagerTest extends AbstractTestRoot {
                         + (arguments.get(3) == JSONObject.NULL));
             }
         });
-        executeJavaScript("window.testing(42, 'text', {p: true}, null)");
+        js.execute("window.testing(42, 'text', {p: true}, null)");
     }
 
     @Override