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

Side by Side Diff: chrome/installer/setup/install.cc

Issue 11465025: Keep installing all-users Start Menu and Desktop shortcuts on system-level installs. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years 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) 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>
(...skipping 356 matching lines...) Expand 10 before | Expand all | Expand 10 after
367 << " to " << src_path.value(); 367 << " to " << src_path.value();
368 return true; 368 return true;
369 } else { 369 } else {
370 PLOG(ERROR) << "Error writing " << installer::kVisualElementsManifest 370 PLOG(ERROR) << "Error writing " << installer::kVisualElementsManifest
371 << " to " << src_path.value(); 371 << " to " << src_path.value();
372 return false; 372 return false;
373 } 373 }
374 } 374 }
375 } 375 }
376 376
377 // TODO(tommi): Change this function to use WorkItemList. 377 // TODO(tommi): Change this function to use WorkItemList.
robertshield 2012/12/10 20:58:28 since we don't generally roll back on failure, you
gab 2012/12/10 21:50:32 Done.
378 void CreateOrUpdateShortcuts( 378 void CreateOrUpdateShortcuts(
379 const FilePath& target, 379 const FilePath& target,
380 const Product& product, 380 const Product& product,
381 const MasterPreferences& prefs, 381 const MasterPreferences& prefs,
382 InstallShortcutLevel install_level, 382 InstallShortcutLevel install_level,
383 InstallShortcutOperation install_operation) { 383 InstallShortcutOperation install_operation) {
384 // Extract shortcut preferences from |prefs|. 384 // Extract shortcut preferences from |prefs|.
385 bool do_not_create_desktop_shortcut = false; 385 bool do_not_create_desktop_shortcut = false;
386 bool do_not_create_quick_launch_shortcut = false; 386 bool do_not_create_quick_launch_shortcut = false;
387 bool alternate_desktop_shortcut = false; 387 bool alternate_desktop_shortcut = false;
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
435 shortcut_operation == ShellUtil::SHELL_SHORTCUT_REPLACE_EXISTING) { 435 shortcut_operation == ShellUtil::SHELL_SHORTCUT_REPLACE_EXISTING) {
436 desktop_properties.set_shortcut_name(dist->GetAlternateApplicationName()); 436 desktop_properties.set_shortcut_name(dist->GetAlternateApplicationName());
437 ExecuteAndLogShortcutOperation( 437 ExecuteAndLogShortcutOperation(
438 ShellUtil::SHORTCUT_LOCATION_DESKTOP, dist, desktop_properties, 438 ShellUtil::SHORTCUT_LOCATION_DESKTOP, dist, desktop_properties,
439 shortcut_operation); 439 shortcut_operation);
440 } 440 }
441 } 441 }
442 442
443 if (!do_not_create_quick_launch_shortcut || 443 if (!do_not_create_quick_launch_shortcut ||
444 shortcut_operation == ShellUtil::SHELL_SHORTCUT_REPLACE_EXISTING) { 444 shortcut_operation == ShellUtil::SHELL_SHORTCUT_REPLACE_EXISTING) {
445 // There is no such thing as an all-users Quick Launch shortcut, always
446 // install the per-user shortcut.
447 ShellUtil::ShortcutProperties quick_launch_properties(base_properties);
448 quick_launch_properties.level = ShellUtil::CURRENT_USER;
445 ExecuteAndLogShortcutOperation( 449 ExecuteAndLogShortcutOperation(
446 ShellUtil::SHORTCUT_LOCATION_QUICK_LAUNCH, dist, base_properties, 450 ShellUtil::SHORTCUT_LOCATION_QUICK_LAUNCH, dist,
447 shortcut_operation); 451 quick_launch_properties, shortcut_operation);
448 } 452 }
449 453
450 ShellUtil::ShortcutProperties start_menu_properties(base_properties); 454 ShellUtil::ShortcutProperties start_menu_properties(base_properties);
451 // IMPORTANT: Only the default (no arguments and default browserappid) browser 455 // IMPORTANT: Only the default (no arguments and default browserappid) browser
452 // shortcut in the Start menu (Start screen on Win8+) should be made dual 456 // shortcut in the Start menu (Start screen on Win8+) should be made dual
453 // mode. 457 // mode.
454 start_menu_properties.set_dual_mode(true); 458 start_menu_properties.set_dual_mode(true);
455 if (shortcut_operation == ShellUtil::SHELL_SHORTCUT_CREATE_ALWAYS || 459 if (shortcut_operation == ShellUtil::SHELL_SHORTCUT_CREATE_ALWAYS ||
456 shortcut_operation == 460 shortcut_operation ==
457 ShellUtil::SHELL_SHORTCUT_CREATE_IF_NO_SYSTEM_LEVEL) { 461 ShellUtil::SHELL_SHORTCUT_CREATE_IF_NO_SYSTEM_LEVEL) {
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
564 568
565 const Product* chrome_product = 569 const Product* chrome_product =
566 installer_state.FindProduct(BrowserDistribution::CHROME_BROWSER); 570 installer_state.FindProduct(BrowserDistribution::CHROME_BROWSER);
567 // Creates shortcuts for Chrome. 571 // Creates shortcuts for Chrome.
568 if (chrome_product) { 572 if (chrome_product) {
569 BrowserDistribution* dist = chrome_product->distribution(); 573 BrowserDistribution* dist = chrome_product->distribution();
570 const FilePath chrome_exe( 574 const FilePath chrome_exe(
571 installer_state.target_path().Append(kChromeExe)); 575 installer_state.target_path().Append(kChromeExe));
572 CleanupLegacyShortcuts(installer_state, dist, chrome_exe); 576 CleanupLegacyShortcuts(installer_state, dist, chrome_exe);
573 577
578 // Install per-user shortcuts on user-level installs and all-users
579 // shortcuts on system-level installs. Note that Active Setup will take
580 // care of installing missing per-user shortcuts on system-level install
581 // (i.e., quick launch, taskbar pin, and possibly deleted all-users
582 // shortcuts).
583 InstallShortcutLevel install_level = installer_state.system_install() ?
584 ALL_USERS : CURRENT_USER;
585
574 InstallShortcutOperation install_operation = 586 InstallShortcutOperation install_operation =
575 INSTALL_SHORTCUT_REPLACE_EXISTING; 587 INSTALL_SHORTCUT_REPLACE_EXISTING;
576 if (result == installer::FIRST_INSTALL_SUCCESS || 588 if (result == installer::FIRST_INSTALL_SUCCESS ||
577 result == installer::INSTALL_REPAIRED) { 589 result == installer::INSTALL_REPAIRED) {
578 install_operation = INSTALL_SHORTCUT_CREATE_ALL; 590 install_operation = INSTALL_SHORTCUT_CREATE_ALL;
579 } 591 }
580 592
581 if (installer_state.system_install()) { 593 CreateOrUpdateShortcuts(chrome_exe, *chrome_product, prefs, install_level,
582 // Update existing all-users shortcuts for legacy installs.
583 CreateOrUpdateShortcuts(chrome_exe, *chrome_product, prefs, ALL_USERS,
584 INSTALL_SHORTCUT_REPLACE_EXISTING);
585 }
586 // Always install per-user shortcuts (even on system-level installs where
587 // we do so for the installing user instead of waiting for Active Setup).
588 CreateOrUpdateShortcuts(chrome_exe, *chrome_product, prefs, CURRENT_USER,
589 install_operation); 594 install_operation);
590 } 595 }
591 596
592 if (chrome_product) { 597 if (chrome_product) {
593 // Register Chrome and, if requested, make Chrome the default browser. 598 // Register Chrome and, if requested, make Chrome the default browser.
594 installer_state.UpdateStage(installer::REGISTERING_CHROME); 599 installer_state.UpdateStage(installer::REGISTERING_CHROME);
595 600
596 bool make_chrome_default = false; 601 bool make_chrome_default = false;
597 prefs.GetBool(master_preferences::kMakeChromeDefault, 602 prefs.GetBool(master_preferences::kMakeChromeDefault,
598 &make_chrome_default); 603 &make_chrome_default);
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
645 // Upon upgrading to Windows 8, we need to fix Chrome shortcuts and register 650 // Upon upgrading to Windows 8, we need to fix Chrome shortcuts and register
646 // Chrome, so that Metro Chrome would work if Chrome is the default browser. 651 // Chrome, so that Metro Chrome would work if Chrome is the default browser.
647 if (base::win::GetVersion() >= base::win::VERSION_WIN8) { 652 if (base::win::GetVersion() >= base::win::VERSION_WIN8) {
648 VLOG(1) << "Updating and registering shortcuts."; 653 VLOG(1) << "Updating and registering shortcuts.";
649 // Read master_preferences copied beside chrome.exe at install. 654 // Read master_preferences copied beside chrome.exe at install.
650 MasterPreferences prefs( 655 MasterPreferences prefs(
651 installer_state.target_path().AppendASCII(kDefaultMasterPrefs)); 656 installer_state.target_path().AppendASCII(kDefaultMasterPrefs));
652 657
653 // Unfortunately, if this is a system-level install, we can't update the 658 // Unfortunately, if this is a system-level install, we can't update the
654 // shortcuts of each individual user (this only matters if this is an OS 659 // shortcuts of each individual user (this only matters if this is an OS
655 // upgrade for XP/Vista to Win7+ as some properties are only set on 660 // upgrade from XP/Vista to Win7+ as some properties are only set on
656 // shortcuts as of Win7). 661 // shortcuts as of Win7).
657 // At least attempt to update potentially existing all-users shortcuts. 662 // At least attempt to update potentially existing all-users shortcuts.
658 InstallShortcutLevel level = installer_state.system_install() ? 663 InstallShortcutLevel level = installer_state.system_install() ?
659 ALL_USERS : CURRENT_USER; 664 ALL_USERS : CURRENT_USER;
660 FilePath chrome_exe(installer_state.target_path().Append(kChromeExe)); 665 FilePath chrome_exe(installer_state.target_path().Append(kChromeExe));
661 CreateOrUpdateShortcuts( 666 CreateOrUpdateShortcuts(
662 chrome_exe, chrome, prefs, level, INSTALL_SHORTCUT_REPLACE_EXISTING); 667 chrome_exe, chrome, prefs, level, INSTALL_SHORTCUT_REPLACE_EXISTING);
663 RegisterChromeOnMachine(installer_state, chrome, false); 668 RegisterChromeOnMachine(installer_state, chrome, false);
664 } 669 }
665 } 670 }
666 671
667 // NOTE: Should the work done here, on Active Setup, change: kActiveSetupVersion 672 // NOTE: Should the work done here, on Active Setup, change: kActiveSetupVersion
668 // in install_worker.cc needs to be increased for Active Setup to invoke this 673 // in install_worker.cc needs to be increased for Active Setup to invoke this
669 // again for all users of this install. 674 // again for all users of this install.
670 void HandleActiveSetupForBrowser(const FilePath& installation_root, 675 void HandleActiveSetupForBrowser(const FilePath& installation_root,
671 const Product& chrome, 676 const Product& chrome,
672 bool force) { 677 bool force) {
673 DCHECK(chrome.is_chrome()); 678 DCHECK(chrome.is_chrome());
674 // Only create shortcuts on Active Setup if the first run sentinel is not 679 // Only create shortcuts on Active Setup if the first run sentinel is not
675 // present for this user (as some shortcuts used to be installed on first 680 // present for this user (as some shortcuts used to be installed on first
676 // run and this could otherwise re-install shortcuts for users that have 681 // run and this could otherwise re-install shortcuts for users that have
677 // already deleted them in the past). 682 // already deleted them in the past).
678 FilePath first_run_sentinel; 683 FilePath first_run_sentinel;
679 InstallUtil::GetSentinelFilePath( 684 InstallUtil::GetSentinelFilePath(
680 chrome::kFirstRunSentinel, chrome.distribution(), &first_run_sentinel); 685 chrome::kFirstRunSentinel, chrome.distribution(), &first_run_sentinel);
686 // Decide whether to create the shortcuts or simply replace existing
687 // shortcuts; if the decision is to create them, only shortcuts whose matching
688 // all-users shortcut isn't present on the system will be created.
681 InstallShortcutOperation install_operation = 689 InstallShortcutOperation install_operation =
682 (!force && file_util::PathExists(first_run_sentinel) ? 690 (!force && file_util::PathExists(first_run_sentinel) ?
683 INSTALL_SHORTCUT_REPLACE_EXISTING : 691 INSTALL_SHORTCUT_REPLACE_EXISTING :
684 INSTALL_SHORTCUT_CREATE_EACH_IF_NO_SYSTEM_LEVEL); 692 INSTALL_SHORTCUT_CREATE_EACH_IF_NO_SYSTEM_LEVEL);
685 693
686 // Read master_preferences copied beside chrome.exe at install. 694 // Read master_preferences copied beside chrome.exe at install.
687 MasterPreferences prefs(installation_root.AppendASCII(kDefaultMasterPrefs)); 695 MasterPreferences prefs(installation_root.AppendASCII(kDefaultMasterPrefs));
688 FilePath chrome_exe(installation_root.Append(kChromeExe)); 696 FilePath chrome_exe(installation_root.Append(kChromeExe));
689 CreateOrUpdateShortcuts( 697 CreateOrUpdateShortcuts(
690 chrome_exe, chrome, prefs, CURRENT_USER, install_operation); 698 chrome_exe, chrome, prefs, CURRENT_USER, install_operation);
691 } 699 }
692 700
693 } // namespace installer 701 } // namespace installer
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698