Closed Bug 47350 Opened 25 years ago Closed 20 years ago

Current scroll position not retained, reloading or going back to multipart/x-mixed-replace

Categories

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

defect

Tracking

()

RESOLVED FIXED
Future

People

(Reporter: jrgmorrison, Assigned: hsaito54)

References

(Blocks 2 open bugs, )

Details

Attachments

(2 files, 13 obsolete files)

Overview Description: Current scroll position not retained, reloading multipart/x-mixed-replace This specific problem was noted when the general case of retaining scroll position when reloading a page became broken. The bugzilla pages are sent out with 'Content-Type: multipart/x-mixed-replace'; when you scroll down a bug list, then hit reload, the scroll position is reset to the top of the page. Steps to Reproduce: 1) Get a bugzilla bug list as the result of some query. (or use this handy-dandy simple test page http://jrgm/cgi-bin/multipart-x-mixed-replace.pl) 2) Scroll down the page some distance 3) reload the page. For those outside the netscape firewall, here is the simple perl script to set up such a test page: ---8<----------------------------------------------------------------- #!/usr/bin/perl -w # print <<"ENDOFSTREAM"; Content-Type: multipart/x-mixed-replace;boundary=thisrandomstring --thisrandomstring Content-type: text/html <p>Please stand by ... </p> --thisrandomstring Content-type: text/html <p> just a long page </p> ... and a bunch of text here to lengthen the page --thisrandomstring-- ENDOFSTREAM ---8<----------------------------------------------------------------- Actual Results: Scroll position is set to top of page upon a reload of the page. Expected Results: Scroll position should be at the same location after the reload. Reproducibility: always Build Date & Platform Bug Found: 2000072809 win95 Additional Information: Currently the general case of saving scroll position is broken (see bug 46877). This bug report is for a special case that I believe was not working all along (but corrections to that are welcome). I don't believe this bug should be addressed at all in the current schedule. This bug should be futured.
pollmann is dealing with this right now
Assignee: radha → pollmann
multipart/x-mixed-replace is not extrememly common, and we don't do anything horribly wrong in this case - just not enabling a usability feature. Moving to Future.
Status: NEW → ASSIGNED
Target Milestone: --- → Future
nav triage team: not a beta stopper.
Keywords: nsbeta1-
Fixing bug 55055, "Go Back broken for form post results", would take care of the most common case of this bug (going back from a bug to a bug list).
This bug makes browsing bugzilla bug lists very difficult - especially when viewing long buglists. It's just one of those little annoying things that bites you on a daily basis - for that reason I am nominating nsCatFood.
Keywords: nsCatFood
Bulk reassigning form bugs to Alex
Assignee: pollmann → alexsavulov
Status: ASSIGNED → NEW
*** Bug 130580 has been marked as a duplicate of this bug. ***
removed myself from CC:
*** Bug 147198 has been marked as a duplicate of this bug. ***
Is any work being done on this bug at all? It bites me everyday when I view Bugzilla daily bug report lists. I could help if someone pointed me to the source files. This bug was reported more than 2 years ago and IMHO, is quite a nuisance.
*** Bug 135080 has been marked as a duplicate of this bug. ***
Attached patch patch (obsolete) (deleted) — Splinter Review
The effect of a patch was checked by mozilla-1.2.1.
Attachment #114098 - Flags: review?(alexsavulov)
Hideo Saito, could you explain why that patch fixes this bug? Preferably in comment form in the patch? Also, please don't use a goto. Just move that code up above the current |if (x || y)| check like this: if (!x && !y) { // Code to compute new x and y } if (x || y) { // save state } You'll want to ask jkeiser@netscape.com for the review; I can do the super-review (sorta did already, earlier in this comment ;) )
Assignee: alexsavulov → saito
Attached patch patch (obsolete) (deleted) — Splinter Review
Sorry, I cannot reply clearly to why this patch fixes this bug. Scroll position of mixed multipart page is relatively made the same with the current scroll position by this patch.
Attachment #114098 - Attachment is obsolete: true
Attachment #120548 - Flags: review?(jkeiser)
Why is multipart/x-mixed-replace different from other documents with respect to scroll position restoration? Do we just not store the scroll position using our standard mechanism?
Attachment #114098 - Flags: review?(alexsavulov)
In the usual scrolling, each functions are called as follows. nsScrollBoxFrame::SaveState() nsScrollBoxFrame::RestoreState() nsScrollBoxFrame::DoLayout() In the scrolling of the mixed multipart page, nsScrollBoxFrame::SaveState() nsScrollBoxFrame::RestoreState() <- A nsScrollBoxFrame::SaveState() <- B nsScrollBoxFrame::RestoreState() nsScrollBoxFrame::DoLayout() This patch passes the scroll position of A to B.
*** Bug 156306 has been marked as a duplicate of this bug. ***
*** Bug 215687 has been marked as a duplicate of this bug. ***
I am experiencing the exact same bug on WinXP Pro. Firebird 0.7 While viewing a page such as this bug list, I will click on link to a bug then click the back button and the page scroll reverts back to the top of the page again! This is VERY annoying when dealing with long lists of links and I may discontinue using this browser if not resolved. My friend who uses the same OS and browser does not have the same problem...
Attached patch patch (obsolete) (deleted) — Splinter Review
following condition is added if true, has a multipart/mixed content + if (aPresContext->HasMultiMixedScrolling()) { if true, the scroll position of the page after restoration was reset + if (x == 0 && y == 0 && + mLastPos.x == 0 && mLastPos.y == 0 &&
Attachment #120548 - Attachment is obsolete: true
Attachment #120548 - Flags: review?(john)
So the problem arising here is because in a multipart document, each part can have an independent scroll position (and general layout state, in fact) and we have no way to identify them with our "one layout state per history entry, one history entry per load" setup.
My approach means that each part of multipart document has the same scroll position relatively, however the independent scroll position of each part will be realized in the future. this patch has an effect for dealing with long lists of bugzilla.
*** Bug 241728 has been marked as a duplicate of this bug. ***
Summary: Current scroll position not retained, reloading multipart/x-mixed-replace → Current scroll position not retained, reloading or going back to multipart/x-mixed-replace
Is this patch ready for check-in? Does it need more comments? Is it ready for submission to review and superreview?
Comment on attachment 145929 [details] [diff] [review] patch I request for review. This patch is only useful for bug list of bugzilla, because I do not have any other testcase for this bug. If this patch is not correct, please show me another testcase.
Attachment #145929 - Flags: review?(bzbarsky)
Comment on attachment 145929 [details] [diff] [review] patch This patch is just wallpaper over the issue I mention in comment 21. I'd have to do some extensive testing with multipart pages to do anything like mark review on it. I'm pretty sure it breaks cases when the parts of a page have significant delays between them, for example... In any case, I will not have that sort of time until at least after July 11.
> I request for review. This patch is only useful for bug list of bugzilla, > because I do not have any other testcase for this bug. If this patch is not > correct, please show me another testcase. > This bug is still here with 1.7 release (testing on win2k, 1280x1024x32 x 3 monitors). I am now seeing sites which worked ok with Browser-Back and don't remember position (randomly) any more. The Mozilla bug list is one that never worked and still doesn't work -- just select a bug from a longer list and click back, it almost never goes to the original scroll position. Make sure the window is _maximized_ when you do it. The odd thing is that after you press Back and the bug list gets shown at the top of the list (instead at the middle where you clicked a link to view a bug), if you click restore-window (i.e. to go from max to smaller size), the browser repositions to the correct place in the list, i.e. the position is not forgotten. It seems, from the incosistent reproducibility, this is a timing problem with the repaint, i.e. when you click Back the browser always goes into repaint from the top (it shouldn't do this anyway, it should stay where it is until ready to paint at the right place), then on some message (probably from the drawing/parsing engine when it is done) it moves to the correct scroll position. If the "done" message from the engine comes before the original paint-from-the-top is completed, the browser never goes to the newly constructed position. If you "restore" window, the browser finds "done" and paints the page at the correct position. To make things easily reproducable, one should debug by inserting and moving around, some Sleep(1000); statements, or similar, into the repaint code (especially the one which always paints at the top, following Back) to ferret out the race conditions. I think this whole strategy of refreshing and reconstructing a new page on "Back" is a bad idea in the first place. The "Back" ought to go instantly to the exaclty same document (if in cache) and same position as when the link was followed, no matter what the site's hhtp server tells the browser (like refresh to the top to see the ads again or some such). If user wishes to see the updated page, he can always click refresh. That would be, of course, user optimized behavior. The advertiser optimized behavior is to go re-fetch the latest ads and force user to scroll through the long list again. In any case, even if one thinks the "correct" behavior on the Back is to refresh, it should be a browser option so everyone can be happy (like the rolling and flashing images and other marketoid invented annoyances).
*** Bug 250684 has been marked as a duplicate of this bug. ***
> It seems, from the incosistent reproducibility, this is a timing > problem with the repaint, No. It's a problem caused by the fact that a buglist is actually two separate HTML documents sharing the same session history entry. The rest of that paragraph is based on a false premise. > I think this whole strategy of refreshing and reconstructing a new page on > "Back" is a bad idea in the first place. That's actually fairly irrelevant to this bug (and has a separate bug filed on it). Note that we do in fact get the page from the cache; it's just that we cache the HTML, not a parsed version.
Depends on: 251784
(In reply to comment #29) > > It seems, from the incosistent reproducibility, this is a timing > > problem with the repaint, > > No. It's a problem caused by the fact that a buglist is actually > two separate HTML documents sharing the same session history entry. The problem occurs even when the page is in the browser cache, i.e. no second fetch of the page from the network occurs (to check whether the page changed; I verified this with packet grabber). Take for example this page: http://cul.arxiv.org/list/hep-th/new Scroll down the list several pages, then click on some "abs" link to see the paper abstract. Then go back. No change occurs on the starting page and the browser gets it out of its cache. If you go to an "abs" and back several times, sometimes it comes back to the correct position, sometimes it goes back to the top. Interestingly, when this return-to-top occurs, if you toggle the browser window size (e.g. to "restored" size from the "max" size), the position repainted in the new window size is correct again (most of the time). That obviously has no relation with the page change at the server, it is purely an internal interaction between the painting code, html parser and the page cache. The problem has gotten worse in the latest Mozilla (1.7). This particular site used to work fine with an earlier Mozilla (1.5). And it works fine and has always worked fine with IE and Opera (the bug list works with them fine as well). Since you don't know what the problem cause is, you can't claim the race condition hypothesis is invalid unless you can show that it directly contradicts some factual behavior of the browser. As an experienced real-time network programmer looking at this problem from outside, all the symptoms point to a timing/race condition problem. The alleged claimed fixes so far seem to be merely shifting the timings randomly between different components/events and thus purely accidentally making the bug show more or less often. > > > I think this whole strategy of refreshing and reconstructing a new page on > > "Back" is a bad idea in the first place. > > That's actually fairly irrelevant to this bug (and has a separate bug > filed on it). It is relevant in the sense that if the browser had an approach to restore the exact image to the exact place, regardless of what the http told it about page change (user can always press refresh if he wishes to see whether there is a newer version; most of the time, when clicking "back" user wants to be exactly where he was when he clicked the link, so he can continue to the next link), the problem wouldn't exist. > Note that we do in fact get the page from the cache; > it's just that we cache the HTML, not a parsed version. That's where I think the problem arises. The browser, for some archaic reason repaints first the original page at the top, then (presumably after it finishes reconstructing the rest of the page) it moves down to the original place. That is a bad strategy -- it is disruptive to the user's eyeballs even when it works correctly. There is no real need to flash the old page at the top for a fraction of a second, then jump down to the right place. The browser should leave whatever is on the screen alone until it has the right stuff (at the right position) to show, then show it in one step. However intersting it may be to the developer, the end user doesn't really care to watch the phases of the drawing engine unfold in front of his eyes for the millionth time. Considering the important symptom of the correct position being recovered on resize (after it got stuck at the top), in combination with your description of the repeated reconstruction from the cached HTML, it seems that the parser module signals to the repaint module when it is done with the first visible page, the repaint module starts painting that part at the top, then parser signals when it has finished the whole page (or maybe the notifications go in many steps, one for each chunk/line completed). If at this point (of receiving the final parser completion message) the paint engine is caught wrong-footed (e.g. still painting the top of the old page) the parser done-notification is ignored or forgotten. When the initial repaint-at-the-top completes no "go to the old scroll position" is done. Now if you toggle the window size, the paint engine must be rechecking the parser status, and upon finding out the parser is done with the whole document it can go to the right place again (which it does). It could be that the check for the parser-done status is made only once at some point in the repaint-at-the-top phase and if it parser-done doesn't occur by the time of the check, no recheck and the go-to-the-correct-place is invoked.
> http://cul.arxiv.org/list/hep-th/new That's not a multipart page, so it's not this bug. If there is a problem with that page, please file a _new_ bug on it. > the bug list works with them fine as well How do you know? Bugzilla doesn't send a multipart response to either IE or Opera (IE doesn't support them at all, and Opera may not either; in any case, the bugzilla browser-sniffer sends opera the single-part version of buglists). So you're comparing apples and oranges. > Since you don't know what the problem cause is Huh? I know exactly what the problem cause is, based on tracing the program execution during a buglist load (verified in a debugger and all). I'm just not sure what a decent way to fix it is. > The alleged claimed fixes so far seem to be merely shifting the timings > randomly I'm afraid you've misunderstood the proposed patch. What it does is to attempt to scroll again if the first scroll didn't go anywhere. In the case of a multipart document in which the parts before the "last" one are all shorter than the viewport (eg bugzilla buglists), that happens to help. > if the browser had an approach to restore the exact image to the exact place If the page were an image, this would be trivial. The problem is that there is a lot more to a page than just the bitmap. Restoring the various datastructures associated with a page is a fairly non-trivial undertaking. I agree that it would eliminate the buglist issue, since it would mean we would only render the "last" part of the multipart document (whatever that means, in general). The rest of the comments, again, have nothing to do with this bug. This bug is about the fact that we're rendering _two_ separate HTML documents and only have _one_ stored scroll position. So when we render the first document we scroll to the scroll position we have stored, and then when we render the second HTML document we don't scroll. The key problem here is that we're just not storing enough data to properly restore state. (If you're interested, feel free to mail me for a reasonable description of how the parser and layout engine actually interact here.)
> The key problem here is that we're just not storing > enough data to properly restore state. I'm afraid that this is not all there is to the scroll position restore problem. You have found one among multiple causes of failed scroll restoration. Since this one is deterministic (the variable will always get overwritten on this type of document), it almost surely won't fix the wider scroll problem which does have random activation e.g. the url and the description I gave earlier produce the scroll problem erratically even when exactly the same sequence of steps is repeated (the page changes once a day and the server response is identical if you repeat the same link clicks).
(In reply to comment #32) > I'm afraid that this is not all there is to the scroll > position restore problem. indeed. but this bug is about a _specific_ problem, that only happens with x-mixed-replace. other problems should go into other bugs. feel free to file them if they are not alraedy known.
Blocks: 251784
No longer depends on: 251784
Forget it. I'm tired of the unrelated spam this bug is getting.
Comment on attachment 145929 [details] [diff] [review] patch This patch is incorrect, in my opinion, as previously described in this bug....
Attachment #145929 - Flags: review?(bzbarsky) → review-
...this is the NUMBER ONE bug keeping me from using mozilla regularly as many of my sites are long lists, news scrolls, archives, not to mention my fun sites, ahem, which are also long lists. I have been watching this bug for almost 2 years. Most of the pages i look at are not multi-part htmls like the bugzilla list, however, all the related bugs i was watching got marked as duplicates of this one after someone posted one example of a multi-part page. i don't know if the single-page scroll was fixed or not, if they are unrelated or not, but to now say "file a new bug if its not multi-part" -- especially to those of us who don't know how to fix/program anything... seems to be a large loop. caching bug http://bugzilla.mozilla.org/show_bug.cgi?id=56346 should have delt with this back, right? as the years march on, i'm not sure how, even though these 'bugs' are separate bugs, they are still related as all deal with the specific problem of caching, back, history, tables, form data, sessions, and multi-part pages. Going back today and reading all the related bugs, marked as dupes, etc., there were several problems that grow and fix as a result of dealing with another one individually without thinking about associated bugs. Might be a good time to review them and the general problem with "back" button people have had, either with caching, form data, multi-part, session times, etc. -- while they all may be separate problems, they are all 'back button' problems. no sense creating another one when fixing one. some bugs of the past: http://bugzilla.mozilla.org/show_bug.cgi?id=74639 http://bugzilla.mozilla.org/show_bug.cgi?id=56346 http://bugzilla.mozilla.org/show_bug.cgi?id=40867 i wish i could give advice or new info; i simply don't know enough to add anything meaningful to the discussion. thanks for listening. have a good day,
Attached patch patch for released mozilla-1.8a2 (obsolete) (deleted) — Splinter Review
> (From update of attachment 145929 [details] [diff] [review]) > This patch is incorrect, in my opinion, as previously described in this bug.... bzbarsky, thanks for your indication. Although a patch has a little change that is |mRestoreRect| is saved to |aPresContext|, the basic idea has not changed.
Attachment #145929 - Attachment is obsolete: true
Attached patch patch for released mozilla-1.8a3 (obsolete) (deleted) — Splinter Review
Attachment #156720 - Attachment is obsolete: true
Attachment #158492 - Flags: review?(bzbarsky)
Hideo Saito, could you please do a diff with more context and function names? Something like -up8 should do the job... Also, does this patch work right if there are more than two parts? It seems that it resets the multimixed scrolling boolean after the first part... Finally, if I have a 20-minute delay between two parts, what will be the behavior of this patch?
> Hideo Saito, could you please do a diff with more context and function names? > Something like -up8 should do the job... I will do so for next patch. > Also, does this patch work right if there are more than two parts? It seems > that it resets the multimixed scrolling boolean after the first part... I think that this patch is not right for more than two parts. However I think this problem is able to be corrected by setting multimixed scrolling boolean again when restoredRect is set. > Finally, if I have a 20-minute delay between two parts, what will be the > behavior of this patch? For example, first part page 'B' replaces current page 'A' that is second part page, and new page 'C' replaces page 'B'. If page 'A' differs from page 'C' or even if both pages are equal, the scroll position of the page 'A' is passed to page 'B' as relative scroll position by this patch.
Attached patch patch for released mozilla-1.8a3 (obsolete) (deleted) — Splinter Review
I did a diff with -pu8
Attachment #158492 - Attachment is obsolete: true
Attachment #158492 - Flags: review?(bzbarsky)
Attachment #158545 - Flags: review?(bzbarsky)
(In reply to comment #40) > I think that this patch is not right for more than two parts. Right. So why are we special-casing the two-part case? > For example, first part page 'B' replaces current page 'A' that is second part > page, and new page 'C' replaces page 'B'. > If page 'A' differs from page 'C' or even if both pages are equal, the scroll > position of the page 'A' is passed to page 'B' as relative scroll position by > this patch. I'm not following, to be truthful... Say I load a page with two parts 'A' and 'B'. I scroll halfway down part A, then part B loads. I scroll all the way to the bottom of part B. I then reload the page. Part A loads again (and part B will load 20 minutes afterwards). What should our scrolling behavior be when A loads during the reload? When B loads? What's the behavior with this patch?
Comment on attachment 158545 [details] [diff] [review] patch for released mozilla-1.8a3 Marking review- to get answers to those questions...
Attachment #158545 - Flags: review?(bzbarsky) → review-
*** Bug 259967 has been marked as a duplicate of this bug. ***
Attached patch patch (obsolete) (deleted) — Splinter Review
A few was changed. However, a basic idea does not change. That is, a scroll position is passed as a relative position. However, an original scroll position is saved if the page does not have a scroll bar. It acts as follows with loading page 'A'. ----+-+ ----+ ----+-+ |-| AAA | |-| AAA | | | AAA | | <-- keep the original position |-| | |-| ----+-+ ----+ ----+-+ reload 'A' reload 'A' reload 'A' width="400" width="100" width="1000" It acts as follows with loading page 'A' and multipart page 'B' and 'C'. ----+-+ ----+-+ ----+-+ ----+-+ |-| |-| |-| |-| AAA | | BBB | | CCC | | AAA | | <-- keep |-| |-| |-| |-| the near position ----+-+ ----+-+ ----+-+ ----+-+ reload 'A' load 'B' load 'C' load 'A' width="400" width="500" width="1000" width="500" If the page has multipart pages and the pages have scroll position, since a relative position is changed into a pixel value, don't return to the original position completely.
Attachment #158545 - Attachment is obsolete: true
> Say I load a page with two parts 'A' and 'B'. I scroll halfway down part A, > then part B loads. I scroll all the way to the bottom of part B. > I then reload the page. Part A loads again (and part B will load 20 minutes > afterwards). What should our scrolling behavior be when A loads during the reload? > When B loads? What's the behavior with this patch? I explain the behavior as follows. 1. 2. 3. 4. ----+-+ ----+-+ ----+-+ ----+-+ |-| BBB | | | | | | AAA | | |-| |-| |-| |-| | | BBB | | AAA | | ----+-+ ----+-+ ----+-+ ----+-+ part 'A' load part 'B' scroll down reload the page 5. 6. ----+-+ ----+-+ |-| |-| AAA | | BBB | | |-| |-| ----+-+ ----+-+ load part 'B' as 2. -- the initial position of the loaded part 'B' is top as 4. -- the position of the reloaded part 'A' is passed from part 'B' as 6. -- the position of the part 'B' is passed from part 'A'
Right. So why are we using the scroll position of A for part B? They're different webpages....
In 30 secs I found two dupes (sort of): https://bugzilla.mozilla.org/show_bug.cgi?id=258133 https://bugzilla.mozilla.org/show_bug.cgi?id=216376 Pressing "Back" that goes to a page that set nocache/expires headers doesn't remember the page position either...
I'm not clear if this bug has been fixed. If there is a patch that is ready for the end user, could someone point me toward the process for installing a patch on my PC.
(In reply to comment #48) > In 30 secs I found two dupes (sort of): Neither of those is a dup of this bug. > Pressing "Back" that goes to a page that set nocache/expires headers doesn't > remember the page position either... That's bug 215405 (In reply to comment #49) > I'm not clear if this bug has been fixed. If it had been, it would be marked "fixed"....
...by the way, i've been watching this forever. Just wanted to say that it has shown up for me in firefox a couple times, although not nearly as much as in mozilla (which i had to give up on). Dont know tech of why its happening or how to help, but, anyone else notice it there too? oh well......i.e. hangs on for a few sites. i'm so disappointed.
Attached patch patch (obsolete) (deleted) — Splinter Review
This approach differs from previous patches. I try to number the multipart pages at nsMultiMixedConv.cpp and this number passes to a new member mMultiMixedContentID added to a class of the nsPresContext by using nsDocShell::CreateContentViewer. If the argument aID of the function of the nsContentUtils::GenerateStateKey is not eNoID, since aID is added aSubID that is the number of multipart, each saved and restored status of the multipart pages are distinguished, though the multipart pages have same history state(nsILayoutHistoryState).
Attachment #168277 - Attachment is obsolete: true
Comment on attachment 170151 [details] [diff] [review] patch >diff -p8 -Naur ./netwerk/base/public/nsIChannel.idl.org nsIChannel is a frozen interface. I wouldn't make changes to it.... It also seems to me that this would belong better on nsIMultiPartChannel >diff -p8 -Naur ./content/base/src/nsContentUtils.cpp.org > nsContentUtils::GenerateStateKey(nsIContent* aContent, > nsIStatefulFrame::SpecialStateID aID, >- nsACString& aKey) >+ nsACString& aKey, >+ PRInt32 aSubID) Please document the new argument? And I'm not sure that's the best name for the argument.... >- KeyAppendInt(aID, aKey); >+ KeyAppendInt(aID + aSubID, aKey); This looks wrong, since it can cause ID duplication when both aID and aSubID actually differ. >diff -p8 -Naur ./docshell/base/nsDocShell.cpp.org This code could be simplified to just get the part id off the multipart channel. >--- ./layout/base/src/nsPresContext.cpp.org 2004-09-17 16:27:01.000000000 +1000 >+++ ./layout/base/src/nsPresContext.cpp 2005-01-03 23:36:02.716836800 +0900 >@@ -772,16 +772,17 @@ nsPresContext::UpdateCharSet(const nsAFl >+ mMultiMixedContentID = 0; Why? >diff -p8 -Naur ./layout/html/base/src/nsFrameManager.cpp.org >+ PRInt32 subID = presContext ? presContext->GetMultiMixedContentID() : 0; Why do you need a null-check here? >+ PRInt32 subID = presContext ? presContext->GetMultiMixedContentID() : And here? Overall, this is a much better approach. Once the details are resolved, I would be happy with reviewing it, I think.
Attachment #170151 - Flags: review-
I do think that flags can be added to nsIChannel, despite it being frozen; as long as people deal with the flag being never set by certain impls. the comment is somewhat misleading since it is not actually the uriloader which sets it
Oh, sure. But in this case there is absolutely zero need for an nsIChannel flag. Just exposing the part number on the part channel is cleaner and leads to simpler code.
Attached patch patch (obsolete) (deleted) — Splinter Review
Attachment #170151 - Attachment is obsolete: true
Attachment #170459 - Flags: review?(bzbarsky)
Comment on attachment 170459 [details] [diff] [review] patch ./netwerk/base/public/nsIMultiPartChannel.idl + * Access to the index of the multipart/mixed content. + */ + attribute PRInt32 multiMixedContentID; why not make this readonly, and to set it, pass it to the constructor?
Comment on attachment 170459 [details] [diff] [review] patch >diff -p8 -Naur ./netwerk/base/public/nsIMultiPartChannel.idl.org >+ /** >+ * Access to the index of the multipart/mixed content. >+ */ >+ attribute PRInt32 multiMixedContentID; There's nothing in this interface specific to multipart/mixed. It could just as well be used for multipart/alternative, say. I'd call that attribute partID, and clearly say that it's just guaranteed to be different for different parts of the same multipart document. I'd also make this readonly, as biesi suggests. >diff -p8 -Naur ./netwerk/streamconv/converters/nsMultiMixedConv.h.org >+ PRInt32 mMultiPartID; // actual number of the index of the multipart/mixed content Call this mCurrentPartID, please. And nix the comment -- it's more confusing than helpful. > ./netwerk/streamconv/converters/nsMultiMixedConv.cpp.org >+ PRInt32 mMultiMixedContentID; // a copy of the index of the multipart/mixed content Perhaps mPartID? And maybe document this as "unique ID that can be used to identify this part of the multipart document"? > nsPartChannel::nsPartChannel(nsIChannel *aMultipartChannel) : >+ mMultiMixedContentID = 0; Please just pass the ID to the constructor as biesi suggested. And use a C++ initializer (and use one for mMultipartChannel too?). >diff -p8 -Naur ./content/base/src/nsContentUtils.cpp.org >+static inline void KeyAppendIntWithPartID(PRInt32 aInt, nsACString& aKey, PRInt32 aMultiPartID) >+{ >+ KeyAppendInt(aInt + aMultiPartID, aKey); >+} This is wrong, as I said in comment 53. > nsContentUtils::GenerateStateKey(nsIContent* aContent, Don't you always want the state key to account for the aMultiPartID? Otherwise form controls in one part will affect those in another part, no? Which means that the part id should not be optional, btw. >diff -p8 -Naur ./docshell/base/nsDocShell.cpp.org >+ nsCOMPtr<nsIPresShell> shell; >+ rv = GetPresShell(getter_AddRefs(shell)); This seems backwards. Don't you want to QI to nsIMultiPartChannel and then only do this stuff if the QI succeeds? >+ presContext->SetMultiMixedContentID(multiMixedContentID); SetPartID please. Nothing specific to multipart/mixed about it.. >diff -p8 -Naur ./layout/base/public/nsPresContext.h.org The "a copy" comments don't really make sense. Just say that if this prescontext is for a document that's part of a multipart document, the ID can be used to distinguish it from the other parts. On a more serious note, why is this being stored in the prescontext? I'd store it in the document. There's nothing presentation-specific about the part id. >diff -p8 -Naur ./layout/base/src/nsPresContext.cpp.org Again, please use C++ initializers in constructors.
Attachment #170459 - Flags: review?(bzbarsky) → review-
Attached patch patch (obsolete) (deleted) — Splinter Review
Sorry, I can not fully understand your suggestion. Please let me know more concretely if this patch is wrong yet.
Attachment #170459 - Attachment is obsolete: true
> > nsPartChannel::nsPartChannel(nsIChannel *aMultipartChannel) : > >+ mMultiMixedContentID = 0; > Please just pass the ID to the constructor as biesi suggested. > And use a C++ initializer (and use one for mMultipartChannel too?). Sorry, I can not fully understand your suggestion. Please let me know more concretely if this patch is wrong yet.
> > Please just pass the ID to the constructor as biesi suggested. >> And use a C++ initializer (and use one for mMultipartChannel too?). > Sorry, I can not fully understand your suggestion. 1) Instead of having a SetPartID method, make the part id one of the arguments you pass to the nsPartChannel constructor. So change: nsPartChannel(nsIChannel *aMultipartChannel); to nsPartChannel(nsIChannel *aMultipartChannel, PRUint32 aPartID); (and make it an unsigned int throughout -- we don't plan to have negative part ids, do we?) 2) Instead of doing + mCurrentPartID = 0; in the nsMultiMixedConv constructor, add mCurrentPartID(0) in the right place in the initializers before the body of the constructor. Similar for other places where you're modifying constructors. Apart from that, you are now losing aID in GenerateStateKey and you didn't fix the other parts of GenerateStateKey like I said you should.
Attached patch patch (obsolete) (deleted) — Splinter Review
Attachment #170665 - Flags: review?(bzbarsky)
Attachment #170580 - Attachment is obsolete: true
nsIMultiPartChannel.idl needs a new IID
Comment on attachment 170665 [details] [diff] [review] patch >diff -p8 -Naur ./netwerk/base/public/nsIMultiPartChannel.idl.org Like biesi said, please change the IID. >+ * readonly attribute to be used for multipart/alternative. This line is really not needed. How about just: Attribute guaranteed to be different for different parts of the same multipart document. >diff -p8 -Naur ./content/base/public/nsContentUtils.h.org >+ nsIDocument *doc = aContent->GetDocument(); >+ PRUint32 partID = doc ? doc->GetPartID() : 0; >+ > // SpecialStateID case - e.g. scrollbars around the content window > // The key in this case is the special state id (always < min(contentID)) > if (nsIStatefulFrame::eNoID != aID) { >+ KeyAppendInt(partID, aKey); // first append a partID > KeyAppendInt(aID, aKey); > return NS_OK; > } > > // We must have content if we're not using a special state id > NS_ENSURE_TRUE(aContent, NS_ERROR_FAILURE); So if we're using a special state id, we can have a null aContent? But then your code crashes, doesn't it? Please check on this and either fix the new code or the old code? The rest of the patch looks fine; maybe file a followup bug on the fact that getting the document in docshell is such a chore? CC me on that bug, please.
Attachment #170665 - Flags: review?(bzbarsky) → review-
The function of nsContentUtils::GenerateStateKey is only called from ./content/html/content/src/nsGenericHTMLElement.cpp and ./layout/html/base/src/nsFrameManager.cpp. It seems that aContent is not null now. Is a following modification right? nsIDocument *doc = aContent ? aContent->GetDocument() : nsnull; PRUint32 partID = doc ? doc->GetPartID() : 0; or should partID be passed as an argument? nsContentUtils::GenerateStateKey(nsIContent* aContent, nsIStatefulFrame::SpecialStateID aID, nsACString& aKey, PRUint32 aPartID)
I'd prefer that the part id (or just the document, which is probably cleaner) got passed to the function...
Attached patch patch (obsolete) (deleted) — Splinter Review
If the content is null, the changes for nsFrameManager::CaptureFrameStateFor cause to exit from the function for the same reason as nsFrameManager::RestoreFrameStateFor.
Attachment #170665 - Attachment is obsolete: true
So... could we make up our minds here? If the aContent for GenerateStateKey must always be non-null, please document that, remove null-checks in GenerateStateKey(), change callers accordingly as this patch does? If it's allowed to be null, why are we changing CaptureFrameStateFor()? Also, please use GetCurrentDoc() instead of GetDocument() to get the document from the content.
Attached patch patch (deleted) — Splinter Review
I think that it is not necessary to exit from CaptureFrameStateFor() in the case of the context is null, because null-check of the document is done in GenerateStateKey().
Attachment #171035 - Attachment is obsolete: true
Attachment #171120 - Flags: review?(bzbarsky)
Comment on attachment 171120 [details] [diff] [review] patch r=bzbarsky, if you update the nsIMultiPartChannel iid, like biesi and I asked you to.
Attachment #171120 - Flags: superreview?(jst)
Attachment #171120 - Flags: review?(bzbarsky)
Attachment #171120 - Flags: review+
Comment on attachment 171120 [details] [diff] [review] patch - In nsIDocument.h: + void SetPartID(PRUint32 aID) { + mPartID = aID; + } + + /** + * Return the ID used to identify this part of the multipart document + */ + PRUint32 GetPartID() const { return mPartID; } Since you split the first one-line inline function onto more than one line, split this one too, and put the opening brace on its own line to follow the existing style in this file. sr=jst with that, and what bz said...
Attachment #171120 - Flags: superreview?(jst) → superreview+
Attached patch patch for checkin (obsolete) (deleted) — Splinter Review
I modified IID of nsIMultiPartChannel.idl and nsIDocument.h. Masayuki Nakano(Mozilla Japan) created new IID from vc++.
Hmm.. that patch doesn't seem to apply against a current trunk build. In particular, hunks in netwerk/streamconv/converters/nsMultiMixedConv.h, netwerk/streamconv/converters/nsMultiMixedConv.cpp, layout/html/base/src/nsFrameManager.cpp (which no longer exists, since that file was moved in the layout reorg to layout/base/nsFrameManager.cpp). Could you make the patch against a current tree? And also, change the iid of nsIDocument, please? Sorry I didn't catch that the first time through... :(
Attached patch patch for checkin (deleted) — Splinter Review
I modified IID of nsIDocument.h using source on latest-trunk. I created IID from uuidgen on Linux.
Attachment #171266 - Attachment is obsolete: true
Patch checked in for 1.8b. Hideo Saito, thank you for being persistent!
bzbarsky, I appreciate for your many advices. I regret that this solution was delayed by having persisted in the first idea.
Status: NEW → RESOLVED
Closed: 20 years ago
Resolution: --- → FIXED
Thanks for fixing this annoying bug, but it seems that when I set View -> Character Encoding -> Auto-Detect to Universal and I go back to/reload a long b.m.o. buglist, its scroll position is reset to the top of the page like in earlier releases. With View -> Character Encoding -> Auto-Detect-> (Off) (or a different character encoding) the buglist does retain its previous position. I see this with Mozilla 1.8b.
> when I set View -> Character Encoding -> Auto-Detect to Universal That's a general problem (with bugs filed on it), iirc... Not specific to buglists.
Component: History: Session → Document Navigation
QA Contact: claudius → docshell
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Creator:
Created:
Updated:
Size: