OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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_linux.h" | 5 #include "chrome/browser/shell_integration_linux.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <cstdlib> | 8 #include <cstdlib> |
9 #include <map> | 9 #include <map> |
10 | 10 |
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
179 } | 179 } |
180 | 180 |
181 // Shortcut on desktop. | 181 // Shortcut on desktop. |
182 { | 182 { |
183 base::ScopedTempDir temp_dir; | 183 base::ScopedTempDir temp_dir; |
184 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); | 184 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); |
185 base::FilePath desktop_path = temp_dir.path(); | 185 base::FilePath desktop_path = temp_dir.path(); |
186 | 186 |
187 MockEnvironment env; | 187 MockEnvironment env; |
188 ASSERT_TRUE(base::CreateDirectory(desktop_path)); | 188 ASSERT_TRUE(base::CreateDirectory(desktop_path)); |
189 ASSERT_FALSE(file_util::WriteFile( | 189 ASSERT_FALSE(base::WriteFile( |
190 desktop_path.AppendASCII(kTemplateFilename), | 190 desktop_path.AppendASCII(kTemplateFilename), |
191 "", 0)); | 191 "", 0)); |
192 ShellIntegration::ShortcutLocations result = | 192 ShellIntegration::ShortcutLocations result = |
193 ShellIntegrationLinux::GetExistingShortcutLocations( | 193 ShellIntegrationLinux::GetExistingShortcutLocations( |
194 &env, kProfilePath, kExtensionId, desktop_path); | 194 &env, kProfilePath, kExtensionId, desktop_path); |
195 EXPECT_TRUE(result.on_desktop); | 195 EXPECT_TRUE(result.on_desktop); |
196 EXPECT_EQ(ShellIntegration::APP_MENU_LOCATION_NONE, | 196 EXPECT_EQ(ShellIntegration::APP_MENU_LOCATION_NONE, |
197 result.applications_menu_location); | 197 result.applications_menu_location); |
198 | 198 |
199 EXPECT_FALSE(result.in_quick_launch_bar); | 199 EXPECT_FALSE(result.in_quick_launch_bar); |
200 EXPECT_FALSE(result.hidden); | 200 EXPECT_FALSE(result.hidden); |
201 } | 201 } |
202 | 202 |
203 // Shortcut in applications directory. | 203 // Shortcut in applications directory. |
204 { | 204 { |
205 base::ScopedTempDir temp_dir; | 205 base::ScopedTempDir temp_dir; |
206 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); | 206 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); |
207 base::FilePath apps_path = temp_dir.path().AppendASCII("applications"); | 207 base::FilePath apps_path = temp_dir.path().AppendASCII("applications"); |
208 | 208 |
209 MockEnvironment env; | 209 MockEnvironment env; |
210 env.Set("XDG_DATA_HOME", temp_dir.path().value()); | 210 env.Set("XDG_DATA_HOME", temp_dir.path().value()); |
211 ASSERT_TRUE(base::CreateDirectory(apps_path)); | 211 ASSERT_TRUE(base::CreateDirectory(apps_path)); |
212 ASSERT_FALSE(file_util::WriteFile( | 212 ASSERT_FALSE(base::WriteFile( |
213 apps_path.AppendASCII(kTemplateFilename), | 213 apps_path.AppendASCII(kTemplateFilename), |
214 "", 0)); | 214 "", 0)); |
215 ShellIntegration::ShortcutLocations result = | 215 ShellIntegration::ShortcutLocations result = |
216 ShellIntegrationLinux::GetExistingShortcutLocations( | 216 ShellIntegrationLinux::GetExistingShortcutLocations( |
217 &env, kProfilePath, kExtensionId); | 217 &env, kProfilePath, kExtensionId); |
218 EXPECT_FALSE(result.on_desktop); | 218 EXPECT_FALSE(result.on_desktop); |
219 EXPECT_EQ(ShellIntegration::APP_MENU_LOCATION_SUBDIR_CHROMEAPPS, | 219 EXPECT_EQ(ShellIntegration::APP_MENU_LOCATION_SUBDIR_CHROMEAPPS, |
220 result.applications_menu_location); | 220 result.applications_menu_location); |
221 | 221 |
222 EXPECT_FALSE(result.in_quick_launch_bar); | 222 EXPECT_FALSE(result.in_quick_launch_bar); |
223 EXPECT_FALSE(result.hidden); | 223 EXPECT_FALSE(result.hidden); |
224 } | 224 } |
225 | 225 |
226 // Shortcut in applications directory with NoDisplay=true. | 226 // Shortcut in applications directory with NoDisplay=true. |
227 { | 227 { |
228 base::ScopedTempDir temp_dir; | 228 base::ScopedTempDir temp_dir; |
229 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); | 229 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); |
230 base::FilePath apps_path = temp_dir.path().AppendASCII("applications"); | 230 base::FilePath apps_path = temp_dir.path().AppendASCII("applications"); |
231 | 231 |
232 MockEnvironment env; | 232 MockEnvironment env; |
233 env.Set("XDG_DATA_HOME", temp_dir.path().value()); | 233 env.Set("XDG_DATA_HOME", temp_dir.path().value()); |
234 ASSERT_TRUE(base::CreateDirectory(apps_path)); | 234 ASSERT_TRUE(base::CreateDirectory(apps_path)); |
235 ASSERT_TRUE(file_util::WriteFile( | 235 ASSERT_TRUE(base::WriteFile( |
236 apps_path.AppendASCII(kTemplateFilename), | 236 apps_path.AppendASCII(kTemplateFilename), |
237 kNoDisplayDesktopFile, strlen(kNoDisplayDesktopFile))); | 237 kNoDisplayDesktopFile, strlen(kNoDisplayDesktopFile))); |
238 ShellIntegration::ShortcutLocations result = | 238 ShellIntegration::ShortcutLocations result = |
239 ShellIntegrationLinux::GetExistingShortcutLocations( | 239 ShellIntegrationLinux::GetExistingShortcutLocations( |
240 &env, kProfilePath, kExtensionId); | 240 &env, kProfilePath, kExtensionId); |
241 // Doesn't count as being in applications menu. | 241 // Doesn't count as being in applications menu. |
242 EXPECT_FALSE(result.on_desktop); | 242 EXPECT_FALSE(result.on_desktop); |
243 EXPECT_EQ(ShellIntegration::APP_MENU_LOCATION_NONE, | 243 EXPECT_EQ(ShellIntegration::APP_MENU_LOCATION_NONE, |
244 result.applications_menu_location); | 244 result.applications_menu_location); |
245 EXPECT_FALSE(result.in_quick_launch_bar); | 245 EXPECT_FALSE(result.in_quick_launch_bar); |
246 EXPECT_TRUE(result.hidden); | 246 EXPECT_TRUE(result.hidden); |
247 } | 247 } |
248 | 248 |
249 // Shortcut on desktop and in applications directory. | 249 // Shortcut on desktop and in applications directory. |
250 { | 250 { |
251 base::ScopedTempDir temp_dir1; | 251 base::ScopedTempDir temp_dir1; |
252 ASSERT_TRUE(temp_dir1.CreateUniqueTempDir()); | 252 ASSERT_TRUE(temp_dir1.CreateUniqueTempDir()); |
253 base::FilePath desktop_path = temp_dir1.path(); | 253 base::FilePath desktop_path = temp_dir1.path(); |
254 | 254 |
255 base::ScopedTempDir temp_dir2; | 255 base::ScopedTempDir temp_dir2; |
256 ASSERT_TRUE(temp_dir2.CreateUniqueTempDir()); | 256 ASSERT_TRUE(temp_dir2.CreateUniqueTempDir()); |
257 base::FilePath apps_path = temp_dir2.path().AppendASCII("applications"); | 257 base::FilePath apps_path = temp_dir2.path().AppendASCII("applications"); |
258 | 258 |
259 MockEnvironment env; | 259 MockEnvironment env; |
260 ASSERT_TRUE(base::CreateDirectory(desktop_path)); | 260 ASSERT_TRUE(base::CreateDirectory(desktop_path)); |
261 ASSERT_FALSE(file_util::WriteFile( | 261 ASSERT_FALSE(base::WriteFile( |
262 desktop_path.AppendASCII(kTemplateFilename), | 262 desktop_path.AppendASCII(kTemplateFilename), |
263 "", 0)); | 263 "", 0)); |
264 env.Set("XDG_DATA_HOME", temp_dir2.path().value()); | 264 env.Set("XDG_DATA_HOME", temp_dir2.path().value()); |
265 ASSERT_TRUE(base::CreateDirectory(apps_path)); | 265 ASSERT_TRUE(base::CreateDirectory(apps_path)); |
266 ASSERT_FALSE(file_util::WriteFile( | 266 ASSERT_FALSE(base::WriteFile( |
267 apps_path.AppendASCII(kTemplateFilename), | 267 apps_path.AppendASCII(kTemplateFilename), |
268 "", 0)); | 268 "", 0)); |
269 ShellIntegration::ShortcutLocations result = | 269 ShellIntegration::ShortcutLocations result = |
270 ShellIntegrationLinux::GetExistingShortcutLocations( | 270 ShellIntegrationLinux::GetExistingShortcutLocations( |
271 &env, kProfilePath, kExtensionId, desktop_path); | 271 &env, kProfilePath, kExtensionId, desktop_path); |
272 EXPECT_TRUE(result.on_desktop); | 272 EXPECT_TRUE(result.on_desktop); |
273 EXPECT_EQ(ShellIntegration::APP_MENU_LOCATION_SUBDIR_CHROMEAPPS, | 273 EXPECT_EQ(ShellIntegration::APP_MENU_LOCATION_SUBDIR_CHROMEAPPS, |
274 result.applications_menu_location); | 274 result.applications_menu_location); |
275 EXPECT_FALSE(result.in_quick_launch_bar); | 275 EXPECT_FALSE(result.in_quick_launch_bar); |
276 EXPECT_FALSE(result.hidden); | 276 EXPECT_FALSE(result.hidden); |
(...skipping 10 matching lines...) Expand all Loading... |
287 content::TestBrowserThread file_thread(BrowserThread::FILE, &message_loop); | 287 content::TestBrowserThread file_thread(BrowserThread::FILE, &message_loop); |
288 | 288 |
289 // Test that it searches $XDG_DATA_HOME/applications. | 289 // Test that it searches $XDG_DATA_HOME/applications. |
290 { | 290 { |
291 base::ScopedTempDir temp_dir; | 291 base::ScopedTempDir temp_dir; |
292 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); | 292 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); |
293 | 293 |
294 MockEnvironment env; | 294 MockEnvironment env; |
295 env.Set("XDG_DATA_HOME", temp_dir.path().value()); | 295 env.Set("XDG_DATA_HOME", temp_dir.path().value()); |
296 // Create a file in a non-applications directory. This should be ignored. | 296 // Create a file in a non-applications directory. This should be ignored. |
297 ASSERT_TRUE(file_util::WriteFile( | 297 ASSERT_TRUE(base::WriteFile( |
298 temp_dir.path().AppendASCII(kTemplateFilename), | 298 temp_dir.path().AppendASCII(kTemplateFilename), |
299 kTestData2, strlen(kTestData2))); | 299 kTestData2, strlen(kTestData2))); |
300 ASSERT_TRUE(base::CreateDirectory( | 300 ASSERT_TRUE(base::CreateDirectory( |
301 temp_dir.path().AppendASCII("applications"))); | 301 temp_dir.path().AppendASCII("applications"))); |
302 ASSERT_TRUE(file_util::WriteFile( | 302 ASSERT_TRUE(base::WriteFile( |
303 temp_dir.path().AppendASCII("applications") | 303 temp_dir.path().AppendASCII("applications") |
304 .AppendASCII(kTemplateFilename), | 304 .AppendASCII(kTemplateFilename), |
305 kTestData1, strlen(kTestData1))); | 305 kTestData1, strlen(kTestData1))); |
306 std::string contents; | 306 std::string contents; |
307 ASSERT_TRUE( | 307 ASSERT_TRUE( |
308 ShellIntegrationLinux::GetExistingShortcutContents( | 308 ShellIntegrationLinux::GetExistingShortcutContents( |
309 &env, kTemplateFilepath, &contents)); | 309 &env, kTemplateFilepath, &contents)); |
310 EXPECT_EQ(kTestData1, contents); | 310 EXPECT_EQ(kTestData1, contents); |
311 } | 311 } |
312 | 312 |
313 // Test that it falls back to $HOME/.local/share/applications. | 313 // Test that it falls back to $HOME/.local/share/applications. |
314 { | 314 { |
315 base::ScopedTempDir temp_dir; | 315 base::ScopedTempDir temp_dir; |
316 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); | 316 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); |
317 | 317 |
318 MockEnvironment env; | 318 MockEnvironment env; |
319 env.Set("HOME", temp_dir.path().value()); | 319 env.Set("HOME", temp_dir.path().value()); |
320 ASSERT_TRUE(base::CreateDirectory( | 320 ASSERT_TRUE(base::CreateDirectory( |
321 temp_dir.path().AppendASCII(".local/share/applications"))); | 321 temp_dir.path().AppendASCII(".local/share/applications"))); |
322 ASSERT_TRUE(file_util::WriteFile( | 322 ASSERT_TRUE(base::WriteFile( |
323 temp_dir.path().AppendASCII(".local/share/applications") | 323 temp_dir.path().AppendASCII(".local/share/applications") |
324 .AppendASCII(kTemplateFilename), | 324 .AppendASCII(kTemplateFilename), |
325 kTestData1, strlen(kTestData1))); | 325 kTestData1, strlen(kTestData1))); |
326 std::string contents; | 326 std::string contents; |
327 ASSERT_TRUE( | 327 ASSERT_TRUE( |
328 ShellIntegrationLinux::GetExistingShortcutContents( | 328 ShellIntegrationLinux::GetExistingShortcutContents( |
329 &env, kTemplateFilepath, &contents)); | 329 &env, kTemplateFilepath, &contents)); |
330 EXPECT_EQ(kTestData1, contents); | 330 EXPECT_EQ(kTestData1, contents); |
331 } | 331 } |
332 | 332 |
333 // Test that it searches $XDG_DATA_DIRS/applications. | 333 // Test that it searches $XDG_DATA_DIRS/applications. |
334 { | 334 { |
335 base::ScopedTempDir temp_dir; | 335 base::ScopedTempDir temp_dir; |
336 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); | 336 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); |
337 | 337 |
338 MockEnvironment env; | 338 MockEnvironment env; |
339 env.Set("XDG_DATA_DIRS", temp_dir.path().value()); | 339 env.Set("XDG_DATA_DIRS", temp_dir.path().value()); |
340 ASSERT_TRUE(base::CreateDirectory( | 340 ASSERT_TRUE(base::CreateDirectory( |
341 temp_dir.path().AppendASCII("applications"))); | 341 temp_dir.path().AppendASCII("applications"))); |
342 ASSERT_TRUE(file_util::WriteFile( | 342 ASSERT_TRUE(base::WriteFile( |
343 temp_dir.path().AppendASCII("applications") | 343 temp_dir.path().AppendASCII("applications") |
344 .AppendASCII(kTemplateFilename), | 344 .AppendASCII(kTemplateFilename), |
345 kTestData2, strlen(kTestData2))); | 345 kTestData2, strlen(kTestData2))); |
346 std::string contents; | 346 std::string contents; |
347 ASSERT_TRUE( | 347 ASSERT_TRUE( |
348 ShellIntegrationLinux::GetExistingShortcutContents( | 348 ShellIntegrationLinux::GetExistingShortcutContents( |
349 &env, kTemplateFilepath, &contents)); | 349 &env, kTemplateFilepath, &contents)); |
350 EXPECT_EQ(kTestData2, contents); | 350 EXPECT_EQ(kTestData2, contents); |
351 } | 351 } |
352 | 352 |
353 // Test that it searches $X/applications for each X in $XDG_DATA_DIRS. | 353 // Test that it searches $X/applications for each X in $XDG_DATA_DIRS. |
354 { | 354 { |
355 base::ScopedTempDir temp_dir1; | 355 base::ScopedTempDir temp_dir1; |
356 ASSERT_TRUE(temp_dir1.CreateUniqueTempDir()); | 356 ASSERT_TRUE(temp_dir1.CreateUniqueTempDir()); |
357 base::ScopedTempDir temp_dir2; | 357 base::ScopedTempDir temp_dir2; |
358 ASSERT_TRUE(temp_dir2.CreateUniqueTempDir()); | 358 ASSERT_TRUE(temp_dir2.CreateUniqueTempDir()); |
359 | 359 |
360 MockEnvironment env; | 360 MockEnvironment env; |
361 env.Set("XDG_DATA_DIRS", temp_dir1.path().value() + ":" + | 361 env.Set("XDG_DATA_DIRS", temp_dir1.path().value() + ":" + |
362 temp_dir2.path().value()); | 362 temp_dir2.path().value()); |
363 // Create a file in a non-applications directory. This should be ignored. | 363 // Create a file in a non-applications directory. This should be ignored. |
364 ASSERT_TRUE(file_util::WriteFile( | 364 ASSERT_TRUE(base::WriteFile( |
365 temp_dir1.path().AppendASCII(kTemplateFilename), | 365 temp_dir1.path().AppendASCII(kTemplateFilename), |
366 kTestData1, strlen(kTestData1))); | 366 kTestData1, strlen(kTestData1))); |
367 // Only create a findable desktop file in the second path. | 367 // Only create a findable desktop file in the second path. |
368 ASSERT_TRUE(base::CreateDirectory( | 368 ASSERT_TRUE(base::CreateDirectory( |
369 temp_dir2.path().AppendASCII("applications"))); | 369 temp_dir2.path().AppendASCII("applications"))); |
370 ASSERT_TRUE(file_util::WriteFile( | 370 ASSERT_TRUE(base::WriteFile( |
371 temp_dir2.path().AppendASCII("applications") | 371 temp_dir2.path().AppendASCII("applications") |
372 .AppendASCII(kTemplateFilename), | 372 .AppendASCII(kTemplateFilename), |
373 kTestData2, strlen(kTestData2))); | 373 kTestData2, strlen(kTestData2))); |
374 std::string contents; | 374 std::string contents; |
375 ASSERT_TRUE( | 375 ASSERT_TRUE( |
376 ShellIntegrationLinux::GetExistingShortcutContents( | 376 ShellIntegrationLinux::GetExistingShortcutContents( |
377 &env, kTemplateFilepath, &contents)); | 377 &env, kTemplateFilepath, &contents)); |
378 EXPECT_EQ(kTestData2, contents); | 378 EXPECT_EQ(kTestData2, contents); |
379 } | 379 } |
380 } | 380 } |
(...skipping 11 matching lines...) Expand all Loading... |
392 const char kApp1Filename[] = "chrome-extension1-Profile_Name_.desktop"; | 392 const char kApp1Filename[] = "chrome-extension1-Profile_Name_.desktop"; |
393 const char kApp2Filename[] = "chrome-extension2-Profile_Name_.desktop"; | 393 const char kApp2Filename[] = "chrome-extension2-Profile_Name_.desktop"; |
394 const char kUnrelatedAppFilename[] = "chrome-extension-Other_Profile.desktop"; | 394 const char kUnrelatedAppFilename[] = "chrome-extension-Other_Profile.desktop"; |
395 | 395 |
396 base::MessageLoop message_loop; | 396 base::MessageLoop message_loop; |
397 content::TestBrowserThread file_thread(BrowserThread::FILE, &message_loop); | 397 content::TestBrowserThread file_thread(BrowserThread::FILE, &message_loop); |
398 | 398 |
399 base::ScopedTempDir temp_dir; | 399 base::ScopedTempDir temp_dir; |
400 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); | 400 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); |
401 ASSERT_EQ(0, | 401 ASSERT_EQ(0, |
402 file_util::WriteFile( | 402 base::WriteFile( |
403 temp_dir.path().AppendASCII(kApp1Filename), "", 0)); | 403 temp_dir.path().AppendASCII(kApp1Filename), "", 0)); |
404 ASSERT_EQ(0, | 404 ASSERT_EQ(0, |
405 file_util::WriteFile( | 405 base::WriteFile( |
406 temp_dir.path().AppendASCII(kApp2Filename), "", 0)); | 406 temp_dir.path().AppendASCII(kApp2Filename), "", 0)); |
407 // This file should not be returned in the results. | 407 // This file should not be returned in the results. |
408 ASSERT_EQ(0, | 408 ASSERT_EQ(0, |
409 file_util::WriteFile( | 409 base::WriteFile( |
410 temp_dir.path().AppendASCII(kUnrelatedAppFilename), "", 0)); | 410 temp_dir.path().AppendASCII(kUnrelatedAppFilename), "", 0)); |
411 std::vector<base::FilePath> paths = | 411 std::vector<base::FilePath> paths = |
412 ShellIntegrationLinux::GetExistingProfileShortcutFilenames( | 412 ShellIntegrationLinux::GetExistingProfileShortcutFilenames( |
413 kProfilePath, temp_dir.path()); | 413 kProfilePath, temp_dir.path()); |
414 // Path order is arbitrary. Sort the output for consistency. | 414 // Path order is arbitrary. Sort the output for consistency. |
415 std::sort(paths.begin(), paths.end()); | 415 std::sort(paths.begin(), paths.end()); |
416 EXPECT_THAT(paths, | 416 EXPECT_THAT(paths, |
417 ElementsAre(base::FilePath(kApp1Filename), | 417 ElementsAre(base::FilePath(kApp1Filename), |
418 base::FilePath(kApp2Filename))); | 418 base::FilePath(kApp2Filename))); |
419 } | 419 } |
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
638 | 638 |
639 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_cases); i++) { | 639 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_cases); i++) { |
640 SCOPED_TRACE(i); | 640 SCOPED_TRACE(i); |
641 EXPECT_EQ( | 641 EXPECT_EQ( |
642 test_cases[i].expected_output, | 642 test_cases[i].expected_output, |
643 ShellIntegrationLinux::GetDirectoryFileContents( | 643 ShellIntegrationLinux::GetDirectoryFileContents( |
644 base::ASCIIToUTF16(test_cases[i].title), | 644 base::ASCIIToUTF16(test_cases[i].title), |
645 test_cases[i].icon_name)); | 645 test_cases[i].icon_name)); |
646 } | 646 } |
647 } | 647 } |
OLD | NEW |