RESOLVED FIXED Bug 68513
<input> with autofocus doesn't lose focus when it has a certain onblur listener
https://bugs.webkit.org/show_bug.cgi?id=68513
Summary <input> with autofocus doesn't lose focus when it has a certain onblur listener
Rakesh
Reported 2011-09-21 02:08:07 PDT
Steps to reproduce: 1. Select the text field labeled as "Input 1 (autofocus)". 2. Type some characters. 3. Try to move focus to other controls Expected result: "Input 1" loses focus. Chromium issue: http://code.google.com/p/chromium/issues/detail?id=97015.
Attachments
Simplified test page. (538 bytes, text/html)
2011-09-21 02:09 PDT, Rakesh
no flags
Proposed Patch (2.88 KB, patch)
2011-09-21 03:04 PDT, Rakesh
no flags
Updated patch (1.12 KB, patch)
2011-09-21 04:02 PDT, Rakesh
tkent: review-
Updated patch (3.79 KB, patch)
2011-09-23 02:55 PDT, Rakesh
tkent: review-
Updated patch (3.95 KB, patch)
2011-09-23 05:24 PDT, Rakesh
tkent: review-
webkit.review.bot: commit-queue-
Updated patch (5.31 KB, patch)
2011-09-26 00:48 PDT, Rakesh
tkent: review-
Updated patch. (5.26 KB, patch)
2011-09-26 23:05 PDT, Rakesh
no flags
Rakesh
Comment 1 2011-09-21 02:09:01 PDT
Created attachment 108125 [details] Simplified test page.
Rakesh
Comment 2 2011-09-21 03:04:20 PDT
Created attachment 108127 [details] Proposed Patch The script in this page tries to change the "type" of an input element which has an "autofocus" attribute set on onblur and onFocus events. With change in "type" webcore detaches the node and adds the node again with modified type. Issue: The problem is we try to focus the Node if an "autofocus" attribute is set while attaching the node which causes the node to focus again. Approach used in the patch: We should autofocus an element only once after the page load. "The autofocus content attribute allows the author to indicate that a control is to be focused as soon as the page is loaded" from http://dev.w3.org/html5/spec/association-of-controls-and-forms.html#autofocusing-a-form-control I am using an autoFocused flag in Document which will set once the node has been focused for very first time. Please let me know your comments or better approach to handle this.
Kent Tamura
Comment 3 2011-09-21 03:17:26 PDT
> I am using an autoFocused flag in Document which will set once the node has been focused for very first time. We already have m_ignoreAutofocus flag. I think we can use it for this purpose too.
Rakesh
Comment 4 2011-09-21 04:02:41 PDT
Created attachment 108129 [details] Updated patch Yes, m_ignoreAutofocus can be used. This flag is not being set from any place presently. Attached an updated patch.
Kent Tamura
Comment 5 2011-09-21 05:09:26 PDT
(In reply to comment #4) > Created an attachment (id=108129) [details] > Updated patch Do you want it to be reviewed? It doesn't have the "review?" flag.
Rakesh
Comment 6 2011-09-21 05:24:48 PDT
(In reply to comment #5) > (In reply to comment #4) > > Created an attachment (id=108129) [details] [details] > > Updated patch > > Do you want it to be reviewed? It doesn't have the "review?" flag. sorry, missed setting that.
Kent Tamura
Comment 7 2011-09-21 06:30:52 PDT
Comment on attachment 108129 [details] Updated patch The patch contains no tests.
Ryosuke Niwa
Comment 8 2011-09-21 08:38:49 PDT
Comment on attachment 108129 [details] Updated patch View in context: https://bugs.webkit.org/attachment.cgi?id=108129&action=review > Source/WebCore/ChangeLog:9 > + * html/HTMLFormControlElement.cpp: > + (WebCore::HTMLFormControlElement::attach): Please explain why we should be modifying this function. Also, my gut tells me calling setIgnoreAutofocus inside attach is wrong.
Rakesh
Comment 9 2011-09-22 02:11:20 PDT
(In reply to comment #8) > (From update of attachment 108129 [details]) > View in context: https://bugs.webkit.org/attachment.cgi?id=108129&action=review > > > Source/WebCore/ChangeLog:9 > > + * html/HTMLFormControlElement.cpp: > > + (WebCore::HTMLFormControlElement::attach): > > Please explain why we should be modifying this function. Also, my gut tells me calling setIgnoreAutofocus inside attach is wrong. As Autofocus is happening from attach and we have to make sure only this element needs to be focused. We can as well call setIgnoreAutofocus from focusPostAttach callback after setting the focus but I am not sure if we need to check for ignoreAutoFocus before setting the focus. Do you see any side effects of doing that from attach()?
Ryosuke Niwa
Comment 10 2011-09-22 08:53:46 PDT
Comment on attachment 108129 [details] Updated patch View in context: https://bugs.webkit.org/attachment.cgi?id=108129&action=review >>> Source/WebCore/ChangeLog:9 >>> + (WebCore::HTMLFormControlElement::attach): >> >> Please explain why we should be modifying this function. Also, my gut tells me calling setIgnoreAutofocus inside attach is wrong. > > As Autofocus is happening from attach and we have to make sure only this element needs to be focused. > > We can as well call setIgnoreAutofocus from focusPostAttach callback after setting the focus but I am not sure if we need to check for ignoreAutoFocus before setting the focus. > > Do you see any side effects of doing that from attach()? If anything, I'd expect the fix for this bug to be in HTMLInputElement::updateType.
Rakesh
Comment 11 2011-09-23 00:34:39 PDT
(In reply to comment #10) > (From update of attachment 108129 [details]) > View in context: https://bugs.webkit.org/attachment.cgi?id=108129&action=review > > >>> Source/WebCore/ChangeLog:9 > >>> + (WebCore::HTMLFormControlElement::attach): > >> > >> Please explain why we should be modifying this function. Also, my gut tells me calling setIgnoreAutofocus inside attach is wrong. > > > > As Autofocus is happening from attach and we have to make sure only this element needs to be focused. > > > > We can as well call setIgnoreAutofocus from focusPostAttach callback after setting the focus but I am not sure if we need to check for ignoreAutoFocus before setting the focus. > > > > Do you see any side effects of doing that from attach()? > > If anything, I'd expect the fix for this bug to be in HTMLInputElement::updateType. As per my understanding of the specification "The auto-focus content attribute allows the author to indicate that a control is to be focused as soon as the page is loaded" implies "an element can be auto-focused only once". So it seems correct to handle it when we are auto-focusing for first time.
Kent Tamura
Comment 12 2011-09-23 02:28:01 PDT
(In reply to comment #11) I think the code change in the last patch is reasonable. This problem can happen with <select> with/without multiple, and setting setIgnoreAutofocus() would resolve all of the cases.
Rakesh
Comment 13 2011-09-23 02:55:57 PDT
Created attachment 108453 [details] Updated patch Added layout tests.
Kent Tamura
Comment 14 2011-09-23 03:10:59 PDT
Comment on attachment 108453 [details] Updated patch View in context: https://bugs.webkit.org/attachment.cgi?id=108453&action=review r- because of test style. > LayoutTests/fast/forms/autofocus-focus-only-once.html:6 > + input { background:red } > + input:focus { background:lime } One-space indentation looks strange. Please remove the indentation. > LayoutTests/fast/forms/autofocus-focus-only-once.html:12 > +<script language="JavaScript" type="text/javascript"> > + function log(message) { > + document.getElementById("console").innerHTML += "<li>"+message+"</li>"; > + } > + Indenting the all of the content by four spaces is meaningless. Please remove the indentation. > LayoutTests/fast/forms/autofocus-focus-only-once.html:30 > + if (document.activeElement == document.getElementById("input2")) > + log("SUCCESS"); > + else > + log("FAILURE"); You had better load LayoutTests/fast/js/resource/js-test-pre.js, and write shouldBe('document.activeElement', 'document.getElementById("input2")'). See LayoutTests/fast/forms/autofocus-keygen.html, etc.
Rakesh
Comment 15 2011-09-23 05:24:45 PDT
Created attachment 108463 [details] Updated patch Changes as per comment#12.
Rakesh
Comment 16 2011-09-23 05:26:36 PDT
(In reply to comment #15) > Created an attachment (id=108463) [details] > Updated patch > > Changes as per comment#12. Its "Changes as per comment#14".
WebKit Review Bot
Comment 17 2011-09-23 07:50:09 PDT
Comment on attachment 108463 [details] Updated patch Attachment 108463 [details] did not pass chromium-ews (chromium-xvfb): Output: http://queues.webkit.org/results/9813254 New failing tests: fast/forms/autofocus-opera-006.html
Kent Tamura
Comment 18 2011-09-25 19:01:33 PDT
(In reply to comment #17) > New failing tests: > fast/forms/autofocus-opera-006.html Oh, we expect the last element with autofucus gets focused. So, we can't use Document::m_ignoreAutofocus flag. We had better introduce another flag to HTMLFormControlElement.
Kent Tamura
Comment 19 2011-09-25 19:05:05 PDT
Comment on attachment 108463 [details] Updated patch View in context: https://bugs.webkit.org/attachment.cgi?id=108463&action=review r- because of fast/forms/autofocus-opera-006.html failed. > LayoutTests/fast/forms/autofocus-focus-only-once-expected.txt:11 > +TEST COMPLETE > +PASS document.activeElement is document.getElementById("input2") > +PASS successfullyParsed is true > + > +TEST COMPLETE Showing "TEST COMPLETE" twice is wrong. If you'd like to use finishJSTest(), you need to call "jsTestIsAsync = true" before loading js-test-post.js. Otherwise, I think you can move the content of test() to a place between </pre> and <script> for js-test-post.js, and remove finishJSTest().
Rakesh
Comment 20 2011-09-26 00:45:36 PDT
(In reply to comment #18) > (In reply to comment #17) > > New failing tests: > > fast/forms/autofocus-opera-006.html > > Oh, we expect the last element with autofucus gets focused. > > So, we can't use Document::m_ignoreAutofocus flag. > We had better introduce another flag to HTMLFormControlElement. Will upload new patch with these changes. I am still thinking about the issue where the element with autofocus attribute which is added may be on some event after the page load should not be focused. Do you think this can be a issue?
Rakesh
Comment 21 2011-09-26 00:48:02 PDT
Created attachment 108637 [details] Updated patch Changes as per comment# 18 and 19.
WebKit Review Bot
Comment 22 2011-09-26 00:48:37 PDT
Comment on attachment 108637 [details] Updated patch Rejecting attachment 108637 [details] from review queue. rakesh.kn@motorola.com does not have reviewer permissions according to http://trac.webkit.org/browser/trunk/Tools/Scripts/webkitpy/common/config/committers.py. - If you do not have reviewer rights please read http://webkit.org/coding/contributing.html for instructions on how to use bugzilla flags. - If you have reviewer rights please correct the error in Tools/Scripts/webkitpy/common/config/committers.py by adding yourself to the file (no review needed). The commit-queue restarts itself every 2 hours. After restart the commit-queue will correctly respect your reviewer rights.
WebKit Review Bot
Comment 23 2011-09-26 00:49:20 PDT
Comment on attachment 108637 [details] Updated patch Rejecting attachment 108637 [details] from commit-queue. rakesh.kn@motorola.com does not have committer permissions according to http://trac.webkit.org/browser/trunk/Tools/Scripts/webkitpy/common/config/committers.py. - If you do not have committer rights please read http://webkit.org/coding/contributing.html for instructions on how to use bugzilla flags. - If you have committer rights please correct the error in Tools/Scripts/webkitpy/common/config/committers.py by adding yourself to the file (no review needed). The commit-queue restarts itself every 2 hours. After restart the commit-queue will correctly respect your committer rights.
Rakesh
Comment 24 2011-09-26 00:53:06 PDT
Sorry about "review and commit +" by myself, it got wrongly selected.
Kent Tamura
Comment 25 2011-09-26 18:58:00 PDT
(In reply to comment #20) > I am still thinking about the issue where the element with autofocus > attribute which is added may be on some event after the page load should > not be focused. Do you think this can be a issue? What type of events?
Kent Tamura
Comment 26 2011-09-26 19:07:52 PDT
Comment on attachment 108637 [details] Updated patch View in context: https://bugs.webkit.org/attachment.cgi?id=108637&action=review > LayoutTests/fast/forms/autofocus-focus-only-once.html:22 > + if (window.layoutTestController) > + layoutTestController.dumpAsText(); > + These lines are not needed. js-test-pre.js does it. > Source/WebCore/html/HTMLFormControlElement.h:104 > + bool hasAutofocused() { return m_hasAutoFocused; } > + void setAutofocused(bool autofocused = true) { m_hasAutoFocused = autofocused; } > + Inconsistent capitalization: hasAuto*f*ocused vs. m_hasAuto*F*ocused Let's follow the capitalization of Document::m_ignoreAutofocus. So it should be m_hasAuto*f*ocused. Also, we don't need to use the default argument for setAutofocused(). void setAutofocused() { m_hasAutofocused = true; } is enough.
Rakesh
Comment 27 2011-09-26 22:50:40 PDT
(In reply to comment #25) > (In reply to comment #20) > > I am still thinking about the issue where the element with autofocus > > attribute which is added may be on some event after the page load should > > not be focused. Do you think this can be a issue? > > What type of events? Say on button press, if an element with autofocus attribute is created then, should the new element be focused after creation?
Rakesh
Comment 28 2011-09-26 22:53:26 PDT
(In reply to comment #26) > (From update of attachment 108637 [details]) > View in context: https://bugs.webkit.org/attachment.cgi?id=108637&action=review > > > LayoutTests/fast/forms/autofocus-focus-only-once.html:22 > > + if (window.layoutTestController) > > + layoutTestController.dumpAsText(); > > + > > These lines are not needed. js-test-pre.js does it. Done. > > > Source/WebCore/html/HTMLFormControlElement.h:104 > > + bool hasAutofocused() { return m_hasAutoFocused; } > > + void setAutofocused(bool autofocused = true) { m_hasAutoFocused = autofocused; } > > + > > Inconsistent capitalization: hasAuto*f*ocused vs. m_hasAuto*F*ocused > Let's follow the capitalization of Document::m_ignoreAutofocus. So it should be m_hasAuto*f*ocused. > Done, thanks for pointing that out. > Also, we don't need to use the default argument for setAutofocused(). > void setAutofocused() { m_hasAutofocused = true; } > is enough. Yes, that looks much better. Will upload new patch with changes shortly.
Rakesh
Comment 29 2011-09-26 23:05:52 PDT
Created attachment 108791 [details] Updated patch.
Kent Tamura
Comment 30 2011-09-26 23:07:39 PDT
(In reply to comment #27) > Say on button press, if an element with autofocus attribute is created then, should the new element be focused after creation? I see. It might be reasonable to cancel autofocus by button press. It would be a part of the step 8 of the specification. http://www.whatwg.org/specs/web-apps/current-work/multipage/association-of-controls-and-forms.html#attr-fe-autofocus > 8. If the user has indicated (for example, by starting to type in a form control) that he does not wish focus to be changed, then optionally abort these steps. We had better discuss it in a separated bug.
Kent Tamura
Comment 31 2011-09-26 23:53:19 PDT
Comment on attachment 108791 [details] Updated patch. ok. Thank you for fixing this.
Kent Tamura
Comment 32 2011-09-26 23:54:06 PDT
(In reply to comment #24) > Sorry about "review and commit +" by myself, it got wrongly selected. "webkit-patch upload" command is helpful.
WebKit Review Bot
Comment 33 2011-09-27 00:33:22 PDT
Comment on attachment 108791 [details] Updated patch. Clearing flags on attachment: 108791 Committed r96078: <http://trac.webkit.org/changeset/96078>
WebKit Review Bot
Comment 34 2011-09-27 00:33:28 PDT
All reviewed patches have been landed. Closing bug.
Rakesh
Comment 35 2011-09-27 00:43:49 PDT
(In reply to comment #30) > (In reply to comment #27) > > Say on button press, if an element with autofocus attribute is created then, should the new element be focused after creation? > > I see. It might be reasonable to cancel autofocus by button press. > It would be a part of the step 8 of the specification. > > http://www.whatwg.org/specs/web-apps/current-work/multipage/association-of-controls-and-forms.html#attr-fe-autofocus > > 8. If the user has indicated (for example, by starting to type in a form control) that he does not wish focus to be changed, then optionally abort these steps. > > We had better discuss it in a separated bug. Added https://bugs.webkit.org/show_bug.cgi?id=68876.
Rakesh
Comment 36 2011-09-27 00:51:15 PDT
(In reply to comment #32) > (In reply to comment #24) > > Sorry about "review and commit +" by myself, it got wrongly selected. > > "webkit-patch upload" command is helpful. Thanks for reviewing and for the inputs.
Note You need to log in before you can comment on or make changes to this bug.