blob: 48bc156fdee9a4138caccdb554bbec748f732b78 [file] [log] [blame]
/*
* Copyright 2008 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.google.gwt.event.shared;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.MouseDownEvent;
import com.google.gwt.event.dom.client.MouseDownHandler;
/**
* Handler manager test.
*/
public class HandlerManagerTest extends HandlerTestBase {
public void testAddHandlers() {
HandlerManager manager = new HandlerManager("bogus source");
addHandlers(manager);
}
private void addHandlers(HandlerManager manager) {
manager.addHandler(MouseDownEvent.getType(), mouse1);
manager.addHandler(MouseDownEvent.getType(), mouse2);
manager.addHandler(MouseDownEvent.getType(), adaptor1);
manager.fireEvent(new MouseDownEvent() {
});
assertEquals(3, manager.getHandlerCount(MouseDownEvent.getType()));
assertFired(mouse1, mouse2, adaptor1);
manager.addHandler(MouseDownEvent.getType(), mouse3);
assertEquals(4, manager.getHandlerCount(MouseDownEvent.getType()));
manager.addHandler(MouseDownEvent.getType(), mouse1);
manager.addHandler(MouseDownEvent.getType(), mouse2);
manager.addHandler(MouseDownEvent.getType(), adaptor1);
// You can indeed add handlers twice, they will only be removed one at a
// time though.
assertEquals(7, manager.getHandlerCount(MouseDownEvent.getType()));
manager.addHandler(ClickEvent.getType(), adaptor1);
manager.addHandler(ClickEvent.getType(), click1);
manager.addHandler(ClickEvent.getType(), click2);
assertEquals(7, manager.getHandlerCount(MouseDownEvent.getType()));
assertEquals(3, manager.getHandlerCount(ClickEvent.getType()));
reset();
manager.fireEvent(new MouseDownEvent() {
});
assertFired(mouse1, mouse2, mouse3, adaptor1);
assertNotFired(click1, click2);
}
@SuppressWarnings("deprecation")
public void testRemoveHandlers() {
HandlerManager manager = new HandlerManager("bogus source");
addHandlers(manager);
// Gets rid of first instance.
manager.removeHandler(MouseDownEvent.getType(), adaptor1);
manager.fireEvent(new MouseDownEvent() {
});
assertFired(mouse1, mouse2, mouse3, adaptor1);
assertNotFired(click1, click2);
// Gets rid of second instance.
manager.removeHandler(MouseDownEvent.getType(), adaptor1);
reset();
manager.fireEvent(new MouseDownEvent() {
});
assertFired(mouse1, mouse2, mouse3);
assertNotFired(adaptor1, click1, click2);
// Checks to see if click events are still working.
reset();
manager.fireEvent(new ClickEvent() {
});
assertNotFired(mouse1, mouse2, mouse3);
assertFired(click1, click2, adaptor1);
}
public void testConcurrentAdd() {
final HandlerManager manager = new HandlerManager("bogus source");
final MouseDownHandler two = new MouseDownHandler() {
public void onMouseDown(MouseDownEvent event) {
add(this);
}
};
MouseDownHandler one = new MouseDownHandler() {
public void onMouseDown(MouseDownEvent event) {
manager.addHandler(MouseDownEvent.getType(), two);
add(this);
}
};
manager.addHandler(MouseDownEvent.getType(), one);
manager.addHandler(MouseDownEvent.getType(), mouse1);
manager.addHandler(MouseDownEvent.getType(), mouse2);
manager.addHandler(MouseDownEvent.getType(), mouse3);
manager.fireEvent(new MouseDownEvent() {
});
assertFired(one, mouse1, mouse2, mouse3);
assertNotFired(two);
reset();
manager.fireEvent(new MouseDownEvent() {
});
assertFired(one, two, mouse1, mouse2, mouse3);
}
class ShyHandler implements MouseDownHandler {
HandlerRegistration r;
public void onMouseDown(MouseDownEvent event) {
add(this);
r.removeHandler();
}
}
public void testConcurrentRemove() {
final HandlerManager manager = new HandlerManager("bogus source");
ShyHandler h = new ShyHandler();
manager.addHandler(MouseDownEvent.getType(), mouse1);
h.r = manager.addHandler(MouseDownEvent.getType(), h);
manager.addHandler(MouseDownEvent.getType(), mouse2);
manager.addHandler(MouseDownEvent.getType(), mouse3);
manager.fireEvent(new MouseDownEvent() {
});
assertFired(h, mouse1, mouse2, mouse3);
reset();
manager.fireEvent(new MouseDownEvent() {
});
assertFired(mouse1, mouse2, mouse3);
assertNotFired(h);
}
public void testConcurrentAddAndRemoveByNastyUsersTryingToHurtUs() {
final HandlerManager manager = new HandlerManager("bogus source");
final MouseDownHandler two = new MouseDownHandler() {
public void onMouseDown(MouseDownEvent event) {
add(this);
}
@Override
public String toString() {
return "two";
}
};
MouseDownHandler one = new MouseDownHandler() {
public void onMouseDown(MouseDownEvent event) {
manager.addHandler(MouseDownEvent.getType(), two).removeHandler();
add(this);
}
@Override
public String toString() {
return "one";
}
};
manager.addHandler(MouseDownEvent.getType(), one);
manager.addHandler(MouseDownEvent.getType(), mouse1);
manager.addHandler(MouseDownEvent.getType(), mouse2);
manager.addHandler(MouseDownEvent.getType(), mouse3);
manager.fireEvent(new MouseDownEvent() {
});
assertFired(one, mouse1, mouse2, mouse3);
assertNotFired(two);
reset();
manager.fireEvent(new MouseDownEvent() {
});
assertFired(one, mouse1, mouse2, mouse3);
assertNotFired(two);
}
@SuppressWarnings("deprecation")
public void testConcurrentAddAfterRemoveIsNotClobbered() {
final HandlerManager manager = new HandlerManager("bogus source");
MouseDownHandler one = new MouseDownHandler() {
public void onMouseDown(MouseDownEvent event) {
manager.removeHandler(MouseDownEvent.getType(), mouse1);
manager.addHandler(MouseDownEvent.getType(), mouse1);
add(this);
}
};
manager.addHandler(MouseDownEvent.getType(), one);
if (!GWT.isScript()) {
try {
manager.fireEvent(new MouseDownEvent() {
});
fail("Should have thrown on remove");
} catch (AssertionError e) { /* pass */
}
return;
}
// Web mode, no asserts, so remove will quietly succeed.
manager.fireEvent(new MouseDownEvent() {
});
assertFired(one);
reset();
manager.fireEvent(new MouseDownEvent() {
});
assertFired(one, mouse1);
}
public void testMultiFiring() {
HandlerManager manager = new HandlerManager("source1");
final HandlerManager manager2 = new HandlerManager("source2");
manager.addHandler(MouseDownEvent.getType(), mouse1);
manager.addHandler(MouseDownEvent.getType(), new MouseDownHandler() {
public void onMouseDown(MouseDownEvent event) {
manager2.fireEvent(event);
}
});
manager.addHandler(MouseDownEvent.getType(), mouse3);
manager2.addHandler(MouseDownEvent.getType(), adaptor1);
manager2.addHandler(MouseDownEvent.getType(), new MouseDownHandler() {
public void onMouseDown(MouseDownEvent event) {
assertEquals("source2", event.getSource());
}
});
manager.addHandler(MouseDownEvent.getType(), new MouseDownHandler() {
public void onMouseDown(MouseDownEvent event) {
assertEquals("source1", event.getSource());
}
});
reset();
manager.fireEvent(new MouseDownEvent() {
});
assertFired(mouse1, adaptor1, mouse3);
}
public void testReverseOrder() {
// Add some handlers to a manager
final HandlerManager manager = new HandlerManager("source1", true);
final MouseDownHandler handler0 = new MouseDownHandler() {
public void onMouseDown(MouseDownEvent event) {
add(this);
}
};
final MouseDownHandler handler1 = new MouseDownHandler() {
public void onMouseDown(MouseDownEvent event) {
assertNotFired(handler0);
add(this);
}
};
final MouseDownHandler handler2 = new MouseDownHandler() {
public void onMouseDown(MouseDownEvent event) {
assertNotFired(handler0, handler1);
add(this);
}
};
manager.addHandler(MouseDownEvent.getType(), handler0);
manager.addHandler(MouseDownEvent.getType(), handler1);
manager.addHandler(MouseDownEvent.getType(), handler2);
// Fire the event
reset();
manager.fireEvent(new MouseDownEvent() {
});
assertFired(handler0, handler1, handler2);
}
}