Reviewers: pdr,
Description:
Fixing ActionCell and ButtonCell clicks outside of the Button element
are ignored.
Issue: 5641
Author: hekke, jlabanca
Please review this at http://gwt-code-reviews.appspot.com/1371810/
Affected files:
M user/src/com/google/gwt/cell/client/ActionCell.java
M user/src/com/google/gwt/cell/client/ButtonCell.java
M user/test/com/google/gwt/cell/client/ActionCellTest.java
M user/test/com/google/gwt/cell/client/ButtonCellTest.java
M user/test/com/google/gwt/cell/client/CellTestBase.java
Index: user/src/com/google/gwt/cell/client/ActionCell.java
===================================================================
--- user/src/com/google/gwt/cell/client/ActionCell.java (revision 9814)
+++ user/src/com/google/gwt/cell/client/ActionCell.java (working copy)
@@ -16,6 +16,7 @@
package com.google.gwt.cell.client;
import com.google.gwt.dom.client.Element;
+import com.google.gwt.dom.client.EventTarget;
import com.google.gwt.dom.client.NativeEvent;
import com.google.gwt.safehtml.shared.SafeHtml;
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
@@ -76,7 +77,14 @@
NativeEvent event, ValueUpdater<C> valueUpdater) {
super.onBrowserEvent(context, parent, value, event, valueUpdater);
if ("click".equals(event.getType())) {
- onEnterKeyDown(context, parent, value, event, valueUpdater);
+ EventTarget eventTarget = event.getEventTarget();
+ if (!Element.is(eventTarget)) {
+ return;
+ }
+ if
(parent.getFirstChildElement().isOrHasChild(Element.as(eventTarget))) {
+ // Ignore clicks that occur outside of the main element.
+ onEnterKeyDown(context, parent, value, event, valueUpdater);
+ }
}
}
Index: user/src/com/google/gwt/cell/client/ButtonCell.java
===================================================================
--- user/src/com/google/gwt/cell/client/ButtonCell.java (revision 9814)
+++ user/src/com/google/gwt/cell/client/ButtonCell.java (working copy)
@@ -16,6 +16,7 @@
package com.google.gwt.cell.client;
import com.google.gwt.dom.client.Element;
+import com.google.gwt.dom.client.EventTarget;
import com.google.gwt.dom.client.NativeEvent;
import com.google.gwt.safehtml.shared.SafeHtml;
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
@@ -48,7 +49,14 @@
NativeEvent event, ValueUpdater<String> valueUpdater) {
super.onBrowserEvent(context, parent, value, event, valueUpdater);
if ("click".equals(event.getType())) {
- onEnterKeyDown(context, parent, value, event, valueUpdater);
+ EventTarget eventTarget = event.getEventTarget();
+ if (!Element.is(eventTarget)) {
+ return;
+ }
+ if
(parent.getFirstChildElement().isOrHasChild(Element.as(eventTarget))) {
+ // Ignore clicks that occur outside of the main element.
+ onEnterKeyDown(context, parent, value, event, valueUpdater);
+ }
}
}
Index: user/test/com/google/gwt/cell/client/ActionCellTest.java
===================================================================
--- user/test/com/google/gwt/cell/client/ActionCellTest.java (revision 9814)
+++ user/test/com/google/gwt/cell/client/ActionCellTest.java (working copy)
@@ -16,9 +16,7 @@
package com.google.gwt.cell.client;
import com.google.gwt.cell.client.ActionCell.Delegate;
-import com.google.gwt.cell.client.Cell.Context;
import com.google.gwt.dom.client.Document;
-import com.google.gwt.dom.client.Element;
import com.google.gwt.dom.client.NativeEvent;
/**
@@ -47,12 +45,20 @@
public void testOnBrowserEvent() {
MockDelegate<String> delegate = new MockDelegate<String>();
ActionCell<String> cell = new ActionCell<String>("hello", delegate);
- Element parent = Document.get().createDivElement();
- NativeEvent event = Document.get().createClickEvent(0, 0, 0, 0, 0,
false,
- false, false, false);
- Context context = new Context(0, 0, DEFAULT_KEY);
- cell.onBrowserEvent(context, parent, "test", event, null);
+ NativeEvent event = Document.get().createClickEvent(0, 0, 0, 0, 0,
false, false, false, false);
+ testOnBrowserEvent(cell, getExpectedInnerHtml(), event, "test", null,
true);
delegate.assertLastObject("test");
+ }
+
+ /**
+ * Test that events outside of the button element are ignored.
+ */
+ public void testOnBrowserEventOutsideButton() {
+ MockDelegate<String> delegate = new MockDelegate<String>();
+ ActionCell<String> cell = new ActionCell<String>("hello", delegate);
+ NativeEvent event = Document.get().createClickEvent(0, 0, 0, 0, 0,
false, false, false, false);
+ testOnBrowserEvent(cell, getExpectedInnerHtml(), event, "test", null,
false);
+ delegate.assertLastObject(null);
}
@Override
Index: user/test/com/google/gwt/cell/client/ButtonCellTest.java
===================================================================
--- user/test/com/google/gwt/cell/client/ButtonCellTest.java (revision 9814)
+++ user/test/com/google/gwt/cell/client/ButtonCellTest.java (working copy)
@@ -24,9 +24,16 @@
public class ButtonCellTest extends CellTestBase<String> {
public void testOnBrowserEvent() {
- NativeEvent event = Document.get().createClickEvent(0, 0, 0, 0, 0,
false,
- false, false, false);
+ NativeEvent event = Document.get().createClickEvent(0, 0, 0, 0, 0,
false, false, false, false);
testOnBrowserEvent(getExpectedInnerHtml(),
event, "clickme", "clickme");
+ }
+
+ /**
+ * Test that events outside of the button element are ignored.
+ */
+ public void testOnBrowserEventOutsideButton() {
+ NativeEvent event = Document.get().createClickEvent(0, 0, 0, 0, 0,
false, false, false, false);
+ testOnBrowserEvent(createCell(), getExpectedInnerHtml(),
event, "clickme", null, false);
}
@Override
Index: user/test/com/google/gwt/cell/client/CellTestBase.java
===================================================================
--- user/test/com/google/gwt/cell/client/CellTestBase.java (revision 9814)
+++ user/test/com/google/gwt/cell/client/CellTestBase.java (working copy)
@@ -229,7 +229,7 @@
* Test
* {@link Cell#onBrowserEvent(Element, Object, Object, NativeEvent,
ValueUpdater)}
* with the specified conditions.
- *
+ *
* @param startHtml the innerHTML of the cell before the test starts
* @param event the event to fire
* @param value the cell value
@@ -237,16 +237,39 @@
* null if none expected
* @return the parent element
*/
- protected Element testOnBrowserEvent(String startHtml, NativeEvent event,
- final T value, T expectedValue) {
+ protected Element testOnBrowserEvent(String startHtml, NativeEvent
event, final T value,
+ T expectedValue) {
+ return testOnBrowserEvent(createCell(), startHtml, event, value,
expectedValue, true);
+ }
+
+ /**
+ * Test
+ * {@link Cell#onBrowserEvent(Element, Object, Object, NativeEvent,
ValueUpdater)}
+ * with the specified conditions.
+ *
+ * @param cell the cell to use
+ * @param startHtml the innerHTML of the cell before the test starts
+ * @param event the event to fire
+ * @param value the cell value
+ * @param expectedValue the expected value passed to the value updater,
or
+ * null if none expected
+ * @param dispatchToFirstChild true to dispatch to the first child of the
+ * rendered parent element, if one is available
+ * @return the parent element
+ */
+ protected Element testOnBrowserEvent(final Cell<T> cell, String
startHtml, NativeEvent event,
+ final T value, T expectedValue, boolean dispatchToFirstChild) {
// Setup the parent element.
final com.google.gwt.user.client.Element parent =
Document.get().createDivElement().cast();
parent.setInnerHTML(startHtml);
Document.get().getBody().appendChild(parent);
// If the element has a child, use it as the event target.
- Element child = parent.getFirstChildElement();
- Element target = (child == null) ? parent : child;
+ Element target = parent;
+ if (dispatchToFirstChild) {
+ Element child = parent.getFirstChildElement();
+ target = (child == null) ? parent : child;
+ }
// Pass the event to the cell.
final MockValueUpdater valueUpdater = new MockValueUpdater();
@@ -255,13 +278,11 @@
try {
DOM.setEventListener(parent, null);
Context context = new Context(0, 0, DEFAULT_KEY);
- createCell().onBrowserEvent(context, parent, value, event,
- valueUpdater);
+ cell.onBrowserEvent(context, parent, value, event, valueUpdater);
parent.removeFromParent();
} catch (Exception e) {
// We are in an event loop, so events may not propagate out to
JUnit.
- fail("An exception occured while handling the event: "
- + e.getMessage());
+ fail("An exception occured while handling the event: " +
e.getMessage());
}
}
});
--
http://groups.google.com/group/Google-Web-Toolkit-Contributors