Closed
Bug 19421
Opened 26 years ago
Closed 25 years ago
No menubar on Mac -- brutal JS script sharing bug?
Categories
(SeaMonkey :: General, defect, P3)
Tracking
(Not tracked)
VERIFIED
FIXED
People
(Reporter: pierre, Assigned: brendan)
References
Details
Attachments
(2 files)
|
3.33 KB,
patch
|
Details | Diff | Splinter Review | |
|
4.21 KB,
patch
|
Details | Diff | Splinter Review |
Simon said:
From a build of around 8pm Thurs, I'm seeing a complete lack of menu bar
on Mac, even after closing the first browser window. It kinda makes the
app hard to use.
--
I confirm that the problem still exists with a build from this morning.
| Reporter | ||
Comment 1•26 years ago
|
||
If you close the first window, the menubar appears and remains for the rest of
the session even after selecting New Window.
Comment 2•26 years ago
|
||
What I'm seeing is that the OnEndDocumentLoad for navigator.xul is being called
before that for hiddenWindow.xul, which creates ordering problems for menu
contruction. No leads here yet.
Updated•26 years ago
|
Assignee: leger → saari
Comment 3•26 years ago
|
||
I think saari has a better shot at figuring this out than jan does ;)
Updated•26 years ago
|
Assignee: saari → brendan
Summary: No menubar on Mac → No menubar on Mac -- brutal JS script sharing bug?
Comment 4•26 years ago
|
||
This is looking very much like the brutal JS script sharing changes are to blame.
We are hitting the assertion at line 4589 of nsXULDocument.cpp:
NS_ASSERTION(!mCurrentScriptProto, "still loading a script when starting another
load?");
Builds from the morning of 11/18 show the problem (the day after brutal JS
sharing went in).
We suspect that the problem is that on Mac, we're doing two overlapping XUL file
loads, and that this is somehow screwing up the brutal sharing prototype
construction. The same problem would likely be apparent on Windows if you did
overlapping loads of nav.xul.
Comment 5•26 years ago
|
||
brendan sez that he'll need waterson's help to fix this; it's the same brutal
sharing problem for overlays that exists for the master document. For now, we've
disabled the brutal sharing of scripts to work arouind the problem. /be will
explain.
| Assignee | ||
Comment 6•26 years ago
|
||
Ok, here's what I think is happening, based in part on sfraser and saari's
helpful printfs:
Mac loads hiddenWindow.xul, which loads stuff including globalOverlay.xul, which
loads globalOverlay.js. It also loads navigator.xul in the first window; this
load starts some time after hiddenWindow's load has initiated, but before it has
completed, due to pseudo-threading with the filechannel worker thread and XUL
layout state-machine blocking.
The XUL code brutally shares globalOverlay.xul, and my code tries to share
globalOverlay.js, but my code didn't execute that compiled script for the racing
loser load-waiter (from navigator.xul via globalOverlay.xul), which led to the
assertbotch sfraser saw. But there's more: since the racing loser didn't go
through necko to load globalOverlay.js, no load event accounting was done for
that subdocument. I believe there was likewise no load event accounting for
globalOverlay.xul, and sfraser indeed saw the load event for navigator.xul fire
early, before the one for hiddenWindow.
That's the same problem that kept waterson and hyatt from brutally sharing the
master document (navigator.xul for two browser windows); here it's biting the
brutal sharing of an overlay (globalOverlay.xul), but the heretofore necko-based
loading of .js files hid that, and preserved load event order.
My changes of the other night, to enable brutal script sharing, exposed the
underlying bug and left the load event firing when the file worker thread said
it was done reading navigator.xul. I need waterson's help to figure out how to
fire load events from XUL code after properly accounting for layout
completion of all brutally-shared sub-documents.
/be
| Assignee | ||
Comment 7•25 years ago
|
||
Adding dependency on 18392, which wants load-event accounting for brutally
shared master XUL docs.
/be
| Assignee | ||
Comment 8•25 years ago
|
||
Comment 9•25 years ago
|
||
I don't think this is the same problem, and I don't think it should be solved
the same way as the master doc problem.
It seems like the only way this would really happen is if waterson is caching
the globalOverlay BEFORE it has actually finished parsing. In other words, the
second document (navigator.xul) must be pulling a globalOverlay.xul out of the
cache that is incomplete.
It seems like this problem could be bypassed by not allowing brutal sharing of
XUL files to occur until you know they've been fully loaded, e.g., in this
disgusting case where two docs are loaded at the same time, just let them BOTH
load globalOverlay.xul. Don't allow the overlay to be placed into the cache
until it's truly ready to be shared.
| Assignee | ||
Comment 10•25 years ago
|
||
(Tell me if we should take this to mail or a newsgroup -- I'm happy to stay in
the bug report.)
The problem is not that waterson caches globalOverlay.xul before it's complete.
He fills (nsXULPrototypeCache::PutPrototype) from nsXULDocument::EndLoad. The
problem is that when he hits the cache (gXULCache->GetPrototype in ResumeWalk),
he walks it to lay out the current (second or later) XUL document but *does not
account for load events via the usual LoadGroup mechanism*.
So as soon as the one thing going through the necko LoadGroup mechanism, the
master document, finishes, a load event fires early. That's what happened last
night with sfraser driving and me on the phone, with my changes to share script
instead of reloading when racing to load a script. Without my change, we do as
you propose: we make the losing racer reload through necko. This delays load
event firing until the .js file is fetched, which happens to be long enough for
the content iframe to be created.
But the lack of load-group-based load event accounting when hitting the cache,
whether for overlays or for the master document, is still the bug I think we
need to fix.
/be
| Assignee | ||
Comment 11•25 years ago
|
||
BTW, "this disgusting case" of racing loads for the same overlay or script file
is not uncommon: besides hiddenWindow vs. first navigator.xul load on Mac, saari
could make it happen with File / New Browser Window if he was fast enough (kbd
shortcuts would make this race even likelier -- I do Ctrl-N;Ctrl-N bang-bang
fast myself, on 4.x).
/be
Comment 12•25 years ago
|
||
*** Bug 19240 has been marked as a duplicate of this bug. ***
Comment 13•25 years ago
|
||
*** Bug 19244 has been marked as a duplicate of this bug. ***
Comment 14•25 years ago
|
||
So let me get this straight. The problem is that 2nd loader of globalOverlay.js
detects that 1st loader is already loadng this. He blocks; i.e., returns to the
main event loop, without adding first loader's URL to his document's load
group. Docloader therefore fires endload early.
If that is the case, it is indeed ugly. Here are some ideas.
1. Can we add the first doc's load to the second doc's load group? I imagine
that a URL load cannot be part of two load groups.
2. Can we expose an API on the docloader to increment the wait count?
I think I like (2) better.
| Assignee | ||
Comment 15•25 years ago
|
||
If our goal is to fix 18392 and hit the XUL prototype cache for the master doc
too, we'll want to fire nsWebShell::OnEndDocumentLoad or something like it after
walking the prototype doc-tree and sharing it brutally. In that "total cache
hit" scenario, we won't have gone through necko for anything. Will we even have
a docloader (the webshell's docloader) whose wait-count we could bump?
/be
| Assignee | ||
Comment 16•25 years ago
|
||
Comment 17•25 years ago
|
||
The patch looks good, and makes sense, but I don't see how we'll avoid firing
OnEndDocumentLoad early. We still need to tinker with the docloader, right?
| Assignee | ||
Comment 18•25 years ago
|
||
Yes, we need to tinker with the docloader when there is a master docloader who
can gate load events. When there isn't one (i.e., when we're brutally sharing
the master doc via the prototype cache), then we need a latch that closes at the
end of ResumeWalk, firing the load event from there -- right?
Hope I'm not on crack. If not, the above sounds do-able today, and I'd like to
get this fixed by tomorrow.
/be
Comment 19•25 years ago
|
||
*** Bug 19241 has been marked as a duplicate of this bug. ***
Updated•25 years ago
|
Status: ASSIGNED → RESOLVED
Closed: 25 years ago
Resolution: --- → FIXED
Comment 20•25 years ago
|
||
checked in brendan's patch, plus a ``placeholder channel'' that ensures we don't
fire the end document load prematurely.
| Assignee | ||
Comment 22•25 years ago
|
||
*** Bug 19165 has been marked as a duplicate of this bug. ***
Updated•25 years ago
|
Status: RESOLVED → VERIFIED
Comment 23•25 years ago
|
||
VERIFIED fixed for 1999112308 build
Updated•20 years ago
|
Product: Browser → Seamonkey
You need to log in
before you can comment on or make changes to this bug.
Description
•