Add NativeWindowObserver::OnCloseButtonClicked

This commit is contained in:
Cheng Zhao 2018-02-22 16:15:21 +09:00
parent a25b49a127
commit 66fab65a1a
7 changed files with 35 additions and 13 deletions

View file

@ -243,6 +243,14 @@ void BrowserWindow::WillDestroyNativeObject() {
} }
} }
void BrowserWindow::OnCloseButtonClicked(bool* prevent_default) {
// When user tries to close the window by clicking the close button, we do
// not close the window immediately, instead we try to close the web page
// first, and when the web page is closed the window will also be closed.
*prevent_default = true;
window_->RequestToClosePage();
}
void BrowserWindow::OnWindowClosed() { void BrowserWindow::OnWindowClosed() {
api_web_contents_->DestroyWebContents(true /* async */); api_web_contents_->DestroyWebContents(true /* async */);

View file

@ -71,6 +71,7 @@ class BrowserWindow : public mate::TrackableObject<BrowserWindow>,
// NativeWindowObserver: // NativeWindowObserver:
void WillCloseWindow(bool* prevent_default) override; void WillCloseWindow(bool* prevent_default) override;
void WillDestroyNativeObject() override; void WillDestroyNativeObject() override;
void OnCloseButtonClicked(bool* prevent_default) override;
void OnWindowClosed() override; void OnWindowClosed() override;
void OnWindowEndSession() override; void OnWindowEndSession() override;
void OnWindowBlur() override; void OnWindowBlur() override;

View file

@ -427,14 +427,6 @@ void NativeWindow::CloseFilePreview() {
} }
void NativeWindow::RequestToClosePage() { void NativeWindow::RequestToClosePage() {
bool prevent_default = false;
for (NativeWindowObserver& observer : observers_)
observer.WillCloseWindow(&prevent_default);
if (prevent_default) {
WindowList::WindowCloseCancelled(this);
return;
}
// 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 5s, 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
@ -480,6 +472,25 @@ void NativeWindow::RendererResponsive(content::WebContents* source) {
observer.OnWindowResponsive(); observer.OnWindowResponsive();
} }
void NativeWindow::NotifyWindowCloseButtonClicked() {
// First ask the observers whether we want to close.
bool prevent_default = false;
for (NativeWindowObserver& observer : observers_)
observer.WillCloseWindow(&prevent_default);
if (prevent_default) {
WindowList::WindowCloseCancelled(this);
return;
}
// Then ask the observers how should we close the window.
for (NativeWindowObserver& observer : observers_)
observer.OnCloseButtonClicked(&prevent_default);
if (prevent_default)
return;
CloseImmediately();
}
void NativeWindow::NotifyWindowClosed() { void NativeWindow::NotifyWindowClosed() {
if (is_closed_) if (is_closed_)
return; return;

View file

@ -249,6 +249,7 @@ class NativeWindow : public base::SupportsUserData,
// Public API used by platform-dependent delegates and observers to send UI // Public API used by platform-dependent delegates and observers to send UI
// related notifications. // related notifications.
void NotifyWindowCloseButtonClicked();
void NotifyWindowClosed(); void NotifyWindowClosed();
void NotifyWindowEndSession(); void NotifyWindowEndSession();
void NotifyWindowBlur(); void NotifyWindowBlur();

View file

@ -415,10 +415,7 @@ bool ScopedDisableResize::disable_resize_ = false;
} }
- (BOOL)windowShouldClose:(id)window { - (BOOL)windowShouldClose:(id)window {
// When user tries to close the window by clicking the close button, we do shell_->NotifyWindowCloseButtonClicked();
// not close the window immediately, instead we try to close the web page
// first, and when the web page is closed the window will also be closed.
shell_->RequestToClosePage();
return NO; return NO;
} }

View file

@ -37,6 +37,9 @@ class NativeWindowObserver {
// Called before the native window object is going to be destroyed. // Called before the native window object is going to be destroyed.
virtual void WillDestroyNativeObject() {} virtual void WillDestroyNativeObject() {}
// Called when closed button is clicked.
virtual void OnCloseButtonClicked(bool* prevent_default) {}
// Called when the window is closed. // Called when the window is closed.
virtual void OnWindowClosed() {} virtual void OnWindowClosed() {}

View file

@ -124,7 +124,8 @@ class NativeWindowClientView : public views::ClientView {
virtual ~NativeWindowClientView() {} virtual ~NativeWindowClientView() {}
bool CanClose() override { bool CanClose() override {
static_cast<NativeWindowViews*>(contents_view())->RequestToClosePage(); static_cast<NativeWindowViews*>(contents_view())->
NotifyWindowCloseButtonClicked();
return false; return false;
} }