| 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) { | |
| 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 Loading... |
| 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 } |
| OLD | NEW |