15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "chrome/browser/component_updater/component_updater_configurator.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <algorithm>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/windows_version.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "build/build_config.h"
16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/component_updater/component_patcher.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h"
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/common/omaha_query_params/omaha_query_params.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_context_getter.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if defined(OS_WIN)
22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/component_updater/component_patcher_win.h"
23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif
24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Default time constants.
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kDelayOneMinute = 60;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kDelayOneHour = kDelayOneMinute * 60;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Debug values you can pass to --component-updater=value1,value2.
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Speed up component checking.
33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochconst char kSwitchFastUpdate[] = "fast-update";
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Force out-of-process-xml parsing.
35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochconst char kSwitchOutOfProcess[] = "out-of-process";
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Add "testrequest=1" parameter to the update check query.
37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochconst char kSwitchRequestParam[] = "test-request";
38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Disables differential updates.
39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochconst char kSwitchDisableDeltaUpdates[] = "disable-delta-updates";
40ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Disables pings. Pings are the requests sent to the update server that report
41ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// the success or the failure of component install or update attempts.
42ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochextern const char kSwitchDisablePings[] = "disable-pings";
43ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Sets the URL for updates.
45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochconst char kSwitchUrlSource[] = "url-source";
46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// The default url from which an update manifest can be fetched. Can be
48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// overridden with --component-updater=url-source=someurl.
49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochconst char kDefaultUrlSource[] =
50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    "http://clients2.google.com/service/update2/crx";
51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
52ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// The url to send the pings to.
53ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochconst char kPingUrl[] = "http://tools.google.com/service/update2";
54ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Returns true if and only if |test| is contained in |vec|.
56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool HasSwitchValue(const std::vector<std::string>& vec, const char* test) {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (vec.empty())
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 0;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (std::find(vec.begin(), vec.end(), test) != vec.end());
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
62eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// If there is an element of |vec| of the form |test|=.*, returns the right-
63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// hand side of that assignment. Otherwise, returns an empty string.
64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// The right-hand side may contain additional '=' characters, allowing for
65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// further nesting of switch arguments.
66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochstd::string GetSwitchArgument(const std::vector<std::string>& vec,
67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                              const char* test) {
68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (vec.empty())
69eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return std::string();
70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  for (std::vector<std::string>::const_iterator it = vec.begin();
71eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      it != vec.end();
72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      ++it) {
73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const std::size_t found = it->find("=");
74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    if (found != std::string::npos) {
75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      if (it->substr(0, found) == test) {
76eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        return it->substr(found + 1);
77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      }
78eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    }
79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
80eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return std::string();
81eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
82eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ChromeConfigurator : public ComponentUpdateService::Configurator {
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ChromeConfigurator(const CommandLine* cmdline,
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     net::URLRequestContextGetter* url_request_getter);
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~ChromeConfigurator() {}
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int InitialDelay() OVERRIDE;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int NextCheckDelay() OVERRIDE;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int StepDelay() OVERRIDE;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int MinimumReCheckWait() OVERRIDE;
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual int OnDemandDelay() OVERRIDE;
97eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual GURL UpdateUrl() OVERRIDE;
98ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  virtual GURL PingUrl() OVERRIDE;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual const char* ExtraRequestParams() OVERRIDE;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual size_t UrlSizeLimit() OVERRIDE;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual net::URLRequestContextGetter* RequestContext() OVERRIDE;
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool InProcess() OVERRIDE;
103eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual ComponentPatcher* CreateComponentPatcher() OVERRIDE;
104eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual bool DeltasEnabled() const OVERRIDE;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::URLRequestContextGetter* url_request_getter_;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string extra_info_;
109eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  std::string url_source_;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool fast_update_;
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool out_of_process_;
112ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  bool pings_enabled_;
113eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  bool deltas_enabled_;
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ChromeConfigurator::ChromeConfigurator(const CommandLine* cmdline,
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::URLRequestContextGetter* url_request_getter)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : url_request_getter_(url_request_getter),
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        extra_info_(chrome::OmahaQueryParams::Get(
120eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            chrome::OmahaQueryParams::CHROME)),
121eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        fast_update_(false),
122eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        out_of_process_(false),
123ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        pings_enabled_(false),
124eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        deltas_enabled_(false) {
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Parse comma-delimited debug flags.
126eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  std::vector<std::string> switch_values;
127eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  Tokenize(cmdline->GetSwitchValueASCII(switches::kComponentUpdater),
128eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      ",", &switch_values);
129eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  fast_update_ = HasSwitchValue(switch_values, kSwitchFastUpdate);
130eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  out_of_process_ = HasSwitchValue(switch_values, kSwitchOutOfProcess);
131ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  pings_enabled_ = !HasSwitchValue(switch_values, kSwitchDisablePings);
132eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if defined(OS_WIN)
133eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  deltas_enabled_ = !HasSwitchValue(switch_values, kSwitchDisableDeltaUpdates);
134eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#else
135eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  deltas_enabled_ = false;
136eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif
137eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
138eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  url_source_ = GetSwitchArgument(switch_values, kSwitchUrlSource);
139eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (url_source_.empty()) {
140eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    url_source_ = kDefaultUrlSource;
141eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make the extra request params, they are necessary so omaha does
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // not deliver components that are going to be rejected at install time.
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (base::win::OSInfo::GetInstance()->wow64_status() ==
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::win::OSInfo::WOW64_ENABLED)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extra_info_ += "&wow64=1";
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
150eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (HasSwitchValue(switch_values, kSwitchRequestParam))
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extra_info_ += "&testrequest=1";
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ChromeConfigurator::InitialDelay() {
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return fast_update_ ? 1 : (6 * kDelayOneMinute);
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ChromeConfigurator::NextCheckDelay() {
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return fast_update_ ? 3 : (2 * kDelayOneHour);
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ChromeConfigurator::StepDelay() {
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return fast_update_ ? 1 : 4;
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ChromeConfigurator::MinimumReCheckWait() {
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return fast_update_ ? 30 : (6 * kDelayOneHour);
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int ChromeConfigurator::OnDemandDelay() {
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return fast_update_ ? 2 : (30 * kDelayOneMinute);
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
174eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochGURL ChromeConfigurator::UpdateUrl() {
175eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return GURL(url_source_);
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
178ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochGURL ChromeConfigurator::PingUrl() {
179ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  return pings_enabled_ ? GURL(kPingUrl) : GURL();
180ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
181ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* ChromeConfigurator::ExtraRequestParams() {
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return extra_info_.c_str();
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)size_t ChromeConfigurator::UrlSizeLimit() {
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return 1024ul;
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)net::URLRequestContextGetter* ChromeConfigurator::RequestContext() {
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return url_request_getter_;
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeConfigurator::InProcess() {
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return !out_of_process_;
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
198eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochComponentPatcher* ChromeConfigurator::CreateComponentPatcher() {
199eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if defined(OS_WIN)
200eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return new ComponentPatcherWin();
201eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#else
202eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return new ComponentPatcherCrossPlatform();
203eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif
204eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
205eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
206eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool ChromeConfigurator::DeltasEnabled() const {
207eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return deltas_enabled_;
208eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
209eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ComponentUpdateService::Configurator* MakeChromeComponentUpdaterConfigurator(
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const CommandLine* cmdline, net::URLRequestContextGetter* context_getter) {
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return new ChromeConfigurator(cmdline, context_getter);
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
214