| 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 381 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 392 entries->push_back(new RegistryEntry( | 392 entries->push_back(new RegistryEntry( |
| 393 capabilities, ShellUtil::kRegApplicationIcon, icon_path)); | 393 capabilities, ShellUtil::kRegApplicationIcon, icon_path)); |
| 394 entries->push_back(new RegistryEntry( | 394 entries->push_back(new RegistryEntry( |
| 395 capabilities, ShellUtil::kRegApplicationName, | 395 capabilities, ShellUtil::kRegApplicationName, |
| 396 dist->GetAppShortCutName())); | 396 dist->GetAppShortCutName())); |
| 397 | 397 |
| 398 entries->push_back(new RegistryEntry(capabilities + L"\\Startmenu", | 398 entries->push_back(new RegistryEntry(capabilities + L"\\Startmenu", |
| 399 L"StartMenuInternet", reg_app_name)); | 399 L"StartMenuInternet", reg_app_name)); |
| 400 | 400 |
| 401 const string16 html_prog_id(GetBrowserProgId(suffix)); | 401 const string16 html_prog_id(GetBrowserProgId(suffix)); |
| 402 for (int i = 0; ShellUtil::kFileAssociations[i] != NULL; i++) { | 402 for (int i = 0; ShellUtil::kPotentialFileAssociations[i] != NULL; i++) { |
| 403 entries->push_back(new RegistryEntry( | 403 entries->push_back(new RegistryEntry( |
| 404 capabilities + L"\\FileAssociations", | 404 capabilities + L"\\FileAssociations", |
| 405 ShellUtil::kFileAssociations[i], html_prog_id)); | 405 ShellUtil::kPotentialFileAssociations[i], html_prog_id)); |
| 406 } | 406 } |
| 407 for (int i = 0; ShellUtil::kPotentialProtocolAssociations[i] != NULL; | 407 for (int i = 0; ShellUtil::kPotentialProtocolAssociations[i] != NULL; |
| 408 i++) { | 408 i++) { |
| 409 entries->push_back(new RegistryEntry( | 409 entries->push_back(new RegistryEntry( |
| 410 capabilities + L"\\URLAssociations", | 410 capabilities + L"\\URLAssociations", |
| 411 ShellUtil::kPotentialProtocolAssociations[i], html_prog_id)); | 411 ShellUtil::kPotentialProtocolAssociations[i], html_prog_id)); |
| 412 } | 412 } |
| 413 } | 413 } |
| 414 | 414 |
| 415 // This method returns a list of the registry entries required for this | 415 // This method returns a list of the registry entries required for this |
| 416 // installation to be registered in the Windows shell. | 416 // installation to be registered in the Windows shell. |
| 417 // In particular: | 417 // In particular: |
| 418 // - App Paths | 418 // - App Paths |
| 419 // http://msdn.microsoft.com/en-us/library/windows/desktop/ee872121 | 419 // http://msdn.microsoft.com/en-us/library/windows/desktop/ee872121 |
| 420 // - File Associations | 420 // - File Associations |
| 421 // http://msdn.microsoft.com/en-us/library/bb166549 | 421 // http://msdn.microsoft.com/en-us/library/bb166549 |
| 422 // These entries need to be registered in HKLM prior to Win8. | 422 // These entries need to be registered in HKLM prior to Win8. |
| 423 static void GetAppRegistrationEntries(const string16& chrome_exe, | 423 static void GetAppRegistrationEntries(const string16& chrome_exe, |
| 424 const string16& suffix, | 424 const string16& suffix, |
| 425 ScopedVector<RegistryEntry>* entries) { | 425 ScopedVector<RegistryEntry>* entries) { |
| 426 const base::FilePath chrome_path(chrome_exe); | 426 const base::FilePath chrome_path(chrome_exe); |
| 427 string16 app_path_key(ShellUtil::kAppPathsRegistryKey); | 427 string16 app_path_key(ShellUtil::kAppPathsRegistryKey); |
| 428 app_path_key.push_back(base::FilePath::kSeparators[0]); | 428 app_path_key.push_back(base::FilePath::kSeparators[0]); |
| 429 app_path_key.append(chrome_path.BaseName().value()); | 429 app_path_key.append(chrome_path.BaseName().value()); |
| 430 entries->push_back(new RegistryEntry(app_path_key, chrome_exe)); | 430 entries->push_back(new RegistryEntry(app_path_key, chrome_exe)); |
| 431 entries->push_back(new RegistryEntry(app_path_key, | 431 entries->push_back(new RegistryEntry(app_path_key, |
| 432 ShellUtil::kAppPathsRegistryPathName, chrome_path.DirName().value())); | 432 ShellUtil::kAppPathsRegistryPathName, chrome_path.DirName().value())); |
| 433 | 433 |
| 434 const string16 html_prog_id(GetBrowserProgId(suffix)); | 434 const string16 html_prog_id(GetBrowserProgId(suffix)); |
| 435 for (int i = 0; ShellUtil::kFileAssociations[i] != NULL; i++) { | 435 for (int i = 0; ShellUtil::kPotentialFileAssociations[i] != NULL; i++) { |
| 436 string16 key(ShellUtil::kRegClasses); | 436 string16 key(ShellUtil::kRegClasses); |
| 437 key.push_back(base::FilePath::kSeparators[0]); | 437 key.push_back(base::FilePath::kSeparators[0]); |
| 438 key.append(ShellUtil::kFileAssociations[i]); | 438 key.append(ShellUtil::kPotentialFileAssociations[i]); |
| 439 key.push_back(base::FilePath::kSeparators[0]); | 439 key.push_back(base::FilePath::kSeparators[0]); |
| 440 key.append(ShellUtil::kRegOpenWithProgids); | 440 key.append(ShellUtil::kRegOpenWithProgids); |
| 441 entries->push_back(new RegistryEntry(key, html_prog_id, string16())); | 441 entries->push_back(new RegistryEntry(key, html_prog_id, string16())); |
| 442 } | 442 } |
| 443 } | 443 } |
| 444 | 444 |
| 445 // This method returns a list of all the user level registry entries that | 445 // This method returns a list of all the user level registry entries that |
| 446 // are needed to make Chromium the default handler for a protocol on XP. | 446 // are needed to make Chromium the default handler for a protocol on XP. |
| 447 static void GetXPStyleUserProtocolEntries( | 447 static void GetXPStyleUserProtocolEntries( |
| 448 const string16& protocol, | 448 const string16& protocol, |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 482 // Some of these entries are irrelevant in recent versions of Windows, but | 482 // Some of these entries are irrelevant in recent versions of Windows, but |
| 483 // we register them anyways as some legacy apps are hardcoded to lookup those | 483 // we register them anyways as some legacy apps are hardcoded to lookup those |
| 484 // values. | 484 // values. |
| 485 static void GetXPStyleDefaultBrowserUserEntries( | 485 static void GetXPStyleDefaultBrowserUserEntries( |
| 486 BrowserDistribution* dist, | 486 BrowserDistribution* dist, |
| 487 const string16& chrome_exe, | 487 const string16& chrome_exe, |
| 488 const string16& suffix, | 488 const string16& suffix, |
| 489 ScopedVector<RegistryEntry>* entries) { | 489 ScopedVector<RegistryEntry>* entries) { |
| 490 // File extension associations. | 490 // File extension associations. |
| 491 string16 html_prog_id(GetBrowserProgId(suffix)); | 491 string16 html_prog_id(GetBrowserProgId(suffix)); |
| 492 for (int i = 0; ShellUtil::kFileAssociations[i] != NULL; i++) { | 492 for (int i = 0; ShellUtil::kDefaultFileAssociations[i] != NULL; i++) { |
| 493 string16 ext_key(ShellUtil::kRegClasses); | 493 string16 ext_key(ShellUtil::kRegClasses); |
| 494 ext_key.push_back(base::FilePath::kSeparators[0]); | 494 ext_key.push_back(base::FilePath::kSeparators[0]); |
| 495 ext_key.append(ShellUtil::kFileAssociations[i]); | 495 ext_key.append(ShellUtil::kDefaultFileAssociations[i]); |
| 496 entries->push_back(new RegistryEntry(ext_key, html_prog_id)); | 496 entries->push_back(new RegistryEntry(ext_key, html_prog_id)); |
| 497 } | 497 } |
| 498 | 498 |
| 499 // Protocols associations. | 499 // Protocols associations. |
| 500 string16 chrome_open = ShellUtil::GetChromeShellOpenCmd(chrome_exe); | 500 string16 chrome_open = ShellUtil::GetChromeShellOpenCmd(chrome_exe); |
| 501 string16 chrome_icon = | 501 string16 chrome_icon = |
| 502 ShellUtil::FormatIconLocation(chrome_exe, dist->GetIconIndex()); | 502 ShellUtil::FormatIconLocation(chrome_exe, dist->GetIconIndex()); |
| 503 for (int i = 0; ShellUtil::kBrowserProtocolAssociations[i] != NULL; i++) { | 503 for (int i = 0; ShellUtil::kBrowserProtocolAssociations[i] != NULL; i++) { |
| 504 GetXPStyleUserProtocolEntries(ShellUtil::kBrowserProtocolAssociations[i], | 504 GetXPStyleUserProtocolEntries(ShellUtil::kBrowserProtocolAssociations[i], |
| 505 chrome_icon, chrome_open, entries); | 505 chrome_icon, chrome_open, entries); |
| (...skipping 707 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1213 // because of http://crbug.com/153349 as with the '.' and 26 characters suffix | 1213 // because of http://crbug.com/153349 as with the '.' and 26 characters suffix |
| 1214 // added on user-level installs, the generated progid for Chromium was 39 | 1214 // added on user-level installs, the generated progid for Chromium was 39 |
| 1215 // characters long which, according to MSDN ( | 1215 // characters long which, according to MSDN ( |
| 1216 // http://msdn.microsoft.com/library/aa911706.aspx), is the maximum length | 1216 // http://msdn.microsoft.com/library/aa911706.aspx), is the maximum length |
| 1217 // for a progid. It was however determined through experimentation that the 39 | 1217 // for a progid. It was however determined through experimentation that the 39 |
| 1218 // character limit mentioned on MSDN includes the NULL character... | 1218 // character limit mentioned on MSDN includes the NULL character... |
| 1219 const wchar_t* ShellUtil::kChromeHTMLProgId = L"ChromiumHTM"; | 1219 const wchar_t* ShellUtil::kChromeHTMLProgId = L"ChromiumHTM"; |
| 1220 const wchar_t* ShellUtil::kChromeHTMLProgIdDesc = L"Chromium HTML Document"; | 1220 const wchar_t* ShellUtil::kChromeHTMLProgIdDesc = L"Chromium HTML Document"; |
| 1221 #endif | 1221 #endif |
| 1222 | 1222 |
| 1223 const wchar_t* ShellUtil::kFileAssociations[] = {L".htm", L".html", L".shtml", | 1223 const wchar_t* ShellUtil::kDefaultFileAssociations[] = {L".htm", L".html", |
| 1224 L".xht", L".xhtml", NULL}; | 1224 L".shtml", L".xht", L".xhtml", NULL}; |
| 1225 const wchar_t* ShellUtil::kPotentialFileAssociations[] = {L".htm", L".html", |
| 1226 L".shtml", L".xht", L".xhtml", L".webp", NULL}; |
| 1225 const wchar_t* ShellUtil::kBrowserProtocolAssociations[] = {L"ftp", L"http", | 1227 const wchar_t* ShellUtil::kBrowserProtocolAssociations[] = {L"ftp", L"http", |
| 1226 L"https", NULL}; | 1228 L"https", NULL}; |
| 1227 const wchar_t* ShellUtil::kPotentialProtocolAssociations[] = {L"ftp", L"http", | 1229 const wchar_t* ShellUtil::kPotentialProtocolAssociations[] = {L"ftp", L"http", |
| 1228 L"https", L"irc", L"mailto", L"mms", L"news", L"nntp", L"sms", L"smsto", | 1230 L"https", L"irc", L"mailto", L"mms", L"news", L"nntp", L"sms", L"smsto", |
| 1229 L"tel", L"urn", L"webcal", NULL}; | 1231 L"tel", L"urn", L"webcal", NULL}; |
| 1230 const wchar_t* ShellUtil::kRegUrlProtocol = L"URL Protocol"; | 1232 const wchar_t* ShellUtil::kRegUrlProtocol = L"URL Protocol"; |
| 1231 const wchar_t* ShellUtil::kRegApplication = L"\\Application"; | 1233 const wchar_t* ShellUtil::kRegApplication = L"\\Application"; |
| 1232 const wchar_t* ShellUtil::kRegAppUserModelId = L"AppUserModelId"; | 1234 const wchar_t* ShellUtil::kRegAppUserModelId = L"AppUserModelId"; |
| 1233 const wchar_t* ShellUtil::kRegApplicationDescription = | 1235 const wchar_t* ShellUtil::kRegApplicationDescription = |
| 1234 L"ApplicationDescription"; | 1236 L"ApplicationDescription"; |
| (...skipping 355 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1590 hr = pAAR->SetAppAsDefault(app_name.c_str(), | 1592 hr = pAAR->SetAppAsDefault(app_name.c_str(), |
| 1591 ShellUtil::kBrowserProtocolAssociations[i], AT_URLPROTOCOL); | 1593 ShellUtil::kBrowserProtocolAssociations[i], AT_URLPROTOCOL); |
| 1592 if (!SUCCEEDED(hr)) { | 1594 if (!SUCCEEDED(hr)) { |
| 1593 ret = false; | 1595 ret = false; |
| 1594 LOG(ERROR) << "Failed to register as default for protocol " | 1596 LOG(ERROR) << "Failed to register as default for protocol " |
| 1595 << ShellUtil::kBrowserProtocolAssociations[i] | 1597 << ShellUtil::kBrowserProtocolAssociations[i] |
| 1596 << " (" << hr << ")"; | 1598 << " (" << hr << ")"; |
| 1597 } | 1599 } |
| 1598 } | 1600 } |
| 1599 | 1601 |
| 1600 for (int i = 0; ShellUtil::kFileAssociations[i] != NULL; i++) { | 1602 for (int i = 0; ShellUtil::kDefaultFileAssociations[i] != NULL; i++) { |
| 1601 hr = pAAR->SetAppAsDefault(app_name.c_str(), | 1603 hr = pAAR->SetAppAsDefault(app_name.c_str(), |
| 1602 ShellUtil::kFileAssociations[i], AT_FILEEXTENSION); | 1604 ShellUtil::kDefaultFileAssociations[i], AT_FILEEXTENSION); |
| 1603 if (!SUCCEEDED(hr)) { | 1605 if (!SUCCEEDED(hr)) { |
| 1604 ret = false; | 1606 ret = false; |
| 1605 LOG(ERROR) << "Failed to register as default for file extension " | 1607 LOG(ERROR) << "Failed to register as default for file extension " |
| 1606 << ShellUtil::kFileAssociations[i] << " (" << hr << ")"; | 1608 << ShellUtil::kDefaultFileAssociations[i] |
| 1609 << " (" << hr << ")"; |
| 1607 } | 1610 } |
| 1608 } | 1611 } |
| 1609 } | 1612 } |
| 1610 } | 1613 } |
| 1611 | 1614 |
| 1612 if (!RegisterChromeAsDefaultXPStyle(dist, shell_change, chrome_exe)) | 1615 if (!RegisterChromeAsDefaultXPStyle(dist, shell_change, chrome_exe)) |
| 1613 ret = false; | 1616 ret = false; |
| 1614 | 1617 |
| 1615 // Send Windows notification event so that it can update icons for | 1618 // Send Windows notification event so that it can update icons for |
| 1616 // file associations. | 1619 // file associations. |
| (...skipping 401 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2018 // are any left...). | 2021 // are any left...). |
| 2019 if (free_bits >= 8 && next_byte_index < size) { | 2022 if (free_bits >= 8 && next_byte_index < size) { |
| 2020 free_bits -= 8; | 2023 free_bits -= 8; |
| 2021 bit_stream += bytes[next_byte_index++] << free_bits; | 2024 bit_stream += bytes[next_byte_index++] << free_bits; |
| 2022 } | 2025 } |
| 2023 } | 2026 } |
| 2024 | 2027 |
| 2025 DCHECK_EQ(ret.length(), encoded_length); | 2028 DCHECK_EQ(ret.length(), encoded_length); |
| 2026 return ret; | 2029 return ret; |
| 2027 } | 2030 } |
| OLD | NEW |