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