Closed Bug 54725 Opened 24 years ago Closed 22 years ago

Java does not shutdown correctly at exitting Netscape, or switching pages in frameset.

Categories

(Core Graveyard :: Java: OJI, defect, P1)

x86
Windows 98
defect

Tracking

(Not tracked)

RESOLVED WORKSFORME

People

(Reporter: teruko, Assigned: joe.chou)

References

()

Details

(Keywords: crash)

Attachments

(7 files)

When you exit Netscape after you visit java page, Java plug-in is still alive. Then, if you want to launch Netscape again, it won't launch. Steps of reproduce 1. Launch Netscape 2. Go to Java page 3. Select File|Exit 4. Try to launch Netscape again Netscape will not launch. On the right side of Window taskbar, the Java icon is there. To launch Netscape again, you need to kill the netscape process. Tested 2000-09-29-09 MN6 Win32 build.
I am unable to reproduce this on today's windows branch build 2000092908
I could reproduce this with build 2000093008 m18 build. However, this happens only if I quit the browser using the 'x' button the top right of the browser window. Quitting the browser via 'File|Exit' does not show this problem.
Nominating this for RTM.
Keywords: rtm
Re-assigning to module owner.
Assignee: drapeau → edburns
*** Bug 55461 has been marked as a duplicate of this bug. ***
Comments from Stanley Ho. On Windows 95/98/NT4/2000, starting PR3 will work okay the first time. However, after trying to exit the browser using the "X" button at the top right corner, all browser windows are closed, but the browser process remains in memory. When the users try to restart the browser again, the browser will never show up because it is stuck to communicate with the ghost deading process. This bug is pretty bad because I can reproduce it 100% of the time, and normal user won't know what's going wrong other than PR3 is not starting up after first use. However, this bug does not appear when closing the browser through the File- >Close menu. I suspect that the proper browser shutdown sequence is not called when the browser is closed using the "X" button.
a
Status: NEW → ASSIGNED
Pressing the "X" with an applet running results in the WM_DESTROY message being sent to the Plugin before nsObjectFrame::Destroy() is called, like this: CJavaPluginView::PluginWndProc(HWND__ * 0x002207e6, unsigned int 2, unsigned int 0, long 0) line 656 USER32! 77e71ab7() USER32! 77e71a77() NTDLL! 77f7624f() nsView::~nsView() line 165 nsView::`scalar deleting destructor'(unsigned int 1) + 15 bytes nsView::Destroy(nsView * const 0x10b78240) line 263 + 34 bytes nsFrame::Destroy(nsFrame * const 0x013c1330, nsIPresContext * 0x1018b5d0) line 425 nsFrameList::DestroyFrames(nsIPresContext * 0x1018b5d0) line 36 nsContainerFrame::Destroy(nsContainerFrame * const 0x0146f1fc, nsIPresContext * 0x1018b5d0) line 98 nsFrameList::DestroyFrames(nsIPresContext * 0x1018b5d0) line 36 nsContainerFrame::Destroy(nsContainerFrame * const 0x0126faa0, nsIPresContext * 0x1018b5d0) line 98 nsBoxFrame::Destroy(nsBoxFrame * const 0x0126faa0, nsIPresContext * 0x1018b5d0) line 1002 + 13 bytes nsFrameList::DestroyFrames(nsIPresContext * 0x1018b5d0) line 36 nsContainerFrame::Destroy(nsContainerFrame * const 0x0126fa10, nsIPresContext * 0x1018b5d0) line 98 nsBoxFrame::Destroy(nsBoxFrame * const 0x0126fa10, nsIPresContext * 0x1018b5d0) line 1002 + 13 bytes nsFrameList::DestroyFrames(nsIPresContext * 0x1018b5d0) line 36 nsContainerFrame::Destroy(nsContainerFrame * const 0x0126f54c, nsIPresContext * 0x1018b5d0) line 98 nsBoxFrame::Destroy(nsBoxFrame * const 0x0126f54c, nsIPresContext * 0x1018b5d0) line 1002 + 13 bytes nsFrameList::DestroyFrames(nsIPresContext * 0x1018b5d0) line 36 nsContainerFrame::Destroy(nsContainerFrame * const 0x0126eef4, nsIPresContext * 0x1018b5d0) line 98 nsBoxFrame::Destroy(nsBoxFrame * const 0x0126eef4, nsIPresContext * 0x1018b5d0) line 1002 + 13 bytes nsFrameList::DestroyFrames(nsIPresContext * 0x1018b5d0) line 36 nsContainerFrame::Destroy(nsContainerFrame * const 0x0126ee64, nsIPresContext * 0x1018b5d0) line 98 nsBoxFrame::Destroy(nsBoxFrame * const 0x0126ee64, nsIPresContext * 0x1018b5d0) line 1002 + 13 bytes nsFrameList::DestroyFrames(nsIPresContext * 0x1018b5d0) line 36 nsContainerFrame::Destroy(nsContainerFrame * const 0x0126ee28, nsIPresContext * 0x1018b5d0) line 98 ViewportFrame::Destroy(ViewportFrame * const 0x0126ee28, nsIPresContext * 0x1018b5d0) line 144 FrameManager::~FrameManager() line 405 FrameManager::`scalar deleting destructor'(unsigned int 1) + 15 bytes FrameManager::Release(FrameManager * const 0x101b3e30) line 384 + 157 bytes PresShell::~PresShell() line 1272 + 27 bytes PresShell::`scalar deleting destructor'() + 15 bytes PresShell::Release(PresShell * const 0x101b2710) line 1188 + 158 bytes nsCOMPtr<nsIPresShell>::~nsCOMPtr<nsIPresShell>() line 490 DocumentViewerImpl::~DocumentViewerImpl() line 447 + 97 bytes DocumentViewerImpl::`scalar deleting destructor'(unsigned int 1) + 15 bytes DocumentViewerImpl::Release(DocumentViewerImpl * const 0x101884b0) line 355 + 154 bytes nsCOMPtr<nsIContentViewer>::assign_assuming_AddRef(nsIContentViewer * 0x00000000) line 472 nsCOMPtr<nsIContentViewer>::assign_with_AddRef(nsISupports * 0x00000000) line 849 nsCOMPtr<nsIContentViewer>::operator=(nsIContentViewer * 0x00000000) line 584 nsDocShell::Destroy(nsDocShell * const 0x01fcd304) line 1595 nsWebShell::Destroy(nsWebShell * const 0x01fcd304) line 1393 nsXULWindow::Destroy(nsXULWindow * const 0x01fcd864) line 324 nsWebShellWindow::Destroy(nsWebShellWindow * const 0x01fcd864) line 1779 nsWebShellWindow::Close(nsWebShellWindow * const 0x01fcd8c0) line 368 nsWebShellWindow::HandleEvent(nsGUIEvent * 0x0012f63c) line 447 nsWindow::DispatchEvent(nsWindow * const 0x01fcd674, nsGUIEvent * 0x0012f63c, nsEventStatus & nsEventStatus_eIgnore) line 681 + 10 bytes nsWindow::DispatchWindowEvent(nsGUIEvent * 0x0012f63c) line 702 nsWindow::DispatchStandardEvent(unsigned int 101) line 722 + 15 bytes nsWindow::ProcessMessage(unsigned int 16, unsigned int 0, long 0, long * 0x0012f974) line 2795 nsWindow::WindowProc(HWND__ * 0x0020074a, unsigned int 16, unsigned int 0, long 0) line 950 + 27 bytes USER32! 77e71ab7() USER32! 77e71a77() NTDLL! 77f7624f() USER32! 77e71310() nsWindow::DefaultWindowProc(HWND__ * 0x0020074a, unsigned int 274, unsigned int 61536, long 3801924) line 977 USER32! 77e7288d() USER32! 77e72918() nsWindow::WindowProc(HWND__ * 0x0020074a, unsigned int 274, unsigned int 61536, long 3801924) line 957 + 31 bytes USER32! 77e71ab7() USER32! 77e71a77() NTDLL! 77f7624f() USER32! 77e71310() nsWindow::DefaultWindowProc(HWND__ * 0x0020074a, unsigned int 161, unsigned int 20, long 3801924) line 977 USER32! 77e7288d() USER32! 77e72918() nsWindow::WindowProc(HWND__ * 0x0020074a, unsigned int 161, unsigned int 20, long 3801924) line 957 + 31 bytes USER32! 77e71250() 003a0344() However, doing File->Exit causes nsObjectFrame::Destroy() to be called before the plugin gets WM_DESTROY. This is CORRECT BEHAVIOR. nsObjectFrame::Destroy(nsObjectFrame * const 0x013c11e0, nsIPresContext * 0x10fa8e90) line 332 nsLineBox::DeleteLineList(nsIPresContext * 0x10fa8e90, nsLineBox * 0x013c1a38) line 252 nsBlockFrame::Destroy(nsBlockFrame * const 0x013bbed4, nsIPresContext * 0x10fa8e90) line 1230 + 16 bytes nsLineBox::DeleteLineList(nsIPresContext * 0x10fa8e90, nsLineBox * 0x013bbf20) line 252 nsBlockFrame::Destroy(nsBlockFrame * const 0x013bbe4c, nsIPresContext * 0x10fa8e90) line 1230 + 16 bytes nsFrameList::DestroyFrames(nsIPresContext * 0x10fa8e90) line 36 nsContainerFrame::Destroy(nsContainerFrame * const 0x013bafd4, nsIPresContext * 0x10fa8e90) line 98 nsFrameList::DestroyFrames(nsIPresContext * 0x10fa8e90) line 36 nsContainerFrame::Destroy(nsContainerFrame * const 0x013bb0b4, nsIPresContext * 0x10fa8e90) line 98 nsBoxFrame::Destroy(nsBoxFrame * const 0x013bb0b4, nsIPresContext * 0x10fa8e90) line 1002 + 13 bytes nsFrameList::DestroyFrames(nsIPresContext * 0x10fa8e90) line 36 nsContainerFrame::Destroy(nsContainerFrame * const 0x013bb010, nsIPresContext * 0x10fa8e90) line 98 nsBoxFrame::Destroy(nsBoxFrame * const 0x013bb010, nsIPresContext * 0x10fa8e90) line 1002 + 13 bytes nsGfxScrollFrame::Destroy(nsGfxScrollFrame * const 0x013bb010, nsIPresContext * 0x10fa8e90) line 486 nsFrameList::DestroyFrames(nsIPresContext * 0x10fa8e90) line 36 nsContainerFrame::Destroy(nsContainerFrame * const 0x013baf98, nsIPresContext * 0x10fa8e90) line 98 ViewportFrame::Destroy(ViewportFrame * const 0x013baf98, nsIPresContext * 0x10fa8e90) line 144 FrameManager::~FrameManager() line 405 FrameManager::`scalar deleting destructor'(unsigned int 1) + 15 bytes FrameManager::Release(FrameManager * const 0x10b9a9d0) line 384 + 157 bytes PresShell::~PresShell() line 1272 + 27 bytes PresShell::`scalar deleting destructor'() + 15 bytes PresShell::Release(PresShell * const 0x10b9c270) line 1188 + 158 bytes nsCOMPtr<nsIPresShell>::~nsCOMPtr<nsIPresShell>() line 490 DocumentViewerImpl::~DocumentViewerImpl() line 447 + 97 bytes DocumentViewerImpl::`scalar deleting destructor'(unsigned int 1) + 15 bytes DocumentViewerImpl::Release(DocumentViewerImpl * const 0x10fb9210) line 355 + 154 bytes nsCOMPtr<nsIContentViewer>::assign_assuming_AddRef(nsIContentViewer * 0x00000000) line 472 nsCOMPtr<nsIContentViewer>::assign_with_AddRef(nsISupports * 0x00000000) line 849 nsCOMPtr<nsIContentViewer>::operator=(nsIContentViewer * 0x00000000) line 584 nsDocShell::Destroy(nsDocShell * const 0x10b70984) line 1595 nsWebShell::Destroy(nsWebShell * const 0x10b70984) line 1393 nsDocShell::DestroyChildren(nsDocShell * const 0x01fcd2f0) line 160 nsDocShell::Destroy(nsDocShell * const 0x01fcd304) line 1597 nsWebShell::Destroy(nsWebShell * const 0x01fcd304) line 1393 nsXULWindow::Destroy(nsXULWindow * const 0x01fcd864) line 324 nsWebShellWindow::Destroy(nsWebShellWindow * const 0x01fcd864) line 1779 nsChromeTreeOwner::Destroy(nsChromeTreeOwner * const 0x01fcef84) line 217 GlobalWindowImpl::Close(GlobalWindowImpl * const 0x1018c5c4) line 2054 nsAppShellService::Quit(nsAppShellService * const 0x00b0fe40) line 446 XPTC_InvokeByIndex(nsISupports * 0x00b0fe40, unsigned int 6, unsigned int 0, nsXPTCVariant * 0x0012dda0) line 139 nsXPCWrappedNativeClass::CallWrappedMethod(JSContext * 0x1018c3a0, nsXPCWrappedNative * 0x109dbac0, const XPCNativeMemberDescriptor * 0x109dced0, nsXPCWrappedNativeClass::CallMode CALL_METHOD, unsigned int 0, long * 0x0131cff0, long * 0x0012df54) line 913 + 43 bytes WrappedNative_CallMethod(JSContext * 0x1018c3a0, JSObject * 0x012ebe20, unsigned int 0, long * 0x0131cff0, long * 0x0012df54) line 228 + 34 bytes js_Invoke(JSContext * 0x1018c3a0, unsigned int 0, unsigned int 0) line 820 + 23 bytes js_Interpret(JSContext * 0x1018c3a0, long * 0x0012ea88) line 2621 + 15 bytes js_Invoke(JSContext * 0x1018c3a0, unsigned int 1, unsigned int 2) line 837 + 13 bytes js_InternalInvoke(JSContext * 0x1018c3a0, JSObject * 0x012ebb38, long 19839808, unsigned int 0, unsigned int 1, long * 0x0012ec20, long * 0x0012ebb0) line 909 + 20 bytes JS_CallFunctionValue(JSContext * 0x1018c3a0, JSObject * 0x012ebb38, long 19839808, unsigned int 1, long * 0x0012ec20, long * 0x0012ebb0) line 3193 + 31 bytes nsJSContext::CallEventHandler(nsJSContext * const 0x1018c550, void * 0x012ebb38, void * 0x012ebb40, unsigned int 1, void * 0x0012ec20, int * 0x0012ec1c, int 0) line 907 + 33 bytes nsJSEventListener::HandleEvent(nsIDOMEvent * 0x10fc7624) line 154 + 64 bytes nsEventListenerManager::HandleEventSubType(nsListenerStruct * 0x1095c9d0, nsIDOMEvent * 0x10fc7624, nsIDOMEventTarget * 0x10186e48, unsigned int 8, unsigned int 7) line 788 + 19 bytes nsEventListenerManager::HandleEvent(nsIPresContext * 0x1018c930, nsEvent * 0x0012f494, nsIDOMEvent * * 0x0012f41c, nsIDOMEventTarget * 0x10186e48, unsigned int 7, nsEventStatus * 0x0012f4dc) line 1670 + 39 bytes nsXULElement::HandleDOMEvent(nsXULElement * const 0x10186e40, nsIPresContext * 0x1018c930, nsEvent * 0x0012f494, nsIDOMEvent * * 0x0012f41c, unsigned int 1, nsEventStatus * 0x0012f4dc) line 3321 PresShell::HandleDOMEventWithTarget(PresShell * const 0x101b27b0, nsIContent * 0x10186e40, nsEvent * 0x0012f494, nsEventStatus * 0x0012f4dc) line 4302 + 39 bytes nsMenuFrame::Execute() line 1495 nsMenuFrame::HandleEvent(nsMenuFrame * const 0x012db154, nsIPresContext * 0x1018c930, nsGUIEvent * 0x0012f8c8, nsEventStatus * 0x0012f7b8) line 378 PresShell::HandleEventInternal(nsEvent * 0x0012f8c8, nsIView * 0x10e2fc90, unsigned int 1, nsEventStatus * 0x0012f7b8) line 4270 + 38 bytes PresShell::HandleEvent(PresShell * const 0x101b27b4, nsIView * 0x10e2fc90, nsGUIEvent * 0x0012f8c8, nsEventStatus * 0x0012f7b8, int 0, int & 1) line 4190 + 25 bytes nsView::HandleEvent(nsView * const 0x10e2fc90, nsGUIEvent * 0x0012f8c8, unsigned int 8, nsEventStatus * 0x0012f7b8, int 0, int & 1) line 379 nsView::HandleEvent(nsView * const 0x10ed18b0, nsGUIEvent * 0x0012f8c8, unsigned int 8, nsEventStatus * 0x0012f7b8, int 0, int & 1) line 352 nsView::HandleEvent(nsView * const 0x10fa6350, nsGUIEvent * 0x0012f8c8, unsigned int 8, nsEventStatus * 0x0012f7b8, int 0, int & 1) line 352 nsView::HandleEvent(nsView * const 0x101b2e40, nsGUIEvent * 0x0012f8c8, unsigned int 28, nsEventStatus * 0x0012f7b8, int 1, int & 1) line 352 nsViewManager2::DispatchEvent(nsViewManager2 * const 0x101b1040, nsGUIEvent * 0x0012f8c8, nsEventStatus * 0x0012f7b8) line 1439 HandleEvent(nsGUIEvent * 0x0012f8c8) line 68 nsWindow::DispatchEvent(nsWindow * const 0x101b2d04, nsGUIEvent * 0x0012f8c8, nsEventStatus & nsEventStatus_eIgnore) line 681 + 10 bytes nsWindow::DispatchWindowEvent(nsGUIEvent * 0x0012f8c8) line 702 nsWindow::DispatchMouseEvent(unsigned int 301, nsPoint * 0x00000000) line 3890 + 21 bytes ChildWindow::DispatchMouseEvent(unsigned int 301, nsPoint * 0x00000000) line 4100 nsWindow::ProcessMessage(unsigned int 514, unsigned int 0, long 18481204, long * 0x0012fc44) line 2960 + 24 bytes nsWindow::WindowProc(HWND__ * 0x003806e0, unsigned int 514, unsigned int 0, long 18481204) line 950 + 27 bytes
Xiaobin, can you please mark the bug assigned to you for this issue as a DUPLICATE of this bug?
*** Bug 54369 has been marked as a duplicate of this bug. ***
This bug was assigned to me by Ed.
Assignee: edburns → xiaobin.lu
Status: ASSIGNED → NEW
I am now trying to compare the difference between the File->Exit and "x" from browser. "File->Exit" definitely works fine, so we think there must somthing missing of "x". I will try to fix it as soon as possible.
Moving to P1. This bug will prevent the user from re-stating the browser if they close the browser while visiting the page with an applet.
Status: NEW → ASSIGNED
Priority: P3 → P1
Ed, I think for multiple window case, the browser works well. So, if we can find the number of windows is equal to 1, in WM_CLOSE, we can use PostQuitMessage(0).
* This method is a workaround for bug 54725. * This bug is nsObjectFrame::Destroy() is called "too late" when the * user closes the window by using the "X" in the title bar. "Too late" * means "the system sends the plugin WM_DESTROY *before* * nsObjectFrame::Destroy() is called". This bug does not occurr when * the user closes the browser by using File->Exit. * This workaround is to cause all currently running plugins to be * destroyed when a window is closed. This is heavy handed, but will * prevent a crash, and possible "ghost" process, the latter of which * will prevent the user from re-starting the browser without explicitly * killing the process. * Here is one possible scenario that will be problematic to the user, * but will, with this fix, not crash the browser: * The user has two browser windows running. Both with plugins. The * user uses the "X" to close one of the windows. This workaround will * destroy the all the plugins running in the browser. The user will * then have to reload the remaining window's page to see the plugin in * that page again.
Ed, is it possible at the point of WM_DESTROY processing to check if we have additional Navigator windows, and if so skip KillPlugins?
I tried to close the browser using "x" and "File->close"(Not "File->Exit). When I use "x" to close the browser, the CJavaPluginView::Destroy happens before the nsObjectFrame::Destroy and it stuck in a window system call(The stack trace is listed below). When I close the browser using "File->Close", nsObjectFrame::Destroy is called before CJavaPluginView::Destroy and it stucks at AWT_Toolkit::MessageLoop. When I exit the browser with an applet running using "x" button, the stack trace which makes the browser can not be shutdown is listed below: ----------------------------------------------------------------------------- 1.nsWindow::ProcessMessage(unsigned int 16, unsigned int 0, long 0, long * 0x0012f854) line 2802 2.nsWindow::WindowProc(HWND__ * 0x00640270, unsigned int 16, unsigned int 0, long 0) line 955 + 27 bytes 3.USER32! 77e148dc() 4.USER32! 77e163fb() 5.USER32! 77e1643d() 6.NTDLL! 77f9f04b() 7.USER32! 77e15b59() 8.USER32! 77e148dc() 9.USER32! 77e17ef9() 10.USER32! 77e17f75() 11.nsWindow::WindowProc(HWND__ * 0x00640270, unsigned int 274, unsigned int 61536, long 3736388) line 962 + 31 bytes 12.USER32! 77e148dc() 13.USER32! 77e163fb() 14.USER32! 77e1643d() 15.NTDLL! 77f9f04b() 16.USER32! 77e15b59() 17.USER32! 77e148dc() 18.USER32! 77e17ef9() 19.USER32! 77e17f75() 20.nsWindow::WindowProc(HWND__ * 0x00640270, unsigned int 161, unsigned int 20, long 3736388) line 962 + 31 bytes 21.USER32! 77e148dc() 22.USER32! 77e14aa7() 23.USER32! 77e266fd() 24.nsAppShellService::Run(nsAppShellService * const 0x00d19960) line 408 25.main1(int 1, char * * 0x00497788, nsISupports * 0x00000000) line 1004 + 32 bytes 26.main(int 1, char * * 0x00497788) line 1185 + 37 bytes 27.mainCRTStartup() line 338 + 17 bytes 28.KERNEL32! 77e992a6() -------------------------------------------------------------------------------- I added the line numbers to make my explaination easier. The process stucks at line 5 which is a window system call (CallWindowProc, I think). So, I modified the code in nsWindow.cpp(widget/src/windows). In function nsWindow::WindProc. if (nsnull != someWindow) { LRESULT retValue; //****This is the code I added if(msg==161 && wParam==20){ msg=16; wParam=0; lParam=0; } //****End of modification******** if (PR_TRUE == someWindow->ProcessMessage(msg, wParam, lParam, &retValue)) { return retValue; } } #if defined(STRICT) return ::CallWindowProc((WNDPROC)someWindow->GetPrevWindowProc(), hWnd, msg, wParam, lParam); #else return ::CallWindowProc((FARPROC)someWindow->GetPrevWindowProc(), hWnd, msg, wParam, lParam); #endif } Now when I traced the code, I can get rid of that window system call.But I still can not shut down the browser. And finally, it stucks at the AWT_TOOLKIT::MessageLoop. I think what we can do to fix this bug is to modified the CJavaPluginView::Destroy to get out of the message loop of AWT_Toolkit.
*** Bug 54340 has been marked as a duplicate of this bug. ***
Attached file A better solution than Exit(0) (deleted) —
The second attachment posted above actually replace the PostQuitMessage(0) with an exit(0) and the effect is to force the application exit. We thought that is not a good way to solve this bug. A better way is applied in the third attchment which essentially use a flag to exit the application. Using PostQuitMessage(0) actually generates a WM_QUIT message which is finally passed into the nsAppShell::Run and hopefully it will exit the message loop. Normally it works well. However for some reasons which currently is unclear to me, "WM_QUIT" message could not be passed into the run method. Looking into the code, I found that it used a flag called "keepGoing" which is generated by comparing msg==WM_QUIT. So instead of wasting time to compare with the message which could not be guaranteed to passed into, just setting keepGoing=0 to notify that the application would like to exit. This change needs to modify the nsAppShell and add the keepGoing as a data member. Any suggestions to this fix?
I have tested this out and it works as advertised, I am not sure about the issue with WM_QUIT though. So the fix looks good except for some clean up, keepGoing should be mKeepGoing and be a PRBool instead of int. Also, PR_TRUE/PR_FALSE should be used. With this fix, viewer on no longer exits. The following patch fixes the viewer exiting problem.
Rod, does your attachment 17644 [details] [diff] [review] fix only work for viewer? Xiaobin: I have confirmed that the fix in the 10/17/00 attachment works. I think we should petition to get this fix into the branch, not the trunk. Xiaobin: can you send mail to brendan@mozilla.org and tell him about this fix? We should, at the very least, try to get your 10/17/00 fix into the branch. This is low risk and high gain. If we get another fix, we can remove this one.
My patch should be applied in addition to "attachment (id=17623)" patch. To summerize: Patch 17623 will fix mozilla and cause viewer hang on exit, my patch (17644) when applied after 17623, will fix viewer so it no longer hangs on exit. This work was all tested on the trunk, but I see no reason why it won't work the same for the branch. Plus, viewer needs to exit properly even on branch for regression testing.
Patch looks good to me, get an r= and get it into the trunk at least. Thanks, /be
In keeping with the file's coding style it should be mKeepGoing (instead of mkeepGoing) and I say it is good to go. r=rods
Taking a quick glance at the patch it occurs to me that we should make sure that this patch does not introduce additional leaks on shutdown. The patch effectively short-circuits the processing of any events left pending in the message queue. Some of those events may be PLEvents which may be necessary to destroy the PresShell or other objects.
Kevin: Thanks for your suggestion! The fix of this bug only affects the final shutdown which means only one top window left based on my understanding. After the browser is shutdown, all the memory resources is reclaimed by the kernel. Anyway, if using PostQuitMessage(0) still can not guarantee that all the resouces will be reclaimed.
" After the browser is shutdown, all the memory resources is reclaimed by the kernel." Unfortunately, this is not always true. On WIN95 and WIN98 we will consume GDI resources if we shutdown without releasing them.
Because the quit message was inserted at the end of the message queue, all of the existing messages in the msg queue would be processed before the quit message. After the quit message there should not be an additional messages in the msg queue.
Can I change the status of this bug to fixed?
*** Bug 49247 has been marked as a duplicate of this bug. ***
A bug cannot be marked as fixed until the code is checked in. In this case into the trunk and the branch.
Summary: Java does not die at exitting Netscape → Java does shutdown correctly at exitting Netscape, or switching pages in frameset.
What is the status of this bug? Which fix should be put in the tree?
I'm not the best super-reviewer for this, it's too Windows-y. I liked what I saw last time, and it sounds like kmcclusk has proved that GDI resoures won't be leaked (?). I nominate rpotts for super-review, if he's willing. Rick, how about it? I will owe you the same in return! /be
Personally, I'd have a "warmer and fuzzier" feeling if we called PostQuitMessage() *and* set mKeepGoing=PR_FALSE in nsAppShell::Exit() I don't think that there should be any adverse effects by calling PostQuitMessage()... -- rick PS. I'm adding danm to the CC list, in case he has some insights :-)
Rick: The net effect of PostQuitMessage(0) is to generate a WM_QUIT message. But when we visit a webpage with an applet, this message is not handled very well. We are not very clear at this time why it doesn't work like this. But at least if we set mKeepGoing=PR_FALSE when the browser is shut down, the nsAppShell::Run can respond to that change very well and exit the browser right away. Actually the nsAppShell also used a flag "keepGoing" which is generated by comparing message with WM_QUIT. And we actually know when this WM_QUIT message will be generated, so instead of using PostQuitMessage(0) in nsAppShell::Quit(), using a flag to mark the application end is not a bad way. Thanks very much for your suggestion!
I've done some digging and it looks like this patch is really a band-aid which masks the real problem - the java plugin is not shutting down correctly because its window is destroyed before nsObjectFrame::Destroy() is called... In particular, this patch does not work in the embedded case - where mozilla does not own the message pump. My guess is that nsPluginInstanceOwner should be destroying the plugin when its native window gets destroyed... Right now, the plugin is only destroyed when nsObjectFrame::Destroy() is called.
I have not confirmed that GDI resources will not leak with this patch. We need to run with and with/out the patch and look at the output from bloaty. If any additional leaks result, this is a cause for concern, because in many cases this will result in GDI resource leaks. I agree with rpotts accessment. The plugin should shutdown properly without short-circuiting the message loop.
After digging on this problem, I found that it is a window multithreading problem. "Basically, Microsoft window programmers were advised that a message-queue thread spend no more than 1/10 second processing any message. Anything that take longer should be done in a different thread."(Adapted from Charles Petzold,"Programming Windows 95" Page 741, line 15). To prove that it is such a problem, I did an experiment. Add Sleep(1000) before PostQuitMessage(0)(The file is in /widget/sc/windows/nsAppShell.cpp, nsAppShell::Exit).Go to a webpage with an applet running, the browser is well shutdown. Decreasing the sleep time until 10 millisencond, the browser is shutdown well. However, if I continue decreasing the sleep time, the bug appears. Another experiment has some relationship with different applets. Go to <http://www.toptips.com>, there is an applet running there, no problem shutting down the browser( I mean, the application exits well). However, visiting a webpage <http://java.sun.com>will make the user feel embarassed. Because that webpage has two applets and it needs JavaPlugin Thread to take a long time(more than 1/10 seconds) to clean. So, it defeated the "1/10 second rule". I strongly guess that is not the problem of java plugin shutdown, except it may take more than 1/10 seconds to complete, because JavaPlugin Shutdown thread did not destroy the WM_QUIT message which is generated by PostQuitMessage(0).I have tested that WM_QUIT is correctly generated and it is put in the message queue of the main thread. So, if the nsAppShell::Run can detect that message (using PeekMessage), it should exit. However, after Java Plugin Thread did a long time clean, the PeekMessage can not detect there is a WM_QUIT message there, so it can not exit the application. Kevin: Would you like to test that patch using a flag to exit the application? I think this bug took us too long time. Your work will be greatly appreciated! Xiaobin
I tried using the patch on a branch build from yesterday. It crashes shortly after the profilemanager goes away. Without the patch it works fine. If I bring up Mozilla and avoid the profile manager I can't get a full bloaty log on exit because of some bad RDF XML. Without the patch I get a full bloat log. I think we are leaking additional objects with the patch installed so we are running across a problem dumping the additional objects. In addition, In the past, I have seen stack-traces where the presshell is destroyed as the result of PLEvent being processed, so short-circuiting the message processing would definitly cause GDI leaks in these cases.
After some discussions, it looks like the Java plug-in is entering its own message loop when it is shutting down... Unfortunately, it is removing the WM_QUIT message from the event queue and ignoring it :-( So, when we fall back into nsAppShell::Run(), rather than getting the WM_QUIT message, we fall into WaitMessage() and hang forever :-( I'm attaching a slightly different patch, which I think is less risky. Basically, the patch still calls PostQuitMessage(), but it also sets a global flag indicating that PostQuitMessage was called. Then, in nsAppShell::Run, if the global flag is set and no messages are in the message queue (ie. someone ate WM_QUIT), rather than doing a WaitMessage() and hanging the App, we exit the run loop as if WM_QUIT had been received... The advantage of this patch is twofold: 1. In the case where the Java Plugin is not present, PostQuitMessage() is still the mechanism which terminates the process. 2. If the WM_QUIT message is consumed by "someone else", all pending events in the event queue are *still* processed before nsAppShell::Run() returns. THis should insure that all PLEvents etc, have been dispatched and no leaks should occur... How does this sound? -- rick
Marking rtm+ I need some reviewers and an sr for this one :-)
Whiteboard: rtm+
It is important to remember that this is just a band-aid fix. It will not fix the shutdown hang when mozilla is embedded !! Until the Java Plug-in is fixed to *not* eat the WM_QUIT message of the application, embedded applications of mozilla will (most likely) hang on shutdown if Java is active. -- rick
As described by Rick, when this bug strikes, N 6 hangs during the shutdown, and you can't start up N6 again :-(. The fix seems very consrained in breadth, and should go into a limbo list for inclusion if time permits. The first thing is to get the set of sr and a= reviews. When you have them, please mark the bug [rtm+] so we can get it onto the limbo list RSN. Rick: After getting the reviews, can you land this on the trunk ASAP and see if there are any regressions? I'm putting in the "crash" keyword because the user perception (when the app won't re-start) is that attempts to re-start simply "crash" (i.e., you click, and the app tries to start... and then gives up). I could try "hang" or something, but the inability to start is at least as severe as any crash problems (including crash on startup).
Keywords: crash
Whiteboard: rtm+ → [rtm need info]
You'd be crazy not to fix this bug before launch. Java applets are often used in banner ad placements. There's a common scratch-it lotto applet that I've seen on many different web sites. All of these sites will stop Netscape from ever running again until the user reboots the computer. The behavior before they reboot is especially confusing, since double clicking on the icon does absolutely nothing. The user won't even be aware that Java was somehow involved. Perhaps the bug should be renamed 'Netscape 6 never runs again for no apparent reason' to express the severity of it.
Summary: Java does shutdown correctly at exitting Netscape, or switching pages in frameset. → Java does not shutdown correctly at exitting Netscape, or switching pages in frameset.
By the help of your guys, especially Rick, we have found that the "real" reason of this bug is JavaPlugin calls AtlWaitWithMessageLoop(HANDLE hEvent) during shutdown. The code is: ATLINLINE ATLAPI_(BOOL) AtlWaitWithMessageLoop(HANDLE hEvent) { DWORD dwRet; MSG msg; while(1) { dwRet = MsgWaitForMultipleObjects(1, &hEvent, FALSE, INFINITE, QS_ALLINPUT); if (dwRet == WAIT_OBJECT_0) return TRUE; // The event was signaled if (dwRet != WAIT_OBJECT_0 + 1) break; // Something else happened // There is one or more window message available. Dispatch them while(PeekMessage(&msg,NULL,NULL,NULL,PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); if (WaitForSingleObject(hEvent, 0) == WAIT_OBJECT_0) return TRUE; // Event is now signaled. } } return FALSE; } In this code, it calls PeekMessage(&msg,NULL,NULL,NULL,PM_REMOVE) and it will remove the WM_QUIT message from the message queue of the main thread. So, the main message loop(/widget/src/windows/nsAppShell.cpp) will not see this message and as a result it will not shut down the browser. Based on Rick's suggestion, instead of calling AtlWaitWithMessageLoop(HANDLE hEvent), we can just call WaitForSingleObject(). Although it will lock up the UI, at this point the browser is shutting down anyway. I added a method in "XAtlWaitWithMessageLoop(HANDLE hEvent)" in natives.cpp files( plugin/oji-plugin/src/win32/core/). //-----Workaround of bug 54725---------------------------- ATLINLINE ATLAPI_(BOOL) XAtlWaitWithMessageLoop(HANDLE hEvent) { DWORD dwRet; MSG msg; while(1) { dwRet = MsgWaitForMultipleObjects(1, &hEvent, FALSE, INFINITE, QS_ALLINPUT); if (dwRet == WAIT_OBJECT_0) return TRUE; // The event was signaled if (dwRet != WAIT_OBJECT_0 + 1) break; // Something else happened if (WaitForSingleObject(hEvent, 0) == WAIT_OBJECT_0) return TRUE; // Event is now signaled. } return FALSE; } /* * Class: sun_plugin_navig_win32_PluginFrame * Method: waitEvent * Signature: (I)V */ JNIEXPORT void JNICALL Java_sun_plugin_navig_win32_PluginFrame_waitEvent (JNIEnv *env, jobject is, int handle) { #ifndef DEBUG TRACE2("Waiting event %d\n", handle); __try { #endif HANDLE waitingEvent = reinterpret_cast<HANDLE>(handle); XAtlWaitWithMessageLoop(waitingEvent); #ifndef DEBUG } __except(EXCEPTION_EXECUTE_HANDLER) { } #endif } I tested this kind of solution and it can shutdown the browser well. Unfortunately, we won't have a Java plug-in with the fix until next spring time. We would like to use Rick's patch (PostQuitMessage and falg to shutdown) as a temporary fix to this server bug. Rick: Thanks very much for your patch! Xiaobin
I reviewed rpotts modified patch and it looks good. I ran viewer and mozilla with the patch installed on the branch. Both exit normally. r=kmcclusk@netscape.com
rpotts: I don't mind the int 0/1 boolean usage, especially since it makes your patch minimal. sr=brendan@mozilla.org for branch and trunk. We should have a bug open to remove this workaround next Spring, or whenever it is possible to force users who care to upgrade to the new Java plugin. /be
marking rtm+ since the patch has been reviewed and approved. Rick, you should check this into the trunk asap. Also, you might want to produce a new branch version of the patch patch without all the additional comments, to show PDT how small this patch really is (the comments seem to be about half of the changes) (By the way, there's a typo in `reeceived...' in a comment in your patch)
Whiteboard: [rtm need info] → [rtm+]
Taking over this bug, to check the patch in...
Assignee: xiaobin.lu → rpotts
Status: ASSIGNED → NEW
This bug is in candidate limbo. We will reconsider this fix once we have a candidate in hand, but we can't take this fix before then. I'm also handing this bug off to mscott, as Rick asked that he handle the branch checkin. Since this is going into the RTM limbo, we really like this landed on the trunk asap, to watch for any/all regressions. Who will handle the trunk landing? Rick: Can you do this trunk checkin?
Assignee: rpotts → mscott
PDT marking [rtm++]. This bug is now out of limbo and approved for checkin to the branch. Please check in ASAP.
Whiteboard: [rtm+] → [rtm++]
This is now fixed on the branch and Rick already checked it into the tip.
Status: NEW → RESOLVED
Closed: 24 years ago
Resolution: --- → FIXED
I've checked the patch into the trunk... -- rick
This works fine for me on NT, but then again, it worked fine without the fix as well...
This is fixed in windows branch build 2000-10-31-14-MN6. Adding keyword: vtrunk for trunk verification.
Keywords: vtrunk
fixed on trunk too (20001120).
Status: RESOLVED → VERIFIED
Keywords: vtrunk
I'm reopening this bug because JRE 1.4.0-beta3 still causes mfcEmbed to hang on shutdown!! Mozilla works because the hack to its message pump is present :-( This *really* needs to be fixed within the java plugin !!!
Status: VERIFIED → REOPENED
Resolution: FIXED → ---
Whiteboard: [rtm++]
The steps to reproduce are the same... just use mfcEmbed instead of netscape/mozilla.
Assignee: mscott → joe.chou
Status: REOPENED → NEW
qa:pmac
QA Contact: shrir → pmac
*** Bug 122594 has been marked as a duplicate of this bug. ***
Keywords: mozilla1.0
This bug is back. JRE 1.3 and JRE 1.4. Tested to exist on W98 and W2k in Build 2002041711 (RC1). Easy reproduce. Just visit java.sun.com and let the page finish loading. Click X to exit Mozilla. Try to relaunch any browser window. Reproduces every time. I'm voting for this bug. This is a really nasty one. Users will not tolerate a browser that refuses to launch for no apparent reason.
Depends on: 66748
In order to completely fix this problem (and a host of other java bugs) we must: a) Make sure that the plugin's window is destroyed *after* the plugin has been destroyed. See comment #42. This issue is also the crux of bug #66748 b) Prevent the java plugin from dispatching PLEvents from the browser. The java plugin regularly enters the function AtlWaitWithMessageLoop(...) without pushing a new nsEventQueue. This violates mozilla's event dispatching archetecture -- which requires a new EventQueue be pushed whenever a sub-message-pump is entered. For many months now, I have been trying to raise this issue with Sun engineers... Unfortunately I have had NO success in convincing them that is a SERIOUS problem :-( So, at this point, i'm at a bit of a loss... We can fix (a) which will fix one class of java bugs.. But until we can resolve (b) as well, java will continue to behave erratically and be unstable. -- rick
In exploring this bug more I've discovered a couple of tidbits that may be helpful. Some site do now cause Moz/Java to die in memory. http://www.sandrasue2.com will exit properly while http://java.sun.com will not. If you visit a page that has no Java on it after visiting a Java site, the browser will shutdown properly. If you select File > Exit the browser will always shutdown properly (As noted in #2) Between this and Bug 100393 Moz is very nearly a Java incapable browser. ISP et. al. are not going to pickup a browser that needs this much hand holding
Which version of JRE are you guys testing with? Using JRE 1.4.0_01 or 1.4.1(not available yet), I can't reproduce the problem. By the way, 100393 has been fixed in the 1.4.0_01 release which Sun gave to Netscape last week.
I seems to depend on the Java applet that is running. One of the applets at java.sun.com also takes a very long time to initialize. I see the problem with 1.3.1_03 and 1.4.0_1. Problem is shows on W98 and W2K with MOZ 2002041711. Also note when duplicating if you are on a page with no java it will always shut down properly. Just opening the "Java Console" will not duplicate the problem.
Tried the test case (going to a java page, java.sun.com; exit browser by either file->exit or clicked on X; re-launch browser), it seemed working fine with moz099 and JRE 1.4 (recently downloaded from java.sun.com/j2se), on win2000. Reporter, could you try it again, and see what happens? (To setup JRE1.4, simply copy NPOJI140.dll to plugins directory).
Humm, I can't dupe it now either. Same Java, same build: JRE 1.4.0, RC1 2002041711 Maybe there was a problem with the Applet on the Sun page (You'd think that if anybody could get an applet right...) I haven't found any other java pages that will reliably produce this bug.
Status: NEW → RESOLVED
Closed: 24 years ago22 years ago
Resolution: --- → WORKSFORME
Tried it again with moz1.0 RC2 and JRE 1.4 on XP, and it seemed also working fine. Marking WORKSFORME.
Rick: do we want Java to push the WM_QUIT message back on to the message queue? ATLINLINE ATLAPI_(BOOL) XAtlWaitWithMessageLoop(HANDLE hEvent) { ... while(PeekMessage(&msg,NULL,NULL,NULL,PM_REMOVE)) { + if(msg.message == WM_QUIT) + { + PostOuitMessage(); + return xxx; + } TranslateMessage(&msg); DispatchMessage(&msg); if (WaitForSingleObject(hEvent, 0) == WAIT_OBJECT_0) return TRUE; // Event is now signaled.
wfm on the browser side, windows 2k, jre 1.4.0_01 (netscape branch build: 200-08-23-10-1.0).
QA Contact: pmac → petersen
Product: Core → Core Graveyard
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Creator:
Created:
Updated:
Size: