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/gtk/website_settings_popup_gtk.h" | 5 #include "chrome/browser/ui/gtk/website_settings/website_settings_popup_gtk.h" |
6 | 6 |
7 #include "base/i18n/rtl.h" | 7 #include "base/i18n/rtl.h" |
8 #include "base/string_number_conversions.h" | 8 #include "base/string_number_conversions.h" |
9 #include "base/utf_string_conversions.h" | 9 #include "base/utf_string_conversions.h" |
10 #include "chrome/browser/certificate_viewer.h" | 10 #include "chrome/browser/certificate_viewer.h" |
11 #include "chrome/browser/ui/browser.h" | 11 #include "chrome/browser/ui/browser.h" |
12 #include "chrome/browser/ui/browser_list.h" | 12 #include "chrome/browser/ui/browser_list.h" |
13 #include "chrome/browser/ui/gtk/browser_toolbar_gtk.h" | 13 #include "chrome/browser/ui/gtk/browser_toolbar_gtk.h" |
14 #include "chrome/browser/ui/gtk/browser_window_gtk.h" | 14 #include "chrome/browser/ui/gtk/browser_window_gtk.h" |
15 #include "chrome/browser/ui/gtk/collected_cookies_gtk.h" | 15 #include "chrome/browser/ui/gtk/collected_cookies_gtk.h" |
16 #include "chrome/browser/ui/gtk/gtk_chrome_link_button.h" | 16 #include "chrome/browser/ui/gtk/gtk_chrome_link_button.h" |
17 #include "chrome/browser/ui/gtk/gtk_util.h" | 17 #include "chrome/browser/ui/gtk/gtk_util.h" |
18 #include "chrome/browser/ui/gtk/gtk_theme_service.h" | 18 #include "chrome/browser/ui/gtk/gtk_theme_service.h" |
19 #include "chrome/browser/ui/gtk/location_bar_view_gtk.h" | 19 #include "chrome/browser/ui/gtk/location_bar_view_gtk.h" |
| 20 #include "chrome/browser/ui/gtk/website_settings/permission_selector.h" |
20 #include "chrome/browser/ui/tab_contents/tab_contents.h" | 21 #include "chrome/browser/ui/tab_contents/tab_contents.h" |
21 #include "chrome/browser/ui/website_settings/website_settings.h" | 22 #include "chrome/browser/ui/website_settings/website_settings.h" |
22 #include "chrome/browser/ui/website_settings/website_settings_utils.h" | 23 #include "chrome/browser/ui/website_settings/website_settings_utils.h" |
23 #include "chrome/common/url_constants.h" | 24 #include "chrome/common/url_constants.h" |
24 #include "content/public/browser/cert_store.h" | 25 #include "content/public/browser/cert_store.h" |
25 #include "googleurl/src/gurl.h" | 26 #include "googleurl/src/gurl.h" |
26 #include "grit/chromium_strings.h" | 27 #include "grit/chromium_strings.h" |
27 #include "grit/generated_resources.h" | 28 #include "grit/generated_resources.h" |
28 #include "grit/locale_settings.h" | 29 #include "grit/locale_settings.h" |
29 #include "grit/theme_resources.h" | 30 #include "grit/theme_resources.h" |
30 #include "ui/base/gtk/gtk_hig_constants.h" | 31 #include "ui/base/gtk/gtk_hig_constants.h" |
31 #include "ui/base/l10n/l10n_util.h" | 32 #include "ui/base/l10n/l10n_util.h" |
32 #include "ui/base/resource/resource_bundle.h" | 33 #include "ui/base/resource/resource_bundle.h" |
33 | 34 |
34 using content::OpenURLParams; | 35 using content::OpenURLParams; |
35 | 36 |
36 namespace { | 37 namespace { |
37 | 38 |
38 // The background color of the tabs if a theme other than the native GTK theme | 39 // The background color of the tabs if a theme other than the native GTK theme |
39 // is selected. | 40 // is selected. |
40 const GdkColor kBackgroundColor = GDK_COLOR_RGB(0xff, 0xff, 0xff); | 41 const GdkColor kBackgroundColor = GDK_COLOR_RGB(0xff, 0xff, 0xff); |
41 | 42 |
| 43 GtkWidget* CreateTextLabel(const std::string& text, |
| 44 int width, |
| 45 GtkThemeService* theme_service) { |
| 46 GtkWidget* label = theme_service->BuildLabel(text, ui::kGdkBlack); |
| 47 if (width > 0) |
| 48 gtk_util::SetLabelWidth(label, width); |
| 49 gtk_label_set_selectable(GTK_LABEL(label), TRUE); |
| 50 gtk_label_set_line_wrap_mode(GTK_LABEL(label), PANGO_WRAP_WORD_CHAR); |
| 51 return label; |
| 52 } |
| 53 |
42 class InternalPageInfoPopupGtk : public BubbleDelegateGtk { | 54 class InternalPageInfoPopupGtk : public BubbleDelegateGtk { |
43 public: | 55 public: |
44 explicit InternalPageInfoPopupGtk(gfx::NativeWindow parent, | 56 explicit InternalPageInfoPopupGtk(gfx::NativeWindow parent, |
45 Profile* profile); | 57 Profile* profile); |
46 virtual ~InternalPageInfoPopupGtk(); | 58 virtual ~InternalPageInfoPopupGtk(); |
47 | 59 |
48 private: | 60 private: |
49 // BubbleDelegateGtk implementation. | 61 // BubbleDelegateGtk implementation. |
50 virtual void BubbleClosing(BubbleGtk* bubble, bool closed_by_escape) OVERRIDE; | 62 virtual void BubbleClosing(BubbleGtk* bubble, bool closed_by_escape) OVERRIDE; |
51 | 63 |
(...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
283 gtk_box_pack_start(GTK_BOX(section_box), title_hbox, FALSE, FALSE, 0); | 295 gtk_box_pack_start(GTK_BOX(section_box), title_hbox, FALSE, FALSE, 0); |
284 | 296 |
285 gtk_box_pack_start(GTK_BOX(title_hbox), label, FALSE, FALSE, 0); | 297 gtk_box_pack_start(GTK_BOX(title_hbox), label, FALSE, FALSE, 0); |
286 | 298 |
287 // Add section content | 299 // Add section content |
288 gtk_box_pack_start(GTK_BOX(section_box), section_content, FALSE, FALSE, 0); | 300 gtk_box_pack_start(GTK_BOX(section_box), section_content, FALSE, FALSE, 0); |
289 return section_box; | 301 return section_box; |
290 | 302 |
291 } | 303 } |
292 | 304 |
| 305 void WebsiteSettingsPopupGtk::OnPermissionChanged( |
| 306 PermissionSelector* selector) { |
| 307 presenter_->OnSitePermissionChanged(selector->type(), |
| 308 selector->setting()); |
| 309 } |
| 310 |
| 311 void WebsiteSettingsPopupGtk::OnComboboxShown() { |
| 312 bubble_->HandlePointerAndKeyboardUngrabbedByContent(); |
| 313 } |
| 314 |
293 void WebsiteSettingsPopupGtk::SetCookieInfo( | 315 void WebsiteSettingsPopupGtk::SetCookieInfo( |
294 const CookieInfoList& cookie_info_list) { | 316 const CookieInfoList& cookie_info_list) { |
295 DCHECK(cookies_section_contents_); | 317 DCHECK(cookies_section_contents_); |
296 ClearContainer(cookies_section_contents_); | 318 ClearContainer(cookies_section_contents_); |
297 | 319 |
298 // Create cookies info rows. | 320 // Create cookies info rows. |
299 for (CookieInfoList::const_iterator it = cookie_info_list.begin(); | 321 for (CookieInfoList::const_iterator it = cookie_info_list.begin(); |
300 it != cookie_info_list.end(); | 322 it != cookie_info_list.end(); |
301 ++it) { | 323 ++it) { |
| 324 // Create the cookies info box. |
302 GtkWidget* cookies_info = gtk_hbox_new(FALSE, 0); | 325 GtkWidget* cookies_info = gtk_hbox_new(FALSE, 0); |
303 GtkWidget* label = CreateTextLabel(it->cookie_source, 200); | |
304 gtk_box_pack_start(GTK_BOX(cookies_info), label, FALSE, FALSE, 0); | |
305 | 326 |
306 std::string allowed_count = base::IntToString(it->allowed); | 327 // Add the icon to the cookies info box |
307 std::string blocked_count = base::IntToString(it->blocked); | 328 GdkPixbuf* pixbuf = WebsiteSettingsUI::GetPermissionIcon( |
308 // TODO(markusheintz): Add a localized label here once we decided how this | 329 CONTENT_SETTINGS_TYPE_COOKIES, CONTENT_SETTING_ALLOW).ToGdkPixbuf(); |
309 // information should be displayed. | 330 GtkWidget* image = gtk_image_new_from_pixbuf(pixbuf); |
310 std::string info_str = " (" + allowed_count + " allowed / " | 331 gtk_misc_set_alignment(GTK_MISC(image), 0, 0); |
311 + blocked_count + " blocked)"; | 332 gtk_box_pack_start(GTK_BOX(cookies_info), image, FALSE, FALSE, 0); |
| 333 |
| 334 // Add the allowed and blocked cookies counts to the cookies info box. |
| 335 std::string info_str = l10n_util::GetStringFUTF8( |
| 336 IDS_WEBSITE_SETTINGS_SITE_DATA_STATS_LINE, |
| 337 UTF8ToUTF16(it->cookie_source), |
| 338 base::IntToString16(it->allowed), |
| 339 base::IntToString16(it->blocked)); |
312 | 340 |
313 GtkWidget* info = theme_service_->BuildLabel(info_str, ui::kGdkBlack); | 341 GtkWidget* info = theme_service_->BuildLabel(info_str, ui::kGdkBlack); |
314 gtk_label_set_selectable(GTK_LABEL(info), TRUE); | 342 gtk_label_set_selectable(GTK_LABEL(info), TRUE); |
315 gtk_box_pack_start(GTK_BOX(cookies_info), info, FALSE, FALSE, 0); | 343 const int kPadding = 4; |
| 344 gtk_box_pack_start(GTK_BOX(cookies_info), info, FALSE, FALSE, kPadding); |
316 | 345 |
| 346 // Add the cookies info box to the section box. |
317 gtk_box_pack_start(GTK_BOX(cookies_section_contents_), | 347 gtk_box_pack_start(GTK_BOX(cookies_section_contents_), |
318 cookies_info, | 348 cookies_info, |
319 FALSE, FALSE, 0); | 349 FALSE, FALSE, 0); |
320 } | 350 } |
321 | 351 |
322 // Create row with links for cookie settings and for the cookies dialog. | 352 // Create row with links for cookie settings and for the cookies dialog. |
323 GtkWidget* link_hbox = gtk_hbox_new(FALSE, 0); | 353 GtkWidget* link_hbox = gtk_hbox_new(FALSE, 0); |
324 | 354 |
325 GtkWidget* view_cookies_link = theme_service_->BuildChromeLinkButton( | 355 GtkWidget* view_cookies_link = theme_service_->BuildChromeLinkButton( |
326 l10n_util::GetStringUTF8(IDS_WEBSITE_SETTINGS_SHOW_SITE_DATA)); | 356 l10n_util::GetStringUTF8(IDS_WEBSITE_SETTINGS_SHOW_SITE_DATA)); |
327 g_signal_connect(view_cookies_link, "clicked", | 357 g_signal_connect(view_cookies_link, "clicked", |
328 G_CALLBACK(OnCookiesLinkClickedThunk), this); | 358 G_CALLBACK(OnCookiesLinkClickedThunk), this); |
329 gtk_box_pack_start(GTK_BOX(link_hbox), view_cookies_link, | 359 gtk_box_pack_start(GTK_BOX(link_hbox), view_cookies_link, |
330 FALSE, FALSE, 0); | 360 FALSE, FALSE, 0); |
331 | 361 |
332 gtk_box_pack_start(GTK_BOX(cookies_section_contents_), link_hbox, | 362 gtk_box_pack_start(GTK_BOX(cookies_section_contents_), link_hbox, |
333 TRUE, FALSE, 0); | 363 TRUE, FALSE, 0); |
334 | 364 |
335 gtk_widget_show_all(cookies_section_contents_); | 365 gtk_widget_show_all(cookies_section_contents_); |
336 } | 366 } |
337 | 367 |
338 GtkWidget* WebsiteSettingsPopupGtk::CreateTextLabel(const std::string& text, | |
339 int width) { | |
340 GtkWidget* label = theme_service_->BuildLabel(text, ui::kGdkBlack); | |
341 gtk_util::SetLabelWidth(label, width); | |
342 gtk_label_set_selectable(GTK_LABEL(label), TRUE); | |
343 gtk_label_set_line_wrap_mode(GTK_LABEL(label), PANGO_WRAP_WORD_CHAR); | |
344 return label; | |
345 } | |
346 | |
347 void WebsiteSettingsPopupGtk::SetIdentityInfo( | 368 void WebsiteSettingsPopupGtk::SetIdentityInfo( |
348 const IdentityInfo& identity_info) { | 369 const IdentityInfo& identity_info) { |
349 // Create popup header. | 370 // Create popup header. |
350 DCHECK(header_box_); | 371 DCHECK(header_box_); |
351 ClearContainer(header_box_); | 372 ClearContainer(header_box_); |
352 | 373 |
353 GtkWidget* identity_label = theme_service_->BuildLabel( | 374 GtkWidget* identity_label = theme_service_->BuildLabel( |
354 identity_info.site_identity, ui::kGdkBlack); | 375 identity_info.site_identity, ui::kGdkBlack); |
355 gtk_label_set_selectable(GTK_LABEL(identity_label), TRUE); | 376 gtk_label_set_selectable(GTK_LABEL(identity_label), TRUE); |
356 PangoAttrList* attributes = pango_attr_list_new(); | 377 PangoAttrList* attributes = pango_attr_list_new(); |
(...skipping 10 matching lines...) Expand all Loading... |
367 case WebsiteSettings::SITE_IDENTITY_STATUS_DNSSEC_CERT: | 388 case WebsiteSettings::SITE_IDENTITY_STATUS_DNSSEC_CERT: |
368 case WebsiteSettings::SITE_IDENTITY_STATUS_EV_CERT: | 389 case WebsiteSettings::SITE_IDENTITY_STATUS_EV_CERT: |
369 identity_status_text = | 390 identity_status_text = |
370 l10n_util::GetStringUTF8(IDS_WEBSITE_SETTINGS_IDENTITY_VERIFIED); | 391 l10n_util::GetStringUTF8(IDS_WEBSITE_SETTINGS_IDENTITY_VERIFIED); |
371 break; | 392 break; |
372 default: | 393 default: |
373 identity_status_text = | 394 identity_status_text = |
374 l10n_util::GetStringUTF8(IDS_WEBSITE_SETTINGS_IDENTITY_NOT_VERIFIED); | 395 l10n_util::GetStringUTF8(IDS_WEBSITE_SETTINGS_IDENTITY_NOT_VERIFIED); |
375 break; | 396 break; |
376 } | 397 } |
377 GtkWidget* status_label = CreateTextLabel(identity_status_text, 400); | 398 GtkWidget* status_label = |
| 399 CreateTextLabel(identity_status_text, 400, theme_service_); |
378 gtk_box_pack_start( | 400 gtk_box_pack_start( |
379 GTK_BOX(header_box_), status_label, FALSE, FALSE, 0); | 401 GTK_BOX(header_box_), status_label, FALSE, FALSE, 0); |
380 gtk_widget_show_all(header_box_); | 402 gtk_widget_show_all(header_box_); |
381 | 403 |
382 // Create identity tab contents. | 404 // Create identity tab contents. |
383 DCHECK(identity_tab_contents_); | 405 DCHECK(identity_tab_contents_); |
384 ClearContainer(identity_tab_contents_); | 406 ClearContainer(identity_tab_contents_); |
385 | 407 |
386 // Create identity section. | 408 // Create identity section. |
387 GtkWidget* identity_description = | 409 GtkWidget* identity_description = |
388 CreateTextLabel(identity_info.identity_status_description, 300); | 410 CreateTextLabel(identity_info.identity_status_description, 300, |
| 411 theme_service_); |
389 GtkWidget* identity_box = gtk_vbox_new(FALSE, ui::kControlSpacing); | 412 GtkWidget* identity_box = gtk_vbox_new(FALSE, ui::kControlSpacing); |
390 gtk_box_pack_start(GTK_BOX(identity_box), identity_description, FALSE, FALSE, | 413 gtk_box_pack_start(GTK_BOX(identity_box), identity_description, FALSE, FALSE, |
391 0); | 414 0); |
392 if (identity_info.cert_id) { | 415 if (identity_info.cert_id) { |
393 cert_id_ = identity_info.cert_id; | 416 cert_id_ = identity_info.cert_id; |
394 GtkWidget* view_cert_link = theme_service_->BuildChromeLinkButton( | 417 GtkWidget* view_cert_link = theme_service_->BuildChromeLinkButton( |
395 l10n_util::GetStringUTF8(IDS_PAGEINFO_CERT_INFO_BUTTON)); | 418 l10n_util::GetStringUTF8(IDS_PAGEINFO_CERT_INFO_BUTTON)); |
396 g_signal_connect(view_cert_link, "clicked", | 419 g_signal_connect(view_cert_link, "clicked", |
397 G_CALLBACK(OnViewCertLinkClickedThunk), this); | 420 G_CALLBACK(OnViewCertLinkClickedThunk), this); |
398 GtkWidget* link_hbox = gtk_hbox_new(FALSE, 0); | 421 GtkWidget* link_hbox = gtk_hbox_new(FALSE, 0); |
399 gtk_box_pack_start(GTK_BOX(link_hbox), view_cert_link, | 422 gtk_box_pack_start(GTK_BOX(link_hbox), view_cert_link, |
400 FALSE, FALSE, 0); | 423 FALSE, FALSE, 0); |
401 gtk_box_pack_start(GTK_BOX(identity_box), link_hbox, FALSE, FALSE, 0); | 424 gtk_box_pack_start(GTK_BOX(identity_box), link_hbox, FALSE, FALSE, 0); |
402 } | 425 } |
403 | 426 |
| 427 |
404 // Create connection section. | 428 // Create connection section. |
405 GtkWidget* connection_description = | 429 GtkWidget* connection_description = |
406 CreateTextLabel(identity_info.connection_status_description, 300); | 430 CreateTextLabel(identity_info.connection_status_description, 300, |
| 431 theme_service_); |
407 GtkWidget* connection_box = gtk_vbox_new(FALSE, ui::kControlSpacing); | 432 GtkWidget* connection_box = gtk_vbox_new(FALSE, ui::kControlSpacing); |
408 gtk_box_pack_start(GTK_BOX(connection_box), connection_description, FALSE, | 433 gtk_box_pack_start(GTK_BOX(connection_box), connection_description, FALSE, |
409 FALSE, 0); | 434 FALSE, 0); |
410 | 435 |
411 // Add to contents. | 436 // Add to contents. |
412 gtk_box_pack_start( | 437 gtk_box_pack_start( |
413 GTK_BOX(identity_tab_contents_), CreateSection( | 438 GTK_BOX(identity_tab_contents_), CreateSection( |
414 l10n_util::GetStringUTF8(IDS_WEBSITE_SETTINGS_TITLE_IDENTITY), | 439 l10n_util::GetStringUTF8(IDS_WEBSITE_SETTINGS_TITLE_IDENTITY), |
415 identity_box), | 440 identity_box), |
416 TRUE, | 441 TRUE, |
(...skipping 12 matching lines...) Expand all Loading... |
429 FALSE, | 454 FALSE, |
430 0); | 455 0); |
431 | 456 |
432 gtk_widget_show_all(identity_tab_contents_); | 457 gtk_widget_show_all(identity_tab_contents_); |
433 } | 458 } |
434 | 459 |
435 void WebsiteSettingsPopupGtk::SetFirstVisit(const string16& first_visit) { | 460 void WebsiteSettingsPopupGtk::SetFirstVisit(const string16& first_visit) { |
436 DCHECK(first_visit_contents_); | 461 DCHECK(first_visit_contents_); |
437 ClearContainer(first_visit_contents_); | 462 ClearContainer(first_visit_contents_); |
438 | 463 |
439 GtkWidget* first_visit_label = CreateTextLabel(UTF16ToUTF8(first_visit), 400); | 464 GtkWidget* first_visit_label = CreateTextLabel(UTF16ToUTF8(first_visit), 400, |
| 465 theme_service_); |
440 gtk_box_pack_start( | 466 gtk_box_pack_start( |
441 GTK_BOX(first_visit_contents_), first_visit_label, FALSE, FALSE, 0); | 467 GTK_BOX(first_visit_contents_), first_visit_label, FALSE, FALSE, 0); |
442 gtk_widget_show_all(first_visit_contents_); | 468 gtk_widget_show_all(first_visit_contents_); |
443 } | 469 } |
444 | 470 |
445 void WebsiteSettingsPopupGtk::SetPermissionInfo( | 471 void WebsiteSettingsPopupGtk::SetPermissionInfo( |
446 const PermissionInfoList& permission_info_list) { | 472 const PermissionInfoList& permission_info_list) { |
447 DCHECK(permissions_section_contents_); | 473 DCHECK(permissions_section_contents_); |
448 ClearContainer(permissions_section_contents_); | 474 ClearContainer(permissions_section_contents_); |
| 475 // Clear the map since the UI is reconstructed. |
| 476 selectors_.clear(); |
449 | 477 |
450 for (PermissionInfoList::const_iterator permission = | 478 for (PermissionInfoList::const_iterator permission = |
451 permission_info_list.begin(); | 479 permission_info_list.begin(); |
452 permission != permission_info_list.end(); | 480 permission != permission_info_list.end(); |
453 ++permission) { | 481 ++permission) { |
454 // Add a label for the permission type. | 482 PermissionSelector* selector = |
455 GtkWidget* label = CreateTextLabel(UTF16ToUTF8( | 483 new PermissionSelector( |
456 WebsiteSettingsUI::PermissionTypeToUIString(permission->type)), 250); | 484 theme_service_, |
457 GtkWidget* hbox = gtk_hbox_new(FALSE, 0); | 485 permission->type, |
458 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); | 486 permission->setting, |
459 | 487 permission->default_setting); |
460 GtkListStore* store = | 488 selector->AddObserver(this); |
461 gtk_list_store_new(3, G_TYPE_STRING, G_TYPE_INT, G_TYPE_INT); | 489 GtkWidget* hbox = selector->CreateUI(); |
462 GtkTreeIter iter; | 490 selectors_.push_back(selector); |
463 // Add option for permission "Global Default" to the combobox model. | |
464 std::string setting_str; | |
465 switch (permission->default_setting) { | |
466 case CONTENT_SETTING_ALLOW: | |
467 setting_str = l10n_util::GetStringUTF8( | |
468 IDS_WEBSITE_SETTINGS_MENU_ITEM_DEFAULT_ALLOW); | |
469 break; | |
470 case CONTENT_SETTING_BLOCK: | |
471 setting_str = l10n_util::GetStringUTF8( | |
472 IDS_WEBSITE_SETTINGS_MENU_ITEM_DEFAULT_BLOCK); | |
473 break; | |
474 case CONTENT_SETTING_ASK: | |
475 setting_str = l10n_util::GetStringUTF8( | |
476 IDS_WEBSITE_SETTINGS_MENU_ITEM_DEFAULT_ASK); | |
477 break; | |
478 default: | |
479 break; | |
480 } | |
481 gtk_list_store_append(store, &iter); | |
482 gtk_list_store_set(store, &iter, 0, setting_str.c_str(), 1, | |
483 CONTENT_SETTING_DEFAULT, 2, permission->type, -1); | |
484 GtkWidget* combo_box = gtk_combo_box_new_with_model(GTK_TREE_MODEL(store)); | |
485 // Add option for permission "Allow" to the combobox model. | |
486 setting_str = l10n_util::GetStringUTF8( | |
487 IDS_WEBSITE_SETTINGS_MENU_ITEM_ALLOW); | |
488 gtk_list_store_append(store, &iter); | |
489 gtk_list_store_set(store, &iter, 0, setting_str.c_str(), 1, | |
490 CONTENT_SETTING_ALLOW, 2, permission->type, -1); | |
491 // The content settings type fullscreen does not support the concept of | |
492 // blocking. | |
493 if (permission->type != CONTENT_SETTINGS_TYPE_FULLSCREEN) { | |
494 // Add option for permission "BLOCK" to the combobox model. | |
495 setting_str = l10n_util::GetStringUTF8( | |
496 IDS_WEBSITE_SETTINGS_MENU_ITEM_BLOCK); | |
497 gtk_list_store_append(store, &iter); | |
498 gtk_list_store_set(store, &iter, 0, setting_str.c_str(), 1, | |
499 CONTENT_SETTING_BLOCK, 2, permission->type, -1); | |
500 } | |
501 // Remove reference to the store to prevent leaking. | |
502 g_object_unref(G_OBJECT(store)); | |
503 | |
504 GtkCellRenderer* cell = gtk_cell_renderer_text_new(); | |
505 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(combo_box), cell, TRUE ); | |
506 gtk_cell_layout_set_attributes( | |
507 GTK_CELL_LAYOUT(combo_box), cell, "text", 0, NULL); | |
508 | |
509 // Select the combobox entry for the currently configured permission value. | |
510 int active = -1; | |
511 switch (permission->setting) { | |
512 case CONTENT_SETTING_DEFAULT: active = 0; | |
513 break; | |
514 case CONTENT_SETTING_ALLOW: active = 1; | |
515 break; | |
516 case CONTENT_SETTING_BLOCK: active = 2; | |
517 break; | |
518 default: | |
519 NOTREACHED() << "Bad content setting:" << permission->setting; | |
520 break; | |
521 } | |
522 gtk_combo_box_set_active(GTK_COMBO_BOX(combo_box), active); | |
523 | |
524 // Add change listener to the combobox. | |
525 g_signal_connect(combo_box, "changed", | |
526 G_CALLBACK(OnPermissionChangedThunk), this); | |
527 // Once the popup (window) for a combobox is shown, the bubble container | |
528 // (window) loses it's focus. Therefore it necessary to reset the focus to | |
529 // the bubble container after the combobox popup is closed. | |
530 g_signal_connect(combo_box, "notify::popup-shown", | |
531 G_CALLBACK(OnComboBoxShownThunk), this); | |
532 gtk_box_pack_start(GTK_BOX(hbox), combo_box, FALSE, FALSE, 0); | |
533 | |
534 gtk_box_pack_start(GTK_BOX(permissions_section_contents_), hbox, FALSE, | 491 gtk_box_pack_start(GTK_BOX(permissions_section_contents_), hbox, FALSE, |
535 FALSE, 0); | 492 FALSE, 0); |
536 } | 493 } |
537 | 494 |
538 GtkWidget* show_content_settings_link = theme_service_->BuildChromeLinkButton( | 495 GtkWidget* show_content_settings_link = theme_service_->BuildChromeLinkButton( |
539 l10n_util::GetStringUTF8(IDS_WEBSITE_SETTINGS_SHOW_PERMISSION_SETTINGS)); | 496 l10n_util::GetStringUTF8(IDS_WEBSITE_SETTINGS_SHOW_PERMISSION_SETTINGS)); |
540 g_signal_connect(show_content_settings_link, "clicked", | 497 g_signal_connect(show_content_settings_link, "clicked", |
541 G_CALLBACK(OnPermissionsSettingsLinkClickedThunk), this); | 498 G_CALLBACK(OnPermissionsSettingsLinkClickedThunk), this); |
542 GtkWidget* link_hbox = gtk_hbox_new(FALSE, 0); | 499 GtkWidget* link_hbox = gtk_hbox_new(FALSE, 0); |
543 gtk_box_pack_start(GTK_BOX(link_hbox), show_content_settings_link, | 500 gtk_box_pack_start(GTK_BOX(link_hbox), show_content_settings_link, |
544 FALSE, FALSE, 0); | 501 FALSE, FALSE, 0); |
545 | 502 |
546 gtk_box_pack_start(GTK_BOX(permissions_section_contents_), link_hbox, | 503 gtk_box_pack_start(GTK_BOX(permissions_section_contents_), link_hbox, |
547 FALSE, FALSE, 0); | 504 FALSE, FALSE, 0); |
548 | 505 |
549 gtk_widget_show_all(permissions_section_contents_); | 506 gtk_widget_show_all(permissions_section_contents_); |
550 } | 507 } |
551 | 508 |
552 void WebsiteSettingsPopupGtk::OnComboBoxShown(GtkWidget* widget, | |
553 GParamSpec* property) { | |
554 // GtkComboBox grabs the keyboard and pointer when it displays its popup, | |
555 // which steals the grabs that BubbleGtk had installed. When the popup is | |
556 // hidden, we notify BubbleGtk so it can try to reacquire the grabs | |
557 // (otherwise, GTK won't activate our widgets when the user clicks in them). | |
558 gboolean popup_shown = FALSE; | |
559 g_object_get(G_OBJECT(GTK_COMBO_BOX(widget)), "popup-shown", &popup_shown, | |
560 NULL); | |
561 if (!popup_shown) | |
562 bubble_->HandlePointerAndKeyboardUngrabbedByContent(); | |
563 } | |
564 | |
565 void WebsiteSettingsPopupGtk::OnCookiesLinkClicked(GtkWidget* widget) { | 509 void WebsiteSettingsPopupGtk::OnCookiesLinkClicked(GtkWidget* widget) { |
566 new CollectedCookiesGtk(GTK_WINDOW(parent_), | 510 new CollectedCookiesGtk(GTK_WINDOW(parent_), |
567 tab_contents_); | 511 tab_contents_); |
568 bubble_->Close(); | 512 bubble_->Close(); |
569 } | 513 } |
570 | 514 |
571 void WebsiteSettingsPopupGtk::OnPermissionsSettingsLinkClicked( | 515 void WebsiteSettingsPopupGtk::OnPermissionsSettingsLinkClicked( |
572 GtkWidget* widget) { | 516 GtkWidget* widget) { |
573 browser_->OpenURL(OpenURLParams( | 517 browser_->OpenURL(OpenURLParams( |
574 GURL(std::string( | 518 GURL(std::string( |
575 chrome::kChromeUISettingsURL) + chrome::kContentSettingsSubPage), | 519 chrome::kChromeUISettingsURL) + chrome::kContentSettingsSubPage), |
576 content::Referrer(), | 520 content::Referrer(), |
577 NEW_FOREGROUND_TAB, | 521 NEW_FOREGROUND_TAB, |
578 content::PAGE_TRANSITION_LINK, | 522 content::PAGE_TRANSITION_LINK, |
579 false)); | 523 false)); |
580 bubble_->Close(); | 524 bubble_->Close(); |
581 } | 525 } |
582 | 526 |
583 void WebsiteSettingsPopupGtk::OnPermissionChanged(GtkWidget* widget) { | |
584 GtkTreeIter it; | |
585 bool has_active = gtk_combo_box_get_active_iter(GTK_COMBO_BOX(widget), &it); | |
586 DCHECK(has_active); | |
587 GtkTreeModel* store = | |
588 GTK_TREE_MODEL(gtk_combo_box_get_model(GTK_COMBO_BOX(widget))); | |
589 | |
590 int value = -1; | |
591 int type = -1; | |
592 gtk_tree_model_get(store, &it, 1, &value, 2, &type, -1); | |
593 | |
594 if (presenter_.get()) | |
595 presenter_->OnSitePermissionChanged(ContentSettingsType(type), | |
596 ContentSetting(value)); | |
597 } | |
598 | |
599 void WebsiteSettingsPopupGtk::OnViewCertLinkClicked(GtkWidget* widget) { | 527 void WebsiteSettingsPopupGtk::OnViewCertLinkClicked(GtkWidget* widget) { |
600 DCHECK_NE(cert_id_, 0); | 528 DCHECK_NE(cert_id_, 0); |
601 ShowCertificateViewerByID( | 529 ShowCertificateViewerByID( |
602 tab_contents_->web_contents(), GTK_WINDOW(parent_), cert_id_); | 530 tab_contents_->web_contents(), GTK_WINDOW(parent_), cert_id_); |
603 bubble_->Close(); | 531 bubble_->Close(); |
604 } | 532 } |
OLD | NEW |