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

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

Issue 11146003: Remove the run verb on Windows 8. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 2 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
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 // 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 221 matching lines...) Expand 10 before | Expand all | Expand 10 after
232 // DelegateExecute ProgId. Needed for Chrome Metro in Windows 8. 232 // DelegateExecute ProgId. Needed for Chrome Metro in Windows 8.
233 if (set_delegate_execute) { 233 if (set_delegate_execute) {
234 string16 model_id_shell(ShellUtil::kRegClasses); 234 string16 model_id_shell(ShellUtil::kRegClasses);
235 model_id_shell.push_back(FilePath::kSeparators[0]); 235 model_id_shell.push_back(FilePath::kSeparators[0]);
236 model_id_shell.append(app_id); 236 model_id_shell.append(app_id);
237 model_id_shell.append(ShellUtil::kRegExePath); 237 model_id_shell.append(ShellUtil::kRegExePath);
238 model_id_shell.append(ShellUtil::kRegShellPath); 238 model_id_shell.append(ShellUtil::kRegShellPath);
239 239
240 // <root hkey>\Software\Classes\<app_id>\.exe\shell @=open 240 // <root hkey>\Software\Classes\<app_id>\.exe\shell @=open
241 entries->push_back(new RegistryEntry(model_id_shell, 241 entries->push_back(new RegistryEntry(model_id_shell,
242 ShellUtil::kRegVerbOpen)); 242 ShellUtil::kRegVerbOpen));
243 243
244 const wchar_t* const verbs[] = { ShellUtil::kRegVerbOpen, 244 const wchar_t* const verbs[] = { ShellUtil::kRegVerbOpen,
245 ShellUtil::kRegVerbOpenNewWindow, 245 ShellUtil::kRegVerbOpenNewWindow };
246 ShellUtil::kRegVerbRun };
247 for (size_t i = 0; i < arraysize(verbs); ++i) { 246 for (size_t i = 0; i < arraysize(verbs); ++i) {
248 string16 sub_path(model_id_shell); 247 string16 sub_path(model_id_shell);
249 sub_path.push_back(FilePath::kSeparators[0]); 248 sub_path.push_back(FilePath::kSeparators[0]);
250 sub_path.append(verbs[i]); 249 sub_path.append(verbs[i]);
251 250
252 // <root hkey>\Software\Classes\<app_id>\.exe\shell\<verb> 251 // <root hkey>\Software\Classes\<app_id>\.exe\shell\<verb>
253 entries->push_back(new RegistryEntry( 252 entries->push_back(new RegistryEntry(
254 sub_path, L"CommandId", L"Browser.Launch")); 253 sub_path, L"CommandId", L"Browser.Launch"));
255 254
256 sub_path.push_back(FilePath::kSeparators[0]); 255 sub_path.push_back(FilePath::kSeparators[0]);
(...skipping 476 matching lines...) Expand 10 before | Expand all | Expand 10 after
733 return false; 732 return false;
734 hr = aarui->LaunchAdvancedAssociationUI(app_id.c_str()); 733 hr = aarui->LaunchAdvancedAssociationUI(app_id.c_str());
735 return SUCCEEDED(hr); 734 return SUCCEEDED(hr);
736 } 735 }
737 736
738 // As of r133333, the DelegateExecute verb handler was being registered for 737 // As of r133333, the DelegateExecute verb handler was being registered for
739 // Google Chrome installs on Windows 8 even though the binary itself wasn't 738 // Google Chrome installs on Windows 8 even though the binary itself wasn't
740 // present. This affected Chrome 20.0.1115.1 on the dev channel (and anyone who 739 // present. This affected Chrome 20.0.1115.1 on the dev channel (and anyone who
741 // pulled a Canary >= 20.0.1112.0 and installed it manually as Google Chrome). 740 // pulled a Canary >= 20.0.1112.0 and installed it manually as Google Chrome).
742 // This egregious hack is here to remove the bad values for those installs, and 741 // This egregious hack is here to remove the bad values for those installs, and
743 // should be removed after a reasonable time, say 2012-08-01. Anyone on Win8 742 // should be removed after a reasonable time, say 2012-08-01 (pushed back see
grt (UTC plus 2) 2012/10/13 00:34:26 what do you think about retiring the old "remove b
gab 2012/10/13 03:33:12 Yea, I was tempted by that, but I want to merge th
grt (UTC plus 2) 2012/10/13 13:21:37 Okay
744 // dev channel who hasn't been autoupdated or manually updated by then will have 743 // below). Anyone on Win8 dev channel who hasn't been autoupdated or manually
745 // to uninstall and reinstall Chrome to repair. See http://crbug.com/124666 and 744 // updated by then will have to uninstall and reinstall Chrome to repair.
746 // http://crbug.com/123994 for gory details. 745 // See http://crbug.com/124666 and http://crbug.com/123994 for gory details.
747 // This function is also used to remove DelegateExecute verb handler 746 // This function is also used to remove DelegateExecute verb handler
748 // registrations on builds for which Metro is no longer supported. This will 747 // registrations on builds for which Metro is no longer supported. This will
749 // also become irrelevant sometime after Windows 8 RC (thus the aforementioned 748 // also become irrelevant sometime after Windows 8 RC (thus the aforementioned
750 // removal date remains correct). 749 // removal date remains correct).
750 // For installs where we do register the Windows 8 only registrations, this
751 // method will clean up an old verb (run) we used to register in
752 // <root>\Software\Classes\Chrome<suffix>\.exe\shell\run.
753 // TODO (gab): This was fixed before the official release of Windows 8 and thus
grt (UTC plus 2) 2012/10/13 00:34:26 i think it's too late for this to be on stable bef
gab 2012/10/13 03:33:12 As mentioned above, my intent is to merge it in bo
grt (UTC plus 2) 2012/10/13 13:21:37 Merging it will not guarantee that.
grt (UTC plus 2) 2012/10/13 17:50:29 To elaborate, there will be a population of machin
gab 2012/10/13 19:02:09 Right, but see my reply/clarification on the bug.
gab 2012/10/15 21:15:57 Done.
754 // can safely be removed in February 2013.
751 void RemoveBadWindows8RegistrationIfNeeded( 755 void RemoveBadWindows8RegistrationIfNeeded(
752 BrowserDistribution* dist, 756 BrowserDistribution* dist,
753 const string16& chrome_exe) { 757 const string16& chrome_exe) {
758 // There's no need to rollback, so forgo the usual work item lists and just
759 // remove the values from the registry.
760 bool is_per_user_install =
761 InstallUtil::IsPerUserInstall(chrome_exe.c_str());
762 const HKEY root_key = is_per_user_install ? HKEY_CURRENT_USER :
763 HKEY_LOCAL_MACHINE;
754 if (dist->GetCommandExecuteImplClsid(NULL) && 764 if (dist->GetCommandExecuteImplClsid(NULL) &&
755 (!InstallUtil::HasDelegateExecuteHandler(dist, chrome_exe) || 765 (!InstallUtil::HasDelegateExecuteHandler(dist, chrome_exe) ||
756 !IsChromeMetroSupported())) { 766 !IsChromeMetroSupported())) {
757 // There's no need to rollback, so forgo the usual work item lists and just
758 // remove the values from the registry.
759 bool is_per_user_install =
760 InstallUtil::IsPerUserInstall(chrome_exe.c_str());
761 const HKEY root_key = is_per_user_install ? HKEY_CURRENT_USER :
762 HKEY_LOCAL_MACHINE;
763 // Use the current installation's suffix, not the about-to-be-installed 767 // Use the current installation's suffix, not the about-to-be-installed
764 // suffix. 768 // suffix.
765 const string16 installation_suffix( 769 const string16 installation_suffix(
766 ShellUtil::GetCurrentInstallationSuffix(dist, chrome_exe)); 770 ShellUtil::GetCurrentInstallationSuffix(dist, chrome_exe));
767 const string16 app_id(ShellUtil::GetBrowserModelId(dist, 771 const string16 app_id(ShellUtil::GetBrowserModelId(dist,
768 is_per_user_install)); 772 is_per_user_install));
769 773
770 // <root hkey>\Software\Classes\<app_id> 774 // <root hkey>\Software\Classes\<app_id>
771 string16 key(ShellUtil::kRegClasses); 775 string16 key(ShellUtil::kRegClasses);
772 key.push_back(FilePath::kSeparators[0]); 776 key.push_back(FilePath::kSeparators[0]);
773 key.append(app_id); 777 key.append(app_id);
774 InstallUtil::DeleteRegistryKey(root_key, key); 778 InstallUtil::DeleteRegistryKey(root_key, key);
775 779
776 // <root hkey>\Software\Classes\ChromiumHTML[.user]\shell\open\command 780 // <root hkey>\Software\Classes\ChromiumHTML[.user]\shell\open\command
777 key = ShellUtil::kRegClasses; 781 key = ShellUtil::kRegClasses;
778 key.push_back(FilePath::kSeparators[0]); 782 key.push_back(FilePath::kSeparators[0]);
779 key.append(GetBrowserProgId(installation_suffix)); 783 key.append(GetBrowserProgId(installation_suffix));
780 key.append(ShellUtil::kRegShellOpen); 784 key.append(ShellUtil::kRegShellOpen);
781 InstallUtil::DeleteRegistryValue(root_key, key, 785 InstallUtil::DeleteRegistryValue(root_key, key,
782 ShellUtil::kRegDelegateExecute); 786 ShellUtil::kRegDelegateExecute);
787 } else {
788 string16 run_verb_key(ShellUtil::kRegClasses);
grt (UTC plus 2) 2012/10/13 00:34:26 this code is nearly impenetrable. please add a com
gab 2012/10/13 03:33:12 Done.
789 run_verb_key.push_back(FilePath::kSeparators[0]);
790 run_verb_key.append(ShellUtil::GetBrowserModelId(
791 dist, InstallUtil::IsPerUserInstall(chrome_exe.c_str())));
792 run_verb_key.append(ShellUtil::kRegExePath);
793 run_verb_key.append(ShellUtil::kRegShellPath);
794 run_verb_key.push_back(FilePath::kSeparators[0]);
795 run_verb_key.append(ShellUtil::kRegVerbRun);
796 InstallUtil::DeleteRegistryKey(root_key, run_verb_key);
grt (UTC plus 2) 2012/10/13 00:34:26 this could be in HKCU even for a system-level inst
gab 2012/10/13 03:33:12 No, on Win8 all user level stuff is in HKCU and sy
grt (UTC plus 2) 2012/10/13 13:21:37 I expect there to be a great number of machines up
gab 2012/10/13 15:17:50 Well technically if this is merged in M22 and M23
grt (UTC plus 2) 2012/10/13 17:50:29 Ah, I just realized that the Win7 -> Win8 path is
gab 2012/10/13 19:02:09 Well not quite, the migration can also happen on n
783 } 797 }
784 } 798 }
785 799
786 // Returns true if the current install's |chrome_exe| has been registered with 800 // Returns true if the current install's |chrome_exe| has been registered with
787 // |suffix|. 801 // |suffix|.
788 // |confirmation_level| is the level of verification desired as described in 802 // |confirmation_level| is the level of verification desired as described in
789 // the RegistrationConfirmationLevel enum above. 803 // the RegistrationConfirmationLevel enum above.
790 // |suffix| can be the empty string (this is used to support old installs 804 // |suffix| can be the empty string (this is used to support old installs
791 // where we used to not suffix user-level installs if they were the first to 805 // where we used to not suffix user-level installs if they were the first to
792 // request the non-suffixed registry entries on the machine). 806 // request the non-suffixed registry entries on the machine).
(...skipping 945 matching lines...) Expand 10 before | Expand all | Expand 10 after
1738 // are any left...). 1752 // are any left...).
1739 if (free_bits >= 8 && next_byte_index < size) { 1753 if (free_bits >= 8 && next_byte_index < size) {
1740 free_bits -= 8; 1754 free_bits -= 8;
1741 bit_stream += bytes[next_byte_index++] << free_bits; 1755 bit_stream += bytes[next_byte_index++] << free_bits;
1742 } 1756 }
1743 } 1757 }
1744 1758
1745 DCHECK_EQ(ret.length(), encoded_length); 1759 DCHECK_EQ(ret.length(), encoded_length);
1746 return ret; 1760 return ret;
1747 } 1761 }
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698