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() {
api_web_contents_->DestroyWebContents(true /* async */);

View file

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

View file

@ -427,14 +427,6 @@ void NativeWindow::CloseFilePreview() {
}
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
// 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
@ -480,6 +472,25 @@ void NativeWindow::RendererResponsive(content::WebContents* source) {
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() {
if (is_closed_)
return;

View file

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

View file

@ -415,10 +415,7 @@ bool ScopedDisableResize::disable_resize_ = false;
}
- (BOOL)windowShouldClose:(id)window {
// 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.
shell_->RequestToClosePage();
shell_->NotifyWindowCloseButtonClicked();
return NO;
}

View file

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

View file

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