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

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

Issue 10823178: Register Chrome in Open With for File Associations at install on Windows. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: naming and comments Created 8 years, 4 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
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 186 matching lines...) Expand 10 before | Expand all | Expand 10 after
197 197
198 // Returns the Windows Default Programs capabilities key for Chrome. For 198 // Returns the Windows Default Programs capabilities key for Chrome. For
199 // example: 199 // example:
200 // "Software\Clients\StartMenuInternet\Chromium[.user]\Capabilities". 200 // "Software\Clients\StartMenuInternet\Chromium[.user]\Capabilities".
201 static string16 GetCapabilitiesKey(BrowserDistribution* dist, 201 static string16 GetCapabilitiesKey(BrowserDistribution* dist,
202 const string16& suffix) { 202 const string16& suffix) {
203 return GetBrowserClientKey(dist, suffix).append(L"\\Capabilities"); 203 return GetBrowserClientKey(dist, suffix).append(L"\\Capabilities");
204 } 204 }
205 205
206 // This method returns a list of all the registry entries that 206 // This method returns a list of all the registry entries that
207 // are needed to register Chromium ProgIds. 207 // are needed to register this installation's ProgId and AppId.
208 // These entries should be registered in HKCU for user-level installs and in 208 // These entries should be registered in HKCU for user-level installs and in
209 // HKLM for system-level installs. 209 // HKLM for system-level installs.
210 static bool GetProgIdEntries(BrowserDistribution* dist, 210 static void GetProgIdEntries(BrowserDistribution* dist,
211 const string16& chrome_exe, 211 const string16& chrome_exe,
212 const string16& suffix, 212 const string16& suffix,
213 std::list<RegistryEntry*>* entries) { 213 std::list<RegistryEntry*>* entries) {
214 string16 icon_path(ShellUtil::GetChromeIcon(dist, chrome_exe)); 214 string16 icon_path(ShellUtil::GetChromeIcon(dist, chrome_exe));
215 string16 open_cmd(ShellUtil::GetChromeShellOpenCmd(chrome_exe)); 215 string16 open_cmd(ShellUtil::GetChromeShellOpenCmd(chrome_exe));
216 string16 delegate_command(ShellUtil::GetChromeDelegateCommand(chrome_exe)); 216 string16 delegate_command(ShellUtil::GetChromeDelegateCommand(chrome_exe));
217 // For user-level installs: entries for the app id and DelegateExecute verb 217 // For user-level installs: entries for the app id and DelegateExecute verb
218 // handler will be in HKCU; thus we do not need a suffix on those entries. 218 // handler will be in HKCU; thus we do not need a suffix on those entries.
219 string16 app_id(ShellUtil::GetBrowserModelId(dist, chrome_exe)); 219 string16 app_id(ShellUtil::GetBrowserModelId(dist, chrome_exe));
220 string16 delegate_guid; 220 string16 delegate_guid;
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
295 entries->push_front(new RegistryEntry( 295 entries->push_front(new RegistryEntry(
296 chrome_application, ShellUtil::kRegApplicationName, 296 chrome_application, ShellUtil::kRegApplicationName,
297 dist->GetAppShortCutName())); 297 dist->GetAppShortCutName()));
298 entries->push_front(new RegistryEntry( 298 entries->push_front(new RegistryEntry(
299 chrome_application, ShellUtil::kRegApplicationDescription, 299 chrome_application, ShellUtil::kRegApplicationDescription,
300 dist->GetAppDescription())); 300 dist->GetAppDescription()));
301 entries->push_front(new RegistryEntry( 301 entries->push_front(new RegistryEntry(
302 chrome_application, ShellUtil::kRegApplicationCompany, 302 chrome_application, ShellUtil::kRegApplicationCompany,
303 dist->GetPublisherName())); 303 dist->GetPublisherName()));
304 } 304 }
305
306 return true;
307 } 305 }
308 306
309 // This method returns a list of the registry entries needed to declare a 307 // This method returns a list of the registry entries needed to declare a
310 // capability of handling a protocol on Windows. 308 // capability of handling a protocol on Windows.
311 static bool GetProtocolCapabilityEntries(BrowserDistribution* dist, 309 static void GetProtocolCapabilityEntries(BrowserDistribution* dist,
312 const string16& suffix, 310 const string16& suffix,
313 const string16& protocol, 311 const string16& protocol,
314 std::list<RegistryEntry*>* entries) { 312 std::list<RegistryEntry*>* entries) {
315 entries->push_front(new RegistryEntry( 313 entries->push_front(new RegistryEntry(
316 GetCapabilitiesKey(dist, suffix).append(L"\\URLAssociations"), 314 GetCapabilitiesKey(dist, suffix).append(L"\\URLAssociations"),
317 protocol, GetBrowserProgId(suffix))); 315 protocol, GetBrowserProgId(suffix)));
318 return true;
319 } 316 }
320 317
321 // This method returns a list of all the registry entries required to fully 318 // This method returns a list of the registry entries required to register
322 // integrate Chrome with Windows (i.e. StartMenuInternet, Default Programs, 319 // this installation in "RegisteredApplications" on Windows (to appear in
323 // AppPaths, etc.). This entries need to be registered in HKLM prior to Win8. 320 // Default Programs, StartMenuInternet, etc.).
324 static bool GetShellIntegrationEntries(BrowserDistribution* dist, 321 // These entries need to be registered in HKLM prior to Win8.
322 // If |suffix| is not empty, these entries are guaranteed to be unique on this
323 // machine.
324 static void GetShellIntegrationEntries(BrowserDistribution* dist,
325 const string16& chrome_exe, 325 const string16& chrome_exe,
326 const string16& suffix, 326 const string16& suffix,
327 std::list<RegistryEntry*>* entries) { 327 std::list<RegistryEntry*>* entries) {
328 string16 icon_path = ShellUtil::GetChromeIcon(dist, chrome_exe); 328 const string16 icon_path(ShellUtil::GetChromeIcon(dist, chrome_exe));
329 string16 quoted_exe_path = L"\"" + chrome_exe + L"\""; 329 const string16 quoted_exe_path(L"\"" + chrome_exe + L"\"");
330 330
331 // Register for the Start Menu "Internet" link (pre-Win7). 331 // Register for the Start Menu "Internet" link (pre-Win7).
332 const string16 start_menu_entry(GetBrowserClientKey(dist, suffix)); 332 const string16 start_menu_entry(GetBrowserClientKey(dist, suffix));
333 // Register Chrome's display name. 333 // Register Chrome's display name.
334 // TODO(grt): http://crbug.com/75152 Also set LocalizedString; see 334 // TODO(grt): http://crbug.com/75152 Also set LocalizedString; see
335 // http://msdn.microsoft.com/en-us/library/windows/desktop/cc144109(v=VS.85) .aspx#registering_the_display_name 335 // http://msdn.microsoft.com/en-us/library/windows/desktop/cc144109(v=VS.85) .aspx#registering_the_display_name
336 entries->push_front(new RegistryEntry( 336 entries->push_front(new RegistryEntry(
337 start_menu_entry, dist->GetAppShortCutName())); 337 start_menu_entry, dist->GetAppShortCutName()));
338 // Register the "open" verb for launching Chrome via the "Internet" link. 338 // Register the "open" verb for launching Chrome via the "Internet" link.
339 entries->push_front(new RegistryEntry( 339 entries->push_front(new RegistryEntry(
340 start_menu_entry + ShellUtil::kRegShellOpen, quoted_exe_path)); 340 start_menu_entry + ShellUtil::kRegShellOpen, quoted_exe_path));
341 // Register Chrome's icon for the Start Menu "Internet" link. 341 // Register Chrome's icon for the Start Menu "Internet" link.
342 entries->push_front(new RegistryEntry( 342 entries->push_front(new RegistryEntry(
343 start_menu_entry + ShellUtil::kRegDefaultIcon, icon_path)); 343 start_menu_entry + ShellUtil::kRegDefaultIcon, icon_path));
344 344
345 // Register installation information. 345 // Register installation information.
346 string16 install_info(start_menu_entry + L"\\InstallInfo"); 346 string16 install_info(start_menu_entry + L"\\InstallInfo");
347 // Note: not using CommandLine since it has ambiguous rules for quoting 347 // Note: not using CommandLine since it has ambiguous rules for quoting
348 // strings. 348 // strings.
349 entries->push_front(new RegistryEntry(install_info, kReinstallCommand, 349 entries->push_front(new RegistryEntry(install_info, kReinstallCommand,
350 quoted_exe_path + L" --" + ASCIIToWide(switches::kMakeDefaultBrowser))); 350 quoted_exe_path + L" --" + ASCIIToWide(switches::kMakeDefaultBrowser)));
351 entries->push_front(new RegistryEntry(install_info, L"HideIconsCommand", 351 entries->push_front(new RegistryEntry(install_info, L"HideIconsCommand",
352 quoted_exe_path + L" --" + ASCIIToWide(switches::kHideIcons))); 352 quoted_exe_path + L" --" + ASCIIToWide(switches::kHideIcons)));
353 entries->push_front(new RegistryEntry(install_info, L"ShowIconsCommand", 353 entries->push_front(new RegistryEntry(install_info, L"ShowIconsCommand",
354 quoted_exe_path + L" --" + ASCIIToWide(switches::kShowIcons))); 354 quoted_exe_path + L" --" + ASCIIToWide(switches::kShowIcons)));
355 entries->push_front(new RegistryEntry(install_info, L"IconsVisible", 1)); 355 entries->push_front(new RegistryEntry(install_info, L"IconsVisible", 1));
356 356
357 // Register with Default Programs. 357 // Register with Default Programs.
358 string16 reg_app_name(dist->GetBaseAppName().append(suffix)); 358 const string16 reg_app_name(dist->GetBaseAppName().append(suffix));
359 // Tell Windows where to find Chrome's Default Programs info. 359 // Tell Windows where to find Chrome's Default Programs info.
360 string16 capabilities(GetCapabilitiesKey(dist, suffix)); 360 const string16 capabilities(GetCapabilitiesKey(dist, suffix));
361 entries->push_front(new RegistryEntry(ShellUtil::kRegRegisteredApplications, 361 entries->push_front(new RegistryEntry(ShellUtil::kRegRegisteredApplications,
362 reg_app_name, capabilities)); 362 reg_app_name, capabilities));
363 // Write out Chrome's Default Programs info. 363 // Write out Chrome's Default Programs info.
364 // TODO(grt): http://crbug.com/75152 Write a reference to a localized 364 // TODO(grt): http://crbug.com/75152 Write a reference to a localized
365 // resource rather than this. 365 // resource rather than this.
366 entries->push_front(new RegistryEntry( 366 entries->push_front(new RegistryEntry(
367 capabilities, ShellUtil::kRegApplicationDescription, 367 capabilities, ShellUtil::kRegApplicationDescription,
368 dist->GetLongAppDescription())); 368 dist->GetLongAppDescription()));
369 entries->push_front(new RegistryEntry( 369 entries->push_front(new RegistryEntry(
370 capabilities, ShellUtil::kRegApplicationIcon, icon_path)); 370 capabilities, ShellUtil::kRegApplicationIcon, icon_path));
371 entries->push_front(new RegistryEntry( 371 entries->push_front(new RegistryEntry(
372 capabilities, ShellUtil::kRegApplicationName, 372 capabilities, ShellUtil::kRegApplicationName,
373 dist->GetAppShortCutName())); 373 dist->GetAppShortCutName()));
374 374
375 entries->push_front(new RegistryEntry(capabilities + L"\\Startmenu", 375 entries->push_front(new RegistryEntry(capabilities + L"\\Startmenu",
376 L"StartMenuInternet", reg_app_name)); 376 L"StartMenuInternet", reg_app_name));
377 377
378 string16 html_prog_id(GetBrowserProgId(suffix)); 378 const string16 html_prog_id(GetBrowserProgId(suffix));
379 for (int i = 0; ShellUtil::kFileAssociations[i] != NULL; i++) { 379 for (int i = 0; ShellUtil::kFileAssociations[i] != NULL; i++) {
380 entries->push_front(new RegistryEntry( 380 entries->push_front(new RegistryEntry(
381 capabilities + L"\\FileAssociations", 381 capabilities + L"\\FileAssociations",
382 ShellUtil::kFileAssociations[i], html_prog_id)); 382 ShellUtil::kFileAssociations[i], html_prog_id));
383 } 383 }
384 for (int i = 0; ShellUtil::kPotentialProtocolAssociations[i] != NULL; 384 for (int i = 0; ShellUtil::kPotentialProtocolAssociations[i] != NULL;
385 i++) { 385 i++) {
386 entries->push_front(new RegistryEntry( 386 entries->push_front(new RegistryEntry(
387 capabilities + L"\\URLAssociations", 387 capabilities + L"\\URLAssociations",
388 ShellUtil::kPotentialProtocolAssociations[i], html_prog_id)); 388 ShellUtil::kPotentialProtocolAssociations[i], html_prog_id));
389 } 389 }
390 }
390 391
391 // Application Registration. 392 // This method returns a list of the registry entries required for this
392 FilePath chrome_path(chrome_exe); 393 // installation to be registered in the Windows shell.
394 // In particular: App Paths and File Associations.
robertshield 2012/08/05 15:01:12 Please add links to http://msdn.microsoft.com/en-u
gab 2012/08/06 19:39:27 Done.
395 // These entries should be registered in HKCU for user-level installs and in
396 // HKLM for system-level installs.
397 static void GetAppRegistrationEntries(const string16& chrome_exe,
398 const string16& suffix,
399 std::list<RegistryEntry*>* entries) {
robertshield 2012/08/05 15:01:12 any reason not to use base::ScopedVector here? it
gab 2012/08/06 19:39:27 shell_util has been using std::list forever, but I
400 const FilePath chrome_path(chrome_exe);
393 string16 app_path_key(ShellUtil::kAppPathsRegistryKey); 401 string16 app_path_key(ShellUtil::kAppPathsRegistryKey);
394 app_path_key.push_back(FilePath::kSeparators[0]); 402 app_path_key.push_back(FilePath::kSeparators[0]);
395 app_path_key.append(chrome_path.BaseName().value()); 403 app_path_key.append(chrome_path.BaseName().value());
396 entries->push_front(new RegistryEntry(app_path_key, chrome_exe)); 404 entries->push_front(new RegistryEntry(app_path_key, chrome_exe));
397 entries->push_front(new RegistryEntry(app_path_key, 405 entries->push_front(new RegistryEntry(app_path_key,
398 ShellUtil::kAppPathsRegistryPathName, chrome_path.DirName().value())); 406 ShellUtil::kAppPathsRegistryPathName, chrome_path.DirName().value()));
399 407
400 // TODO: add chrome to open with list (Bug 16726). 408 const string16 html_prog_id(GetBrowserProgId(suffix));
401 return true; 409 for (int i = 0; ShellUtil::kFileAssociations[i] != NULL; i++) {
410 string16 key(ShellUtil::kRegClasses);
411 key.push_back(FilePath::kSeparators[0]);
412 key.append(ShellUtil::kFileAssociations[i]);
413 key.push_back(FilePath::kSeparators[0]);
414 key.append(ShellUtil::kRegOpenWithProgids);
415 entries->push_front(new RegistryEntry(key, html_prog_id, string16()));
416 }
402 } 417 }
403 418
404 // This method returns a list of all the user level registry entries that 419 // This method returns a list of all the user level registry entries that
405 // are needed to make Chromium the default handler for a protocol. 420 // are needed to make Chromium the default handler for a protocol.
406 static bool GetUserProtocolEntries(const string16& protocol, 421 static void GetUserProtocolEntries(const string16& protocol,
407 const string16& chrome_icon, 422 const string16& chrome_icon,
408 const string16& chrome_open, 423 const string16& chrome_open,
409 std::list<RegistryEntry*>* entries) { 424 std::list<RegistryEntry*>* entries) {
410 // Protocols associations. 425 // Protocols associations.
411 string16 url_key(ShellUtil::kRegClasses); 426 string16 url_key(ShellUtil::kRegClasses);
412 url_key.push_back(FilePath::kSeparators[0]); 427 url_key.push_back(FilePath::kSeparators[0]);
413 url_key.append(protocol); 428 url_key.append(protocol);
414 429
415 // This registry value tells Windows that this 'class' is a URL scheme 430 // This registry value tells Windows that this 'class' is a URL scheme
416 // so IE, explorer and other apps will route it to our handler. 431 // so IE, explorer and other apps will route it to our handler.
417 // <root hkey>\Software\Classes\<protocol>\URL Protocol 432 // <root hkey>\Software\Classes\<protocol>\URL Protocol
418 entries->push_front(new RegistryEntry(url_key, 433 entries->push_front(new RegistryEntry(url_key,
419 ShellUtil::kRegUrlProtocol, L"")); 434 ShellUtil::kRegUrlProtocol, L""));
420 435
421 // <root hkey>\Software\Classes\<protocol>\DefaultIcon 436 // <root hkey>\Software\Classes\<protocol>\DefaultIcon
422 string16 icon_key = url_key + ShellUtil::kRegDefaultIcon; 437 string16 icon_key = url_key + ShellUtil::kRegDefaultIcon;
423 entries->push_front(new RegistryEntry(icon_key, chrome_icon)); 438 entries->push_front(new RegistryEntry(icon_key, chrome_icon));
424 439
425 // <root hkey>\Software\Classes\<protocol>\shell\open\command 440 // <root hkey>\Software\Classes\<protocol>\shell\open\command
426 string16 shell_key = url_key + ShellUtil::kRegShellOpen; 441 string16 shell_key = url_key + ShellUtil::kRegShellOpen;
427 entries->push_front(new RegistryEntry(shell_key, chrome_open)); 442 entries->push_front(new RegistryEntry(shell_key, chrome_open));
428 443
429 // <root hkey>\Software\Classes\<protocol>\shell\open\ddeexec 444 // <root hkey>\Software\Classes\<protocol>\shell\open\ddeexec
430 string16 dde_key = url_key + L"\\shell\\open\\ddeexec"; 445 string16 dde_key = url_key + L"\\shell\\open\\ddeexec";
431 entries->push_front(new RegistryEntry(dde_key, L"")); 446 entries->push_front(new RegistryEntry(dde_key, L""));
432 447
433 // <root hkey>\Software\Classes\<protocol>\shell\@ 448 // <root hkey>\Software\Classes\<protocol>\shell\@
434 string16 protocol_shell_key = url_key + ShellUtil::kRegShellPath; 449 string16 protocol_shell_key = url_key + ShellUtil::kRegShellPath;
435 entries->push_front(new RegistryEntry(protocol_shell_key, L"open")); 450 entries->push_front(new RegistryEntry(protocol_shell_key, L"open"));
436
437 return true;
438 } 451 }
439 452
440 // This method returns a list of all the user level registry entries that 453 // This method returns a list of all the user level registry entries that
441 // are needed to make Chromium default browser. 454 // are needed to make Chromium default browser.
442 static bool GetUserEntries(BrowserDistribution* dist, 455 // Some of these entries are irrelevant in recent versions of Windows, but
443 const string16& chrome_exe, 456 // we register them anyways as some legacy apps are hardcoded to lookup those
444 const string16& suffix, 457 // values.
445 std::list<RegistryEntry*>* entries) { 458 static void GetDefaultBrowserUserEntries(BrowserDistribution* dist,
459 const string16& chrome_exe,
460 const string16& suffix,
461 std::list<RegistryEntry*>* entries) {
robertshield 2012/08/05 15:01:12 same comment about base::ScopedVector
gab 2012/08/06 19:39:27 Done.
446 // File extension associations. 462 // File extension associations.
447 string16 html_prog_id(GetBrowserProgId(suffix)); 463 string16 html_prog_id(GetBrowserProgId(suffix));
448 for (int i = 0; ShellUtil::kFileAssociations[i] != NULL; i++) { 464 for (int i = 0; ShellUtil::kFileAssociations[i] != NULL; i++) {
449 string16 ext_key(ShellUtil::kRegClasses); 465 string16 ext_key(ShellUtil::kRegClasses);
450 ext_key.push_back(FilePath::kSeparators[0]); 466 ext_key.push_back(FilePath::kSeparators[0]);
451 ext_key.append(ShellUtil::kFileAssociations[i]); 467 ext_key.append(ShellUtil::kFileAssociations[i]);
452 entries->push_front(new RegistryEntry(ext_key, html_prog_id)); 468 entries->push_front(new RegistryEntry(ext_key, html_prog_id));
453 } 469 }
454 470
455 // Protocols associations. 471 // Protocols associations.
456 string16 chrome_open = ShellUtil::GetChromeShellOpenCmd(chrome_exe); 472 string16 chrome_open = ShellUtil::GetChromeShellOpenCmd(chrome_exe);
457 string16 chrome_icon = ShellUtil::GetChromeIcon(dist, chrome_exe); 473 string16 chrome_icon = ShellUtil::GetChromeIcon(dist, chrome_exe);
458 for (int i = 0; ShellUtil::kBrowserProtocolAssociations[i] != NULL; i++) { 474 for (int i = 0; ShellUtil::kBrowserProtocolAssociations[i] != NULL; i++) {
459 GetUserProtocolEntries(ShellUtil::kBrowserProtocolAssociations[i], 475 GetUserProtocolEntries(ShellUtil::kBrowserProtocolAssociations[i],
460 chrome_icon, chrome_open, entries); 476 chrome_icon, chrome_open, entries);
461 } 477 }
462 478
463 // start->Internet shortcut. 479 // start->Internet shortcut.
464 string16 start_menu(ShellUtil::kRegStartMenuInternet); 480 string16 start_menu(ShellUtil::kRegStartMenuInternet);
465 string16 app_name = dist->GetBaseAppName() + suffix; 481 string16 app_name = dist->GetBaseAppName() + suffix;
466 entries->push_front(new RegistryEntry(start_menu, app_name)); 482 entries->push_front(new RegistryEntry(start_menu, app_name));
467 return true;
468 } 483 }
469 484
470 // Generate work_item tasks required to create current registry entry and 485 // Generate work_item tasks required to create current registry entry and
471 // add them to the given work item list. 486 // add them to the given work item list.
472 void AddToWorkItemList(HKEY root, WorkItemList *items) const { 487 void AddToWorkItemList(HKEY root, WorkItemList *items) const {
473 items->AddCreateRegKeyWorkItem(root, _key_path); 488 items->AddCreateRegKeyWorkItem(root, _key_path);
474 if (_is_string) { 489 if (_is_string) {
475 items->AddSetRegValueWorkItem(root, _key_path, _name, _value, true); 490 items->AddSetRegValueWorkItem(root, _key_path, _name, _value, true);
476 } else { 491 } else {
477 items->AddSetRegValueWorkItem(root, _key_path, _name, _int_value, true); 492 items->AddSetRegValueWorkItem(root, _key_path, _name, _int_value, true);
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
597 } 612 }
598 613
599 // Checks that all required registry entries for Chrome are already present 614 // Checks that all required registry entries for Chrome are already present
600 // on this computer. 615 // on this computer.
601 bool IsChromeRegistered(BrowserDistribution* dist, 616 bool IsChromeRegistered(BrowserDistribution* dist,
602 const string16& chrome_exe, 617 const string16& chrome_exe,
603 const string16& suffix) { 618 const string16& suffix) {
604 std::list<RegistryEntry*> entries; 619 std::list<RegistryEntry*> entries;
605 STLElementDeleter<std::list<RegistryEntry*> > entries_deleter(&entries); 620 STLElementDeleter<std::list<RegistryEntry*> > entries_deleter(&entries);
606 RegistryEntry::GetProgIdEntries(dist, chrome_exe, suffix, &entries); 621 RegistryEntry::GetProgIdEntries(dist, chrome_exe, suffix, &entries);
607 RegistryEntry::GetShellIntegrationEntries( 622 RegistryEntry::GetShellIntegrationEntries(dist, chrome_exe, suffix, &entries);
608 dist, chrome_exe, suffix, &entries); 623 RegistryEntry::GetAppRegistrationEntries(chrome_exe, suffix, &entries);
609 return AreEntriesRegistered(entries, RegistryEntry::LOOK_IN_HKCU_THEN_HKLM); 624 return AreEntriesRegistered(entries, RegistryEntry::LOOK_IN_HKCU_THEN_HKLM);
610 } 625 }
611 626
612 // This method checks if Chrome is already registered on the local machine 627 // This method checks if Chrome is already registered on the local machine
613 // for the requested protocol. It just checks the one value required for this. 628 // for the requested protocol. It just checks the one value required for this.
614 bool IsChromeRegisteredForProtocol(BrowserDistribution* dist, 629 bool IsChromeRegisteredForProtocol(BrowserDistribution* dist,
615 const string16& suffix, 630 const string16& suffix,
616 const string16& protocol) { 631 const string16& protocol) {
617 std::list<RegistryEntry*> entries; 632 std::list<RegistryEntry*> entries;
618 STLElementDeleter<std::list<RegistryEntry*> > entries_deleter(&entries); 633 STLElementDeleter<std::list<RegistryEntry*> > entries_deleter(&entries);
(...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after
861 } 876 }
862 877
863 // Returns the root registry key (HKLM or HKCU) into which shell integration 878 // Returns the root registry key (HKLM or HKCU) into which shell integration
864 // registration for default protocols must be placed. As of Windows 8 everything 879 // registration for default protocols must be placed. As of Windows 8 everything
865 // can go in HKCU for per-user installs. 880 // can go in HKCU for per-user installs.
866 HKEY DetermineShellIntegrationRoot(bool is_per_user) { 881 HKEY DetermineShellIntegrationRoot(bool is_per_user) {
867 return is_per_user && base::win::GetVersion() >= base::win::VERSION_WIN8 ? 882 return is_per_user && base::win::GetVersion() >= base::win::VERSION_WIN8 ?
868 HKEY_CURRENT_USER : HKEY_LOCAL_MACHINE; 883 HKEY_CURRENT_USER : HKEY_LOCAL_MACHINE;
869 } 884 }
870 885
886 // Associates Chrome with supported protocols and file associations. This should
887 // not be required on Vista+ but since some applications still read
888 // Software\Classes\http key directly, we have to do this on Vista+ as well.
889 bool RegisterChromeAsDefaultForXP(BrowserDistribution* dist,
890 int shell_change,
891 const string16& chrome_exe) {
892 bool ret = true;
893 std::list<RegistryEntry*> entries;
894 STLElementDeleter<std::list<RegistryEntry*> > entries_deleter(&entries);
895 RegistryEntry::GetDefaultBrowserUserEntries(
896 dist, chrome_exe,
897 ShellUtil::GetCurrentInstallationSuffix(dist, chrome_exe), &entries);
898 // Change the default browser for current user.
robertshield 2012/08/05 15:01:12 nit: imo should add a blank line before the commen
gab 2012/08/06 19:39:27 Done.
899 if ((shell_change & ShellUtil::CURRENT_USER) &&
900 !AddRegistryEntries(HKEY_CURRENT_USER, entries)) {
901 ret = false;
902 LOG(ERROR) << "Could not make Chrome default browser (XP/current user).";
903 }
904
905 // Chrome as default browser at system level.
906 if ((shell_change & ShellUtil::SYSTEM_LEVEL) &&
907 !AddRegistryEntries(HKEY_LOCAL_MACHINE, entries)) {
908 ret = false;
909 LOG(ERROR) << "Could not make Chrome default browser (XP/system level).";
910 }
911
912 return ret;
913 }
914
871 } // namespace 915 } // namespace
872 916
873 const wchar_t* ShellUtil::kRegDefaultIcon = L"\\DefaultIcon"; 917 const wchar_t* ShellUtil::kRegDefaultIcon = L"\\DefaultIcon";
874 const wchar_t* ShellUtil::kRegShellPath = L"\\shell"; 918 const wchar_t* ShellUtil::kRegShellPath = L"\\shell";
875 const wchar_t* ShellUtil::kRegShellOpen = L"\\shell\\open\\command"; 919 const wchar_t* ShellUtil::kRegShellOpen = L"\\shell\\open\\command";
876 const wchar_t* ShellUtil::kRegStartMenuInternet = 920 const wchar_t* ShellUtil::kRegStartMenuInternet =
877 L"Software\\Clients\\StartMenuInternet"; 921 L"Software\\Clients\\StartMenuInternet";
878 const wchar_t* ShellUtil::kRegClasses = L"Software\\Classes"; 922 const wchar_t* ShellUtil::kRegClasses = L"Software\\Classes";
879 const wchar_t* ShellUtil::kRegRegisteredApplications = 923 const wchar_t* ShellUtil::kRegRegisteredApplications =
880 L"Software\\RegisteredApplications"; 924 L"Software\\RegisteredApplications";
(...skipping 26 matching lines...) Expand all
907 L"ApplicationDescription"; 951 L"ApplicationDescription";
908 const wchar_t* ShellUtil::kRegApplicationName = L"ApplicationName"; 952 const wchar_t* ShellUtil::kRegApplicationName = L"ApplicationName";
909 const wchar_t* ShellUtil::kRegApplicationIcon = L"ApplicationIcon"; 953 const wchar_t* ShellUtil::kRegApplicationIcon = L"ApplicationIcon";
910 const wchar_t* ShellUtil::kRegApplicationCompany = L"ApplicationCompany"; 954 const wchar_t* ShellUtil::kRegApplicationCompany = L"ApplicationCompany";
911 const wchar_t* ShellUtil::kRegExePath = L"\\.exe"; 955 const wchar_t* ShellUtil::kRegExePath = L"\\.exe";
912 const wchar_t* ShellUtil::kRegVerbOpen = L"open"; 956 const wchar_t* ShellUtil::kRegVerbOpen = L"open";
913 const wchar_t* ShellUtil::kRegVerbOpenNewWindow = L"opennewwindow"; 957 const wchar_t* ShellUtil::kRegVerbOpenNewWindow = L"opennewwindow";
914 const wchar_t* ShellUtil::kRegVerbRun = L"run"; 958 const wchar_t* ShellUtil::kRegVerbRun = L"run";
915 const wchar_t* ShellUtil::kRegCommand = L"command"; 959 const wchar_t* ShellUtil::kRegCommand = L"command";
916 const wchar_t* ShellUtil::kRegDelegateExecute = L"DelegateExecute"; 960 const wchar_t* ShellUtil::kRegDelegateExecute = L"DelegateExecute";
961 const wchar_t* ShellUtil::kRegOpenWithProgids = L"OpenWithProgids";
917 962
918 bool ShellUtil::QuickIsChromeRegisteredInHKLM(BrowserDistribution* dist, 963 bool ShellUtil::QuickIsChromeRegisteredInHKLM(BrowserDistribution* dist,
919 const string16& chrome_exe, 964 const string16& chrome_exe,
920 const string16& suffix) { 965 const string16& suffix) {
921 return QuickIsChromeRegistered(dist, chrome_exe, suffix, 966 return QuickIsChromeRegistered(dist, chrome_exe, suffix,
922 CONFIRM_SHELL_REGISTRATION_IN_HKLM); 967 CONFIRM_SHELL_REGISTRATION_IN_HKLM);
923 } 968 }
924 969
925 bool ShellUtil::CreateChromeDesktopShortcut(BrowserDistribution* dist, 970 bool ShellUtil::CreateChromeDesktopShortcut(BrowserDistribution* dist,
926 const string16& chrome_exe, 971 const string16& chrome_exe,
(...skipping 354 matching lines...) Expand 10 before | Expand all | Expand 10 after
1281 ShellUtil::kFileAssociations[i], AT_FILEEXTENSION); 1326 ShellUtil::kFileAssociations[i], AT_FILEEXTENSION);
1282 if (!SUCCEEDED(hr)) { 1327 if (!SUCCEEDED(hr)) {
1283 ret = false; 1328 ret = false;
1284 LOG(ERROR) << "Failed to register as default for file extension " 1329 LOG(ERROR) << "Failed to register as default for file extension "
1285 << ShellUtil::kFileAssociations[i] << " (" << hr << ")"; 1330 << ShellUtil::kFileAssociations[i] << " (" << hr << ")";
1286 } 1331 }
1287 } 1332 }
1288 } 1333 }
1289 } 1334 }
1290 1335
1291 // Now use the old way to associate Chrome with supported protocols and file 1336 if (!RegisterChromeAsDefaultForXP(dist, shell_change, chrome_exe))
1292 // associations. This should not be required on Vista but since some
1293 // applications still read Software\Classes\http key directly, we have to do
1294 // this on Vista also.
1295
1296 std::list<RegistryEntry*> entries;
1297 STLElementDeleter<std::list<RegistryEntry*> > entries_deleter(&entries);
1298 RegistryEntry::GetUserEntries(
1299 dist, chrome_exe, GetCurrentInstallationSuffix(dist, chrome_exe),
1300 &entries);
1301 // Change the default browser for current user.
1302 if ((shell_change & ShellUtil::CURRENT_USER) &&
1303 !AddRegistryEntries(HKEY_CURRENT_USER, entries)) {
1304 ret = false; 1337 ret = false;
1305 LOG(ERROR) << "Could not make Chrome default browser (XP/current user).";
1306 }
1307
1308 // Chrome as default browser at system level.
1309 if ((shell_change & ShellUtil::SYSTEM_LEVEL) &&
1310 !AddRegistryEntries(HKEY_LOCAL_MACHINE, entries)) {
1311 ret = false;
1312 LOG(ERROR) << "Could not make Chrome default browser (XP/system level).";
1313 }
1314 1338
1315 // Send Windows notification event so that it can update icons for 1339 // Send Windows notification event so that it can update icons for
1316 // file associations. 1340 // file associations.
1317 SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, NULL, NULL); 1341 SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, NULL, NULL);
1318 return ret; 1342 return ret;
1319 } 1343 }
1320 1344
1321 bool ShellUtil::ShowMakeChromeDefaultSystemUI(BrowserDistribution* dist, 1345 bool ShellUtil::ShowMakeChromeDefaultSystemUI(BrowserDistribution* dist,
1322 const string16& chrome_exe) { 1346 const string16& chrome_exe) {
1323 DCHECK_GE(base::win::GetVersion(), base::win::VERSION_WIN8); 1347 DCHECK_GE(base::win::GetVersion(), base::win::VERSION_WIN8);
1324 if (!dist->CanSetAsDefault()) 1348 if (!dist->CanSetAsDefault())
1325 return false; 1349 return false;
1326 1350
1327 if (!RegisterChromeBrowser(dist, chrome_exe, string16(), true)) 1351 if (!RegisterChromeBrowser(dist, chrome_exe, string16(), true))
1328 return false; 1352 return false;
1329 1353
1330 // On Windows 8, you can't set yourself as the default handler 1354 // On Windows 8, you can't set yourself as the default handler
1331 // programatically. In other words IApplicationAssociationRegistration 1355 // programatically. In other words IApplicationAssociationRegistration
1332 // has been rendered useless. What you can do is to launch 1356 // has been rendered useless. What you can do is to launch
1333 // "Set Program Associations" section of the "Default Programs" 1357 // "Set Program Associations" section of the "Default Programs"
1334 // control panel, which is a mess, or pop the concise "How you want to open 1358 // control panel, which is a mess, or pop the concise "How you want to open
1335 // webpages?" dialog. We choose the latter. 1359 // webpages?" dialog. We choose the latter.
1336 // Return true only when the user took an action and there was no error. 1360 // Return true only when the user took an action and there was no error.
1337 return LaunchSelectDefaultProtocolHandlerDialog(L"http"); 1361 const bool ret = LaunchSelectDefaultProtocolHandlerDialog(L"http");
1362
1363 if (ret) {
1364 const int shell_change =
1365 InstallUtil::IsPerUserInstall(chrome_exe.c_str()) ? CURRENT_USER :
1366 SYSTEM_LEVEL;
1367 RegisterChromeAsDefaultForXP(dist, shell_change, chrome_exe);
1368 }
1369
1370 return ret;
1338 } 1371 }
1339 1372
1340 bool ShellUtil::MakeChromeDefaultProtocolClient(BrowserDistribution* dist, 1373 bool ShellUtil::MakeChromeDefaultProtocolClient(BrowserDistribution* dist,
1341 const string16& chrome_exe, 1374 const string16& chrome_exe,
1342 const string16& protocol) { 1375 const string16& protocol) {
1343 if (!dist->CanSetAsDefault()) 1376 if (!dist->CanSetAsDefault())
1344 return false; 1377 return false;
1345 1378
1346 ShellUtil::RegisterChromeForProtocol(dist, chrome_exe, L"", protocol, true); 1379 ShellUtil::RegisterChromeForProtocol(dist, chrome_exe, L"", protocol, true);
1347 1380
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
1406 // Check if Chromium is already registered with this suffix. 1439 // Check if Chromium is already registered with this suffix.
1407 if (IsChromeRegistered(dist, chrome_exe, suffix)) 1440 if (IsChromeRegistered(dist, chrome_exe, suffix))
1408 return true; 1441 return true;
1409 1442
1410 bool user_level = InstallUtil::IsPerUserInstall(chrome_exe.c_str()); 1443 bool user_level = InstallUtil::IsPerUserInstall(chrome_exe.c_str());
1411 HKEY root = DetermineShellIntegrationRoot(user_level); 1444 HKEY root = DetermineShellIntegrationRoot(user_level);
1412 1445
1413 // Do the full registration if we can do it at user-level or if the user is an 1446 // Do the full registration if we can do it at user-level or if the user is an
1414 // admin. 1447 // admin.
1415 if (root == HKEY_CURRENT_USER || IsUserAnAdmin()) { 1448 if (root == HKEY_CURRENT_USER || IsUserAnAdmin()) {
1416 std::list<RegistryEntry*> progids; 1449 std::list<RegistryEntry*> progid_and_appreg_entries;
1417 STLElementDeleter<std::list<RegistryEntry*> > progids_deleter(&progids); 1450 STLElementDeleter<std::list<RegistryEntry*> > progdid_and_appreg_deleter(
1451 &progid_and_appreg_entries);
1418 std::list<RegistryEntry*> shell_entries; 1452 std::list<RegistryEntry*> shell_entries;
1419 STLElementDeleter<std::list<RegistryEntry*> > shell_deleter(&shell_entries); 1453 STLElementDeleter<std::list<RegistryEntry*> > shell_deleter(&shell_entries);
1420 RegistryEntry::GetProgIdEntries(dist, chrome_exe, suffix, &progids); 1454 RegistryEntry::GetProgIdEntries(dist, chrome_exe, suffix,
1455 &progid_and_appreg_entries);
1456 RegistryEntry::GetAppRegistrationEntries(chrome_exe, suffix,
1457 &progid_and_appreg_entries);
1421 RegistryEntry::GetShellIntegrationEntries( 1458 RegistryEntry::GetShellIntegrationEntries(
1422 dist, chrome_exe, suffix, &shell_entries); 1459 dist, chrome_exe, suffix, &shell_entries);
1423 return AddRegistryEntries(user_level ? HKEY_CURRENT_USER : 1460 return AddRegistryEntries(user_level ? HKEY_CURRENT_USER :
1424 HKEY_LOCAL_MACHINE, 1461 HKEY_LOCAL_MACHINE,
1425 progids) && 1462 progid_and_appreg_entries) &&
1426 AddRegistryEntries(root, shell_entries); 1463 AddRegistryEntries(root, shell_entries);
1427 } 1464 }
1428 1465
1429 // If the user is not an admin and OS is between Vista and Windows 7 1466 // If the user is not an admin and OS is between Vista and Windows 7
1430 // inclusively, try to elevate and register. This is only intended for 1467 // inclusively, try to elevate and register. This is only intended for
1431 // user-level installs as system-level installs should always be run with 1468 // user-level installs as system-level installs should always be run with
1432 // admin rights. 1469 // admin rights.
1433 if (elevate_if_not_admin && 1470 if (elevate_if_not_admin &&
1434 base::win::GetVersion() >= base::win::VERSION_VISTA && 1471 base::win::GetVersion() >= base::win::VERSION_VISTA &&
1435 ElevateAndRegisterChrome(dist, chrome_exe, suffix, L"")) 1472 ElevateAndRegisterChrome(dist, chrome_exe, suffix, L""))
1436 return true; 1473 return true;
1437 1474
1438 // If we got to this point then all we can do is create ProgIds under HKCU. 1475 // If we got to this point then all we can do is create ProgId and basic app
1476 // registrations under HKCU.
1439 std::list<RegistryEntry*> entries; 1477 std::list<RegistryEntry*> entries;
1440 STLElementDeleter<std::list<RegistryEntry*> > entries_deleter(&entries); 1478 STLElementDeleter<std::list<RegistryEntry*> > entries_deleter(&entries);
1441 RegistryEntry::GetProgIdEntries(dist, chrome_exe, L"", &entries); 1479 RegistryEntry::GetProgIdEntries(dist, chrome_exe, string16(), &entries);
1442 // Prefer to use |suffix|; unless Chrome's ProgIds are already registered with 1480 // Prefer to use |suffix|; unless Chrome's ProgIds are already registered with
1443 // no suffix (as per the old registration style): in which case some other 1481 // no suffix (as per the old registration style): in which case some other
1444 // registry entries could refer to them and since we were not able to set our 1482 // registry entries could refer to them and since we were not able to set our
1445 // HKLM entries above, we are better off not altering these here. 1483 // HKLM entries above, we are better off not altering these here.
1446 if (!AreEntriesRegistered(entries, RegistryEntry::LOOK_IN_HKCU)) { 1484 if (!AreEntriesRegistered(entries, RegistryEntry::LOOK_IN_HKCU)) {
1447 if (!suffix.empty()) { 1485 if (!suffix.empty()) {
1448 STLDeleteElements(&entries); 1486 STLDeleteElements(&entries);
1449 RegistryEntry::GetProgIdEntries(dist, chrome_exe, suffix, &entries); 1487 RegistryEntry::GetProgIdEntries(dist, chrome_exe, suffix, &entries);
1488 RegistryEntry::GetAppRegistrationEntries(chrome_exe, suffix, &entries);
1450 } 1489 }
1451 return AddRegistryEntries(HKEY_CURRENT_USER, entries); 1490 return AddRegistryEntries(HKEY_CURRENT_USER, entries);
1491 } else {
1492 // The ProgId is registered unsuffixed in HKCU, also register the app with
1493 // Windows in HKCU (this was not done in the old registration style and
1494 // thus needs to be done after the above check for the unsuffixed
1495 // registration).
1496 STLDeleteElements(&entries);
1497 RegistryEntry::GetAppRegistrationEntries(chrome_exe, string16(), &entries);
1498 return AddRegistryEntries(HKEY_CURRENT_USER, entries);
1452 } 1499 }
1453 return true; 1500 return true;
1454 } 1501 }
1455 1502
1456 bool ShellUtil::RegisterChromeForProtocol(BrowserDistribution* dist, 1503 bool ShellUtil::RegisterChromeForProtocol(BrowserDistribution* dist,
1457 const string16& chrome_exe, 1504 const string16& chrome_exe,
1458 const string16& unique_suffix, 1505 const string16& unique_suffix,
1459 const string16& protocol, 1506 const string16& protocol,
1460 bool elevate_if_not_admin) { 1507 bool elevate_if_not_admin) {
1461 if (!dist->CanSetAsDefault()) 1508 if (!dist->CanSetAsDefault())
(...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after
1672 // are any left...). 1719 // are any left...).
1673 if (free_bits >= 8 && next_byte_index < size) { 1720 if (free_bits >= 8 && next_byte_index < size) {
1674 free_bits -= 8; 1721 free_bits -= 8;
1675 bit_stream += bytes[next_byte_index++] << free_bits; 1722 bit_stream += bytes[next_byte_index++] << free_bits;
1676 } 1723 }
1677 } 1724 }
1678 1725
1679 DCHECK_EQ(ret.length(), encoded_length); 1726 DCHECK_EQ(ret.length(), encoded_length);
1680 return ret; 1727 return ret;
1681 } 1728 }
OLDNEW
« chrome/installer/setup/uninstall.cc ('K') | « chrome/installer/util/shell_util.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698