OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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/page_info_model.h" | 5 #include "chrome/browser/page_info_model.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 | 8 |
9 #include "app/l10n_util.h" | 9 #include "app/l10n_util.h" |
| 10 #include "app/resource_bundle.h" |
10 #include "base/command_line.h" | 11 #include "base/command_line.h" |
11 #include "base/i18n/time_formatting.h" | 12 #include "base/i18n/time_formatting.h" |
12 #include "base/string_number_conversions.h" | 13 #include "base/string_number_conversions.h" |
13 #include "base/utf_string_conversions.h" | 14 #include "base/utf_string_conversions.h" |
14 #include "chrome/browser/cert_store.h" | 15 #include "chrome/browser/cert_store.h" |
15 #include "chrome/browser/prefs/pref_service.h" | 16 #include "chrome/browser/prefs/pref_service.h" |
16 #include "chrome/browser/profile.h" | 17 #include "chrome/browser/profile.h" |
17 #include "chrome/browser/ssl/ssl_manager.h" | 18 #include "chrome/browser/ssl/ssl_manager.h" |
18 #include "chrome/common/chrome_switches.h" | 19 #include "chrome/common/chrome_switches.h" |
19 #include "chrome/common/pref_names.h" | 20 #include "chrome/common/pref_names.h" |
20 #include "grit/generated_resources.h" | 21 #include "grit/generated_resources.h" |
| 22 #include "grit/theme_resources.h" |
21 #include "net/base/cert_status_flags.h" | 23 #include "net/base/cert_status_flags.h" |
22 #include "net/base/ssl_connection_status_flags.h" | 24 #include "net/base/ssl_connection_status_flags.h" |
23 #include "net/base/ssl_cipher_suite_names.h" | 25 #include "net/base/ssl_cipher_suite_names.h" |
24 #include "net/base/x509_certificate.h" | 26 #include "net/base/x509_certificate.h" |
25 | 27 |
| 28 #if defined(OS_MACOSX) |
| 29 #include "base/mac_util.h" |
| 30 #endif |
| 31 |
26 PageInfoModel::PageInfoModel(Profile* profile, | 32 PageInfoModel::PageInfoModel(Profile* profile, |
27 const GURL& url, | 33 const GURL& url, |
28 const NavigationEntry::SSLStatus& ssl, | 34 const NavigationEntry::SSLStatus& ssl, |
29 bool show_history, | 35 bool show_history, |
30 PageInfoModelObserver* observer) | 36 PageInfoModelObserver* observer) |
31 : observer_(observer) { | 37 : observer_(observer) { |
32 SectionInfoState state = SECTION_STATE_OK; | 38 Init(); |
| 39 |
| 40 SectionStateIcon icon_id = ICON_STATE_OK; |
33 string16 headline; | 41 string16 headline; |
34 string16 description; | 42 string16 description; |
35 scoped_refptr<net::X509Certificate> cert; | 43 scoped_refptr<net::X509Certificate> cert; |
36 | 44 |
37 // Identity section. | 45 // Identity section. |
38 string16 subject_name(UTF8ToUTF16(url.host())); | 46 string16 subject_name(UTF8ToUTF16(url.host())); |
39 bool empty_subject_name = false; | 47 bool empty_subject_name = false; |
40 if (subject_name.empty()) { | 48 if (subject_name.empty()) { |
41 subject_name.assign( | 49 subject_name.assign( |
42 l10n_util::GetStringUTF16(IDS_PAGE_INFO_SECURITY_TAB_UNKNOWN_PARTY)); | 50 l10n_util::GetStringUTF16(IDS_PAGE_INFO_SECURITY_TAB_UNKNOWN_PARTY)); |
(...skipping 24 matching lines...) Expand all Loading... |
67 description += ASCIIToUTF16("\n\n"); | 75 description += ASCIIToUTF16("\n\n"); |
68 if (cert_status & net::CERT_STATUS_UNABLE_TO_CHECK_REVOCATION) { | 76 if (cert_status & net::CERT_STATUS_UNABLE_TO_CHECK_REVOCATION) { |
69 description += l10n_util::GetStringUTF16( | 77 description += l10n_util::GetStringUTF16( |
70 IDS_PAGE_INFO_SECURITY_TAB_UNABLE_TO_CHECK_REVOCATION); | 78 IDS_PAGE_INFO_SECURITY_TAB_UNABLE_TO_CHECK_REVOCATION); |
71 } else if (cert_status & net::CERT_STATUS_NO_REVOCATION_MECHANISM) { | 79 } else if (cert_status & net::CERT_STATUS_NO_REVOCATION_MECHANISM) { |
72 description += l10n_util::GetStringUTF16( | 80 description += l10n_util::GetStringUTF16( |
73 IDS_PAGE_INFO_SECURITY_TAB_NO_REVOCATION_MECHANISM); | 81 IDS_PAGE_INFO_SECURITY_TAB_NO_REVOCATION_MECHANISM); |
74 } else { | 82 } else { |
75 NOTREACHED() << "Need to specify string for this warning"; | 83 NOTREACHED() << "Need to specify string for this warning"; |
76 } | 84 } |
77 state = SECTION_STATE_WARNING_MINOR; | 85 icon_id = ICON_STATE_WARNING_MINOR; |
78 } else if ((ssl.cert_status() & net::CERT_STATUS_IS_EV) != 0) { | 86 } else if ((ssl.cert_status() & net::CERT_STATUS_IS_EV) != 0) { |
79 // EV HTTPS page. | 87 // EV HTTPS page. |
80 DCHECK(!cert->subject().organization_names.empty()); | 88 DCHECK(!cert->subject().organization_names.empty()); |
81 headline = | 89 headline = |
82 l10n_util::GetStringFUTF16(IDS_PAGE_INFO_EV_IDENTITY_TITLE, | 90 l10n_util::GetStringFUTF16(IDS_PAGE_INFO_EV_IDENTITY_TITLE, |
83 UTF8ToUTF16(cert->subject().organization_names[0]), | 91 UTF8ToUTF16(cert->subject().organization_names[0]), |
84 UTF8ToUTF16(url.host())); | 92 UTF8ToUTF16(url.host())); |
85 // An EV Cert is required to have a city (localityName) and country but | 93 // An EV Cert is required to have a city (localityName) and country but |
86 // state is "if any". | 94 // state is "if any". |
87 DCHECK(!cert->subject().locality_name.empty()); | 95 DCHECK(!cert->subject().locality_name.empty()); |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
124 issuer_name.assign(l10n_util::GetStringUTF16( | 132 issuer_name.assign(l10n_util::GetStringUTF16( |
125 IDS_PAGE_INFO_SECURITY_TAB_UNKNOWN_PARTY)); | 133 IDS_PAGE_INFO_SECURITY_TAB_UNKNOWN_PARTY)); |
126 } | 134 } |
127 description.assign(l10n_util::GetStringFUTF16( | 135 description.assign(l10n_util::GetStringFUTF16( |
128 IDS_PAGE_INFO_SECURITY_TAB_SECURE_IDENTITY, issuer_name)); | 136 IDS_PAGE_INFO_SECURITY_TAB_SECURE_IDENTITY, issuer_name)); |
129 } | 137 } |
130 } else { | 138 } else { |
131 // HTTP or HTTPS with errors (not warnings). | 139 // HTTP or HTTPS with errors (not warnings). |
132 description.assign(l10n_util::GetStringUTF16( | 140 description.assign(l10n_util::GetStringUTF16( |
133 IDS_PAGE_INFO_SECURITY_TAB_INSECURE_IDENTITY)); | 141 IDS_PAGE_INFO_SECURITY_TAB_INSECURE_IDENTITY)); |
134 state = ssl.security_style() == SECURITY_STYLE_UNAUTHENTICATED ? | 142 icon_id = ssl.security_style() == SECURITY_STYLE_UNAUTHENTICATED ? |
135 SECTION_STATE_WARNING_MAJOR : SECTION_STATE_ERROR; | 143 ICON_STATE_WARNING_MAJOR : ICON_STATE_ERROR; |
136 } | 144 } |
137 sections_.push_back(SectionInfo( | 145 sections_.push_back(SectionInfo( |
138 state, | 146 icon_id, |
139 l10n_util::GetStringUTF16(IDS_PAGE_INFO_SECURITY_TAB_IDENTITY_TITLE), | 147 l10n_util::GetStringUTF16(IDS_PAGE_INFO_SECURITY_TAB_IDENTITY_TITLE), |
140 headline, | 148 headline, |
141 description, | 149 description, |
142 SECTION_INFO_IDENTITY)); | 150 SECTION_INFO_IDENTITY)); |
143 | 151 |
144 // Connection section. | 152 // Connection section. |
145 // We consider anything less than 80 bits encryption to be weak encryption. | 153 // We consider anything less than 80 bits encryption to be weak encryption. |
146 // TODO(wtc): Bug 1198735: report mixed/unsafe content for unencrypted and | 154 // TODO(wtc): Bug 1198735: report mixed/unsafe content for unencrypted and |
147 // weakly encrypted connections. | 155 // weakly encrypted connections. |
148 state = SECTION_STATE_OK; | 156 icon_id = ICON_STATE_OK; |
149 headline.clear(); | 157 headline.clear(); |
150 description.clear(); | 158 description.clear(); |
151 if (ssl.security_bits() < 0) { | 159 if (ssl.security_bits() < 0) { |
152 // Security strength is unknown. Say nothing. | 160 // Security strength is unknown. Say nothing. |
153 state = SECTION_STATE_ERROR; | 161 icon_id = ICON_STATE_ERROR; |
154 } else if (ssl.security_bits() == 0) { | 162 } else if (ssl.security_bits() == 0) { |
155 state = ssl.security_style() == SECURITY_STYLE_UNAUTHENTICATED ? | 163 icon_id = ssl.security_style() == SECURITY_STYLE_UNAUTHENTICATED ? |
156 SECTION_STATE_WARNING_MAJOR : SECTION_STATE_ERROR; | 164 ICON_STATE_WARNING_MAJOR : ICON_STATE_ERROR; |
157 description.assign(l10n_util::GetStringFUTF16( | 165 description.assign(l10n_util::GetStringFUTF16( |
158 IDS_PAGE_INFO_SECURITY_TAB_NOT_ENCRYPTED_CONNECTION_TEXT, | 166 IDS_PAGE_INFO_SECURITY_TAB_NOT_ENCRYPTED_CONNECTION_TEXT, |
159 subject_name)); | 167 subject_name)); |
160 } else if (ssl.security_bits() < 80) { | 168 } else if (ssl.security_bits() < 80) { |
161 state = SECTION_STATE_ERROR; | 169 icon_id = ICON_STATE_ERROR; |
162 description.assign(l10n_util::GetStringFUTF16( | 170 description.assign(l10n_util::GetStringFUTF16( |
163 IDS_PAGE_INFO_SECURITY_TAB_WEAK_ENCRYPTION_CONNECTION_TEXT, | 171 IDS_PAGE_INFO_SECURITY_TAB_WEAK_ENCRYPTION_CONNECTION_TEXT, |
164 subject_name)); | 172 subject_name)); |
165 } else { | 173 } else { |
166 description.assign(l10n_util::GetStringFUTF16( | 174 description.assign(l10n_util::GetStringFUTF16( |
167 IDS_PAGE_INFO_SECURITY_TAB_ENCRYPTED_CONNECTION_TEXT, | 175 IDS_PAGE_INFO_SECURITY_TAB_ENCRYPTED_CONNECTION_TEXT, |
168 subject_name, | 176 subject_name, |
169 base::IntToString16(ssl.security_bits()))); | 177 base::IntToString16(ssl.security_bits()))); |
170 if (ssl.displayed_insecure_content() || ssl.ran_insecure_content()) { | 178 if (ssl.displayed_insecure_content() || ssl.ran_insecure_content()) { |
171 // The old SSL dialog only had good and bad state, so for the old | 179 // The old SSL dialog only had good and bad state, so for the old |
172 // implementation we raise an error on finding mixed content. The new | 180 // implementation we raise an error on finding mixed content. The new |
173 // SSL info bubble has a warning state for displaying insecure content, | 181 // SSL info bubble has a warning state for displaying insecure content, |
174 // so we check. The command line check will go away once we eliminate | 182 // so we check. The command line check will go away once we eliminate |
175 // the old dialogs. | 183 // the old dialogs. |
176 const CommandLine* command_line(CommandLine::ForCurrentProcess()); | 184 const CommandLine* command_line(CommandLine::ForCurrentProcess()); |
177 if (command_line->HasSwitch(switches::kEnableNewPageInfoBubble) && | 185 if (command_line->HasSwitch(switches::kEnableNewPageInfoBubble) && |
178 !ssl.ran_insecure_content()) { | 186 !ssl.ran_insecure_content()) { |
179 state = SECTION_STATE_WARNING_MINOR; | 187 icon_id = ICON_STATE_WARNING_MINOR; |
180 } else { | 188 } else { |
181 state = SECTION_STATE_ERROR; | 189 icon_id = ICON_STATE_ERROR; |
182 } | 190 } |
183 description.assign(l10n_util::GetStringFUTF16( | 191 description.assign(l10n_util::GetStringFUTF16( |
184 IDS_PAGE_INFO_SECURITY_TAB_ENCRYPTED_SENTENCE_LINK, | 192 IDS_PAGE_INFO_SECURITY_TAB_ENCRYPTED_SENTENCE_LINK, |
185 description, | 193 description, |
186 l10n_util::GetStringUTF16(ssl.ran_insecure_content() ? | 194 l10n_util::GetStringUTF16(ssl.ran_insecure_content() ? |
187 IDS_PAGE_INFO_SECURITY_TAB_ENCRYPTED_INSECURE_CONTENT_ERROR : | 195 IDS_PAGE_INFO_SECURITY_TAB_ENCRYPTED_INSECURE_CONTENT_ERROR : |
188 IDS_PAGE_INFO_SECURITY_TAB_ENCRYPTED_INSECURE_CONTENT_WARNING))); | 196 IDS_PAGE_INFO_SECURITY_TAB_ENCRYPTED_INSECURE_CONTENT_WARNING))); |
189 } | 197 } |
190 } | 198 } |
191 | 199 |
(...skipping 22 matching lines...) Expand all Loading... |
214 description += l10n_util::GetStringFUTF16( | 222 description += l10n_util::GetStringFUTF16( |
215 IDS_PAGE_INFO_SECURITY_TAB_COMPRESSION_DETAILS, | 223 IDS_PAGE_INFO_SECURITY_TAB_COMPRESSION_DETAILS, |
216 ASCIIToUTF16(compression)); | 224 ASCIIToUTF16(compression)); |
217 } else { | 225 } else { |
218 description += l10n_util::GetStringUTF16( | 226 description += l10n_util::GetStringUTF16( |
219 IDS_PAGE_INFO_SECURITY_TAB_NO_COMPRESSION); | 227 IDS_PAGE_INFO_SECURITY_TAB_NO_COMPRESSION); |
220 } | 228 } |
221 | 229 |
222 if (did_fallback) { | 230 if (did_fallback) { |
223 // For now, only SSLv3 fallback will trigger a warning icon. | 231 // For now, only SSLv3 fallback will trigger a warning icon. |
224 state = SECTION_STATE_ERROR; | 232 icon_id = ICON_STATE_ERROR; |
225 description += ASCIIToUTF16("\n\n"); | 233 description += ASCIIToUTF16("\n\n"); |
226 description += l10n_util::GetStringUTF16( | 234 description += l10n_util::GetStringUTF16( |
227 IDS_PAGE_INFO_SECURITY_TAB_FALLBACK_MESSAGE); | 235 IDS_PAGE_INFO_SECURITY_TAB_FALLBACK_MESSAGE); |
228 } | 236 } |
229 if (no_renegotiation) { | 237 if (no_renegotiation) { |
230 description += ASCIIToUTF16("\n\n"); | 238 description += ASCIIToUTF16("\n\n"); |
231 description += l10n_util::GetStringUTF16( | 239 description += l10n_util::GetStringUTF16( |
232 IDS_PAGE_INFO_SECURITY_TAB_RENEGOTIATION_MESSAGE); | 240 IDS_PAGE_INFO_SECURITY_TAB_RENEGOTIATION_MESSAGE); |
233 } | 241 } |
234 } | 242 } |
235 | 243 |
236 if (!description.empty()) { | 244 if (!description.empty()) { |
237 sections_.push_back(SectionInfo( | 245 sections_.push_back(SectionInfo( |
238 state, | 246 icon_id, |
239 l10n_util::GetStringUTF16(IDS_PAGE_INFO_SECURITY_TAB_CONNECTION_TITLE), | 247 l10n_util::GetStringUTF16(IDS_PAGE_INFO_SECURITY_TAB_CONNECTION_TITLE), |
240 headline, | 248 headline, |
241 description, | 249 description, |
242 SECTION_INFO_CONNECTION)); | 250 SECTION_INFO_CONNECTION)); |
243 } | 251 } |
244 | 252 |
245 // Request the number of visits. | 253 // Request the number of visits. |
246 HistoryService* history = profile->GetHistoryService( | 254 HistoryService* history = profile->GetHistoryService( |
247 Profile::EXPLICIT_ACCESS); | 255 Profile::EXPLICIT_ACCESS); |
248 if (show_history && history) { | 256 if (show_history && history) { |
249 history->GetVisitCountToHost( | 257 history->GetVisitCountToHost( |
250 url, | 258 url, |
251 &request_consumer_, | 259 &request_consumer_, |
252 NewCallback(this, &PageInfoModel::OnGotVisitCountToHost)); | 260 NewCallback(this, &PageInfoModel::OnGotVisitCountToHost)); |
253 } | 261 } |
254 } | 262 } |
255 | 263 |
256 PageInfoModel::~PageInfoModel() { | 264 PageInfoModel::~PageInfoModel() { |
| 265 #if defined(OS_MACOSX) |
| 266 // Release the NSImages. |
| 267 for (std::vector<ImageType>::iterator it = icons_.begin(); |
| 268 it != icons_.end(); ++it) { |
| 269 mac_util::NSObjectRelease(*it); |
| 270 } |
| 271 #endif |
257 } | 272 } |
258 | 273 |
259 int PageInfoModel::GetSectionCount() { | 274 int PageInfoModel::GetSectionCount() { |
260 return sections_.size(); | 275 return sections_.size(); |
261 } | 276 } |
262 | 277 |
263 PageInfoModel::SectionInfo PageInfoModel::GetSectionInfo(int index) { | 278 PageInfoModel::SectionInfo PageInfoModel::GetSectionInfo(int index) { |
264 DCHECK(index < static_cast<int>(sections_.size())); | 279 DCHECK(index < static_cast<int>(sections_.size())); |
265 return sections_[index]; | 280 return sections_[index]; |
266 } | 281 } |
267 | 282 |
| 283 PageInfoModel::ImageType PageInfoModel::GetIconImage(SectionStateIcon icon_id) { |
| 284 if (icon_id == ICON_NONE) |
| 285 return NULL; |
| 286 // TODO(rsesek): Remove once the window is replaced with the bubble. |
| 287 const CommandLine* command_line(CommandLine::ForCurrentProcess()); |
| 288 if (!command_line->HasSwitch(switches::kEnableNewPageInfoBubble) && |
| 289 icon_id != ICON_STATE_OK) { |
| 290 return icons_[ICON_STATE_WARNING_MAJOR]; |
| 291 } |
| 292 // The buble uses new, various icons. |
| 293 return icons_[icon_id]; |
| 294 } |
| 295 |
268 void PageInfoModel::OnGotVisitCountToHost(HistoryService::Handle handle, | 296 void PageInfoModel::OnGotVisitCountToHost(HistoryService::Handle handle, |
269 bool found_visits, | 297 bool found_visits, |
270 int count, | 298 int count, |
271 base::Time first_visit) { | 299 base::Time first_visit) { |
272 if (!found_visits) { | 300 if (!found_visits) { |
273 // This indicates an error, such as the page wasn't http/https; do nothing. | 301 // This indicates an error, such as the page wasn't http/https; do nothing. |
274 return; | 302 return; |
275 } | 303 } |
276 | 304 |
277 bool visited_before_today = false; | 305 bool visited_before_today = false; |
278 if (count) { | 306 if (count) { |
279 base::Time today = base::Time::Now().LocalMidnight(); | 307 base::Time today = base::Time::Now().LocalMidnight(); |
280 base::Time first_visit_midnight = first_visit.LocalMidnight(); | 308 base::Time first_visit_midnight = first_visit.LocalMidnight(); |
281 visited_before_today = (first_visit_midnight < today); | 309 visited_before_today = (first_visit_midnight < today); |
282 } | 310 } |
283 | 311 |
284 // We only show the Site Information heading for the new dialogs. | 312 // We only show the Site Information heading for the new dialogs. |
285 string16 title; | 313 string16 title; |
286 const CommandLine* command_line(CommandLine::ForCurrentProcess()); | 314 const CommandLine* command_line(CommandLine::ForCurrentProcess()); |
287 if (command_line->HasSwitch(switches::kEnableNewPageInfoBubble)) | 315 bool as_bubble = command_line->HasSwitch(switches::kEnableNewPageInfoBubble); |
| 316 if (as_bubble) |
288 title = l10n_util::GetStringUTF16(IDS_PAGE_INFO_SITE_INFO_TITLE); | 317 title = l10n_util::GetStringUTF16(IDS_PAGE_INFO_SITE_INFO_TITLE); |
289 | 318 |
290 if (!visited_before_today) { | 319 if (!visited_before_today) { |
291 sections_.push_back(SectionInfo( | 320 sections_.push_back(SectionInfo( |
292 SECTION_STATE_ERROR, | 321 ICON_STATE_WARNING_MAJOR, |
293 l10n_util::GetStringUTF16( | 322 l10n_util::GetStringUTF16( |
294 IDS_PAGE_INFO_SECURITY_TAB_PERSONAL_HISTORY_TITLE), | 323 IDS_PAGE_INFO_SECURITY_TAB_PERSONAL_HISTORY_TITLE), |
295 title, | 324 title, |
296 l10n_util::GetStringUTF16( | 325 l10n_util::GetStringUTF16( |
297 IDS_PAGE_INFO_SECURITY_TAB_FIRST_VISITED_TODAY), | 326 IDS_PAGE_INFO_SECURITY_TAB_FIRST_VISITED_TODAY), |
298 SECTION_INFO_FIRST_VISIT)); | 327 SECTION_INFO_FIRST_VISIT)); |
299 } else { | 328 } else { |
300 sections_.push_back(SectionInfo( | 329 sections_.push_back(SectionInfo( |
301 SECTION_STATE_OK, | 330 // TODO(rsesek): Remove once the window is replaced with the bubble. |
| 331 as_bubble ? ICON_STATE_INFO : ICON_STATE_OK, |
302 l10n_util::GetStringUTF16( | 332 l10n_util::GetStringUTF16( |
303 IDS_PAGE_INFO_SECURITY_TAB_PERSONAL_HISTORY_TITLE), | 333 IDS_PAGE_INFO_SECURITY_TAB_PERSONAL_HISTORY_TITLE), |
304 title, | 334 title, |
305 l10n_util::GetStringFUTF16( | 335 l10n_util::GetStringFUTF16( |
306 IDS_PAGE_INFO_SECURITY_TAB_VISITED_BEFORE_TODAY, | 336 IDS_PAGE_INFO_SECURITY_TAB_VISITED_BEFORE_TODAY, |
307 WideToUTF16(base::TimeFormatShortDate(first_visit))), | 337 WideToUTF16(base::TimeFormatShortDate(first_visit))), |
308 SECTION_INFO_FIRST_VISIT)); | 338 SECTION_INFO_FIRST_VISIT)); |
309 } | 339 } |
310 observer_->ModelChanged(); | 340 observer_->ModelChanged(); |
311 } | 341 } |
312 | 342 |
313 // static | 343 // static |
314 void PageInfoModel::RegisterPrefs(PrefService* prefs) { | 344 void PageInfoModel::RegisterPrefs(PrefService* prefs) { |
315 prefs->RegisterDictionaryPref(prefs::kPageInfoWindowPlacement); | 345 prefs->RegisterDictionaryPref(prefs::kPageInfoWindowPlacement); |
316 } | 346 } |
317 | 347 |
318 PageInfoModel::PageInfoModel() { | 348 PageInfoModel::PageInfoModel() { |
| 349 Init(); |
319 } | 350 } |
| 351 |
| 352 void PageInfoModel::Init() { |
| 353 // Loads the icons into the vector. The order must match the SectionStateIcon |
| 354 // enum. |
| 355 icons_.push_back(GetBitmapNamed(IDR_PAGEINFO_GOOD)); |
| 356 icons_.push_back(GetBitmapNamed(IDR_PAGEINFO_WARNING_MINOR)); |
| 357 icons_.push_back(GetBitmapNamed(IDR_PAGEINFO_WARNING_MAJOR)); |
| 358 icons_.push_back(GetBitmapNamed(IDR_PAGEINFO_BAD)); |
| 359 icons_.push_back(GetBitmapNamed(IDR_PAGEINFO_INFO)); |
| 360 } |
| 361 |
| 362 PageInfoModel::ImageType PageInfoModel::GetBitmapNamed(int resource_id) { |
| 363 ResourceBundle& rb = ResourceBundle::GetSharedInstance(); |
| 364 #if defined(OS_MACOSX) |
| 365 // Unlike other platforms, the Mac ResourceBundle does not keep a shared image |
| 366 // cache. These are released in the dtor. |
| 367 ImageType image = rb.GetNSImageNamed(resource_id); |
| 368 mac_util::NSObjectRetain(image); |
| 369 return image; |
| 370 #elif defined(USE_X11) && !defined(TOOLKIT_VIEWS) |
| 371 return rb.GetPixbufNamed(resource_id); |
| 372 #else |
| 373 return rb.GetBitmapNamed(resource_id); |
| 374 #endif |
| 375 } |
OLD | NEW |