Chromium Code Reviews| Index: chrome/browser/ui/views/website_settings/chooser_bubble_ui_view.cc |
| diff --git a/chrome/browser/ui/views/website_settings/chooser_bubble_ui_view.cc b/chrome/browser/ui/views/website_settings/chooser_bubble_ui_view.cc |
| index 9addbb159e720ef07e16f56a3dee5bbbcecc0fbe..b353782558349e96876cc6f54571a6b2bdf8ad6e 100644 |
| --- a/chrome/browser/ui/views/website_settings/chooser_bubble_ui_view.cc |
| +++ b/chrome/browser/ui/views/website_settings/chooser_bubble_ui_view.cc |
| @@ -82,8 +82,7 @@ ChooserBubbleUiViewDelegate::ChooserBubbleUiViewDelegate( |
| views::View* anchor_view, |
| views::BubbleBorder::Arrow anchor_arrow, |
| std::unique_ptr<ChooserController> chooser_controller) |
| - : views::BubbleDialogDelegateView(anchor_view, anchor_arrow), |
| - device_chooser_content_view_(nullptr) { |
| + : views::BubbleDialogDelegateView(anchor_view, anchor_arrow) { |
| // ------------------------------------ |
| // | Chooser bubble title | |
| // | -------------------------------- | |
| @@ -185,35 +184,49 @@ void ChooserBubbleUiViewDelegate::UpdateTableView() const { |
| ChooserBubbleUiView::ChooserBubbleUiView( |
| Browser* browser, |
| std::unique_ptr<ChooserController> chooser_controller) |
| - : browser_(browser), chooser_bubble_ui_view_delegate_(nullptr) { |
| + : browser_(browser) { |
| DCHECK(browser_); |
| DCHECK(chooser_controller); |
| - chooser_bubble_ui_view_delegate_ = new ChooserBubbleUiViewDelegate( |
| + bubble_view_ = new ChooserBubbleUiViewDelegate( |
| GetAnchorView(), GetAnchorArrow(), std::move(chooser_controller)); |
| } |
| ChooserBubbleUiView::~ChooserBubbleUiView() {} |
| void ChooserBubbleUiView::Show(BubbleReference bubble_reference) { |
| - chooser_bubble_ui_view_delegate_->set_bubble_reference(bubble_reference); |
| + bubble_view_->set_bubble_reference(bubble_reference); |
| // Set |parent_window| because some valid anchors can become hidden. |
| views::Widget* widget = views::Widget::GetWidgetForNativeWindow( |
| browser_->window()->GetNativeWindow()); |
| - chooser_bubble_ui_view_delegate_->set_parent_window(widget->GetNativeView()); |
| + bubble_view_->set_parent_window(widget->GetNativeView()); |
| - views::BubbleDialogDelegateView::CreateBubble( |
| - chooser_bubble_ui_view_delegate_) |
| - ->Show(); |
| - |
| - chooser_bubble_ui_view_delegate_->UpdateTableView(); |
| + views::BubbleDialogDelegateView::CreateBubble(bubble_view_)->Show(); |
| + bubble_view_->GetWidget()->AddObserver(this); |
| + bubble_view_->UpdateTableView(); |
| } |
| -void ChooserBubbleUiView::Close() {} |
| +void ChooserBubbleUiView::Close() { |
| + if (bubble_view_) { |
| + views::Widget* widget = bubble_view_->GetWidget(); |
| + if (!widget->IsClosed()) { |
|
msw
2017/03/04 03:22:59
optional nit: If you know that GetWidget will neve
Reilly Grant (use Gerrit)
2017/03/06 19:09:58
Done.
|
| + // The widget hierarchy must be destroyed synchronously by using CloseNow |
| + // because the ChooserController may hold a raw pointer to the |
| + // RenderFrameHost. See https://crbug.com/697486 for an example. |
| + widget->CloseNow(); |
| + } |
| + } |
| +} |
| void ChooserBubbleUiView::UpdateAnchorPosition() { |
| - chooser_bubble_ui_view_delegate_->UpdateAnchor(GetAnchorView(), |
| - GetAnchorArrow()); |
| + DCHECK(bubble_view_); |
| + bubble_view_->UpdateAnchor(GetAnchorView(), GetAnchorArrow()); |
| +} |
| + |
| +void ChooserBubbleUiView::OnWidgetClosing(views::Widget* widget) { |
| + DCHECK_EQ(bubble_view_->GetWidget(), widget); |
| + widget->RemoveObserver(this); |
| + bubble_view_ = nullptr; |
| } |
| views::View* ChooserBubbleUiView::GetAnchorView() { |