15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/shell_integration.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 72385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#include <algorithm> 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <cstdlib> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/base_paths.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_util.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/scoped_temp_dir.h" 159ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/stl_util.h" 17868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h" 18868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/test/scoped_path_override.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/web_applications/web_app.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_constants.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_browser_thread.h" 232385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#include "testing/gmock/include/gmock/gmock.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/gurl.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_POSIX) && !defined(OS_MACOSX) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/environment.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/shell_integration_linux.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define FPL FILE_PATH_LITERAL 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread; 352385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochusing ::testing::ElementsAre; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_POSIX) && !defined(OS_MACOSX) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Provides mock environment variables values based on a stored map. 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockEnvironment : public base::Environment { 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockEnvironment() {} 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Set(const std::string& name, const std::string& value) { 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) variables_[name] = value; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool GetVar(const char* variable_name, std::string* result) OVERRIDE { 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ContainsKey(variables_, variable_name)) { 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *result = variables_[variable_name]; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool SetVar(const char* variable_name, 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& new_value) OVERRIDE { 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ADD_FAILURE(); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool UnSetVar(const char* variable_name) OVERRIDE { 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ADD_FAILURE(); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::map<std::string, std::string> variables_; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(MockEnvironment); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 772385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen MurdochTEST(ShellIntegrationTest, GetDataWriteLocation) { 782385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch base::MessageLoop message_loop; 792385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch content::TestBrowserThread file_thread(BrowserThread::FILE, &message_loop); 802385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 812385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // Test that it returns $XDG_DATA_HOME. 822385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch { 832385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch MockEnvironment env; 842385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch env.Set("HOME", "/home/user"); 852385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch env.Set("XDG_DATA_HOME", "/user/path"); 862385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch base::FilePath path; 872385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch ASSERT_TRUE(ShellIntegrationLinux::GetDataWriteLocation(&env, &path)); 882385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch EXPECT_EQ(base::FilePath("/user/path"), path); 892385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch } 902385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 912385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // Test that $XDG_DATA_HOME falls back to $HOME/.local/share. 922385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch { 932385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch MockEnvironment env; 942385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch env.Set("HOME", "/home/user"); 952385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch base::FilePath path; 962385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch ASSERT_TRUE(ShellIntegrationLinux::GetDataWriteLocation(&env, &path)); 972385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch EXPECT_EQ(base::FilePath("/home/user/.local/share"), path); 982385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch } 992385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 1002385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // Test that if neither $XDG_DATA_HOME nor $HOME are specified, it fails. 1012385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch { 1022385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch MockEnvironment env; 1032385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch base::FilePath path; 1042385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch ASSERT_FALSE(ShellIntegrationLinux::GetDataWriteLocation(&env, &path)); 1052385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch } 1062385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch} 1072385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 1082385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen MurdochTEST(ShellIntegrationTest, GetDataSearchLocations) { 1092385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch base::MessageLoop message_loop; 1102385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch content::TestBrowserThread file_thread(BrowserThread::FILE, &message_loop); 1112385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 1122385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // Test that it returns $XDG_DATA_HOME + $XDG_DATA_DIRS. 1132385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch { 1142385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch MockEnvironment env; 1152385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch env.Set("HOME", "/home/user"); 1162385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch env.Set("XDG_DATA_HOME", "/user/path"); 1172385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch env.Set("XDG_DATA_DIRS", "/system/path/1:/system/path/2"); 1182385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch EXPECT_THAT( 1192385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch ShellIntegrationLinux::GetDataSearchLocations(&env), 1202385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch ElementsAre(base::FilePath("/user/path"), 1212385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch base::FilePath("/system/path/1"), 1222385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch base::FilePath("/system/path/2"))); 1232385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch } 1242385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 1252385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // Test that $XDG_DATA_HOME falls back to $HOME/.local/share. 1262385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch { 1272385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch MockEnvironment env; 1282385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch env.Set("HOME", "/home/user"); 1292385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch env.Set("XDG_DATA_DIRS", "/system/path/1:/system/path/2"); 1302385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch EXPECT_THAT( 1312385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch ShellIntegrationLinux::GetDataSearchLocations(&env), 1322385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch ElementsAre(base::FilePath("/home/user/.local/share"), 1332385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch base::FilePath("/system/path/1"), 1342385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch base::FilePath("/system/path/2"))); 1352385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch } 1362385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 1372385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // Test that if neither $XDG_DATA_HOME nor $HOME are specified, it still 1382385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // succeeds. 1392385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch { 1402385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch MockEnvironment env; 1412385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch env.Set("XDG_DATA_DIRS", "/system/path/1:/system/path/2"); 1422385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch EXPECT_THAT( 1432385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch ShellIntegrationLinux::GetDataSearchLocations(&env), 1442385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch ElementsAre(base::FilePath("/system/path/1"), 1452385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch base::FilePath("/system/path/2"))); 1462385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch } 1472385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 1482385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // Test that $XDG_DATA_DIRS falls back to the two default paths. 1492385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch { 1502385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch MockEnvironment env; 1512385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch env.Set("HOME", "/home/user"); 1522385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch env.Set("XDG_DATA_HOME", "/user/path"); 1532385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch EXPECT_THAT( 1542385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch ShellIntegrationLinux::GetDataSearchLocations(&env), 1552385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch ElementsAre(base::FilePath("/user/path"), 1562385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch base::FilePath("/usr/local/share"), 1572385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch base::FilePath("/usr/share"))); 1582385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch } 1592385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch} 1602385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(ShellIntegrationTest, GetExistingShortcutLocations) { 1627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::FilePath kProfilePath("Profile 1"); 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char kExtensionId[] = "test_extension"; 1647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const char kTemplateFilename[] = "chrome-test_extension-Profile_1.desktop"; 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath kTemplateFilepath(kTemplateFilename); 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char kNoDisplayDesktopFile[] = "[Desktop Entry]\nNoDisplay=true"; 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop message_loop; 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::TestBrowserThread file_thread(BrowserThread::FILE, &message_loop); 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // No existing shortcuts. 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockEnvironment env; 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ShellIntegration::ShortcutLocations result = 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ShellIntegrationLinux::GetExistingShortcutLocations( 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &env, kProfilePath, kExtensionId); 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(result.on_desktop); 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(result.in_applications_menu); 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(result.in_quick_launch_bar); 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(result.hidden); 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Shortcut on desktop. 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ScopedTempDir temp_dir; 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath desktop_path = temp_dir.path(); 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockEnvironment env; 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(file_util::CreateDirectory(desktop_path)); 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_FALSE(file_util::WriteFile( 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) desktop_path.AppendASCII(kTemplateFilename), 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "", 0)); 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ShellIntegration::ShortcutLocations result = 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ShellIntegrationLinux::GetExistingShortcutLocations( 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &env, kProfilePath, kExtensionId, desktop_path); 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(result.on_desktop); 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(result.in_applications_menu); 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(result.in_quick_launch_bar); 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(result.hidden); 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Shortcut in applications directory. 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ScopedTempDir temp_dir; 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath apps_path = temp_dir.path().AppendASCII("applications"); 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockEnvironment env; 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) env.Set("XDG_DATA_HOME", temp_dir.path().value()); 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(file_util::CreateDirectory(apps_path)); 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_FALSE(file_util::WriteFile( 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) apps_path.AppendASCII(kTemplateFilename), 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "", 0)); 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ShellIntegration::ShortcutLocations result = 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ShellIntegrationLinux::GetExistingShortcutLocations( 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &env, kProfilePath, kExtensionId); 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(result.on_desktop); 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(result.in_applications_menu); 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(result.in_quick_launch_bar); 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(result.hidden); 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Shortcut in applications directory with NoDisplay=true. 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ScopedTempDir temp_dir; 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath apps_path = temp_dir.path().AppendASCII("applications"); 2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockEnvironment env; 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) env.Set("XDG_DATA_HOME", temp_dir.path().value()); 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(file_util::CreateDirectory(apps_path)); 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(file_util::WriteFile( 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) apps_path.AppendASCII(kTemplateFilename), 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kNoDisplayDesktopFile, strlen(kNoDisplayDesktopFile))); 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ShellIntegration::ShortcutLocations result = 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ShellIntegrationLinux::GetExistingShortcutLocations( 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &env, kProfilePath, kExtensionId); 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Doesn't count as being in applications menu. 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(result.on_desktop); 2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(result.in_applications_menu); 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(result.in_quick_launch_bar); 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(result.hidden); 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Shortcut on desktop and in applications directory. 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ScopedTempDir temp_dir1; 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(temp_dir1.CreateUniqueTempDir()); 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath desktop_path = temp_dir1.path(); 2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ScopedTempDir temp_dir2; 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(temp_dir2.CreateUniqueTempDir()); 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath apps_path = temp_dir2.path().AppendASCII("applications"); 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockEnvironment env; 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(file_util::CreateDirectory(desktop_path)); 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_FALSE(file_util::WriteFile( 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) desktop_path.AppendASCII(kTemplateFilename), 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "", 0)); 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) env.Set("XDG_DATA_HOME", temp_dir2.path().value()); 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(file_util::CreateDirectory(apps_path)); 2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_FALSE(file_util::WriteFile( 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) apps_path.AppendASCII(kTemplateFilename), 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "", 0)); 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ShellIntegration::ShortcutLocations result = 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ShellIntegrationLinux::GetExistingShortcutLocations( 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &env, kProfilePath, kExtensionId, desktop_path); 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(result.on_desktop); 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(result.in_applications_menu); 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(result.in_quick_launch_bar); 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(result.hidden); 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(ShellIntegrationTest, GetExistingShortcutContents) { 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char kTemplateFilename[] = "shortcut-test.desktop"; 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath kTemplateFilepath(kTemplateFilename); 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char kTestData1[] = "a magical testing string"; 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char kTestData2[] = "a different testing string"; 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop message_loop; 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::TestBrowserThread file_thread(BrowserThread::FILE, &message_loop); 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Test that it searches $XDG_DATA_HOME/applications. 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ScopedTempDir temp_dir; 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockEnvironment env; 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) env.Set("XDG_DATA_HOME", temp_dir.path().value()); 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Create a file in a non-applications directory. This should be ignored. 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(file_util::WriteFile( 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) temp_dir.path().AppendASCII(kTemplateFilename), 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kTestData2, strlen(kTestData2))); 2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(file_util::CreateDirectory( 2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) temp_dir.path().AppendASCII("applications"))); 2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(file_util::WriteFile( 2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) temp_dir.path().AppendASCII("applications") 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) .AppendASCII(kTemplateFilename), 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kTestData1, strlen(kTestData1))); 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string contents; 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE( 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ShellIntegrationLinux::GetExistingShortcutContents( 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &env, kTemplateFilepath, &contents)); 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kTestData1, contents); 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Test that it falls back to $HOME/.local/share/applications. 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ScopedTempDir temp_dir; 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); 3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockEnvironment env; 3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) env.Set("HOME", temp_dir.path().value()); 3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(file_util::CreateDirectory( 3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) temp_dir.path().AppendASCII(".local/share/applications"))); 3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(file_util::WriteFile( 3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) temp_dir.path().AppendASCII(".local/share/applications") 3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) .AppendASCII(kTemplateFilename), 3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kTestData1, strlen(kTestData1))); 3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string contents; 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE( 3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ShellIntegrationLinux::GetExistingShortcutContents( 3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &env, kTemplateFilepath, &contents)); 3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(kTestData1, contents); 3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Test that it searches $XDG_DATA_DIRS/applications. 3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ScopedTempDir temp_dir; 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockEnvironment env; 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) env.Set("XDG_DATA_DIRS", temp_dir.path().value()); 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(file_util::CreateDirectory( 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) temp_dir.path().AppendASCII("applications"))); 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(file_util::WriteFile( 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) temp_dir.path().AppendASCII("applications") 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .AppendASCII(kTemplateFilename), 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kTestData2, strlen(kTestData2))); 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string contents; 3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE( 3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ShellIntegrationLinux::GetExistingShortcutContents( 3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &env, kTemplateFilepath, &contents)); 3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(kTestData2, contents); 3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Test that it searches $X/applications for each X in $XDG_DATA_DIRS. 3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ScopedTempDir temp_dir1; 3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(temp_dir1.CreateUniqueTempDir()); 3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ScopedTempDir temp_dir2; 3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(temp_dir2.CreateUniqueTempDir()); 3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockEnvironment env; 3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) env.Set("XDG_DATA_DIRS", temp_dir1.path().value() + ":" + 3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) temp_dir2.path().value()); 3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Create a file in a non-applications directory. This should be ignored. 3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(file_util::WriteFile( 3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) temp_dir1.path().AppendASCII(kTemplateFilename), 3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kTestData1, strlen(kTestData1))); 3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Only create a findable desktop file in the second path. 3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(file_util::CreateDirectory( 3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) temp_dir2.path().AppendASCII("applications"))); 3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(file_util::WriteFile( 3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) temp_dir2.path().AppendASCII("applications") 3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) .AppendASCII(kTemplateFilename), 3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kTestData2, strlen(kTestData2))); 3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string contents; 3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE( 3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ShellIntegrationLinux::GetExistingShortcutContents( 3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &env, kTemplateFilepath, &contents)); 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kTestData2, contents); 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3782385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen MurdochTEST(ShellIntegrationTest, GetExtensionShortcutFilename) { 3792385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch base::FilePath kProfilePath("a/b/c/Profile Name?"); 3802385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch const char kExtensionId[] = "extensionid"; 3812385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch EXPECT_EQ(base::FilePath("chrome-extensionid-Profile_Name_.desktop"), 3822385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch ShellIntegrationLinux::GetExtensionShortcutFilename( 3832385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch kProfilePath, kExtensionId)); 3842385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch} 3852385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 3862385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen MurdochTEST(ShellIntegrationTest, GetExistingProfileShortcutFilenames) { 3872385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch base::FilePath kProfilePath("a/b/c/Profile Name?"); 3882385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch const char kApp1Filename[] = "chrome-extension1-Profile_Name_.desktop"; 3892385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch const char kApp2Filename[] = "chrome-extension2-Profile_Name_.desktop"; 3902385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch const char kUnrelatedAppFilename[] = "chrome-extension-Other_Profile.desktop"; 3912385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 3922385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch base::MessageLoop message_loop; 3932385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch content::TestBrowserThread file_thread(BrowserThread::FILE, &message_loop); 3942385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 3952385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch base::ScopedTempDir temp_dir; 3962385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); 3972385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch ASSERT_EQ(0, 3982385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch file_util::WriteFile( 3992385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch temp_dir.path().AppendASCII(kApp1Filename), "", 0)); 4002385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch ASSERT_EQ(0, 4012385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch file_util::WriteFile( 4022385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch temp_dir.path().AppendASCII(kApp2Filename), "", 0)); 4032385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // This file should not be returned in the results. 4042385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch ASSERT_EQ(0, 4052385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch file_util::WriteFile( 4062385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch temp_dir.path().AppendASCII(kUnrelatedAppFilename), "", 0)); 4072385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch std::vector<base::FilePath> paths = 4082385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch ShellIntegrationLinux::GetExistingProfileShortcutFilenames( 4092385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch kProfilePath, temp_dir.path()); 4102385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // Path order is arbitrary. Sort the output for consistency. 4112385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch std::sort(paths.begin(), paths.end()); 4122385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch EXPECT_THAT(paths, 4132385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch ElementsAre(base::FilePath(kApp1Filename), 4142385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch base::FilePath(kApp2Filename))); 4152385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch} 4162385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ShellIntegrationTest, GetWebShortcutFilename) { 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const struct { 4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath::CharType* path; 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* url; 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } test_cases[] = { 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { FPL("http___foo_.desktop"), "http://foo" }, 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { FPL("http___foo_bar_.desktop"), "http://foo/bar/" }, 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { FPL("http___foo_bar_a=b&c=d.desktop"), "http://foo/bar?a=b&c=d" }, 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now we're starting to be more evil... 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { FPL("http___foo_.desktop"), "http://foo/bar/baz/../../../../../" }, 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { FPL("http___foo_.desktop"), "http://foo/bar/././../baz/././../" }, 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { FPL("http___.._.desktop"), "http://../../../../" }, 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_cases); i++) { 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string(chrome::kBrowserProcessExecutableName) + "-" + 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_cases[i].path, 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShellIntegrationLinux::GetWebShortcutFilename( 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL(test_cases[i].url)).value()) << 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " while testing " << test_cases[i].url; 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ShellIntegrationTest, GetDesktopFileContents) { 441c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::FilePath kChromeExePath("/opt/google/chrome/google-chrome"); 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const struct { 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* url; 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* title; 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* icon_name; 4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool nodisplay; 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* expected_output; 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } test_cases[] = { 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Real-world case. 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "http://gmail.com", 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "GMail", 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "chrome-http__gmail.com", 4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false, 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "#!/usr/bin/env xdg-open\n" 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "[Desktop Entry]\n" 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Version=1.0\n" 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Terminal=false\n" 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Type=Application\n" 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Name=GMail\n" 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Exec=/opt/google/chrome/google-chrome --app=http://gmail.com/\n" 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Icon=chrome-http__gmail.com\n" 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(USE_AURA) 4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Aura Chrome does not (yet) set WMClass, so we only expect 4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // StartupWMClass on non-Aura builds. 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "StartupWMClass=gmail.com\n" 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure that empty icons are replaced by the chrome icon. 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "http://gmail.com", 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "GMail", 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "", 4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false, 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "#!/usr/bin/env xdg-open\n" 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "[Desktop Entry]\n" 478c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Version=1.0\n" 479c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Terminal=false\n" 480c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Type=Application\n" 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Name=GMail\n" 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Exec=/opt/google/chrome/google-chrome --app=http://gmail.com/\n" 483c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Icon=chromium-browser\n" 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(USE_AURA) 4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Aura Chrome does not (yet) set WMClass, so we only expect 4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // StartupWMClass on non-Aura builds. 4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "StartupWMClass=gmail.com\n" 4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }, 4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Test adding NoDisplay=true. 4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "http://gmail.com", 4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "GMail", 4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "chrome-http__gmail.com", 4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) true, 4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "#!/usr/bin/env xdg-open\n" 4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "[Desktop Entry]\n" 499c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Version=1.0\n" 500c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Terminal=false\n" 501c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Type=Application\n" 5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "Name=GMail\n" 5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "Exec=/opt/google/chrome/google-chrome --app=http://gmail.com/\n" 5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "Icon=chrome-http__gmail.com\n" 5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "NoDisplay=true\n" 5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if !defined(USE_AURA) 5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Aura Chrome does not (yet) set WMClass, so we only expect 5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // StartupWMClass on non-Aura builds. 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "StartupWMClass=gmail.com\n" 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now we're starting to be more evil... 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "http://evil.com/evil --join-the-b0tnet", 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Ownz0red\nExec=rm -rf /", 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "chrome-http__evil.com_evil", 5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false, 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "#!/usr/bin/env xdg-open\n" 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "[Desktop Entry]\n" 521c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Version=1.0\n" 522c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Terminal=false\n" 523c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Type=Application\n" 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Name=http://evil.com/evil%20--join-the-b0tnet\n" 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Exec=/opt/google/chrome/google-chrome " 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "--app=http://evil.com/evil%20--join-the-b0tnet\n" 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Icon=chrome-http__evil.com_evil\n" 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(USE_AURA) 5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Aura Chrome does not (yet) set WMClass, so we only expect 5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // StartupWMClass on non-Aura builds. 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "StartupWMClass=evil.com__evil%20--join-the-b0tnet\n" 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "http://evil.com/evil; rm -rf /; \"; rm -rf $HOME >ownz0red", 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Innocent Title", 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "chrome-http__evil.com_evil", 5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false, 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "#!/usr/bin/env xdg-open\n" 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "[Desktop Entry]\n" 541c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Version=1.0\n" 542c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Terminal=false\n" 543c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Type=Application\n" 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Name=Innocent Title\n" 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Exec=/opt/google/chrome/google-chrome " 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "\"--app=http://evil.com/evil;%20rm%20-rf%20/;%20%22;%20rm%20" 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note: $ is escaped as \$ within an arg to Exec, and then 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the \ is escaped as \\ as all strings in a Desktop file should 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // be; finally, \\ becomes \\\\ when represented in a C++ string! 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "-rf%20\\\\$HOME%20%3Eownz0red\"\n" 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Icon=chrome-http__evil.com_evil\n" 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(USE_AURA) 5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Aura Chrome does not (yet) set WMClass, so we only expect 5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // StartupWMClass on non-Aura builds. 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "StartupWMClass=evil.com__evil;%20rm%20-rf%20_;%20%22;%20" 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "rm%20-rf%20$HOME%20%3Eownz0red\n" 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "http://evil.com/evil | cat `echo ownz0red` >/dev/null", 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Innocent Title", 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "chrome-http__evil.com_evil", 5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false, 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "#!/usr/bin/env xdg-open\n" 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "[Desktop Entry]\n" 566c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Version=1.0\n" 567c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Terminal=false\n" 568c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Type=Application\n" 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Name=Innocent Title\n" 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Exec=/opt/google/chrome/google-chrome " 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "--app=http://evil.com/evil%20%7C%20cat%20%60echo%20ownz0red" 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "%60%20%3E/dev/null\n" 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Icon=chrome-http__evil.com_evil\n" 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(USE_AURA) 5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Aura Chrome does not (yet) set WMClass, so we only expect 5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // StartupWMClass on non-Aura builds. 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "StartupWMClass=evil.com__evil%20%7C%20cat%20%60echo%20ownz0red" 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "%60%20%3E_dev_null\n" 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_cases); i++) { 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SCOPED_TRACE(i); 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ( 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_cases[i].expected_output, 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShellIntegrationLinux::GetDesktopFileContents( 588c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kChromeExePath, 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_app::GenerateApplicationNameFromURL(GURL(test_cases[i].url)), 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL(test_cases[i].url), 591c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string(), 5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(), 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASCIIToUTF16(test_cases[i].title), 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_cases[i].icon_name, 5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(), 5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_cases[i].nodisplay)); 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 600c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(ShellIntegrationTest, GetDirectoryFileContents) { 601c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const struct { 602c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const char* title; 603c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const char* icon_name; 604c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const char* expected_output; 605c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } test_cases[] = { 606c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Real-world case. 607c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { "Chrome Apps", 608c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "chrome-apps", 609c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 610c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "[Desktop Entry]\n" 611c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Version=1.0\n" 612c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Type=Directory\n" 613c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Name=Chrome Apps\n" 614c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Icon=chrome-apps\n" 615c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) }, 616c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 617c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Make sure that empty icons are replaced by the chrome icon. 618c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { "Chrome Apps", 619c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "", 620c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 621c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "[Desktop Entry]\n" 622c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Version=1.0\n" 623c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Type=Directory\n" 624c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Name=Chrome Apps\n" 625c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Icon=chromium-browser\n" 626c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) }, 627c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) }; 628c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 629c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_cases); i++) { 630c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SCOPED_TRACE(i); 631c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ( 632c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) test_cases[i].expected_output, 633c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ShellIntegrationLinux::GetDirectoryFileContents( 634c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASCIIToUTF16(test_cases[i].title), 635c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) test_cases[i].icon_name)); 636c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 637c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 638c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 640