Chromium Code Reviews| 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 1289 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1300 } | 1300 } |
| 1301 | 1301 |
| 1302 | 1302 |
| 1303 // If the folder specified by {|location|, |dist|, |level|} is empty, remove it. | 1303 // If the folder specified by {|location|, |dist|, |level|} is empty, remove it. |
| 1304 // Otherwise do nothing. Returns true on success, including the vacuous case | 1304 // Otherwise do nothing. Returns true on success, including the vacuous case |
| 1305 // where no deletion occurred because directory is non-empty. | 1305 // where no deletion occurred because directory is non-empty. |
| 1306 bool RemoveShortcutFolderIfEmpty(ShellUtil::ShortcutLocation location, | 1306 bool RemoveShortcutFolderIfEmpty(ShellUtil::ShortcutLocation location, |
| 1307 BrowserDistribution* dist, | 1307 BrowserDistribution* dist, |
| 1308 ShellUtil::ShellChange level) { | 1308 ShellUtil::ShellChange level) { |
| 1309 // Explicitly whitelist locations, since accidental calls can be very harmful. | 1309 // Explicitly whitelist locations, since accidental calls can be very harmful. |
| 1310 if (location != ShellUtil::SHORTCUT_LOCATION_START_MENU && | 1310 if (location != ShellUtil::SHORTCUT_LOCATION_START_MENU_CHROME_DIR && |
| 1311 location != ShellUtil::SHORTCUT_LOCATION_START_MENU_CHROME_APPS_DIR && | |
| 1311 location != ShellUtil::SHORTCUT_LOCATION_APP_SHORTCUTS) { | 1312 location != ShellUtil::SHORTCUT_LOCATION_APP_SHORTCUTS) { |
| 1312 NOTREACHED(); | 1313 NOTREACHED(); |
| 1313 return false; | 1314 return false; |
| 1314 } | 1315 } |
| 1315 | 1316 |
| 1316 base::FilePath shortcut_folder; | 1317 base::FilePath shortcut_folder; |
| 1317 if (!ShellUtil::GetShortcutPath(location, dist, level, &shortcut_folder)) { | 1318 if (!ShellUtil::GetShortcutPath(location, dist, level, &shortcut_folder)) { |
| 1318 LOG(WARNING) << "Cannot find path at location " << location; | 1319 LOG(WARNING) << "Cannot find path at location " << location; |
| 1319 return false; | 1320 return false; |
| 1320 } | 1321 } |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1389 return QuickIsChromeRegistered(dist, chrome_exe, suffix, | 1390 return QuickIsChromeRegistered(dist, chrome_exe, suffix, |
| 1390 CONFIRM_SHELL_REGISTRATION_IN_HKLM); | 1391 CONFIRM_SHELL_REGISTRATION_IN_HKLM); |
| 1391 } | 1392 } |
| 1392 | 1393 |
| 1393 bool ShellUtil::ShortcutLocationIsSupported( | 1394 bool ShellUtil::ShortcutLocationIsSupported( |
| 1394 ShellUtil::ShortcutLocation location) { | 1395 ShellUtil::ShortcutLocation location) { |
| 1395 switch (location) { | 1396 switch (location) { |
| 1396 case SHORTCUT_LOCATION_DESKTOP: | 1397 case SHORTCUT_LOCATION_DESKTOP: |
| 1397 return true; | 1398 return true; |
| 1398 case SHORTCUT_LOCATION_QUICK_LAUNCH: | 1399 case SHORTCUT_LOCATION_QUICK_LAUNCH: |
| 1399 return true; | 1400 return true; |
|
gab
2013/08/28 19:52:27
Also collapse above two cases into the same case.
| |
| 1400 case SHORTCUT_LOCATION_START_MENU: | 1401 case SHORTCUT_LOCATION_START_MENU_ROOT: |
|
gab
2013/08/28 19:52:27
Add explicit comment after falling through case st
calamity
2013/10/02 01:08:05
Done.
| |
| 1402 case SHORTCUT_LOCATION_START_MENU_CHROME_DIR: | |
| 1403 case SHORTCUT_LOCATION_START_MENU_CHROME_APPS_DIR: | |
| 1401 return true; | 1404 return true; |
| 1402 case SHORTCUT_LOCATION_TASKBAR_PINS: | 1405 case SHORTCUT_LOCATION_TASKBAR_PINS: |
| 1403 return base::win::GetVersion() >= base::win::VERSION_WIN7; | 1406 return base::win::GetVersion() >= base::win::VERSION_WIN7; |
| 1404 case SHORTCUT_LOCATION_APP_SHORTCUTS: | 1407 case SHORTCUT_LOCATION_APP_SHORTCUTS: |
| 1405 return base::win::GetVersion() >= base::win::VERSION_WIN8; | 1408 return base::win::GetVersion() >= base::win::VERSION_WIN8; |
| 1406 default: | 1409 default: |
| 1407 NOTREACHED(); | 1410 NOTREACHED(); |
| 1408 return false; | 1411 return false; |
| 1409 } | 1412 } |
| 1410 } | 1413 } |
| 1411 | 1414 |
| 1412 bool ShellUtil::GetShortcutPath(ShellUtil::ShortcutLocation location, | 1415 bool ShellUtil::GetShortcutPath(ShellUtil::ShortcutLocation location, |
| 1413 BrowserDistribution* dist, | 1416 BrowserDistribution* dist, |
| 1414 ShellChange level, | 1417 ShellChange level, |
| 1415 base::FilePath* path) { | 1418 base::FilePath* path) { |
| 1416 DCHECK(path); | 1419 DCHECK(path); |
| 1417 int dir_key = -1; | 1420 int dir_key = -1; |
| 1418 bool add_folder_for_dist = false; | 1421 base::string16 folder_to_append; |
| 1419 switch (location) { | 1422 switch (location) { |
| 1420 case SHORTCUT_LOCATION_DESKTOP: | 1423 case SHORTCUT_LOCATION_DESKTOP: |
| 1421 dir_key = (level == CURRENT_USER) ? base::DIR_USER_DESKTOP : | 1424 dir_key = (level == CURRENT_USER) ? base::DIR_USER_DESKTOP : |
| 1422 base::DIR_COMMON_DESKTOP; | 1425 base::DIR_COMMON_DESKTOP; |
| 1423 break; | 1426 break; |
| 1424 case SHORTCUT_LOCATION_QUICK_LAUNCH: | 1427 case SHORTCUT_LOCATION_QUICK_LAUNCH: |
| 1425 dir_key = (level == CURRENT_USER) ? base::DIR_USER_QUICK_LAUNCH : | 1428 dir_key = (level == CURRENT_USER) ? base::DIR_USER_QUICK_LAUNCH : |
| 1426 base::DIR_DEFAULT_USER_QUICK_LAUNCH; | 1429 base::DIR_DEFAULT_USER_QUICK_LAUNCH; |
| 1427 break; | 1430 break; |
| 1428 case SHORTCUT_LOCATION_START_MENU: | 1431 case SHORTCUT_LOCATION_START_MENU_ROOT: |
| 1429 dir_key = (level == CURRENT_USER) ? base::DIR_START_MENU : | 1432 dir_key = (level == CURRENT_USER) ? base::DIR_START_MENU : |
| 1430 base::DIR_COMMON_START_MENU; | 1433 base::DIR_COMMON_START_MENU; |
| 1431 add_folder_for_dist = true; | 1434 break; |
| 1435 case SHORTCUT_LOCATION_START_MENU_CHROME_DIR: | |
| 1436 dir_key = (level == CURRENT_USER) ? base::DIR_START_MENU : | |
| 1437 base::DIR_COMMON_START_MENU; | |
| 1438 folder_to_append = dist->GetStartMenuShortcutSubfolder( | |
| 1439 BrowserDistribution::SUBFOLDER_CHROME); | |
| 1440 break; | |
| 1441 case SHORTCUT_LOCATION_START_MENU_CHROME_APPS_DIR: | |
| 1442 dir_key = (level == CURRENT_USER) ? base::DIR_START_MENU : | |
| 1443 base::DIR_COMMON_START_MENU; | |
| 1444 folder_to_append = dist->GetStartMenuShortcutSubfolder( | |
| 1445 BrowserDistribution::SUBFOLDER_APPS); | |
| 1432 break; | 1446 break; |
| 1433 case SHORTCUT_LOCATION_TASKBAR_PINS: | 1447 case SHORTCUT_LOCATION_TASKBAR_PINS: |
| 1434 dir_key = base::DIR_TASKBAR_PINS; | 1448 dir_key = base::DIR_TASKBAR_PINS; |
| 1435 break; | 1449 break; |
| 1436 case SHORTCUT_LOCATION_APP_SHORTCUTS: | 1450 case SHORTCUT_LOCATION_APP_SHORTCUTS: |
| 1437 // TODO(huangs): Move GetAppShortcutsFolder() logic into base_paths_win. | 1451 // TODO(huangs): Move GetAppShortcutsFolder() logic into base_paths_win. |
| 1438 return GetAppShortcutsFolder(dist, level, path); | 1452 return GetAppShortcutsFolder(dist, level, path); |
| 1439 | 1453 |
| 1440 default: | 1454 default: |
| 1441 NOTREACHED(); | 1455 NOTREACHED(); |
| 1442 return false; | 1456 return false; |
| 1443 } | 1457 } |
| 1444 | 1458 |
| 1445 if (!PathService::Get(dir_key, path) || path->empty()) { | 1459 if (!PathService::Get(dir_key, path) || path->empty()) { |
| 1446 NOTREACHED() << dir_key; | 1460 NOTREACHED() << dir_key; |
| 1447 return false; | 1461 return false; |
| 1448 } | 1462 } |
| 1449 | 1463 |
| 1450 if (add_folder_for_dist) { | 1464 if (!folder_to_append.empty()) |
| 1451 *path = path->Append(dist->GetStartMenuShortcutSubfolder( | 1465 *path = path->Append(folder_to_append); |
| 1452 BrowserDistribution::SUBFOLDER_CHROME)); | |
| 1453 } | |
| 1454 | 1466 |
| 1455 return true; | 1467 return true; |
| 1456 } | 1468 } |
| 1457 | 1469 |
| 1458 bool ShellUtil::CreateOrUpdateShortcut( | 1470 bool ShellUtil::CreateOrUpdateShortcut( |
| 1459 ShellUtil::ShortcutLocation location, | 1471 ShellUtil::ShortcutLocation location, |
| 1460 BrowserDistribution* dist, | 1472 BrowserDistribution* dist, |
| 1461 const ShellUtil::ShortcutProperties& properties, | 1473 const ShellUtil::ShortcutProperties& properties, |
| 1462 ShellUtil::ShortcutOperation operation) { | 1474 ShellUtil::ShortcutOperation operation) { |
| 1463 // Explicitly whitelist locations to which this is applicable. | 1475 // Explicitly whitelist locations to which this is applicable. |
| 1464 if (location != SHORTCUT_LOCATION_DESKTOP && | 1476 if (location != SHORTCUT_LOCATION_DESKTOP && |
| 1465 location != SHORTCUT_LOCATION_QUICK_LAUNCH && | 1477 location != SHORTCUT_LOCATION_QUICK_LAUNCH && |
| 1466 location != SHORTCUT_LOCATION_START_MENU) { | 1478 location != SHORTCUT_LOCATION_START_MENU_ROOT && |
| 1479 location != SHORTCUT_LOCATION_START_MENU_CHROME_DIR && | |
| 1480 location != SHORTCUT_LOCATION_START_MENU_CHROME_APPS_DIR) { | |
| 1467 NOTREACHED(); | 1481 NOTREACHED(); |
| 1468 return false; | 1482 return false; |
| 1469 } | 1483 } |
| 1470 | 1484 |
| 1471 DCHECK(dist); | 1485 DCHECK(dist); |
| 1472 // |pin_to_taskbar| is only acknowledged when first creating the shortcut. | 1486 // |pin_to_taskbar| is only acknowledged when first creating the shortcut. |
| 1473 DCHECK(!properties.pin_to_taskbar || | 1487 DCHECK(!properties.pin_to_taskbar || |
| 1474 operation == SHELL_SHORTCUT_CREATE_ALWAYS || | 1488 operation == SHELL_SHORTCUT_CREATE_ALWAYS || |
| 1475 operation == SHELL_SHORTCUT_CREATE_IF_NO_SYSTEM_LEVEL); | 1489 operation == SHELL_SHORTCUT_CREATE_IF_NO_SYSTEM_LEVEL); |
| 1476 | 1490 |
| (...skipping 567 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2044 | 2058 |
| 2045 FilterTargetEq shortcut_filter(target_exe); | 2059 FilterTargetEq shortcut_filter(target_exe); |
| 2046 // Main operation to apply to each shortcut in the directory specified. | 2060 // Main operation to apply to each shortcut in the directory specified. |
| 2047 ShortcutOperationCallback shortcut_operation( | 2061 ShortcutOperationCallback shortcut_operation( |
| 2048 location == SHORTCUT_LOCATION_TASKBAR_PINS ? | 2062 location == SHORTCUT_LOCATION_TASKBAR_PINS ? |
| 2049 base::Bind(&ShortcutOpUnpin) : base::Bind(&ShortcutOpDelete)); | 2063 base::Bind(&ShortcutOpUnpin) : base::Bind(&ShortcutOpDelete)); |
| 2050 bool success = BatchShortcutAction(shortcut_filter.AsShortcutFilterCallback(), | 2064 bool success = BatchShortcutAction(shortcut_filter.AsShortcutFilterCallback(), |
| 2051 shortcut_operation, location, dist, level); | 2065 shortcut_operation, location, dist, level); |
| 2052 // Remove chrome-specific shortcut folders if they are now empty. | 2066 // Remove chrome-specific shortcut folders if they are now empty. |
| 2053 if (success && | 2067 if (success && |
| 2054 (location == SHORTCUT_LOCATION_START_MENU || | 2068 (location == SHORTCUT_LOCATION_START_MENU_CHROME_DIR || |
| 2069 location == SHORTCUT_LOCATION_START_MENU_CHROME_APPS_DIR || | |
| 2055 location == SHORTCUT_LOCATION_APP_SHORTCUTS)) { | 2070 location == SHORTCUT_LOCATION_APP_SHORTCUTS)) { |
| 2056 success = RemoveShortcutFolderIfEmpty(location, dist, level); | 2071 success = RemoveShortcutFolderIfEmpty(location, dist, level); |
| 2057 } | 2072 } |
| 2058 return success; | 2073 return success; |
| 2059 } | 2074 } |
| 2060 | 2075 |
| 2061 // static | 2076 // static |
| 2062 bool ShellUtil::UpdateShortcuts( | 2077 bool ShellUtil::UpdateShortcuts( |
| 2063 ShellUtil::ShortcutLocation location, | 2078 ShellUtil::ShortcutLocation location, |
| 2064 BrowserDistribution* dist, | 2079 BrowserDistribution* dist, |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2135 // are any left...). | 2150 // are any left...). |
| 2136 if (free_bits >= 8 && next_byte_index < size) { | 2151 if (free_bits >= 8 && next_byte_index < size) { |
| 2137 free_bits -= 8; | 2152 free_bits -= 8; |
| 2138 bit_stream += bytes[next_byte_index++] << free_bits; | 2153 bit_stream += bytes[next_byte_index++] << free_bits; |
| 2139 } | 2154 } |
| 2140 } | 2155 } |
| 2141 | 2156 |
| 2142 DCHECK_EQ(ret.length(), encoded_length); | 2157 DCHECK_EQ(ret.length(), encoded_length); |
| 2143 return ret; | 2158 return ret; |
| 2144 } | 2159 } |
| OLD | NEW |