RESOLVED FIXED 4003
contentEditable div cannot be edited if it starts out with empty or <p/>
https://bugs.webkit.org/show_bug.cgi?id=4003
Summary contentEditable div cannot be edited if it starts out with empty or <p/>
Dan Wood
Reported 2005-07-14 12:21:22 PDT
If you have a div that is marked contentEditable, but it does not contain some visible characters in it -- e.g. it's empty of just <p /> in it -- then you can't actually get an insertion point to edit text in the field Steps to reproduce: See attached test case.
Attachments
Simple test case showing inability to start editing div when it's empty (660 bytes, text/html)
2005-07-14 12:22 PDT, Dan Wood
no flags
editable div test: empty vs. white space (405 bytes, text/html)
2005-11-19 07:04 PST, Dan Wood
no flags
Patch for a contentEditable div containing only whitespace (893 bytes, patch)
2005-11-19 14:06 PST, Graham Dennis
no flags
patch 2 (2.16 KB, patch)
2005-12-01 02:53 PST, Graham Dennis
no flags
patch 3a (3.55 KB, patch)
2005-12-01 19:51 PST, Graham Dennis
no flags
patch 3b (2.54 KB, patch)
2005-12-01 19:51 PST, Graham Dennis
justin.garcia: review+
Dan Wood
Comment 1 2005-07-14 12:22:28 PDT
Created attachment 2965 [details] Simple test case showing inability to start editing div when it's empty
David Storey
Comment 2 2005-07-19 14:52:32 PDT
confirmed on 10.3.9
Mark Rowe (bdash)
Comment 3 2005-08-07 05:36:31 PDT
Confirmed with ToT WebKit.
Justin Garcia
Comment 4 2005-11-17 22:57:36 PST
The VisiblePosition created and returned in positionForCoordinates is outside the editable div that was clicked. I thought that this bug would be fixed by my patch for 5354 but it isn't. In the test case, the div has a renderer and height of 22, and has rendered child, the p. The p doesn't have a height. Neither [p, 0] or [div, 0] return true from isCandidate(), so visibleposition::init leaves the div and uses the next visibleposition, which is the start of the next paragraph. I think the fix should be in isCandidate().
Graham Dennis
Comment 5 2005-11-19 03:14:48 PST
What exactly is correct behaviour for the second case where there is a <p /> in the div? Should the insertion point be placed before the <p />, in the <p></p>, or after the <p />? I've had a bit of a play with this, but I'm not sure which is right. So far, I've got the first two cases to work, but with graphics bugs.
Dan Wood
Comment 6 2005-11-19 07:04:23 PST
Created attachment 4732 [details] editable div test: empty vs. white space Additional test case contrasting an editable div that is truly empty with an editable div that has some whitespace in it
Dan Wood
Comment 7 2005-11-19 07:09:08 PST
(In reply to comment #5) A good question that I don't have an answer to. My main concern in this bug report is how to edit a div when just an empty paragraph or nbsp is in it (which, after some more investigation, is also a problem if you have *any* "blank" content such as a space or newline in your source). There was some discussion on this on #webkit yesterday, mostly about whether you can get a carat if the element has no dimensions. With an empty <p />, it has no dimensions -- though the enclosing <div> does. I noticed that if you just specify a div to be contentEditable, it seems to pick up some automatic min-height behavior (see my second attachment for an example, vs. my first attachment, where I specified explicit min-heights). Clearly the tricky case is what to do if you have a no-dimension entity like the middle paragraph here: <p>first paragraph</p> <p /> <p>third paragraph</p>
Graham Dennis
Comment 8 2005-11-19 14:06:31 PST
Created attachment 4735 [details] Patch for a contentEditable div containing only whitespace This patch builds on the one for 5354, and for a div with no renderable children (contains only whitespace, no <p />, etc), puts the insertion pointer at the start of the div (before the #text element). I don't know, but it might be preferable to set the insertion pointer in the #text element.
Graham Dennis
Comment 9 2005-12-01 02:53:54 PST
Created attachment 4892 [details] patch 2 This sets the cursor at the div node for both the whitespace and <p /> situations. The latter involves a rendering bug that appears to be a regression from the WebKit in 10.4.3
Darin Adler
Comment 10 2005-12-01 10:10:32 PST
Comment on attachment 4892 [details] patch 2 I think Justin should review this.
Justin Garcia
Comment 11 2005-12-01 13:21:56 PST
Comment on attachment 4892 [details] patch 2 This patch is great! Here are some comments: Since the next/prevIsInOriginalBlock booleans now include a check for identity with the originalBlock, it no longer makes sense for them to be named "IsIn": in what sense is A "in" A? Instead, you could do: bool nextIsOutsideOriginalBlock = !next.node()->isAncestor(originalBlock) && next.node() != originalBlock bool prevIsOutsideOriginalBlock = !prev.node()->isAncestor(originalBlock) && prev.node() != originalBlock if (nextIsOutsideOriginalBlock && !prevIsOutsideOriginalBlock && ... etc. Also, I would put hasRenderedChildrenWithHeight into a function, it would make isCandidate a little easier to read.
Graham Dennis
Comment 12 2005-12-01 19:51:05 PST
Created attachment 4900 [details] patch 3a Addressing comments. An additional function was added to RenderObject, hasChildrenWithHeight. I'll add another patch that doesn't modify RenderObject if adding a member function is a Bad Thing.
Graham Dennis
Comment 13 2005-12-01 19:51:39 PST
Created attachment 4901 [details] patch 3b Second proposed patch.
Justin Garcia
Comment 14 2005-12-02 01:02:20 PST
Comment on attachment 4901 [details] patch 3b Made some minor tweaks and landed this.
Note You need to log in before you can comment on or make changes to this bug.