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

Unified Diff: chrome/browser/ui/views/website_settings/chooser_bubble_ui_view.cc

Issue 2724903008: Force chooser bubbles to close synchronously. (Closed)
Patch Set: Address msw@'s nits. Created 3 years, 9 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/ui/views/website_settings/chooser_bubble_ui_view.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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..38fa2e26b743a524558960f3aa97e89a2d7417a7 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,46 @@ 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_ && !bubble_view_->GetWidget()->IsClosed()) {
+ // 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.
+ bubble_view_->GetWidget()->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() {
« no previous file with comments | « chrome/browser/ui/views/website_settings/chooser_bubble_ui_view.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698