| /* | |
| * Copyright 2010 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.event.dom.client.DoubleClickEvent; | |
| import com.google.gwt.event.dom.client.DoubleClickHandler; | |
| import com.google.gwt.event.dom.client.HasDoubleClickHandlers; | |
| import com.google.gwt.junit.client.GWTTestCase; | |
| import com.google.gwt.user.client.ui.Anchor; | |
| import com.google.gwt.user.client.ui.Button; | |
| import com.google.gwt.user.client.ui.CheckBox; | |
| import com.google.gwt.user.client.ui.FlexTable; | |
| import com.google.gwt.user.client.ui.FocusPanel; | |
| import com.google.gwt.user.client.ui.Grid; | |
| import com.google.gwt.user.client.ui.Image; | |
| import com.google.gwt.user.client.ui.Label; | |
| import com.google.gwt.user.client.ui.ListBox; | |
| import com.google.gwt.user.client.ui.PasswordTextBox; | |
| import com.google.gwt.user.client.ui.RichTextArea; | |
| import com.google.gwt.user.client.ui.RootPanel; | |
| import com.google.gwt.user.client.ui.SimpleRadioButton; | |
| import com.google.gwt.user.client.ui.TextArea; | |
| import com.google.gwt.user.client.ui.TextBox; | |
| import com.google.gwt.user.client.ui.ToggleButton; | |
| import com.google.gwt.user.client.ui.Widget; | |
| /** | |
| * Test Case for sinking of double click events. | |
| */ | |
| public class DoubleClickEventSinkTest extends GWTTestCase { | |
| @Override | |
| public String getModuleName() { | |
| return "com.google.gwt.user.User"; | |
| } | |
| public void testDoubleClickBitFieldNotTriviallyZero() { | |
| assertNotSame(0, Event.ONDBLCLICK); | |
| } | |
| public void testFocusPanelDoubleClickEventSinkByAddingHandler() { | |
| verifyEventSinkOnAddHandler(new FocusPanel(), false); | |
| } | |
| public void testFocusWidgetDoubleClickEventSinkByAddingHandler() { | |
| verifyEventSinkOnAddHandler(new Anchor(), false); | |
| verifyEventSinkOnAddHandler(new Button(), false); | |
| CheckBox checkBox = new CheckBox(); | |
| // Get the inputElem on which events are sunk | |
| Element e = (Element) checkBox.getElement().getFirstChildElement(); | |
| verifyEventSinkOnAddHandler(checkBox, e, false); | |
| verifyEventSinkOnAddHandler(new ToggleButton(), false); | |
| verifyEventSinkOnAddHandler(new ListBox(), false); | |
| verifyEventSinkOnAddHandler(new RichTextArea(), false); | |
| verifyEventSinkOnAddHandler(new TextArea(), false); | |
| verifyEventSinkOnAddHandler(new PasswordTextBox(), false); | |
| verifyEventSinkOnAddHandler(new TextBox(), false); | |
| verifyEventSinkOnAddHandler(new SimpleRadioButton("foo"), false); | |
| } | |
| public void testHTMLTableDoubleClickEventSinkByAddingHandler() { | |
| verifyEventSinkOnAddHandler(new Grid(), false); | |
| verifyEventSinkOnAddHandler(new FlexTable(), false); | |
| } | |
| public void testImageDoubleClickEventSinkByAddingHandler() { | |
| /* | |
| * The Image widget currently sinks events too early, before handlers are | |
| * attached. We verify that (broken) behavior in this test. | |
| * TODO(fredsa) Once Image has been fixed to lazily sink events, update | |
| * this test and remove verifyEventSinkOnAddHandler's second parameter. | |
| */ | |
| verifyEventSinkOnAddHandler(new Image(), true); | |
| } | |
| public void testLabelDoubleClickEventSinkByAddingHandler() { | |
| verifyEventSinkOnAddHandler(new Label(), false); | |
| } | |
| @Override | |
| protected void gwtTearDown() throws Exception { | |
| // clean up after ourselves | |
| RootPanel.get().clear(); | |
| super.gwtTearDown(); | |
| } | |
| private boolean isDoubleClickEventSunk(Element e) { | |
| return (DOM.getEventsSunk(e) & Event.ONDBLCLICK) != 0; | |
| } | |
| private <W extends Widget & HasDoubleClickHandlers> | |
| void verifyEventSinkOnAddHandler(W w, boolean allowEarlySink) { | |
| verifyEventSinkOnAddHandler(w, w.getElement(), allowEarlySink); | |
| } | |
| private <W extends Widget & HasDoubleClickHandlers> | |
| void verifyEventSinkOnAddHandler(W w, Element e, boolean widgetSinksEventsOnAttach) { | |
| RootPanel.get().add(w); | |
| if (widgetSinksEventsOnAttach) { | |
| assertTrue("Event should have been sunk on " + w.getClass().getName() | |
| + " once the widget has been attached", isDoubleClickEventSunk(e)); | |
| } else { | |
| assertFalse( | |
| "Event should not be sunk on " + w.getClass().getName() + " until a " | |
| + DoubleClickEvent.getType().getName() | |
| + " handler has been added", isDoubleClickEventSunk(e)); | |
| } | |
| w.addDoubleClickHandler(new DoubleClickHandler() { | |
| public void onDoubleClick(DoubleClickEvent event) { | |
| } | |
| }); | |
| assertTrue( | |
| "Event should have been sunk on " + w.getClass().getName() | |
| + " once the widget has been attached and a " | |
| + DoubleClickEvent.getType().getName() + " handler has been added", | |
| isDoubleClickEventSunk(e)); | |
| } | |
| } |