Prevent creation on identical ClientListenerBinding instances
diff --git a/bundles/org.eclipse.rap.clientscripting/src/org/eclipse/rap/clientscripting/internal/ClientFunction.java b/bundles/org.eclipse.rap.clientscripting/src/org/eclipse/rap/clientscripting/internal/ClientFunction.java
index 817b612..b61a123 100644
--- a/bundles/org.eclipse.rap.clientscripting/src/org/eclipse/rap/clientscripting/internal/ClientFunction.java
+++ b/bundles/org.eclipse.rap.clientscripting/src/org/eclipse/rap/clientscripting/internal/ClientFunction.java
@@ -45,9 +45,8 @@
}
protected ClientListenerBinding addTo( String targetId, int eventType ) {
- // TODO : binding created twice?
- ClientListenerBinding binding = new ClientListenerBinding( this, targetId, eventType );
- if( !bindings.contains( binding ) ) {
+ if( findBinding( targetId, eventType ) == null ) {
+ ClientListenerBinding binding = new ClientListenerBinding( this, targetId, eventType );
bindings.add( binding );
return binding;
} else {
diff --git a/tests/org.eclipse.rap.clientscripting.test/src/org/eclipse/rap/clientscripting/internal/ClientFunction_Test.java b/tests/org.eclipse.rap.clientscripting.test/src/org/eclipse/rap/clientscripting/internal/ClientFunction_Test.java
index c3af7e0..d1b2041 100644
--- a/tests/org.eclipse.rap.clientscripting.test/src/org/eclipse/rap/clientscripting/internal/ClientFunction_Test.java
+++ b/tests/org.eclipse.rap.clientscripting.test/src/org/eclipse/rap/clientscripting/internal/ClientFunction_Test.java
@@ -19,6 +19,7 @@
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import org.eclipse.rap.rwt.remote.Connection;
@@ -31,6 +32,8 @@
public class ClientFunction_Test {
private static final String TARGET_ID = "w101";
+ private static final String CLIENT_LISTENER_TYPE = "rwt.clientscripting.Listener";
+ private static final String LISTENER_BINDING_TYPE = "rwt.clientscripting.EventBinding";
private ClientFunction function;
@@ -57,7 +60,7 @@
@Test
public void testCreation_createsRemoteObject() {
- Connection connection = fakeConnection( mock( RemoteObject.class ) );
+ Connection connection = fakeConnection( mock( RemoteObject.class ), CLIENT_LISTENER_TYPE );
new ClientFunction( "script code" );
@@ -67,7 +70,7 @@
@Test
public void testCreation_initializesRemoteObject() {
RemoteObject remoteObject = mock( RemoteObject.class );
- fakeConnection( remoteObject );
+ fakeConnection( remoteObject, CLIENT_LISTENER_TYPE );
new ClientFunction( "script code" );
@@ -84,10 +87,13 @@
@Test
public void testAddTo_ignoresSubsequentCalls() {
+ Connection connection = fakeConnection( mock( RemoteObject.class ), LISTENER_BINDING_TYPE );
+
function.addTo( TARGET_ID, SWT.KeyDown );
function.addTo( TARGET_ID, SWT.KeyDown );
assertEquals( 1, function.getBindings().size() );
+ verify( connection, times( 1 ) ).createRemoteObject( eq( LISTENER_BINDING_TYPE ) );
}
@Test
diff --git a/tests/org.eclipse.rap.clientscripting.test/src/org/eclipse/rap/clientscripting/internal/ClientListenerBinding_Test.java b/tests/org.eclipse.rap.clientscripting.test/src/org/eclipse/rap/clientscripting/internal/ClientListenerBinding_Test.java
index 5ad71ff..f36d21a 100644
--- a/tests/org.eclipse.rap.clientscripting.test/src/org/eclipse/rap/clientscripting/internal/ClientListenerBinding_Test.java
+++ b/tests/org.eclipse.rap.clientscripting.test/src/org/eclipse/rap/clientscripting/internal/ClientListenerBinding_Test.java
@@ -30,6 +30,8 @@
private static final String TARGET_ID_1 = "w101";
private static final String TARGET_ID_2 = "w102";
+ private static final String LISTENER_BINDING_TYPE = "rwt.clientscripting.EventBinding";
+
private ClientListener listener1;
private ClientListener listener2;
private ClientListenerBinding binding;
@@ -77,7 +79,7 @@
@Test
public void testCreation_createsRemoteObject() {
- Connection connection = fakeConnection( mock( RemoteObject.class ) );
+ Connection connection = fakeConnection( mock( RemoteObject.class ), LISTENER_BINDING_TYPE );
binding = new ClientListenerBinding( listener1, TARGET_ID_1, ClientListener.KeyDown );
@@ -87,7 +89,7 @@
@Test
public void testCreation_initializesRemoteObject() {
RemoteObject remoteObject = mock( RemoteObject.class );
- fakeConnection( remoteObject );
+ fakeConnection( remoteObject, LISTENER_BINDING_TYPE );
binding = new ClientListenerBinding( listener1, TARGET_ID_1, ClientListener.KeyDown );
@@ -99,7 +101,7 @@
@Test
public void testDispose_destroysRemoteObject() {
RemoteObject remoteObject = mock( RemoteObject.class );
- fakeConnection( remoteObject );
+ fakeConnection( remoteObject, LISTENER_BINDING_TYPE );
binding = new ClientListenerBinding( listener1, TARGET_ID_1, ClientListener.KeyDown );
binding.dispose();
@@ -110,7 +112,7 @@
@Test
public void testDispose_mayBeCalledTwice() {
RemoteObject remoteObject = mock( RemoteObject.class );
- fakeConnection( remoteObject );
+ fakeConnection( remoteObject, LISTENER_BINDING_TYPE );
binding = new ClientListenerBinding( listener1, TARGET_ID_1, ClientListener.KeyDown );
binding.dispose();
diff --git a/tests/org.eclipse.rap.clientscripting.test/src/org/eclipse/rap/clientscripting/internal/TestUtil.java b/tests/org.eclipse.rap.clientscripting.test/src/org/eclipse/rap/clientscripting/internal/TestUtil.java
index 4060f09..12f210b 100644
--- a/tests/org.eclipse.rap.clientscripting.test/src/org/eclipse/rap/clientscripting/internal/TestUtil.java
+++ b/tests/org.eclipse.rap.clientscripting.test/src/org/eclipse/rap/clientscripting/internal/TestUtil.java
@@ -10,7 +10,7 @@
******************************************************************************/
package org.eclipse.rap.clientscripting.internal;
-import static org.mockito.Matchers.anyString;
+import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@@ -24,9 +24,9 @@
public class TestUtil {
- public static Connection fakeConnection( RemoteObject remoteObject ) {
+ public static Connection fakeConnection( RemoteObject remoteObject, String remoteType ) {
Connection connection = mock( Connection.class );
- when( connection.createRemoteObject( anyString() ) ).thenReturn( remoteObject );
+ when( connection.createRemoteObject( eq( remoteType ) ) ).thenReturn( remoteObject );
Fixture.fakeConnection( connection );
return connection;
}