Chromium Code Reviews| Index: ui/views/cocoa/bridged_native_widget.mm |
| diff --git a/ui/views/cocoa/bridged_native_widget.mm b/ui/views/cocoa/bridged_native_widget.mm |
| index b0ab01429cdce334feb89a25766c3dd61b38532a..f2ed000a4b5cec36f6f3552a06262888752be29c 100644 |
| --- a/ui/views/cocoa/bridged_native_widget.mm |
| +++ b/ui/views/cocoa/bridged_native_widget.mm |
| @@ -342,39 +342,23 @@ NSComparisonResult SubviewSorter(NSViewComparatorValue lhs, |
| } |
| BridgedNativeWidget::~BridgedNativeWidget() { |
| - bool close_window = false; |
| - if ([window_ delegate]) { |
| - // If the delegate is still set on a modal dialog, it means it was not |
| - // closed via [NSApplication endSheet:]. This is probably OK if the widget |
| - // was never shown. But Cocoa ignores close() calls on open sheets. Calling |
| - // endSheet: here would work, but it messes up assumptions elsewhere. E.g. |
| - // DialogClientView assumes its delegate is alive when closing, which isn't |
| - // true after endSheet: synchronously calls OnNativeWidgetDestroyed(). |
| - // So ban it. Modal dialogs should be closed via Widget::Close(). |
| - DCHECK(!native_widget_mac_->IsWindowModalSheet()); |
| - |
| - // If the delegate is still set, it means OnWindowWillClose() has not been |
| - // called and the window is still open. Usually, -[NSWindow close] would |
| - // synchronously call OnWindowWillClose() which removes the delegate and |
| - // notifies NativeWidgetMac, which then calls this with a nil delegate. |
| - // For other teardown flows (e.g. Widget::WIDGET_OWNS_NATIVE_WIDGET or |
| - // Widget::CloseNow()) the delegate must first be cleared to avoid AppKit |
| - // calling back into the bridge. This means OnWindowWillClose() needs to be |
| - // invoked manually, which is done below. |
| - // Note that if the window has children it can't be closed until the |
| - // children are gone, but removing child windows calls into AppKit for the |
| - // parent window, so the delegate must be cleared first. |
| - [window_ setDelegate:nil]; |
| - close_window = true; |
| - } |
| + // If the delegate is still set on a modal dialog, it means it was not |
| + // closed via [NSApplication endSheet:]. This is probably OK if the widget |
| + // was never shown. But Cocoa ignores close() calls on open sheets. Calling |
| + // endSheet: here would work, but it messes up assumptions elsewhere. E.g. |
| + // DialogClientView assumes its delegate is alive when closing, which isn't |
| + // true after endSheet: synchronously calls OnNativeWidgetDestroyed(). |
| + // So ban it. Modal dialogs should be closed via Widget::Close(). |
| + DCHECK(!close_window_ || !native_widget_mac_->IsWindowModalSheet()); |
| + [window_ setDelegate:nil]; |
| RemoveOrDestroyChildren(); |
| DCHECK(child_windows_.empty()); |
| SetFocusManager(nullptr); |
| SetRootView(nullptr); |
| DestroyCompositor(); |
| - if (close_window) { |
| + if (close_window_) { |
| OnWindowWillClose(); |
| [window_ close]; |
| } |
| @@ -707,7 +691,7 @@ NSComparisonResult SubviewSorter(NSViewComparatorValue lhs, |
| parent_->RemoveChildWindow(this); |
| parent_ = nullptr; |
| } |
| - [window_ setDelegate:nil]; |
| + close_window_ = false; |
| [[NSNotificationCenter defaultCenter] removeObserver:window_delegate_]; |
| native_widget_mac_->OnWindowWillClose(); |
|
tapted
2016/10/05 08:38:18
Is the problem just that NativeWidgetMac::OnWindow
|
| } |