OLD | NEW |
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 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 <windows.h> | 10 #include <windows.h> |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
68 std::wstring app_key = L"Software\\Classes\\Applications\\" + exe_name + | 68 std::wstring app_key = L"Software\\Classes\\Applications\\" + exe_name + |
69 L"\\shell\\open\\command"; | 69 L"\\shell\\open\\command"; |
70 entries.push_front(new RegistryEntry(app_key, open_cmd)); | 70 entries.push_front(new RegistryEntry(app_key, open_cmd)); |
71 for (int i = 0; ShellUtil::kFileAssociations[i] != NULL; i++) { | 71 for (int i = 0; ShellUtil::kFileAssociations[i] != NULL; i++) { |
72 std::wstring open_with_key(L"Software\\Classes\\"); | 72 std::wstring open_with_key(L"Software\\Classes\\"); |
73 open_with_key.append(ShellUtil::kFileAssociations[i]); | 73 open_with_key.append(ShellUtil::kFileAssociations[i]); |
74 open_with_key.append(L"\\OpenWithList\\" + exe_name); | 74 open_with_key.append(L"\\OpenWithList\\" + exe_name); |
75 entries.push_front(new RegistryEntry(open_with_key, std::wstring())); | 75 entries.push_front(new RegistryEntry(open_with_key, std::wstring())); |
76 } | 76 } |
77 | 77 |
78 // Chrome extension installer | 78 // Chrome Extension file handler |
79 std::wstring install_cmd = | 79 std::wstring install_cmd = |
80 ShellUtil::GetChromeInstallExtensionCmd(chrome_exe); | 80 ShellUtil::GetChromeInstallExtensionCmd(chrome_exe); |
81 std::wstring prog_id = std::wstring(L"Software\\Classes\\") + | 81 std::wstring prog_id = std::wstring(L"Software\\Classes\\") + |
82 ShellUtil::kChromeExtProgId; | 82 ShellUtil::kChromeExtProgId; |
83 | |
84 // Extension file handler | |
85 entries.push_front(new RegistryEntry(prog_id, | 83 entries.push_front(new RegistryEntry(prog_id, |
86 ShellUtil::kChromeExtProgIdDesc)); | 84 ShellUtil::kChromeExtProgIdDesc)); |
87 entries.push_front(new RegistryEntry( | 85 entries.push_front(new RegistryEntry( |
88 prog_id + L"\\DefaultIcon", icon_path)); | 86 prog_id + ShellUtil::kRegDefaultIcon, icon_path)); |
89 entries.push_front(new RegistryEntry( | 87 entries.push_front(new RegistryEntry( |
90 prog_id + L"\\shell\\open\\command", install_cmd)); | 88 prog_id + ShellUtil::kRegShellOpen, install_cmd)); |
91 | |
92 // .crx file type extension | |
93 std::wstring file_extension_key(L"Software\\Classes\\"); | |
94 file_extension_key.append(L"."); | |
95 file_extension_key.append(chrome::kExtensionFileExtension); | |
96 entries.push_front(new RegistryEntry(file_extension_key, | |
97 ShellUtil::kChromeExtProgId)); | |
98 | 89 |
99 BrowserDistribution* dist = BrowserDistribution::GetDistribution(); | 90 BrowserDistribution* dist = BrowserDistribution::GetDistribution(); |
100 std::wstring start_menu_entry(ShellUtil::kRegStartMenuInternet); | 91 std::wstring start_menu_entry(ShellUtil::kRegStartMenuInternet); |
101 start_menu_entry.append(L"\\" + dist->GetApplicationName()); | 92 start_menu_entry.append(L"\\" + dist->GetApplicationName()); |
102 entries.push_front(new RegistryEntry(start_menu_entry, | 93 entries.push_front(new RegistryEntry(start_menu_entry, |
103 dist->GetApplicationName())); | 94 dist->GetApplicationName())); |
104 entries.push_front(new RegistryEntry( | 95 entries.push_front(new RegistryEntry( |
105 start_menu_entry + ShellUtil::kRegShellOpen, quoted_exe_path)); | 96 start_menu_entry + ShellUtil::kRegShellOpen, quoted_exe_path)); |
106 entries.push_front(new RegistryEntry( | 97 entries.push_front(new RegistryEntry( |
107 start_menu_entry + ShellUtil::kRegDefaultIcon, icon_path)); | 98 start_menu_entry + ShellUtil::kRegDefaultIcon, icon_path)); |
(...skipping 18 matching lines...) Expand all Loading... |
126 entries.push_front(new RegistryEntry( | 117 entries.push_front(new RegistryEntry( |
127 capabilities, L"ApplicationName", dist->GetApplicationName())); | 118 capabilities, L"ApplicationName", dist->GetApplicationName())); |
128 | 119 |
129 entries.push_front(new RegistryEntry(capabilities + L"\\StartMenu", | 120 entries.push_front(new RegistryEntry(capabilities + L"\\StartMenu", |
130 L"StartMenuInternet", dist->GetApplicationName())); | 121 L"StartMenuInternet", dist->GetApplicationName())); |
131 for (int i = 0; ShellUtil::kFileAssociations[i] != NULL; i++) { | 122 for (int i = 0; ShellUtil::kFileAssociations[i] != NULL; i++) { |
132 entries.push_front(new RegistryEntry( | 123 entries.push_front(new RegistryEntry( |
133 capabilities + L"\\FileAssociations", | 124 capabilities + L"\\FileAssociations", |
134 ShellUtil::kFileAssociations[i], ShellUtil::kChromeHTMLProgId)); | 125 ShellUtil::kFileAssociations[i], ShellUtil::kChromeHTMLProgId)); |
135 } | 126 } |
| 127 entries.push_front(new RegistryEntry( |
| 128 capabilities + L"\\FileAssociations", |
| 129 chrome::kExtensionFileExtension, ShellUtil::kChromeExtProgId)); |
136 for (int i = 0; ShellUtil::kProtocolAssociations[i] != NULL; i++) { | 130 for (int i = 0; ShellUtil::kProtocolAssociations[i] != NULL; i++) { |
137 entries.push_front(new RegistryEntry( | 131 entries.push_front(new RegistryEntry( |
138 capabilities + L"\\URLAssociations", | 132 capabilities + L"\\URLAssociations", |
139 ShellUtil::kProtocolAssociations[i], ShellUtil::kChromeHTMLProgId)); | 133 ShellUtil::kProtocolAssociations[i], ShellUtil::kChromeHTMLProgId)); |
140 } | 134 } |
141 return entries; | 135 return entries; |
142 } | 136 } |
143 | 137 |
144 // Generate work_item tasks required to create current registry entry and | 138 // Generate work_item tasks required to create current registry entry and |
145 // add them to the given work item list. | 139 // add them to the given work item list. |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
237 // file extension associations | 231 // file extension associations |
238 std::wstring classes_path(ShellUtil::kRegClasses); | 232 std::wstring classes_path(ShellUtil::kRegClasses); |
239 for (int i = 0; ShellUtil::kFileAssociations[i] != NULL; i++) { | 233 for (int i = 0; ShellUtil::kFileAssociations[i] != NULL; i++) { |
240 std::wstring key_path = classes_path + L"\\" + | 234 std::wstring key_path = classes_path + L"\\" + |
241 ShellUtil::kFileAssociations[i]; | 235 ShellUtil::kFileAssociations[i]; |
242 items->AddCreateRegKeyWorkItem(root_key, key_path); | 236 items->AddCreateRegKeyWorkItem(root_key, key_path); |
243 items->AddSetRegValueWorkItem(root_key, key_path, L"", | 237 items->AddSetRegValueWorkItem(root_key, key_path, L"", |
244 ShellUtil::kChromeHTMLProgId, true); | 238 ShellUtil::kChromeHTMLProgId, true); |
245 } | 239 } |
246 | 240 |
| 241 // .crx file type extension |
| 242 std::wstring file_extension_key = classes_path + L"\\." + |
| 243 chrome::kExtensionFileExtension; |
| 244 items->AddCreateRegKeyWorkItem(root_key, file_extension_key); |
| 245 items->AddSetRegValueWorkItem(root_key, file_extension_key, L"", |
| 246 ShellUtil::kChromeExtProgId, true); |
| 247 |
| 248 |
247 // protocols associations | 249 // protocols associations |
248 std::wstring chrome_open = ShellUtil::GetChromeShellOpenCmd(chrome_exe); | 250 std::wstring chrome_open = ShellUtil::GetChromeShellOpenCmd(chrome_exe); |
249 std::wstring chrome_icon(chrome_exe); | 251 std::wstring chrome_icon(chrome_exe); |
250 ShellUtil::GetChromeIcon(chrome_icon); | 252 ShellUtil::GetChromeIcon(chrome_icon); |
251 for (int i = 0; ShellUtil::kProtocolAssociations[i] != NULL; i++) { | 253 for (int i = 0; ShellUtil::kProtocolAssociations[i] != NULL; i++) { |
252 std::wstring key_path = classes_path + L"\\" + | 254 std::wstring key_path = classes_path + L"\\" + |
253 ShellUtil::kProtocolAssociations[i]; | 255 ShellUtil::kProtocolAssociations[i]; |
254 // <root hkey>\Software\Classes\<protocol>\DefaultIcon | 256 // <root hkey>\Software\Classes\<protocol>\DefaultIcon |
255 std::wstring icon_path = key_path + ShellUtil::kRegDefaultIcon; | 257 std::wstring icon_path = key_path + ShellUtil::kRegDefaultIcon; |
256 items->AddCreateRegKeyWorkItem(root_key, icon_path); | 258 items->AddCreateRegKeyWorkItem(root_key, icon_path); |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
349 bool skip_if_not_admin) { | 351 bool skip_if_not_admin) { |
350 if (IsUserAnAdmin() && | 352 if (IsUserAnAdmin() && |
351 SetAccessDefaultRegEntries(HKEY_LOCAL_MACHINE, chrome_exe)) | 353 SetAccessDefaultRegEntries(HKEY_LOCAL_MACHINE, chrome_exe)) |
352 return ShellUtil::SUCCESS; | 354 return ShellUtil::SUCCESS; |
353 | 355 |
354 if (!skip_if_not_admin) { | 356 if (!skip_if_not_admin) { |
355 std::wstring exe_path(file_util::GetDirectoryFromPath(chrome_exe)); | 357 std::wstring exe_path(file_util::GetDirectoryFromPath(chrome_exe)); |
356 file_util::AppendToPath(&exe_path, installer_util::kSetupExe); | 358 file_util::AppendToPath(&exe_path, installer_util::kSetupExe); |
357 if (!file_util::PathExists(exe_path)) { | 359 if (!file_util::PathExists(exe_path)) { |
358 BrowserDistribution* dist = BrowserDistribution::GetDistribution(); | 360 BrowserDistribution* dist = BrowserDistribution::GetDistribution(); |
359 RegKey key(HKEY_CURRENT_USER, dist->GetUninstallRegPath().c_str()); | 361 HKEY reg_root = InstallUtil::IsPerUserInstall(chrome_exe.c_str()) ? |
| 362 HKEY_CURRENT_USER : HKEY_LOCAL_MACHINE; |
| 363 RegKey key(reg_root, dist->GetUninstallRegPath().c_str()); |
360 key.ReadValue(installer_util::kUninstallStringField, &exe_path); | 364 key.ReadValue(installer_util::kUninstallStringField, &exe_path); |
361 CommandLine command_line(L""); | 365 CommandLine command_line(L""); |
362 command_line.ParseFromString(exe_path); | 366 command_line.ParseFromString(exe_path); |
363 exe_path = command_line.program(); | 367 exe_path = command_line.program(); |
364 } | 368 } |
365 if (file_util::PathExists(exe_path)) { | 369 if (file_util::PathExists(exe_path)) { |
366 std::wstring params(L"--"); | 370 std::wstring params(L"--"); |
367 params.append(installer_util::switches::kRegisterChromeBrowser); | 371 params.append(installer_util::switches::kRegisterChromeBrowser); |
368 params.append(L"=\"" + chrome_exe + L"\""); | 372 params.append(L"=\"" + chrome_exe + L"\""); |
369 DWORD ret_val = ShellUtil::SUCCESS; | 373 DWORD ret_val = ShellUtil::SUCCESS; |
(...skipping 17 matching lines...) Expand all Loading... |
387 const wchar_t* ShellUtil::kRegRegisteredApplications = | 391 const wchar_t* ShellUtil::kRegRegisteredApplications = |
388 L"Software\\RegisteredApplications"; | 392 L"Software\\RegisteredApplications"; |
389 const wchar_t* ShellUtil::kRegVistaUrlPrefs = | 393 const wchar_t* ShellUtil::kRegVistaUrlPrefs = |
390 L"Software\\Microsoft\\Windows\\Shell\\Associations\\UrlAssociations\\" | 394 L"Software\\Microsoft\\Windows\\Shell\\Associations\\UrlAssociations\\" |
391 L"http\\UserChoice"; | 395 L"http\\UserChoice"; |
392 const wchar_t* ShellUtil::kAppPathsRegistryKey = | 396 const wchar_t* ShellUtil::kAppPathsRegistryKey = |
393 L"Software\\Microsoft\\Windows\\CurrentVersion\\App Paths"; | 397 L"Software\\Microsoft\\Windows\\CurrentVersion\\App Paths"; |
394 const wchar_t* ShellUtil::kAppPathsRegistryPathName = L"Path"; | 398 const wchar_t* ShellUtil::kAppPathsRegistryPathName = L"Path"; |
395 | 399 |
396 #if defined(GOOGLE_CHROME_BUILD) | 400 #if defined(GOOGLE_CHROME_BUILD) |
| 401 const wchar_t* ShellUtil::kChromeExtProgId = L"ChromeExt"; |
397 const wchar_t* ShellUtil::kChromeHTMLProgId = L"ChromeHTML"; | 402 const wchar_t* ShellUtil::kChromeHTMLProgId = L"ChromeHTML"; |
398 const wchar_t* ShellUtil::kChromeHTMLProgIdDesc = L"Chrome HTML"; | 403 const wchar_t* ShellUtil::kChromeHTMLProgIdDesc = L"Chrome HTML"; |
399 #else | 404 #else |
| 405 const wchar_t* ShellUtil::kChromeExtProgId = L"ChromiumExt"; |
400 const wchar_t* ShellUtil::kChromeHTMLProgId = L"ChromiumHTML"; | 406 const wchar_t* ShellUtil::kChromeHTMLProgId = L"ChromiumHTML"; |
401 const wchar_t* ShellUtil::kChromeHTMLProgIdDesc = L"Chromium HTML"; | 407 const wchar_t* ShellUtil::kChromeHTMLProgIdDesc = L"Chromium HTML"; |
402 #endif | 408 #endif |
403 | 409 |
404 const wchar_t* ShellUtil::kFileAssociations[] = {L".htm", L".html", L".shtml", | 410 const wchar_t* ShellUtil::kFileAssociations[] = {L".htm", L".html", L".shtml", |
405 L".xht", L".xhtml", NULL}; | 411 L".xht", L".xhtml", NULL}; |
406 const wchar_t* ShellUtil::kProtocolAssociations[] = {L"ftp", L"http", L"https", | 412 const wchar_t* ShellUtil::kProtocolAssociations[] = {L"ftp", L"http", L"https", |
407 NULL}; | 413 NULL}; |
408 const wchar_t* ShellUtil::kRegUrlProtocol = L"URL Protocol"; | 414 const wchar_t* ShellUtil::kRegUrlProtocol = L"URL Protocol"; |
409 | 415 |
410 const wchar_t* ShellUtil::kChromeExtProgId = L"ChromeExt"; | |
411 const wchar_t* ShellUtil::kChromeExtProgIdDesc = L"Chrome Extension Installer"; | 416 const wchar_t* ShellUtil::kChromeExtProgIdDesc = L"Chrome Extension Installer"; |
412 | 417 |
413 ShellUtil::RegisterStatus ShellUtil::AddChromeToSetAccessDefaults( | 418 ShellUtil::RegisterStatus ShellUtil::AddChromeToSetAccessDefaults( |
414 const std::wstring& chrome_exe, bool skip_if_not_admin) { | 419 const std::wstring& chrome_exe, bool skip_if_not_admin) { |
415 if (IsChromeRegistered(chrome_exe)) | 420 if (IsChromeRegistered(chrome_exe)) |
416 return ShellUtil::SUCCESS; | 421 return ShellUtil::SUCCESS; |
417 | 422 |
418 if (win_util::GetWinVersion() >= win_util::WINVERSION_VISTA) | 423 if (win_util::GetWinVersion() >= win_util::WINVERSION_VISTA) |
419 return RegisterOnVista(chrome_exe, skip_if_not_admin); | 424 return RegisterOnVista(chrome_exe, skip_if_not_admin); |
420 | 425 |
(...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
695 } else { | 700 } else { |
696 return file_util::UpdateShortcutLink(chrome_exe.c_str(), // target | 701 return file_util::UpdateShortcutLink(chrome_exe.c_str(), // target |
697 shortcut.c_str(), // shortcut | 702 shortcut.c_str(), // shortcut |
698 chrome_path.c_str(), // working dir | 703 chrome_path.c_str(), // working dir |
699 NULL, // arguments | 704 NULL, // arguments |
700 description.c_str(), // description | 705 description.c_str(), // description |
701 chrome_exe.c_str(), // icon file | 706 chrome_exe.c_str(), // icon file |
702 0); // icon index | 707 0); // icon index |
703 } | 708 } |
704 } | 709 } |
OLD | NEW |