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

Side by Side 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 unified diff | 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 »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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 "chrome/browser/ui/views/website_settings/chooser_bubble_ui_view.h" 5 #include "chrome/browser/ui/views/website_settings/chooser_bubble_ui_view.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <memory> 9 #include <memory>
10 10
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
75 DeviceChooserContentView* device_chooser_content_view_; 75 DeviceChooserContentView* device_chooser_content_view_;
76 BubbleReference bubble_reference_; 76 BubbleReference bubble_reference_;
77 77
78 DISALLOW_COPY_AND_ASSIGN(ChooserBubbleUiViewDelegate); 78 DISALLOW_COPY_AND_ASSIGN(ChooserBubbleUiViewDelegate);
79 }; 79 };
80 80
81 ChooserBubbleUiViewDelegate::ChooserBubbleUiViewDelegate( 81 ChooserBubbleUiViewDelegate::ChooserBubbleUiViewDelegate(
82 views::View* anchor_view, 82 views::View* anchor_view,
83 views::BubbleBorder::Arrow anchor_arrow, 83 views::BubbleBorder::Arrow anchor_arrow,
84 std::unique_ptr<ChooserController> chooser_controller) 84 std::unique_ptr<ChooserController> chooser_controller)
85 : views::BubbleDialogDelegateView(anchor_view, anchor_arrow), 85 : views::BubbleDialogDelegateView(anchor_view, anchor_arrow) {
86 device_chooser_content_view_(nullptr) {
87 // ------------------------------------ 86 // ------------------------------------
88 // | Chooser bubble title | 87 // | Chooser bubble title |
89 // | -------------------------------- | 88 // | -------------------------------- |
90 // | | option 0 | | 89 // | | option 0 | |
91 // | | option 1 | | 90 // | | option 1 | |
92 // | | option 2 | | 91 // | | option 2 | |
93 // | | | | 92 // | | | |
94 // | | | | 93 // | | | |
95 // | | | | 94 // | | | |
96 // | -------------------------------- | 95 // | -------------------------------- |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
178 177
179 void ChooserBubbleUiViewDelegate::UpdateTableView() const { 178 void ChooserBubbleUiViewDelegate::UpdateTableView() const {
180 device_chooser_content_view_->UpdateTableView(); 179 device_chooser_content_view_->UpdateTableView();
181 } 180 }
182 181
183 ////////////////////////////////////////////////////////////////////////////// 182 //////////////////////////////////////////////////////////////////////////////
184 // ChooserBubbleUiView 183 // ChooserBubbleUiView
185 ChooserBubbleUiView::ChooserBubbleUiView( 184 ChooserBubbleUiView::ChooserBubbleUiView(
186 Browser* browser, 185 Browser* browser,
187 std::unique_ptr<ChooserController> chooser_controller) 186 std::unique_ptr<ChooserController> chooser_controller)
188 : browser_(browser), chooser_bubble_ui_view_delegate_(nullptr) { 187 : browser_(browser) {
189 DCHECK(browser_); 188 DCHECK(browser_);
190 DCHECK(chooser_controller); 189 DCHECK(chooser_controller);
191 chooser_bubble_ui_view_delegate_ = new ChooserBubbleUiViewDelegate( 190 bubble_view_ = new ChooserBubbleUiViewDelegate(
192 GetAnchorView(), GetAnchorArrow(), std::move(chooser_controller)); 191 GetAnchorView(), GetAnchorArrow(), std::move(chooser_controller));
193 } 192 }
194 193
195 ChooserBubbleUiView::~ChooserBubbleUiView() {} 194 ChooserBubbleUiView::~ChooserBubbleUiView() {}
196 195
197 void ChooserBubbleUiView::Show(BubbleReference bubble_reference) { 196 void ChooserBubbleUiView::Show(BubbleReference bubble_reference) {
198 chooser_bubble_ui_view_delegate_->set_bubble_reference(bubble_reference); 197 bubble_view_->set_bubble_reference(bubble_reference);
199 198
200 // Set |parent_window| because some valid anchors can become hidden. 199 // Set |parent_window| because some valid anchors can become hidden.
201 views::Widget* widget = views::Widget::GetWidgetForNativeWindow( 200 views::Widget* widget = views::Widget::GetWidgetForNativeWindow(
202 browser_->window()->GetNativeWindow()); 201 browser_->window()->GetNativeWindow());
203 chooser_bubble_ui_view_delegate_->set_parent_window(widget->GetNativeView()); 202 bubble_view_->set_parent_window(widget->GetNativeView());
204 203
205 views::BubbleDialogDelegateView::CreateBubble( 204 views::BubbleDialogDelegateView::CreateBubble(bubble_view_)->Show();
206 chooser_bubble_ui_view_delegate_) 205 bubble_view_->GetWidget()->AddObserver(this);
207 ->Show(); 206 bubble_view_->UpdateTableView();
208
209 chooser_bubble_ui_view_delegate_->UpdateTableView();
210 } 207 }
211 208
212 void ChooserBubbleUiView::Close() {} 209 void ChooserBubbleUiView::Close() {
210 if (bubble_view_ && !bubble_view_->GetWidget()->IsClosed()) {
211 // The widget hierarchy must be destroyed synchronously by using CloseNow
212 // because the ChooserController may hold a raw pointer to the
213 // RenderFrameHost. See https://crbug.com/697486 for an example.
214 bubble_view_->GetWidget()->CloseNow();
215 }
216 }
213 217
214 void ChooserBubbleUiView::UpdateAnchorPosition() { 218 void ChooserBubbleUiView::UpdateAnchorPosition() {
215 chooser_bubble_ui_view_delegate_->UpdateAnchor(GetAnchorView(), 219 DCHECK(bubble_view_);
216 GetAnchorArrow()); 220 bubble_view_->UpdateAnchor(GetAnchorView(), GetAnchorArrow());
221 }
222
223 void ChooserBubbleUiView::OnWidgetClosing(views::Widget* widget) {
224 DCHECK_EQ(bubble_view_->GetWidget(), widget);
225 widget->RemoveObserver(this);
226 bubble_view_ = nullptr;
217 } 227 }
218 228
219 views::View* ChooserBubbleUiView::GetAnchorView() { 229 views::View* ChooserBubbleUiView::GetAnchorView() {
220 BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser(browser_); 230 BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser(browser_);
221 231
222 if (browser_->SupportsWindowFeature(Browser::FEATURE_LOCATIONBAR)) 232 if (browser_->SupportsWindowFeature(Browser::FEATURE_LOCATIONBAR))
223 return browser_view->GetLocationBarView() 233 return browser_view->GetLocationBarView()
224 ->location_icon_view() 234 ->location_icon_view()
225 ->GetImageView(); 235 ->GetImageView();
226 236
227 if (browser_view->IsFullscreenBubbleVisible()) 237 if (browser_view->IsFullscreenBubbleVisible())
228 return browser_view->exclusive_access_bubble()->GetView(); 238 return browser_view->exclusive_access_bubble()->GetView();
229 239
230 return browser_view->top_container(); 240 return browser_view->top_container();
231 } 241 }
232 242
233 views::BubbleBorder::Arrow ChooserBubbleUiView::GetAnchorArrow() { 243 views::BubbleBorder::Arrow ChooserBubbleUiView::GetAnchorArrow() {
234 if (browser_->SupportsWindowFeature(Browser::FEATURE_LOCATIONBAR)) 244 if (browser_->SupportsWindowFeature(Browser::FEATURE_LOCATIONBAR))
235 return views::BubbleBorder::TOP_LEFT; 245 return views::BubbleBorder::TOP_LEFT;
236 return views::BubbleBorder::NONE; 246 return views::BubbleBorder::NONE;
237 } 247 }
OLDNEW
« 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