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

Side by Side Diff: chrome/installer/util/installation_validator.cc

Issue 10665002: Implement installation of the Chrome App Host. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: A basic working app host installer/uninstaller. Created 8 years, 5 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 // Implementation of the installation validator. 5 // Implementation of the installation validator.
6 6
7 #include "chrome/installer/util/installation_validator.h" 7 #include "chrome/installer/util/installation_validator.h"
8 8
9 #include <algorithm> 9 #include <algorithm>
10 #include <set> 10 #include <set>
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
105 } 105 }
106 106
107 bool InstallationValidator::ChromeFrameRules::UsageStatsAllowed( 107 bool InstallationValidator::ChromeFrameRules::UsageStatsAllowed(
108 const ProductState& product_state) const { 108 const ProductState& product_state) const {
109 // Products must not have usagestats consent values when multi-install 109 // Products must not have usagestats consent values when multi-install
110 // (only the multi-install binaries may). 110 // (only the multi-install binaries may).
111 return !product_state.is_multi_install(); 111 return !product_state.is_multi_install();
112 } 112 }
113 113
114 BrowserDistribution::Type 114 BrowserDistribution::Type
115 InstallationValidator::ChromeAppHostRules::distribution_type() const {
116 return BrowserDistribution::CHROME_APP_HOST;
117 }
118
119 void InstallationValidator::ChromeAppHostRules::AddUninstallSwitchExpectations(
120 const InstallationState& machine_state,
121 bool system_install,
122 const ProductState& product_state,
123 SwitchExpectations* expectations) const {
124 DCHECK(!system_install);
125
126 // --chrome-app-host must be present.
127 expectations->push_back(std::make_pair(std::string(switches::kChromeAppHost),
128 true));
129 // --chrome must not be present.
130 expectations->push_back(std::make_pair(std::string(switches::kChrome),
131 false));
132
133 // --chrome-frame must not be present.
134 expectations->push_back(std::make_pair(std::string(switches::kChromeFrame),
135 false));
136 }
137
138 void InstallationValidator::ChromeAppHostRules::AddRenameSwitchExpectations(
139 const InstallationState& machine_state,
140 bool system_install,
141 const ProductState& product_state,
142 SwitchExpectations* expectations) const {
143 // TODO(erikwright): I guess there will be none?
144 }
145
146 bool InstallationValidator::ChromeAppHostRules::UsageStatsAllowed(
147 const ProductState& product_state) const {
148 // App Host doesn't manage usage stats. The Chrome Binaries will.
149 return false;
150 }
151
152 BrowserDistribution::Type
115 InstallationValidator::ChromeBinariesRules::distribution_type() const { 153 InstallationValidator::ChromeBinariesRules::distribution_type() const {
116 return BrowserDistribution::CHROME_BINARIES; 154 return BrowserDistribution::CHROME_BINARIES;
117 } 155 }
118 156
119 void InstallationValidator::ChromeBinariesRules::AddUninstallSwitchExpectations( 157 void InstallationValidator::ChromeBinariesRules::AddUninstallSwitchExpectations(
120 const InstallationState& machine_state, 158 const InstallationState& machine_state,
121 bool system_install, 159 bool system_install,
122 const ProductState& product_state, 160 const ProductState& product_state,
123 SwitchExpectations* expectations) const { 161 SwitchExpectations* expectations) const {
124 NOTREACHED(); 162 NOTREACHED();
(...skipping 17 matching lines...) Expand all
142 const InstallationValidator::InstallationType 180 const InstallationValidator::InstallationType
143 InstallationValidator::kInstallationTypes[] = { 181 InstallationValidator::kInstallationTypes[] = {
144 NO_PRODUCTS, 182 NO_PRODUCTS,
145 CHROME_SINGLE, 183 CHROME_SINGLE,
146 CHROME_MULTI, 184 CHROME_MULTI,
147 CHROME_FRAME_SINGLE, 185 CHROME_FRAME_SINGLE,
148 CHROME_FRAME_SINGLE_CHROME_SINGLE, 186 CHROME_FRAME_SINGLE_CHROME_SINGLE,
149 CHROME_FRAME_SINGLE_CHROME_MULTI, 187 CHROME_FRAME_SINGLE_CHROME_MULTI,
150 CHROME_FRAME_MULTI, 188 CHROME_FRAME_MULTI,
151 CHROME_FRAME_MULTI_CHROME_MULTI, 189 CHROME_FRAME_MULTI_CHROME_MULTI,
152 CHROME_FRAME_READY_MODE_CHROME_MULTI 190 CHROME_FRAME_READY_MODE_CHROME_MULTI,
191 CHROME_APP_HOST,
192 CHROME_APP_HOST_CHROME_FRAME_SINGLE,
193 CHROME_APP_HOST_CHROME_FRAME_SINGLE_CHROME_MULTI,
194 CHROME_APP_HOST_CHROME_FRAME_MULTI,
195 CHROME_APP_HOST_CHROME_FRAME_MULTI_CHROME_MULTI,
196 CHROME_APP_HOST_CHROME_MULTI,
197 CHROME_APP_HOST_CHROME_MULTI_CHROME_FRAME_READY_MODE,
153 }; 198 };
154 199
155 // Validates the "quick-enable-cf" Google Update product command. 200 // Validates the "quick-enable-cf" Google Update product command.
156 void InstallationValidator::ValidateQuickEnableCfCommand( 201 void InstallationValidator::ValidateQuickEnableCfCommand(
157 const ProductContext& ctx, 202 const ProductContext& ctx,
158 const AppCommand& command, 203 const AppCommand& command,
159 bool* is_valid) { 204 bool* is_valid) {
160 DCHECK(is_valid); 205 DCHECK(is_valid);
161 206
162 CommandLine the_command(CommandLine::FromString(command.command_line())); 207 CommandLine the_command(CommandLine::FromString(command.command_line()));
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
225 << scan->first << "\"."; 270 << scan->first << "\".";
226 } 271 }
227 } 272 }
228 273
229 // Validates the multi-install binaries' Google Update commands. 274 // Validates the multi-install binaries' Google Update commands.
230 void InstallationValidator::ValidateBinariesCommands( 275 void InstallationValidator::ValidateBinariesCommands(
231 const ProductContext& ctx, 276 const ProductContext& ctx,
232 bool* is_valid) { 277 bool* is_valid) {
233 DCHECK(is_valid); 278 DCHECK(is_valid);
234 279
235 // The quick-enable-cf command must be present if Chrome is installed either 280 // The quick-enable-cf command must be present if Chrome Binaries are
236 // alone or with CF in ready-mode. 281 // installed and Chrome Frame is not installed (or installed in ready mode).
237 const ChannelInfo& channel = ctx.state.channel(); 282 const ChannelInfo& channel = ctx.state.channel();
238 const ProductState* chrome_state = ctx.machine_state.GetProductState( 283 const ProductState* binaries_state = ctx.machine_state.GetProductState(
239 ctx.system_install, BrowserDistribution::CHROME_BROWSER); 284 ctx.system_install, BrowserDistribution::CHROME_BINARIES);
240 const ProductState* cf_state = ctx.machine_state.GetProductState( 285 const ProductState* cf_state = ctx.machine_state.GetProductState(
241 ctx.system_install, BrowserDistribution::CHROME_FRAME); 286 ctx.system_install, BrowserDistribution::CHROME_FRAME);
242 287
243 CommandExpectations expectations; 288 CommandExpectations expectations;
244 289
245 if (chrome_state != NULL && (cf_state == NULL || channel.IsReadyMode())) 290 if (binaries_state != NULL && (cf_state == NULL || channel.IsReadyMode()))
246 expectations[kCmdQuickEnableCf] = &ValidateQuickEnableCfCommand; 291 expectations[kCmdQuickEnableCf] = &ValidateQuickEnableCfCommand;
247 292
248 ValidateAppCommandExpectations(ctx, expectations, is_valid); 293 ValidateAppCommandExpectations(ctx, expectations, is_valid);
249 } 294 }
250 295
251 // Validates the multi-install binaries at level |system_level|. 296 // Validates the multi-install binaries at level |system_level|.
252 void InstallationValidator::ValidateBinaries( 297 void InstallationValidator::ValidateBinaries(
253 const InstallationState& machine_state, 298 const InstallationState& machine_state,
254 bool system_install, 299 bool system_install,
255 const ProductState& binaries_state, 300 const ProductState& binaries_state,
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
303 LOG(ERROR) << "Chrome Binaries are missing \"-readymode\" in channel" 348 LOG(ERROR) << "Chrome Binaries are missing \"-readymode\" in channel"
304 " name: \"" << channel.value() << "\""; 349 " name: \"" << channel.value() << "\"";
305 } 350 }
306 } else if (channel.IsReadyMode()) { 351 } else if (channel.IsReadyMode()) {
307 *is_valid = false; 352 *is_valid = false;
308 LOG(ERROR) << "Chrome Binaries have \"-readymode\" in channel name, yet " 353 LOG(ERROR) << "Chrome Binaries have \"-readymode\" in channel name, yet "
309 "Chrome Frame is not in ready mode: \"" << channel.value() 354 "Chrome Frame is not in ready mode: \"" << channel.value()
310 << "\""; 355 << "\"";
311 } 356 }
312 357
313 // Chrome or Chrome Frame must be present 358 // ap must have -apphost iff Chrome Frame is installed multi
314 if (chrome_state == NULL && cf_state == NULL) { 359 const ProductState* app_host_state = machine_state.GetProductState(
360 system_install, BrowserDistribution::CHROME_APP_HOST);
361 if (app_host_state != NULL) {
362 if (!app_host_state->is_multi_install()) {
363 *is_valid = false;
364 LOG(ERROR) << "Chrome App Host is installed in non-multi mode.";
365 }
366 if (!channel.IsAppHost()) {
367 *is_valid = false;
368 LOG(ERROR) << "Chrome Binaries are missing \"-apphost\" in channel"
369 " name: \"" << channel.value() << "\"";
370 }
371 } else if (channel.IsAppHost()) {
372 *is_valid = false;
373 LOG(ERROR) << "Chrome Binaries have \"-apphost\" in channel name, yet "
374 "Chrome App Host is not installed: \"" << channel.value()
375 << "\"";
376 }
377
378 // Chrome, Chrome Frame, or App Host must be present
379 if (chrome_state == NULL && cf_state == NULL && app_host_state == NULL) {
315 *is_valid = false; 380 *is_valid = false;
316 LOG(ERROR) << "Chrome Binaries are present with no other products."; 381 LOG(ERROR) << "Chrome Binaries are present with no other products.";
317 } 382 }
318 383
319 // Chrome must be multi-install if present. 384 // Chrome must be multi-install if present.
320 if (chrome_state != NULL && !chrome_state->is_multi_install()) { 385 if (chrome_state != NULL && !chrome_state->is_multi_install()) {
321 *is_valid = false; 386 *is_valid = false;
322 LOG(ERROR) 387 LOG(ERROR)
323 << "Chrome Binaries are present yet Chrome is not multi-install."; 388 << "Chrome Binaries are present yet Chrome is not multi-install.";
324 } 389 }
325 390
326 // Chrome Frame must be multi-install if Chrome is not present. 391 // Chrome Frame must be multi-install if Chrome & App Host are not present.
327 if (cf_state != NULL && chrome_state == NULL && 392 if (cf_state != NULL && app_host_state == NULL && chrome_state == NULL &&
328 !cf_state->is_multi_install()) { 393 !cf_state->is_multi_install()) {
329 *is_valid = false; 394 *is_valid = false;
330 LOG(ERROR) << "Chrome Binaries are present without Chrome yet Chrome Frame " 395 LOG(ERROR) << "Chrome Binaries are present without Chrome nor App Host "
331 "is not multi-install."; 396 << "yet Chrome Frame is not multi-install.";
332 } 397 }
333 398
334 ChromeBinariesRules binaries_rules; 399 ChromeBinariesRules binaries_rules;
335 ProductContext ctx = { 400 ProductContext ctx = {
336 machine_state, 401 machine_state,
337 system_install, 402 system_install,
338 BrowserDistribution::GetSpecificDistribution( 403 BrowserDistribution::GetSpecificDistribution(
339 BrowserDistribution::CHROME_BINARIES), 404 BrowserDistribution::CHROME_BINARIES),
340 binaries_state, 405 binaries_state,
341 binaries_rules 406 binaries_rules
(...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after
602 chrome_frame_rules, &rock_on); 667 chrome_frame_rules, &rock_on);
603 int cf_bit = !product_state->is_multi_install() ? 668 int cf_bit = !product_state->is_multi_install() ?
604 ProductBits::CHROME_FRAME_SINGLE : 669 ProductBits::CHROME_FRAME_SINGLE :
605 (product_state->uninstall_command().HasSwitch( 670 (product_state->uninstall_command().HasSwitch(
606 switches::kChromeFrameReadyMode) ? 671 switches::kChromeFrameReadyMode) ?
607 ProductBits::CHROME_FRAME_READY_MODE : 672 ProductBits::CHROME_FRAME_READY_MODE :
608 ProductBits::CHROME_FRAME_MULTI); 673 ProductBits::CHROME_FRAME_MULTI);
609 *type = static_cast<InstallationType>(*type | cf_bit); 674 *type = static_cast<InstallationType>(*type | cf_bit);
610 } 675 }
611 676
677 // Is Chrome App Host installed?
678 product_state =
679 machine_state.GetProductState(system_level,
680 BrowserDistribution::CHROME_APP_HOST);
681 if (product_state != NULL) {
682 ChromeAppHostRules chrome_app_host_rules;
683 ValidateProduct(machine_state, system_level, *product_state,
684 chrome_app_host_rules, &rock_on);
685 *type = static_cast<InstallationType>(*type | ProductBits::CHROME_APP_HOST);
686 if (system_level) {
687 LOG(ERROR) << "Chrome App Host must not be installed at system level.";
688 rock_on = false;
689 }
690 if (!product_state->is_multi_install()) {
691 LOG(ERROR) << "Chrome App Host must always be multi-install.";
692 rock_on = false;
693 }
694 }
695
612 DCHECK_NE(std::find(&kInstallationTypes[0], 696 DCHECK_NE(std::find(&kInstallationTypes[0],
613 &kInstallationTypes[arraysize(kInstallationTypes)], 697 &kInstallationTypes[arraysize(kInstallationTypes)],
614 *type), 698 *type),
615 &kInstallationTypes[arraysize(kInstallationTypes)]) 699 &kInstallationTypes[arraysize(kInstallationTypes)])
616 << "Invalid combination of products found on system (" << *type << ")"; 700 << "Invalid combination of products found on system (" << *type << ")";
617 701
618 return rock_on; 702 return rock_on;
619 } 703 }
620 704
621 // static 705 // static
622 bool InstallationValidator::ValidateInstallationType(bool system_level, 706 bool InstallationValidator::ValidateInstallationType(bool system_level,
623 InstallationType* type) { 707 InstallationType* type) {
624 DCHECK(type); 708 DCHECK(type);
625 InstallationState machine_state; 709 InstallationState machine_state;
626 710
627 machine_state.Initialize(); 711 machine_state.Initialize();
628 712
629 return ValidateInstallationTypeForState(machine_state, system_level, type); 713 return ValidateInstallationTypeForState(machine_state, system_level, type);
630 } 714 }
631 715
632 } // namespace installer 716 } // namespace installer
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698