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;
   }