| 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/extensions/extension_updater.h" | 5 #include "chrome/browser/extensions/extension_updater.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <set> | 8 #include <set> |
| 9 | 9 |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| 11 #include "base/file_util.h" | 11 #include "base/file_util.h" |
| 12 #include "base/metrics/histogram.h" | 12 #include "base/metrics/histogram.h" |
| 13 #include "base/rand_util.h" | 13 #include "base/rand_util.h" |
| 14 #include "base/sha2.h" | 14 #include "base/sha2.h" |
| 15 #include "base/stl_util-inl.h" | 15 #include "base/stl_util-inl.h" |
| 16 #include "base/string_number_conversions.h" | 16 #include "base/string_number_conversions.h" |
| 17 #include "base/string_split.h" | 17 #include "base/string_split.h" |
| 18 #include "base/string_util.h" | 18 #include "base/string_util.h" |
| 19 #include "base/time.h" | 19 #include "base/time.h" |
| 20 #include "base/thread.h" | 20 #include "base/thread.h" |
| 21 #include "base/version.h" | 21 #include "base/version.h" |
| 22 #include "chrome/browser/browser_process.h" | 22 #include "chrome/browser/browser_process.h" |
| 23 #include "chrome/browser/extensions/extension_error_reporter.h" | 23 #include "chrome/browser/extensions/extension_error_reporter.h" |
| 24 #include "chrome/browser/extensions/extensions_service.h" | 24 #include "chrome/browser/extensions/extension_service.h" |
| 25 #include "chrome/browser/prefs/pref_service.h" | 25 #include "chrome/browser/prefs/pref_service.h" |
| 26 #include "chrome/browser/profiles/profile.h" | 26 #include "chrome/browser/profiles/profile.h" |
| 27 #include "chrome/browser/utility_process_host.h" | 27 #include "chrome/browser/utility_process_host.h" |
| 28 #include "chrome/common/chrome_switches.h" | 28 #include "chrome/common/chrome_switches.h" |
| 29 #include "chrome/common/chrome_version_info.h" | 29 #include "chrome/common/chrome_version_info.h" |
| 30 #include "chrome/common/extensions/extension.h" | 30 #include "chrome/common/extensions/extension.h" |
| 31 #include "chrome/common/extensions/extension_constants.h" | 31 #include "chrome/common/extensions/extension_constants.h" |
| 32 #include "chrome/common/pref_names.h" | 32 #include "chrome/common/pref_names.h" |
| 33 #include "googleurl/src/gurl.h" | 33 #include "googleurl/src/gurl.h" |
| 34 #include "net/base/escape.h" | 34 #include "net/base/escape.h" |
| (...skipping 595 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 630 void ExtensionUpdater::OnCRXFetchComplete(const GURL& url, | 630 void ExtensionUpdater::OnCRXFetchComplete(const GURL& url, |
| 631 const URLRequestStatus& status, | 631 const URLRequestStatus& status, |
| 632 int response_code, | 632 int response_code, |
| 633 const std::string& data) { | 633 const std::string& data) { |
| 634 if (status.status() == URLRequestStatus::SUCCESS && | 634 if (status.status() == URLRequestStatus::SUCCESS && |
| 635 response_code == 200) { | 635 response_code == 200) { |
| 636 if (current_extension_fetch_.id == kBlacklistAppID) { | 636 if (current_extension_fetch_.id == kBlacklistAppID) { |
| 637 ProcessBlacklist(data); | 637 ProcessBlacklist(data); |
| 638 } else { | 638 } else { |
| 639 // Successfully fetched - now write crx to a file so we can have the | 639 // Successfully fetched - now write crx to a file so we can have the |
| 640 // ExtensionsService install it. | 640 // ExtensionService install it. |
| 641 BrowserThread::PostTask( | 641 BrowserThread::PostTask( |
| 642 BrowserThread::FILE, FROM_HERE, | 642 BrowserThread::FILE, FROM_HERE, |
| 643 NewRunnableMethod( | 643 NewRunnableMethod( |
| 644 file_handler_.get(), &ExtensionUpdaterFileHandler::WriteTempFile, | 644 file_handler_.get(), &ExtensionUpdaterFileHandler::WriteTempFile, |
| 645 current_extension_fetch_.id, data, url, | 645 current_extension_fetch_.id, data, url, |
| 646 make_scoped_refptr(this))); | 646 make_scoped_refptr(this))); |
| 647 } | 647 } |
| 648 } else { | 648 } else { |
| 649 // TODO(asargent) do things like exponential backoff, handling | 649 // TODO(asargent) do things like exponential backoff, handling |
| 650 // 503 Service Unavailable / Retry-After headers, etc. here. | 650 // 503 Service Unavailable / Retry-After headers, etc. here. |
| (...skipping 11 matching lines...) Expand all Loading... |
| 662 FetchUpdatedExtension(next.id, next.url, next.package_hash, next.version); | 662 FetchUpdatedExtension(next.id, next.url, next.package_hash, next.version); |
| 663 } | 663 } |
| 664 } | 664 } |
| 665 | 665 |
| 666 void ExtensionUpdater::OnCRXFileWritten(const std::string& id, | 666 void ExtensionUpdater::OnCRXFileWritten(const std::string& id, |
| 667 const FilePath& path, | 667 const FilePath& path, |
| 668 const GURL& download_url) { | 668 const GURL& download_url) { |
| 669 // This can be called after we've been stopped. | 669 // This can be called after we've been stopped. |
| 670 if (!alive_) | 670 if (!alive_) |
| 671 return; | 671 return; |
| 672 // The ExtensionsService is now responsible for cleaning up the temp file | 672 // The ExtensionService is now responsible for cleaning up the temp file |
| 673 // at |path|. | 673 // at |path|. |
| 674 service_->UpdateExtension(id, path, download_url); | 674 service_->UpdateExtension(id, path, download_url); |
| 675 } | 675 } |
| 676 | 676 |
| 677 | 677 |
| 678 void ExtensionUpdater::ScheduleNextCheck(const TimeDelta& target_delay) { | 678 void ExtensionUpdater::ScheduleNextCheck(const TimeDelta& target_delay) { |
| 679 DCHECK(alive_); | 679 DCHECK(alive_); |
| 680 DCHECK(!timer_.IsRunning()); | 680 DCHECK(!timer_.IsRunning()); |
| 681 DCHECK(target_delay >= TimeDelta::FromSeconds(1)); | 681 DCHECK(target_delay >= TimeDelta::FromSeconds(1)); |
| 682 | 682 |
| (...skipping 11 matching lines...) Expand all Loading... |
| 694 | 694 |
| 695 timer_.Start(actual_delay, this, &ExtensionUpdater::TimerFired); | 695 timer_.Start(actual_delay, this, &ExtensionUpdater::TimerFired); |
| 696 } | 696 } |
| 697 | 697 |
| 698 void ExtensionUpdater::TimerFired() { | 698 void ExtensionUpdater::TimerFired() { |
| 699 DCHECK(alive_); | 699 DCHECK(alive_); |
| 700 CheckNow(); | 700 CheckNow(); |
| 701 | 701 |
| 702 // If the user has overridden the update frequency, don't bother reporting | 702 // If the user has overridden the update frequency, don't bother reporting |
| 703 // this. | 703 // this. |
| 704 if (frequency_seconds_ == ExtensionsService::kDefaultUpdateFrequencySeconds) { | 704 if (frequency_seconds_ == ExtensionService::kDefaultUpdateFrequencySeconds) { |
| 705 Time last = Time::FromInternalValue(prefs_->GetInt64( | 705 Time last = Time::FromInternalValue(prefs_->GetInt64( |
| 706 kLastExtensionsUpdateCheck)); | 706 kLastExtensionsUpdateCheck)); |
| 707 if (last.ToInternalValue() != 0) { | 707 if (last.ToInternalValue() != 0) { |
| 708 // Use counts rather than time so we can use minutes rather than millis. | 708 // Use counts rather than time so we can use minutes rather than millis. |
| 709 UMA_HISTOGRAM_CUSTOM_COUNTS("Extensions.UpdateCheckGap", | 709 UMA_HISTOGRAM_CUSTOM_COUNTS("Extensions.UpdateCheckGap", |
| 710 (Time::Now() - last).InMinutes(), | 710 (Time::Now() - last).InMinutes(), |
| 711 base::TimeDelta::FromSeconds(kStartupWaitSeconds).InMinutes(), | 711 base::TimeDelta::FromSeconds(kStartupWaitSeconds).InMinutes(), |
| 712 base::TimeDelta::FromDays(40).InMinutes(), | 712 base::TimeDelta::FromDays(40).InMinutes(), |
| 713 50); // 50 buckets seems to be the default. | 713 50); // 50 buckets seems to be the default. |
| 714 } | 714 } |
| (...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 905 URLFetcher::Create(kExtensionFetcherId, url, URLFetcher::GET, this)); | 905 URLFetcher::Create(kExtensionFetcherId, url, URLFetcher::GET, this)); |
| 906 extension_fetcher_->set_request_context( | 906 extension_fetcher_->set_request_context( |
| 907 Profile::GetDefaultRequestContext()); | 907 Profile::GetDefaultRequestContext()); |
| 908 extension_fetcher_->set_load_flags(net::LOAD_DO_NOT_SEND_COOKIES | | 908 extension_fetcher_->set_load_flags(net::LOAD_DO_NOT_SEND_COOKIES | |
| 909 net::LOAD_DO_NOT_SAVE_COOKIES | | 909 net::LOAD_DO_NOT_SAVE_COOKIES | |
| 910 net::LOAD_DISABLE_CACHE); | 910 net::LOAD_DISABLE_CACHE); |
| 911 extension_fetcher_->Start(); | 911 extension_fetcher_->Start(); |
| 912 current_extension_fetch_ = ExtensionFetch(id, url, hash, version); | 912 current_extension_fetch_ = ExtensionFetch(id, url, hash, version); |
| 913 } | 913 } |
| 914 } | 914 } |
| OLD | NEW |