OLD | NEW |
---|---|
(Empty) | |
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 | |
3 // found in the LICENSE file. | |
4 | |
5 #include "chrome/browser/ui/gtk/website_settings_popup_gtk.h" | |
6 | |
7 #include "base/basictypes.h" | |
8 #include "base/compiler_specific.h" | |
9 #include "base/i18n/rtl.h" | |
10 #include "base/string_number_conversions.h" | |
11 #include "base/utf_string_conversions.h" | |
12 #include "chrome/browser/certificate_viewer.h" | |
13 #include "chrome/browser/page_info_model.h" | |
14 #include "chrome/browser/ui/browser_list.h" | |
15 #include "chrome/browser/ui/gtk/browser_toolbar_gtk.h" | |
16 #include "chrome/browser/ui/gtk/browser_window_gtk.h" | |
17 #include "chrome/browser/ui/gtk/collected_cookies_gtk.h" | |
18 #include "chrome/browser/ui/gtk/gtk_chrome_link_button.h" | |
19 #include "chrome/browser/ui/gtk/gtk_util.h" | |
20 #include "chrome/browser/ui/gtk/theme_service_gtk.h" | |
21 #include "chrome/browser/ui/gtk/location_bar_view_gtk.h" | |
22 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" | |
23 #include "chrome/common/url_constants.h" | |
24 #include "content/public/browser/cert_store.h" | |
25 #include "grit/generated_resources.h" | |
26 #include "grit/locale_settings.h" | |
27 #include "grit/theme_resources.h" | |
28 #include "ui/base/gtk/gtk_hig_constants.h" | |
29 #include "ui/base/l10n/l10n_util.h" | |
30 #include "ui/base/resource/resource_bundle.h" | |
31 | |
32 using content::OpenURLParams; | |
33 | |
34 WebsiteSettingsPopupGtk::WebsiteSettingsPopupGtk( | |
35 gfx::NativeWindow parent, | |
36 Profile* profile, | |
37 TabContentsWrapper* tab_contents_wrapper, | |
38 const GURL& url, | |
39 const SSLStatus& ssl, | |
40 bool show_history) | |
41 : website_settings_(NULL), | |
42 parent_(parent), | |
43 contents_(NULL), | |
44 theme_service_(ThemeServiceGtk::GetFrom(profile)), | |
45 profile_(profile), | |
46 tab_contents_wrapper_(tab_contents_wrapper) { | |
47 BrowserWindowGtk* browser_window = | |
48 BrowserWindowGtk::GetBrowserWindowForNativeWindow(parent); | |
49 anchor_ = browser_window-> | |
50 GetToolbar()->GetLocationBarView()->location_icon_widget(); | |
51 | |
52 InitContents(); | |
53 | |
54 website_settings_.reset( | |
55 new WebsiteSettingsModel(this, | |
56 profile, | |
57 url, | |
58 ssl, | |
59 content::CertStore::GetInstance(), | |
60 tab_contents_wrapper->content_settings())); | |
61 | |
62 BubbleGtk::ArrowLocationGtk arrow_location = base::i18n::IsRTL() ? | |
63 BubbleGtk::ARROW_LOCATION_TOP_RIGHT : | |
64 BubbleGtk::ARROW_LOCATION_TOP_LEFT; | |
65 bubble_ = BubbleGtk::Show(anchor_, | |
66 NULL, // |rect| | |
67 contents_, | |
68 arrow_location, | |
69 true, // |match_system_theme| | |
70 true, // |grab_input| | |
71 theme_service_, | |
72 this); // |delegate| | |
73 if (!bubble_) { | |
74 NOTREACHED(); | |
75 return; | |
76 } | |
77 } | |
78 | |
79 WebsiteSettingsPopupGtk::~WebsiteSettingsPopupGtk() { | |
80 } | |
81 | |
82 void WebsiteSettingsPopupGtk::BubbleClosing(BubbleGtk* bubble, | |
83 bool closed_by_escape) { | |
84 delete this; | |
85 } | |
86 | |
87 void WebsiteSettingsPopupGtk::InitContents() { | |
88 if (!contents_) { | |
89 contents_ = gtk_vbox_new(FALSE, ui::kContentAreaSpacing); | |
90 gtk_container_set_border_width(GTK_CONTAINER(contents_), | |
91 ui::kContentAreaBorder); | |
92 } else { | |
93 gtk_util::RemoveAllChildren(contents_); | |
94 } | |
95 | |
96 site_info_contents_ = gtk_vbox_new(FALSE, ui::kControlSpacing); | |
97 gtk_box_pack_start(GTK_BOX(contents_), | |
98 CreateSection("Site Information", site_info_contents_), | |
99 FALSE, FALSE, 0); | |
100 gtk_box_pack_start(GTK_BOX(contents_), | |
101 gtk_hseparator_new(), | |
102 FALSE, FALSE, 0); | |
103 cookies_section_content_ = gtk_vbox_new(FALSE, ui::kControlSpacing); | |
104 gtk_box_pack_start(GTK_BOX(contents_), | |
105 CreateSection("Cookies and Site Data", | |
106 cookies_section_content_), | |
107 FALSE, FALSE, 0); | |
108 gtk_box_pack_start(GTK_BOX(contents_), | |
109 gtk_hseparator_new(), | |
110 FALSE, FALSE, 0); | |
111 permissions_section_content_ = gtk_vbox_new(FALSE, ui::kControlSpacing); | |
112 gtk_box_pack_start(GTK_BOX(contents_), | |
113 CreateSection("Permissions", permissions_section_content_), | |
114 FALSE, FALSE, 0); | |
115 | |
116 /* | |
117 GtkWidget* help_link = theme_service_->BuildChromeLinkButton( | |
118 l10n_util::GetStringUTF8(IDS_PAGE_INFO_HELP_CENTER_LINK)); | |
119 GtkWidget* help_link_hbox = gtk_hbox_new(FALSE, 0); | |
120 // Stick it in an hbox so it doesn't expand to the whole width. | |
121 gtk_box_pack_start(GTK_BOX(help_link_hbox), help_link, FALSE, FALSE, 0); | |
122 gtk_box_pack_start(GTK_BOX(contents_), help_link_hbox, FALSE, FALSE, 0); | |
123 g_signal_connect(help_link, "clicked", | |
124 G_CALLBACK(OnHelpLinkClickedThunk), this); | |
125 */ | |
Elliot Glaysher
2012/03/19 19:56:06
Commented out?
markusheintz_
2012/03/20 20:44:12
removed
| |
126 | |
127 gtk_widget_show_all(contents_); | |
128 } | |
129 | |
130 void WebsiteSettingsPopupGtk::ClearContainer(GtkWidget* container) { | |
131 GList* child = gtk_container_get_children(GTK_CONTAINER(container)); | |
132 while (child) { | |
133 gtk_container_remove(GTK_CONTAINER(container), GTK_WIDGET(child->data)); | |
134 child = child->next; | |
135 } | |
136 } | |
137 | |
138 void WebsiteSettingsPopupGtk::SetSiteInfo(const std::string site_info) { | |
139 ClearContainer(site_info_contents_); | |
140 GtkWidget* label = theme_service_->BuildLabel(site_info, | |
141 ui::kGdkBlack); | |
142 GtkWidget* site_info_entry_box = gtk_hbox_new(FALSE, ui::kControlSpacing); | |
143 gtk_box_pack_start(GTK_BOX(site_info_entry_box), label, FALSE, FALSE, 0); | |
144 gtk_box_pack_start(GTK_BOX(site_info_contents_), site_info_entry_box, FALSE, F ALSE, 0); | |
Elliot Glaysher
2012/03/19 19:56:06
nit: lots of 80 col errors in this patch. won't po
markusheintz_
2012/03/20 20:44:12
Done.
| |
145 gtk_widget_show_all(site_info_contents_); | |
146 } | |
147 | |
148 GtkWidget* WebsiteSettingsPopupGtk::CreateSection(std::string section_title, | |
149 GtkWidget* section_content) { | |
150 GtkWidget* section_box = gtk_vbox_new(FALSE, ui::kControlSpacing); | |
151 | |
152 // Add Section title | |
153 GtkWidget* title_hbox = gtk_hbox_new(FALSE, ui::kControlSpacing); | |
154 gtk_box_pack_start(GTK_BOX(section_box), title_hbox, FALSE, FALSE, 0); | |
155 | |
156 GtkWidget* label = theme_service_->BuildLabel(section_title, | |
157 ui::kGdkBlack); | |
158 gtk_label_set_selectable(GTK_LABEL(label), TRUE); | |
159 PangoAttrList* attributes = pango_attr_list_new(); | |
160 pango_attr_list_insert(attributes, | |
161 pango_attr_weight_new(PANGO_WEIGHT_BOLD)); | |
162 gtk_label_set_attributes(GTK_LABEL(label), attributes); | |
163 pango_attr_list_unref(attributes); | |
164 gtk_util::SetLabelWidth(label, 400); | |
165 // Allow linebreaking in the middle of words if necessary, so that extremely | |
166 // long hostnames (longer than one line) will still be completely shown. | |
167 gtk_label_set_line_wrap_mode(GTK_LABEL(label), PANGO_WRAP_WORD_CHAR); | |
168 gtk_box_pack_start(GTK_BOX(title_hbox), label, FALSE, FALSE, 0); | |
169 | |
170 // Add section content | |
171 gtk_box_pack_start(GTK_BOX(section_box), section_content, FALSE, FALSE, 0); | |
172 return section_box; | |
173 | |
174 } | |
175 | |
176 void WebsiteSettingsPopupGtk::SetCookieInfo(const CookieInfoList& cookie_info_li st) { | |
177 ClearContainer(cookies_section_content_); | |
178 | |
179 // Create cookies info rows. | |
180 for (CookieInfoList::const_iterator it = cookie_info_list.begin(); | |
181 it != cookie_info_list.end(); | |
182 ++it) { | |
183 GtkWidget* cookies_info = gtk_hbox_new(FALSE, 0); | |
184 | |
185 GtkWidget* label = theme_service_->BuildLabel(it->text, ui::kGdkBlack); | |
186 gtk_label_set_selectable(GTK_LABEL(label), TRUE); | |
187 // PangoAttrList* attributes = pango_attr_list_new(); | |
188 // pango_attr_list_insert(attributes, | |
189 // pango_attr_weight_new(PANGO_WEIGHT_BOLD)); | |
190 // gtk_label_set_attributes(GTK_LABEL(first_party_cookie_label), attributes) ; | |
191 // pango_attr_list_unref(attributes); | |
192 gtk_util::SetLabelWidth(label, 200); | |
193 // Allow linebreaking in the middle of words if necessary, so that extremely | |
194 // long hostnames (longer than one line) will still be completely shown. | |
195 gtk_label_set_line_wrap_mode(GTK_LABEL(label), PANGO_WRAP_WORD_CHAR); | |
196 gtk_box_pack_start(GTK_BOX(cookies_info), label, FALSE, FALSE, 0); | |
197 | |
198 std::string allowed_count = base::IntToString(it->allowed); | |
199 std::string blocked_count = base::IntToString(it->blocked); | |
200 std::string info_str = " (" + allowed_count + " allowed / " + blocked_count + " blocked)"; | |
201 GtkWidget* info = theme_service_->BuildLabel(info_str, ui::kGdkBlack); | |
202 gtk_label_set_selectable(GTK_LABEL(info), TRUE); | |
203 gtk_util::SetLabelWidth(info, 200); | |
204 gtk_box_pack_start(GTK_BOX(cookies_info), info, FALSE, FALSE, 0); | |
205 | |
206 gtk_box_pack_start(GTK_BOX(cookies_section_content_), | |
207 cookies_info, | |
208 FALSE, FALSE, 0); | |
209 } | |
210 | |
211 // Create links row. | |
212 GtkWidget* link_hbox = gtk_hbox_new(FALSE, 0); | |
213 | |
214 GtkWidget* show_cookie_settings_link = theme_service_->BuildChromeLinkButton( | |
215 "Manage cookie settings"); | |
216 g_signal_connect(show_cookie_settings_link, "clicked", | |
217 G_CALLBACK(OnCookieSettingsLinkClickedThunk), this); | |
218 gtk_box_pack_start(GTK_BOX(link_hbox), show_cookie_settings_link, | |
219 FALSE, FALSE, 0); | |
220 | |
221 GtkWidget* view_cookies_link = theme_service_->BuildChromeLinkButton( | |
222 "Show cookies"); | |
223 g_signal_connect(view_cookies_link, "clicked", | |
224 G_CALLBACK(OnCookiesLinkClickedThunk), this); | |
225 gtk_box_pack_start(GTK_BOX(link_hbox), view_cookies_link, | |
226 FALSE, FALSE, 0); | |
227 | |
228 gtk_box_pack_start(GTK_BOX(cookies_section_content_), link_hbox, FALSE, FALSE, 0); | |
229 | |
230 gtk_widget_show_all(cookies_section_content_); | |
231 } | |
232 | |
233 void WebsiteSettingsPopupGtk::SetPermissionInfo( | |
234 const PermissionInfoList& permission_info_list) { | |
235 ClearContainer(permissions_section_content_); | |
236 | |
237 for (PermissionInfoList::const_iterator permission = | |
238 permission_info_list.begin(); | |
239 permission != permission_info_list.end(); | |
240 ++permission) { | |
241 std::string permission_text; | |
242 switch (permission->type) { | |
243 case CONTENT_SETTINGS_TYPE_POPUPS: | |
244 permission_text = "Popups"; | |
Elliot Glaysher
2012/03/19 19:56:06
shouldn't this be localized?
markusheintz_
2012/03/20 20:44:12
Done.
| |
245 break; | |
246 case CONTENT_SETTINGS_TYPE_PLUGINS: | |
247 permission_text = "Plugins"; | |
248 break; | |
249 case CONTENT_SETTINGS_TYPE_GEOLOCATION: | |
250 permission_text = "Location"; | |
251 break; | |
252 case CONTENT_SETTINGS_TYPE_NOTIFICATIONS: | |
253 permission_text = "Notifications"; | |
254 break; | |
255 default: | |
256 NOTREACHED(); | |
257 break; | |
258 } | |
259 GtkWidget* label = theme_service_->BuildLabel(permission_text, | |
260 ui::kGdkBlack); | |
261 gtk_util::SetLabelWidth(label, 280); | |
262 GtkWidget* hbox = gtk_hbox_new(FALSE, 0); | |
263 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); | |
264 | |
265 GtkWidget* combo_box = gtk_combo_box_new_text(); | |
266 gtk_combo_box_append_text(GTK_COMBO_BOX(combo_box), "ALLOW"); | |
267 gtk_combo_box_append_text(GTK_COMBO_BOX(combo_box), "BLOCK"); | |
268 gtk_combo_box_set_active(GTK_COMBO_BOX(combo_box), | |
269 permission->setting == CONTENT_SETTING_ALLOW ? 0 : 1); | |
270 g_signal_connect(combo_box, "changed", | |
271 G_CALLBACK(OnPermissionChangedThunk), this); | |
272 | |
273 gtk_box_pack_start(GTK_BOX(hbox), combo_box, FALSE, FALSE, 0); | |
274 | |
275 gtk_box_pack_start(GTK_BOX(permissions_section_content_), hbox, FALSE, | |
276 FALSE, 0); | |
277 } | |
278 | |
279 GtkWidget* show_content_settings_link = theme_service_->BuildChromeLinkButton( | |
280 "Manage permission settings"); | |
281 g_signal_connect(show_content_settings_link, "clicked", | |
282 G_CALLBACK(OnPermissionsSettingsLinkClickedThunk), this); | |
283 GtkWidget* link_hbox = gtk_hbox_new(FALSE, 0); | |
284 gtk_box_pack_start(GTK_BOX(link_hbox), show_content_settings_link, | |
285 FALSE, FALSE, 0); | |
286 | |
287 gtk_box_pack_start(GTK_BOX(permissions_section_content_), link_hbox, | |
288 FALSE, FALSE, 0); | |
289 | |
290 gtk_widget_show_all(permissions_section_content_); | |
291 } | |
292 | |
293 void WebsiteSettingsPopupGtk::OnCookiesLinkClicked(GtkWidget* widget) { | |
294 new CollectedCookiesGtk(GTK_WINDOW(parent_), | |
295 tab_contents_wrapper_); | |
296 bubble_->Close(); | |
297 } | |
298 | |
299 void WebsiteSettingsPopupGtk::OnCookieSettingsLinkClicked(GtkWidget* widget) { | |
300 Browser* browser = BrowserList::GetLastActiveWithProfile(profile_); | |
301 browser->OpenURL(OpenURLParams( | |
302 GURL(std::string( | |
303 chrome::kChromeUISettingsURL) + chrome::kContentSettingsSubPage), | |
304 content::Referrer(), | |
305 NEW_FOREGROUND_TAB, | |
306 content::PAGE_TRANSITION_LINK, | |
307 false)); | |
308 bubble_->Close(); | |
309 } | |
310 | |
311 void WebsiteSettingsPopupGtk::OnPermissionsSettingsLinkClicked( | |
312 GtkWidget* widget) { | |
313 Browser* browser = BrowserList::GetLastActiveWithProfile(profile_); | |
314 browser->OpenURL(OpenURLParams( | |
315 GURL(std::string( | |
316 chrome::kChromeUISettingsURL) + chrome::kContentSettingsSubPage), | |
317 content::Referrer(), | |
318 NEW_FOREGROUND_TAB, | |
319 content::PAGE_TRANSITION_LINK, | |
320 false)); | |
321 bubble_->Close(); | |
322 } | |
323 | |
324 void WebsiteSettingsPopupGtk::OnPermissionChanged(GtkWidget* widget) { | |
325 LOG(ERROR) << " *** OnPermissionChanged"; | |
326 } | |
327 | |
328 // static | |
329 void WebsiteSettingsUI::Show(gfx::NativeWindow parent, | |
330 Profile* profile, | |
331 TabContentsWrapper* tab_contents_wrapper, | |
332 const GURL& url, | |
333 const content::SSLStatus& ssl, | |
334 bool show_history) { | |
335 new WebsiteSettingsPopupGtk(parent, profile, tab_contents_wrapper, url, ssl, | |
336 show_history); | |
337 } | |
OLD | NEW |