Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(7)

Unified Diff: trunk/src/chrome/browser/component_updater/component_updater_service.cc

Issue 17551004: Revert 207805 "Differential updates for components. We are addin..." (Closed) Base URL: svn://svn.chromium.org/chrome/
Patch Set: Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: trunk/src/chrome/browser/component_updater/component_updater_service.cc
===================================================================
--- trunk/src/chrome/browser/component_updater/component_updater_service.cc (revision 207822)
+++ trunk/src/chrome/browser/component_updater/component_updater_service.cc (working copy)
@@ -10,7 +10,6 @@
#include "base/at_exit.h"
#include "base/bind.h"
-#include "base/compiler_specific.h"
#include "base/file_util.h"
#include "base/files/file_path.h"
#include "base/logging.h"
@@ -22,13 +21,11 @@
#include "base/strings/stringprintf.h"
#include "base/timer.h"
#include "chrome/browser/browser_process.h"
-#include "chrome/browser/component_updater/component_patcher.h"
#include "chrome/browser/component_updater/component_unpacker.h"
#include "chrome/common/chrome_notification_types.h"
#include "chrome/common/chrome_utility_messages.h"
#include "chrome/common/chrome_version_info.h"
#include "chrome/common/extensions/extension.h"
-#include "chrome/common/omaha_query_params/omaha_query_params.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/notification_service.h"
#include "content/public/browser/utility_process_host.h"
@@ -50,24 +47,21 @@
// base::Bind() calls are not refcounted.
namespace {
-
// Manifest sources, from most important to least important.
const CrxComponent::UrlSource kManifestSources[] = {
CrxComponent::BANDAID,
CrxComponent::CWS_PUBLIC,
- CrxComponent::CWS_SANDBOX,
+ CrxComponent::CWS_SANDBOX
};
// Extends an omaha compatible update check url |query| string. Does
// not mutate the string if it would be longer than |limit| chars.
bool AddQueryString(const std::string& id,
const std::string& version,
- const std::string& fingerprint,
size_t limit,
std::string* query) {
std::string additional =
- base::StringPrintf("id=%s&v=%s&fp=%s&uc",
- id.c_str(), version.c_str(), fingerprint.c_str());
+ base::StringPrintf("id=%s&v=%s&uc", id.c_str(), version.c_str());
additional = "x=" + net::EscapeQueryParamValue(additional, true);
if ((additional.size() + query->size() + 1) > limit)
return false;
@@ -169,7 +163,7 @@
fetcher->Start();
}
-// Returns true if the url request of |fetcher| was succesful.
+// Returs true if the url request of |fetcher| was succesful.
bool FetchSuccess(const net::URLFetcher& fetcher) {
return (fetcher.GetStatus().status() == net::URLRequestStatus::SUCCESS) &&
(fetcher.GetResponseCode() == 200);
@@ -180,44 +174,23 @@
// which is supplied by the the component updater client and |status| which
// is modified as the item is processed by the update pipeline. The expected
// transition graph is:
+// error error error
+// +--kNoUpdate<------<-------+------<------+------<------+
+// | | | |
+// V yes | | |
+// kNew --->kChecking-->[update?]----->kCanUpdate-->kDownloading-->kUpdating
+// ^ | |
+// | |no |
+// |--kUpToDate<---+ |
+// | success |
+// +--kUpdated<-------------------------------------------+
//
-// kNew
-// |
-// V
-// +----------------------> kChecking -<---------+-----<-------+
-// | | | |
-// | error V no | |
-// kNoUpdate <---------------- [update?] ->---- kUpToDate kUpdated
-// ^ | ^
-// | yes | |
-// | diff=false V |
-// | +-----------> kCanUpdate |
-// | | | |
-// | | V no |
-// | | [differential update?]->----+ |
-// | | | | |
-// | | yes | | |
-// | | error V | |
-// | +---------<- kDownloadingDiff | |
-// | | | | |
-// | | | | |
-// | | error V | |
-// | +---------<- kUpdatingDiff ->--------|-----------+ success
-// | | |
-// | error V |
-// +----------------------------------------- kDownloading |
-// | | |
-// | error V |
-// +------------------------------------------ kUpdating ->----+ success
-//
struct CrxUpdateItem {
enum Status {
kNew,
kChecking,
kCanUpdate,
- kDownloadingDiff,
kDownloading,
- kUpdatingDiff,
kUpdating,
kUpdated,
kUpToDate,
@@ -226,34 +199,14 @@
};
Status status;
+ GURL crx_url;
std::string id;
- CrxComponent component;
-
base::Time last_check;
-
- // These members are initialized with their corresponding values from the
- // update server response.
- GURL crx_url;
- GURL diff_crx_url;
- int size;
- int diff_size;
-
- // The from/to version and fingerprint values.
- Version previous_version;
+ CrxComponent component;
Version next_version;
- std::string previous_fp;
- std::string next_fp;
- // True if the differential update failed for any reason.
- bool diff_update_failed;
+ CrxUpdateItem() : status(kNew) {}
- CrxUpdateItem()
- : status(kNew),
- size(0),
- diff_size(0),
- diff_update_failed(false) {
- }
-
// Function object used to find a specific component.
class FindById {
public:
@@ -267,22 +220,10 @@
};
};
-// Returns true if a differential update is available for the update item.
-bool IsDiffUpdateAvailable(const CrxUpdateItem* update_item) {
- return update_item->diff_crx_url.is_valid();
-}
-
-// Returns true if a differential update is available, it has not failed yet,
-// and the configuration allows it.
-bool CanTryDiffUpdate(const CrxUpdateItem* update_item,
- const ComponentUpdateService::Configurator& config) {
- return IsDiffUpdateAvailable(update_item) &&
- !update_item->diff_update_failed &&
- config.DeltasEnabled();
-}
-
} // namespace.
+typedef ComponentUpdateService::Configurator Config;
+
CrxComponent::CrxComponent()
: installer(NULL),
source(BANDAID) {
@@ -299,7 +240,7 @@
// rest of the browser, so even if we have many components registered and
// eligible for update, we only do one thing at a time with pauses in between
// the tasks. Also when we do network requests there is only one |url_fetcher_|
-// in flight at a time.
+// in flight at at a time.
// There are no locks in this code, the main structure |work_items_| is mutated
// only from the UI thread. The unpack and installation is done in the file
// thread and the network requests are done in the IO thread and in the file
@@ -363,7 +304,6 @@
ComponentInstaller* installer;
std::vector<uint8> pk_hash;
std::string id;
- std::string fingerprint;
CRXContext() : installer(NULL) {}
};
@@ -379,7 +319,8 @@
const UpdateManifest::Results& results);
// See ManifestParserBridge.
- void OnParseUpdateManifestFailed(const std::string& error_message);
+ void OnParseUpdateManifestFailed(
+ const std::string& error_message);
bool AddItemToUpdateCheck(CrxUpdateItem* item, std::string* query);
@@ -392,22 +333,19 @@
void Install(const CRXContext* context, const base::FilePath& crx_path);
void DoneInstalling(const std::string& component_id,
- ComponentUnpacker::Error error,
- int extended_error);
+ ComponentUnpacker::Error error);
size_t ChangeItemStatus(CrxUpdateItem::Status from,
CrxUpdateItem::Status to);
CrxUpdateItem* FindUpdateItemById(const std::string& id);
- scoped_ptr<ComponentUpdateService::Configurator> config_;
+ scoped_ptr<Config> config_;
- scoped_ptr<ComponentPatcher> component_patcher_;
-
scoped_ptr<net::URLFetcher> url_fetcher_;
- // A collection of every work item.
typedef std::vector<CrxUpdateItem*> UpdateItems;
+ // A collection of every work item.
UpdateItems work_items_;
// A particular set of items from work_items_, which should be checked ASAP.
@@ -415,8 +353,7 @@
base::OneShotTimer<CrxUpdateService> timer_;
- const Version chrome_version_;
- const std::string prod_id_;
+ Version chrome_version_;
bool running_;
@@ -425,12 +362,10 @@
//////////////////////////////////////////////////////////////////////////////
-CrxUpdateService::CrxUpdateService(ComponentUpdateService::Configurator* config)
+CrxUpdateService::CrxUpdateService(
+ ComponentUpdateService::Configurator* config)
: config_(config),
- component_patcher_(config->CreateComponentPatcher()),
chrome_version_(chrome::VersionInfo().Version()),
- prod_id_(chrome::OmahaQueryParams::GetProdIdString(
- chrome::OmahaQueryParams::CHROME)),
running_(false) {
}
@@ -515,7 +450,7 @@
}
// Changes all the components in |work_items_| that have |from| status to
-// |to| status and returns how many have been changed.
+// |to| statatus and returns how many have been changed.
size_t CrxUpdateService::ChangeItemStatus(CrxUpdateItem::Status from,
CrxUpdateItem::Status to) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
@@ -556,7 +491,6 @@
uit = new CrxUpdateItem;
uit->id.swap(id);
uit->component = component;
-
work_items_.push_back(uit);
// If this is the first component registered we call Start to
// schedule the first timer.
@@ -567,24 +501,17 @@
}
// Sets a component to be checked for updates.
-// The component to add is |crxit| and the |query| string is modified with the
+// The componet to add is |crxit| and the |query| string is modified with the
// required omaha compatible query. Returns false when the query strings
// is longer than specified by UrlSizeLimit().
bool CrxUpdateService::AddItemToUpdateCheck(CrxUpdateItem* item,
std::string* query) {
if (!AddQueryString(item->id,
item->component.version.GetString(),
- item->component.fingerprint,
config_->UrlSizeLimit(), query))
return false;
-
item->status = CrxUpdateItem::kChecking;
item->last_check = base::Time::Now();
- item->previous_version = item->component.version;
- item->next_version = Version();
- item->previous_fp = item->component.fingerprint;
- item->next_fp.clear();
- item->diff_update_failed = false;
return true;
}
@@ -608,17 +535,16 @@
// Check if the request is too soon.
base::TimeDelta delta = base::Time::Now() - uit->last_check;
- if (delta < base::TimeDelta::FromSeconds(config_->OnDemandDelay()))
+ if (delta < base::TimeDelta::FromSeconds(config_->OnDemandDelay())) {
return kError;
+ }
switch (uit->status) {
// If the item is already in the process of being updated, there is
// no point in this call, so return kInProgress.
case CrxUpdateItem::kChecking:
case CrxUpdateItem::kCanUpdate:
- case CrxUpdateItem::kDownloadingDiff:
case CrxUpdateItem::kDownloading:
- case CrxUpdateItem::kUpdatingDiff:
case CrxUpdateItem::kUpdating:
return kInProgress;
// Otherwise the item was already checked a while back (or it is new),
@@ -657,21 +583,13 @@
if (item->status != CrxUpdateItem::kCanUpdate)
continue;
// Found component to update, start the process.
+ item->status = CrxUpdateItem::kDownloading;
CRXContext* context = new CRXContext;
context->pk_hash = item->component.pk_hash;
context->id = item->id;
context->installer = item->component.installer;
- context->fingerprint = item->next_fp;
- GURL package_url;
- if (CanTryDiffUpdate(item, *config_)) {
- package_url = item->diff_crx_url;
- item->status = CrxUpdateItem::kDownloadingDiff;
- } else {
- package_url = item->crx_url;
- item->status = CrxUpdateItem::kDownloading;
- }
url_fetcher_.reset(net::URLFetcher::Create(
- 0, package_url, net::URLFetcher::GET,
+ 0, item->crx_url, net::URLFetcher::GET,
MakeContextDelegate(this, context)));
StartFetch(url_fetcher_.get(), config_->RequestContext(), true);
return;
@@ -782,10 +700,11 @@
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
if (config_->InProcess()) {
UpdateManifest manifest;
- if (!manifest.Parse(xml))
+ if (!manifest.Parse(xml)) {
CrxUpdateService::OnParseUpdateManifestFailed(manifest.errors());
- else
+ } else {
CrxUpdateService::OnParseUpdateManifestSucceeded(manifest.results());
+ }
} else {
UtilityProcessHost* host =
UtilityProcessHost::Create(new ManifestParserBridge(this),
@@ -834,12 +753,8 @@
// All test passed. Queue an upgrade for this component and fire the
// notifications.
crx->crx_url = it->crx_url;
- crx->size = it->size;
- crx->diff_crx_url = it->diff_crx_url;
- crx->diff_size = it->diff_size;
crx->status = CrxUpdateItem::kCanUpdate;
crx->next_version = Version(it->version);
- crx->next_fp = it->package_fingerprint;
++update_pending;
content::NotificationService::current()->Notify(
@@ -874,39 +789,19 @@
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
int error_code = net::OK;
- CrxUpdateItem* crx = FindUpdateItemById(context->id);
- DCHECK(crx->status == CrxUpdateItem::kDownloadingDiff ||
- crx->status == CrxUpdateItem::kDownloading);
-
if (source->FileErrorOccurred(&error_code) || !FetchSuccess(*source)) {
- if (crx->status == CrxUpdateItem::kDownloadingDiff) {
- size_t count = ChangeItemStatus(CrxUpdateItem::kDownloadingDiff,
- CrxUpdateItem::kCanUpdate);
- DCHECK_EQ(count, 1ul);
- ScheduleNextRun(true);
- return;
- }
size_t count = ChangeItemStatus(CrxUpdateItem::kDownloading,
CrxUpdateItem::kNoUpdate);
DCHECK_EQ(count, 1ul);
config_->OnEvent(Configurator::kNetworkError, CrxIdtoUMAId(context->id));
url_fetcher_.reset();
-
ScheduleNextRun(false);
} else {
base::FilePath temp_crx_path;
CHECK(source->GetResponseAsFilePath(true, &temp_crx_path));
-
- size_t count = 0;
- if (crx->status == CrxUpdateItem::kDownloadingDiff) {
- count = ChangeItemStatus(CrxUpdateItem::kDownloadingDiff,
- CrxUpdateItem::kUpdatingDiff);
- } else {
- count = ChangeItemStatus(CrxUpdateItem::kDownloading,
- CrxUpdateItem::kUpdating);
- }
+ size_t count = ChangeItemStatus(CrxUpdateItem::kDownloading,
+ CrxUpdateItem::kUpdating);
DCHECK_EQ(count, 1ul);
-
url_fetcher_.reset();
content::NotificationService::current()->Notify(
@@ -934,19 +829,17 @@
const base::FilePath& crx_path) {
// This function owns the |crx_path| and the |context| object.
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
- ComponentUnpacker unpacker(context->pk_hash,
- crx_path,
- context->fingerprint,
- component_patcher_.get(),
- context->installer);
- if (!file_util::Delete(crx_path, false))
+ ComponentUnpacker
+ unpacker(context->pk_hash, crx_path, context->installer);
+ if (!file_util::Delete(crx_path, false)) {
NOTREACHED() << crx_path.value();
+ }
// Why unretained? See comment at top of file.
BrowserThread::PostDelayedTask(
BrowserThread::UI,
FROM_HERE,
base::Bind(&CrxUpdateService::DoneInstalling, base::Unretained(this),
- context->id, unpacker.error(), unpacker.extended_error()),
+ context->id, unpacker.error()),
base::TimeDelta::FromMilliseconds(config_->StepDelay()));
delete context;
}
@@ -954,28 +847,14 @@
// Installation has been completed. Adjust the component status and
// schedule the next check.
void CrxUpdateService::DoneInstalling(const std::string& component_id,
- ComponentUnpacker::Error error,
- int extra_code) {
+ ComponentUnpacker::Error error) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
CrxUpdateItem* item = FindUpdateItemById(component_id);
- if (item->status == CrxUpdateItem::kUpdatingDiff) {
- if (error != ComponentUnpacker::kNone) {
- item->diff_update_failed = true;
- size_t count = ChangeItemStatus(CrxUpdateItem::kUpdatingDiff,
- CrxUpdateItem::kCanUpdate);
- DCHECK_EQ(count, 1ul);
- ScheduleNextRun(true);
- return;
- }
- }
-
item->status = (error == ComponentUnpacker::kNone) ? CrxUpdateItem::kUpdated :
CrxUpdateItem::kNoUpdate;
- if (item->status == CrxUpdateItem::kUpdated) {
+ if (item->status == CrxUpdateItem::kUpdated)
item->component.version = item->next_version;
- item->component.fingerprint = item->next_fp;
- }
Configurator::Events event;
switch (error) {

Powered by Google App Engine
This is Rietveld 408576698