Merge pull request #276 from atom/quitting-unresponsive

Fix emitting unresponsive event when closing window
This commit is contained in:
Cheng Zhao 2014-05-09 13:33:39 +08:00
commit 42c2f87217

View file

@ -313,11 +313,11 @@ void NativeWindow::CloseWebContents() {
} }
// Assume the window is not responding if it doesn't cancel the close and is // Assume the window is not responding if it doesn't cancel the close and is
// not closed in 10s, in this way we can quickly show the unresponsive // not closed in 5s, in this way we can quickly show the unresponsive
// dialog when the window is busy executing some script withouth waiting for // dialog when the window is busy executing some script withouth waiting for
// the unresponsive timeout. // the unresponsive timeout.
if (window_unresposive_closure_.IsCancelled()) if (window_unresposive_closure_.IsCancelled())
ScheduleUnresponsiveEvent(10000); ScheduleUnresponsiveEvent(5000);
if (web_contents->NeedToFireBeforeUnload()) if (web_contents->NeedToFireBeforeUnload())
web_contents->GetRenderViewHost()->FirePageBeforeUnload(false); web_contents->GetRenderViewHost()->FirePageBeforeUnload(false);
@ -404,11 +404,12 @@ void NativeWindow::BeforeUnloadFired(content::WebContents* tab,
bool* proceed_to_fire_unload) { bool* proceed_to_fire_unload) {
*proceed_to_fire_unload = proceed; *proceed_to_fire_unload = proceed;
if (!proceed) if (!proceed) {
WindowList::WindowCloseCancelled(this); WindowList::WindowCloseCancelled(this);
// When the "beforeunload" callback is fired the window is certainly live. // Cancel unresponsive event when window close is cancelled.
window_unresposive_closure_.Cancel(); window_unresposive_closure_.Cancel();
}
} }
void NativeWindow::RequestToLockMouse(content::WebContents* web_contents, void NativeWindow::RequestToLockMouse(content::WebContents* web_contents,
@ -457,8 +458,12 @@ bool NativeWindow::IsPopupOrPanel(const content::WebContents* source) const {
void NativeWindow::RendererUnresponsive(content::WebContents* source) { void NativeWindow::RendererUnresponsive(content::WebContents* source) {
// Schedule the unresponsive shortly later, since we may receive the // Schedule the unresponsive shortly later, since we may receive the
// responsive event soon. // responsive event soon. This could happen after the whole application had
// This could happen after the whole application had blocked for a while. // blocked for a while.
// Also notice that when closing this event would be ignored because we have
// explicity started a close timeout counter. This is on purpose because we
// don't want the unresponsive event to be sent too early when user is closing
// the window.
ScheduleUnresponsiveEvent(50); ScheduleUnresponsiveEvent(50);
} }
@ -556,6 +561,9 @@ void NativeWindow::DevToolsAppendToFile(const std::string& url,
} }
void NativeWindow::ScheduleUnresponsiveEvent(int ms) { void NativeWindow::ScheduleUnresponsiveEvent(int ms) {
if (!window_unresposive_closure_.IsCancelled())
return;
window_unresposive_closure_.Reset( window_unresposive_closure_.Reset(
base::Bind(&NativeWindow::NotifyWindowUnresponsive, base::Bind(&NativeWindow::NotifyWindowUnresponsive,
weak_factory_.GetWeakPtr())); weak_factory_.GetWeakPtr()));
@ -568,7 +576,7 @@ void NativeWindow::ScheduleUnresponsiveEvent(int ms) {
void NativeWindow::NotifyWindowUnresponsive() { void NativeWindow::NotifyWindowUnresponsive() {
window_unresposive_closure_.Cancel(); window_unresposive_closure_.Cancel();
if (!HasModalDialog()) if (!is_closed_ && !HasModalDialog())
FOR_EACH_OBSERVER(NativeWindowObserver, FOR_EACH_OBSERVER(NativeWindowObserver,
observers_, observers_,
OnRendererUnresponsive()); OnRendererUnresponsive());