Bug 115885 - <label> element should send key and focus events if it has contenteditable attribute.
Summary: <label> element should send key and focus events if it has contenteditable at...
Status: NEW
Alias: None
Product: WebKit
Classification: Unclassified
Component: Forms (show other bugs)
Version: 528+ (Nightly build)
Hardware: Unspecified Unspecified
: P2 Normal
Assignee: Nobody
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2013-05-09 18:58 PDT by Yael
Modified: 2022-12-16 09:23 PST (History)
5 users (show)

See Also:


Attachments
Patch (7.07 KB, patch)
2013-05-09 19:05 PDT, Yael
benjamin: review-
benjamin: commit-queue-
Details | Formatted Diff | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description Yael 2013-05-09 18:58:25 PDT
HTMLLabelElement should be focusable if it passes the test isContentEditable(). As a result, the proper events would be sent.
Both Opera and Firefox support this behavior.

Merge of https://src.chromium.org/viewvc/blink?view=rev&revision=149973
Comment 1 Yael 2013-05-09 19:05:49 PDT
Created attachment 201311 [details]
Patch
Comment 2 Benjamin Poulain 2013-05-09 22:43:49 PDT
Comment on attachment 201311 [details]
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=201311&action=review

> LayoutTests/fast/forms/label/labels-contenteditable.html:16
> +var parent = document.createElement('div');
> +
> +parent.innerHTML = '<label id="label1" for="input1">text</label><input id="input1"> <label id="label2" contenteditable for="input2">text</label><input id="input2">';

Why do you do that?
Why isn't that in the markup?

> LayoutTests/fast/forms/label/labels-contenteditable.html:34
> +label1.addEventListener('keydown', function () { alert("FAIL: keydown should not be sent if the label does not have contenteditable attribute"); });
> +label1.addEventListener('keypress', function () { alert("FAIL: keypress should not be sent if the label does not have contenteditable attribute"); });
> +label1.addEventListener('keyup', function () { alert("FAIL: keyup should not be sent if the label does not have contenteditable attribute"); });
> +label1.addEventListener('focus', function () { alert("FAIL: focus should not be sent if the label does not have contenteditable attribute"); });
> +label1.addEventListener('blur', function () { alert("FAIL: blur should not be sent if the label does not have contenteditable attribute"); });
> +input1.addEventListener('focus', function () { alert("PASS: label passed the focus to the corresponding control"); });
> +label2.addEventListener('keydown', function () { alert("PASS: keydown should be sent if the label has contenteditable attribute"); });
> +label2.addEventListener('keypress', function () { alert("PASS: keypress should be sent if the label has contenteditable attribute"); });
> +label2.addEventListener('keyup', function () { alert("PASS: keyup should be sent if the label has contenteditable attribute"); });
> +label2.addEventListener('focus', function () { alert("PASS: focus should be sent if the label has contenteditable attribute"); });
> +label2.addEventListener('blur', function () { alert("PASS: blur should be sent if the label has contenteditable attribute"); });
> +input2.addEventListener('focus', function () { alert("PASS: label passed the focus to the corresponding control"); });

You should use debug() logging instead of alert().

> LayoutTests/fast/forms/resources/label-test-util.js:80
> +function mouseMoveToLabel(labelId) {
> +    var label = document.getElementById(labelId);
> +    var itemHeight = Math.floor(label.offsetHeight / label.size);
> +    var offset = 5;
> +    if (window.eventSender)
> +        eventSender.mouseMoveTo(label.offsetLeft + offset, label.offsetTop + offset - window.pageYOffset);
> +}

There is already code to do that in LayoutTest. None that you can use?

> Source/WebCore/html/HTMLLabelElement.cpp:69
> -    return false;
> +    HTMLLabelElement* that = const_cast<HTMLLabelElement*>(this);
> +    return that->isContentEditable();

This is very much non-const.

Shouldn't you instead assert there is no pending style recalc and use rendererIsEditable()???
Comment 3 Yael 2013-05-10 07:43:55 PDT
(In reply to comment #2)
> Shouldn't you instead assert there is no pending style recalc and use rendererIsEditable()???

Can you share how to decide when to assert and when to call updateStyleIfNeeded ?
Comment 4 Ahmad Saleem 2022-12-16 09:23:31 PST
Taking test from Chrome bug and then trying to type in the Label field, it does work and show "keyup" event in Safari 16.2:

Link - https://jsfiddle.net/faceleg/VBdDK/1/

Is this needed anymore? Thanks!