OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/permission_selector_view.h" | 5 #include "chrome/browser/ui/views/website_settings/permission_selector_row.h" |
6 | 6 |
7 #include "base/i18n/rtl.h" | 7 #include "base/i18n/rtl.h" |
8 #include "base/macros.h" | 8 #include "base/macros.h" |
9 #include "base/strings/utf_string_conversions.h" | 9 #include "base/strings/utf_string_conversions.h" |
10 #include "chrome/browser/ui/views/website_settings/website_settings_popup_view.h " | 10 #include "chrome/browser/ui/views/website_settings/website_settings_popup_view.h " |
11 #include "chrome/browser/ui/website_settings/permission_menu_model.h" | 11 #include "chrome/browser/ui/website_settings/permission_menu_model.h" |
12 #include "chrome/browser/ui/website_settings/website_settings_ui.h" | 12 #include "chrome/browser/ui/website_settings/website_settings_ui.h" |
13 #include "chrome/grit/generated_resources.h" | 13 #include "chrome/grit/generated_resources.h" |
14 #include "ui/accessibility/ax_view_state.h" | 14 #include "ui/accessibility/ax_view_state.h" |
15 #include "ui/base/l10n/l10n_util.h" | 15 #include "ui/base/l10n/l10n_util.h" |
(...skipping 30 matching lines...) Expand all Loading... | |
46 // Overridden from views::View. | 46 // Overridden from views::View. |
47 void GetAccessibleState(ui::AXViewState* state) override; | 47 void GetAccessibleState(ui::AXViewState* state) override; |
48 void OnNativeThemeChanged(const ui::NativeTheme* theme) override; | 48 void OnNativeThemeChanged(const ui::NativeTheme* theme) override; |
49 | 49 |
50 private: | 50 private: |
51 // Overridden from views::MenuButtonListener. | 51 // Overridden from views::MenuButtonListener. |
52 void OnMenuButtonClicked(views::MenuButton* source, | 52 void OnMenuButtonClicked(views::MenuButton* source, |
53 const gfx::Point& point, | 53 const gfx::Point& point, |
54 const ui::Event* event) override; | 54 const ui::Event* event) override; |
55 | 55 |
56 PermissionMenuModel* menu_model_; // Owned by |PermissionSelectorView|. | 56 PermissionMenuModel* menu_model_; // Owned by |PermissionSelectorRow|. |
57 std::unique_ptr<views::MenuRunner> menu_runner_; | 57 std::unique_ptr<views::MenuRunner> menu_runner_; |
58 | 58 |
59 bool is_rtl_display_; | 59 bool is_rtl_display_; |
60 | 60 |
61 DISALLOW_COPY_AND_ASSIGN(PermissionMenuButton); | 61 DISALLOW_COPY_AND_ASSIGN(PermissionMenuButton); |
62 }; | 62 }; |
63 | 63 |
64 /////////////////////////////////////////////////////////////////////////////// | 64 /////////////////////////////////////////////////////////////////////////////// |
65 // PermissionMenuButton | 65 // PermissionMenuButton |
66 /////////////////////////////////////////////////////////////////////////////// | 66 /////////////////////////////////////////////////////////////////////////////// |
67 | 67 |
68 PermissionMenuButton::PermissionMenuButton(const base::string16& text, | 68 PermissionMenuButton::PermissionMenuButton(const base::string16& text, |
69 PermissionMenuModel* model, | 69 PermissionMenuModel* model, |
70 bool show_menu_marker) | 70 bool show_menu_marker) |
71 : MenuButton(text, this, show_menu_marker), menu_model_(model) { | 71 : MenuButton(text, this, show_menu_marker), menu_model_(model) { |
72 // Update the themed border before the NativeTheme is applied. Usually this | 72 // Update the themed border before the NativeTheme is applied. Usually this |
73 // happens in a call to LabelButton::OnNativeThemeChanged(). However, if | 73 // happens in a call to LabelButton::OnNativeThemeChanged(). However, if |
74 // PermissionMenuButton called that from its override, the NativeTheme would | 74 // PermissionMenuButton called that from its override, the NativeTheme would |
75 // be available, and the button would get native GTK styling on Linux. | 75 // be available, and the button would get native GTK styling on Linux. |
76 UpdateThemedBorder(); | 76 UpdateThemedBorder(); |
77 | 77 |
78 SetFocusForPlatform(); | 78 SetFocusForPlatform(); |
79 set_request_focus_on_press(true); | 79 set_request_focus_on_press(true); |
80 is_rtl_display_ = | 80 is_rtl_display_ = |
81 base::i18n::RIGHT_TO_LEFT == base::i18n::GetStringDirection(text); | 81 base::i18n::RIGHT_TO_LEFT == base::i18n::GetStringDirection(text); |
82 } | 82 } |
83 | 83 |
84 PermissionMenuButton::~PermissionMenuButton() { | 84 PermissionMenuButton::~PermissionMenuButton() {} |
85 } | |
86 | 85 |
87 void PermissionMenuButton::GetAccessibleState(ui::AXViewState* state) { | 86 void PermissionMenuButton::GetAccessibleState(ui::AXViewState* state) { |
88 MenuButton::GetAccessibleState(state); | 87 MenuButton::GetAccessibleState(state); |
89 state->value = GetText(); | 88 state->value = GetText(); |
90 } | 89 } |
91 | 90 |
92 void PermissionMenuButton::OnNativeThemeChanged(const ui::NativeTheme* theme) { | 91 void PermissionMenuButton::OnNativeThemeChanged(const ui::NativeTheme* theme) { |
93 SetTextColor(views::Button::STATE_NORMAL, theme->GetSystemColor( | 92 SetTextColor( |
94 ui::NativeTheme::kColorId_LabelEnabledColor)); | 93 views::Button::STATE_NORMAL, |
95 SetTextColor(views::Button::STATE_HOVERED, theme->GetSystemColor( | 94 theme->GetSystemColor(ui::NativeTheme::kColorId_LabelEnabledColor)); |
96 ui::NativeTheme::kColorId_LabelEnabledColor)); | 95 SetTextColor( |
97 SetTextColor(views::Button::STATE_DISABLED, theme->GetSystemColor( | 96 views::Button::STATE_HOVERED, |
98 ui::NativeTheme::kColorId_LabelDisabledColor)); | 97 theme->GetSystemColor(ui::NativeTheme::kColorId_LabelEnabledColor)); |
98 SetTextColor( | |
99 views::Button::STATE_DISABLED, | |
100 theme->GetSystemColor(ui::NativeTheme::kColorId_LabelDisabledColor)); | |
99 } | 101 } |
100 | 102 |
101 void PermissionMenuButton::OnMenuButtonClicked(views::MenuButton* source, | 103 void PermissionMenuButton::OnMenuButtonClicked(views::MenuButton* source, |
102 const gfx::Point& point, | 104 const gfx::Point& point, |
103 const ui::Event* event) { | 105 const ui::Event* event) { |
104 menu_runner_.reset(new views::MenuRunner( | 106 menu_runner_.reset(new views::MenuRunner( |
105 menu_model_, | 107 menu_model_, |
106 views::MenuRunner::HAS_MNEMONICS | views::MenuRunner::ASYNC)); | 108 views::MenuRunner::HAS_MNEMONICS | views::MenuRunner::ASYNC)); |
107 | 109 |
108 gfx::Point p(point); | 110 gfx::Point p(point); |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
216 Combobox::OnPaintBorder(canvas); | 218 Combobox::OnPaintBorder(canvas); |
217 } | 219 } |
218 | 220 |
219 void PermissionCombobox::OnPerformAction(Combobox* combobox) { | 221 void PermissionCombobox::OnPerformAction(Combobox* combobox) { |
220 model_->OnPerformAction(combobox->selected_index()); | 222 model_->OnPerformAction(combobox->selected_index()); |
221 } | 223 } |
222 | 224 |
223 } // namespace internal | 225 } // namespace internal |
224 | 226 |
225 /////////////////////////////////////////////////////////////////////////////// | 227 /////////////////////////////////////////////////////////////////////////////// |
226 // PermissionSelectorView | 228 // PermissionSelectorRow |
227 /////////////////////////////////////////////////////////////////////////////// | 229 /////////////////////////////////////////////////////////////////////////////// |
228 | 230 |
229 PermissionSelectorView::PermissionSelectorView( | 231 PermissionSelectorRow::PermissionSelectorRow( |
230 const GURL& url, | 232 const GURL& url, |
231 const WebsiteSettingsUI::PermissionInfo& permission) | 233 const WebsiteSettingsUI::PermissionInfo& permission) |
232 : icon_(NULL), menu_button_(NULL), combobox_(NULL) { | 234 : icon_(NULL), menu_button_(NULL), combobox_(NULL) { |
233 views::GridLayout* layout = new views::GridLayout(this); | 235 views::GridLayout* layout = new views::GridLayout(this); |
234 SetLayoutManager(layout); | 236 SetLayoutManager(layout); |
235 const int column_set_id = 0; | 237 const int column_set_id = 0; |
236 views::ColumnSet* column_set = layout->AddColumnSet(column_set_id); | 238 views::ColumnSet* column_set = layout->AddColumnSet(column_set_id); |
237 column_set->AddColumn(views::GridLayout::FILL, | 239 column_set->AddColumn(views::GridLayout::FILL, views::GridLayout::FILL, 1, |
238 views::GridLayout::FILL, | 240 views::GridLayout::FIXED, kPermissionIconColumnWidth, |
239 1, | |
240 views::GridLayout::FIXED, | |
241 kPermissionIconColumnWidth, | |
242 0); | 241 0); |
243 column_set->AddPaddingColumn(0, kPermissionIconMarginLeft); | 242 column_set->AddPaddingColumn(0, kPermissionIconMarginLeft); |
244 column_set->AddColumn(views::GridLayout::FILL, | 243 column_set->AddColumn(views::GridLayout::FILL, views::GridLayout::FILL, 1, |
245 views::GridLayout::FILL, | 244 views::GridLayout::USE_PREF, 0, 0); |
246 1, | 245 column_set->AddColumn(views::GridLayout::FILL, views::GridLayout::FILL, 1, |
247 views::GridLayout::USE_PREF, | 246 views::GridLayout::USE_PREF, 0, 0); |
248 0, | |
249 0); | |
250 column_set->AddColumn(views::GridLayout::FILL, | |
251 views::GridLayout::FILL, | |
252 1, | |
253 views::GridLayout::USE_PREF, | |
254 0, | |
255 0); | |
256 | 247 |
257 layout->StartRow(1, column_set_id); | 248 layout->StartRow(1, column_set_id); |
258 // Create the permission icon. | 249 // Create the permission icon. |
259 icon_ = new views::ImageView(); | 250 icon_ = new views::ImageView(); |
260 const gfx::Image& image = WebsiteSettingsUI::GetPermissionIcon(permission); | 251 const gfx::Image& image = WebsiteSettingsUI::GetPermissionIcon(permission); |
261 icon_->SetImage(image.ToImageSkia()); | 252 icon_->SetImage(image.ToImageSkia()); |
262 layout->AddView(icon_, | 253 layout->AddView(icon_, 1, 1, views::GridLayout::CENTER, |
263 1, | |
264 1, | |
265 views::GridLayout::CENTER, | |
266 views::GridLayout::CENTER); | 254 views::GridLayout::CENTER); |
267 // Create the label that displays the permission type. | 255 // Create the label that displays the permission type. |
268 views::Label* label = new views::Label(l10n_util::GetStringFUTF16( | 256 views::Label* label = new views::Label(l10n_util::GetStringFUTF16( |
269 IDS_WEBSITE_SETTINGS_PERMISSION_TYPE, | 257 IDS_WEBSITE_SETTINGS_PERMISSION_TYPE, |
270 WebsiteSettingsUI::PermissionTypeToUIString(permission.type))); | 258 WebsiteSettingsUI::PermissionTypeToUIString(permission.type))); |
271 layout->AddView(label, | 259 layout->AddView(label, 1, 1, views::GridLayout::LEADING, |
272 1, | |
273 1, | |
274 views::GridLayout::LEADING, | |
275 views::GridLayout::CENTER); | 260 views::GridLayout::CENTER); |
276 // Create the menu model. | 261 // Create the menu model. |
277 menu_model_.reset(new PermissionMenuModel( | 262 menu_model_.reset(new PermissionMenuModel( |
278 url, | 263 url, permission, base::Bind(&PermissionSelectorRow::PermissionChanged, |
279 permission, | 264 base::Unretained(this)))); |
280 base::Bind(&PermissionSelectorView::PermissionChanged, | |
281 base::Unretained(this)))); | |
282 | 265 |
283 // Create the permission menu button. | 266 // Create the permission menu button. |
284 #if defined(OS_MACOSX) | 267 #if defined(OS_MACOSX) |
285 bool use_real_combobox = true; | 268 bool use_real_combobox = true; |
286 #else | 269 #else |
287 bool use_real_combobox = | 270 bool use_real_combobox = |
288 ui::MaterialDesignController::IsSecondaryUiMaterial(); | 271 ui::MaterialDesignController::IsSecondaryUiMaterial(); |
289 #endif | 272 #endif |
290 if (use_real_combobox) | 273 if (use_real_combobox) |
291 InitializeComboboxView(layout, permission); | 274 InitializeComboboxView(layout, permission); |
292 else | 275 else |
293 InitializeMenuButtonView(layout, permission); | 276 InitializeMenuButtonView(layout, permission); |
294 } | 277 } |
295 | 278 |
296 void PermissionSelectorView::AddObserver( | 279 void PermissionSelectorRow::AddObserver( |
297 PermissionSelectorViewObserver* observer) { | 280 PermissionSelectorRowObserver* observer) { |
298 observer_list_.AddObserver(observer); | 281 observer_list_.AddObserver(observer); |
299 } | 282 } |
300 | 283 |
301 void PermissionSelectorView::ChildPreferredSizeChanged(View* child) { | 284 void PermissionSelectorRow::ChildPreferredSizeChanged(View* child) { |
302 SizeToPreferredSize(); | 285 SizeToPreferredSize(); |
303 // FIXME: The parent is only a plain |View| that is used as a | 286 // FIXME: The parent is only a plain |View| that is used as a |
304 // container/box/panel. The SizeToPreferredSize method of the parent is | 287 // container/box/panel. The SizeToPreferredSize method of the parent is |
305 // called here directly in order not to implement a custom |View| class with | 288 // called here directly in order not to implement a custom |View| class with |
306 // its own implementation of the ChildPreferredSizeChanged method. | 289 // its own implementation of the ChildPreferredSizeChanged method. |
307 parent()->SizeToPreferredSize(); | 290 parent()->SizeToPreferredSize(); |
308 } | 291 } |
309 | 292 |
310 PermissionSelectorView::~PermissionSelectorView() { | 293 PermissionSelectorRow::~PermissionSelectorRow() { |
311 // Gross. On paper the Combobox and the ComboboxModelAdapter are both owned by | 294 // Gross. On paper the Combobox and the ComboboxModelAdapter are both owned by |
312 // this class, but actually, the Combobox is owned by View and will be | 295 // this class, but actually, the Combobox is owned by View and will be |
313 // destroyed in ~View(), which runs *after* ~PermissionSelectorView() is done, | 296 // destroyed in ~View(), which runs *after* ~PermissionSelectorRow() is done, |
314 // which means the Combobox gets destroyed after its ComboboxModel, which | 297 // which means the Combobox gets destroyed after its ComboboxModel, which |
315 // causes an explosion when the Combobox attempts to stop observing the | 298 // causes an explosion when the Combobox attempts to stop observing the |
316 // ComboboxModel. This hack ensures the Combobox is deleted before its | 299 // ComboboxModel. This hack ensures the Combobox is deleted before its |
317 // ComboboxModel. | 300 // ComboboxModel. |
318 // | 301 // |
319 // Technically, the MenuButton has the same problem, but MenuButton doesn't | 302 // Technically, the MenuButton has the same problem, but MenuButton doesn't |
320 // use its model in its destructor. | 303 // use its model in its destructor. |
321 if (combobox_) | 304 if (combobox_) |
322 RemoveChildView(combobox_); | 305 RemoveChildView(combobox_); |
323 } | 306 } |
324 | 307 |
325 void PermissionSelectorView::InitializeMenuButtonView( | 308 void PermissionSelectorRow::InitializeMenuButtonView( |
326 views::GridLayout* layout, | 309 views::GridLayout* layout, |
327 const WebsiteSettingsUI::PermissionInfo& permission) { | 310 const WebsiteSettingsUI::PermissionInfo& permission) { |
328 bool button_enabled = | 311 bool button_enabled = |
329 permission.source == content_settings::SETTING_SOURCE_USER; | 312 permission.source == content_settings::SETTING_SOURCE_USER; |
330 menu_button_ = new internal::PermissionMenuButton( | 313 menu_button_ = new internal::PermissionMenuButton( |
331 WebsiteSettingsUI::PermissionActionToUIString( | 314 WebsiteSettingsUI::PermissionActionToUIString( |
332 permission.type, permission.setting, permission.default_setting, | 315 permission.type, permission.setting, permission.default_setting, |
333 permission.source), | 316 permission.source), |
334 menu_model_.get(), button_enabled); | 317 menu_model_.get(), button_enabled); |
335 menu_button_->SetEnabled(button_enabled); | 318 menu_button_->SetEnabled(button_enabled); |
336 menu_button_->SetAccessibleName( | 319 menu_button_->SetAccessibleName( |
337 WebsiteSettingsUI::PermissionTypeToUIString(permission.type)); | 320 WebsiteSettingsUI::PermissionTypeToUIString(permission.type)); |
338 layout->AddView(menu_button_); | 321 layout->AddView(menu_button_); |
339 } | 322 } |
340 | 323 |
341 void PermissionSelectorView::InitializeComboboxView( | 324 void PermissionSelectorRow::InitializeComboboxView( |
342 views::GridLayout* layout, | 325 views::GridLayout* layout, |
343 const WebsiteSettingsUI::PermissionInfo& permission) { | 326 const WebsiteSettingsUI::PermissionInfo& permission) { |
344 bool button_enabled = | 327 bool button_enabled = |
345 permission.source == content_settings::SETTING_SOURCE_USER; | 328 permission.source == content_settings::SETTING_SOURCE_USER; |
346 combobox_model_adapter_.reset( | 329 combobox_model_adapter_.reset( |
347 new internal::ComboboxModelAdapter(menu_model_.get())); | 330 new internal::ComboboxModelAdapter(menu_model_.get())); |
348 combobox_ = new internal::PermissionCombobox( | 331 combobox_ = new internal::PermissionCombobox( |
349 WebsiteSettingsUI::PermissionActionToUIString( | 332 WebsiteSettingsUI::PermissionActionToUIString( |
350 permission.type, permission.setting, permission.default_setting, | 333 permission.type, permission.setting, permission.default_setting, |
351 permission.source), | 334 permission.source), |
352 combobox_model_adapter_.get(), button_enabled, | 335 combobox_model_adapter_.get(), button_enabled, true); |
353 true); | |
354 combobox_->SetEnabled(button_enabled); | 336 combobox_->SetEnabled(button_enabled); |
355 combobox_->SetAccessibleName( | 337 combobox_->SetAccessibleName( |
356 WebsiteSettingsUI::PermissionTypeToUIString(permission.type)); | 338 WebsiteSettingsUI::PermissionTypeToUIString(permission.type)); |
357 layout->AddView(combobox_); | 339 layout->AddView(combobox_); |
358 } | 340 } |
359 | 341 |
360 void PermissionSelectorView::PermissionChanged( | 342 void PermissionSelectorRow::PermissionChanged( |
361 const WebsiteSettingsUI::PermissionInfo& permission) { | 343 const WebsiteSettingsUI::PermissionInfo& permission) { |
362 // Change the permission icon to reflect the selected setting. | 344 // Change the permission icon to reflect the selected setting. |
363 const gfx::Image& image = WebsiteSettingsUI::GetPermissionIcon(permission); | 345 const gfx::Image& image = WebsiteSettingsUI::GetPermissionIcon(permission); |
364 icon_->SetImage(image.ToImageSkia()); | 346 icon_->SetImage(image.ToImageSkia()); |
365 | 347 |
366 // Update the menu button text to reflect the new setting. | 348 // Update the menu button text to reflect the new setting. |
367 if (menu_button_) { | 349 if (menu_button_) { |
368 menu_button_->SetText(WebsiteSettingsUI::PermissionActionToUIString( | 350 menu_button_->SetText(WebsiteSettingsUI::PermissionActionToUIString( |
369 permission.type, permission.setting, permission.default_setting, | 351 permission.type, permission.setting, permission.default_setting, |
370 content_settings::SETTING_SOURCE_USER)); | 352 content_settings::SETTING_SOURCE_USER)); |
371 menu_button_->SizeToPreferredSize(); | 353 menu_button_->SizeToPreferredSize(); |
372 } else if (combobox_) { | 354 } else if (combobox_) { |
373 bool use_default = permission.setting == CONTENT_SETTING_DEFAULT; | 355 bool use_default = permission.setting == CONTENT_SETTING_DEFAULT; |
374 combobox_->UpdateSelectedIndex(use_default); | 356 combobox_->UpdateSelectedIndex(use_default); |
375 } | 357 } |
376 | 358 |
377 FOR_EACH_OBSERVER(PermissionSelectorViewObserver, | 359 FOR_EACH_OBSERVER(PermissionSelectorRowObserver, observer_list_, |
felt
2016/09/06 20:03:53
(is this change just a result of running git cl fo
lgarron
2016/09/07 06:55:26
(Ditto.)
| |
378 observer_list_, | |
379 OnPermissionChanged(permission)); | 360 OnPermissionChanged(permission)); |
380 } | 361 } |
OLD | NEW |