Closed Bug 101041 Opened 23 years ago Closed 23 years ago

If you select text and then toggle list on/off/on, the next line on the page will be added to the list if selected text includes end of line

Categories

(Core :: DOM: Editor, defect, P1)

defect

Tracking

()

VERIFIED FIXED
mozilla0.9.9

People

(Reporter: TucsonTester2, Assigned: mozeditor)

Details

(Whiteboard: EDITORBASE+; FIXINHAND; need r=, sr=)

Attachments

(1 file, 2 obsolete files)

From Bugzilla Helper: User-Agent: Mozilla/5.0 (Windows; U; Win 9x 4.90; en-US; rv:0.9.4) Gecko/20010913 Netscape6/6.2 BuildID: 2001091303 If you select a line of text either by double-clicking on it with mouse or dragging the mouse through the text to the end of the line, and then click on the button for list (either bullet or number), it puts that line of text into a list. If you then click the list button to unlist, and then click the list button to list it again, it will add the next line on the page to the list. Repeatedly clicking the list button will repeatedly add the next line on the page. This does not happen if you select text on the line and do not include the end of the line. Reproducible: Always Steps to Reproduce: 1.Open a new page in composer 2.Enter three lines of text (or more) 3.Double click on the first line to highlight the entire line 4.Click on the button to make a bullet list 5.Click on the bullet list button to unlist the line of text 6.Click on the bullet list button to relist the line of text Actual Results: When you unlist in step five, it still shows just the first line of text highlighted, there is nothing to indicate that it is focused on anything beyond the first line of text. When you hit the list button to relist the line, the list will add the second line of text. If you then unlist again, both lines of text are highiighted as if you had selected them, even though you had not. And if you keep toggling list off/on, it will keep adding an additional line each time you do it. Expected Results: I would expect that if all you are doing is toggling back and forth between list and unlist, that the same lines would be used each time, I would not expect the software to decide that I wanted to add an additional line to the list. If you select the text by using shift and the right arrow key instead of the mouse, and you click the arrow key just enough to include the last character on the line, then toggling list on/off/on only effects text on the selected line. If you use shift and the right arrow key and click the arrow key just enough to include the last character on the line, and then you click the right arrow key one more time, then turning list on/off/on will pick up the next line of text, but repeatedly toggling list off and on won't pick up any additional lines beyo9nd that. The problem only occurs when selecting the entire line by double-clicking on it, or selecting the end of the line with the mouse. When faced with an on/off switch, some of us do tend to play with the switch when when undecided about whether or not to use that. Someone who does that without paying close attention may suddenly find their list is much longer than they had wished.
Confirmed on Mac OSX using build 20011003, and Win 2k using build 20011002. One thing to note, in order to reproduce this, your 3 or more lines of text have to all end in a hard return, and contain atleast one space. Otherwise, this works fine. Also, I think I have seen something like this before, and this might be a dupe, but I cannot seem to find anything else related.
Status: UNCONFIRMED → NEW
Ever confirmed: true
Hardware: PC → All
-->jfrancis
Assignee: syd → jfrancis
Status: NEW → ASSIGNED
Whiteboard: EDITORBASE; 1 day
Target Milestone: --- → mozilla0.9.7
Target Milestone: mozilla0.9.7 → mozilla0.9.8
Component: Editor: Composer → Editor: Core
P1 because lists need to be right, darn it.
Priority: -- → P1
This bug is caused by this code in nsHTMLEditRules::GetPromotedPoint : <excerpt> // if this is an inline node, // look ahead through any further inline nodes that // aren't across a <br> from us, and that are enclosed in the same block. if (!IsBlockNode(node)) { nsCOMPtr<nsIDOMNode> block = nsHTMLEditor::GetBlockNodeParent(node); nsCOMPtr<nsIDOMNode> nextNode, nextNodeBlock; res = mHTMLEditor->GetNextHTMLNode(node, address_of(nextNode)); while (nextNode && NS_SUCCEEDED(res)) { nextNodeBlock = nsHTMLEditor::GetBlockNodeParent(nextNode); if (nextNodeBlock != block) break; if (nsTextEditUtils::IsBreak(nextNode)) { node = nextNode; break; } if (IsBlockNode(nextNode)) break; node = nextNode; res = mHTMLEditor->GetNextHTMLNode(node, address_of(nextNode)); } } </excerpt>
pushing off 098 to 099
Target Milestone: mozilla0.9.8 → mozilla0.9.9
selection bug, should this go to mjudge? plussing.
Whiteboard: EDITORBASE; 1 day → EDITORBASE+; 1 day
Keywords: nsbeta1+
Attached patch patch for nsHTMLEditRules.cpp (obsolete) — Splinter Review
I tweaked GetPromotedPoint to do the right thing when the selection ends just after a BRnode. If the change looks a little complex it's because I made it work in the case where the selection is inside a text node; either at the beginning of it or inside it but with only non-rendering ws before it.
Whiteboard: EDITORBASE+; 1 day → EDITORBASE+; FINXINHAND; need r=, sr=
Whiteboard: EDITORBASE+; FINXINHAND; need r=, sr= → EDITORBASE+; FIXINHAND; need r=, sr=
first patch had the unfortunate tendency to suck
Attachment #68839 - Attachment is obsolete: true
Comment on attachment 69037 [details] [diff] [review] patch fornsHTMLEditRules.cpp, rev 2 So I was wondering what would happen if the selection ended at the beginning of a text node (as you described above) *but* with it being wrapped in an inline style. Something like: Line 1<br> <b>Line</b> 2<br> To get the selection you described I had to click in front of the 'L' on "Line 1" and then drag just before the "L" on "Line 2" ... this resulted in the selection ending in the text node on line 2 at zero offset. With your fix, listing with this selection caused it to look like this: * Line 1 * Line 2 Not quite what I'd expect. :-) I think we may need to promote the end point out to the block offset right after the br to handle this case too?
Attachment #69037 - Flags: needs-work+
Damn. I guess I will have to bite the bullet and fix this the right way. The problem with that is it's pretty ahrd and will take a while, and then we will need to test pretty heavily. The right thing to do is to take the iterating code in nsWSRunObject and generalize it, and then have both the ws code and the range promotion code use it. At least, I *think* this is the right thing. :-) good catch Kin.
Another thing I'll have to examine is what the differences are in the existing code for collapsed vs non-collapsed selections. In you example above, you expect "Line 1" to be a list, but if the selection were collapsed at the same (righthand) endpoint, you would expect a list made from "Line 2". GetPromotedPoint() doesn't know or care about the selection, so I'll have to make sure we are doing right thing before we get that far.
this bug is a bit worse than first expected. First off, the existing code makes no distinction between how it promotes collapsed vs non-collapsed selections, so I'll have to fix that. Next, we have the same problem as the original bug report, but also in the other direction. Ie, if you have several lines of body text, and you select all of one of them, ending your selection at the end of the *previous* line (ie, you selected right to left and then up to previous line end), then making a list or any other block operation will grab that prior line too, even though it looks unselected. Finally, this same problem, in both directions, also occurs with block boundaries, not just breaks. Having thought about it some more though I think there really isn't a problem (here at least) with how GetPromotedPoint works. The problem is that I have to normalize non-collapsed selections to not be trivially beyond block or br boundaries. Working on a way to do that...
This patch includes a bunch of unrelated bug fixes. sorry. i wanted to give you one that would apply. The key change for this bug is about 150 lines of new routine: nsHTMLEditRules::NormalizeSelection(). I managed to get the nsWSRunObject code to do most of the work for me, after tweaking it a bit to expose more of it's calculations to nsHTMLEditRules. Share and Enjoy and for gosh sakes, let's be Careful Out There. This fixes the original bug. It fixes kin's test case. It also fixes a related but unreported bug of getting similar weirdness when you select from end of block A through block B to beginning of block C, etc.
Attachment #69037 - Attachment is obsolete: true
fixed on tip
Status: ASSIGNED → RESOLVED
Closed: 23 years ago
Resolution: --- → FIXED
Verified on Win XP using build 02-20.
Status: RESOLVED → VERIFIED
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Creator:
Created:
Updated:
Size: