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