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 {
'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);
});
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());
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);
--- /dev/null
+/*
+@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);
+}
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);
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) };
* 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
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();) {
$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
--- /dev/null
+/*
+@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;
+ }
+
+}
+++ /dev/null
-/*
-@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();
- }
- }
-
-}
*/
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.
*/
private DirtyConnectorTracker dirtyConnectorTracker = new DirtyConnectorTracker(
this);
- private JavascriptManager javascriptManager;
+ private JavaScript javaScript;
private RootServerRpc rpc = new RootServerRpc() {
public void click(MouseEventDetails mouseDetails) {
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;
*
* @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);
}
/**
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;
}
}
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 {
@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));
+ (arguments.get(3) == JSONObject.NULL));
}
});
- executeJavaScript("window.testing(42, 'text', {p: true}, null)");
+ js.execute("window.testing(42, 'text', {p: true}, null)");
}
@Override