Commit eb1ae218 authored by Boris Yusupov's avatar Boris Yusupov Committed by Commit Bot

Implement ViewsNSWindowDelegate::windowShouldClose

This to fix application menu Close Window for mac views like
-- save info to restore closed window
-- check onbeforeunload event

Bug: 751018
Change-Id: I7a99def820f066fc1f47c3c2bae3a2abb49106ff
Reviewed-on: https://chromium-review.googlesource.com/591848
Commit-Queue: Boris Yusupov <boriay@yandex-team.ru>
Reviewed-by: default avatarTrent Apted <tapted@chromium.org>
Cr-Commit-Position: refs/heads/master@{#491457}
parent a3fd83c8
...@@ -92,6 +92,12 @@ ...@@ -92,6 +92,12 @@
parent_->OnWindowKeyStatusChangedTo(false); parent_->OnWindowKeyStatusChangedTo(false);
} }
- (BOOL)windowShouldClose:(id)sender {
views::NonClientView* nonClientView =
[self nativeWidgetMac]->GetWidget()->non_client_view();
return !nonClientView || nonClientView->CanClose();
}
- (void)windowWillClose:(NSNotification*)notification { - (void)windowWillClose:(NSNotification*)notification {
// Retain |self|. |parent_| should be cleared. OnWindowWillClose() may delete // Retain |self|. |parent_| should be cleared. OnWindowWillClose() may delete
// |parent_|, but it may also dealloc |self| before returning. However, the // |parent_|, but it may also dealloc |self| before returning. However, the
......
...@@ -915,11 +915,17 @@ class ModalDialogDelegate : public DialogDelegateView { ...@@ -915,11 +915,17 @@ class ModalDialogDelegate : public DialogDelegateView {
explicit ModalDialogDelegate(ui::ModalType modal_type) explicit ModalDialogDelegate(ui::ModalType modal_type)
: modal_type_(modal_type) {} : modal_type_(modal_type) {}
void set_can_close(bool value) { can_close_ = value; }
// WidgetDelegate: // WidgetDelegate:
ui::ModalType GetModalType() const override { return modal_type_; } ui::ModalType GetModalType() const override { return modal_type_; }
// DialogDelegate:
bool Close() override { return can_close_; }
private: private:
const ui::ModalType modal_type_; const ui::ModalType modal_type_;
bool can_close_ = true;
DISALLOW_COPY_AND_ASSIGN(ModalDialogDelegate); DISALLOW_COPY_AND_ASSIGN(ModalDialogDelegate);
}; };
...@@ -1877,6 +1883,19 @@ TEST_F(NativeWidgetMacViewsOrderTest, UnassociatedViewsIsAbove) { ...@@ -1877,6 +1883,19 @@ TEST_F(NativeWidgetMacViewsOrderTest, UnassociatedViewsIsAbove) {
]])); ]]));
} }
// Test -[NSWindowDelegate windowShouldClose:].
TEST_F(NativeWidgetMacTest, CanClose) {
ModalDialogDelegate* delegate = new ModalDialogDelegate(ui::MODAL_TYPE_NONE);
Widget* widget =
views::DialogDelegate::CreateDialogWidget(delegate, nullptr, nullptr);
NSWindow* window = widget->GetNativeWindow();
delegate->set_can_close(false);
EXPECT_FALSE([[window delegate] windowShouldClose:window]);
delegate->set_can_close(true);
EXPECT_TRUE([[window delegate] windowShouldClose:window]);
widget->CloseNow();
}
} // namespace test } // namespace test
} // namespace views } // namespace views
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment