Chromium Code Reviews| 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 |