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 // This file defines functions that integrate Chrome in Windows shell. These | 5 // This file defines functions that integrate Chrome in Windows shell. These |
6 // functions can be used by Chrome as well as Chrome installer. All of the | 6 // functions can be used by Chrome as well as Chrome installer. All of the |
7 // work is done by the local functions defined in anonymous namespace in | 7 // work is done by the local functions defined in anonymous namespace in |
8 // this class. | 8 // this class. |
9 | 9 |
10 #include "chrome/installer/util/shell_util.h" | 10 #include "chrome/installer/util/shell_util.h" |
(...skipping 332 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
343 } | 343 } |
344 } | 344 } |
345 | 345 |
346 // This method returns a list of all the registry entries that are needed to | 346 // This method returns a list of all the registry entries that are needed to |
347 // register this installation's ProgId and AppId. These entries need to be | 347 // register this installation's ProgId and AppId. These entries need to be |
348 // registered in HKLM prior to Win8. | 348 // registered in HKLM prior to Win8. |
349 void GetChromeProgIdEntries(BrowserDistribution* dist, | 349 void GetChromeProgIdEntries(BrowserDistribution* dist, |
350 const base::FilePath& chrome_exe, | 350 const base::FilePath& chrome_exe, |
351 const base::string16& suffix, | 351 const base::string16& suffix, |
352 ScopedVector<RegistryEntry>* entries) { | 352 ScopedVector<RegistryEntry>* entries) { |
353 int chrome_icon_index = | 353 int chrome_icon_index = dist->GetIconIndex(); |
354 dist->GetIconIndex(BrowserDistribution::SHORTCUT_CHROME); | |
355 | 354 |
356 ApplicationInfo app_info; | 355 ApplicationInfo app_info; |
357 app_info.prog_id = GetBrowserProgId(suffix); | 356 app_info.prog_id = GetBrowserProgId(suffix); |
358 app_info.file_type_name = dist->GetBrowserProgIdDesc(); | 357 app_info.file_type_name = dist->GetBrowserProgIdDesc(); |
359 // File types associated with Chrome are just given the Chrome icon. | 358 // File types associated with Chrome are just given the Chrome icon. |
360 app_info.file_type_icon_path = chrome_exe; | 359 app_info.file_type_icon_path = chrome_exe; |
361 app_info.file_type_icon_index = chrome_icon_index; | 360 app_info.file_type_icon_index = chrome_icon_index; |
362 app_info.command_line = ShellUtil::GetChromeShellOpenCmd(chrome_exe); | 361 app_info.command_line = ShellUtil::GetChromeShellOpenCmd(chrome_exe); |
363 // For user-level installs: entries for the app id will be in HKCU; thus we | 362 // For user-level installs: entries for the app id will be in HKCU; thus we |
364 // do not need a suffix on those entries. | 363 // do not need a suffix on those entries. |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
405 | 404 |
406 // This method returns a list of the registry entries required to register this | 405 // This method returns a list of the registry entries required to register this |
407 // installation in "RegisteredApplications" on Windows (to appear in Default | 406 // installation in "RegisteredApplications" on Windows (to appear in Default |
408 // Programs, StartMenuInternet, etc.). These entries need to be registered in | 407 // Programs, StartMenuInternet, etc.). These entries need to be registered in |
409 // HKLM prior to Win8. If |suffix| is not empty, these entries are guaranteed to | 408 // HKLM prior to Win8. If |suffix| is not empty, these entries are guaranteed to |
410 // be unique on this machine. | 409 // be unique on this machine. |
411 void GetShellIntegrationEntries(BrowserDistribution* dist, | 410 void GetShellIntegrationEntries(BrowserDistribution* dist, |
412 const base::FilePath& chrome_exe, | 411 const base::FilePath& chrome_exe, |
413 const base::string16& suffix, | 412 const base::string16& suffix, |
414 ScopedVector<RegistryEntry>* entries) { | 413 ScopedVector<RegistryEntry>* entries) { |
415 const base::string16 icon_path(ShellUtil::FormatIconLocation( | 414 const base::string16 icon_path( |
416 chrome_exe, dist->GetIconIndex(BrowserDistribution::SHORTCUT_CHROME))); | 415 ShellUtil::FormatIconLocation(chrome_exe, dist->GetIconIndex())); |
417 const base::string16 quoted_exe_path(L"\"" + chrome_exe.value() + L"\""); | 416 const base::string16 quoted_exe_path(L"\"" + chrome_exe.value() + L"\""); |
418 | 417 |
419 // Register for the Start Menu "Internet" link (pre-Win7). | 418 // Register for the Start Menu "Internet" link (pre-Win7). |
420 const base::string16 start_menu_entry(GetBrowserClientKey(dist, suffix)); | 419 const base::string16 start_menu_entry(GetBrowserClientKey(dist, suffix)); |
421 // Register Chrome's display name. | 420 // Register Chrome's display name. |
422 // TODO(grt): http://crbug.com/75152 Also set LocalizedString; see | 421 // TODO(grt): http://crbug.com/75152 Also set LocalizedString; see |
423 // http://msdn.microsoft.com/en-us/library/windows/desktop/cc144109(v=VS.85).a
spx#registering_the_display_name | 422 // http://msdn.microsoft.com/en-us/library/windows/desktop/cc144109(v=VS.85).a
spx#registering_the_display_name |
424 entries->push_back( | 423 entries->push_back( |
425 new RegistryEntry(start_menu_entry, dist->GetDisplayName())); | 424 new RegistryEntry(start_menu_entry, dist->GetDisplayName())); |
426 // Register the "open" verb for launching Chrome via the "Internet" link. | 425 // Register the "open" verb for launching Chrome via the "Internet" link. |
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
593 ScopedVector<RegistryEntry>* entries) { | 592 ScopedVector<RegistryEntry>* entries) { |
594 // File extension associations. | 593 // File extension associations. |
595 base::string16 html_prog_id(GetBrowserProgId(suffix)); | 594 base::string16 html_prog_id(GetBrowserProgId(suffix)); |
596 for (int i = 0; ShellUtil::kDefaultFileAssociations[i] != NULL; i++) { | 595 for (int i = 0; ShellUtil::kDefaultFileAssociations[i] != NULL; i++) { |
597 GetAppDefaultRegistrationEntries( | 596 GetAppDefaultRegistrationEntries( |
598 html_prog_id, ShellUtil::kDefaultFileAssociations[i], true, entries); | 597 html_prog_id, ShellUtil::kDefaultFileAssociations[i], true, entries); |
599 } | 598 } |
600 | 599 |
601 // Protocols associations. | 600 // Protocols associations. |
602 base::string16 chrome_open = ShellUtil::GetChromeShellOpenCmd(chrome_exe); | 601 base::string16 chrome_open = ShellUtil::GetChromeShellOpenCmd(chrome_exe); |
603 base::string16 chrome_icon = ShellUtil::FormatIconLocation( | 602 base::string16 chrome_icon = |
604 chrome_exe, dist->GetIconIndex(BrowserDistribution::SHORTCUT_CHROME)); | 603 ShellUtil::FormatIconLocation(chrome_exe, dist->GetIconIndex()); |
605 for (int i = 0; ShellUtil::kBrowserProtocolAssociations[i] != NULL; i++) { | 604 for (int i = 0; ShellUtil::kBrowserProtocolAssociations[i] != NULL; i++) { |
606 GetXPStyleUserProtocolEntries(ShellUtil::kBrowserProtocolAssociations[i], | 605 GetXPStyleUserProtocolEntries(ShellUtil::kBrowserProtocolAssociations[i], |
607 chrome_icon, chrome_open, entries); | 606 chrome_icon, chrome_open, entries); |
608 } | 607 } |
609 | 608 |
610 // start->Internet shortcut. | 609 // start->Internet shortcut. |
611 base::string16 start_menu(ShellUtil::kRegStartMenuInternet); | 610 base::string16 start_menu(ShellUtil::kRegStartMenuInternet); |
612 base::string16 app_name = dist->GetBaseAppName() + suffix; | 611 base::string16 app_name = dist->GetBaseAppName() + suffix; |
613 entries->push_back(new RegistryEntry(start_menu, app_name)); | 612 entries->push_back(new RegistryEntry(start_menu, app_name)); |
614 } | 613 } |
(...skipping 297 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
912 // keys directly, we have to do this on Vista+ as well. | 911 // keys directly, we have to do this on Vista+ as well. |
913 // See http://msdn.microsoft.com/library/aa767914.aspx for more details. | 912 // See http://msdn.microsoft.com/library/aa767914.aspx for more details. |
914 bool RegisterChromeAsDefaultProtocolClientXPStyle( | 913 bool RegisterChromeAsDefaultProtocolClientXPStyle( |
915 BrowserDistribution* dist, | 914 BrowserDistribution* dist, |
916 const base::FilePath& chrome_exe, | 915 const base::FilePath& chrome_exe, |
917 const base::string16& protocol) { | 916 const base::string16& protocol) { |
918 ScopedVector<RegistryEntry> entries; | 917 ScopedVector<RegistryEntry> entries; |
919 const base::string16 chrome_open( | 918 const base::string16 chrome_open( |
920 ShellUtil::GetChromeShellOpenCmd(chrome_exe)); | 919 ShellUtil::GetChromeShellOpenCmd(chrome_exe)); |
921 const base::string16 chrome_icon( | 920 const base::string16 chrome_icon( |
922 ShellUtil::FormatIconLocation( | 921 ShellUtil::FormatIconLocation(chrome_exe, dist->GetIconIndex())); |
923 chrome_exe, | |
924 dist->GetIconIndex(BrowserDistribution::SHORTCUT_CHROME))); | |
925 GetXPStyleUserProtocolEntries(protocol, chrome_icon, chrome_open, &entries); | 922 GetXPStyleUserProtocolEntries(protocol, chrome_icon, chrome_open, &entries); |
926 // Change the default protocol handler for current user. | 923 // Change the default protocol handler for current user. |
927 if (!ShellUtil::AddRegistryEntries(HKEY_CURRENT_USER, entries)) { | 924 if (!ShellUtil::AddRegistryEntries(HKEY_CURRENT_USER, entries)) { |
928 LOG(ERROR) << "Could not make Chrome default protocol client (XP)."; | 925 LOG(ERROR) << "Could not make Chrome default protocol client (XP)."; |
929 return false; | 926 return false; |
930 } | 927 } |
931 | 928 |
932 return true; | 929 return true; |
933 } | 930 } |
934 | 931 |
935 // Returns |properties.shortcut_name| if the property is set, otherwise it | 932 // Returns |properties.shortcut_name| if the property is set, otherwise it |
936 // returns dist->GetShortcutName(BrowserDistribution::SHORTCUT_CHROME). In any | 933 // returns dist->GetShortcutName(). In any case, it makes sure the return value |
937 // case, it makes sure the return value is suffixed with ".lnk". | 934 // is suffixed with ".lnk". |
938 base::string16 ExtractShortcutNameFromProperties( | 935 base::string16 ExtractShortcutNameFromProperties( |
939 BrowserDistribution* dist, | 936 BrowserDistribution* dist, |
940 const ShellUtil::ShortcutProperties& properties) { | 937 const ShellUtil::ShortcutProperties& properties) { |
941 DCHECK(dist); | 938 DCHECK(dist); |
942 base::string16 shortcut_name; | 939 base::string16 shortcut_name = properties.has_shortcut_name() |
943 if (properties.has_shortcut_name()) { | 940 ? properties.shortcut_name |
944 shortcut_name = properties.shortcut_name; | 941 : dist->GetShortcutName(); |
945 } else { | |
946 shortcut_name = | |
947 dist->GetShortcutName(BrowserDistribution::SHORTCUT_CHROME); | |
948 } | |
949 | 942 |
950 if (!base::EndsWith(shortcut_name, installer::kLnkExt, | 943 if (!base::EndsWith(shortcut_name, installer::kLnkExt, |
951 base::CompareCase::INSENSITIVE_ASCII)) | 944 base::CompareCase::INSENSITIVE_ASCII)) |
952 shortcut_name.append(installer::kLnkExt); | 945 shortcut_name.append(installer::kLnkExt); |
953 | 946 |
954 return shortcut_name; | 947 return shortcut_name; |
955 } | 948 } |
956 | 949 |
957 // Converts ShellUtil::ShortcutOperation to the best-matching value in | 950 // Converts ShellUtil::ShortcutOperation to the best-matching value in |
958 // base::win::ShortcutOperation. | 951 // base::win::ShortcutOperation. |
(...skipping 1428 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2387 itr != entries.end(); ++itr) | 2380 itr != entries.end(); ++itr) |
2388 (*itr)->AddToWorkItemList(root, items.get()); | 2381 (*itr)->AddToWorkItemList(root, items.get()); |
2389 | 2382 |
2390 // Apply all the registry changes and if there is a problem, rollback | 2383 // Apply all the registry changes and if there is a problem, rollback |
2391 if (!items->Do()) { | 2384 if (!items->Do()) { |
2392 items->Rollback(); | 2385 items->Rollback(); |
2393 return false; | 2386 return false; |
2394 } | 2387 } |
2395 return true; | 2388 return true; |
2396 } | 2389 } |
OLD | NEW |