Closed Bug 13440 Opened 25 years ago Closed 25 years ago

Repaint problems when typing at the end of a document.

Categories

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

defect

Tracking

()

VERIFIED FIXED

People

(Reporter: kinmoz, Assigned: kinmoz)

Details

1. Load or create a file in the editor that fills the entire edit area with text, from top to bottom. 2. Place the cursor at the very end of the document. 3 Hit the return key. 4. Now type something. Repeat steps 3 and 4 so that the contents of the edit area begins to scroll upwards. Notice that some of the contents in the edit area begins to overlap or paint over each other? This problem does not seem to happen on Linux, but I am able to reproduce it on Mac and Windows.
Status: NEW → ASSIGNED
Target Milestone: M11
Accepting bug. Marking M11.
Here's the short description of what I think is happening: As I type at the bottom of the document, in the manner described in the bug report, the document is incrementally reflowed and the region containing the character I just typed, in this case the last line of the document, is marked as damaged. Then nsScrollFrame::DidReflow() calls nsScrollingView::ComputeScrollOffsets() to adjust the scrollbars to account for the change in the document's size. The problem here is that a call to nsScrollingView::ComputeScrollOffsets() can result in a change to the view's scroll offsets, without scrolling anything on the screen first. When it comes time to paint, the damaged/clipping regions are wrong because the document has shifted. I have a temporary fix in place that involves ComputeScrollOffsets() calling UpdateView() when it changes the view's scroll offsets: if ((dx != 0) || (dy != 0)) { if (aAdjustWidgets) AdjustChildWidgets(this, scrolledView, 0, 0, scale); mViewManager->UpdateView(scrolledView, nsnull, NS_VMREFRESH_NO_SYNC); } This seems to fix the problem. Is this the right thing to do? If this is the right thing to do, I should probably call update view with the proper damage rects instead of updating the entire view right, or is it not worth the effort? I also noticed that ComputeScrollOffsets() always changes the scroll offsets if the size of the document grows: mOffsetY = NSIntPixelsToTwips(NSTwipsToIntPixels(nscoord(((float)oldpos * mSizeY) / oldsizey), scale), p2t); ... mOffsetX = NSIntPixelsToTwips(NSTwipsToIntPixels(nscoord(((float)oldpos * mSizeX) / oldsizex), scale), p2t); Should we be doing that? That doesn't seem right to me.
Status: ASSIGNED → RESOLVED
Closed: 25 years ago
Resolution: --- → FIXED
Spoke with Troy about the fix described above. We agreed that I wouldn't check in the code that updates the entire screen. For now, I checked in a change that prevents ComputScrollOffsets() from adjusting the view's scroll offsets just because the view size grew. This fixes the problem mentioned in this bug, but there are still repaint problems that can occur like when we delete from the middle to the end of the document. I will file another bug regarding this and a description of how we think it should be fixed. Fix checked into mozilla/view/src/nsScrollingView.cpp revision 3.111: - modified nsScrollingView::ComputeScrollOffsets() so that it doesn't change the scrolled offsets just because the document size changed.
Status: RESOLVED → VERIFIED
verified in 9/16 build...the cursor is giant though...filing a separate bug..
You need to log in before you can comment on or make changes to this bug.