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 <stddef.h> | 7 #include <stddef.h> |
8 | 8 |
9 #include <algorithm> | 9 #include <algorithm> |
10 #include <cstdlib> | 10 #include <cstdlib> |
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
206 EXPECT_EQ(web_app::APP_MENU_LOCATION_NONE, | 206 EXPECT_EQ(web_app::APP_MENU_LOCATION_NONE, |
207 result.applications_menu_location); | 207 result.applications_menu_location); |
208 | 208 |
209 EXPECT_FALSE(result.in_quick_launch_bar); | 209 EXPECT_FALSE(result.in_quick_launch_bar); |
210 } | 210 } |
211 | 211 |
212 // Shortcut on desktop. | 212 // Shortcut on desktop. |
213 { | 213 { |
214 base::ScopedTempDir temp_dir; | 214 base::ScopedTempDir temp_dir; |
215 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); | 215 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); |
216 base::FilePath desktop_path = temp_dir.path(); | 216 base::FilePath desktop_path = temp_dir.GetPath(); |
217 | 217 |
218 MockEnvironment env; | 218 MockEnvironment env; |
219 ASSERT_TRUE(base::CreateDirectory(desktop_path)); | 219 ASSERT_TRUE(base::CreateDirectory(desktop_path)); |
220 ASSERT_TRUE(WriteEmptyFile(desktop_path.Append(kTemplateFilename))); | 220 ASSERT_TRUE(WriteEmptyFile(desktop_path.Append(kTemplateFilename))); |
221 web_app::ShortcutLocations result = GetExistingShortcutLocations( | 221 web_app::ShortcutLocations result = GetExistingShortcutLocations( |
222 &env, kProfilePath, kExtensionId, desktop_path); | 222 &env, kProfilePath, kExtensionId, desktop_path); |
223 EXPECT_TRUE(result.on_desktop); | 223 EXPECT_TRUE(result.on_desktop); |
224 EXPECT_EQ(web_app::APP_MENU_LOCATION_NONE, | 224 EXPECT_EQ(web_app::APP_MENU_LOCATION_NONE, |
225 result.applications_menu_location); | 225 result.applications_menu_location); |
226 | 226 |
227 EXPECT_FALSE(result.in_quick_launch_bar); | 227 EXPECT_FALSE(result.in_quick_launch_bar); |
228 } | 228 } |
229 | 229 |
230 // Shortcut in applications directory. | 230 // Shortcut in applications directory. |
231 { | 231 { |
232 base::ScopedTempDir temp_dir; | 232 base::ScopedTempDir temp_dir; |
233 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); | 233 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); |
234 base::FilePath apps_path = temp_dir.path().Append("applications"); | 234 base::FilePath apps_path = temp_dir.GetPath().Append("applications"); |
235 | 235 |
236 MockEnvironment env; | 236 MockEnvironment env; |
237 env.Set("XDG_DATA_HOME", temp_dir.path().value()); | 237 env.Set("XDG_DATA_HOME", temp_dir.GetPath().value()); |
238 ASSERT_TRUE(base::CreateDirectory(apps_path)); | 238 ASSERT_TRUE(base::CreateDirectory(apps_path)); |
239 ASSERT_TRUE(WriteEmptyFile(apps_path.Append(kTemplateFilename))); | 239 ASSERT_TRUE(WriteEmptyFile(apps_path.Append(kTemplateFilename))); |
240 web_app::ShortcutLocations result = | 240 web_app::ShortcutLocations result = |
241 GetExistingShortcutLocations(&env, kProfilePath, kExtensionId); | 241 GetExistingShortcutLocations(&env, kProfilePath, kExtensionId); |
242 EXPECT_FALSE(result.on_desktop); | 242 EXPECT_FALSE(result.on_desktop); |
243 EXPECT_EQ(web_app::APP_MENU_LOCATION_SUBDIR_CHROMEAPPS, | 243 EXPECT_EQ(web_app::APP_MENU_LOCATION_SUBDIR_CHROMEAPPS, |
244 result.applications_menu_location); | 244 result.applications_menu_location); |
245 | 245 |
246 EXPECT_FALSE(result.in_quick_launch_bar); | 246 EXPECT_FALSE(result.in_quick_launch_bar); |
247 } | 247 } |
248 | 248 |
249 // Shortcut in applications directory with NoDisplay=true. | 249 // Shortcut in applications directory with NoDisplay=true. |
250 { | 250 { |
251 base::ScopedTempDir temp_dir; | 251 base::ScopedTempDir temp_dir; |
252 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); | 252 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); |
253 base::FilePath apps_path = temp_dir.path().Append("applications"); | 253 base::FilePath apps_path = temp_dir.GetPath().Append("applications"); |
254 | 254 |
255 MockEnvironment env; | 255 MockEnvironment env; |
256 env.Set("XDG_DATA_HOME", temp_dir.path().value()); | 256 env.Set("XDG_DATA_HOME", temp_dir.GetPath().value()); |
257 ASSERT_TRUE(base::CreateDirectory(apps_path)); | 257 ASSERT_TRUE(base::CreateDirectory(apps_path)); |
258 ASSERT_TRUE(WriteString(apps_path.Append(kTemplateFilename), | 258 ASSERT_TRUE(WriteString(apps_path.Append(kTemplateFilename), |
259 kNoDisplayDesktopFile)); | 259 kNoDisplayDesktopFile)); |
260 web_app::ShortcutLocations result = | 260 web_app::ShortcutLocations result = |
261 GetExistingShortcutLocations(&env, kProfilePath, kExtensionId); | 261 GetExistingShortcutLocations(&env, kProfilePath, kExtensionId); |
262 // Doesn't count as being in applications menu. | 262 // Doesn't count as being in applications menu. |
263 EXPECT_FALSE(result.on_desktop); | 263 EXPECT_FALSE(result.on_desktop); |
264 EXPECT_EQ(web_app::APP_MENU_LOCATION_HIDDEN, | 264 EXPECT_EQ(web_app::APP_MENU_LOCATION_HIDDEN, |
265 result.applications_menu_location); | 265 result.applications_menu_location); |
266 EXPECT_FALSE(result.in_quick_launch_bar); | 266 EXPECT_FALSE(result.in_quick_launch_bar); |
267 } | 267 } |
268 | 268 |
269 // Shortcut on desktop and in applications directory. | 269 // Shortcut on desktop and in applications directory. |
270 { | 270 { |
271 base::ScopedTempDir temp_dir1; | 271 base::ScopedTempDir temp_dir1; |
272 ASSERT_TRUE(temp_dir1.CreateUniqueTempDir()); | 272 ASSERT_TRUE(temp_dir1.CreateUniqueTempDir()); |
273 base::FilePath desktop_path = temp_dir1.path(); | 273 base::FilePath desktop_path = temp_dir1.GetPath(); |
274 | 274 |
275 base::ScopedTempDir temp_dir2; | 275 base::ScopedTempDir temp_dir2; |
276 ASSERT_TRUE(temp_dir2.CreateUniqueTempDir()); | 276 ASSERT_TRUE(temp_dir2.CreateUniqueTempDir()); |
277 base::FilePath apps_path = temp_dir2.path().Append("applications"); | 277 base::FilePath apps_path = temp_dir2.GetPath().Append("applications"); |
278 | 278 |
279 MockEnvironment env; | 279 MockEnvironment env; |
280 ASSERT_TRUE(base::CreateDirectory(desktop_path)); | 280 ASSERT_TRUE(base::CreateDirectory(desktop_path)); |
281 ASSERT_TRUE(WriteEmptyFile(desktop_path.Append(kTemplateFilename))); | 281 ASSERT_TRUE(WriteEmptyFile(desktop_path.Append(kTemplateFilename))); |
282 env.Set("XDG_DATA_HOME", temp_dir2.path().value()); | 282 env.Set("XDG_DATA_HOME", temp_dir2.GetPath().value()); |
283 ASSERT_TRUE(base::CreateDirectory(apps_path)); | 283 ASSERT_TRUE(base::CreateDirectory(apps_path)); |
284 ASSERT_TRUE(WriteEmptyFile(apps_path.Append(kTemplateFilename))); | 284 ASSERT_TRUE(WriteEmptyFile(apps_path.Append(kTemplateFilename))); |
285 web_app::ShortcutLocations result = GetExistingShortcutLocations( | 285 web_app::ShortcutLocations result = GetExistingShortcutLocations( |
286 &env, kProfilePath, kExtensionId, desktop_path); | 286 &env, kProfilePath, kExtensionId, desktop_path); |
287 EXPECT_TRUE(result.on_desktop); | 287 EXPECT_TRUE(result.on_desktop); |
288 EXPECT_EQ(web_app::APP_MENU_LOCATION_SUBDIR_CHROMEAPPS, | 288 EXPECT_EQ(web_app::APP_MENU_LOCATION_SUBDIR_CHROMEAPPS, |
289 result.applications_menu_location); | 289 result.applications_menu_location); |
290 EXPECT_FALSE(result.in_quick_launch_bar); | 290 EXPECT_FALSE(result.in_quick_launch_bar); |
291 } | 291 } |
292 } | 292 } |
293 | 293 |
294 TEST(ShellIntegrationTest, GetExistingShortcutContents) { | 294 TEST(ShellIntegrationTest, GetExistingShortcutContents) { |
295 const char kTemplateFilename[] = "shortcut-test.desktop"; | 295 const char kTemplateFilename[] = "shortcut-test.desktop"; |
296 base::FilePath kTemplateFilepath(kTemplateFilename); | 296 base::FilePath kTemplateFilepath(kTemplateFilename); |
297 const char kTestData1[] = "a magical testing string"; | 297 const char kTestData1[] = "a magical testing string"; |
298 const char kTestData2[] = "a different testing string"; | 298 const char kTestData2[] = "a different testing string"; |
299 | 299 |
300 base::MessageLoop message_loop; | 300 base::MessageLoop message_loop; |
301 content::TestBrowserThread file_thread(BrowserThread::FILE, &message_loop); | 301 content::TestBrowserThread file_thread(BrowserThread::FILE, &message_loop); |
302 | 302 |
303 // Test that it searches $XDG_DATA_HOME/applications. | 303 // Test that it searches $XDG_DATA_HOME/applications. |
304 { | 304 { |
305 base::ScopedTempDir temp_dir; | 305 base::ScopedTempDir temp_dir; |
306 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); | 306 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); |
307 | 307 |
308 MockEnvironment env; | 308 MockEnvironment env; |
309 env.Set("XDG_DATA_HOME", temp_dir.path().value()); | 309 env.Set("XDG_DATA_HOME", temp_dir.GetPath().value()); |
310 // Create a file in a non-applications directory. This should be ignored. | 310 // Create a file in a non-applications directory. This should be ignored. |
311 ASSERT_TRUE(WriteString(temp_dir.path().Append(kTemplateFilename), | 311 ASSERT_TRUE( |
312 kTestData2)); | 312 WriteString(temp_dir.GetPath().Append(kTemplateFilename), kTestData2)); |
313 ASSERT_TRUE(base::CreateDirectory( | 313 ASSERT_TRUE( |
314 temp_dir.path().Append("applications"))); | 314 base::CreateDirectory(temp_dir.GetPath().Append("applications"))); |
315 ASSERT_TRUE(WriteString( | 315 ASSERT_TRUE(WriteString( |
316 temp_dir.path().Append("applications").Append(kTemplateFilename), | 316 temp_dir.GetPath().Append("applications").Append(kTemplateFilename), |
317 kTestData1)); | 317 kTestData1)); |
318 std::string contents; | 318 std::string contents; |
319 ASSERT_TRUE( | 319 ASSERT_TRUE( |
320 GetExistingShortcutContents(&env, kTemplateFilepath, &contents)); | 320 GetExistingShortcutContents(&env, kTemplateFilepath, &contents)); |
321 EXPECT_EQ(kTestData1, contents); | 321 EXPECT_EQ(kTestData1, contents); |
322 } | 322 } |
323 | 323 |
324 // Test that it falls back to $HOME/.local/share/applications. | 324 // Test that it falls back to $HOME/.local/share/applications. |
325 { | 325 { |
326 base::ScopedTempDir temp_dir; | 326 base::ScopedTempDir temp_dir; |
327 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); | 327 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); |
328 | 328 |
329 MockEnvironment env; | 329 MockEnvironment env; |
330 base::ScopedPathOverride home_override(base::DIR_HOME, | 330 base::ScopedPathOverride home_override(base::DIR_HOME, temp_dir.GetPath(), |
331 temp_dir.path(), | |
332 true /* absolute? */, | 331 true /* absolute? */, |
333 false /* create? */); | 332 false /* create? */); |
334 ASSERT_TRUE(base::CreateDirectory( | 333 ASSERT_TRUE(base::CreateDirectory( |
335 temp_dir.path().Append(".local/share/applications"))); | 334 temp_dir.GetPath().Append(".local/share/applications"))); |
336 ASSERT_TRUE(WriteString( | 335 ASSERT_TRUE(WriteString(temp_dir.GetPath() |
337 temp_dir.path().Append(".local/share/applications") | 336 .Append(".local/share/applications") |
338 .Append(kTemplateFilename), | 337 .Append(kTemplateFilename), |
339 kTestData1)); | 338 kTestData1)); |
340 std::string contents; | 339 std::string contents; |
341 ASSERT_TRUE( | 340 ASSERT_TRUE( |
342 GetExistingShortcutContents(&env, kTemplateFilepath, &contents)); | 341 GetExistingShortcutContents(&env, kTemplateFilepath, &contents)); |
343 EXPECT_EQ(kTestData1, contents); | 342 EXPECT_EQ(kTestData1, contents); |
344 } | 343 } |
345 | 344 |
346 // Test that it searches $XDG_DATA_DIRS/applications. | 345 // Test that it searches $XDG_DATA_DIRS/applications. |
347 { | 346 { |
348 base::ScopedTempDir temp_dir; | 347 base::ScopedTempDir temp_dir; |
349 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); | 348 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); |
350 | 349 |
351 MockEnvironment env; | 350 MockEnvironment env; |
352 env.Set("XDG_DATA_DIRS", temp_dir.path().value()); | 351 env.Set("XDG_DATA_DIRS", temp_dir.GetPath().value()); |
353 ASSERT_TRUE(base::CreateDirectory( | 352 ASSERT_TRUE( |
354 temp_dir.path().Append("applications"))); | 353 base::CreateDirectory(temp_dir.GetPath().Append("applications"))); |
355 ASSERT_TRUE(WriteString( | 354 ASSERT_TRUE(WriteString( |
356 temp_dir.path().Append("applications").Append(kTemplateFilename), | 355 temp_dir.GetPath().Append("applications").Append(kTemplateFilename), |
357 kTestData2)); | 356 kTestData2)); |
358 std::string contents; | 357 std::string contents; |
359 ASSERT_TRUE( | 358 ASSERT_TRUE( |
360 GetExistingShortcutContents(&env, kTemplateFilepath, &contents)); | 359 GetExistingShortcutContents(&env, kTemplateFilepath, &contents)); |
361 EXPECT_EQ(kTestData2, contents); | 360 EXPECT_EQ(kTestData2, contents); |
362 } | 361 } |
363 | 362 |
364 // Test that it searches $X/applications for each X in $XDG_DATA_DIRS. | 363 // Test that it searches $X/applications for each X in $XDG_DATA_DIRS. |
365 { | 364 { |
366 base::ScopedTempDir temp_dir1; | 365 base::ScopedTempDir temp_dir1; |
367 ASSERT_TRUE(temp_dir1.CreateUniqueTempDir()); | 366 ASSERT_TRUE(temp_dir1.CreateUniqueTempDir()); |
368 base::ScopedTempDir temp_dir2; | 367 base::ScopedTempDir temp_dir2; |
369 ASSERT_TRUE(temp_dir2.CreateUniqueTempDir()); | 368 ASSERT_TRUE(temp_dir2.CreateUniqueTempDir()); |
370 | 369 |
371 MockEnvironment env; | 370 MockEnvironment env; |
372 env.Set("XDG_DATA_DIRS", temp_dir1.path().value() + ":" + | 371 env.Set("XDG_DATA_DIRS", |
373 temp_dir2.path().value()); | 372 temp_dir1.GetPath().value() + ":" + temp_dir2.GetPath().value()); |
374 // Create a file in a non-applications directory. This should be ignored. | 373 // Create a file in a non-applications directory. This should be ignored. |
375 ASSERT_TRUE(WriteString(temp_dir1.path().Append(kTemplateFilename), | 374 ASSERT_TRUE( |
376 kTestData1)); | 375 WriteString(temp_dir1.GetPath().Append(kTemplateFilename), kTestData1)); |
377 // Only create a findable desktop file in the second path. | 376 // Only create a findable desktop file in the second path. |
378 ASSERT_TRUE(base::CreateDirectory( | 377 ASSERT_TRUE( |
379 temp_dir2.path().Append("applications"))); | 378 base::CreateDirectory(temp_dir2.GetPath().Append("applications"))); |
380 ASSERT_TRUE(WriteString( | 379 ASSERT_TRUE(WriteString( |
381 temp_dir2.path().Append("applications").Append(kTemplateFilename), | 380 temp_dir2.GetPath().Append("applications").Append(kTemplateFilename), |
382 kTestData2)); | 381 kTestData2)); |
383 std::string contents; | 382 std::string contents; |
384 ASSERT_TRUE( | 383 ASSERT_TRUE( |
385 GetExistingShortcutContents(&env, kTemplateFilepath, &contents)); | 384 GetExistingShortcutContents(&env, kTemplateFilepath, &contents)); |
386 EXPECT_EQ(kTestData2, contents); | 385 EXPECT_EQ(kTestData2, contents); |
387 } | 386 } |
388 } | 387 } |
389 | 388 |
390 TEST(ShellIntegrationTest, GetExtensionShortcutFilename) { | 389 TEST(ShellIntegrationTest, GetExtensionShortcutFilename) { |
391 base::FilePath kProfilePath("a/b/c/Profile Name?"); | 390 base::FilePath kProfilePath("a/b/c/Profile Name?"); |
392 const char kExtensionId[] = "extensionid"; | 391 const char kExtensionId[] = "extensionid"; |
393 EXPECT_EQ(base::FilePath("chrome-extensionid-Profile_Name_.desktop"), | 392 EXPECT_EQ(base::FilePath("chrome-extensionid-Profile_Name_.desktop"), |
394 GetExtensionShortcutFilename(kProfilePath, kExtensionId)); | 393 GetExtensionShortcutFilename(kProfilePath, kExtensionId)); |
395 } | 394 } |
396 | 395 |
397 TEST(ShellIntegrationTest, GetExistingProfileShortcutFilenames) { | 396 TEST(ShellIntegrationTest, GetExistingProfileShortcutFilenames) { |
398 base::FilePath kProfilePath("a/b/c/Profile Name?"); | 397 base::FilePath kProfilePath("a/b/c/Profile Name?"); |
399 const char kApp1Filename[] = "chrome-extension1-Profile_Name_.desktop"; | 398 const char kApp1Filename[] = "chrome-extension1-Profile_Name_.desktop"; |
400 const char kApp2Filename[] = "chrome-extension2-Profile_Name_.desktop"; | 399 const char kApp2Filename[] = "chrome-extension2-Profile_Name_.desktop"; |
401 const char kUnrelatedAppFilename[] = "chrome-extension-Other_Profile.desktop"; | 400 const char kUnrelatedAppFilename[] = "chrome-extension-Other_Profile.desktop"; |
402 | 401 |
403 base::MessageLoop message_loop; | 402 base::MessageLoop message_loop; |
404 content::TestBrowserThread file_thread(BrowserThread::FILE, &message_loop); | 403 content::TestBrowserThread file_thread(BrowserThread::FILE, &message_loop); |
405 | 404 |
406 base::ScopedTempDir temp_dir; | 405 base::ScopedTempDir temp_dir; |
407 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); | 406 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); |
408 ASSERT_TRUE(WriteEmptyFile(temp_dir.path().Append(kApp1Filename))); | 407 ASSERT_TRUE(WriteEmptyFile(temp_dir.GetPath().Append(kApp1Filename))); |
409 ASSERT_TRUE(WriteEmptyFile(temp_dir.path().Append(kApp2Filename))); | 408 ASSERT_TRUE(WriteEmptyFile(temp_dir.GetPath().Append(kApp2Filename))); |
410 // This file should not be returned in the results. | 409 // This file should not be returned in the results. |
411 ASSERT_TRUE(WriteEmptyFile(temp_dir.path().Append(kUnrelatedAppFilename))); | 410 ASSERT_TRUE(WriteEmptyFile(temp_dir.GetPath().Append(kUnrelatedAppFilename))); |
412 std::vector<base::FilePath> paths = | 411 std::vector<base::FilePath> paths = |
413 GetExistingProfileShortcutFilenames(kProfilePath, temp_dir.path()); | 412 GetExistingProfileShortcutFilenames(kProfilePath, temp_dir.GetPath()); |
414 // Path order is arbitrary. Sort the output for consistency. | 413 // Path order is arbitrary. Sort the output for consistency. |
415 std::sort(paths.begin(), paths.end()); | 414 std::sort(paths.begin(), paths.end()); |
416 EXPECT_THAT(paths, | 415 EXPECT_THAT(paths, |
417 ElementsAre(base::FilePath(kApp1Filename), | 416 ElementsAre(base::FilePath(kApp1Filename), |
418 base::FilePath(kApp2Filename))); | 417 base::FilePath(kApp2Filename))); |
419 } | 418 } |
420 | 419 |
421 TEST(ShellIntegrationTest, GetWebShortcutFilename) { | 420 TEST(ShellIntegrationTest, GetWebShortcutFilename) { |
422 const struct { | 421 const struct { |
423 const char* const path; | 422 const char* const path; |
(...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
664 EXPECT_EQ("baR", internal::GetProgramClassClass(command_line, "foo.desktop")); | 663 EXPECT_EQ("baR", internal::GetProgramClassClass(command_line, "foo.desktop")); |
665 | 664 |
666 command_line = base::CommandLine(base::FilePath()); | 665 command_line = base::CommandLine(base::FilePath()); |
667 command_line.AppendSwitchASCII("user-data-dir", "/tmp/baz"); | 666 command_line.AppendSwitchASCII("user-data-dir", "/tmp/baz"); |
668 EXPECT_EQ("foo (/tmp/baz)", | 667 EXPECT_EQ("foo (/tmp/baz)", |
669 internal::GetProgramClassName(command_line, "foo.desktop")); | 668 internal::GetProgramClassName(command_line, "foo.desktop")); |
670 EXPECT_EQ("Foo", internal::GetProgramClassClass(command_line, "foo.desktop")); | 669 EXPECT_EQ("Foo", internal::GetProgramClassClass(command_line, "foo.desktop")); |
671 } | 670 } |
672 | 671 |
673 } // namespace shell_integration_linux | 672 } // namespace shell_integration_linux |
OLD | NEW |