blob: 9e6f26bc5d5821912bffc6a8b998f51eb09c44d7 [file] [log] [blame]
/*
* Copyright 2013 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.user.client;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.core.shared.GWT;
import com.google.gwt.dom.client.Element;
import com.google.gwt.dom.client.NativeEvent;
import com.google.gwt.event.dom.client.DomEvent;
import com.google.gwt.event.shared.EventHandler;
import com.google.gwt.junit.client.GWTTestCase;
import com.google.gwt.user.client.impl.DOMImpl;
import com.google.gwt.user.client.impl.DOMImplStandard;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.RootPanel;
/**
* Tests standard DOM operations in the {@link DOM} class.
* <p>
* The test has its own module so that it will always be the first test executed in the page. By
* this way, we can make sure that the custom event registration always takes place before the event
* system gets initialized.
*/
public class CustomEventsTest extends GWTTestCase {
private static class CustomHandler implements EventHandler {
void on(DomEvent<?> customEvent) {
Element el = customEvent.getRelativeElement();
el.setTitle(el.getTitle() + "-dispatched");
}
}
private static class CustomEvent1 extends DomEvent<CustomHandler> {
static final Type<CustomHandler> TYPE = new Type<CustomHandler>("c1", new CustomEvent1());
@Override
public Type<CustomHandler> getAssociatedType() {
return TYPE;
}
@Override
protected void dispatch(CustomHandler handler) {
handler.on(this);
}
}
private static class CustomEvent2 extends DomEvent<CustomHandler> {
static final Type<CustomHandler> TYPE = new Type<CustomHandler>("c2", new CustomEvent2());
@Override
public Type<CustomHandler> getAssociatedType() {
return TYPE;
}
@Override
protected void dispatch(CustomHandler handler) {
handler.on(this);
}
}
private Button button;
@Override
public String getModuleName() {
return "com.google.gwt.user.CustomEventsTest";
}
@Override
protected void gwtSetUp() throws Exception {
ensureCustomEventDispatch();
button = new Button();
button.setTitle("event");
button.addBitlessDomHandler(new CustomHandler(), CustomEvent1.TYPE);
button.addBitlessDomHandler(new CustomHandler(), CustomEvent2.TYPE);
RootPanel.get().add(button);
}
@Override
protected void gwtTearDown() throws Exception {
RootPanel.get().remove(button);
}
public void testCustomEvent() {
if (!isStandard()) {
return; // Custom event support is for standard browsers (i.e. no IE 6/7/8)
}
dispatchEvent("c1");
assertEquals("event-dispatched", button.getTitle());
}
public void testCustomDispatchEvent() {
if (!isStandard()) {
return; // Custom event support is for standard browsers (i.e. no IE 6/7/8)
}
dispatchEvent("c2");
assertEquals("event-dispatched-custom_method", button.getTitle());
}
private void dispatchEvent(String evt) {
button.getElement().dispatchEvent(createCustomEvent(evt));
}
private static native NativeEvent createCustomEvent(String evt) /*-{
var e = $doc.createEvent("Event");
e.initEvent(evt, true, false);
return e;
}-*/;
private static native JavaScriptObject getBitlessCustomDisptachers() /*-{
return {
c2: function(evt) {
@com.google.gwt.user.client.impl.DOMImplStandard::dispatchEvent(*)(evt);
evt.target.title += "-custom_method";
}
};
}-*/;
private static boolean initCustomEventDispatch = true;
private static void ensureCustomEventDispatch() {
if (initCustomEventDispatch) {
DOMImplStandard.addBitlessEventDispatchers(getBitlessCustomDisptachers());
initCustomEventDispatch = false;
}
}
private static boolean isStandard() {
return GWT.create(DOMImpl.class) instanceof DOMImplStandard;
}
}