Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(833)

Side by Side Diff: ui/views/widget/widget.cc

Issue 2844933002: Revert of Don't allow a widget to send close notifications more than once. (Closed)
Patch Set: Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | ui/views/widget/widget_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "ui/views/widget/widget.h" 5 #include "ui/views/widget/widget.h"
6 6
7 #include "base/auto_reset.h" 7 #include "base/auto_reset.h"
8 #include "base/logging.h" 8 #include "base/logging.h"
9 #include "base/macros.h" 9 #include "base/macros.h"
10 #include "base/message_loop/message_loop.h" 10 #include "base/message_loop/message_loop.h"
(...skipping 563 matching lines...) Expand 10 before | Expand all | Expand 10 after
574 } 574 }
575 575
576 void Widget::Close() { 576 void Widget::Close() {
577 if (widget_closed_) { 577 if (widget_closed_) {
578 // It appears we can hit this code path if you close a modal dialog then 578 // It appears we can hit this code path if you close a modal dialog then
579 // close the last browser before the destructor is hit, which triggers 579 // close the last browser before the destructor is hit, which triggers
580 // invoking Close again. 580 // invoking Close again.
581 return; 581 return;
582 } 582 }
583 583
584 if (non_client_view_ && !non_client_view_->CanClose()) 584 bool can_close = true;
585 return; 585 if (non_client_view_)
586 can_close = non_client_view_->CanClose();
587 if (can_close) {
588 SaveWindowPlacement();
586 589
587 // The actions below can cause this function to be called again, so mark 590 // During tear-down the top-level focus manager becomes unavailable to
588 // |this| as closed early. See crbug.com/714334 591 // GTK tabbed panes and their children, so normal deregistration via
589 widget_closed_ = true; 592 // |FormManager::ViewRemoved()| calls are fouled. We clear focus here
590 SaveWindowPlacement(); 593 // to avoid these redundant steps and to avoid accessing deleted views
594 // that may have been in focus.
595 if (is_top_level() && focus_manager_.get())
596 focus_manager_->SetFocusedView(NULL);
591 597
592 // During tear-down the top-level focus manager becomes unavailable to 598 for (WidgetObserver& observer : observers_)
593 // GTK tabbed panes and their children, so normal deregistration via 599 observer.OnWidgetClosing(this);
594 // |FocusManager::ViewRemoved()| calls are fouled. We clear focus here
595 // to avoid these redundant steps and to avoid accessing deleted views
596 // that may have been in focus.
597 if (is_top_level() && focus_manager_.get())
598 focus_manager_->SetFocusedView(nullptr);
599 600
600 for (WidgetObserver& observer : observers_) 601 native_widget_->Close();
601 observer.OnWidgetClosing(this); 602 widget_closed_ = true;
602 603 }
603 native_widget_->Close();
604 } 604 }
605 605
606 void Widget::CloseNow() { 606 void Widget::CloseNow() {
607 for (WidgetObserver& observer : observers_) 607 for (WidgetObserver& observer : observers_)
608 observer.OnWidgetClosing(this); 608 observer.OnWidgetClosing(this);
609 native_widget_->CloseNow(); 609 native_widget_->CloseNow();
610 } 610 }
611 611
612 bool Widget::IsClosed() const { 612 bool Widget::IsClosed() const {
613 return widget_closed_; 613 return widget_closed_;
(...skipping 953 matching lines...) Expand 10 before | Expand all | Expand 10 after
1567 1567
1568 //////////////////////////////////////////////////////////////////////////////// 1568 ////////////////////////////////////////////////////////////////////////////////
1569 // internal::NativeWidgetPrivate, NativeWidget implementation: 1569 // internal::NativeWidgetPrivate, NativeWidget implementation:
1570 1570
1571 internal::NativeWidgetPrivate* NativeWidgetPrivate::AsNativeWidgetPrivate() { 1571 internal::NativeWidgetPrivate* NativeWidgetPrivate::AsNativeWidgetPrivate() {
1572 return this; 1572 return this;
1573 } 1573 }
1574 1574
1575 } // namespace internal 1575 } // namespace internal
1576 } // namespace views 1576 } // namespace views
OLDNEW
« no previous file with comments | « no previous file | ui/views/widget/widget_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698