Closed
Bug 300057
Opened 19 years ago
Closed 16 years ago
onmouseover=alert makes browser window unusable (modal event loop issues)
Categories
(Core :: DOM: UI Events & Focus Handling, defect)
Tracking
()
RESOLVED
WORKSFORME
People
(Reporter: bugzilla, Unassigned)
References
Details
(Keywords: dataloss, regression, testcase)
Attachments
(6 files, 1 obsolete file)
Build id: Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.8b3) Gecko/20050707 Firefox/1.0+ This bug is a spinoff from Bug 297561. It's more serious on mac though. Visit testcase, after you dismiss the alert box, the entire window will not respond to any interaction. All open tabs in current window are not accessible and might result in dataloss. Note that you can open a new window (menues still work), but the current one is "dead". Steps to reproduce: 1. Go to attachment 186120 [details] 2. Hover yellow box 3. Dismiss dialog
Reporter | ||
Updated•19 years ago
|
Flags: blocking1.8b4?
Keywords: regression
Comment 1•19 years ago
|
||
Test 1. Using Tabs I got a similar reaction, but it wasn't a 'show-stopper' when using tabs. However i imagine it would be if this was an element on a page. I opened the attachment in a tab and other tabs and toolbar elements were unresponsive when individually clicking on them, however it is possible to bring up a new window and continue browsing as normal; or alternatively, closing the attached example tab. It should be noted that closing the example tab left artifacts in the previous tab: The yellow "hover me, then dismiss the dialog" box remains and there is some visual blockiness where the two tabs had been joined. The dialog that pops up when i initially tested gave me an option to cancel, i wasn't able to reproduce this dialog with the cancel option again. Test 2. New Window When opening the attached example in a new window the menu bar widgets and bookmarks bar are totally unresponsive as José has reported. I know almost nothing of java scripting, which unfortunately makes me unable to test whether this example is in any way likely to be seen in the wild.
Comment 2•19 years ago
|
||
Addendum for comment #1: Apologies, OS X 10.4.2 Deer Park Alpha 2
Comment 3•19 years ago
|
||
Josh, we need your help on this one if you can. Tracy, Zach, or Marcia can you guys help investigate this?
Assignee: events → joshmoz
Flags: blocking1.8b4? → blocking1.8b4+
Comment 4•19 years ago
|
||
Here's a better testcase that doesn't have multiple <body> tags and leaves out the css since it's not required for this to happen.
Updated•19 years ago
|
Comment 5•19 years ago
|
||
Heh, so this is what has been hosing me now and then on Mac. I had no idea what was causing it. As previously stated, once you hit this bug, a few items may work, but to have a fully functional browser you have to restart DP.
Comment 6•19 years ago
|
||
Note that this applies whenever there is an element with an onmouseover=alert property. Once the alert fires, the browser window is unusable. The element does not nessecerially have to be a div, <p> and <img> will cause the same behavior.
Summary: Dismissing alert box makes current window unaccessible → onmouseover=alert makes browser window unusable
Comment 7•19 years ago
|
||
Sorry, that last testcase still has an error in it. This one actually closes the html tag. It also causes the entire browser to lock up. The only way to restore the browser is to force quit.
Updated•19 years ago
|
Attachment #190177 -
Attachment is obsolete: true
Comment 8•19 years ago
|
||
Finding a regression window is not going to be very useful, as this was broken in 1.0. See also bug 32415.
Comment 9•19 years ago
|
||
This is a problem with modal event loops. Using ThreadViewer, I can see that sometimes we appear to fail to exit from the modal loop for the alert sheet, so on the next mouseover we end up entering another modal loop. I'll attach some stacks that show this.
Summary: onmouseover=alert makes browser window unusable → onmouseover=alert makes browser window unusable (modal event loop issues)
Comment 10•19 years ago
|
||
Comment 11•19 years ago
|
||
Comment 12•19 years ago
|
||
The problem here is that we still accept mouse move events in the content area during a modal dialog for the window (see nsMacMessagePump::DispatchEvent). Notice that the cursor changes over a link even with the sheet open. That shouldn't happen either.
Comment 13•19 years ago
|
||
Even with a working modal event filter, we still have issues here because the mac widget code hangs onto the "last wiget pointed to" in a global, so that it can send it a last MOUSE_EXIT when you move over a different window. That MOUSE_EXIT call is invoking mouseDown, and hence another nested event loop. Yuck.
Comment 14•19 years ago
|
||
This testcase has a refreshing <div> that makes things even worse.
Comment 15•19 years ago
|
||
Ugh. What a mess. With that last testcase, we recurse, making 2 appshells/modal event loops each time. Some of those are happening because the view manager is ending synthetic mouse events (from a plevent). We're not doing any plevent filtering in our modal event loop, so we're probably hosed on multiple fronts.
Comment 16•19 years ago
|
||
So, fixing this requires: 1. implementing nsWindow::ModalEventFilter() to filter out events not directed at the given window. 2. working around some stuff in mac widget that shoves the "last wiget hit" into a global (which can bypass the modal filter) 3. hardest of all, making sure that plevents are correctly filtered, which requires XP nsIEventQueue API changes. All these are risky, and this stuff has never worked anyway. I'd suggest pushing it off.
Comment 17•19 years ago
|
||
I recommend not blocking on this as well, for the reasons Simon just gave.
Flags: blocking1.8b4+ → blocking1.8b4?
Updated•19 years ago
|
Flags: blocking1.8b4? → blocking1.8b4-
Comment 18•19 years ago
|
||
I've implemented most of what is necesary to make nested plevent queues work on Mac, but that last testcase still causes Mac to recursively throw up alerts. What I don't understand is this: PresShell::DidDoReflow() (here, I think, being called because of the animated DIV in the parenet window) calls nsViewManager::SynthesizeMouseMove(), which posts a plevent to the current event queue (which will be the modal alert's event queue). That event gets processed, which tickles the "onmouseover" of the div, which throws the alert again. Why doesn't this happen on other platforms?
See bug 303484. If we made modal dialogs such as alert() and Save As() block event handlers from running in the modally disabled window(s), then this would be a lot better. I'm not sure why your mouse event is recursively firing...
Depends on: 303484
(In reply to comment #18) > PresShell::DidDoReflow() (here, I think, being called because of the animated > DIV in the parenet window) calls nsViewManager::SynthesizeMouseMove(), which > posts a plevent to the current event queue (which will be the modal alert's > event queue). That event gets processed, which tickles the "onmouseover" of the > div, which throws the alert again. > > Why doesn't this happen on other platforms? In that testcase, it does happen on other platforms.
Comment 21•19 years ago
|
||
This patch shows my direction with this. It consists of several parts: 1. In nsWindow.cpp, implementing nsWindow::ModalEventFilter() to filter out events not destined for our window, and fixing some widget* globals in the mac widget code that allowed events to leak through to widgets in other windows. 2. adding a new nsIEventQueueRegistrarService API that toolkits implement to allow then to activate and deactivate nsIEventQueues. 3. calling into the nsIEventQueueRegistrarService from nsEventQueueService when we create, push and pop event queues. 4. extending the plevent API in two ways: i) (optional) adding a void* "user data" slot that clients can use to store whatever data they want. This is actually unsued in this patch, but could replace all the hash table crap that the unix platforms have in their appshell code. ii) adding fairly generic accessors for "native data" for platforms on which PL_GetEventQueueSelectFD() isn't enough. 5. Implementing nsEventQueueRegistrarService in Mac widget to add and remove CFRunLoopSources from the main runloop to activate/deactivate the associated queues. With nsIEventQueueRegistrarService I've tried to codify the requirement that for certain platforms event queueu modaility with plevent is not automatic. The other non-windows platforms should migrate their appshell code into implementations of nsIEventQueueRegistrarService, and then we can remove the appshell spin up/spin down crap.
Comment 22•19 years ago
|
||
Could roc, dougt or someone look over the last patch and tell me if this is a reasonable approach?
Is this targeted at 1.8 or 1.9? For 1.9 I wonder whether we can get rid of multiple event queues.
Comment 24•19 years ago
|
||
This was punted on for 1.8 as being too risky, I think.
Then let's put this on ice for a while. We need to investigate whether having multiple event queues per thread is actually necessary. If we could do away with it, many problems would be solved, including this one I think.
Comment 26•19 years ago
|
||
*** Bug 318698 has been marked as a duplicate of this bug. ***
![]() |
||
Comment 27•18 years ago
|
||
Elimination of event queues is bug 326273 (and being reviewed now).
Depends on: nsIThreadManager
Reporter | ||
Updated•18 years ago
|
Flags: blocking1.9?
DoS is not a blocker.
Flags: blocking1.9? → blocking1.9-
Reporter | ||
Comment 29•17 years ago
|
||
Isn't this bug fixed? All testcases attached WFM using Firefox 3 beta 1. Using Tiger.
Reporter | ||
Comment 30•16 years ago
|
||
This bug has been WFM for a while. --> WORKSFORME
Status: NEW → RESOLVED
Closed: 16 years ago
Resolution: --- → WORKSFORME
Assignee | ||
Updated•5 years ago
|
Component: Event Handling → User events and focus handling
You need to log in
before you can comment on or make changes to this bug.
Description
•