Skip to content

Commit

Permalink
Update JS renderer to work with latest grid branch (#15485)
Browse files Browse the repository at this point in the history
* Cope with createRenderer not being run deferred
* Update test to not assume there's a selection column

Change-Id: Ic6f053d2ef76d7227eb9ca00b960629e34ae380c
  • Loading branch information
Legioth committed Jan 14, 2015
1 parent 032bcef commit 61430e6
Show file tree
Hide file tree
Showing 3 changed files with 70 additions and 39 deletions.
97 changes: 63 additions & 34 deletions client/src/com/vaadin/client/JavaScriptConnectorHelper.java
Expand Up @@ -59,50 +59,79 @@ public JavaScriptConnectorHelper(ServerConnector connector) {
rpcObjects.put("", JavaScriptObject.createObject()); rpcObjects.put("", JavaScriptObject.createObject());
} }


/**
* The id of the previous response for which state changes have been
* processed. If this is the same as the
* {@link ApplicationConnection#getLastResponseId()}, it means that the
* state change has already been handled and should not be done again.
*/
private int processedResponseId = -1;

public void init() { public void init() {
connector.addStateChangeHandler(new StateChangeHandler() { connector.addStateChangeHandler(new StateChangeHandler() {
@Override @Override
public void onStateChanged(StateChangeEvent stateChangeEvent) { public void onStateChanged(StateChangeEvent stateChangeEvent) {
JavaScriptObject wrapper = getConnectorWrapper(); processStateChanges();
JavaScriptConnectorState state = getConnectorState(); }
});
}


for (String callback : state.getCallbackNames()) { /**
ensureCallback(JavaScriptConnectorHelper.this, wrapper, * Makes sure the javascript part of the connector has been initialized. The
callback); * javascript is usually initalized the first time a state change event is
} * received, but it might in some cases be necessary to make this happen
* earlier.
*
* @since 7.4.0
*/
public void ensureJavascriptInited() {
if (initFunctionName == null) {
processStateChanges();
}
}

private void processStateChanges() {
int lastResponseId = connector.getConnection().getLastResponseId();
if (processedResponseId == lastResponseId) {
return;
}
processedResponseId = lastResponseId;


for (Entry<String, Set<String>> entry : state JavaScriptObject wrapper = getConnectorWrapper();
.getRpcInterfaces().entrySet()) { JavaScriptConnectorState state = getConnectorState();
String rpcName = entry.getKey();
String jsName = getJsInterfaceName(rpcName); for (String callback : state.getCallbackNames()) {
if (!rpcObjects.containsKey(jsName)) { ensureCallback(JavaScriptConnectorHelper.this, wrapper, callback);
Set<String> methods = entry.getValue(); }
rpcObjects.put(jsName,
createRpcObject(rpcName, methods)); for (Entry<String, Set<String>> entry : state.getRpcInterfaces()

.entrySet()) {
// Init all methods for wildcard rpc String rpcName = entry.getKey();
for (String method : methods) { String jsName = getJsInterfaceName(rpcName);
JavaScriptObject wildcardRpcObject = rpcObjects if (!rpcObjects.containsKey(jsName)) {
.get(""); Set<String> methods = entry.getValue();
Set<String> interfaces = rpcMethods.get(method); rpcObjects.put(jsName, createRpcObject(rpcName, methods));
if (interfaces == null) {
interfaces = new HashSet<String>(); // Init all methods for wildcard rpc
rpcMethods.put(method, interfaces); for (String method : methods) {
attachRpcMethod(wildcardRpcObject, null, method); JavaScriptObject wildcardRpcObject = rpcObjects.get("");
} Set<String> interfaces = rpcMethods.get(method);
interfaces.add(rpcName); if (interfaces == null) {
} interfaces = new HashSet<String>();
rpcMethods.put(method, interfaces);
attachRpcMethod(wildcardRpcObject, null, method);
} }
interfaces.add(rpcName);
} }
}
}


// Init after setting up callbacks & rpc // Init after setting up callbacks & rpc
if (initFunctionName == null) { if (initFunctionName == null) {
initJavaScript(); initJavaScript();
} }


invokeIfPresent(wrapper, "onStateChange"); invokeIfPresent(wrapper, "onStateChange");
}
});
} }


private static String getJsInterfaceName(String rpcName) { private static String getJsInterfaceName(String rpcName) {
Expand Down
Expand Up @@ -132,6 +132,8 @@ private static native boolean hasFunction(JavaScriptObject wrapper,


@Override @Override
protected Renderer<JsonValue> createRenderer() { protected Renderer<JsonValue> createRenderer() {
helper.ensureJavascriptInited();

if (!hasFunction("render")) { if (!hasFunction("render")) {
throw new RuntimeException("JavaScriptRenderer " throw new RuntimeException("JavaScriptRenderer "
+ helper.getInitFunctionName() + helper.getInitFunctionName()
Expand Down
Expand Up @@ -30,17 +30,17 @@ public void testJavaScriptRenderer() {
openTestURL(); openTestURL();


GridElement grid = $(GridElement.class).first(); GridElement grid = $(GridElement.class).first();
GridCellElement cell_1_2 = grid.getCell(1, 2); GridCellElement cell_1_1 = grid.getCell(1, 1);


// Verify render functionality // Verify render functionality
Assert.assertEquals("Bean(2, 0)", cell_1_2.getText()); Assert.assertEquals("Bean(2, 0)", cell_1_1.getText());


// Verify init functionality // Verify init functionality
Assert.assertEquals("2", cell_1_2.getAttribute("column")); Assert.assertEquals("1", cell_1_1.getAttribute("column"));


// Verify onbrowserevent // Verify onbrowserevent
cell_1_2.click(); cell_1_1.click();
Assert.assertTrue(cell_1_2.getText().startsWith( Assert.assertTrue(cell_1_1.getText().startsWith(
"Clicked 1 with key 1 at")); "Clicked 1 with key 1 at"));
} }
} }

0 comments on commit 61430e6

Please sign in to comment.