| 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 #include "chrome/browser/shell_integration.h" | 5 #include "chrome/browser/shell_integration.h" |
| 6 | 6 |
| 7 #include <vector> | 7 #include <vector> |
| 8 | 8 |
| 9 #include "base/file_util.h" | 9 #include "base/file_util.h" |
| 10 #include "base/files/file_path.h" | 10 #include "base/files/file_path.h" |
| 11 #include "base/files/scoped_temp_dir.h" | 11 #include "base/files/scoped_temp_dir.h" |
| 12 #include "base/strings/string_number_conversions.h" | 12 #include "base/strings/string_number_conversions.h" |
| 13 #include "base/test/test_shortcut_win.h" | 13 #include "base/test/test_shortcut_win.h" |
| 14 #include "base/win/scoped_com_initializer.h" | 14 #include "base/win/scoped_com_initializer.h" |
| 15 #include "base/win/windows_version.h" | 15 #include "base/win/windows_version.h" |
| 16 #include "chrome/common/chrome_constants.h" | 16 #include "chrome/common/chrome_constants.h" |
| 17 #include "chrome/common/chrome_paths_internal.h" | 17 #include "chrome/common/chrome_paths_internal.h" |
| 18 #include "chrome/installer/util/browser_distribution.h" | 18 #include "chrome/installer/util/browser_distribution.h" |
| 19 #include "chrome/installer/util/shell_util.h" | 19 #include "chrome/installer/util/shell_util.h" |
| 20 #include "chrome/installer/util/util_constants.h" | 20 #include "chrome/installer/util/util_constants.h" |
| 21 #include "testing/gtest/include/gtest/gtest.h" | 21 #include "testing/gtest/include/gtest/gtest.h" |
| 22 | 22 |
| 23 namespace { | 23 namespace { |
| 24 | 24 |
| 25 class ShellIntegrationWinMigrateShortcutTest : public testing::Test { | 25 class ShortcutTest : public testing::Test { |
| 26 protected: | 26 protected: |
| 27 virtual void CreateShortcuts() = 0; |
| 28 |
| 27 virtual void SetUp() OVERRIDE { | 29 virtual void SetUp() OVERRIDE { |
| 28 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); | 30 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); |
| 29 | 31 |
| 30 // A path to a random target. | 32 // A path to a random target. |
| 31 base::FilePath other_target; | 33 file_util::CreateTemporaryFileInDir(temp_dir_.path(), &other_target_); |
| 32 file_util::CreateTemporaryFileInDir(temp_dir_.path(), &other_target); | |
| 33 | 34 |
| 34 // This doesn't need to actually have a base name of "chrome.exe". | 35 // This doesn't need to actually have a base name of "chrome.exe". |
| 35 file_util::CreateTemporaryFileInDir(temp_dir_.path(), &chrome_exe_); | 36 file_util::CreateTemporaryFileInDir(temp_dir_.path(), &chrome_exe_); |
| 37 file_util::CreateTemporaryFileInDir(temp_dir_.path(), &app_host_exe_); |
| 36 | 38 |
| 37 chrome_app_id_ = | 39 chrome_app_id_ = |
| 38 ShellUtil::GetBrowserModelId(BrowserDistribution::GetDistribution(), | 40 ShellUtil::GetBrowserModelId(BrowserDistribution::GetDistribution(), |
| 39 true); | 41 true); |
| 40 | 42 |
| 43 base::FilePath default_user_data_dir; |
| 44 chrome::GetDefaultUserDataDirectory(&default_user_data_dir); |
| 45 base::FilePath default_profile_path = |
| 46 default_user_data_dir.AppendASCII(chrome::kInitialProfile); |
| 47 app_list_app_id_ = |
| 48 ShellIntegration::GetAppListAppModelIdForProfile(default_profile_path); |
| 49 non_default_profile_ = string16(L"NonDefault"); |
| 50 non_default_chrome_app_id_ = |
| 51 ShellIntegration::GetChromiumModelIdForProfile( |
| 52 default_user_data_dir.Append(non_default_profile_)); |
| 53 |
| 54 CreateShortcuts(); |
| 55 } |
| 56 |
| 57 void AddTestShortcut( |
| 58 const base::win::ShortcutProperties& shortcut_properties) { |
| 59 shortcuts_properties_.push_back(shortcut_properties); |
| 60 base::FilePath shortcut_path = |
| 61 temp_dir_.path().Append(L"Shortcut " + |
| 62 base::IntToString16(shortcuts_.size()) + |
| 63 installer::kLnkExt); |
| 64 shortcuts_.push_back(shortcut_path); |
| 65 ASSERT_TRUE(base::win::CreateOrUpdateShortcutLink( |
| 66 shortcut_path, shortcut_properties, |
| 67 base::win::SHORTCUT_CREATE_ALWAYS)); |
| 68 } |
| 69 |
| 70 base::win::ScopedCOMInitializer com_initializer_; |
| 71 |
| 72 base::ScopedTempDir temp_dir_; |
| 73 |
| 74 // Test shortcuts. |
| 75 std::vector<base::FilePath> shortcuts_; |
| 76 |
| 77 // Initial properties for the test shortcuts. |
| 78 std::vector<base::win::ShortcutProperties> shortcuts_properties_; |
| 79 |
| 80 // The path to a fake chrome.exe. |
| 81 base::FilePath chrome_exe_; |
| 82 |
| 83 // The path to a fake app_host.exe. |
| 84 base::FilePath app_host_exe_; |
| 85 |
| 86 // The path to a random target. |
| 87 base::FilePath other_target_; |
| 88 |
| 89 // Chrome's AppUserModelId. |
| 90 string16 chrome_app_id_; |
| 91 |
| 92 // A profile that isn't the Default profile. |
| 93 string16 non_default_profile_; |
| 94 |
| 95 // Chrome's AppUserModelId for the non-default profile. |
| 96 string16 non_default_chrome_app_id_; |
| 97 |
| 98 // The app launcher's app id. |
| 99 string16 app_list_app_id_; |
| 100 }; |
| 101 |
| 102 class ShellIntegrationWinMigrateShortcutTest : public ShortcutTest { |
| 103 protected: |
| 104 virtual void CreateShortcuts() OVERRIDE { |
| 41 // A temporary object to pass properties to AddTestShortcut(). | 105 // A temporary object to pass properties to AddTestShortcut(). |
| 42 base::win::ShortcutProperties temp_properties; | 106 base::win::ShortcutProperties temp_properties; |
| 43 | 107 |
| 44 // Shortcut 0 doesn't point to chrome.exe and thus should never be migrated. | 108 // Shortcut 0 doesn't point to chrome.exe and thus should never be migrated. |
| 45 temp_properties.set_target(other_target); | 109 temp_properties.set_target(other_target_); |
| 46 temp_properties.set_app_id(L"Dumbo"); | 110 temp_properties.set_app_id(L"Dumbo"); |
| 47 temp_properties.set_dual_mode(false); | 111 temp_properties.set_dual_mode(false); |
| 48 ASSERT_NO_FATAL_FAILURE(AddTestShortcut(temp_properties)); | 112 ASSERT_NO_FATAL_FAILURE(AddTestShortcut(temp_properties)); |
| 49 | 113 |
| 50 // Shortcut 1 points to chrome.exe and thus should be migrated. | 114 // Shortcut 1 points to chrome.exe and thus should be migrated. |
| 51 temp_properties.set_target(chrome_exe_); | 115 temp_properties.set_target(chrome_exe_); |
| 52 temp_properties.set_app_id(L"Dumbo"); | 116 temp_properties.set_app_id(L"Dumbo"); |
| 53 temp_properties.set_dual_mode(false); | 117 temp_properties.set_dual_mode(false); |
| 54 ASSERT_NO_FATAL_FAILURE(AddTestShortcut(temp_properties)); | 118 ASSERT_NO_FATAL_FAILURE(AddTestShortcut(temp_properties)); |
| 55 | 119 |
| (...skipping 26 matching lines...) Expand all Loading... |
| 82 temp_properties.set_target(chrome_exe_); | 146 temp_properties.set_target(chrome_exe_); |
| 83 temp_properties.set_app_id(same_size_as_chrome_app_id); | 147 temp_properties.set_app_id(same_size_as_chrome_app_id); |
| 84 temp_properties.set_dual_mode(false); | 148 temp_properties.set_dual_mode(false); |
| 85 ASSERT_NO_FATAL_FAILURE(AddTestShortcut(temp_properties)); | 149 ASSERT_NO_FATAL_FAILURE(AddTestShortcut(temp_properties)); |
| 86 | 150 |
| 87 // Shortcut 6 doesn't have an app_id, nor is dual_mode even set; they should | 151 // Shortcut 6 doesn't have an app_id, nor is dual_mode even set; they should |
| 88 // be set as expected upon migration. | 152 // be set as expected upon migration. |
| 89 base::win::ShortcutProperties no_properties; | 153 base::win::ShortcutProperties no_properties; |
| 90 no_properties.set_target(chrome_exe_); | 154 no_properties.set_target(chrome_exe_); |
| 91 ASSERT_NO_FATAL_FAILURE(AddTestShortcut(no_properties)); | 155 ASSERT_NO_FATAL_FAILURE(AddTestShortcut(no_properties)); |
| 156 |
| 157 // Shortcut 7 has a non-default profile directory and so should get a non- |
| 158 // default app id. |
| 159 temp_properties.set_target(chrome_exe_); |
| 160 temp_properties.set_app_id(L"Dumbo"); |
| 161 temp_properties.set_arguments( |
| 162 string16(L"--profile-directory=") + non_default_profile_); |
| 163 temp_properties.set_dual_mode(false); |
| 164 ASSERT_NO_FATAL_FAILURE(AddTestShortcut(temp_properties)); |
| 92 } | 165 } |
| 93 | |
| 94 void AddTestShortcut( | |
| 95 const base::win::ShortcutProperties& shortcut_properties) { | |
| 96 shortcuts_properties_.push_back(shortcut_properties); | |
| 97 base::FilePath shortcut_path = | |
| 98 temp_dir_.path().Append(L"Shortcut " + | |
| 99 base::IntToString16(shortcuts_.size()) + | |
| 100 installer::kLnkExt); | |
| 101 shortcuts_.push_back(shortcut_path); | |
| 102 ASSERT_TRUE(base::win::CreateOrUpdateShortcutLink( | |
| 103 shortcut_path, shortcut_properties, | |
| 104 base::win::SHORTCUT_CREATE_ALWAYS)); | |
| 105 } | |
| 106 | |
| 107 base::win::ScopedCOMInitializer com_initializer_; | |
| 108 base::ScopedTempDir temp_dir_; | |
| 109 | |
| 110 // The path to a fake chrome.exe. | |
| 111 base::FilePath chrome_exe_; | |
| 112 | |
| 113 // Test shortcuts. | |
| 114 std::vector<base::FilePath> shortcuts_; | |
| 115 | |
| 116 // Initial properties for the test shortcuts. | |
| 117 std::vector<base::win::ShortcutProperties> shortcuts_properties_; | |
| 118 | |
| 119 // Chrome's AppUserModelId. | |
| 120 string16 chrome_app_id_; | |
| 121 }; | 166 }; |
| 122 | 167 |
| 123 } // namespace | 168 } // namespace |
| 124 | 169 |
| 125 // Test migration when not checking for dual mode. | 170 // Test migration when not checking for dual mode. |
| 126 TEST_F(ShellIntegrationWinMigrateShortcutTest, DontCheckDualMode) { | 171 TEST_F(ShellIntegrationWinMigrateShortcutTest, DontCheckDualMode) { |
| 127 if (base::win::GetVersion() < base::win::VERSION_WIN7) | 172 if (base::win::GetVersion() < base::win::VERSION_WIN7) |
| 128 return; | 173 return; |
| 129 | 174 |
| 130 EXPECT_EQ(4, | 175 EXPECT_EQ(5, |
| 131 ShellIntegration::MigrateShortcutsInPathInternal( | 176 ShellIntegration::MigrateShortcutsInPathInternal( |
| 132 chrome_exe_, temp_dir_.path(), false)); | 177 chrome_exe_, temp_dir_.path(), false)); |
| 133 | 178 |
| 134 // Only shortcut 1, 4, 5, and 6 should have been migrated. | 179 // Only shortcut 1, 4, 5, 6 and 7 should have been migrated. |
| 135 shortcuts_properties_[1].set_app_id(chrome_app_id_); | 180 shortcuts_properties_[1].set_app_id(chrome_app_id_); |
| 136 shortcuts_properties_[4].set_app_id(chrome_app_id_); | 181 shortcuts_properties_[4].set_app_id(chrome_app_id_); |
| 137 shortcuts_properties_[5].set_app_id(chrome_app_id_); | 182 shortcuts_properties_[5].set_app_id(chrome_app_id_); |
| 138 shortcuts_properties_[6].set_app_id(chrome_app_id_); | 183 shortcuts_properties_[6].set_app_id(chrome_app_id_); |
| 184 shortcuts_properties_[7].set_app_id(non_default_chrome_app_id_); |
| 139 | 185 |
| 140 for (size_t i = 0; i < shortcuts_.size(); ++i) | 186 for (size_t i = 0; i < shortcuts_.size(); ++i) |
| 141 base::win::ValidateShortcut(shortcuts_[i], shortcuts_properties_[i]); | 187 base::win::ValidateShortcut(shortcuts_[i], shortcuts_properties_[i]); |
| 142 } | 188 } |
| 143 | 189 |
| 144 // Test migration when also checking for dual mode. | 190 // Test migration when also checking for dual mode. |
| 145 TEST_F(ShellIntegrationWinMigrateShortcutTest, CheckDualMode) { | 191 TEST_F(ShellIntegrationWinMigrateShortcutTest, CheckDualMode) { |
| 146 if (base::win::GetVersion() < base::win::VERSION_WIN7) | 192 if (base::win::GetVersion() < base::win::VERSION_WIN7) |
| 147 return; | 193 return; |
| 148 | 194 |
| 149 EXPECT_EQ(5, | 195 EXPECT_EQ(6, |
| 150 ShellIntegration::MigrateShortcutsInPathInternal( | 196 ShellIntegration::MigrateShortcutsInPathInternal( |
| 151 chrome_exe_, temp_dir_.path(), true)); | 197 chrome_exe_, temp_dir_.path(), true)); |
| 152 | 198 |
| 153 // Shortcut 1, 4, 5, and 6 should have had both their app_id and dual_mode | 199 // Shortcut 1, 4, 5, 6 and 7 should have had both their app_id and dual_mode |
| 154 // properties fixed and shortcut 2 should also have had it's dual_mode | 200 // properties fixed and shortcut 2 should also have had it's dual_mode |
| 155 // property fixed. | 201 // property fixed. |
| 156 shortcuts_properties_[1].set_app_id(chrome_app_id_); | 202 shortcuts_properties_[1].set_app_id(chrome_app_id_); |
| 157 shortcuts_properties_[4].set_app_id(chrome_app_id_); | 203 shortcuts_properties_[4].set_app_id(chrome_app_id_); |
| 158 shortcuts_properties_[5].set_app_id(chrome_app_id_); | 204 shortcuts_properties_[5].set_app_id(chrome_app_id_); |
| 159 shortcuts_properties_[6].set_app_id(chrome_app_id_); | 205 shortcuts_properties_[6].set_app_id(chrome_app_id_); |
| 206 shortcuts_properties_[7].set_app_id(non_default_chrome_app_id_); |
| 160 | 207 |
| 161 shortcuts_properties_[1].set_dual_mode(true); | 208 shortcuts_properties_[1].set_dual_mode(true); |
| 162 shortcuts_properties_[2].set_dual_mode(true); | 209 shortcuts_properties_[2].set_dual_mode(true); |
| 163 shortcuts_properties_[4].set_dual_mode(true); | 210 shortcuts_properties_[4].set_dual_mode(true); |
| 164 shortcuts_properties_[5].set_dual_mode(true); | 211 shortcuts_properties_[5].set_dual_mode(true); |
| 165 shortcuts_properties_[6].set_dual_mode(true); | 212 shortcuts_properties_[6].set_dual_mode(true); |
| 213 shortcuts_properties_[7].set_dual_mode(true); |
| 166 | 214 |
| 167 for (size_t i = 0; i < shortcuts_.size(); ++i) | 215 for (size_t i = 0; i < shortcuts_.size(); ++i) |
| 168 base::win::ValidateShortcut(shortcuts_[i], shortcuts_properties_[i]); | 216 base::win::ValidateShortcut(shortcuts_[i], shortcuts_properties_[i]); |
| 169 } | 217 } |
| 170 | 218 |
| 171 TEST(ShellIntegrationWinTest, GetAppModelIdForProfileTest) { | 219 TEST(ShellIntegrationWinTest, GetAppModelIdForProfileTest) { |
| 172 const string16 base_app_id( | 220 const string16 base_app_id( |
| 173 BrowserDistribution::GetDistribution()->GetBaseAppId()); | 221 BrowserDistribution::GetDistribution()->GetBaseAppId()); |
| 174 | 222 |
| 175 // Empty profile path should get chrome::kBrowserAppID | 223 // Empty profile path should get chrome::kBrowserAppID |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 215 default_profile_path)); | 263 default_profile_path)); |
| 216 | 264 |
| 217 // Non-default profile path should get chrome::kBrowserAppID + AppList joined | 265 // Non-default profile path should get chrome::kBrowserAppID + AppList joined |
| 218 // with profile info. | 266 // with profile info. |
| 219 base::FilePath profile_path(FILE_PATH_LITERAL("root")); | 267 base::FilePath profile_path(FILE_PATH_LITERAL("root")); |
| 220 profile_path = profile_path.Append(FILE_PATH_LITERAL("udd")); | 268 profile_path = profile_path.Append(FILE_PATH_LITERAL("udd")); |
| 221 profile_path = profile_path.Append(FILE_PATH_LITERAL("User Data - Test")); | 269 profile_path = profile_path.Append(FILE_PATH_LITERAL("User Data - Test")); |
| 222 EXPECT_EQ(base_app_id + L".udd.UserDataTest", | 270 EXPECT_EQ(base_app_id + L".udd.UserDataTest", |
| 223 ShellIntegration::GetAppListAppModelIdForProfile(profile_path)); | 271 ShellIntegration::GetAppListAppModelIdForProfile(profile_path)); |
| 224 } | 272 } |
| 273 |
| 274 // TODO(calamity): remove this test once app_host.exe is removed |
| 275 class AppHostMigrateShortcutTest : public ShortcutTest { |
| 276 protected: |
| 277 virtual void CreateShortcuts() OVERRIDE { |
| 278 base::win::ShortcutProperties temp_properties; |
| 279 |
| 280 // Shortcut 0 points to app_host.exe and should be retargeted to chrome.exe. |
| 281 temp_properties.set_target(app_host_exe_); |
| 282 temp_properties.set_app_id(L"SomeAppId"); |
| 283 temp_properties.set_arguments(L"--show-app-list"); |
| 284 ASSERT_NO_FATAL_FAILURE(AddTestShortcut(temp_properties)); |
| 285 } |
| 286 }; |
| 287 |
| 288 // Test migration when not checking for dual mode. |
| 289 TEST_F(AppHostMigrateShortcutTest, AppHostExeRetargetsToChromeExe) { |
| 290 EXPECT_EQ(1, |
| 291 ShellIntegration::MigrateAppHostShortcutsInPathInternal( |
| 292 chrome_exe_, app_host_exe_, temp_dir_.path(), false)); |
| 293 |
| 294 // app_host.exe should now be chrome.exe |
| 295 shortcuts_properties_[0].set_target(chrome_exe_); |
| 296 |
| 297 for (size_t i = 0; i < shortcuts_.size(); ++i) |
| 298 base::win::ValidateShortcut(shortcuts_[i], shortcuts_properties_[i]); |
| 299 } |
| OLD | NEW |