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

Side by Side Diff: chrome/browser/ui/views/website_settings/chooser_bubble_ui_view.cc

Issue 2029863002: Refactor ChooserBubbleUiViewDelegate (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: updated test code Created 4 years, 6 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
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 <algorithm>
10 #include <string>
11 #include <vector>
12
13 #include "base/macros.h" 9 #include "base/macros.h"
14 #include "base/memory/ptr_util.h" 10 #include "base/memory/ptr_util.h"
15 #include "base/strings/string16.h" 11 #include "base/strings/string16.h"
16 #include "base/strings/utf_string_conversions.h"
17 #include "chrome/browser/profiles/profile.h"
18 #include "chrome/browser/ui/browser.h" 12 #include "chrome/browser/ui/browser.h"
13 #include "chrome/browser/ui/browser_window.h"
14 #include "chrome/browser/ui/views/chooser_content_view.h"
19 #include "chrome/browser/ui/views/exclusive_access_bubble_views.h" 15 #include "chrome/browser/ui/views/exclusive_access_bubble_views.h"
20 #include "chrome/browser/ui/views/frame/browser_view.h" 16 #include "chrome/browser/ui/views/frame/browser_view.h"
21 #include "chrome/browser/ui/views/frame/top_container_view.h" 17 #include "chrome/browser/ui/views/frame/top_container_view.h"
22 #include "chrome/browser/ui/views/location_bar/location_bar_view.h" 18 #include "chrome/browser/ui/views/location_bar/location_bar_view.h"
23 #include "chrome/browser/ui/views/location_bar/location_icon_view.h" 19 #include "chrome/browser/ui/views/location_bar/location_icon_view.h"
24 #include "chrome/browser/ui/website_settings/chooser_bubble_delegate.h" 20 #include "chrome/browser/ui/website_settings/chooser_bubble_delegate.h"
25 #include "chrome/common/pref_names.h"
26 #include "chrome/grit/generated_resources.h" 21 #include "chrome/grit/generated_resources.h"
27 #include "components/bubble/bubble_controller.h" 22 #include "components/bubble/bubble_controller.h"
28 #include "components/chooser_controller/chooser_controller.h" 23 #include "components/chooser_controller/chooser_controller.h"
29 #include "components/prefs/pref_service.h"
30 #include "components/url_formatter/elide_url.h" 24 #include "components/url_formatter/elide_url.h"
31 #include "ui/accessibility/ax_view_state.h"
32 #include "ui/base/l10n/l10n_util.h" 25 #include "ui/base/l10n/l10n_util.h"
33 #include "ui/base/resource/resource_bundle.h"
34 #include "ui/gfx/paint_vector_icon.h"
35 #include "ui/gfx/text_constants.h"
36 #include "ui/gfx/vector_icons_public.h"
37 #include "ui/views/bubble/bubble_dialog_delegate.h"
38 #include "ui/views/bubble/bubble_frame_view.h"
39 #include "ui/views/controls/styled_label.h" 26 #include "ui/views/controls/styled_label.h"
40 #include "ui/views/controls/styled_label_listener.h" 27 #include "ui/views/controls/styled_label_listener.h"
41 #include "ui/views/controls/table/table_view.h" 28 #include "ui/views/controls/table/table_view.h"
42 #include "ui/views/controls/table/table_view_observer.h" 29 #include "ui/views/controls/table/table_view_observer.h"
43 #include "ui/views/layout/grid_layout.h" 30 #include "ui/views/layout/box_layout.h"
31 #include "ui/views/layout/layout_constants.h"
44 #include "ui/views/window/dialog_client_view.h" 32 #include "ui/views/window/dialog_client_view.h"
45 #include "url/origin.h" 33 #include "url/origin.h"
46 34
47 namespace { 35 namespace {
48 36
49 // Chooser permission bubble width 37 const int kChooserBubbleWidth = 300;
50 const int kChooserPermissionBubbleWidth = 300;
51 38
52 // Chooser permission bubble height 39 const int kChooserBubbleHeight = 200;
53 const int kChooserPermissionBubbleHeight = 200;
54 40
55 } // namespace 41 } // namespace
56 42
57 std::unique_ptr<BubbleUi> ChooserBubbleDelegate::BuildBubbleUi() { 43 std::unique_ptr<BubbleUi> ChooserBubbleDelegate::BuildBubbleUi() {
58 return base::WrapUnique( 44 return base::WrapUnique(
59 new ChooserBubbleUiView(browser_, chooser_controller())); 45 new ChooserBubbleUiView(browser_, chooser_controller()));
60 } 46 }
61 47
62 class ChooserTableModel;
63
64 /////////////////////////////////////////////////////////////////////////////// 48 ///////////////////////////////////////////////////////////////////////////////
65 // View implementation for the chooser bubble. 49 // View implementation for the chooser bubble.
66 class ChooserBubbleUiViewDelegate : public views::BubbleDialogDelegateView, 50 class ChooserBubbleUiViewDelegate : public views::BubbleDialogDelegateView,
67 public views::StyledLabelListener, 51 public views::StyledLabelListener,
68 public views::TableViewObserver { 52 public views::TableViewObserver {
69 public: 53 public:
70 ChooserBubbleUiViewDelegate(views::View* anchor_view, 54 ChooserBubbleUiViewDelegate(views::View* anchor_view,
71 views::BubbleBorder::Arrow anchor_arrow, 55 views::BubbleBorder::Arrow anchor_arrow,
72 ChooserController* controller, 56 ChooserController* chooser_controller,
73 BubbleReference bubble_reference); 57 BubbleReference bubble_reference);
74 ~ChooserBubbleUiViewDelegate() override; 58 ~ChooserBubbleUiViewDelegate() override;
75 59
76 // views::BubbleDialogDelegateView: 60 // views::View:
77 bool ShouldShowWindowTitle() const override; 61 gfx::Size GetPreferredSize() const override;
62
63 // views::WidgetDelegate:
78 base::string16 GetWindowTitle() const override; 64 base::string16 GetWindowTitle() const override;
65
66 // views::DialogDelegate:
79 base::string16 GetDialogButtonLabel(ui::DialogButton button) const override; 67 base::string16 GetDialogButtonLabel(ui::DialogButton button) const override;
80 bool IsDialogButtonEnabled(ui::DialogButton button) const override; 68 bool IsDialogButtonEnabled(ui::DialogButton button) const override;
81 views::View* CreateFootnoteView() override; 69 views::View* CreateFootnoteView() override;
82 bool Accept() override; 70 bool Accept() override;
83 bool Cancel() override; 71 bool Cancel() override;
84 bool Close() override; 72 bool Close() override;
85 73
86 // views::StyledLabelListener: 74 // views::StyledLabelListener:
87 void StyledLabelLinkClicked(views::StyledLabel* label, 75 void StyledLabelLinkClicked(views::StyledLabel* label,
88 const gfx::Range& range, 76 const gfx::Range& range,
89 int event_flags) override; 77 int event_flags) override;
90 78
91 // views::TableViewObserver: 79 // views::TableViewObserver:
92 void OnSelectionChanged() override; 80 void OnSelectionChanged() override;
93 81
94 // Updates the anchor's arrow and view. Also repositions the bubble so it's 82 // Updates the anchor's arrow and view. Also repositions the bubble so it's
95 // displayed in the correct location. 83 // displayed in the correct location.
96 void UpdateAnchor(views::View* anchor_view, 84 void UpdateAnchor(views::View* anchor_view,
97 views::BubbleBorder::Arrow anchor_arrow); 85 views::BubbleBorder::Arrow anchor_arrow);
98 86
99 // Called by ChooserBubbleUiView's destructor. When ChooserBubbleUiView object 87 // Called just before |chooser_controller_| is destroyed.
100 // is destroyed, the |controller_| it passed to this class may not be used any 88 void ChooserControllerDestroying();
101 // more since it may be destroyed too.
102 void ControllerDestroying();
103
104 ChooserTableModel* chooser_table_model() const;
105 89
106 private: 90 private:
107 ChooserController* controller_; 91 std::unique_ptr<ChooserContentView> chooser_content_view_;
92
93 ChooserController* chooser_controller_;
108 BubbleReference bubble_reference_; 94 BubbleReference bubble_reference_;
109 95
110 views::TableView* table_view_; 96 views::TableView* table_view_;
msw 2016/06/08 00:58:45 optional nit: remove this member, just access choo
juncai 2016/06/09 01:59:21 Done.
111 ChooserTableModel* chooser_table_model_; 97 // Weak. Owned by ChooserContentView.
98 ui::TableModel* table_model_;
msw 2016/06/08 00:58:45 nit: remove this member, just access table_view_->
juncai 2016/06/09 01:59:21 Done.
112 99
113 DISALLOW_COPY_AND_ASSIGN(ChooserBubbleUiViewDelegate); 100 DISALLOW_COPY_AND_ASSIGN(ChooserBubbleUiViewDelegate);
114 }; 101 };
115 102
116 ui::TableColumn ChooserTableColumn(int id, const std::string& title) {
117 ui::TableColumn column;
118 column.id = id;
119 column.title = base::ASCIIToUTF16(title.c_str());
120 return column;
121 }
122
123 class ChooserTableModel : public ui::TableModel,
124 public ChooserController::Observer {
125 public:
126 explicit ChooserTableModel(ChooserController* controller);
127
128 // ui::TableModel:
129 int RowCount() override;
130 base::string16 GetText(int row, int column_id) override;
131 void SetObserver(ui::TableModelObserver* observer) override;
132
133 // ChooserController::Observer:
134 void OnOptionsInitialized() override;
135 void OnOptionAdded(size_t index) override;
136 void OnOptionRemoved(size_t index) override;
137
138 void Update();
139
140 private:
141 ui::TableModelObserver* observer_;
142 ChooserController* controller_;
143 };
144
145 ChooserBubbleUiViewDelegate::ChooserBubbleUiViewDelegate( 103 ChooserBubbleUiViewDelegate::ChooserBubbleUiViewDelegate(
146 views::View* anchor_view, 104 views::View* anchor_view,
147 views::BubbleBorder::Arrow anchor_arrow, 105 views::BubbleBorder::Arrow anchor_arrow,
148 ChooserController* controller, 106 ChooserController* chooser_controller,
149 BubbleReference bubble_reference) 107 BubbleReference bubble_reference)
150 : views::BubbleDialogDelegateView(anchor_view, anchor_arrow), 108 : views::BubbleDialogDelegateView(anchor_view, anchor_arrow),
151 controller_(controller), 109 chooser_controller_(chooser_controller),
152 bubble_reference_(bubble_reference) { 110 bubble_reference_(bubble_reference) {
153 // ------------------------------------ 111 // ------------------------------------
154 // | Chooser bubble title | 112 // | Chooser bubble title |
155 // | -------------------------------- | 113 // | -------------------------------- |
156 // | | option 0 | | 114 // | | option 0 | |
157 // | | option 1 | | 115 // | | option 1 | |
158 // | | option 2 | | 116 // | | option 2 | |
159 // | | | | 117 // | | | |
160 // | | | | 118 // | | | |
161 // | | | | 119 // | | | |
162 // | -------------------------------- | 120 // | -------------------------------- |
163 // | [ Connect ] [ Cancel ] | 121 // | [ Connect ] [ Cancel ] |
164 // |----------------------------------| 122 // |----------------------------------|
165 // | Not seeing your device? Get help | 123 // | Not seeing your device? Get help |
166 // ------------------------------------ 124 // ------------------------------------
167 125
168 DCHECK(bubble_reference_); 126 DCHECK(bubble_reference_);
169 127
170 views::GridLayout* layout = new views::GridLayout(this); 128 chooser_content_view_.reset(
129 new ChooserContentView(this, chooser_controller_));
130
131 table_view_ = chooser_content_view_->table_view();
132 table_model_ = table_view_->model();
133
134 views::BoxLayout* layout = new views::BoxLayout(
135 views::BoxLayout::kVertical, 0, 0, views::kRelatedControlVerticalSpacing);
171 SetLayoutManager(layout); 136 SetLayoutManager(layout);
172 137 views::View* table_parent = table_view_->CreateParentIfNecessary();
173 views::ColumnSet* column_set = layout->AddColumnSet(0); 138 AddChildView(table_parent);
174 column_set->AddColumn(views::GridLayout::FILL, views::GridLayout::FILL, 1, 139 layout->SetFlexForView(table_parent, 1);
175 views::GridLayout::USE_PREF, 0, 0);
176
177 // Lay out the table view.
178 layout->StartRow(0, 0);
179 std::vector<ui::TableColumn> table_columns;
180 table_columns.push_back(ChooserTableColumn(
181 0, "" /* Empty string makes the column title invisible */));
182 chooser_table_model_ = new ChooserTableModel(controller_);
183 table_view_ = new views::TableView(chooser_table_model_, table_columns,
184 views::TEXT_ONLY, true);
185 table_view_->set_select_on_remove(false);
186 chooser_table_model_->SetObserver(table_view_);
187 table_view_->SetObserver(this);
188 table_view_->SetEnabled(controller_->NumOptions() > 0);
189 layout->AddView(table_view_->CreateParentIfNecessary(), 1, 1,
190 views::GridLayout::FILL, views::GridLayout::FILL,
191 kChooserPermissionBubbleWidth,
192 kChooserPermissionBubbleHeight);
193 } 140 }
194 141
195 ChooserBubbleUiViewDelegate::~ChooserBubbleUiViewDelegate() { 142 ChooserBubbleUiViewDelegate::~ChooserBubbleUiViewDelegate() {
196 chooser_table_model_->SetObserver(nullptr); 143 table_view_->SetModel(nullptr);
144 table_model_->SetObserver(nullptr);
197 } 145 }
198 146
199 bool ChooserBubbleUiViewDelegate::ShouldShowWindowTitle() const { 147 gfx::Size ChooserBubbleUiViewDelegate::GetPreferredSize() const {
200 return true; 148 return gfx::Size(kChooserBubbleWidth, kChooserBubbleHeight);
201 } 149 }
202 150
203 base::string16 ChooserBubbleUiViewDelegate::GetWindowTitle() const { 151 base::string16 ChooserBubbleUiViewDelegate::GetWindowTitle() const {
204 return l10n_util::GetStringFUTF16( 152 return l10n_util::GetStringFUTF16(
205 IDS_CHOOSER_BUBBLE_PROMPT, 153 IDS_CHOOSER_BUBBLE_PROMPT,
206 url_formatter::FormatOriginForSecurityDisplay( 154 url_formatter::FormatOriginForSecurityDisplay(
207 controller_->GetOrigin(), 155 chooser_controller_->GetOrigin(),
208 url_formatter::SchemeDisplay::OMIT_CRYPTOGRAPHIC)); 156 url_formatter::SchemeDisplay::OMIT_CRYPTOGRAPHIC));
209 } 157 }
210 158
211 base::string16 ChooserBubbleUiViewDelegate::GetDialogButtonLabel( 159 base::string16 ChooserBubbleUiViewDelegate::GetDialogButtonLabel(
212 ui::DialogButton button) const { 160 ui::DialogButton button) const {
213 return l10n_util::GetStringUTF16(button == ui::DIALOG_BUTTON_OK 161 return chooser_content_view_->GetDialogButtonLabel(button);
214 ? IDS_CHOOSER_BUBBLE_CONNECT_BUTTON_TEXT
215 : IDS_CHOOSER_BUBBLE_CANCEL_BUTTON_TEXT);
216 } 162 }
217 163
218 bool ChooserBubbleUiViewDelegate::IsDialogButtonEnabled( 164 bool ChooserBubbleUiViewDelegate::IsDialogButtonEnabled(
219 ui::DialogButton button) const { 165 ui::DialogButton button) const {
220 return button == ui::DIALOG_BUTTON_OK 166 return chooser_content_view_->IsDialogButtonEnabled(button);
221 ? !table_view_->selection_model().empty()
222 : true;
223 } 167 }
224 168
225 views::View* ChooserBubbleUiViewDelegate::CreateFootnoteView() { 169 views::View* ChooserBubbleUiViewDelegate::CreateFootnoteView() {
226 base::string16 link = 170 return chooser_content_view_->CreateFootnoteView(this);
227 l10n_util::GetStringUTF16(IDS_CHOOSER_BUBBLE_GET_HELP_LINK_TEXT);
228 size_t offset;
229 base::string16 text = l10n_util::GetStringFUTF16(
230 IDS_CHOOSER_BUBBLE_FOOTNOTE_TEXT, link, &offset);
231 views::StyledLabel* label = new views::StyledLabel(text, this);
232 label->AddStyleRange(gfx::Range(offset, offset + link.length()),
233 views::StyledLabel::RangeStyleInfo::CreateForLink());
234 return label;
235 } 171 }
236 172
237 bool ChooserBubbleUiViewDelegate::Accept() { 173 bool ChooserBubbleUiViewDelegate::Accept() {
238 if (controller_) 174 if (chooser_controller_)
239 controller_->Select(table_view_->selection_model().active()); 175 chooser_controller_->Select(table_view_->selection_model().active());
240 bubble_reference_->CloseBubble(BUBBLE_CLOSE_ACCEPTED); 176 bubble_reference_->CloseBubble(BUBBLE_CLOSE_ACCEPTED);
241 return true; 177 return true;
242 } 178 }
243 179
244 bool ChooserBubbleUiViewDelegate::Cancel() { 180 bool ChooserBubbleUiViewDelegate::Cancel() {
245 if (controller_) 181 if (chooser_controller_)
246 controller_->Cancel(); 182 chooser_controller_->Cancel();
247 bubble_reference_->CloseBubble(BUBBLE_CLOSE_CANCELED); 183 bubble_reference_->CloseBubble(BUBBLE_CLOSE_CANCELED);
248 return true; 184 return true;
249 } 185 }
250 186
251 bool ChooserBubbleUiViewDelegate::Close() { 187 bool ChooserBubbleUiViewDelegate::Close() {
252 if (controller_) 188 if (chooser_controller_)
253 controller_->Close(); 189 chooser_controller_->Close();
254 return true; 190 return true;
255 } 191 }
256 192
257 void ChooserBubbleUiViewDelegate::StyledLabelLinkClicked( 193 void ChooserBubbleUiViewDelegate::StyledLabelLinkClicked(
258 views::StyledLabel* label, 194 views::StyledLabel* label,
259 const gfx::Range& range, 195 const gfx::Range& range,
260 int event_flags) { 196 int event_flags) {
261 controller_->OpenHelpCenterUrl(); 197 chooser_controller_->OpenHelpCenterUrl();
262 } 198 }
263 199
264 void ChooserBubbleUiViewDelegate::OnSelectionChanged() { 200 void ChooserBubbleUiViewDelegate::OnSelectionChanged() {
265 GetDialogClientView()->UpdateDialogButtons(); 201 GetDialogClientView()->UpdateDialogButtons();
266 } 202 }
267 203
268 void ChooserBubbleUiViewDelegate::UpdateAnchor( 204 void ChooserBubbleUiViewDelegate::UpdateAnchor(
269 views::View* anchor_view, 205 views::View* anchor_view,
270 views::BubbleBorder::Arrow anchor_arrow) { 206 views::BubbleBorder::Arrow anchor_arrow) {
271 if (GetAnchorView() == anchor_view && arrow() == anchor_arrow) 207 if (GetAnchorView() == anchor_view && arrow() == anchor_arrow)
272 return; 208 return;
273 209
274 set_arrow(anchor_arrow); 210 set_arrow(anchor_arrow);
275 211
276 // Reposition the bubble based on the updated arrow and view. 212 // Reposition the bubble based on the updated arrow and view.
277 SetAnchorView(anchor_view); 213 SetAnchorView(anchor_view);
278 } 214 }
279 215
280 void ChooserBubbleUiViewDelegate::ControllerDestroying() { 216 void ChooserBubbleUiViewDelegate::ChooserControllerDestroying() {
281 controller_ = nullptr; 217 chooser_controller_ = nullptr;
282 }
283
284 ChooserTableModel* ChooserBubbleUiViewDelegate::chooser_table_model() const {
285 return chooser_table_model_;
286 }
287
288 ChooserTableModel::ChooserTableModel(ChooserController* controller)
289 : observer_(nullptr), controller_(controller) {
290 controller_->set_observer(this);
291 }
292
293 int ChooserTableModel::RowCount() {
294 // When there are no devices, the table contains a message saying there
295 // are no devices, so the number of rows is always at least 1.
296 return std::max(static_cast<int>(controller_->NumOptions()), 1);
297 }
298
299 base::string16 ChooserTableModel::GetText(int row, int column_id) {
300 int num_options = static_cast<int>(controller_->NumOptions());
301 if (num_options == 0) {
302 DCHECK_EQ(0, row);
303 return l10n_util::GetStringUTF16(
304 IDS_CHOOSER_BUBBLE_NO_DEVICES_FOUND_PROMPT);
305 }
306
307 DCHECK_GE(row, 0);
308 DCHECK_LT(row, num_options);
309 return controller_->GetOption(static_cast<size_t>(row));
310 }
311
312 void ChooserTableModel::SetObserver(ui::TableModelObserver* observer) {
313 observer_ = observer;
314 }
315
316 void ChooserTableModel::OnOptionsInitialized() {
317 if (observer_) {
318 observer_->OnModelChanged();
319 Update();
320 }
321 }
322
323 void ChooserTableModel::OnOptionAdded(size_t index) {
324 if (observer_) {
325 observer_->OnItemsAdded(static_cast<int>(index), 1);
326 Update();
327 }
328 }
329
330 void ChooserTableModel::OnOptionRemoved(size_t index) {
331 if (observer_) {
332 observer_->OnItemsRemoved(static_cast<int>(index), 1);
333 Update();
334 }
335 }
336
337 void ChooserTableModel::Update() {
338 views::TableView* table_view = static_cast<views::TableView*>(observer_);
339
340 if (controller_->NumOptions() == 0) {
341 observer_->OnModelChanged();
342 table_view->SetEnabled(false);
343 } else {
344 table_view->SetEnabled(true);
345 }
346 } 218 }
347 219
348 ////////////////////////////////////////////////////////////////////////////// 220 //////////////////////////////////////////////////////////////////////////////
349 // ChooserBubbleUiView 221 // ChooserBubbleUiView
350
351 ChooserBubbleUiView::ChooserBubbleUiView(Browser* browser, 222 ChooserBubbleUiView::ChooserBubbleUiView(Browser* browser,
352 ChooserController* controller) 223 ChooserController* chooser_controller)
353 : browser_(browser), 224 : browser_(browser),
354 controller_(controller), 225 chooser_controller_(chooser_controller),
355 chooser_bubble_ui_view_delegate_(nullptr) { 226 chooser_bubble_ui_view_delegate_(nullptr) {
356 DCHECK(browser_); 227 DCHECK(browser_);
357 DCHECK(controller_); 228 DCHECK(chooser_controller_);
358 } 229 }
359 230
360 ChooserBubbleUiView::~ChooserBubbleUiView() { 231 ChooserBubbleUiView::~ChooserBubbleUiView() {
361 if (chooser_bubble_ui_view_delegate_) 232 if (chooser_bubble_ui_view_delegate_)
362 chooser_bubble_ui_view_delegate_->ControllerDestroying(); 233 chooser_bubble_ui_view_delegate_->ChooserControllerDestroying();
363 } 234 }
364 235
365 void ChooserBubbleUiView::Show(BubbleReference bubble_reference) { 236 void ChooserBubbleUiView::Show(BubbleReference bubble_reference) {
366 chooser_bubble_ui_view_delegate_ = new ChooserBubbleUiViewDelegate( 237 chooser_bubble_ui_view_delegate_ = new ChooserBubbleUiViewDelegate(
367 GetAnchorView(), GetAnchorArrow(), controller_, bubble_reference); 238 GetAnchorView(), GetAnchorArrow(), chooser_controller_, bubble_reference);
368 239
369 // Set |parent_window| because some valid anchors can become hidden. 240 // Set |parent_window| because some valid anchors can become hidden.
370 views::Widget* widget = views::Widget::GetWidgetForNativeWindow( 241 views::Widget* widget = views::Widget::GetWidgetForNativeWindow(
371 browser_->window()->GetNativeWindow()); 242 browser_->window()->GetNativeWindow());
372 chooser_bubble_ui_view_delegate_->set_parent_window(widget->GetNativeView()); 243 chooser_bubble_ui_view_delegate_->set_parent_window(widget->GetNativeView());
373 244
374 views::BubbleDialogDelegateView::CreateBubble( 245 views::BubbleDialogDelegateView::CreateBubble(
375 chooser_bubble_ui_view_delegate_) 246 chooser_bubble_ui_view_delegate_)
376 ->Show(); 247 ->Show();
377
378 chooser_bubble_ui_view_delegate_->chooser_table_model()->Update();
379 } 248 }
380 249
381 void ChooserBubbleUiView::Close() {} 250 void ChooserBubbleUiView::Close() {}
382 251
383 void ChooserBubbleUiView::UpdateAnchorPosition() { 252 void ChooserBubbleUiView::UpdateAnchorPosition() {
384 chooser_bubble_ui_view_delegate_->UpdateAnchor(GetAnchorView(), 253 chooser_bubble_ui_view_delegate_->UpdateAnchor(GetAnchorView(),
385 GetAnchorArrow()); 254 GetAnchorArrow());
386 } 255 }
387 256
388 views::View* ChooserBubbleUiView::GetAnchorView() { 257 views::View* ChooserBubbleUiView::GetAnchorView() {
389 BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser(browser_); 258 BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser(browser_);
390 259
391 if (browser_->SupportsWindowFeature(Browser::FEATURE_LOCATIONBAR)) 260 if (browser_->SupportsWindowFeature(Browser::FEATURE_LOCATIONBAR))
392 return browser_view->GetLocationBarView()->location_icon_view(); 261 return browser_view->GetLocationBarView()->location_icon_view();
393 262
394 if (browser_view->IsFullscreenBubbleVisible()) 263 if (browser_view->IsFullscreenBubbleVisible())
395 return browser_view->exclusive_access_bubble()->GetView(); 264 return browser_view->exclusive_access_bubble()->GetView();
396 265
397 return browser_view->top_container(); 266 return browser_view->top_container();
398 } 267 }
399 268
400 views::BubbleBorder::Arrow ChooserBubbleUiView::GetAnchorArrow() { 269 views::BubbleBorder::Arrow ChooserBubbleUiView::GetAnchorArrow() {
401 if (browser_->SupportsWindowFeature(Browser::FEATURE_LOCATIONBAR)) 270 if (browser_->SupportsWindowFeature(Browser::FEATURE_LOCATIONBAR))
402 return views::BubbleBorder::TOP_LEFT; 271 return views::BubbleBorder::TOP_LEFT;
403 return views::BubbleBorder::NONE; 272 return views::BubbleBorder::NONE;
404 } 273 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698