| OLD | NEW |
| 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 Loading... |
| 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) { |
| 86 // ------------------------------------ | 87 // ------------------------------------ |
| 87 // | Chooser bubble title | | 88 // | Chooser bubble title | |
| 88 // | -------------------------------- | | 89 // | -------------------------------- | |
| 89 // | | option 0 | | | 90 // | | option 0 | | |
| 90 // | | option 1 | | | 91 // | | option 1 | | |
| 91 // | | option 2 | | | 92 // | | option 2 | | |
| 92 // | | | | | 93 // | | | | |
| 93 // | | | | | 94 // | | | | |
| 94 // | | | | | 95 // | | | | |
| 95 // | -------------------------------- | | 96 // | -------------------------------- | |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 177 | 178 |
| 178 void ChooserBubbleUiViewDelegate::UpdateTableView() const { | 179 void ChooserBubbleUiViewDelegate::UpdateTableView() const { |
| 179 device_chooser_content_view_->UpdateTableView(); | 180 device_chooser_content_view_->UpdateTableView(); |
| 180 } | 181 } |
| 181 | 182 |
| 182 ////////////////////////////////////////////////////////////////////////////// | 183 ////////////////////////////////////////////////////////////////////////////// |
| 183 // ChooserBubbleUiView | 184 // ChooserBubbleUiView |
| 184 ChooserBubbleUiView::ChooserBubbleUiView( | 185 ChooserBubbleUiView::ChooserBubbleUiView( |
| 185 Browser* browser, | 186 Browser* browser, |
| 186 std::unique_ptr<ChooserController> chooser_controller) | 187 std::unique_ptr<ChooserController> chooser_controller) |
| 187 : browser_(browser) { | 188 : browser_(browser), chooser_bubble_ui_view_delegate_(nullptr) { |
| 188 DCHECK(browser_); | 189 DCHECK(browser_); |
| 189 DCHECK(chooser_controller); | 190 DCHECK(chooser_controller); |
| 190 bubble_view_ = new ChooserBubbleUiViewDelegate( | 191 chooser_bubble_ui_view_delegate_ = new ChooserBubbleUiViewDelegate( |
| 191 GetAnchorView(), GetAnchorArrow(), std::move(chooser_controller)); | 192 GetAnchorView(), GetAnchorArrow(), std::move(chooser_controller)); |
| 192 } | 193 } |
| 193 | 194 |
| 194 ChooserBubbleUiView::~ChooserBubbleUiView() {} | 195 ChooserBubbleUiView::~ChooserBubbleUiView() {} |
| 195 | 196 |
| 196 void ChooserBubbleUiView::Show(BubbleReference bubble_reference) { | 197 void ChooserBubbleUiView::Show(BubbleReference bubble_reference) { |
| 197 bubble_view_->set_bubble_reference(bubble_reference); | 198 chooser_bubble_ui_view_delegate_->set_bubble_reference(bubble_reference); |
| 198 | 199 |
| 199 // Set |parent_window| because some valid anchors can become hidden. | 200 // Set |parent_window| because some valid anchors can become hidden. |
| 200 views::Widget* widget = views::Widget::GetWidgetForNativeWindow( | 201 views::Widget* widget = views::Widget::GetWidgetForNativeWindow( |
| 201 browser_->window()->GetNativeWindow()); | 202 browser_->window()->GetNativeWindow()); |
| 202 bubble_view_->set_parent_window(widget->GetNativeView()); | 203 chooser_bubble_ui_view_delegate_->set_parent_window(widget->GetNativeView()); |
| 203 | 204 |
| 204 views::BubbleDialogDelegateView::CreateBubble(bubble_view_)->Show(); | 205 views::BubbleDialogDelegateView::CreateBubble( |
| 205 bubble_view_->GetWidget()->AddObserver(this); | 206 chooser_bubble_ui_view_delegate_) |
| 206 bubble_view_->UpdateTableView(); | 207 ->Show(); |
| 208 |
| 209 chooser_bubble_ui_view_delegate_->UpdateTableView(); |
| 207 } | 210 } |
| 208 | 211 |
| 209 void ChooserBubbleUiView::Close() { | 212 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 } | |
| 217 | 213 |
| 218 void ChooserBubbleUiView::UpdateAnchorPosition() { | 214 void ChooserBubbleUiView::UpdateAnchorPosition() { |
| 219 DCHECK(bubble_view_); | 215 chooser_bubble_ui_view_delegate_->UpdateAnchor(GetAnchorView(), |
| 220 bubble_view_->UpdateAnchor(GetAnchorView(), GetAnchorArrow()); | 216 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; | |
| 227 } | 217 } |
| 228 | 218 |
| 229 views::View* ChooserBubbleUiView::GetAnchorView() { | 219 views::View* ChooserBubbleUiView::GetAnchorView() { |
| 230 BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser(browser_); | 220 BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser(browser_); |
| 231 | 221 |
| 232 if (browser_->SupportsWindowFeature(Browser::FEATURE_LOCATIONBAR)) | 222 if (browser_->SupportsWindowFeature(Browser::FEATURE_LOCATIONBAR)) |
| 233 return browser_view->GetLocationBarView() | 223 return browser_view->GetLocationBarView() |
| 234 ->location_icon_view() | 224 ->location_icon_view() |
| 235 ->GetImageView(); | 225 ->GetImageView(); |
| 236 | 226 |
| 237 if (browser_view->IsFullscreenBubbleVisible()) | 227 if (browser_view->IsFullscreenBubbleVisible()) |
| 238 return browser_view->exclusive_access_bubble()->GetView(); | 228 return browser_view->exclusive_access_bubble()->GetView(); |
| 239 | 229 |
| 240 return browser_view->top_container(); | 230 return browser_view->top_container(); |
| 241 } | 231 } |
| 242 | 232 |
| 243 views::BubbleBorder::Arrow ChooserBubbleUiView::GetAnchorArrow() { | 233 views::BubbleBorder::Arrow ChooserBubbleUiView::GetAnchorArrow() { |
| 244 if (browser_->SupportsWindowFeature(Browser::FEATURE_LOCATIONBAR)) | 234 if (browser_->SupportsWindowFeature(Browser::FEATURE_LOCATIONBAR)) |
| 245 return views::BubbleBorder::TOP_LEFT; | 235 return views::BubbleBorder::TOP_LEFT; |
| 246 return views::BubbleBorder::NONE; | 236 return views::BubbleBorder::NONE; |
| 247 } | 237 } |
| OLD | NEW |