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/installer/setup/install.h" | 5 #include "chrome/installer/setup/install.h" |
6 | 6 |
7 #include <windows.h> | 7 #include <windows.h> |
8 #include <shlobj.h> | 8 #include <shlobj.h> |
9 #include <time.h> | 9 #include <time.h> |
10 #include <winuser.h> | 10 #include <winuser.h> |
11 | 11 |
12 #include <string> | 12 #include <string> |
13 | 13 |
14 #include "base/command_line.h" | 14 #include "base/command_line.h" |
15 #include "base/file_path.h" | 15 #include "base/file_path.h" |
16 #include "base/file_util.h" | 16 #include "base/file_util.h" |
17 #include "base/logging.h" | 17 #include "base/logging.h" |
18 #include "base/memory/scoped_ptr.h" | 18 #include "base/memory/scoped_ptr.h" |
19 #include "base/path_service.h" | 19 #include "base/path_service.h" |
20 #include "base/string_util.h" | 20 #include "base/string_util.h" |
21 #include "base/stringprintf.h" | 21 #include "base/stringprintf.h" |
22 #include "base/utf_string_conversions.h" | 22 #include "base/utf_string_conversions.h" |
23 #include "base/win/shortcut.h" | 23 #include "base/win/shortcut.h" |
24 #include "base/win/windows_version.h" | 24 #include "base/win/windows_version.h" |
25 #include "chrome/common/chrome_constants.h" | 25 #include "chrome/common/chrome_constants.h" |
26 #include "chrome/common/chrome_switches.h" | |
26 #include "chrome/installer/setup/install_worker.h" | 27 #include "chrome/installer/setup/install_worker.h" |
27 #include "chrome/installer/setup/setup_constants.h" | 28 #include "chrome/installer/setup/setup_constants.h" |
28 #include "chrome/installer/util/auto_launch_util.h" | 29 #include "chrome/installer/util/auto_launch_util.h" |
29 #include "chrome/installer/util/browser_distribution.h" | 30 #include "chrome/installer/util/browser_distribution.h" |
30 #include "chrome/installer/util/create_reg_key_work_item.h" | 31 #include "chrome/installer/util/create_reg_key_work_item.h" |
31 #include "chrome/installer/util/delete_after_reboot_helper.h" | 32 #include "chrome/installer/util/delete_after_reboot_helper.h" |
32 #include "chrome/installer/util/google_update_constants.h" | 33 #include "chrome/installer/util/google_update_constants.h" |
33 #include "chrome/installer/util/helper.h" | 34 #include "chrome/installer/util/helper.h" |
34 #include "chrome/installer/util/install_util.h" | 35 #include "chrome/installer/util/install_util.h" |
35 #include "chrome/installer/util/master_preferences.h" | 36 #include "chrome/installer/util/master_preferences.h" |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
124 reg_path.append(installer::kChromeExe); | 125 reg_path.append(installer::kChromeExe); |
125 VLOG(1) << "Adding Chrome to Media player list at " << reg_path; | 126 VLOG(1) << "Adding Chrome to Media player list at " << reg_path; |
126 scoped_ptr<WorkItem> work_item(WorkItem::CreateCreateRegKeyWorkItem( | 127 scoped_ptr<WorkItem> work_item(WorkItem::CreateCreateRegKeyWorkItem( |
127 HKEY_LOCAL_MACHINE, reg_path)); | 128 HKEY_LOCAL_MACHINE, reg_path)); |
128 | 129 |
129 // if the operation fails we log the error but still continue | 130 // if the operation fails we log the error but still continue |
130 if (!work_item.get()->Do()) | 131 if (!work_item.get()->Do()) |
131 LOG(ERROR) << "Could not add Chrome to media player inclusion list."; | 132 LOG(ERROR) << "Could not add Chrome to media player inclusion list."; |
132 } | 133 } |
133 | 134 |
134 // Copy master preferences file provided to installer, in the same folder | 135 // Copy master_preferences file provided to installer, in the same folder |
135 // as chrome.exe so Chrome first run can find it. This function will be called | 136 // as chrome.exe so Chrome first run can find it. This function will be called |
136 // only on the first install of Chrome. | 137 // only on the first install of Chrome. |
137 void CopyPreferenceFileForFirstRun(const InstallerState& installer_state, | 138 void CopyPreferenceFileForFirstRun(const InstallerState& installer_state, |
138 const FilePath& prefs_source_path) { | 139 const FilePath& prefs_source_path) { |
139 FilePath prefs_dest_path(installer_state.target_path().AppendASCII( | 140 FilePath prefs_dest_path(installer_state.target_path().AppendASCII( |
140 installer::kDefaultMasterPrefs)); | 141 installer::kDefaultMasterPrefs)); |
141 if (!file_util::CopyFile(prefs_source_path, prefs_dest_path)) { | 142 if (!file_util::CopyFile(prefs_source_path, prefs_dest_path)) { |
142 VLOG(1) << "Failed to copy master preferences from:" | 143 VLOG(1) << "Failed to copy master_preferences from:" |
143 << prefs_source_path.value() << " gle: " << ::GetLastError(); | 144 << prefs_source_path.value() << " gle: " << ::GetLastError(); |
144 } | 145 } |
145 } | 146 } |
146 | 147 |
147 // Returns true if the current process is running on the interactive window | 148 // Returns true if the current process is running on the interactive window |
148 // station. This cares not whether the input desktop is the default or not | 149 // station. This cares not whether the input desktop is the default or not |
149 // (i.e., the screen saver is running, or what have you). | 150 // (i.e., the screen saver is running, or what have you). |
150 bool IsInteractiveProcess() { | 151 bool IsInteractiveProcess() { |
151 static const wchar_t kWinSta0[] = L"WinSta0"; | 152 static const wchar_t kWinSta0[] = L"WinSta0"; |
152 HWINSTA window_station = ::GetProcessWindowStation(); | 153 HWINSTA window_station = ::GetProcessWindowStation(); |
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
277 dist->GetUninstallLinkName() + installer::kLnkExt); | 278 dist->GetUninstallLinkName() + installer::kLnkExt); |
278 file_util::Delete(uninstall_shortcut_path, false); | 279 file_util::Delete(uninstall_shortcut_path, false); |
279 | 280 |
280 if (installer_state.system_install()) { | 281 if (installer_state.system_install()) { |
281 ShellUtil::RemoveChromeShortcut( | 282 ShellUtil::RemoveChromeShortcut( |
282 ShellUtil::SHORTCUT_QUICK_LAUNCH, dist, chrome_exe.value(), | 283 ShellUtil::SHORTCUT_QUICK_LAUNCH, dist, chrome_exe.value(), |
283 ShellUtil::SYSTEM_LEVEL, NULL); | 284 ShellUtil::SYSTEM_LEVEL, NULL); |
284 } | 285 } |
285 } | 286 } |
286 | 287 |
288 // Returns the appropriate shortcut operations for App Launcher, | |
289 // based on state of installation and master_preferences. | |
290 installer::InstallShortcutOperation GetAppLauncherShortcutOperation( | |
291 const InstallationState& original_state, | |
292 const InstallerState& installer_state) { | |
293 // Remove this check once we have system-level App Host. | |
294 DCHECK(!installer_state.system_install()); | |
295 | |
296 const installer::ProductState* original_app_host_state = | |
297 original_state.GetProductState(installer_state.system_install(), | |
298 BrowserDistribution::CHROME_APP_HOST); | |
299 bool app_launcher_exists = original_app_host_state && | |
300 CommandLine(original_app_host_state->uninstall_command()) | |
301 .HasSwitch(installer::switches::kChromeAppLauncher); | |
302 if (!app_launcher_exists) | |
303 return installer::INSTALL_SHORTCUT_CREATE_ALL; | |
304 | |
305 return installer::INSTALL_SHORTCUT_REPLACE_EXISTING; | |
306 } | |
307 | |
287 } // end namespace | 308 } // end namespace |
288 | 309 |
289 namespace installer { | 310 namespace installer { |
290 | 311 |
291 void EscapeXmlAttributeValueInSingleQuotes(string16* att_value) { | 312 void EscapeXmlAttributeValueInSingleQuotes(string16* att_value) { |
292 ReplaceChars(*att_value, L"&", L"&", att_value); | 313 ReplaceChars(*att_value, L"&", L"&", att_value); |
293 ReplaceChars(*att_value, L"'", L"'", att_value); | 314 ReplaceChars(*att_value, L"'", L"'", att_value); |
294 ReplaceChars(*att_value, L"<", L"<", att_value); | 315 ReplaceChars(*att_value, L"<", L"<", att_value); |
295 } | 316 } |
296 | 317 |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
349 return true; | 370 return true; |
350 } else { | 371 } else { |
351 PLOG(ERROR) << "Error writing " << installer::kVisualElementsManifest | 372 PLOG(ERROR) << "Error writing " << installer::kVisualElementsManifest |
352 << " to " << src_path.value(); | 373 << " to " << src_path.value(); |
353 return false; | 374 return false; |
354 } | 375 } |
355 } | 376 } |
356 } | 377 } |
357 | 378 |
358 void CreateOrUpdateShortcuts( | 379 void CreateOrUpdateShortcuts( |
359 const FilePath& chrome_exe, | 380 const FilePath& target, |
360 const Product& product, | 381 const Product& product, |
361 const MasterPreferences& prefs, | 382 const MasterPreferences& prefs, |
362 InstallShortcutLevel install_level, | 383 InstallShortcutLevel install_level, |
363 InstallShortcutOperation install_operation) { | 384 InstallShortcutOperation install_operation) { |
364 // TODO(tommi): Change this function to use WorkItemList. | 385 // TODO(tommi): Change this function to use WorkItemList. |
365 DCHECK(product.is_chrome()); | 386 DCHECK(product.is_chrome() || product.is_chrome_app_host()); |
366 | 387 |
367 // Extract shortcut preferences from |prefs|. | 388 // Extract shortcut preferences from |prefs|. |
368 bool do_not_create_desktop_shortcut = false; | 389 bool do_not_create_desktop_shortcut = false; |
369 bool do_not_create_quick_launch_shortcut = false; | 390 bool do_not_create_quick_launch_shortcut = false; |
370 bool alternate_desktop_shortcut = false; | 391 bool alternate_desktop_shortcut = false; |
371 prefs.GetBool(master_preferences::kDoNotCreateDesktopShortcut, | 392 prefs.GetBool(master_preferences::kDoNotCreateDesktopShortcut, |
372 &do_not_create_desktop_shortcut); | 393 &do_not_create_desktop_shortcut); |
373 prefs.GetBool(master_preferences::kDoNotCreateQuickLaunchShortcut, | 394 prefs.GetBool(master_preferences::kDoNotCreateQuickLaunchShortcut, |
374 &do_not_create_quick_launch_shortcut); | 395 &do_not_create_quick_launch_shortcut); |
375 prefs.GetBool(master_preferences::kAltShortcutText, | 396 prefs.GetBool(master_preferences::kAltShortcutText, |
376 &alternate_desktop_shortcut); | 397 &alternate_desktop_shortcut); |
377 | 398 |
378 BrowserDistribution* dist = product.distribution(); | 399 BrowserDistribution* dist = product.distribution(); |
379 // Shortcuts are always installed per-user unless specified. | |
380 ShellUtil::ShellChange shortcut_level = (install_level == ALL_USERS ? | |
381 ShellUtil::SYSTEM_LEVEL : ShellUtil::CURRENT_USER); | |
382 | 400 |
383 // The default operation on update is to overwrite shortcuts with the | 401 // The default operation on update is to overwrite shortcuts with the |
384 // currently desired properties, but do so only for shortcuts that still | 402 // currently desired properties, but do so only for shortcuts that still |
385 // exist. | 403 // exist. |
386 ShellUtil::ChromeShortcutOperation shortcut_operation; | 404 ShellUtil::ChromeShortcutOperation shortcut_operation; |
387 switch (install_operation) { | 405 switch (install_operation) { |
388 case INSTALL_SHORTCUT_CREATE_ALL: | 406 case INSTALL_SHORTCUT_CREATE_ALL: |
389 shortcut_operation = ShellUtil::SHORTCUT_CREATE_ALWAYS; | 407 shortcut_operation = ShellUtil::SHORTCUT_CREATE_ALWAYS; |
390 break; | 408 break; |
391 case INSTALL_SHORTCUT_CREATE_EACH_IF_NO_SYSTEM_LEVEL: | 409 case INSTALL_SHORTCUT_CREATE_EACH_IF_NO_SYSTEM_LEVEL: |
392 shortcut_operation = ShellUtil::SHORTCUT_CREATE_IF_NO_SYSTEM_LEVEL; | 410 shortcut_operation = ShellUtil::SHORTCUT_CREATE_IF_NO_SYSTEM_LEVEL; |
393 break; | 411 break; |
394 default: | 412 default: |
395 DCHECK(install_operation == INSTALL_SHORTCUT_REPLACE_EXISTING); | 413 DCHECK(install_operation == INSTALL_SHORTCUT_REPLACE_EXISTING); |
396 shortcut_operation = ShellUtil::SHORTCUT_REPLACE_EXISTING; | 414 shortcut_operation = ShellUtil::SHORTCUT_REPLACE_EXISTING; |
397 break; | 415 break; |
398 } | 416 } |
399 | 417 |
418 // Shortcuts are always installed per-user unless specified. | |
419 ShellUtil::ShellChange shortcut_level = (install_level == ALL_USERS ? | |
420 ShellUtil::SYSTEM_LEVEL : ShellUtil::CURRENT_USER); | |
421 | |
400 // |base_properties|: The basic properties to set on every shortcut installed | 422 // |base_properties|: The basic properties to set on every shortcut installed |
401 // (to be refined on a per-shortcut basis). | 423 // (to be refined on a per-shortcut basis). |
402 ShellUtil::ChromeShortcutProperties base_properties(shortcut_level); | 424 ShellUtil::ChromeShortcutProperties base_properties(shortcut_level); |
403 base_properties.set_chrome_exe(chrome_exe); | 425 base_properties.set_chrome_exe(target); |
426 | |
427 if (product.is_chrome_app_host()) { | |
428 DCHECK(product.HasOption(kOptionAppHostIsLauncher)); | |
429 // Adding command line arguments to app_host.exe. | |
430 // This is also done in AppListController::GetAppListCommandLine(), | |
431 // but we don't need the extra user data dir info appended. | |
432 CommandLine app_host_args(CommandLine::NO_PROGRAM); | |
433 app_host_args.AppendSwitch(::switches::kShowAppList); | |
434 // TODO(huangs): Add routine to CommandLine so we can do this directly. | |
435 base_properties.set_arguments(app_host_args.GetCommandLineString()); | |
436 } | |
404 | 437 |
405 if (!do_not_create_desktop_shortcut || | 438 if (!do_not_create_desktop_shortcut || |
406 shortcut_operation == ShellUtil::SHORTCUT_REPLACE_EXISTING) { | 439 shortcut_operation == ShellUtil::SHORTCUT_REPLACE_EXISTING) { |
407 ShellUtil::ChromeShortcutProperties desktop_properties(base_properties); | 440 ShellUtil::ChromeShortcutProperties desktop_properties(base_properties); |
408 if (alternate_desktop_shortcut) | 441 if (alternate_desktop_shortcut) |
409 desktop_properties.set_shortcut_name(dist->GetAlternateApplicationName()); | 442 desktop_properties.set_shortcut_name(dist->GetAlternateApplicationName()); |
410 ExecuteAndLogShortcutOperation( | 443 ExecuteAndLogShortcutOperation( |
411 ShellUtil::SHORTCUT_DESKTOP, dist, desktop_properties, | 444 ShellUtil::SHORTCUT_DESKTOP, dist, desktop_properties, |
412 shortcut_operation); | 445 shortcut_operation); |
413 | 446 |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
520 | 553 |
521 // Update the modifiers on the channel values for the product(s) being | 554 // Update the modifiers on the channel values for the product(s) being |
522 // installed and for the binaries in case of multi-install. | 555 // installed and for the binaries in case of multi-install. |
523 installer_state.UpdateChannels(); | 556 installer_state.UpdateChannels(); |
524 | 557 |
525 installer_state.UpdateStage(installer::COPYING_PREFERENCES_FILE); | 558 installer_state.UpdateStage(installer::COPYING_PREFERENCES_FILE); |
526 | 559 |
527 if (result == FIRST_INSTALL_SUCCESS && !prefs_path.empty()) | 560 if (result == FIRST_INSTALL_SUCCESS && !prefs_path.empty()) |
528 CopyPreferenceFileForFirstRun(installer_state, prefs_path); | 561 CopyPreferenceFileForFirstRun(installer_state, prefs_path); |
529 | 562 |
530 // Currently this only creates shortcuts for Chrome, but for other products | 563 const Product* app_launcher_product = |
531 // we might want to create shortcuts. | 564 installer_state.FindProduct(BrowserDistribution::CHROME_APP_HOST); |
532 const Product* chrome_install = | 565 const Product* chrome_product = |
533 installer_state.FindProduct(BrowserDistribution::CHROME_BROWSER); | 566 installer_state.FindProduct(BrowserDistribution::CHROME_BROWSER); |
534 if (chrome_install) { | 567 |
568 bool process_app_launcher_shortcuts = (app_launcher_product != NULL) && | |
569 app_launcher_product->HasOption(kOptionAppHostIsLauncher); | |
570 bool process_chrome_shortcuts = (chrome_product != NULL); | |
571 | |
572 if (process_app_launcher_shortcuts || process_chrome_shortcuts) { | |
erikwright (departed)
2012/11/01 20:43:36
personally I would say don't bother with this 'if'
grt (UTC plus 2)
2012/11/02 19:55:30
+1
huangs
2012/11/02 21:05:10
Done.
| |
535 installer_state.UpdateStage(installer::CREATING_SHORTCUTS); | 573 installer_state.UpdateStage(installer::CREATING_SHORTCUTS); |
574 } | |
536 | 575 |
537 BrowserDistribution* dist = chrome_install->distribution(); | 576 if (process_app_launcher_shortcuts) { |
577 const FilePath app_host_exe( | |
578 installer_state.target_path().Append(kChromeAppHostExe)); | |
579 InstallShortcutOperation app_launcher_shortcut_operation = | |
580 GetAppLauncherShortcutOperation(original_state, installer_state); | |
581 | |
582 // Always install per-user shortcuts for App Launcher. | |
583 CreateOrUpdateShortcuts(app_host_exe, *app_launcher_product, prefs, | |
584 CURRENT_USER, app_launcher_shortcut_operation); | |
585 } | |
586 | |
587 if (process_chrome_shortcuts) { | |
gab
2012/11/02 04:19:58
I don't like the name "process_chrome_shortcuts" a
huangs
2012/11/02 21:05:10
Got rid of the variable. The original comment was
| |
588 BrowserDistribution* dist = chrome_product->distribution(); | |
538 const FilePath chrome_exe( | 589 const FilePath chrome_exe( |
539 installer_state.target_path().Append(kChromeExe)); | 590 installer_state.target_path().Append(kChromeExe)); |
540 CleanupLegacyShortcuts(installer_state, dist, chrome_exe); | 591 CleanupLegacyShortcuts(installer_state, dist, chrome_exe); |
541 | 592 |
542 InstallShortcutOperation install_operation = | 593 InstallShortcutOperation install_operation = |
543 INSTALL_SHORTCUT_REPLACE_EXISTING; | 594 INSTALL_SHORTCUT_REPLACE_EXISTING; |
544 if (result == installer::FIRST_INSTALL_SUCCESS || | 595 if (result == installer::FIRST_INSTALL_SUCCESS || |
545 result == installer::INSTALL_REPAIRED) { | 596 result == installer::INSTALL_REPAIRED) { |
546 install_operation = INSTALL_SHORTCUT_CREATE_ALL; | 597 install_operation = INSTALL_SHORTCUT_CREATE_ALL; |
547 } | 598 } |
548 | 599 |
549 if (installer_state.system_install()) { | 600 if (installer_state.system_install()) { |
550 // Update existing all-users shortcuts for legacy installs. | 601 // Update existing all-users shortcuts for legacy installs. |
551 CreateOrUpdateShortcuts(chrome_exe, *chrome_install, prefs, ALL_USERS, | 602 CreateOrUpdateShortcuts(chrome_exe, *chrome_product, prefs, ALL_USERS, |
552 INSTALL_SHORTCUT_REPLACE_EXISTING); | 603 INSTALL_SHORTCUT_REPLACE_EXISTING); |
553 } | 604 } |
554 // Always install per-user shortcuts (even on system-level installs where | 605 // Always install per-user shortcuts (even on system-level installs where |
555 // we do so for the installing user instead of waiting for Active Setup). | 606 // we do so for the installing user instead of waiting for Active Setup). |
556 CreateOrUpdateShortcuts(chrome_exe, *chrome_install, prefs, CURRENT_USER, | 607 CreateOrUpdateShortcuts(chrome_exe, *chrome_product, prefs, CURRENT_USER, |
557 install_operation); | 608 install_operation); |
558 | 609 |
559 bool make_chrome_default = false; | 610 bool make_chrome_default = false; |
560 prefs.GetBool(master_preferences::kMakeChromeDefault, | 611 prefs.GetBool(master_preferences::kMakeChromeDefault, |
561 &make_chrome_default); | 612 &make_chrome_default); |
562 | 613 |
563 // If this is not the user's first Chrome install, but they have chosen | 614 // If this is not the user's first Chrome install, but they have chosen |
564 // Chrome to become their default browser on the download page, we must | 615 // Chrome to become their default browser on the download page, we must |
565 // force it here because the master_preferences file will not get copied | 616 // force it here because the master_preferences file will not get copied |
566 // into the build. | 617 // into the build. |
567 bool force_chrome_default_for_user = false; | 618 bool force_chrome_default_for_user = false; |
568 if (result == NEW_VERSION_UPDATED || | 619 if (result == NEW_VERSION_UPDATED || |
569 result == INSTALL_REPAIRED) { | 620 result == INSTALL_REPAIRED) { |
570 prefs.GetBool(master_preferences::kMakeChromeDefaultForUser, | 621 prefs.GetBool(master_preferences::kMakeChromeDefaultForUser, |
571 &force_chrome_default_for_user); | 622 &force_chrome_default_for_user); |
572 } | 623 } |
573 | 624 |
574 installer_state.UpdateStage(installer::REGISTERING_CHROME); | 625 installer_state.UpdateStage(installer::REGISTERING_CHROME); |
575 | 626 |
576 RegisterChromeOnMachine(installer_state, *chrome_install, | 627 RegisterChromeOnMachine(installer_state, *chrome_product, |
577 make_chrome_default || force_chrome_default_for_user); | 628 make_chrome_default || force_chrome_default_for_user); |
578 | 629 |
579 if (result == FIRST_INSTALL_SUCCESS) { | 630 if (result == FIRST_INSTALL_SUCCESS) { |
580 installer_state.UpdateStage(installer::CONFIGURE_AUTO_LAUNCH); | 631 installer_state.UpdateStage(installer::CONFIGURE_AUTO_LAUNCH); |
581 | 632 |
582 // Add auto-launch key if specified in master preferences. | 633 // Add auto-launch key if specified in master_preferences. |
583 bool auto_launch_chrome = false; | 634 bool auto_launch_chrome = false; |
584 prefs.GetBool( | 635 prefs.GetBool( |
585 installer::master_preferences::kAutoLaunchChrome, | 636 installer::master_preferences::kAutoLaunchChrome, |
586 &auto_launch_chrome); | 637 &auto_launch_chrome); |
587 if (auto_launch_chrome) { | 638 if (auto_launch_chrome) { |
588 auto_launch_util::EnableForegroundStartAtLogin( | 639 auto_launch_util::EnableForegroundStartAtLogin( |
589 ASCIIToUTF16(chrome::kInitialProfile), | 640 ASCIIToUTF16(chrome::kInitialProfile), |
590 installer_state.target_path()); | 641 installer_state.target_path()); |
591 } | 642 } |
592 } | 643 } |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
648 INSTALL_SHORTCUT_CREATE_EACH_IF_NO_SYSTEM_LEVEL); | 699 INSTALL_SHORTCUT_CREATE_EACH_IF_NO_SYSTEM_LEVEL); |
649 | 700 |
650 // Read master_preferences copied beside chrome.exe at install. | 701 // Read master_preferences copied beside chrome.exe at install. |
651 MasterPreferences prefs(installation_root.AppendASCII(kDefaultMasterPrefs)); | 702 MasterPreferences prefs(installation_root.AppendASCII(kDefaultMasterPrefs)); |
652 FilePath chrome_exe(installation_root.Append(kChromeExe)); | 703 FilePath chrome_exe(installation_root.Append(kChromeExe)); |
653 CreateOrUpdateShortcuts( | 704 CreateOrUpdateShortcuts( |
654 chrome_exe, chrome, prefs, CURRENT_USER, install_operation); | 705 chrome_exe, chrome, prefs, CURRENT_USER, install_operation); |
655 } | 706 } |
656 | 707 |
657 } // namespace installer | 708 } // namespace installer |
OLD | NEW |