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 #include "chrome/browser/component_updater/component_updater_service.h" | 5 #include "chrome/browser/component_updater/component_updater_service.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <set> | 8 #include <set> |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
97 | 97 |
98 Del* delegate_; | 98 Del* delegate_; |
99 Ctx* context_; | 99 Ctx* context_; |
100 }; | 100 }; |
101 // This function creates the right DelegateWithContext using template inference. | 101 // This function creates the right DelegateWithContext using template inference. |
102 template <typename Del, typename Ctx> | 102 template <typename Del, typename Ctx> |
103 net::URLFetcherDelegate* MakeContextDelegate(Del* delegate, Ctx* context) { | 103 net::URLFetcherDelegate* MakeContextDelegate(Del* delegate, Ctx* context) { |
104 return new DelegateWithContext<Del, Ctx>(delegate, context); | 104 return new DelegateWithContext<Del, Ctx>(delegate, context); |
105 } | 105 } |
106 | 106 |
107 // Returns true if a differential update is available for the update item. | |
108 bool IsDiffUpdateAvailable(const CrxUpdateItem* update_item) { | |
109 return update_item->diff_crx_url.is_valid(); | |
110 } | |
111 | |
112 // Returns true if a differential update is available, it has not failed yet, | 107 // Returns true if a differential update is available, it has not failed yet, |
113 // and the configuration allows it. | 108 // and the configuration allows it. |
114 bool CanTryDiffUpdate(const CrxUpdateItem* update_item, | 109 bool CanTryDiffUpdate(const CrxUpdateItem* update_item, |
115 const ComponentUpdateService::Configurator& config) { | 110 const ComponentUpdateService::Configurator& config) { |
116 return IsDiffUpdateAvailable(update_item) && | 111 return component_updater::HasDiffUpdate(update_item) && |
117 !update_item->diff_update_failed && | 112 !update_item->diff_update_failed && |
118 config.DeltasEnabled(); | 113 config.DeltasEnabled(); |
119 } | 114 } |
120 | 115 |
121 void AppendDownloadMetrics( | 116 void AppendDownloadMetrics( |
122 const std::vector<CrxDownloader::DownloadMetrics>& source, | 117 const std::vector<CrxDownloader::DownloadMetrics>& source, |
123 std::vector<CrxDownloader::DownloadMetrics>* destination) { | 118 std::vector<CrxDownloader::DownloadMetrics>* destination) { |
124 destination->insert(destination->end(), source.begin(), source.end()); | 119 destination->insert(destination->end(), source.begin(), source.end()); |
125 } | 120 } |
126 | 121 |
(...skipping 540 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
667 return *it; | 662 return *it; |
668 return NULL; | 663 return NULL; |
669 } | 664 } |
670 | 665 |
671 void CrxUpdateService::UpdateComponent(CrxUpdateItem* workitem) { | 666 void CrxUpdateService::UpdateComponent(CrxUpdateItem* workitem) { |
672 scoped_ptr<CRXContext> crx_context(new CRXContext); | 667 scoped_ptr<CRXContext> crx_context(new CRXContext); |
673 crx_context->pk_hash = workitem->component.pk_hash; | 668 crx_context->pk_hash = workitem->component.pk_hash; |
674 crx_context->id = workitem->id; | 669 crx_context->id = workitem->id; |
675 crx_context->installer = workitem->component.installer; | 670 crx_context->installer = workitem->component.installer; |
676 crx_context->fingerprint = workitem->next_fp; | 671 crx_context->fingerprint = workitem->next_fp; |
677 GURL package_url; | 672 const std::vector<GURL>* urls = NULL; |
678 if (CanTryDiffUpdate(workitem, *config_)) { | 673 if (CanTryDiffUpdate(workitem, *config_)) { |
679 package_url = workitem->diff_crx_url; | 674 urls = &workitem->crx_diffurls; |
680 ChangeItemState(workitem, CrxUpdateItem::kDownloadingDiff); | 675 ChangeItemState(workitem, CrxUpdateItem::kDownloadingDiff); |
681 } else { | 676 } else { |
682 package_url = workitem->crx_url; | 677 urls = &workitem->crx_urls; |
683 ChangeItemState(workitem, CrxUpdateItem::kDownloading); | 678 ChangeItemState(workitem, CrxUpdateItem::kDownloading); |
684 } | 679 } |
685 | 680 |
686 // On demand component updates are always downloaded in foreground. | 681 // On demand component updates are always downloaded in foreground. |
687 const bool is_background_download = !workitem->on_demand && | 682 const bool is_background_download = !workitem->on_demand && |
688 config_->UseBackgroundDownloader(); | 683 config_->UseBackgroundDownloader(); |
689 | 684 |
690 crx_downloader_.reset(CrxDownloader::Create( | 685 crx_downloader_.reset(CrxDownloader::Create( |
691 is_background_download, | 686 is_background_download, |
692 config_->RequestContext(), | 687 config_->RequestContext(), |
693 blocking_task_runner_, | 688 blocking_task_runner_, |
694 base::Bind(&CrxUpdateService::DownloadComplete, | 689 base::Bind(&CrxUpdateService::DownloadComplete, |
695 base::Unretained(this), | 690 base::Unretained(this), |
696 base::Passed(&crx_context)))); | 691 base::Passed(&crx_context)))); |
697 crx_downloader_->StartDownloadFromUrl(package_url); | 692 crx_downloader_->StartDownload(*urls); |
698 } | 693 } |
699 | 694 |
700 // Sets the state of the component to be checked for updates. After the | 695 // Sets the state of the component to be checked for updates. After the |
701 // function is called, the <app> element corresponding to the |item| parameter | 696 // function is called, the <app> element corresponding to the |item| parameter |
702 // is appended to the |update_check_items|. | 697 // is appended to the |update_check_items|. |
703 void CrxUpdateService::AddItemToUpdateCheck(CrxUpdateItem* item, | 698 void CrxUpdateService::AddItemToUpdateCheck(CrxUpdateItem* item, |
704 std::string* update_check_items) { | 699 std::string* update_check_items) { |
705 // The app element corresponding to an update items looks like this: | 700 // The app element corresponding to an update items looks like this: |
706 // <app appid="hnimpnehoodheedghdeeijklkeaacbdc" | 701 // <app appid="hnimpnehoodheedghdeeijklkeaacbdc" |
707 // version="0.1.2.3" installsource="ondemand"> | 702 // version="0.1.2.3" installsource="ondemand"> |
(...skipping 25 matching lines...) Expand all Loading... |
733 "<package fp=\"%s\"/>" | 728 "<package fp=\"%s\"/>" |
734 "</packages>" | 729 "</packages>" |
735 "</app>", | 730 "</app>", |
736 app_attributes.c_str(), | 731 app_attributes.c_str(), |
737 item->component.fingerprint.c_str()); | 732 item->component.fingerprint.c_str()); |
738 | 733 |
739 update_check_items->append(app); | 734 update_check_items->append(app); |
740 | 735 |
741 ChangeItemState(item, CrxUpdateItem::kChecking); | 736 ChangeItemState(item, CrxUpdateItem::kChecking); |
742 item->last_check = base::Time::Now(); | 737 item->last_check = base::Time::Now(); |
743 item->crx_url = GURL(); | 738 item->crx_urls.clear(); |
744 item->diff_crx_url = GURL(); | 739 item->crx_diffurls.clear(); |
745 item->previous_version = item->component.version; | 740 item->previous_version = item->component.version; |
746 item->next_version = Version(); | 741 item->next_version = Version(); |
747 item->previous_fp = item->component.fingerprint; | 742 item->previous_fp = item->component.fingerprint; |
748 item->next_fp.clear(); | 743 item->next_fp.clear(); |
749 item->diff_update_failed = false; | 744 item->diff_update_failed = false; |
750 item->error_category = 0; | 745 item->error_category = 0; |
751 item->error_code = 0; | 746 item->error_code = 0; |
752 item->extra_code1 = 0; | 747 item->extra_code1 = 0; |
753 item->diff_error_category = 0; | 748 item->diff_error_category = 0; |
754 item->diff_error_code = 0; | 749 item->diff_error_code = 0; |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
854 } | 849 } |
855 | 850 |
856 // Parse the members of the result and queue an upgrade for this component. | 851 // Parse the members of the result and queue an upgrade for this component. |
857 crx->next_version = Version(it->manifest.version); | 852 crx->next_version = Version(it->manifest.version); |
858 | 853 |
859 typedef component_updater:: | 854 typedef component_updater:: |
860 UpdateResponse::Result::Manifest::Package Package; | 855 UpdateResponse::Result::Manifest::Package Package; |
861 const Package& package(it->manifest.packages[0]); | 856 const Package& package(it->manifest.packages[0]); |
862 crx->next_fp = package.fingerprint; | 857 crx->next_fp = package.fingerprint; |
863 | 858 |
864 // Select the first url from the list of urls until support for | 859 // Resolve the urls by combining the base urls with the package names. |
865 // fall back urls is implemented. | 860 for (size_t i = 0; i != it->crx_urls.size(); ++i) { |
866 if (!it->crx_urls.empty()) | 861 const GURL url(it->crx_urls[i].Resolve(package.name)); |
867 crx->crx_url = it->crx_urls[0].Resolve(package.name); | 862 if (url.is_valid()) |
868 if (!it->crx_diffurls.empty()) | 863 crx->crx_urls.push_back(url); |
869 crx->diff_crx_url = it->crx_diffurls[0].Resolve(package.namediff); | 864 } |
| 865 for (size_t i = 0; i != it->crx_diffurls.size(); ++i) { |
| 866 const GURL url(it->crx_diffurls[i].Resolve(package.namediff)); |
| 867 if (url.is_valid()) |
| 868 crx->crx_diffurls.push_back(url); |
| 869 } |
870 | 870 |
871 ChangeItemState(crx, CrxUpdateItem::kCanUpdate); | 871 ChangeItemState(crx, CrxUpdateItem::kCanUpdate); |
872 ++num_updates_pending; | 872 ++num_updates_pending; |
873 } | 873 } |
874 | 874 |
875 // All components that are not included in the update response are | 875 // All components that are not included in the update response are |
876 // considered up to date. | 876 // considered up to date. |
877 ChangeItemStatus(CrxUpdateItem::kChecking, CrxUpdateItem::kUpToDate); | 877 ChangeItemStatus(CrxUpdateItem::kChecking, CrxUpdateItem::kUpToDate); |
878 | 878 |
879 // If there are updates pending we do a short wait, otherwise we take | 879 // If there are updates pending we do a short wait, otherwise we take |
(...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1105 } | 1105 } |
1106 | 1106 |
1107 // The component update factory. Using the component updater as a singleton | 1107 // The component update factory. Using the component updater as a singleton |
1108 // is the job of the browser process. | 1108 // is the job of the browser process. |
1109 ComponentUpdateService* ComponentUpdateServiceFactory( | 1109 ComponentUpdateService* ComponentUpdateServiceFactory( |
1110 ComponentUpdateService::Configurator* config) { | 1110 ComponentUpdateService::Configurator* config) { |
1111 DCHECK(config); | 1111 DCHECK(config); |
1112 return new CrxUpdateService(config); | 1112 return new CrxUpdateService(config); |
1113 } | 1113 } |
1114 | 1114 |
OLD | NEW |