@@ -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 { | |||
@@ -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()); |
@@ -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); |
@@ -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); | |||
} |
@@ -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 |
@@ -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();) { |
@@ -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 |
@@ -10,10 +10,12 @@ 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 JavascriptManager extends AbstractExtension { | |||
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 | |||
@@ -22,7 +24,7 @@ public class JavascriptManager extends AbstractExtension { | |||
public void call(String name, JSONArray arguments); | |||
} | |||
public JavascriptManager() { | |||
public JavaScript() { | |||
registerRpc(new JavascriptCallbackRpc() { | |||
public void call(String name, JSONArray arguments) { | |||
JavascriptCallback callback = callbacks.get(name); | |||
@@ -41,8 +43,8 @@ public class JavascriptManager extends AbstractExtension { | |||
return (JavascriptManagerState) super.getState(); | |||
} | |||
public void addCallback(String name, JavascriptCallback javascriptCallback) { | |||
callbacks.put(name, javascriptCallback); | |||
public void addCallback(String name, JavascriptCallback callback) { | |||
callbacks.put(name, callback); | |||
if (getState().getNames().add(name)) { | |||
requestRepaint(); | |||
} | |||
@@ -55,4 +57,28 @@ public class JavascriptManager extends AbstractExtension { | |||
} | |||
} | |||
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; | |||
} | |||
} |
@@ -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; | |||
} | |||
} |
@@ -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 |