OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/permissions_bubble_view.h" | 5 #include "chrome/browser/ui/views/website_settings/permissions_bubble_view.h" |
6 | 6 |
7 #include "base/strings/string16.h" | 7 #include "base/strings/string16.h" |
8 #include "chrome/browser/ui/views/website_settings/permission_selector_view.h" | 8 #include "chrome/browser/ui/views/website_settings/permission_selector_view.h" |
9 #include "chrome/browser/ui/views/website_settings/permission_selector_view_obse
rver.h" | 9 #include "chrome/browser/ui/views/website_settings/permission_selector_view_obse
rver.h" |
10 #include "chrome/browser/ui/website_settings/permission_bubble_request.h" | 10 #include "chrome/browser/ui/website_settings/permission_bubble_request.h" |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
126 | 126 |
127 void PermissionCombobox::PermissionChanged( | 127 void PermissionCombobox::PermissionChanged( |
128 const WebsiteSettingsUI::PermissionInfo& permission) { | 128 const WebsiteSettingsUI::PermissionInfo& permission) { |
129 SetText(model_->GetLabelAt(model_->GetIndexOfCommandId(permission.setting))); | 129 SetText(model_->GetLabelAt(model_->GetIndexOfCommandId(permission.setting))); |
130 SizeToPreferredSize(); | 130 SizeToPreferredSize(); |
131 | 131 |
132 listener_->PermissionSelectionChanged( | 132 listener_->PermissionSelectionChanged( |
133 index_, permission.setting == CONTENT_SETTING_ALLOW); | 133 index_, permission.setting == CONTENT_SETTING_ALLOW); |
134 } | 134 } |
135 | 135 |
136 // A combobox originating on the Allow button allowing for customization | |
137 // of permissions. | |
138 class CustomizeAllowComboboxModel : public ui::ComboboxModel { | |
139 public: | |
140 enum Item { | |
141 INDEX_ALLOW = 0, | |
142 INDEX_CUSTOMIZE = 1 | |
143 }; | |
144 | |
145 CustomizeAllowComboboxModel() {} | |
146 ~CustomizeAllowComboboxModel() override {} | |
147 | |
148 int GetItemCount() const override; | |
149 base::string16 GetItemAt(int index) override; | |
150 int GetDefaultIndex() const override; | |
151 }; | |
152 | |
153 int CustomizeAllowComboboxModel::GetItemCount() const { | |
154 return 2; | |
155 } | |
156 | |
157 base::string16 CustomizeAllowComboboxModel::GetItemAt(int index) { | |
158 if (index == INDEX_ALLOW) | |
159 return l10n_util::GetStringUTF16(IDS_PERMISSION_ALLOW); | |
160 else | |
161 return l10n_util::GetStringUTF16(IDS_PERMISSION_CUSTOMIZE); | |
162 } | |
163 | |
164 int CustomizeAllowComboboxModel::GetDefaultIndex() const { | |
165 return INDEX_ALLOW; | |
166 } | |
167 | |
168 /////////////////////////////////////////////////////////////////////////////// | 136 /////////////////////////////////////////////////////////////////////////////// |
169 // View implementation for the permissions bubble. | 137 // View implementation for the permissions bubble. |
170 class PermissionsBubbleDelegateView : public views::BubbleDelegateView, | 138 class PermissionsBubbleDelegateView : public views::BubbleDelegateView, |
171 public views::ButtonListener, | 139 public views::ButtonListener, |
172 public views::ComboboxListener, | |
173 public PermissionCombobox::Listener { | 140 public PermissionCombobox::Listener { |
174 public: | 141 public: |
175 PermissionsBubbleDelegateView( | 142 PermissionsBubbleDelegateView( |
176 views::View* anchor, | 143 views::View* anchor, |
177 PermissionBubbleViewViews* owner, | 144 PermissionBubbleViewViews* owner, |
178 const std::string& languages, | 145 const std::string& languages, |
179 const std::vector<PermissionBubbleRequest*>& requests, | 146 const std::vector<PermissionBubbleRequest*>& requests, |
180 const std::vector<bool>& accept_state, | 147 const std::vector<bool>& accept_state); |
181 bool customization_mode); | |
182 ~PermissionsBubbleDelegateView() override; | 148 ~PermissionsBubbleDelegateView() override; |
183 | 149 |
184 void Close(); | 150 void Close(); |
185 void SizeToContents(); | 151 void SizeToContents(); |
186 | 152 |
187 // BubbleDelegateView: | 153 // BubbleDelegateView: |
188 bool ShouldShowCloseButton() const override; | 154 bool ShouldShowCloseButton() const override; |
189 bool ShouldShowWindowTitle() const override; | 155 bool ShouldShowWindowTitle() const override; |
190 const gfx::FontList& GetTitleFontList() const override; | 156 const gfx::FontList& GetTitleFontList() const override; |
191 base::string16 GetWindowTitle() const override; | 157 base::string16 GetWindowTitle() const override; |
192 void OnWidgetDestroying(views::Widget* widget) override; | 158 void OnWidgetDestroying(views::Widget* widget) override; |
193 | 159 |
194 // ButtonListener: | 160 // ButtonListener: |
195 void ButtonPressed(views::Button* button, const ui::Event& event) override; | 161 void ButtonPressed(views::Button* button, const ui::Event& event) override; |
196 | 162 |
197 // ComboboxListener: | |
198 void OnPerformAction(views::Combobox* combobox) override; | |
199 | |
200 // PermissionCombobox::Listener: | 163 // PermissionCombobox::Listener: |
201 void PermissionSelectionChanged(int index, bool allowed) override; | 164 void PermissionSelectionChanged(int index, bool allowed) override; |
202 | 165 |
203 private: | 166 private: |
204 PermissionBubbleViewViews* owner_; | 167 PermissionBubbleViewViews* owner_; |
205 views::Button* allow_; | 168 views::Button* allow_; |
206 views::Button* deny_; | 169 views::Button* deny_; |
207 views::Combobox* allow_combobox_; | 170 views::Combobox* allow_combobox_; |
208 base::string16 hostname_; | 171 base::string16 hostname_; |
209 scoped_ptr<PermissionMenuModel> menu_button_model_; | 172 scoped_ptr<PermissionMenuModel> menu_button_model_; |
210 std::vector<PermissionCombobox*> customize_comboboxes_; | 173 std::vector<PermissionCombobox*> customize_comboboxes_; |
211 | 174 |
212 DISALLOW_COPY_AND_ASSIGN(PermissionsBubbleDelegateView); | 175 DISALLOW_COPY_AND_ASSIGN(PermissionsBubbleDelegateView); |
213 }; | 176 }; |
214 | 177 |
215 PermissionsBubbleDelegateView::PermissionsBubbleDelegateView( | 178 PermissionsBubbleDelegateView::PermissionsBubbleDelegateView( |
216 views::View* anchor, | 179 views::View* anchor, |
217 PermissionBubbleViewViews* owner, | 180 PermissionBubbleViewViews* owner, |
218 const std::string& languages, | 181 const std::string& languages, |
219 const std::vector<PermissionBubbleRequest*>& requests, | 182 const std::vector<PermissionBubbleRequest*>& requests, |
220 const std::vector<bool>& accept_state, | 183 const std::vector<bool>& accept_state) |
221 bool customization_mode) | |
222 : views::BubbleDelegateView(anchor, views::BubbleBorder::TOP_LEFT), | 184 : views::BubbleDelegateView(anchor, views::BubbleBorder::TOP_LEFT), |
223 owner_(owner), | 185 owner_(owner), |
224 allow_(NULL), | 186 allow_(NULL), |
225 deny_(NULL), | 187 deny_(NULL), |
226 allow_combobox_(NULL) { | 188 allow_combobox_(NULL) { |
227 DCHECK(!requests.empty()); | 189 DCHECK(!requests.empty()); |
228 | 190 |
229 RemoveAllChildViews(true); | 191 RemoveAllChildViews(true); |
230 customize_comboboxes_.clear(); | 192 customize_comboboxes_.clear(); |
231 set_close_on_esc(true); | 193 set_close_on_esc(true); |
232 set_close_on_deactivate(false); | 194 set_close_on_deactivate(false); |
233 | 195 |
234 SetLayoutManager(new views::BoxLayout( | 196 SetLayoutManager(new views::BoxLayout( |
235 views::BoxLayout::kVertical, kBubbleOuterMargin, 0, kItemMajorSpacing)); | 197 views::BoxLayout::kVertical, kBubbleOuterMargin, 0, kItemMajorSpacing)); |
236 | 198 |
237 hostname_ = net::FormatUrl(requests[0]->GetRequestingHostname(), | 199 hostname_ = net::FormatUrl(requests[0]->GetRequestingHostname(), |
238 languages, | 200 languages, |
239 net::kFormatUrlOmitUsernamePassword | | 201 net::kFormatUrlOmitUsernamePassword | |
240 net::kFormatUrlOmitTrailingSlashOnBareHostname, | 202 net::kFormatUrlOmitTrailingSlashOnBareHostname, |
241 net::UnescapeRule::SPACES, NULL, NULL, NULL); | 203 net::UnescapeRule::SPACES, NULL, NULL, NULL); |
242 | 204 |
243 ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance(); | 205 ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance(); |
244 for (size_t index = 0; index < requests.size(); index++) { | 206 for (size_t index = 0; index < requests.size(); index++) { |
245 DCHECK(index < accept_state.size()); | 207 DCHECK(index < accept_state.size()); |
246 // The row is laid out containing a leading-aligned label area and a | 208 // The row is laid out containing a leading-aligned label area and a |
247 // trailing column which will be filled during customization with a | 209 // trailing column which will be filled if there are multiple permission |
248 // combobox. | 210 // requests. |
249 views::View* row = new views::View(); | 211 views::View* row = new views::View(); |
250 views::GridLayout* row_layout = new views::GridLayout(row); | 212 views::GridLayout* row_layout = new views::GridLayout(row); |
251 row->SetLayoutManager(row_layout); | 213 row->SetLayoutManager(row_layout); |
252 views::ColumnSet* columns = row_layout->AddColumnSet(0); | 214 views::ColumnSet* columns = row_layout->AddColumnSet(0); |
253 columns->AddColumn(views::GridLayout::LEADING, views::GridLayout::FILL, | 215 columns->AddColumn(views::GridLayout::LEADING, views::GridLayout::FILL, |
254 0, views::GridLayout::USE_PREF, 0, 0); | 216 0, views::GridLayout::USE_PREF, 0, 0); |
255 columns->AddColumn(views::GridLayout::TRAILING, views::GridLayout::FILL, | 217 columns->AddColumn(views::GridLayout::TRAILING, views::GridLayout::FILL, |
256 100, views::GridLayout::USE_PREF, 0, 0); | 218 100, views::GridLayout::USE_PREF, 0, 0); |
257 row_layout->StartRow(0, 0); | 219 row_layout->StartRow(0, 0); |
258 | 220 |
259 views::View* label_container = new views::View(); | 221 views::View* label_container = new views::View(); |
260 label_container->SetLayoutManager( | 222 label_container->SetLayoutManager( |
261 new views::BoxLayout(views::BoxLayout::kHorizontal, | 223 new views::BoxLayout(views::BoxLayout::kHorizontal, |
262 kPermissionIndentSpacing, | 224 kPermissionIndentSpacing, |
263 0, kBubbleOuterMargin)); | 225 0, kBubbleOuterMargin)); |
264 views::ImageView* icon = new views::ImageView(); | 226 views::ImageView* icon = new views::ImageView(); |
265 icon->SetImage(bundle.GetImageSkiaNamed(requests.at(index)->GetIconID())); | 227 icon->SetImage(bundle.GetImageSkiaNamed(requests.at(index)->GetIconID())); |
266 icon->SetImageSize(gfx::Size(kIconSize, kIconSize)); | 228 icon->SetImageSize(gfx::Size(kIconSize, kIconSize)); |
267 icon->SetTooltipText(base::string16()); // Redundant with the text fragment | 229 icon->SetTooltipText(base::string16()); // Redundant with the text fragment |
268 label_container->AddChildView(icon); | 230 label_container->AddChildView(icon); |
269 views::Label* label = | 231 views::Label* label = |
270 new views::Label(requests.at(index)->GetMessageTextFragment()); | 232 new views::Label(requests.at(index)->GetMessageTextFragment()); |
271 label->SetHorizontalAlignment(gfx::ALIGN_LEFT); | 233 label->SetHorizontalAlignment(gfx::ALIGN_LEFT); |
272 label_container->AddChildView(label); | 234 label_container->AddChildView(label); |
273 row_layout->AddView(label_container); | 235 row_layout->AddView(label_container); |
274 | 236 |
275 if (customization_mode) { | 237 if (requests.size() > 1) { |
276 PermissionCombobox* combobox = new PermissionCombobox( | 238 PermissionCombobox* combobox = new PermissionCombobox( |
277 this, | 239 this, |
278 index, | 240 index, |
279 requests[index]->GetRequestingHostname(), | 241 requests[index]->GetRequestingHostname(), |
280 accept_state[index] ? CONTENT_SETTING_ALLOW : CONTENT_SETTING_BLOCK); | 242 accept_state[index] ? CONTENT_SETTING_ALLOW : CONTENT_SETTING_BLOCK); |
281 row_layout->AddView(combobox); | 243 row_layout->AddView(combobox); |
282 customize_comboboxes_.push_back(combobox); | 244 customize_comboboxes_.push_back(combobox); |
283 } else { | 245 } else { |
284 row_layout->AddView(new views::View()); | 246 row_layout->AddView(new views::View()); |
285 } | 247 } |
286 | 248 |
287 AddChildView(row); | 249 AddChildView(row); |
288 } | 250 } |
289 | 251 |
290 views::View* button_row = new views::View(); | 252 views::View* button_row = new views::View(); |
291 views::GridLayout* button_layout = new views::GridLayout(button_row); | 253 views::GridLayout* button_layout = new views::GridLayout(button_row); |
292 views::ColumnSet* columns = button_layout->AddColumnSet(0); | 254 views::ColumnSet* columns = button_layout->AddColumnSet(0); |
293 button_row->SetLayoutManager(button_layout); | 255 button_row->SetLayoutManager(button_layout); |
294 AddChildView(button_row); | 256 AddChildView(button_row); |
295 | 257 |
296 // Customization case: just an "OK" button | 258 // For multiple permissions: just an "OK" button. |
297 if (customization_mode) { | 259 if (requests.size() > 1) { |
298 columns->AddColumn(views::GridLayout::TRAILING, views::GridLayout::FILL, | 260 columns->AddColumn(views::GridLayout::TRAILING, views::GridLayout::FILL, |
299 100, views::GridLayout::USE_PREF, 0, 0); | 261 100, views::GridLayout::USE_PREF, 0, 0); |
300 button_layout->StartRow(0, 0); | 262 button_layout->StartRow(0, 0); |
301 views::LabelButton* ok_button = | 263 views::LabelButton* ok_button = |
302 new views::LabelButton(this, l10n_util::GetStringUTF16(IDS_OK)); | 264 new views::LabelButton(this, l10n_util::GetStringUTF16(IDS_OK)); |
303 ok_button->SetStyle(views::Button::STYLE_BUTTON); | 265 ok_button->SetStyle(views::Button::STYLE_BUTTON); |
304 button_layout->AddView(ok_button); | 266 button_layout->AddView(ok_button); |
305 allow_ = ok_button; | 267 allow_ = ok_button; |
306 | 268 |
307 button_layout->AddPaddingRow(0, kBubbleOuterMargin); | 269 button_layout->AddPaddingRow(0, kBubbleOuterMargin); |
308 return; | 270 return; |
309 } | 271 } |
310 | 272 |
311 // No customization: lay out the Deny/Allow buttons. | 273 // For a single permission: lay out the Deny/Allow buttons. |
312 | |
313 columns->AddColumn(views::GridLayout::TRAILING, views::GridLayout::FILL, | 274 columns->AddColumn(views::GridLayout::TRAILING, views::GridLayout::FILL, |
314 100, views::GridLayout::USE_PREF, 0, 0); | 275 100, views::GridLayout::USE_PREF, 0, 0); |
315 columns->AddPaddingColumn(0, kItemMajorSpacing - (2*kButtonBorderSize)); | 276 columns->AddPaddingColumn(0, kItemMajorSpacing - (2*kButtonBorderSize)); |
316 columns->AddColumn(views::GridLayout::TRAILING, views::GridLayout::FILL, | 277 columns->AddColumn(views::GridLayout::TRAILING, views::GridLayout::FILL, |
317 0, views::GridLayout::USE_PREF, 0, 0); | 278 0, views::GridLayout::USE_PREF, 0, 0); |
318 button_layout->StartRow(0, 0); | 279 button_layout->StartRow(0, 0); |
319 | 280 |
320 // Allow button is a regular button when there's only one option, and a | |
321 // STYLE_ACTION Combobox when there are more than one option and | |
322 // customization is an option. | |
323 | |
324 base::string16 allow_text = l10n_util::GetStringUTF16(IDS_PERMISSION_ALLOW); | 281 base::string16 allow_text = l10n_util::GetStringUTF16(IDS_PERMISSION_ALLOW); |
325 if (requests.size() == 1) { | 282 views::LabelButton* allow_button = new views::LabelButton(this, allow_text); |
326 views::LabelButton* allow_button = new views::LabelButton(this, allow_text); | 283 allow_button->SetStyle(views::Button::STYLE_BUTTON); |
327 allow_button->SetStyle(views::Button::STYLE_BUTTON); | 284 button_layout->AddView(allow_button); |
328 button_layout->AddView(allow_button); | 285 allow_ = allow_button; |
329 allow_ = allow_button; | |
330 } else { | |
331 views::Combobox* allow_combobox = new views::Combobox( | |
332 new CustomizeAllowComboboxModel()); | |
333 allow_combobox->set_listener(this); | |
334 allow_combobox->SetStyle(views::Combobox::STYLE_ACTION); | |
335 allow_combobox->SetAccessibleName( | |
336 l10n_util::GetStringUTF16(IDS_PERMISSION_ALLOW_COMBOBOX)); | |
337 button_layout->AddView(allow_combobox); | |
338 allow_combobox_ = allow_combobox; | |
339 } | |
340 | 286 |
341 base::string16 deny_text = l10n_util::GetStringUTF16(IDS_PERMISSION_DENY); | 287 base::string16 deny_text = l10n_util::GetStringUTF16(IDS_PERMISSION_DENY); |
342 views::LabelButton* deny_button = new views::LabelButton(this, deny_text); | 288 views::LabelButton* deny_button = new views::LabelButton(this, deny_text); |
343 deny_button->SetStyle(views::Button::STYLE_BUTTON); | 289 deny_button->SetStyle(views::Button::STYLE_BUTTON); |
344 button_layout->AddView(deny_button); | 290 button_layout->AddView(deny_button); |
345 deny_ = deny_button; | 291 deny_ = deny_button; |
346 | 292 |
347 button_layout->AddPaddingRow(0, kBubbleOuterMargin); | 293 button_layout->AddPaddingRow(0, kBubbleOuterMargin); |
348 } | 294 } |
349 | 295 |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
396 owner_->Accept(); | 342 owner_->Accept(); |
397 else if (button == deny_) | 343 else if (button == deny_) |
398 owner_->Deny(); | 344 owner_->Deny(); |
399 } | 345 } |
400 | 346 |
401 void PermissionsBubbleDelegateView::PermissionSelectionChanged( | 347 void PermissionsBubbleDelegateView::PermissionSelectionChanged( |
402 int index, bool allowed) { | 348 int index, bool allowed) { |
403 owner_->Toggle(index, allowed); | 349 owner_->Toggle(index, allowed); |
404 } | 350 } |
405 | 351 |
406 void PermissionsBubbleDelegateView::OnPerformAction( | |
407 views::Combobox* combobox) { | |
408 if (combobox == allow_combobox_) { | |
409 if (combobox->selected_index() == | |
410 CustomizeAllowComboboxModel::INDEX_CUSTOMIZE) | |
411 owner_->SetCustomizationMode(); | |
412 else if (combobox->selected_index() == | |
413 CustomizeAllowComboboxModel::INDEX_ALLOW) | |
414 owner_->Accept(); | |
415 } | |
416 } | |
417 | |
418 ////////////////////////////////////////////////////////////////////////////// | 352 ////////////////////////////////////////////////////////////////////////////// |
419 // PermissionBubbleViewViews | 353 // PermissionBubbleViewViews |
420 | 354 |
421 PermissionBubbleViewViews::PermissionBubbleViewViews( | 355 PermissionBubbleViewViews::PermissionBubbleViewViews( |
422 views::View* anchor_view, | 356 views::View* anchor_view, |
423 const std::string& languages) | 357 const std::string& languages) |
424 : anchor_view_(anchor_view), | 358 : anchor_view_(anchor_view), |
425 delegate_(NULL), | 359 delegate_(NULL), |
426 bubble_delegate_(NULL), | 360 bubble_delegate_(NULL), |
427 languages_(languages) {} | 361 languages_(languages) {} |
428 | 362 |
429 PermissionBubbleViewViews::~PermissionBubbleViewViews() { | 363 PermissionBubbleViewViews::~PermissionBubbleViewViews() { |
430 if (delegate_) | 364 if (delegate_) |
431 delegate_->SetView(NULL); | 365 delegate_->SetView(NULL); |
432 } | 366 } |
433 | 367 |
434 void PermissionBubbleViewViews::SetDelegate(Delegate* delegate) { | 368 void PermissionBubbleViewViews::SetDelegate(Delegate* delegate) { |
435 delegate_ = delegate; | 369 delegate_ = delegate; |
436 } | 370 } |
437 | 371 |
438 void PermissionBubbleViewViews::Show( | 372 void PermissionBubbleViewViews::Show( |
439 const std::vector<PermissionBubbleRequest*>& requests, | 373 const std::vector<PermissionBubbleRequest*>& requests, |
440 const std::vector<bool>& values, | 374 const std::vector<bool>& values) { |
441 bool customization_mode) { | |
442 if (bubble_delegate_ != NULL) | 375 if (bubble_delegate_ != NULL) |
443 bubble_delegate_->Close(); | 376 bubble_delegate_->Close(); |
444 | 377 |
445 bubble_delegate_ = | 378 bubble_delegate_ = |
446 new PermissionsBubbleDelegateView(anchor_view_, this, languages_, | 379 new PermissionsBubbleDelegateView(anchor_view_, this, languages_, |
447 requests, values, customization_mode); | 380 requests, values); |
448 views::BubbleDelegateView::CreateBubble(bubble_delegate_)->Show(); | 381 views::BubbleDelegateView::CreateBubble(bubble_delegate_)->Show(); |
449 bubble_delegate_->SizeToContents(); | 382 bubble_delegate_->SizeToContents(); |
450 } | 383 } |
451 | 384 |
452 bool PermissionBubbleViewViews::CanAcceptRequestUpdate() { | 385 bool PermissionBubbleViewViews::CanAcceptRequestUpdate() { |
453 return !(bubble_delegate_ && bubble_delegate_->IsMouseHovered()); | 386 return !(bubble_delegate_ && bubble_delegate_->IsMouseHovered()); |
454 } | 387 } |
455 | 388 |
456 void PermissionBubbleViewViews::Hide() { | 389 void PermissionBubbleViewViews::Hide() { |
457 if (bubble_delegate_) { | 390 if (bubble_delegate_) { |
(...skipping 20 matching lines...) Expand all Loading... |
478 | 411 |
479 void PermissionBubbleViewViews::Accept() { | 412 void PermissionBubbleViewViews::Accept() { |
480 if (delegate_) | 413 if (delegate_) |
481 delegate_->Accept(); | 414 delegate_->Accept(); |
482 } | 415 } |
483 | 416 |
484 void PermissionBubbleViewViews::Deny() { | 417 void PermissionBubbleViewViews::Deny() { |
485 if (delegate_) | 418 if (delegate_) |
486 delegate_->Deny(); | 419 delegate_->Deny(); |
487 } | 420 } |
488 | |
489 void PermissionBubbleViewViews::SetCustomizationMode() { | |
490 if (delegate_) | |
491 delegate_->SetCustomizationMode(); | |
492 } | |
OLD | NEW |