From: <mgu...@us...> - 2013-07-12 09:16:36
|
Revision: 8392 http://sourceforge.net/p/htmlunit/code/8392 Author: mguillem Date: 2013-07-12 09:16:33 +0000 (Fri, 12 Jul 2013) Log Message: ----------- Ensure that onchange event isn't called at focus lost after usage of HtmlInput.setValueAttribute Issue 1518 Modified Paths: -------------- trunk/htmlunit/src/changes/changes.xml trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlCheckBoxInput.java trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlFileInput.java trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlInput.java trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlPasswordInput.java trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlRadioButtonInput.java trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlTextInput.java trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/html/HtmlFileInput2Test.java Modified: trunk/htmlunit/src/changes/changes.xml =================================================================== --- trunk/htmlunit/src/changes/changes.xml 2013-07-11 21:31:48 UTC (rev 8391) +++ trunk/htmlunit/src/changes/changes.xml 2013-07-12 09:16:33 UTC (rev 8392) @@ -8,6 +8,9 @@ <body> <release version="2.13" date="???" description="Bugfixes"> + <action type="update" dev="mguillem" issue="1518"> + Ensure that onchange event isn't called at focus lost after usage of HtmlInput.setValueAttribute. + </action> <action type="update" dev="mguillem" issue="1516"> JavaScript: add support for XPathEvaluator (FF & Chrome). </action> Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlCheckBoxInput.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlCheckBoxInput.java 2013-07-11 21:31:48 UTC (rev 8391) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlCheckBoxInput.java 2013-07-12 09:16:33 UTC (rev 8392) @@ -47,7 +47,6 @@ private static final String DEFAULT_VALUE = "on"; private boolean defaultCheckedState_; - private boolean valueAtFocus_; private boolean forceChecked_; /** @@ -255,27 +254,16 @@ return clone; } - /** - * {@inheritDoc} - */ @Override - public void focus() { - super.focus(); - valueAtFocus_ = isChecked(); + Object getInternalValue() { + return isChecked(); } - /** - * {@inheritDoc} - */ - @Override - void removeFocus() { - super.removeFocus(); - + void handleFocusLostValueChanged() { final boolean fireOnChange = hasFeature(EVENT_ONCHANGE_LOSING_FOCUS); - if (fireOnChange && valueAtFocus_ != isChecked()) { + if (fireOnChange) { executeOnChangeHandlerIfAppropriate(this); } - valueAtFocus_ = isChecked(); } /** Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlFileInput.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlFileInput.java 2013-07-11 21:31:48 UTC (rev 8391) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlFileInput.java 2013-07-12 09:16:33 UTC (rev 8392) @@ -42,7 +42,6 @@ private String contentType_; private byte[] data_; - private String valueAtFocus_; /** * Creates an instance. @@ -187,24 +186,4 @@ public String getContentType() { return contentType_; } - - /** - * {@inheritDoc} - */ - @Override - public void focus() { - super.focus(); - // store current value to trigger onchange when needed at focus lost - valueAtFocus_ = getValueAttribute(); - } - - @Override - void removeFocus() { - super.removeFocus(); - - if (!valueAtFocus_.equals(getValueAttribute())) { - executeOnChangeHandlerIfAppropriate(this); - } - valueAtFocus_ = null; - } } Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlInput.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlInput.java 2013-07-11 21:31:48 UTC (rev 8391) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlInput.java 2013-07-12 09:16:33 UTC (rev 8392) @@ -53,6 +53,7 @@ private String originalName_; private Collection<String> previousNames_ = Collections.emptySet(); private boolean createdByJavascript_ = false; + private Object valueAtFocus_; /** * Creates an instance. @@ -90,7 +91,9 @@ WebAssert.notNull("newValue", newValue); setAttribute("value", newValue); - return executeOnChangeHandlerIfAppropriate(this); + final Page page = executeOnChangeHandlerIfAppropriate(this); + valueAtFocus_ = getInternalValue(); + return page; } /** @@ -556,4 +559,32 @@ public boolean wasCreatedByJavascript() { return createdByJavascript_; } + + /** + * {@inheritDoc} + */ + @Override + public final void focus() { + super.focus(); + // store current value to trigger onchange when needed at focus lost + valueAtFocus_ = getInternalValue(); + } + + @Override + final void removeFocus() { + super.removeFocus(); + + if (!valueAtFocus_.equals(getInternalValue())) { + handleFocusLostValueChanged(); + } + valueAtFocus_ = null; + } + + void handleFocusLostValueChanged() { + executeOnChangeHandlerIfAppropriate(this); + } + + Object getInternalValue() { + return getValueAttribute(); + } } Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlPasswordInput.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlPasswordInput.java 2013-07-11 21:31:48 UTC (rev 8391) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlPasswordInput.java 2013-07-12 09:16:33 UTC (rev 8392) @@ -35,8 +35,6 @@ */ public class HtmlPasswordInput extends HtmlInput implements SelectableTextInput { - private String valueAtFocus_; - private final SelectionDelegate selectionDelegate_ = new SelectionDelegate(this); private final DoTypeProcessor doTypeProcessor_ = new DoTypeProcessor() { @@ -140,28 +138,6 @@ * {@inheritDoc} */ @Override - public void focus() { - super.focus(); - // store current value to trigger onchange when needed at focus lost - valueAtFocus_ = getValueAttribute(); - } - - /** - * {@inheritDoc} - */ - @Override - void removeFocus() { - super.removeFocus(); - if (!valueAtFocus_.equals(getValueAttribute())) { - executeOnChangeHandlerIfAppropriate(this); - } - valueAtFocus_ = null; - } - - /** - * {@inheritDoc} - */ - @Override protected Object clone() throws CloneNotSupportedException { return new HtmlPasswordInput(getNamespaceURI(), getQualifiedName(), getPage(), getAttributesMap()); } Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlRadioButtonInput.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlRadioButtonInput.java 2013-07-11 21:31:48 UTC (rev 8391) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlRadioButtonInput.java 2013-07-12 09:16:33 UTC (rev 8392) @@ -51,7 +51,6 @@ private static final String DEFAULT_VALUE = "on"; private boolean defaultCheckedState_; - private boolean valueAtFocus_; private boolean forceChecked_; /** @@ -316,27 +315,16 @@ return clone; } - /** - * {@inheritDoc} - */ @Override - public void focus() { - super.focus(); - valueAtFocus_ = isChecked(); + Object getInternalValue() { + return isChecked(); } - /** - * {@inheritDoc} - */ - @Override - void removeFocus() { - super.removeFocus(); - + void handleFocusLostValueChanged() { final boolean fireOnChange = hasFeature(EVENT_ONCHANGE_LOSING_FOCUS); - if (fireOnChange && valueAtFocus_ != isChecked()) { + if (fireOnChange) { executeOnChangeHandlerIfAppropriate(this); } - valueAtFocus_ = isChecked(); } /** Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlTextInput.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlTextInput.java 2013-07-11 21:31:48 UTC (rev 8391) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlTextInput.java 2013-07-12 09:16:33 UTC (rev 8392) @@ -36,8 +36,6 @@ */ public class HtmlTextInput extends HtmlInput implements SelectableTextInput { - private String valueAtFocus_; - private final SelectionDelegate selectionDelegate_ = new SelectionDelegate(this); private final DoTypeProcessor doTypeProcessor_ = new DoTypeProcessor() { @@ -157,28 +155,6 @@ * {@inheritDoc} */ @Override - public void focus() { - super.focus(); - // store current value to trigger onchange when needed at focus lost - valueAtFocus_ = getValueAttribute(); - } - - /** - * {@inheritDoc} - */ - @Override - void removeFocus() { - super.removeFocus(); - if (!valueAtFocus_.equals(getValueAttribute())) { - executeOnChangeHandlerIfAppropriate(this); - } - valueAtFocus_ = null; - } - - /** - * {@inheritDoc} - */ - @Override protected Object clone() throws CloneNotSupportedException { return new HtmlTextInput(getNamespaceURI(), getQualifiedName(), getPage(), getAttributesMap()); } Modified: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/html/HtmlFileInput2Test.java =================================================================== --- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/html/HtmlFileInput2Test.java 2013-07-11 21:31:48 UTC (rev 8391) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/html/HtmlFileInput2Test.java 2013-07-12 09:16:33 UTC (rev 8392) @@ -14,6 +14,7 @@ */ package com.gargoylesoftware.htmlunit.html; +import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.Writer; @@ -457,4 +458,25 @@ loadPageWithAlerts2(html); } + + /** + * @throws Exception if the test fails + */ + @Test + @Alerts("changed") + public void firingOnchange() throws Exception { + final String html = "<html><body>\n" + + "<form onchange='alert(\"changed\")'>\n" + + " <input type='file' id='file1'>\n" + + "</form>\n" + + "</body></html>"; + + final WebDriver driver = loadPage2(html); + final File tmpFile = File.createTempFile("htmlunit-test", ".txt"); + driver.findElement(By.id("file1")).sendKeys(tmpFile.getAbsolutePath()); + tmpFile.delete(); + driver.findElement(By.tagName("body")).click(); + + assertEquals(getExpectedAlerts(), getCollectedAlerts(driver)); + } } |