blob: 41f60fd054a1157338e0b962f278aa796733a5a9 [file] [log] [blame]
/*
* Copyright 2009 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.museum.client.defaultmuseum;
import com.google.gwt.dom.client.NativeEvent;
import com.google.gwt.event.dom.client.BlurEvent;
import com.google.gwt.event.dom.client.BlurHandler;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.ContextMenuEvent;
import com.google.gwt.event.dom.client.ContextMenuHandler;
import com.google.gwt.event.dom.client.DoubleClickEvent;
import com.google.gwt.event.dom.client.DoubleClickHandler;
import com.google.gwt.event.dom.client.ErrorEvent;
import com.google.gwt.event.dom.client.ErrorHandler;
import com.google.gwt.event.dom.client.FocusEvent;
import com.google.gwt.event.dom.client.FocusHandler;
import com.google.gwt.event.dom.client.HasChangeHandlers;
import com.google.gwt.event.dom.client.HasContextMenuHandlers;
import com.google.gwt.event.dom.client.HasDoubleClickHandlers;
import com.google.gwt.event.dom.client.HasMouseWheelHandlers;
import com.google.gwt.event.dom.client.KeyDownEvent;
import com.google.gwt.event.dom.client.KeyDownHandler;
import com.google.gwt.event.dom.client.KeyPressEvent;
import com.google.gwt.event.dom.client.KeyPressHandler;
import com.google.gwt.event.dom.client.KeyUpEvent;
import com.google.gwt.event.dom.client.KeyUpHandler;
import com.google.gwt.event.dom.client.LoadEvent;
import com.google.gwt.event.dom.client.LoadHandler;
import com.google.gwt.event.dom.client.MouseDownEvent;
import com.google.gwt.event.dom.client.MouseDownHandler;
import com.google.gwt.event.dom.client.MouseMoveEvent;
import com.google.gwt.event.dom.client.MouseMoveHandler;
import com.google.gwt.event.dom.client.MouseOutEvent;
import com.google.gwt.event.dom.client.MouseOutHandler;
import com.google.gwt.event.dom.client.MouseOverEvent;
import com.google.gwt.event.dom.client.MouseOverHandler;
import com.google.gwt.event.dom.client.MouseUpEvent;
import com.google.gwt.event.dom.client.MouseUpHandler;
import com.google.gwt.event.dom.client.MouseWheelEvent;
import com.google.gwt.event.dom.client.MouseWheelHandler;
import com.google.gwt.event.dom.client.ScrollEvent;
import com.google.gwt.event.dom.client.ScrollHandler;
import com.google.gwt.event.logical.shared.ResizeEvent;
import com.google.gwt.event.logical.shared.ResizeHandler;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.museum.client.common.AbstractIssue;
import com.google.gwt.user.client.Event;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.HasVerticalAlignment;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.ScrollPanel;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.user.client.ui.FlexTable.FlexCellFormatter;
import java.util.HashMap;
import java.util.Map;
/**
* Verify that events fire in all browsers.
*/
public class VisualsForEventsFiring extends AbstractIssue {
private static class CustomImage extends Image implements
HasDoubleClickHandlers, HasContextMenuHandlers {
public HandlerRegistration addContextMenuHandler(ContextMenuHandler handler) {
return addDomHandler(handler, ContextMenuEvent.getType());
}
public HandlerRegistration addDoubleClickHandler(DoubleClickHandler handler) {
return addDomHandler(handler, DoubleClickEvent.getType());
}
}
private static class CustomScrollPanel extends ScrollPanel implements
HasMouseWheelHandlers {
public CustomScrollPanel(Widget content) {
super(content);
}
public HandlerRegistration addMouseWheelHandler(MouseWheelHandler handler) {
return addDomHandler(handler, MouseWheelEvent.getType());
}
}
private static class CustomTextBox extends TextBox implements
HasChangeHandlers {
public HandlerRegistration addChangeHandler(ChangeHandler handler) {
return addDomHandler(handler, ChangeEvent.getType());
}
}
private static final int WINDOW_EVENT_SCROLL = -1;
private static final int WINDOW_EVENT_RESIZE = -2;
private static final int WINDOW_EVENT_CLOSING = -3;
private static final int VELOCITY_EVENT = -4;
/**
* The main grid used for layout.
*/
private FlexTable layout = null;
private Map<Integer, Integer> eventMap = new HashMap<Integer, Integer>();
@Override
public Widget createIssue() {
// Create a grid to hold all of the tests
eventMap.clear();
layout = new FlexTable();
layout.setCellPadding(3);
layout.setBorderWidth(2);
layout.setHTML(0, 0, "<b>Action to Perform</b>");
layout.setHTML(0, 1, "<b>Event</b>");
layout.setHTML(0, 2, "<b>Status</b>");
prepMouseEvents();
prepKeyboardEvents();
prepScrollAndMouseWheelEvents();
prepLoadEvents();
prepWindowEvents();
// The following are not testable or not supported in all browsers
// onlosecapture
return layout;
}
@Override
public String getInstructions() {
return "Use the Widgets below to verify that all events fire in all "
+ "browsers. To test an event, perform the action require to trigger "
+ "the event using the provided widget.";
}
@Override
public String getSummary() {
return "Events fire in current browsers";
}
@Override
public boolean hasCSS() {
return false;
}
/**
* Add a test that is dependent on a previous test.
*
* @param eventType the type of event defined in {@link Event}
* @param eventName the name of the event
* @return the index of the test
*/
private int addDependentTest(int eventType, String eventName) {
// Find the last test
int numRows = layout.getRowCount();
eventMap.put(new Integer(eventType), new Integer(numRows));
for (int i = numRows - 1; i > 0; i--) {
if (layout.getCellCount(i) == 3) {
FlexCellFormatter formatter = layout.getFlexCellFormatter();
int rowSpan = formatter.getRowSpan(i, 0);
formatter.setRowSpan(i, 0, rowSpan + 1);
break;
}
}
layout.setText(numRows, 0, eventName);
layout.setText(numRows, 1, "?");
return numRows;
}
/**
* Add a new test that tests one or more events.
*
* @param eventType the type of event defined in {@link Event}
* @param eventName the name of the event
* @param trigger the widget that triggers the events
* @return the index of the test
*/
private int addTest(int eventType, String eventName, Widget trigger) {
int numRows = layout.getRowCount();
eventMap.put(new Integer(eventType), new Integer(numRows));
layout.setWidget(numRows, 0, trigger);
layout.setText(numRows, 1, eventName);
layout.setText(numRows, 2, "?");
FlexCellFormatter formatter = layout.getFlexCellFormatter();
formatter.setVerticalAlignment(numRows, 0,
HasVerticalAlignment.ALIGN_MIDDLE);
formatter.setHorizontalAlignment(numRows, 0,
HasHorizontalAlignment.ALIGN_CENTER);
return numRows;
}
/**
* Mark the event as passed.
*
* @param event the event that was triggered
*/
private void passTest(NativeEvent event) {
passTest(Event.as(event).getTypeInt());
}
/**
* Mark the event as passed.
*
* @param eventType the event type that was triggered
*/
private void passTest(int eventType) {
int rowIndex = eventMap.get(new Integer(eventType));
if (layout.getCellCount(rowIndex) == 3) {
layout.setHTML(rowIndex, 2, "pass");
} else {
layout.setHTML(rowIndex, 1, "pass");
}
}
private void prepKeyboardEvents() {
// Setup a text box to trigger the events
CustomTextBox textBox = new CustomTextBox();
// Setup the tests
textBox.setText("Type a letter");
addTest(Event.ONKEYDOWN, "keydown", textBox);
addDependentTest(Event.ONKEYPRESS, "keypress");
addDependentTest(Event.ONKEYUP, "keyup");
addDependentTest(Event.ONFOCUS, "focus");
addDependentTest(Event.ONBLUR, "blur");
addDependentTest(Event.ONCHANGE, "change");
// Add event handlers
textBox.addKeyDownHandler(new KeyDownHandler() {
public void onKeyDown(KeyDownEvent event) {
event.isAltKeyDown();
event.isControlKeyDown();
event.isShiftKeyDown();
event.isMetaKeyDown();
assert event.getNativeKeyCode() > 0;
passTest(event.getNativeEvent());
}
});
textBox.addKeyUpHandler(new KeyUpHandler() {
public void onKeyUp(KeyUpEvent event) {
event.isAltKeyDown();
event.isControlKeyDown();
event.isShiftKeyDown();
event.isMetaKeyDown();
assert event.getNativeKeyCode() > 0;
passTest(event.getNativeEvent());
}
});
textBox.addKeyPressHandler(new KeyPressHandler() {
public void onKeyPress(KeyPressEvent event) {
event.isAltKeyDown();
event.isControlKeyDown();
event.isShiftKeyDown();
event.isMetaKeyDown();
assert event.getCharCode() > 0;
passTest(event.getNativeEvent());
}
});
textBox.addFocusHandler(new FocusHandler() {
public void onFocus(FocusEvent event) {
passTest(event.getNativeEvent());
}
});
textBox.addBlurHandler(new BlurHandler() {
public void onBlur(BlurEvent event) {
passTest(event.getNativeEvent());
}
});
textBox.addChangeHandler(new ChangeHandler() {
public void onChange(ChangeEvent event) {
passTest(event.getNativeEvent());
}
});
}
private void prepLoadEvents() {
// Create an image to trigger events
final CustomImage loadable = new CustomImage();
// Setup the tests
addTest(Event.ONERROR, "error", loadable);
addDependentTest(Event.ONLOAD, "load");
addDependentTest(Event.ONCONTEXTMENU, "contextMenu");
addDependentTest(Event.ONDBLCLICK, "dblclick");
// Add the handlers
loadable.addErrorHandler(new ErrorHandler() {
public void onError(ErrorEvent event) {
loadable.setUrl("issues/images/gwtLogo.png");
passTest(event.getNativeEvent());
}
});
loadable.addLoadHandler(new LoadHandler() {
public void onLoad(LoadEvent event) {
passTest(event.getNativeEvent());
}
});
loadable.addDoubleClickHandler(new DoubleClickHandler() {
public void onDoubleClick(DoubleClickEvent event) {
passTest(event.getNativeEvent());
}
});
loadable.addContextMenuHandler(new ContextMenuHandler() {
public void onContextMenu(ContextMenuEvent event) {
passTest(event.getNativeEvent());
}
});
// Trigger the events
loadable.setUrl("imageDoesNotExist.abc");
}
private void prepMouseEvents() {
// Create a button to trigger events
final Button button = new Button("Click me, move over me") {
@Override
public void onBrowserEvent(Event event) {
super.onBrowserEvent(event);
// Verify that values associated with events are defined. For some
// values, we just want to make sure we can get them without any
// errors.
assert event.getClientX() > 0;
assert event.getClientY() > 0;
assert event.getScreenX() > 0;
assert event.getScreenY() > 0;
event.getAltKey();
event.getCtrlKey();
event.getShiftKey();
event.getMetaKey();
}
};
// Setup the tests
addTest(Event.ONCLICK, "click", button);
addDependentTest(Event.ONMOUSEDOWN, "mousedown");
addDependentTest(Event.ONMOUSEUP, "mouseup");
addDependentTest(Event.ONMOUSEOVER, "mouseover");
addDependentTest(Event.ONMOUSEOUT, "mouseout");
addDependentTest(Event.ONMOUSEMOVE, "mousemove");
// Add event handlers
button.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
passTest(event.getNativeEvent());
}
});
button.addMouseDownHandler(new MouseDownHandler() {
public void onMouseDown(MouseDownEvent event) {
event.getNativeButton();
passTest(event.getNativeEvent());
}
});
button.addMouseUpHandler(new MouseUpHandler() {
public void onMouseUp(MouseUpEvent event) {
event.getNativeButton();
passTest(event.getNativeEvent());
}
});
button.addMouseMoveHandler(new MouseMoveHandler() {
public void onMouseMove(MouseMoveEvent event) {
passTest(event.getNativeEvent());
}
});
button.addMouseOutHandler(new MouseOutHandler() {
public void onMouseOut(MouseOutEvent event) {
NativeEvent nativeEvent = event.getNativeEvent();
assert nativeEvent.getRelatedEventTarget() != null;
assert nativeEvent.getEventTarget() != null;
if (button.getElement().equals(nativeEvent.getEventTarget())
&& button.getElement().getParentElement().equals(
nativeEvent.getRelatedEventTarget())) {
passTest(nativeEvent);
}
}
});
button.addMouseOverHandler(new MouseOverHandler() {
public void onMouseOver(MouseOverEvent event) {
NativeEvent nativeEvent = event.getNativeEvent();
assert nativeEvent.getRelatedEventTarget() != null;
assert nativeEvent.getEventTarget() != null;
if (button.getElement().equals(nativeEvent.getEventTarget())
&& button.getElement().getParentElement().equals(
nativeEvent.getRelatedEventTarget())) {
passTest(nativeEvent);
}
}
});
}
private void prepScrollAndMouseWheelEvents() {
// Create a widget to trigger events
String scrollableMessage = "Scroll to the bottom<br>(using mouse wheel<br>"
+ "if supported)";
HTML scrollableContents = new HTML(scrollableMessage);
scrollableContents.setPixelSize(400, 400);
scrollableContents.getElement().getStyle().setProperty("textAlign", "left");
CustomScrollPanel scrollable = new CustomScrollPanel(scrollableContents);
// Setup the tests
scrollable.setAlwaysShowScrollBars(true);
scrollable.setPixelSize(200, 100);
addTest(Event.ONSCROLL, "scroll", scrollable);
addDependentTest(Event.ONMOUSEWHEEL, "mousewheel");
// Display the mouse wheel velocity
final int velocityIndex = addDependentTest(VELOCITY_EVENT, "velocityY");
// Add event handlers
scrollable.addScrollHandler(new ScrollHandler() {
public void onScroll(ScrollEvent event) {
passTest(event.getNativeEvent());
}
});
scrollable.addMouseWheelHandler(new MouseWheelHandler() {
public void onMouseWheel(MouseWheelEvent event) {
event.getClientX();
event.getClientY();
event.getScreenX();
event.getScreenY();
int velocityY = event.getDeltaY();
layout.setText(velocityIndex, 1, velocityY + "");
passTest(event.getNativeEvent());
}
});
}
private void prepWindowEvents() {
Label windowLabel = new Label("Window level events");
// Setup the tests
addTest(WINDOW_EVENT_SCROLL, "window.onscroll", windowLabel);
addDependentTest(WINDOW_EVENT_RESIZE, "window.onresize");
addDependentTest(WINDOW_EVENT_CLOSING, "window.onbeforeunload");
// Add event handlers
Window.addWindowScrollHandler(new Window.ScrollHandler() {
public void onWindowScroll(Window.ScrollEvent event) {
passTest(WINDOW_EVENT_SCROLL);
}
});
Window.addResizeHandler(new ResizeHandler() {
public void onResize(ResizeEvent event) {
passTest(WINDOW_EVENT_RESIZE);
}
});
Window.addWindowClosingHandler(new Window.ClosingHandler() {
public void onWindowClosing(Window.ClosingEvent event) {
event.setMessage("Stay and verify that window.onbeforeunload() has passed");
passTest(WINDOW_EVENT_CLOSING);
}
});
}
}