Closed
Bug 44147
Opened 25 years ago
Closed 25 years ago
improperly parented modal dialog in caps
Categories
(Core :: Security: CAPS, defect, P3)
Core
Security: CAPS
Tracking
()
VERIFIED
FIXED
M18
People
(Reporter: danm.moz, Assigned: security-bugs)
References
Details
(Keywords: embed, Whiteboard: [nsbeta3+])
nsNetSupportDialog should only be used as a backup plan if no other nsIPrompt
interface is available. It has been used in dozens of places because of its
seductive convenience. But it's flawed, creating modal windows that don't behave
correctly; the cause of various blanket bugs like 25684 and 39439 (both currently
considered nsbeta2+).
This problem can only be fixed by trying much harder to find a proper window to
be the modal dialog's parent. nsNetSupportDialog should be relegated to providing
backup when herculean efforts to locate the actual parent window fail for some
reason.
As an example, the cookie service has been taught to use a proper parent window
for its dialog by laboriously storing a reference to that window's nsIPrompt in
nsHTTPChannel, from which it can be extracted and passed around while processing
notification events, punting to nsNetSupportDialog only when no other choice is
available. That same sort of thing needs to be done in many more places.
One such place is nsScriptSecurityManager.cpp, CheckConfirmDialog.
Happy recipients of this bug would spread the happiness most widely if they
would start using a good nsIPrompt window. The "modal windows don't behave
nicely" bugs are being made dependent on this bug and its siblings, and will
eventually be closed as "as fixed as they're going to get" once these have all
been considered.
| Assignee | ||
Comment 1•25 years ago
|
||
Reassigning to morse, who wrote CheckConfirmDialog (I think).
Assignee: mstoltz → morse
Comment 2•25 years ago
|
||
I may have written that dialog for my own module, but I have no idea of how it
is used in your module. The problem is not with the dialog but with finding a
window for it and that is module-specific. Reassigning back to mstoltz.
Assignee: morse → mstoltz
Yes -- it would be fairly easy to add a parameter to CheckConfirmDialog, giving
it for its use an nsIPrompt that corresponds to the actual (browser) window
involved. Steve could do that. The real issue is getting that nsIPrompt, which is
more a problem of the module calling CheckConfirmDialog.
Comment 6•25 years ago
|
||
Because of the use of nsCommonDialogs, or the use of the nsIPrompt service, this
component can not be used for embedding. Adding the embedding keyword.
How To Bring Up A Modal Dialog:
You need to know what window you want to have modality against. This will be a
nsIDOMWindow. Using a magic "hidden" window breaks modality and embedding
application may not have this hack. One you have the parent DOMWindow, you
simply:
nsCOMPtr<nsIPrompt> prompter;
aDOMWinow->GetPrompt(getter_AddRefs(prompter));
if (prompter)
prompter->
Any other way that you try to bring up a dialog may not work in an embedding
application. To reiterate, do not use the nsICommonDialogs interface -or- a
nsIPrompt service if you want your component in a non-seamonkey app.
I don't have a DOMWindow?!
If you don't have a DOMWindow, you need to get one. Just about every place I
saw that used the hidden window, could have used the real parent window with
some work. There really is no place in the code where we should be displaying a
modal dialog without knowing what parent window we are modal against. If you
find a case where you don't have a top level window, lets talk.
Keywords: embed
| Assignee | ||
Comment 9•25 years ago
|
||
Fix checked in.
Status: ASSIGNED → RESOLVED
Closed: 25 years ago
Resolution: --- → FIXED
You need to log in
before you can comment on or make changes to this bug.
Description
•