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 // Implementation of the SafeBrowsingBlockingPage class. | 5 // Implementation of the SafeBrowsingBlockingPage class. |
6 | 6 |
7 #include "chrome/browser/safe_browsing/safe_browsing_blocking_page.h" | 7 #include "chrome/browser/safe_browsing/safe_browsing_blocking_page.h" |
8 | 8 |
9 #include <string> | 9 #include <string> |
10 | 10 |
(...skipping 25 matching lines...) Expand all Loading... |
36 #include "components/google/core/browser/google_util.h" | 36 #include "components/google/core/browser/google_util.h" |
37 #include "content/public/browser/browser_thread.h" | 37 #include "content/public/browser/browser_thread.h" |
38 #include "content/public/browser/interstitial_page.h" | 38 #include "content/public/browser/interstitial_page.h" |
39 #include "content/public/browser/navigation_controller.h" | 39 #include "content/public/browser/navigation_controller.h" |
40 #include "content/public/browser/user_metrics.h" | 40 #include "content/public/browser/user_metrics.h" |
41 #include "content/public/browser/web_contents.h" | 41 #include "content/public/browser/web_contents.h" |
42 #include "content/public/common/renderer_preferences.h" | 42 #include "content/public/common/renderer_preferences.h" |
43 #include "grit/browser_resources.h" | 43 #include "grit/browser_resources.h" |
44 #include "net/base/escape.h" | 44 #include "net/base/escape.h" |
45 #include "ui/base/l10n/l10n_util.h" | 45 #include "ui/base/l10n/l10n_util.h" |
46 #include "ui/base/resource/resource_bundle.h" | |
47 #include "ui/base/webui/jstemplate_builder.h" | |
48 #include "ui/base/webui/web_ui_util.h" | |
49 | 46 |
50 #if defined(ENABLE_EXTENSIONS) | 47 #if defined(ENABLE_EXTENSIONS) |
51 #include "chrome/browser/extensions/api/experience_sampling_private/experience_s
ampling.h" | 48 #include "chrome/browser/extensions/api/experience_sampling_private/experience_s
ampling.h" |
52 #endif | 49 #endif |
53 | 50 |
54 using base::UserMetricsAction; | 51 using base::UserMetricsAction; |
55 using content::BrowserThread; | 52 using content::BrowserThread; |
56 using content::InterstitialPage; | 53 using content::InterstitialPage; |
57 using content::OpenURLParams; | 54 using content::OpenURLParams; |
58 using content::Referrer; | 55 using content::Referrer; |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
139 SafeBrowsingBlockingPageFactoryImpl>; | 136 SafeBrowsingBlockingPageFactoryImpl>; |
140 | 137 |
141 SafeBrowsingBlockingPageFactoryImpl() { } | 138 SafeBrowsingBlockingPageFactoryImpl() { } |
142 | 139 |
143 DISALLOW_COPY_AND_ASSIGN(SafeBrowsingBlockingPageFactoryImpl); | 140 DISALLOW_COPY_AND_ASSIGN(SafeBrowsingBlockingPageFactoryImpl); |
144 }; | 141 }; |
145 | 142 |
146 static base::LazyInstance<SafeBrowsingBlockingPageFactoryImpl> | 143 static base::LazyInstance<SafeBrowsingBlockingPageFactoryImpl> |
147 g_safe_browsing_blocking_page_factory_impl = LAZY_INSTANCE_INITIALIZER; | 144 g_safe_browsing_blocking_page_factory_impl = LAZY_INSTANCE_INITIALIZER; |
148 | 145 |
| 146 // static |
| 147 const void* SafeBrowsingBlockingPage::kTypeForTesting = |
| 148 &SafeBrowsingBlockingPage::kTypeForTesting; |
| 149 |
149 SafeBrowsingBlockingPage::SafeBrowsingBlockingPage( | 150 SafeBrowsingBlockingPage::SafeBrowsingBlockingPage( |
150 SafeBrowsingUIManager* ui_manager, | 151 SafeBrowsingUIManager* ui_manager, |
151 WebContents* web_contents, | 152 WebContents* web_contents, |
152 const UnsafeResourceList& unsafe_resources) | 153 const UnsafeResourceList& unsafe_resources) |
153 : malware_details_proceed_delay_ms_( | 154 : SecurityInterstitialPage(web_contents, unsafe_resources[0].url), |
| 155 malware_details_proceed_delay_ms_( |
154 kMalwareDetailsProceedDelayMilliSeconds), | 156 kMalwareDetailsProceedDelayMilliSeconds), |
155 ui_manager_(ui_manager), | 157 ui_manager_(ui_manager), |
156 report_loop_(NULL), | 158 report_loop_(NULL), |
157 is_main_frame_load_blocked_(IsMainPageLoadBlocked(unsafe_resources)), | 159 is_main_frame_load_blocked_(IsMainPageLoadBlocked(unsafe_resources)), |
158 unsafe_resources_(unsafe_resources), | 160 unsafe_resources_(unsafe_resources), |
159 proceeded_(false), | 161 proceeded_(false), |
160 web_contents_(web_contents), | |
161 url_(unsafe_resources[0].url), | |
162 interstitial_page_(NULL), | |
163 create_view_(true), | |
164 num_visits_(-1) { | 162 num_visits_(-1) { |
165 bool malware = false; | 163 bool malware = false; |
166 bool harmful = false; | 164 bool harmful = false; |
167 bool phishing = false; | 165 bool phishing = false; |
168 for (UnsafeResourceList::const_iterator iter = unsafe_resources_.begin(); | 166 for (UnsafeResourceList::const_iterator iter = unsafe_resources_.begin(); |
169 iter != unsafe_resources_.end(); ++iter) { | 167 iter != unsafe_resources_.end(); ++iter) { |
170 const UnsafeResource& resource = *iter; | 168 const UnsafeResource& resource = *iter; |
171 SBThreatType threat_type = resource.threat_type; | 169 SBThreatType threat_type = resource.threat_type; |
172 if (threat_type == SB_THREAT_TYPE_URL_MALWARE || | 170 if (threat_type == SB_THREAT_TYPE_URL_MALWARE || |
173 threat_type == SB_THREAT_TYPE_CLIENT_SIDE_MALWARE_URL) { | 171 threat_type == SB_THREAT_TYPE_CLIENT_SIDE_MALWARE_URL) { |
(...skipping 17 matching lines...) Expand all Loading... |
191 RecordUserDecision(SHOW); | 189 RecordUserDecision(SHOW); |
192 RecordUserInteraction(TOTAL_VISITS); | 190 RecordUserInteraction(TOTAL_VISITS); |
193 if (IsPrefEnabled(prefs::kSafeBrowsingProceedAnywayDisabled)) | 191 if (IsPrefEnabled(prefs::kSafeBrowsingProceedAnywayDisabled)) |
194 RecordUserDecision(PROCEEDING_DISABLED); | 192 RecordUserDecision(PROCEEDING_DISABLED); |
195 | 193 |
196 HistoryService* history_service = HistoryServiceFactory::GetForProfile( | 194 HistoryService* history_service = HistoryServiceFactory::GetForProfile( |
197 Profile::FromBrowserContext(web_contents->GetBrowserContext()), | 195 Profile::FromBrowserContext(web_contents->GetBrowserContext()), |
198 Profile::EXPLICIT_ACCESS); | 196 Profile::EXPLICIT_ACCESS); |
199 if (history_service) { | 197 if (history_service) { |
200 history_service->GetVisibleVisitCountToHost( | 198 history_service->GetVisibleVisitCountToHost( |
201 url_, | 199 request_url(), |
202 base::Bind(&SafeBrowsingBlockingPage::OnGotHistoryCount, | 200 base::Bind(&SafeBrowsingBlockingPage::OnGotHistoryCount, |
203 base::Unretained(this)), | 201 base::Unretained(this)), |
204 &request_tracker_); | 202 &request_tracker_); |
205 } | 203 } |
206 | 204 |
207 if (!is_main_frame_load_blocked_) { | 205 if (!is_main_frame_load_blocked_) { |
208 navigation_entry_index_to_remove_ = | 206 navigation_entry_index_to_remove_ = |
209 web_contents->GetController().GetLastCommittedEntryIndex(); | 207 web_contents->GetController().GetLastCommittedEntryIndex(); |
210 } else { | 208 } else { |
211 navigation_entry_index_to_remove_ = -1; | 209 navigation_entry_index_to_remove_ = -1; |
(...skipping 24 matching lines...) Expand all Loading... |
236 break; | 234 break; |
237 case TYPE_PHISHING: | 235 case TYPE_PHISHING: |
238 event_name = kEventNamePhishing; | 236 event_name = kEventNamePhishing; |
239 break; | 237 break; |
240 default: | 238 default: |
241 event_name = kEventNameOther; | 239 event_name = kEventNameOther; |
242 break; | 240 break; |
243 } | 241 } |
244 sampling_event_.reset(new ExperienceSamplingEvent( | 242 sampling_event_.reset(new ExperienceSamplingEvent( |
245 event_name, | 243 event_name, |
246 url_, | 244 request_url(), |
247 web_contents_->GetLastCommittedURL(), | 245 web_contents->GetLastCommittedURL(), |
248 web_contents_->GetBrowserContext())); | 246 web_contents->GetBrowserContext())); |
249 #endif | 247 #endif |
250 | |
251 // Creating interstitial_page_ without showing it leaks memory, so don't | |
252 // create it here. | |
253 } | 248 } |
254 | 249 |
255 bool SafeBrowsingBlockingPage::CanShowMalwareDetailsOption() { | 250 bool SafeBrowsingBlockingPage::CanShowMalwareDetailsOption() { |
256 return (!web_contents_->GetBrowserContext()->IsOffTheRecord() && | 251 return (!web_contents()->GetBrowserContext()->IsOffTheRecord() && |
257 web_contents_->GetURL().SchemeIs(url::kHttpScheme)); | 252 web_contents()->GetURL().SchemeIs(url::kHttpScheme)); |
258 } | 253 } |
259 | 254 |
260 SafeBrowsingBlockingPage::~SafeBrowsingBlockingPage() { | 255 SafeBrowsingBlockingPage::~SafeBrowsingBlockingPage() { |
261 } | 256 } |
262 | 257 |
263 void SafeBrowsingBlockingPage::CommandReceived(const std::string& cmd) { | 258 void SafeBrowsingBlockingPage::CommandReceived(const std::string& cmd) { |
264 std::string command(cmd); // Make a local copy so we can modify it. | 259 std::string command(cmd); // Make a local copy so we can modify it. |
265 // The Jasonified response has quotes, remove them. | 260 // The Jasonified response has quotes, remove them. |
266 if (command.length() > 1 && command[0] == '"') { | 261 if (command.length() > 1 && command[0] == '"') { |
267 command = command.substr(1, command.length() - 2); | 262 command = command.substr(1, command.length() - 2); |
(...skipping 13 matching lines...) Expand all Loading... |
281 RecordUserInteraction(SHOW_LEARN_MORE); | 276 RecordUserInteraction(SHOW_LEARN_MORE); |
282 GURL learn_more_url(interstitial_type_ == TYPE_PHISHING ? | 277 GURL learn_more_url(interstitial_type_ == TYPE_PHISHING ? |
283 kLearnMorePhishingUrlV2 : kLearnMoreMalwareUrlV2); | 278 kLearnMorePhishingUrlV2 : kLearnMoreMalwareUrlV2); |
284 learn_more_url = google_util::AppendGoogleLocaleParam( | 279 learn_more_url = google_util::AppendGoogleLocaleParam( |
285 learn_more_url, g_browser_process->GetApplicationLocale()); | 280 learn_more_url, g_browser_process->GetApplicationLocale()); |
286 OpenURLParams params(learn_more_url, | 281 OpenURLParams params(learn_more_url, |
287 Referrer(), | 282 Referrer(), |
288 CURRENT_TAB, | 283 CURRENT_TAB, |
289 ui::PAGE_TRANSITION_LINK, | 284 ui::PAGE_TRANSITION_LINK, |
290 false); | 285 false); |
291 web_contents_->OpenURL(params); | 286 web_contents()->OpenURL(params); |
292 return; | 287 return; |
293 } | 288 } |
294 | 289 |
295 if (command == kShowPrivacyCommand) { | 290 if (command == kShowPrivacyCommand) { |
296 // User pressed "Safe Browsing privacy policy". | 291 // User pressed "Safe Browsing privacy policy". |
297 RecordUserInteraction(SHOW_PRIVACY_POLICY); | 292 RecordUserInteraction(SHOW_PRIVACY_POLICY); |
298 GURL privacy_url( | 293 GURL privacy_url( |
299 l10n_util::GetStringUTF8(IDS_SAFE_BROWSING_PRIVACY_POLICY_URL)); | 294 l10n_util::GetStringUTF8(IDS_SAFE_BROWSING_PRIVACY_POLICY_URL)); |
300 privacy_url = google_util::AppendGoogleLocaleParam( | 295 privacy_url = google_util::AppendGoogleLocaleParam( |
301 privacy_url, g_browser_process->GetApplicationLocale()); | 296 privacy_url, g_browser_process->GetApplicationLocale()); |
302 OpenURLParams params(privacy_url, | 297 OpenURLParams params(privacy_url, |
303 Referrer(), | 298 Referrer(), |
304 CURRENT_TAB, | 299 CURRENT_TAB, |
305 ui::PAGE_TRANSITION_LINK, | 300 ui::PAGE_TRANSITION_LINK, |
306 false); | 301 false); |
307 web_contents_->OpenURL(params); | 302 web_contents()->OpenURL(params); |
308 return; | 303 return; |
309 } | 304 } |
310 | 305 |
311 bool proceed_blocked = false; | 306 bool proceed_blocked = false; |
312 if (command == kProceedCommand) { | 307 if (command == kProceedCommand) { |
313 if (IsPrefEnabled(prefs::kSafeBrowsingProceedAnywayDisabled)) { | 308 if (IsPrefEnabled(prefs::kSafeBrowsingProceedAnywayDisabled)) { |
314 proceed_blocked = true; | 309 proceed_blocked = true; |
315 } else { | 310 } else { |
316 RecordUserDecision(PROCEED); | 311 RecordUserDecision(PROCEED); |
317 interstitial_page_->Proceed(); | 312 interstitial_page()->Proceed(); |
318 // |this| has been deleted after Proceed() returns. | 313 // |this| has been deleted after Proceed() returns. |
319 return; | 314 return; |
320 } | 315 } |
321 } | 316 } |
322 | 317 |
323 if (command == kTakeMeBackCommand || proceed_blocked) { | 318 if (command == kTakeMeBackCommand || proceed_blocked) { |
324 // Don't record the user action here because there are other ways of | 319 // Don't record the user action here because there are other ways of |
325 // triggering DontProceed, like clicking the back button. | 320 // triggering DontProceed, like clicking the back button. |
326 if (is_main_frame_load_blocked_) { | 321 if (is_main_frame_load_blocked_) { |
327 // If the load is blocked, we want to close the interstitial and discard | 322 // If the load is blocked, we want to close the interstitial and discard |
328 // the pending entry. | 323 // the pending entry. |
329 interstitial_page_->DontProceed(); | 324 interstitial_page()->DontProceed(); |
330 // |this| has been deleted after DontProceed() returns. | 325 // |this| has been deleted after DontProceed() returns. |
331 return; | 326 return; |
332 } | 327 } |
333 | 328 |
334 // Otherwise the offending entry has committed, and we need to go back or | 329 // Otherwise the offending entry has committed, and we need to go back or |
335 // to a safe page. We will close the interstitial when that page commits. | 330 // to a safe page. We will close the interstitial when that page commits. |
336 if (web_contents_->GetController().CanGoBack()) { | 331 if (web_contents()->GetController().CanGoBack()) { |
337 web_contents_->GetController().GoBack(); | 332 web_contents()->GetController().GoBack(); |
338 } else { | 333 } else { |
339 web_contents_->GetController().LoadURL( | 334 web_contents()->GetController().LoadURL( |
340 GURL(chrome::kChromeUINewTabURL), | 335 GURL(chrome::kChromeUINewTabURL), |
341 content::Referrer(), | 336 content::Referrer(), |
342 ui::PAGE_TRANSITION_AUTO_TOPLEVEL, | 337 ui::PAGE_TRANSITION_AUTO_TOPLEVEL, |
343 std::string()); | 338 std::string()); |
344 } | 339 } |
345 return; | 340 return; |
346 } | 341 } |
347 | 342 |
348 // The "report error" and "show diagnostic" commands can have a number | 343 // The "report error" and "show diagnostic" commands can have a number |
349 // appended to them, which is the index of the element they apply to. | 344 // appended to them, which is the index of the element they apply to. |
(...skipping 28 matching lines...) Expand all Loading... |
378 diagnostic_url, g_browser_process->GetApplicationLocale()); | 373 diagnostic_url, g_browser_process->GetApplicationLocale()); |
379 DCHECK(unsafe_resources_[element_index].threat_type == | 374 DCHECK(unsafe_resources_[element_index].threat_type == |
380 SB_THREAT_TYPE_URL_MALWARE || | 375 SB_THREAT_TYPE_URL_MALWARE || |
381 unsafe_resources_[element_index].threat_type == | 376 unsafe_resources_[element_index].threat_type == |
382 SB_THREAT_TYPE_CLIENT_SIDE_MALWARE_URL || | 377 SB_THREAT_TYPE_CLIENT_SIDE_MALWARE_URL || |
383 unsafe_resources_[element_index].threat_type == | 378 unsafe_resources_[element_index].threat_type == |
384 SB_THREAT_TYPE_URL_UNWANTED); | 379 SB_THREAT_TYPE_URL_UNWANTED); |
385 OpenURLParams params( | 380 OpenURLParams params( |
386 diagnostic_url, Referrer(), CURRENT_TAB, ui::PAGE_TRANSITION_LINK, | 381 diagnostic_url, Referrer(), CURRENT_TAB, ui::PAGE_TRANSITION_LINK, |
387 false); | 382 false); |
388 web_contents_->OpenURL(params); | 383 web_contents()->OpenURL(params); |
389 return; | 384 return; |
390 } | 385 } |
391 | 386 |
392 if (command == kExpandedSeeMoreCommand) { | 387 if (command == kExpandedSeeMoreCommand) { |
393 RecordUserInteraction(SHOW_ADVANCED); | 388 RecordUserInteraction(SHOW_ADVANCED); |
394 return; | 389 return; |
395 } | 390 } |
396 | 391 |
397 NOTREACHED() << "Unexpected command: " << command; | 392 NOTREACHED() << "Unexpected command: " << command; |
398 } | 393 } |
399 | 394 |
400 void SafeBrowsingBlockingPage::OverrideRendererPrefs( | 395 void SafeBrowsingBlockingPage::OverrideRendererPrefs( |
401 content::RendererPreferences* prefs) { | 396 content::RendererPreferences* prefs) { |
402 Profile* profile = Profile::FromBrowserContext( | 397 Profile* profile = Profile::FromBrowserContext( |
403 web_contents_->GetBrowserContext()); | 398 web_contents()->GetBrowserContext()); |
404 renderer_preferences_util::UpdateFromSystemSettings( | 399 renderer_preferences_util::UpdateFromSystemSettings( |
405 prefs, profile, web_contents_); | 400 prefs, profile, web_contents()); |
406 } | 401 } |
407 | 402 |
408 void SafeBrowsingBlockingPage::SetReportingPreference(bool report) { | 403 void SafeBrowsingBlockingPage::SetReportingPreference(bool report) { |
409 Profile* profile = Profile::FromBrowserContext( | 404 Profile* profile = Profile::FromBrowserContext( |
410 web_contents_->GetBrowserContext()); | 405 web_contents()->GetBrowserContext()); |
411 PrefService* pref = profile->GetPrefs(); | 406 PrefService* pref = profile->GetPrefs(); |
412 pref->SetBoolean(prefs::kSafeBrowsingExtendedReportingEnabled, report); | 407 pref->SetBoolean(prefs::kSafeBrowsingExtendedReportingEnabled, report); |
413 UMA_HISTOGRAM_BOOLEAN("SB2.SetExtendedReportingEnabled", report); | 408 UMA_HISTOGRAM_BOOLEAN("SB2.SetExtendedReportingEnabled", report); |
414 } | 409 } |
415 | 410 |
416 void SafeBrowsingBlockingPage::OnProceed() { | 411 void SafeBrowsingBlockingPage::OnProceed() { |
417 proceeded_ = true; | 412 proceeded_ = true; |
418 // Send the malware details, if we opted to. | 413 // Send the malware details, if we opted to. |
419 FinishMalwareDetails(malware_details_proceed_delay_ms_); | 414 FinishMalwareDetails(malware_details_proceed_delay_ms_); |
420 | 415 |
421 NotifySafeBrowsingUIManager(ui_manager_, unsafe_resources_, true); | 416 NotifySafeBrowsingUIManager(ui_manager_, unsafe_resources_, true); |
422 | 417 |
423 // Check to see if some new notifications of unsafe resources have been | 418 // Check to see if some new notifications of unsafe resources have been |
424 // received while we were showing the interstitial. | 419 // received while we were showing the interstitial. |
425 UnsafeResourceMap* unsafe_resource_map = GetUnsafeResourcesMap(); | 420 UnsafeResourceMap* unsafe_resource_map = GetUnsafeResourcesMap(); |
426 UnsafeResourceMap::iterator iter = unsafe_resource_map->find(web_contents_); | 421 UnsafeResourceMap::iterator iter = unsafe_resource_map->find(web_contents()); |
427 SafeBrowsingBlockingPage* blocking_page = NULL; | 422 SafeBrowsingBlockingPage* blocking_page = NULL; |
428 if (iter != unsafe_resource_map->end() && !iter->second.empty()) { | 423 if (iter != unsafe_resource_map->end() && !iter->second.empty()) { |
429 // Build an interstitial for all the unsafe resources notifications. | 424 // Build an interstitial for all the unsafe resources notifications. |
430 // Don't show it now as showing an interstitial while an interstitial is | 425 // Don't show it now as showing an interstitial while an interstitial is |
431 // already showing would cause DontProceed() to be invoked. | 426 // already showing would cause DontProceed() to be invoked. |
432 blocking_page = factory_->CreateSafeBrowsingPage(ui_manager_, web_contents_, | 427 blocking_page = factory_->CreateSafeBrowsingPage(ui_manager_, |
| 428 web_contents(), |
433 iter->second); | 429 iter->second); |
434 unsafe_resource_map->erase(iter); | 430 unsafe_resource_map->erase(iter); |
435 } | 431 } |
436 | 432 |
437 // Now that this interstitial is gone, we can show the new one. | 433 // Now that this interstitial is gone, we can show the new one. |
438 if (blocking_page) | 434 if (blocking_page) |
439 blocking_page->Show(); | 435 blocking_page->Show(); |
440 } | 436 } |
441 | 437 |
442 void SafeBrowsingBlockingPage::DontCreateViewForTesting() { | 438 const void* SafeBrowsingBlockingPage::GetTypeForTesting() const { |
443 create_view_ = false; | 439 return SafeBrowsingBlockingPage::kTypeForTesting; |
444 } | 440 } |
445 | 441 |
446 void SafeBrowsingBlockingPage::Show() { | 442 bool SafeBrowsingBlockingPage::ShouldCreateNewNavigation() const { |
447 DCHECK(!interstitial_page_); | 443 return is_main_frame_load_blocked_; |
448 interstitial_page_ = InterstitialPage::Create( | |
449 web_contents_, is_main_frame_load_blocked_, url_, this); | |
450 if (!create_view_) | |
451 interstitial_page_->DontCreateViewForTesting(); | |
452 interstitial_page_->Show(); | |
453 } | 444 } |
454 | 445 |
455 void SafeBrowsingBlockingPage::OnDontProceed() { | 446 void SafeBrowsingBlockingPage::OnDontProceed() { |
456 // We could have already called Proceed(), in which case we must not notify | 447 // We could have already called Proceed(), in which case we must not notify |
457 // the SafeBrowsingUIManager again, as the client has been deleted. | 448 // the SafeBrowsingUIManager again, as the client has been deleted. |
458 if (proceeded_) | 449 if (proceeded_) |
459 return; | 450 return; |
460 | 451 |
461 if (!IsPrefEnabled(prefs::kSafeBrowsingProceedAnywayDisabled)) | 452 if (!IsPrefEnabled(prefs::kSafeBrowsingProceedAnywayDisabled)) |
462 RecordUserDecision(DONT_PROCEED); | 453 RecordUserDecision(DONT_PROCEED); |
463 | 454 |
464 // Send the malware details, if we opted to. | 455 // Send the malware details, if we opted to. |
465 FinishMalwareDetails(0); // No delay | 456 FinishMalwareDetails(0); // No delay |
466 | 457 |
467 NotifySafeBrowsingUIManager(ui_manager_, unsafe_resources_, false); | 458 NotifySafeBrowsingUIManager(ui_manager_, unsafe_resources_, false); |
468 | 459 |
469 // The user does not want to proceed, clear the queued unsafe resources | 460 // The user does not want to proceed, clear the queued unsafe resources |
470 // notifications we received while the interstitial was showing. | 461 // notifications we received while the interstitial was showing. |
471 UnsafeResourceMap* unsafe_resource_map = GetUnsafeResourcesMap(); | 462 UnsafeResourceMap* unsafe_resource_map = GetUnsafeResourcesMap(); |
472 UnsafeResourceMap::iterator iter = unsafe_resource_map->find(web_contents_); | 463 UnsafeResourceMap::iterator iter = unsafe_resource_map->find(web_contents()); |
473 if (iter != unsafe_resource_map->end() && !iter->second.empty()) { | 464 if (iter != unsafe_resource_map->end() && !iter->second.empty()) { |
474 NotifySafeBrowsingUIManager(ui_manager_, iter->second, false); | 465 NotifySafeBrowsingUIManager(ui_manager_, iter->second, false); |
475 unsafe_resource_map->erase(iter); | 466 unsafe_resource_map->erase(iter); |
476 } | 467 } |
477 | 468 |
478 // We don't remove the navigation entry if the tab is being destroyed as this | 469 // We don't remove the navigation entry if the tab is being destroyed as this |
479 // would trigger a navigation that would cause trouble as the render view host | 470 // would trigger a navigation that would cause trouble as the render view host |
480 // for the tab has by then already been destroyed. We also don't delete the | 471 // for the tab has by then already been destroyed. We also don't delete the |
481 // current entry if it has been committed again, which is possible on a page | 472 // current entry if it has been committed again, which is possible on a page |
482 // that had a subresource warning. | 473 // that had a subresource warning. |
483 int last_committed_index = | 474 int last_committed_index = |
484 web_contents_->GetController().GetLastCommittedEntryIndex(); | 475 web_contents()->GetController().GetLastCommittedEntryIndex(); |
485 if (navigation_entry_index_to_remove_ != -1 && | 476 if (navigation_entry_index_to_remove_ != -1 && |
486 navigation_entry_index_to_remove_ != last_committed_index && | 477 navigation_entry_index_to_remove_ != last_committed_index && |
487 !web_contents_->IsBeingDestroyed()) { | 478 !web_contents()->IsBeingDestroyed()) { |
488 CHECK(web_contents_->GetController().RemoveEntryAtIndex( | 479 CHECK(web_contents()->GetController().RemoveEntryAtIndex( |
489 navigation_entry_index_to_remove_)); | 480 navigation_entry_index_to_remove_)); |
490 navigation_entry_index_to_remove_ = -1; | 481 navigation_entry_index_to_remove_ = -1; |
491 } | 482 } |
492 } | 483 } |
493 | 484 |
494 void SafeBrowsingBlockingPage::OnGotHistoryCount(bool success, | 485 void SafeBrowsingBlockingPage::OnGotHistoryCount(bool success, |
495 int num_visits, | 486 int num_visits, |
496 base::Time first_visit) { | 487 base::Time first_visit) { |
497 if (success) | 488 if (success) |
498 num_visits_ = num_visits; | 489 num_visits_ = num_visits; |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
599 // Finish the malware details collection, send it over. | 590 // Finish the malware details collection, send it over. |
600 BrowserThread::PostDelayedTask( | 591 BrowserThread::PostDelayedTask( |
601 BrowserThread::IO, FROM_HERE, | 592 BrowserThread::IO, FROM_HERE, |
602 base::Bind(&MalwareDetails::FinishCollection, malware_details_.get()), | 593 base::Bind(&MalwareDetails::FinishCollection, malware_details_.get()), |
603 base::TimeDelta::FromMilliseconds(delay_ms)); | 594 base::TimeDelta::FromMilliseconds(delay_ms)); |
604 } | 595 } |
605 } | 596 } |
606 | 597 |
607 bool SafeBrowsingBlockingPage::IsPrefEnabled(const char* pref) { | 598 bool SafeBrowsingBlockingPage::IsPrefEnabled(const char* pref) { |
608 Profile* profile = | 599 Profile* profile = |
609 Profile::FromBrowserContext(web_contents_->GetBrowserContext()); | 600 Profile::FromBrowserContext(web_contents()->GetBrowserContext()); |
610 return profile->GetPrefs()->GetBoolean(pref); | 601 return profile->GetPrefs()->GetBoolean(pref); |
611 } | 602 } |
612 | 603 |
613 // static | 604 // static |
614 void SafeBrowsingBlockingPage::NotifySafeBrowsingUIManager( | 605 void SafeBrowsingBlockingPage::NotifySafeBrowsingUIManager( |
615 SafeBrowsingUIManager* ui_manager, | 606 SafeBrowsingUIManager* ui_manager, |
616 const UnsafeResourceList& unsafe_resources, | 607 const UnsafeResourceList& unsafe_resources, |
617 bool proceed) { | 608 bool proceed) { |
618 BrowserThread::PostTask( | 609 BrowserThread::PostTask( |
619 BrowserThread::IO, FROM_HERE, | 610 BrowserThread::IO, FROM_HERE, |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
680 // load, since they happen after the page is finished loading. | 671 // load, since they happen after the page is finished loading. |
681 if (unsafe_resources[0].threat_type == | 672 if (unsafe_resources[0].threat_type == |
682 SB_THREAT_TYPE_CLIENT_SIDE_PHISHING_URL) { | 673 SB_THREAT_TYPE_CLIENT_SIDE_PHISHING_URL) { |
683 return false; | 674 return false; |
684 } | 675 } |
685 | 676 |
686 // Otherwise, check the threat type. | 677 // Otherwise, check the threat type. |
687 return unsafe_resources.size() == 1 && !unsafe_resources[0].is_subresource; | 678 return unsafe_resources.size() == 1 && !unsafe_resources[0].is_subresource; |
688 } | 679 } |
689 | 680 |
690 std::string SafeBrowsingBlockingPage::GetHTMLContents() { | 681 void SafeBrowsingBlockingPage::PopulateInterstitialStrings( |
691 DCHECK(!unsafe_resources_.empty()); | 682 base::DictionaryValue* load_time_data) { |
| 683 CHECK(load_time_data); |
| 684 CHECK(!unsafe_resources_.empty()); |
692 | 685 |
693 // Fill in the shared values. | 686 load_time_data->SetString("type", "SAFEBROWSING"); |
694 base::DictionaryValue load_time_data; | 687 load_time_data->SetString( |
695 webui::SetFontAndTextDirection(&load_time_data); | |
696 load_time_data.SetString("type", "SAFEBROWSING"); | |
697 load_time_data.SetString( | |
698 "tabTitle", l10n_util::GetStringUTF16(IDS_SAFEBROWSING_V3_TITLE)); | 688 "tabTitle", l10n_util::GetStringUTF16(IDS_SAFEBROWSING_V3_TITLE)); |
699 load_time_data.SetString( | 689 load_time_data->SetString( |
700 "openDetails", | 690 "openDetails", |
701 l10n_util::GetStringUTF16(IDS_SAFEBROWSING_V3_OPEN_DETAILS_BUTTON)); | 691 l10n_util::GetStringUTF16(IDS_SAFEBROWSING_V3_OPEN_DETAILS_BUTTON)); |
702 load_time_data.SetString( | 692 load_time_data->SetString( |
703 "closeDetails", | 693 "closeDetails", |
704 l10n_util::GetStringUTF16(IDS_SAFEBROWSING_V3_CLOSE_DETAILS_BUTTON)); | 694 l10n_util::GetStringUTF16(IDS_SAFEBROWSING_V3_CLOSE_DETAILS_BUTTON)); |
705 load_time_data.SetString( | 695 load_time_data->SetString( |
706 "primaryButtonText", | 696 "primaryButtonText", |
707 l10n_util::GetStringUTF16(IDS_SAFEBROWSING_OVERRIDABLE_SAFETY_BUTTON)); | 697 l10n_util::GetStringUTF16(IDS_SAFEBROWSING_OVERRIDABLE_SAFETY_BUTTON)); |
708 load_time_data.SetBoolean( | 698 load_time_data->SetBoolean( |
709 "overridable", | 699 "overridable", |
710 !IsPrefEnabled(prefs::kSafeBrowsingProceedAnywayDisabled)); | 700 !IsPrefEnabled(prefs::kSafeBrowsingProceedAnywayDisabled)); |
711 | 701 |
712 switch (interstitial_type_) { | 702 switch (interstitial_type_) { |
713 case TYPE_MALWARE: | 703 case TYPE_MALWARE: |
714 PopulateMalwareLoadTimeData(&load_time_data); | 704 PopulateMalwareLoadTimeData(load_time_data); |
715 break; | 705 break; |
716 case TYPE_HARMFUL: | 706 case TYPE_HARMFUL: |
717 PopulateHarmfulLoadTimeData(&load_time_data); | 707 PopulateHarmfulLoadTimeData(load_time_data); |
718 break; | 708 break; |
719 case TYPE_PHISHING: | 709 case TYPE_PHISHING: |
720 PopulatePhishingLoadTimeData(&load_time_data); | 710 PopulatePhishingLoadTimeData(load_time_data); |
721 break; | 711 break; |
722 } | 712 } |
723 | |
724 base::StringPiece html( | |
725 ResourceBundle::GetSharedInstance().GetRawDataResource( | |
726 IDR_SECURITY_INTERSTITIAL_HTML)); | |
727 return webui::GetI18nTemplateHtml(html, &load_time_data); | |
728 } | 713 } |
729 | 714 |
730 void SafeBrowsingBlockingPage::PopulateMalwareLoadTimeData( | 715 void SafeBrowsingBlockingPage::PopulateMalwareLoadTimeData( |
731 base::DictionaryValue* load_time_data) { | 716 base::DictionaryValue* load_time_data) { |
732 load_time_data->SetBoolean("phishing", false); | 717 load_time_data->SetBoolean("phishing", false); |
733 load_time_data->SetString( | 718 load_time_data->SetString( |
734 "heading", l10n_util::GetStringUTF16(IDS_MALWARE_V3_HEADING)); | 719 "heading", l10n_util::GetStringUTF16(IDS_MALWARE_V3_HEADING)); |
735 load_time_data->SetString( | 720 load_time_data->SetString( |
736 "primaryParagraph", | 721 "primaryParagraph", |
737 l10n_util::GetStringFUTF16( | 722 l10n_util::GetStringFUTF16( |
738 IDS_MALWARE_V3_PRIMARY_PARAGRAPH, | 723 IDS_MALWARE_V3_PRIMARY_PARAGRAPH, |
739 base::UTF8ToUTF16(url_.host()))); | 724 GetFormattedHostName())); |
740 load_time_data->SetString( | 725 load_time_data->SetString( |
741 "explanationParagraph", | 726 "explanationParagraph", |
742 is_main_frame_load_blocked_ ? | 727 is_main_frame_load_blocked_ ? |
743 l10n_util::GetStringFUTF16( | 728 l10n_util::GetStringFUTF16( |
744 IDS_MALWARE_V3_EXPLANATION_PARAGRAPH, | 729 IDS_MALWARE_V3_EXPLANATION_PARAGRAPH, |
745 base::UTF8ToUTF16(url_.host())) : | 730 GetFormattedHostName()) : |
746 l10n_util::GetStringFUTF16( | 731 l10n_util::GetStringFUTF16( |
747 IDS_MALWARE_V3_EXPLANATION_PARAGRAPH_SUBRESOURCE, | 732 IDS_MALWARE_V3_EXPLANATION_PARAGRAPH_SUBRESOURCE, |
748 base::UTF8ToUTF16(web_contents_->GetURL().host()), | 733 base::UTF8ToUTF16(web_contents()->GetURL().host()), |
749 base::UTF8ToUTF16(url_.host()))); | 734 GetFormattedHostName())); |
750 load_time_data->SetString( | 735 load_time_data->SetString( |
751 "finalParagraph", | 736 "finalParagraph", |
752 l10n_util::GetStringUTF16(IDS_MALWARE_V3_PROCEED_PARAGRAPH)); | 737 l10n_util::GetStringUTF16(IDS_MALWARE_V3_PROCEED_PARAGRAPH)); |
753 | 738 |
754 load_time_data->SetBoolean(kDisplayCheckBox, CanShowMalwareDetailsOption()); | 739 load_time_data->SetBoolean(kDisplayCheckBox, CanShowMalwareDetailsOption()); |
755 if (CanShowMalwareDetailsOption()) { | 740 if (CanShowMalwareDetailsOption()) { |
756 std::string privacy_link = base::StringPrintf( | 741 std::string privacy_link = base::StringPrintf( |
757 kPrivacyLinkHtml, | 742 kPrivacyLinkHtml, |
758 l10n_util::GetStringUTF8( | 743 l10n_util::GetStringUTF8( |
759 IDS_SAFE_BROWSING_PRIVACY_POLICY_PAGE).c_str()); | 744 IDS_SAFE_BROWSING_PRIVACY_POLICY_PAGE).c_str()); |
760 load_time_data->SetString( | 745 load_time_data->SetString( |
761 "optInLink", | 746 "optInLink", |
762 l10n_util::GetStringFUTF16(IDS_SAFE_BROWSING_MALWARE_REPORTING_AGREE, | 747 l10n_util::GetStringFUTF16(IDS_SAFE_BROWSING_MALWARE_REPORTING_AGREE, |
763 base::UTF8ToUTF16(privacy_link))); | 748 base::UTF8ToUTF16(privacy_link))); |
764 load_time_data->SetBoolean( | 749 load_time_data->SetBoolean( |
765 kBoxChecked, | 750 kBoxChecked, |
766 IsPrefEnabled(prefs::kSafeBrowsingExtendedReportingEnabled)); | 751 IsPrefEnabled(prefs::kSafeBrowsingExtendedReportingEnabled)); |
767 } | 752 } |
768 } | 753 } |
769 | 754 |
770 void SafeBrowsingBlockingPage::PopulateHarmfulLoadTimeData( | 755 void SafeBrowsingBlockingPage::PopulateHarmfulLoadTimeData( |
771 base::DictionaryValue* load_time_data) { | 756 base::DictionaryValue* load_time_data) { |
772 load_time_data->SetBoolean("phishing", false); | 757 load_time_data->SetBoolean("phishing", false); |
773 load_time_data->SetString( | 758 load_time_data->SetString( |
774 "heading", l10n_util::GetStringUTF16(IDS_HARMFUL_V3_HEADING)); | 759 "heading", l10n_util::GetStringUTF16(IDS_HARMFUL_V3_HEADING)); |
775 load_time_data->SetString( | 760 load_time_data->SetString( |
776 "primaryParagraph", | 761 "primaryParagraph", |
777 l10n_util::GetStringFUTF16( | 762 l10n_util::GetStringFUTF16( |
778 IDS_HARMFUL_V3_PRIMARY_PARAGRAPH, | 763 IDS_HARMFUL_V3_PRIMARY_PARAGRAPH, |
779 base::UTF8ToUTF16(url_.host()))); | 764 GetFormattedHostName())); |
780 load_time_data->SetString( | 765 load_time_data->SetString( |
781 "explanationParagraph", | 766 "explanationParagraph", |
782 l10n_util::GetStringFUTF16( | 767 l10n_util::GetStringFUTF16( |
783 IDS_HARMFUL_V3_EXPLANATION_PARAGRAPH, | 768 IDS_HARMFUL_V3_EXPLANATION_PARAGRAPH, |
784 base::UTF8ToUTF16(url_.host()))); | 769 GetFormattedHostName())); |
785 load_time_data->SetString( | 770 load_time_data->SetString( |
786 "finalParagraph", | 771 "finalParagraph", |
787 l10n_util::GetStringUTF16(IDS_HARMFUL_V3_PROCEED_PARAGRAPH)); | 772 l10n_util::GetStringUTF16(IDS_HARMFUL_V3_PROCEED_PARAGRAPH)); |
788 | 773 |
789 load_time_data->SetBoolean(kDisplayCheckBox, CanShowMalwareDetailsOption()); | 774 load_time_data->SetBoolean(kDisplayCheckBox, CanShowMalwareDetailsOption()); |
790 if (CanShowMalwareDetailsOption()) { | 775 if (CanShowMalwareDetailsOption()) { |
791 std::string privacy_link = base::StringPrintf( | 776 std::string privacy_link = base::StringPrintf( |
792 kPrivacyLinkHtml, | 777 kPrivacyLinkHtml, |
793 l10n_util::GetStringUTF8( | 778 l10n_util::GetStringUTF8( |
794 IDS_SAFE_BROWSING_PRIVACY_POLICY_PAGE).c_str()); | 779 IDS_SAFE_BROWSING_PRIVACY_POLICY_PAGE).c_str()); |
(...skipping 10 matching lines...) Expand all Loading... |
805 void SafeBrowsingBlockingPage::PopulatePhishingLoadTimeData( | 790 void SafeBrowsingBlockingPage::PopulatePhishingLoadTimeData( |
806 base::DictionaryValue* load_time_data) { | 791 base::DictionaryValue* load_time_data) { |
807 load_time_data->SetBoolean("phishing", true); | 792 load_time_data->SetBoolean("phishing", true); |
808 load_time_data->SetString( | 793 load_time_data->SetString( |
809 "heading", | 794 "heading", |
810 l10n_util::GetStringUTF16(IDS_PHISHING_V3_HEADING)); | 795 l10n_util::GetStringUTF16(IDS_PHISHING_V3_HEADING)); |
811 load_time_data->SetString( | 796 load_time_data->SetString( |
812 "primaryParagraph", | 797 "primaryParagraph", |
813 l10n_util::GetStringFUTF16( | 798 l10n_util::GetStringFUTF16( |
814 IDS_PHISHING_V3_PRIMARY_PARAGRAPH, | 799 IDS_PHISHING_V3_PRIMARY_PARAGRAPH, |
815 base::UTF8ToUTF16(url_.host()))); | 800 GetFormattedHostName())); |
816 load_time_data->SetString( | 801 load_time_data->SetString( |
817 "explanationParagraph", | 802 "explanationParagraph", |
818 l10n_util::GetStringFUTF16(IDS_PHISHING_V3_EXPLANATION_PARAGRAPH, | 803 l10n_util::GetStringFUTF16(IDS_PHISHING_V3_EXPLANATION_PARAGRAPH, |
819 base::UTF8ToUTF16(url_.host()))); | 804 GetFormattedHostName())); |
820 load_time_data->SetString( | 805 load_time_data->SetString( |
821 "finalParagraph", | 806 "finalParagraph", |
822 l10n_util::GetStringUTF16(IDS_PHISHING_V3_PROCEED_PARAGRAPH)); | 807 l10n_util::GetStringUTF16(IDS_PHISHING_V3_PROCEED_PARAGRAPH)); |
823 } | 808 } |
OLD | NEW |