| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/safe_browsing/safe_browsing_service.h" | 5 #include "chrome/browser/safe_browsing/safe_browsing_service.h" |
| 6 | 6 |
| 7 #include "base/bind.h" |
| 8 #include "base/bind_helpers.h" |
| 7 #include "base/callback.h" | 9 #include "base/callback.h" |
| 8 #include "base/command_line.h" | 10 #include "base/command_line.h" |
| 9 #include "base/lazy_instance.h" | 11 #include "base/lazy_instance.h" |
| 10 #include "base/path_service.h" | 12 #include "base/path_service.h" |
| 11 #include "base/stl_util.h" | 13 #include "base/stl_util.h" |
| 12 #include "base/string_util.h" | 14 #include "base/string_util.h" |
| 13 #include "base/threading/thread_restrictions.h" | 15 #include "base/threading/thread_restrictions.h" |
| 14 #include "chrome/browser/browser_process.h" | 16 #include "chrome/browser/browser_process.h" |
| 15 #include "chrome/browser/metrics/metrics_service.h" | 17 #include "chrome/browser/metrics/metrics_service.h" |
| 16 #include "chrome/browser/prefs/pref_change_registrar.h" | 18 #include "chrome/browser/prefs/pref_change_registrar.h" |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 119 } | 121 } |
| 120 | 122 |
| 121 SafeBrowsingService::UnsafeResource::~UnsafeResource() {} | 123 SafeBrowsingService::UnsafeResource::~UnsafeResource() {} |
| 122 | 124 |
| 123 SafeBrowsingService::SafeBrowsingCheck::SafeBrowsingCheck() | 125 SafeBrowsingService::SafeBrowsingCheck::SafeBrowsingCheck() |
| 124 : full_hash(NULL), | 126 : full_hash(NULL), |
| 125 client(NULL), | 127 client(NULL), |
| 126 need_get_hash(false), | 128 need_get_hash(false), |
| 127 result(SAFE), | 129 result(SAFE), |
| 128 is_download(false), | 130 is_download(false), |
| 129 timeout_task(NULL) { | 131 timeout_factory_(NULL) { |
| 130 } | 132 } |
| 131 | 133 |
| 132 SafeBrowsingService::SafeBrowsingCheck::~SafeBrowsingCheck() {} | 134 SafeBrowsingService::SafeBrowsingCheck::~SafeBrowsingCheck() {} |
| 133 | 135 |
| 134 void SafeBrowsingService::Client::OnSafeBrowsingResult( | 136 void SafeBrowsingService::Client::OnSafeBrowsingResult( |
| 135 const SafeBrowsingCheck& check) { | 137 const SafeBrowsingCheck& check) { |
| 136 if (!check.urls.empty()) { | 138 if (!check.urls.empty()) { |
| 137 | 139 |
| 138 DCHECK(!check.full_hash.get()); | 140 DCHECK(!check.full_hash.get()); |
| 139 if (!check.is_download) { | 141 if (!check.is_download) { |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 247 if (!enabled_ || !enable_download_protection_) | 249 if (!enabled_ || !enable_download_protection_) |
| 248 return true; | 250 return true; |
| 249 | 251 |
| 250 // We need to check the database for url prefix, and later may fetch the url | 252 // We need to check the database for url prefix, and later may fetch the url |
| 251 // from the safebrowsing backends. These need to be asynchronous. | 253 // from the safebrowsing backends. These need to be asynchronous. |
| 252 SafeBrowsingCheck* check = new SafeBrowsingCheck(); | 254 SafeBrowsingCheck* check = new SafeBrowsingCheck(); |
| 253 check->urls = url_chain; | 255 check->urls = url_chain; |
| 254 StartDownloadCheck( | 256 StartDownloadCheck( |
| 255 check, | 257 check, |
| 256 client, | 258 client, |
| 257 NewRunnableMethod(this, | 259 base::Bind(&SafeBrowsingService::CheckDownloadUrlOnSBThread, this, check), |
| 258 &SafeBrowsingService::CheckDownloadUrlOnSBThread, | |
| 259 check), | |
| 260 download_urlcheck_timeout_ms_); | 260 download_urlcheck_timeout_ms_); |
| 261 return false; | 261 return false; |
| 262 } | 262 } |
| 263 | 263 |
| 264 bool SafeBrowsingService::CheckDownloadHash(const std::string& full_hash, | 264 bool SafeBrowsingService::CheckDownloadHash(const std::string& full_hash, |
| 265 Client* client) { | 265 Client* client) { |
| 266 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 266 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 267 DCHECK(!full_hash.empty()); | 267 DCHECK(!full_hash.empty()); |
| 268 if (!enabled_ || !enable_download_protection_ || full_hash.empty()) | 268 if (!enabled_ || !enable_download_protection_ || full_hash.empty()) |
| 269 return true; | 269 return true; |
| 270 | 270 |
| 271 // We need to check the database for url prefix, and later may fetch the url | 271 // We need to check the database for url prefix, and later may fetch the url |
| 272 // from the safebrowsing backends. These need to be asynchronous. | 272 // from the safebrowsing backends. These need to be asynchronous. |
| 273 SafeBrowsingCheck* check = new SafeBrowsingCheck(); | 273 SafeBrowsingCheck* check = new SafeBrowsingCheck(); |
| 274 check->full_hash.reset(new SBFullHash); | 274 check->full_hash.reset(new SBFullHash); |
| 275 safe_browsing_util::StringToSBFullHash(full_hash, check->full_hash.get()); | 275 safe_browsing_util::StringToSBFullHash(full_hash, check->full_hash.get()); |
| 276 StartDownloadCheck( | 276 StartDownloadCheck( |
| 277 check, | 277 check, |
| 278 client, | 278 client, |
| 279 NewRunnableMethod(this, | 279 base::Bind(&SafeBrowsingService::CheckDownloadHashOnSBThread,this, check), |
| 280 &SafeBrowsingService::CheckDownloadHashOnSBThread, | |
| 281 check), | |
| 282 download_hashcheck_timeout_ms_); | 280 download_hashcheck_timeout_ms_); |
| 283 return false; | 281 return false; |
| 284 } | 282 } |
| 285 | 283 |
| 286 bool SafeBrowsingService::MatchCsdWhitelistUrl(const GURL& url) { | 284 bool SafeBrowsingService::MatchCsdWhitelistUrl(const GURL& url) { |
| 287 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 285 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 288 if (!enabled_ || !enable_csd_whitelist_ || !MakeDatabaseAvailable()) { | 286 if (!enabled_ || !enable_csd_whitelist_ || !MakeDatabaseAvailable()) { |
| 289 // There is something funky going on here -- for example, perhaps the user | 287 // There is something funky going on here -- for example, perhaps the user |
| 290 // has not restarted since enabling metrics reporting, so we haven't | 288 // has not restarted since enabling metrics reporting, so we haven't |
| 291 // enabled the csd whitelist yet. Just to be safe we return true in this | 289 // enabled the csd whitelist yet. Just to be safe we return true in this |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 342 check->client = client; | 340 check->client = client; |
| 343 check->result = SAFE; | 341 check->result = SAFE; |
| 344 check->is_download = false; | 342 check->is_download = false; |
| 345 check->need_get_hash = full_hits.empty(); | 343 check->need_get_hash = full_hits.empty(); |
| 346 check->prefix_hits.swap(prefix_hits); | 344 check->prefix_hits.swap(prefix_hits); |
| 347 check->full_hits.swap(full_hits); | 345 check->full_hits.swap(full_hits); |
| 348 checks_.insert(check); | 346 checks_.insert(check); |
| 349 | 347 |
| 350 BrowserThread::PostTask( | 348 BrowserThread::PostTask( |
| 351 BrowserThread::IO, FROM_HERE, | 349 BrowserThread::IO, FROM_HERE, |
| 352 NewRunnableMethod(this, &SafeBrowsingService::OnCheckDone, check)); | 350 base::Bind(&SafeBrowsingService::OnCheckDone, this, check)); |
| 353 | 351 |
| 354 return false; | 352 return false; |
| 355 } | 353 } |
| 356 | 354 |
| 357 void SafeBrowsingService::CancelCheck(Client* client) { | 355 void SafeBrowsingService::CancelCheck(Client* client) { |
| 358 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 356 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 359 for (CurrentChecks::iterator i = checks_.begin(); i != checks_.end(); ++i) { | 357 for (CurrentChecks::iterator i = checks_.begin(); i != checks_.end(); ++i) { |
| 360 // We can't delete matching checks here because the db thread has a copy of | 358 // We can't delete matching checks here because the db thread has a copy of |
| 361 // the pointer. Instead, we simply NULL out the client, and when the db | 359 // the pointer. Instead, we simply NULL out the client, and when the db |
| 362 // thread calls us back, we'll clean up the check. | 360 // thread calls us back, we'll clean up the check. |
| (...skipping 30 matching lines...) Expand all Loading... |
| 393 resource.redirect_urls = redirect_urls; | 391 resource.redirect_urls = redirect_urls; |
| 394 resource.is_subresource = is_subresource; | 392 resource.is_subresource = is_subresource; |
| 395 resource.threat_type= result; | 393 resource.threat_type= result; |
| 396 resource.client = client; | 394 resource.client = client; |
| 397 resource.render_process_host_id = render_process_host_id; | 395 resource.render_process_host_id = render_process_host_id; |
| 398 resource.render_view_id = render_view_id; | 396 resource.render_view_id = render_view_id; |
| 399 | 397 |
| 400 // The blocking page must be created from the UI thread. | 398 // The blocking page must be created from the UI thread. |
| 401 BrowserThread::PostTask( | 399 BrowserThread::PostTask( |
| 402 BrowserThread::UI, FROM_HERE, | 400 BrowserThread::UI, FROM_HERE, |
| 403 NewRunnableMethod( | 401 base::Bind(&SafeBrowsingService::DoDisplayBlockingPage, this, resource)); |
| 404 this, &SafeBrowsingService::DoDisplayBlockingPage, resource)); | |
| 405 } | 402 } |
| 406 | 403 |
| 407 void SafeBrowsingService::HandleGetHashResults( | 404 void SafeBrowsingService::HandleGetHashResults( |
| 408 SafeBrowsingCheck* check, | 405 SafeBrowsingCheck* check, |
| 409 const std::vector<SBFullHashResult>& full_hashes, | 406 const std::vector<SBFullHashResult>& full_hashes, |
| 410 bool can_cache) { | 407 bool can_cache) { |
| 411 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 408 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 412 | 409 |
| 413 if (!enabled_) | 410 if (!enabled_) |
| 414 return; | 411 return; |
| (...skipping 13 matching lines...) Expand all Loading... |
| 428 if (can_cache && MakeDatabaseAvailable()) { | 425 if (can_cache && MakeDatabaseAvailable()) { |
| 429 // Cache the GetHash results in memory: | 426 // Cache the GetHash results in memory: |
| 430 database_->CacheHashResults(prefixes, full_hashes); | 427 database_->CacheHashResults(prefixes, full_hashes); |
| 431 } | 428 } |
| 432 } | 429 } |
| 433 | 430 |
| 434 void SafeBrowsingService::HandleChunk(const std::string& list, | 431 void SafeBrowsingService::HandleChunk(const std::string& list, |
| 435 SBChunkList* chunks) { | 432 SBChunkList* chunks) { |
| 436 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 433 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 437 DCHECK(enabled_); | 434 DCHECK(enabled_); |
| 438 safe_browsing_thread_->message_loop()->PostTask(FROM_HERE, NewRunnableMethod( | 435 safe_browsing_thread_->message_loop()->PostTask(FROM_HERE, base::Bind( |
| 439 this, &SafeBrowsingService::HandleChunkForDatabase, list, chunks)); | 436 &SafeBrowsingService::HandleChunkForDatabase, this, list, chunks)); |
| 440 } | 437 } |
| 441 | 438 |
| 442 void SafeBrowsingService::HandleChunkDelete( | 439 void SafeBrowsingService::HandleChunkDelete( |
| 443 std::vector<SBChunkDelete>* chunk_deletes) { | 440 std::vector<SBChunkDelete>* chunk_deletes) { |
| 444 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 441 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 445 DCHECK(enabled_); | 442 DCHECK(enabled_); |
| 446 safe_browsing_thread_->message_loop()->PostTask(FROM_HERE, NewRunnableMethod( | 443 safe_browsing_thread_->message_loop()->PostTask(FROM_HERE, base::Bind( |
| 447 this, &SafeBrowsingService::DeleteChunks, chunk_deletes)); | 444 &SafeBrowsingService::DeleteChunks, this, chunk_deletes)); |
| 448 } | 445 } |
| 449 | 446 |
| 450 void SafeBrowsingService::UpdateStarted() { | 447 void SafeBrowsingService::UpdateStarted() { |
| 451 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 448 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 452 DCHECK(enabled_); | 449 DCHECK(enabled_); |
| 453 DCHECK(!update_in_progress_); | 450 DCHECK(!update_in_progress_); |
| 454 update_in_progress_ = true; | 451 update_in_progress_ = true; |
| 455 safe_browsing_thread_->message_loop()->PostTask(FROM_HERE, NewRunnableMethod( | 452 safe_browsing_thread_->message_loop()->PostTask(FROM_HERE, base::Bind( |
| 456 this, &SafeBrowsingService::GetAllChunksFromDatabase)); | 453 &SafeBrowsingService::GetAllChunksFromDatabase, this)); |
| 457 } | 454 } |
| 458 | 455 |
| 459 void SafeBrowsingService::UpdateFinished(bool update_succeeded) { | 456 void SafeBrowsingService::UpdateFinished(bool update_succeeded) { |
| 460 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 457 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 461 DCHECK(enabled_); | 458 DCHECK(enabled_); |
| 462 if (update_in_progress_) { | 459 if (update_in_progress_) { |
| 463 update_in_progress_ = false; | 460 update_in_progress_ = false; |
| 464 safe_browsing_thread_->message_loop()->PostTask(FROM_HERE, | 461 safe_browsing_thread_->message_loop()->PostTask(FROM_HERE, |
| 465 NewRunnableMethod(this, | 462 base::Bind(&SafeBrowsingService::DatabaseUpdateFinished, |
| 466 &SafeBrowsingService::DatabaseUpdateFinished, | 463 this, update_succeeded)); |
| 467 update_succeeded)); | |
| 468 } | 464 } |
| 469 } | 465 } |
| 470 | 466 |
| 471 bool SafeBrowsingService::IsUpdateInProgress() const { | 467 bool SafeBrowsingService::IsUpdateInProgress() const { |
| 472 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 468 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 473 return update_in_progress_; | 469 return update_in_progress_; |
| 474 } | 470 } |
| 475 | 471 |
| 476 void SafeBrowsingService::OnBlockingPageDone( | 472 void SafeBrowsingService::OnBlockingPageDone( |
| 477 const std::vector<UnsafeResource>& resources, | 473 const std::vector<UnsafeResource>& resources, |
| 478 bool proceed) { | 474 bool proceed) { |
| 479 for (std::vector<UnsafeResource>::const_iterator iter = resources.begin(); | 475 for (std::vector<UnsafeResource>::const_iterator iter = resources.begin(); |
| 480 iter != resources.end(); ++iter) { | 476 iter != resources.end(); ++iter) { |
| 481 const UnsafeResource& resource = *iter; | 477 const UnsafeResource& resource = *iter; |
| 482 NotifyClientBlockingComplete(resource.client, proceed); | 478 NotifyClientBlockingComplete(resource.client, proceed); |
| 483 | 479 |
| 484 if (proceed) { | 480 if (proceed) { |
| 485 BrowserThread::PostTask( | 481 BrowserThread::PostTask( |
| 486 BrowserThread::UI, | 482 BrowserThread::UI, |
| 487 FROM_HERE, | 483 FROM_HERE, |
| 488 NewRunnableMethod(this, | 484 base::Bind(&SafeBrowsingService::UpdateWhitelist, this, resource)); |
| 489 &SafeBrowsingService::UpdateWhitelist, | |
| 490 resource)); | |
| 491 } | 485 } |
| 492 } | 486 } |
| 493 } | 487 } |
| 494 | 488 |
| 495 void SafeBrowsingService::OnNewMacKeys(const std::string& client_key, | 489 void SafeBrowsingService::OnNewMacKeys(const std::string& client_key, |
| 496 const std::string& wrapped_key) { | 490 const std::string& wrapped_key) { |
| 497 PrefService* prefs = g_browser_process->local_state(); | 491 PrefService* prefs = g_browser_process->local_state(); |
| 498 if (prefs) { | 492 if (prefs) { |
| 499 prefs->SetString(prefs::kSafeBrowsingClientKey, client_key); | 493 prefs->SetString(prefs::kSafeBrowsingClientKey, client_key); |
| 500 prefs->SetString(prefs::kSafeBrowsingWrappedKey, wrapped_key); | 494 prefs->SetString(prefs::kSafeBrowsingWrappedKey, wrapped_key); |
| 501 } | 495 } |
| 502 } | 496 } |
| 503 | 497 |
| 504 // static | 498 // static |
| 505 void SafeBrowsingService::RegisterPrefs(PrefService* prefs) { | 499 void SafeBrowsingService::RegisterPrefs(PrefService* prefs) { |
| 506 prefs->RegisterStringPref(prefs::kSafeBrowsingClientKey, ""); | 500 prefs->RegisterStringPref(prefs::kSafeBrowsingClientKey, ""); |
| 507 prefs->RegisterStringPref(prefs::kSafeBrowsingWrappedKey, ""); | 501 prefs->RegisterStringPref(prefs::kSafeBrowsingWrappedKey, ""); |
| 508 } | 502 } |
| 509 | 503 |
| 510 void SafeBrowsingService::ResetDatabase() { | 504 void SafeBrowsingService::ResetDatabase() { |
| 511 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 505 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 512 DCHECK(enabled_); | 506 DCHECK(enabled_); |
| 513 safe_browsing_thread_->message_loop()->PostTask(FROM_HERE, NewRunnableMethod( | 507 safe_browsing_thread_->message_loop()->PostTask(FROM_HERE, base::Bind( |
| 514 this, &SafeBrowsingService::OnResetDatabase)); | 508 &SafeBrowsingService::OnResetDatabase, this)); |
| 515 } | 509 } |
| 516 | 510 |
| 517 void SafeBrowsingService::LogPauseDelay(base::TimeDelta time) { | 511 void SafeBrowsingService::LogPauseDelay(base::TimeDelta time) { |
| 518 UMA_HISTOGRAM_LONG_TIMES("SB2.Delay", time); | 512 UMA_HISTOGRAM_LONG_TIMES("SB2.Delay", time); |
| 519 } | 513 } |
| 520 | 514 |
| 521 void SafeBrowsingService::OnIOInitialize( | 515 void SafeBrowsingService::OnIOInitialize( |
| 522 const std::string& client_key, | 516 const std::string& client_key, |
| 523 const std::string& wrapped_key, | 517 const std::string& wrapped_key, |
| 524 net::URLRequestContextGetter* request_context_getter) { | 518 net::URLRequestContextGetter* request_context_getter) { |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 625 // Delete pending checks, calling back any clients with 'SAFE'. We have | 619 // Delete pending checks, calling back any clients with 'SAFE'. We have |
| 626 // to do this after the db thread returns because methods on it can have | 620 // to do this after the db thread returns because methods on it can have |
| 627 // copies of these pointers, so deleting them might lead to accessing garbage. | 621 // copies of these pointers, so deleting them might lead to accessing garbage. |
| 628 for (CurrentChecks::iterator it = checks_.begin(); | 622 for (CurrentChecks::iterator it = checks_.begin(); |
| 629 it != checks_.end(); ++it) { | 623 it != checks_.end(); ++it) { |
| 630 SafeBrowsingCheck* check = *it; | 624 SafeBrowsingCheck* check = *it; |
| 631 if (check->client) { | 625 if (check->client) { |
| 632 check->result = SAFE; | 626 check->result = SAFE; |
| 633 check->client->OnSafeBrowsingResult(*check); | 627 check->client->OnSafeBrowsingResult(*check); |
| 634 } | 628 } |
| 635 if (check->timeout_task) | |
| 636 check->timeout_task->Cancel(); | |
| 637 } | 629 } |
| 638 STLDeleteElements(&checks_); | 630 STLDeleteElements(&checks_); |
| 639 | 631 |
| 640 gethash_requests_.clear(); | 632 gethash_requests_.clear(); |
| 641 } | 633 } |
| 642 | 634 |
| 643 bool SafeBrowsingService::DatabaseAvailable() const { | 635 bool SafeBrowsingService::DatabaseAvailable() const { |
| 644 base::AutoLock lock(database_lock_); | 636 base::AutoLock lock(database_lock_); |
| 645 return !closing_database_ && (database_ != NULL); | 637 return !closing_database_ && (database_ != NULL); |
| 646 } | 638 } |
| 647 | 639 |
| 648 bool SafeBrowsingService::MakeDatabaseAvailable() { | 640 bool SafeBrowsingService::MakeDatabaseAvailable() { |
| 649 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 641 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 650 DCHECK(enabled_); | 642 DCHECK(enabled_); |
| 651 if (DatabaseAvailable()) | 643 if (DatabaseAvailable()) |
| 652 return true; | 644 return true; |
| 653 safe_browsing_thread_->message_loop()->PostTask(FROM_HERE, | 645 safe_browsing_thread_->message_loop()->PostTask(FROM_HERE, |
| 654 NewRunnableMethod(this, &SafeBrowsingService::GetDatabase)); | 646 base::IgnoreReturn<SafeBrowsingDatabase*>( |
| 647 base::Bind(&SafeBrowsingService::GetDatabase, this))); |
| 655 return false; | 648 return false; |
| 656 } | 649 } |
| 657 | 650 |
| 658 void SafeBrowsingService::CloseDatabase() { | 651 void SafeBrowsingService::CloseDatabase() { |
| 659 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 652 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 660 | 653 |
| 661 // Cases to avoid: | 654 // Cases to avoid: |
| 662 // * If |closing_database_| is true, continuing will queue up a second | 655 // * If |closing_database_| is true, continuing will queue up a second |
| 663 // request, |closing_database_| will be reset after handling the first | 656 // request, |closing_database_| will be reset after handling the first |
| 664 // request, and if any functions on the db thread recreate the database, we | 657 // request, and if any functions on the db thread recreate the database, we |
| (...skipping 10 matching lines...) Expand all Loading... |
| 675 // would lead to an infinite loop in DatabaseLoadComplete(), and even if it | 668 // would lead to an infinite loop in DatabaseLoadComplete(), and even if it |
| 676 // didn't, it would be pointless since we'd just want to recreate. | 669 // didn't, it would be pointless since we'd just want to recreate. |
| 677 // | 670 // |
| 678 // The first two cases above are handled by checking DatabaseAvailable(). | 671 // The first two cases above are handled by checking DatabaseAvailable(). |
| 679 if (!DatabaseAvailable() || !queued_checks_.empty()) | 672 if (!DatabaseAvailable() || !queued_checks_.empty()) |
| 680 return; | 673 return; |
| 681 | 674 |
| 682 closing_database_ = true; | 675 closing_database_ = true; |
| 683 if (safe_browsing_thread_.get()) { | 676 if (safe_browsing_thread_.get()) { |
| 684 safe_browsing_thread_->message_loop()->PostTask(FROM_HERE, | 677 safe_browsing_thread_->message_loop()->PostTask(FROM_HERE, |
| 685 NewRunnableMethod(this, &SafeBrowsingService::OnCloseDatabase)); | 678 base::Bind(&SafeBrowsingService::OnCloseDatabase, this)); |
| 686 } | 679 } |
| 687 } | 680 } |
| 688 | 681 |
| 689 SafeBrowsingDatabase* SafeBrowsingService::GetDatabase() { | 682 SafeBrowsingDatabase* SafeBrowsingService::GetDatabase() { |
| 690 DCHECK_EQ(MessageLoop::current(), safe_browsing_thread_->message_loop()); | 683 DCHECK_EQ(MessageLoop::current(), safe_browsing_thread_->message_loop()); |
| 691 if (database_) | 684 if (database_) |
| 692 return database_; | 685 return database_; |
| 693 | 686 |
| 694 FilePath path; | 687 FilePath path; |
| 695 bool result = PathService::Get(chrome::DIR_USER_DATA, &path); | 688 bool result = PathService::Get(chrome::DIR_USER_DATA, &path); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 706 database->Init(path); | 699 database->Init(path); |
| 707 { | 700 { |
| 708 // Acquiring the lock here guarantees correct ordering between the writes to | 701 // Acquiring the lock here guarantees correct ordering between the writes to |
| 709 // the new database object above, and the setting of |databse_| below. | 702 // the new database object above, and the setting of |databse_| below. |
| 710 base::AutoLock lock(database_lock_); | 703 base::AutoLock lock(database_lock_); |
| 711 database_ = database; | 704 database_ = database; |
| 712 } | 705 } |
| 713 | 706 |
| 714 BrowserThread::PostTask( | 707 BrowserThread::PostTask( |
| 715 BrowserThread::IO, FROM_HERE, | 708 BrowserThread::IO, FROM_HERE, |
| 716 NewRunnableMethod(this, &SafeBrowsingService::DatabaseLoadComplete)); | 709 base::Bind(&SafeBrowsingService::DatabaseLoadComplete, this)); |
| 717 | 710 |
| 718 UMA_HISTOGRAM_TIMES("SB2.DatabaseOpen", base::TimeTicks::Now() - before); | 711 UMA_HISTOGRAM_TIMES("SB2.DatabaseOpen", base::TimeTicks::Now() - before); |
| 719 return database_; | 712 return database_; |
| 720 } | 713 } |
| 721 | 714 |
| 722 void SafeBrowsingService::OnCheckDone(SafeBrowsingCheck* check) { | 715 void SafeBrowsingService::OnCheckDone(SafeBrowsingCheck* check) { |
| 723 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 716 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 724 | 717 |
| 725 if (!enabled_) | 718 if (!enabled_) |
| 726 return; | 719 return; |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 772 database_update_in_progress_ = true; | 765 database_update_in_progress_ = true; |
| 773 GetDatabase(); // This guarantees that |database_| is non-NULL. | 766 GetDatabase(); // This guarantees that |database_| is non-NULL. |
| 774 if (database_->UpdateStarted(&lists)) { | 767 if (database_->UpdateStarted(&lists)) { |
| 775 database_error = false; | 768 database_error = false; |
| 776 } else { | 769 } else { |
| 777 database_->UpdateFinished(false); | 770 database_->UpdateFinished(false); |
| 778 } | 771 } |
| 779 | 772 |
| 780 BrowserThread::PostTask( | 773 BrowserThread::PostTask( |
| 781 BrowserThread::IO, FROM_HERE, | 774 BrowserThread::IO, FROM_HERE, |
| 782 NewRunnableMethod( | 775 base::Bind(&SafeBrowsingService::OnGetAllChunksFromDatabase, |
| 783 this, &SafeBrowsingService::OnGetAllChunksFromDatabase, lists, | 776 this, lists, database_error)); |
| 784 database_error)); | |
| 785 } | 777 } |
| 786 | 778 |
| 787 void SafeBrowsingService::OnGetAllChunksFromDatabase( | 779 void SafeBrowsingService::OnGetAllChunksFromDatabase( |
| 788 const std::vector<SBListChunkRanges>& lists, bool database_error) { | 780 const std::vector<SBListChunkRanges>& lists, bool database_error) { |
| 789 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 781 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 790 if (enabled_) | 782 if (enabled_) |
| 791 protocol_manager_->OnGetChunksComplete(lists, database_error); | 783 protocol_manager_->OnGetChunksComplete(lists, database_error); |
| 792 } | 784 } |
| 793 | 785 |
| 794 void SafeBrowsingService::OnChunkInserted() { | 786 void SafeBrowsingService::OnChunkInserted() { |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 829 | 821 |
| 830 void SafeBrowsingService::HandleChunkForDatabase( | 822 void SafeBrowsingService::HandleChunkForDatabase( |
| 831 const std::string& list_name, SBChunkList* chunks) { | 823 const std::string& list_name, SBChunkList* chunks) { |
| 832 DCHECK_EQ(MessageLoop::current(), safe_browsing_thread_->message_loop()); | 824 DCHECK_EQ(MessageLoop::current(), safe_browsing_thread_->message_loop()); |
| 833 if (chunks) { | 825 if (chunks) { |
| 834 GetDatabase()->InsertChunks(list_name, *chunks); | 826 GetDatabase()->InsertChunks(list_name, *chunks); |
| 835 delete chunks; | 827 delete chunks; |
| 836 } | 828 } |
| 837 BrowserThread::PostTask( | 829 BrowserThread::PostTask( |
| 838 BrowserThread::IO, FROM_HERE, | 830 BrowserThread::IO, FROM_HERE, |
| 839 NewRunnableMethod(this, &SafeBrowsingService::OnChunkInserted)); | 831 base::Bind(&SafeBrowsingService::OnChunkInserted, this)); |
| 840 } | 832 } |
| 841 | 833 |
| 842 void SafeBrowsingService::DeleteChunks( | 834 void SafeBrowsingService::DeleteChunks( |
| 843 std::vector<SBChunkDelete>* chunk_deletes) { | 835 std::vector<SBChunkDelete>* chunk_deletes) { |
| 844 DCHECK_EQ(MessageLoop::current(), safe_browsing_thread_->message_loop()); | 836 DCHECK_EQ(MessageLoop::current(), safe_browsing_thread_->message_loop()); |
| 845 if (chunk_deletes) { | 837 if (chunk_deletes) { |
| 846 GetDatabase()->DeleteChunks(*chunk_deletes); | 838 GetDatabase()->DeleteChunks(*chunk_deletes); |
| 847 delete chunk_deletes; | 839 delete chunk_deletes; |
| 848 } | 840 } |
| 849 } | 841 } |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 916 #endif | 908 #endif |
| 917 | 909 |
| 918 // TODO(noelutz): remove this boolean variable since it should always be true | 910 // TODO(noelutz): remove this boolean variable since it should always be true |
| 919 // if SafeBrowsing is enabled. Unfortunately, we have no test data for this | 911 // if SafeBrowsing is enabled. Unfortunately, we have no test data for this |
| 920 // list right now. This means that we need to be able to disable this list | 912 // list right now. This means that we need to be able to disable this list |
| 921 // for the SafeBrowsing test to pass. | 913 // for the SafeBrowsing test to pass. |
| 922 enable_download_whitelist_ = enable_csd_whitelist_; | 914 enable_download_whitelist_ = enable_csd_whitelist_; |
| 923 | 915 |
| 924 BrowserThread::PostTask( | 916 BrowserThread::PostTask( |
| 925 BrowserThread::IO, FROM_HERE, | 917 BrowserThread::IO, FROM_HERE, |
| 926 NewRunnableMethod( | 918 base::Bind(&SafeBrowsingService::OnIOInitialize, |
| 927 this, &SafeBrowsingService::OnIOInitialize, client_key, wrapped_key, | 919 this, client_key, wrapped_key, request_context_getter)); |
| 928 request_context_getter)); | |
| 929 } | 920 } |
| 930 | 921 |
| 931 void SafeBrowsingService::Stop() { | 922 void SafeBrowsingService::Stop() { |
| 932 BrowserThread::PostTask( | 923 BrowserThread::PostTask( |
| 933 BrowserThread::IO, FROM_HERE, | 924 BrowserThread::IO, FROM_HERE, |
| 934 NewRunnableMethod(this, &SafeBrowsingService::OnIOShutdown)); | 925 base::Bind(&SafeBrowsingService::OnIOShutdown, this)); |
| 935 } | 926 } |
| 936 | 927 |
| 937 void SafeBrowsingService::OnCloseDatabase() { | 928 void SafeBrowsingService::OnCloseDatabase() { |
| 938 DCHECK_EQ(MessageLoop::current(), safe_browsing_thread_->message_loop()); | 929 DCHECK_EQ(MessageLoop::current(), safe_browsing_thread_->message_loop()); |
| 939 DCHECK(closing_database_); | 930 DCHECK(closing_database_); |
| 940 | 931 |
| 941 // Because |closing_database_| is true, nothing on the IO thread will be | 932 // Because |closing_database_| is true, nothing on the IO thread will be |
| 942 // accessing the database, so it's safe to delete and then NULL the pointer. | 933 // accessing the database, so it's safe to delete and then NULL the pointer. |
| 943 delete database_; | 934 delete database_; |
| 944 database_ = NULL; | 935 database_ = NULL; |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1018 } | 1009 } |
| 1019 | 1010 |
| 1020 void SafeBrowsingService::DoDisplayBlockingPage( | 1011 void SafeBrowsingService::DoDisplayBlockingPage( |
| 1021 const UnsafeResource& resource) { | 1012 const UnsafeResource& resource) { |
| 1022 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 1013 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 1023 // Check if the user has already ignored our warning for this render_view | 1014 // Check if the user has already ignored our warning for this render_view |
| 1024 // and domain. | 1015 // and domain. |
| 1025 if (IsWhitelisted(resource)) { | 1016 if (IsWhitelisted(resource)) { |
| 1026 BrowserThread::PostTask( | 1017 BrowserThread::PostTask( |
| 1027 BrowserThread::IO, FROM_HERE, | 1018 BrowserThread::IO, FROM_HERE, |
| 1028 NewRunnableMethod(this, | 1019 base::Bind(&SafeBrowsingService::NotifyClientBlockingComplete, |
| 1029 &SafeBrowsingService::NotifyClientBlockingComplete, | 1020 this, resource.client, true)); |
| 1030 resource.client, true)); | |
| 1031 return; | 1021 return; |
| 1032 } | 1022 } |
| 1033 | 1023 |
| 1034 // The tab might have been closed. | 1024 // The tab might have been closed. |
| 1035 TabContents* tab_contents = | 1025 TabContents* tab_contents = |
| 1036 tab_util::GetTabContentsByID(resource.render_process_host_id, | 1026 tab_util::GetTabContentsByID(resource.render_process_host_id, |
| 1037 resource.render_view_id); | 1027 resource.render_view_id); |
| 1038 | 1028 |
| 1039 if (!tab_contents) { | 1029 if (!tab_contents) { |
| 1040 // The tab is gone and we did not have a chance at showing the interstitial. | 1030 // The tab is gone and we did not have a chance at showing the interstitial. |
| 1041 // Just act as if "Don't Proceed" were chosen. | 1031 // Just act as if "Don't Proceed" were chosen. |
| 1042 std::vector<UnsafeResource> resources; | 1032 std::vector<UnsafeResource> resources; |
| 1043 resources.push_back(resource); | 1033 resources.push_back(resource); |
| 1044 BrowserThread::PostTask( | 1034 BrowserThread::PostTask( |
| 1045 BrowserThread::IO, FROM_HERE, | 1035 BrowserThread::IO, FROM_HERE, |
| 1046 NewRunnableMethod( | 1036 base::Bind(&SafeBrowsingService::OnBlockingPageDone, |
| 1047 this, &SafeBrowsingService::OnBlockingPageDone, resources, false)); | 1037 this, resources, false)); |
| 1048 return; | 1038 return; |
| 1049 } | 1039 } |
| 1050 | 1040 |
| 1051 if (resource.threat_type != SafeBrowsingService::SAFE && | 1041 if (resource.threat_type != SafeBrowsingService::SAFE && |
| 1052 CanReportStats()) { | 1042 CanReportStats()) { |
| 1053 GURL page_url = tab_contents->GetURL(); | 1043 GURL page_url = tab_contents->GetURL(); |
| 1054 GURL referrer_url; | 1044 GURL referrer_url; |
| 1055 NavigationEntry* entry = tab_contents->controller().GetActiveEntry(); | 1045 NavigationEntry* entry = tab_contents->controller().GetActiveEntry(); |
| 1056 if (entry) | 1046 if (entry) |
| 1057 referrer_url = entry->referrer(); | 1047 referrer_url = entry->referrer(); |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1147 void SafeBrowsingService::CheckDownloadHashOnSBThread( | 1137 void SafeBrowsingService::CheckDownloadHashOnSBThread( |
| 1148 SafeBrowsingCheck* check) { | 1138 SafeBrowsingCheck* check) { |
| 1149 DCHECK_EQ(MessageLoop::current(), safe_browsing_thread_->message_loop()); | 1139 DCHECK_EQ(MessageLoop::current(), safe_browsing_thread_->message_loop()); |
| 1150 DCHECK(enable_download_protection_); | 1140 DCHECK(enable_download_protection_); |
| 1151 | 1141 |
| 1152 if (!database_->ContainsDownloadHashPrefix(check->full_hash->prefix)) { | 1142 if (!database_->ContainsDownloadHashPrefix(check->full_hash->prefix)) { |
| 1153 // Good, we don't have hash for this url prefix. | 1143 // Good, we don't have hash for this url prefix. |
| 1154 check->result = SAFE; | 1144 check->result = SAFE; |
| 1155 BrowserThread::PostTask( | 1145 BrowserThread::PostTask( |
| 1156 BrowserThread::IO, FROM_HERE, | 1146 BrowserThread::IO, FROM_HERE, |
| 1157 NewRunnableMethod(this, | 1147 base::Bind(&SafeBrowsingService::CheckDownloadHashDone, this, check)); |
| 1158 &SafeBrowsingService::CheckDownloadHashDone, | |
| 1159 check)); | |
| 1160 return; | 1148 return; |
| 1161 } | 1149 } |
| 1162 | 1150 |
| 1163 check->need_get_hash = true; | 1151 check->need_get_hash = true; |
| 1164 check->prefix_hits.push_back(check->full_hash->prefix); | 1152 check->prefix_hits.push_back(check->full_hash->prefix); |
| 1165 BrowserThread::PostTask( | 1153 BrowserThread::PostTask( |
| 1166 BrowserThread::IO, FROM_HERE, | 1154 BrowserThread::IO, FROM_HERE, |
| 1167 NewRunnableMethod(this, &SafeBrowsingService::OnCheckDone, check)); | 1155 base::Bind(&SafeBrowsingService::OnCheckDone, this, check)); |
| 1168 } | 1156 } |
| 1169 | 1157 |
| 1170 void SafeBrowsingService::CheckDownloadUrlOnSBThread(SafeBrowsingCheck* check) { | 1158 void SafeBrowsingService::CheckDownloadUrlOnSBThread(SafeBrowsingCheck* check) { |
| 1171 DCHECK_EQ(MessageLoop::current(), safe_browsing_thread_->message_loop()); | 1159 DCHECK_EQ(MessageLoop::current(), safe_browsing_thread_->message_loop()); |
| 1172 DCHECK(enable_download_protection_); | 1160 DCHECK(enable_download_protection_); |
| 1173 | 1161 |
| 1174 std::vector<SBPrefix> prefix_hits; | 1162 std::vector<SBPrefix> prefix_hits; |
| 1175 | 1163 |
| 1176 if (!database_->ContainsDownloadUrl(check->urls, &prefix_hits)) { | 1164 if (!database_->ContainsDownloadUrl(check->urls, &prefix_hits)) { |
| 1177 // Good, we don't have hash for this url prefix. | 1165 // Good, we don't have hash for this url prefix. |
| 1178 check->result = SAFE; | 1166 check->result = SAFE; |
| 1179 BrowserThread::PostTask( | 1167 BrowserThread::PostTask( |
| 1180 BrowserThread::IO, FROM_HERE, | 1168 BrowserThread::IO, FROM_HERE, |
| 1181 NewRunnableMethod(this, | 1169 base::Bind(&SafeBrowsingService::CheckDownloadUrlDone, this, check)); |
| 1182 &SafeBrowsingService::CheckDownloadUrlDone, | |
| 1183 check)); | |
| 1184 return; | 1170 return; |
| 1185 } | 1171 } |
| 1186 | 1172 |
| 1187 check->need_get_hash = true; | 1173 check->need_get_hash = true; |
| 1188 check->prefix_hits.clear(); | 1174 check->prefix_hits.clear(); |
| 1189 check->prefix_hits = prefix_hits; | 1175 check->prefix_hits = prefix_hits; |
| 1190 BrowserThread::PostTask( | 1176 BrowserThread::PostTask( |
| 1191 BrowserThread::IO, FROM_HERE, | 1177 BrowserThread::IO, FROM_HERE, |
| 1192 NewRunnableMethod(this, &SafeBrowsingService::OnCheckDone, check)); | 1178 base::Bind(&SafeBrowsingService::OnCheckDone, this, check)); |
| 1193 } | 1179 } |
| 1194 | 1180 |
| 1195 void SafeBrowsingService::TimeoutCallback(SafeBrowsingCheck* check) { | 1181 void SafeBrowsingService::TimeoutCallback(SafeBrowsingCheck* check) { |
| 1196 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 1182 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 1197 DCHECK(check); | 1183 DCHECK(check); |
| 1198 | 1184 |
| 1199 if (!enabled_) | 1185 if (!enabled_) |
| 1200 return; | 1186 return; |
| 1201 | 1187 |
| 1202 DCHECK(checks_.find(check) != checks_.end()); | 1188 DCHECK(checks_.find(check) != checks_.end()); |
| 1203 DCHECK_EQ(check->result, SAFE); | 1189 DCHECK_EQ(check->result, SAFE); |
| 1204 if (check->client) { | 1190 if (check->client) { |
| 1205 check->client->OnSafeBrowsingResult(*check); | 1191 check->client->OnSafeBrowsingResult(*check); |
| 1206 check->client = NULL; | 1192 check->client = NULL; |
| 1207 } | 1193 } |
| 1208 check->timeout_task = NULL; | |
| 1209 } | 1194 } |
| 1210 | 1195 |
| 1211 void SafeBrowsingService::CheckDownloadUrlDone(SafeBrowsingCheck* check) { | 1196 void SafeBrowsingService::CheckDownloadUrlDone(SafeBrowsingCheck* check) { |
| 1212 DCHECK(enable_download_protection_); | 1197 DCHECK(enable_download_protection_); |
| 1213 SafeBrowsingCheckDone(check); | 1198 SafeBrowsingCheckDone(check); |
| 1214 } | 1199 } |
| 1215 | 1200 |
| 1216 void SafeBrowsingService::CheckDownloadHashDone(SafeBrowsingCheck* check) { | 1201 void SafeBrowsingService::CheckDownloadHashDone(SafeBrowsingCheck* check) { |
| 1217 DCHECK(enable_download_protection_); | 1202 DCHECK(enable_download_protection_); |
| 1218 SafeBrowsingCheckDone(check); | 1203 SafeBrowsingCheckDone(check); |
| 1219 } | 1204 } |
| 1220 | 1205 |
| 1221 void SafeBrowsingService::SafeBrowsingCheckDone(SafeBrowsingCheck* check) { | 1206 void SafeBrowsingService::SafeBrowsingCheckDone(SafeBrowsingCheck* check) { |
| 1222 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 1207 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 1223 DCHECK(check); | 1208 DCHECK(check); |
| 1224 | 1209 |
| 1225 if (!enabled_) | 1210 if (!enabled_) |
| 1226 return; | 1211 return; |
| 1227 | 1212 |
| 1228 VLOG(1) << "SafeBrowsingCheckDone: " << check->result; | 1213 VLOG(1) << "SafeBrowsingCheckDone: " << check->result; |
| 1229 DCHECK(checks_.find(check) != checks_.end()); | 1214 DCHECK(checks_.find(check) != checks_.end()); |
| 1230 if (check->client) | 1215 if (check->client) |
| 1231 check->client->OnSafeBrowsingResult(*check); | 1216 check->client->OnSafeBrowsingResult(*check); |
| 1232 if (check->timeout_task) | |
| 1233 check->timeout_task->Cancel(); | |
| 1234 checks_.erase(check); | 1217 checks_.erase(check); |
| 1235 delete check; | 1218 delete check; |
| 1236 } | 1219 } |
| 1237 | 1220 |
| 1238 void SafeBrowsingService::StartDownloadCheck(SafeBrowsingCheck* check, | 1221 void SafeBrowsingService::StartDownloadCheck(SafeBrowsingCheck* check, |
| 1239 Client* client, | 1222 Client* client, |
| 1240 CancelableTask* task, | 1223 const base::Closure& task, |
| 1241 int64 timeout_ms) { | 1224 int64 timeout_ms) { |
| 1242 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 1225 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 1243 check->client = client; | 1226 check->client = client; |
| 1244 check->result = SAFE; | 1227 check->result = SAFE; |
| 1245 check->is_download = true; | 1228 check->is_download = true; |
| 1246 check->timeout_task = | 1229 check->timeout_factory_.reset( |
| 1247 NewRunnableMethod(this, &SafeBrowsingService::TimeoutCallback, check); | 1230 new base::WeakPtrFactory<SafeBrowsingService>(this)); |
| 1248 checks_.insert(check); | 1231 checks_.insert(check); |
| 1249 | 1232 |
| 1250 safe_browsing_thread_->message_loop()->PostTask(FROM_HERE, task); | 1233 safe_browsing_thread_->message_loop()->PostTask(FROM_HERE, task); |
| 1251 | 1234 |
| 1252 MessageLoop::current()->PostDelayedTask( | 1235 MessageLoop::current()->PostDelayedTask(FROM_HERE, |
| 1253 FROM_HERE, check->timeout_task, timeout_ms); | 1236 base::Bind(&SafeBrowsingService::TimeoutCallback, |
| 1237 check->timeout_factory_->GetWeakPtr(), check), |
| 1238 timeout_ms); |
| 1254 } | 1239 } |
| 1255 | 1240 |
| 1256 void SafeBrowsingService::UpdateWhitelist(const UnsafeResource& resource) { | 1241 void SafeBrowsingService::UpdateWhitelist(const UnsafeResource& resource) { |
| 1257 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 1242 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 1258 // Whitelist this domain and warning type for the given tab. | 1243 // Whitelist this domain and warning type for the given tab. |
| 1259 WhiteListedEntry entry; | 1244 WhiteListedEntry entry; |
| 1260 entry.render_process_host_id = resource.render_process_host_id; | 1245 entry.render_process_host_id = resource.render_process_host_id; |
| 1261 entry.render_view_id = resource.render_view_id; | 1246 entry.render_view_id = resource.render_view_id; |
| 1262 entry.domain = net::RegistryControlledDomainService::GetDomainAndRegistry( | 1247 entry.domain = net::RegistryControlledDomainService::GetDomainAndRegistry( |
| 1263 resource.url); | 1248 resource.url); |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1361 Stop(); | 1346 Stop(); |
| 1362 | 1347 |
| 1363 if (csd_service_.get()) | 1348 if (csd_service_.get()) |
| 1364 csd_service_->SetEnabledAndRefreshState(enable); | 1349 csd_service_->SetEnabledAndRefreshState(enable); |
| 1365 if (download_service_.get()) { | 1350 if (download_service_.get()) { |
| 1366 download_service_->SetEnabled( | 1351 download_service_->SetEnabled( |
| 1367 enable && CommandLine::ForCurrentProcess()->HasSwitch( | 1352 enable && CommandLine::ForCurrentProcess()->HasSwitch( |
| 1368 switches::kEnableImprovedDownloadProtection)); | 1353 switches::kEnableImprovedDownloadProtection)); |
| 1369 } | 1354 } |
| 1370 } | 1355 } |
| OLD | NEW |