shell_integration_linux_unittest.cc revision a02191e04bc25c4935f804f2c080ae28663d096d
1d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Copyright 2013 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) 5d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "chrome/browser/shell_integration_linux.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" 125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/command_line.h" 13d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "base/environment.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_util.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/scoped_temp_dir.h" 179ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/stl_util.h" 19868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h" 20868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/test/scoped_path_override.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_constants.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_browser_thread.h" 242385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#include "testing/gmock/include/gmock/gmock.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/gurl.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define FPL FILE_PATH_LITERAL 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread; 312385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochusing ::testing::ElementsAre; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Provides mock environment variables values based on a stored map. 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockEnvironment : public base::Environment { 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockEnvironment() {} 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Set(const std::string& name, const std::string& value) { 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) variables_[name] = value; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool GetVar(const char* variable_name, std::string* result) OVERRIDE { 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ContainsKey(variables_, variable_name)) { 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *result = variables_[variable_name]; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool SetVar(const char* variable_name, 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& new_value) OVERRIDE { 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ADD_FAILURE(); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool UnSetVar(const char* variable_name) OVERRIDE { 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ADD_FAILURE(); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::map<std::string, std::string> variables_; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(MockEnvironment); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 722385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen MurdochTEST(ShellIntegrationTest, GetDataWriteLocation) { 732385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch base::MessageLoop message_loop; 742385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch content::TestBrowserThread file_thread(BrowserThread::FILE, &message_loop); 752385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 762385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // Test that it returns $XDG_DATA_HOME. 772385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch { 782385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch MockEnvironment env; 792385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch env.Set("HOME", "/home/user"); 802385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch env.Set("XDG_DATA_HOME", "/user/path"); 812385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch base::FilePath path; 822385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch ASSERT_TRUE(ShellIntegrationLinux::GetDataWriteLocation(&env, &path)); 832385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch EXPECT_EQ(base::FilePath("/user/path"), path); 842385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch } 852385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 862385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // Test that $XDG_DATA_HOME falls back to $HOME/.local/share. 872385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch { 882385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch MockEnvironment env; 892385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch env.Set("HOME", "/home/user"); 902385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch base::FilePath path; 912385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch ASSERT_TRUE(ShellIntegrationLinux::GetDataWriteLocation(&env, &path)); 922385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch EXPECT_EQ(base::FilePath("/home/user/.local/share"), path); 932385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch } 942385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 952385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // Test that if neither $XDG_DATA_HOME nor $HOME are specified, it fails. 962385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch { 972385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch MockEnvironment env; 982385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch base::FilePath path; 992385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch ASSERT_FALSE(ShellIntegrationLinux::GetDataWriteLocation(&env, &path)); 1002385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch } 1012385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch} 1022385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 1032385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen MurdochTEST(ShellIntegrationTest, GetDataSearchLocations) { 1042385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch base::MessageLoop message_loop; 1052385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch content::TestBrowserThread file_thread(BrowserThread::FILE, &message_loop); 1062385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 1072385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // Test that it returns $XDG_DATA_HOME + $XDG_DATA_DIRS. 1082385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch { 1092385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch MockEnvironment env; 1102385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch env.Set("HOME", "/home/user"); 1112385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch env.Set("XDG_DATA_HOME", "/user/path"); 1122385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch env.Set("XDG_DATA_DIRS", "/system/path/1:/system/path/2"); 1132385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch EXPECT_THAT( 1142385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch ShellIntegrationLinux::GetDataSearchLocations(&env), 1152385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch ElementsAre(base::FilePath("/user/path"), 1162385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch base::FilePath("/system/path/1"), 1172385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch base::FilePath("/system/path/2"))); 1182385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch } 1192385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 1202385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // Test that $XDG_DATA_HOME falls back to $HOME/.local/share. 1212385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch { 1222385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch MockEnvironment env; 1232385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch env.Set("HOME", "/home/user"); 1242385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch env.Set("XDG_DATA_DIRS", "/system/path/1:/system/path/2"); 1252385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch EXPECT_THAT( 1262385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch ShellIntegrationLinux::GetDataSearchLocations(&env), 1272385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch ElementsAre(base::FilePath("/home/user/.local/share"), 1282385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch base::FilePath("/system/path/1"), 1292385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch base::FilePath("/system/path/2"))); 1302385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch } 1312385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 1322385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // Test that if neither $XDG_DATA_HOME nor $HOME are specified, it still 1332385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // succeeds. 1342385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch { 1352385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch MockEnvironment env; 1362385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch env.Set("XDG_DATA_DIRS", "/system/path/1:/system/path/2"); 1372385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch EXPECT_THAT( 1382385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch ShellIntegrationLinux::GetDataSearchLocations(&env), 1392385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch ElementsAre(base::FilePath("/system/path/1"), 1402385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch base::FilePath("/system/path/2"))); 1412385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch } 1422385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 1432385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // Test that $XDG_DATA_DIRS falls back to the two default paths. 1442385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch { 1452385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch MockEnvironment env; 1462385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch env.Set("HOME", "/home/user"); 1472385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch env.Set("XDG_DATA_HOME", "/user/path"); 1482385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch EXPECT_THAT( 1492385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch ShellIntegrationLinux::GetDataSearchLocations(&env), 1502385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch ElementsAre(base::FilePath("/user/path"), 1512385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch base::FilePath("/usr/local/share"), 1522385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch base::FilePath("/usr/share"))); 1532385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch } 1542385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch} 1552385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(ShellIntegrationTest, GetExistingShortcutLocations) { 1577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::FilePath kProfilePath("Profile 1"); 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char kExtensionId[] = "test_extension"; 1597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const char kTemplateFilename[] = "chrome-test_extension-Profile_1.desktop"; 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath kTemplateFilepath(kTemplateFilename); 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char kNoDisplayDesktopFile[] = "[Desktop Entry]\nNoDisplay=true"; 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop message_loop; 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::TestBrowserThread file_thread(BrowserThread::FILE, &message_loop); 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // No existing shortcuts. 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockEnvironment env; 169a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch web_app::ShortcutLocations result = 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ShellIntegrationLinux::GetExistingShortcutLocations( 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &env, kProfilePath, kExtensionId); 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(result.on_desktop); 173a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ(web_app::APP_MENU_LOCATION_NONE, 174a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) result.applications_menu_location); 175a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(result.in_quick_launch_bar); 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(result.hidden); 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Shortcut on desktop. 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ScopedTempDir temp_dir; 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath desktop_path = temp_dir.path(); 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockEnvironment env; 187a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(base::CreateDirectory(desktop_path)); 188a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_FALSE(base::WriteFile( 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) desktop_path.AppendASCII(kTemplateFilename), 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "", 0)); 191a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch web_app::ShortcutLocations result = 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ShellIntegrationLinux::GetExistingShortcutLocations( 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &env, kProfilePath, kExtensionId, desktop_path); 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(result.on_desktop); 195a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ(web_app::APP_MENU_LOCATION_NONE, 196a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) result.applications_menu_location); 197a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(result.in_quick_launch_bar); 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(result.hidden); 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Shortcut in applications directory. 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ScopedTempDir temp_dir; 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath apps_path = temp_dir.path().AppendASCII("applications"); 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockEnvironment env; 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) env.Set("XDG_DATA_HOME", temp_dir.path().value()); 210a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(base::CreateDirectory(apps_path)); 211a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_FALSE(base::WriteFile( 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) apps_path.AppendASCII(kTemplateFilename), 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "", 0)); 214a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch web_app::ShortcutLocations result = 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ShellIntegrationLinux::GetExistingShortcutLocations( 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &env, kProfilePath, kExtensionId); 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(result.on_desktop); 218a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ(web_app::APP_MENU_LOCATION_SUBDIR_CHROMEAPPS, 219a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) result.applications_menu_location); 220a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(result.in_quick_launch_bar); 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(result.hidden); 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Shortcut in applications directory with NoDisplay=true. 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ScopedTempDir temp_dir; 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); 2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath apps_path = temp_dir.path().AppendASCII("applications"); 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockEnvironment env; 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) env.Set("XDG_DATA_HOME", temp_dir.path().value()); 233a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(base::CreateDirectory(apps_path)); 234a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_TRUE(base::WriteFile( 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) apps_path.AppendASCII(kTemplateFilename), 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kNoDisplayDesktopFile, strlen(kNoDisplayDesktopFile))); 237a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch web_app::ShortcutLocations result = 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ShellIntegrationLinux::GetExistingShortcutLocations( 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &env, kProfilePath, kExtensionId); 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Doesn't count as being in applications menu. 2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(result.on_desktop); 242a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ(web_app::APP_MENU_LOCATION_NONE, 243a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) result.applications_menu_location); 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(result.in_quick_launch_bar); 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(result.hidden); 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Shortcut on desktop and in applications directory. 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ScopedTempDir temp_dir1; 2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(temp_dir1.CreateUniqueTempDir()); 2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath desktop_path = temp_dir1.path(); 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ScopedTempDir temp_dir2; 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(temp_dir2.CreateUniqueTempDir()); 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath apps_path = temp_dir2.path().AppendASCII("applications"); 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockEnvironment env; 259a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(base::CreateDirectory(desktop_path)); 260a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_FALSE(base::WriteFile( 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) desktop_path.AppendASCII(kTemplateFilename), 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "", 0)); 2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) env.Set("XDG_DATA_HOME", temp_dir2.path().value()); 264a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(base::CreateDirectory(apps_path)); 265a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_FALSE(base::WriteFile( 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) apps_path.AppendASCII(kTemplateFilename), 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "", 0)); 268a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch web_app::ShortcutLocations result = 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ShellIntegrationLinux::GetExistingShortcutLocations( 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &env, kProfilePath, kExtensionId, desktop_path); 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(result.on_desktop); 272a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ(web_app::APP_MENU_LOCATION_SUBDIR_CHROMEAPPS, 273a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) result.applications_menu_location); 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(result.in_quick_launch_bar); 2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(result.hidden); 2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(ShellIntegrationTest, GetExistingShortcutContents) { 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char kTemplateFilename[] = "shortcut-test.desktop"; 2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath kTemplateFilepath(kTemplateFilename); 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char kTestData1[] = "a magical testing string"; 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char kTestData2[] = "a different testing string"; 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop message_loop; 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::TestBrowserThread file_thread(BrowserThread::FILE, &message_loop); 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Test that it searches $XDG_DATA_HOME/applications. 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ScopedTempDir temp_dir; 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockEnvironment env; 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) env.Set("XDG_DATA_HOME", temp_dir.path().value()); 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Create a file in a non-applications directory. This should be ignored. 296a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_TRUE(base::WriteFile( 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) temp_dir.path().AppendASCII(kTemplateFilename), 2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kTestData2, strlen(kTestData2))); 299a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(base::CreateDirectory( 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) temp_dir.path().AppendASCII("applications"))); 301a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_TRUE(base::WriteFile( 3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) temp_dir.path().AppendASCII("applications") 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) .AppendASCII(kTemplateFilename), 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kTestData1, strlen(kTestData1))); 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string contents; 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE( 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ShellIntegrationLinux::GetExistingShortcutContents( 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &env, kTemplateFilepath, &contents)); 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kTestData1, contents); 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Test that it falls back to $HOME/.local/share/applications. 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ScopedTempDir temp_dir; 3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); 3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockEnvironment env; 3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) env.Set("HOME", temp_dir.path().value()); 319a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(base::CreateDirectory( 3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) temp_dir.path().AppendASCII(".local/share/applications"))); 321a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_TRUE(base::WriteFile( 3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) temp_dir.path().AppendASCII(".local/share/applications") 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) .AppendASCII(kTemplateFilename), 3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kTestData1, strlen(kTestData1))); 3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string contents; 3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE( 3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ShellIntegrationLinux::GetExistingShortcutContents( 3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &env, kTemplateFilepath, &contents)); 3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(kTestData1, contents); 3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Test that it searches $XDG_DATA_DIRS/applications. 3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ScopedTempDir temp_dir; 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockEnvironment env; 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) env.Set("XDG_DATA_DIRS", temp_dir.path().value()); 339a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(base::CreateDirectory( 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) temp_dir.path().AppendASCII("applications"))); 341a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_TRUE(base::WriteFile( 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) temp_dir.path().AppendASCII("applications") 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .AppendASCII(kTemplateFilename), 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kTestData2, strlen(kTestData2))); 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string contents; 3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE( 3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ShellIntegrationLinux::GetExistingShortcutContents( 3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &env, kTemplateFilepath, &contents)); 3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(kTestData2, contents); 3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Test that it searches $X/applications for each X in $XDG_DATA_DIRS. 3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ScopedTempDir temp_dir1; 3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(temp_dir1.CreateUniqueTempDir()); 3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ScopedTempDir temp_dir2; 3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(temp_dir2.CreateUniqueTempDir()); 3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockEnvironment env; 3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) env.Set("XDG_DATA_DIRS", temp_dir1.path().value() + ":" + 3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) temp_dir2.path().value()); 3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Create a file in a non-applications directory. This should be ignored. 363a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_TRUE(base::WriteFile( 3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) temp_dir1.path().AppendASCII(kTemplateFilename), 3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kTestData1, strlen(kTestData1))); 3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Only create a findable desktop file in the second path. 367a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(base::CreateDirectory( 3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) temp_dir2.path().AppendASCII("applications"))); 369a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_TRUE(base::WriteFile( 3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) temp_dir2.path().AppendASCII("applications") 3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) .AppendASCII(kTemplateFilename), 3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kTestData2, strlen(kTestData2))); 3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string contents; 3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE( 3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ShellIntegrationLinux::GetExistingShortcutContents( 3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &env, kTemplateFilepath, &contents)); 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kTestData2, contents); 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3812385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen MurdochTEST(ShellIntegrationTest, GetExtensionShortcutFilename) { 3822385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch base::FilePath kProfilePath("a/b/c/Profile Name?"); 3832385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch const char kExtensionId[] = "extensionid"; 3842385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch EXPECT_EQ(base::FilePath("chrome-extensionid-Profile_Name_.desktop"), 3852385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch ShellIntegrationLinux::GetExtensionShortcutFilename( 3862385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch kProfilePath, kExtensionId)); 3872385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch} 3882385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 3892385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen MurdochTEST(ShellIntegrationTest, GetExistingProfileShortcutFilenames) { 3902385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch base::FilePath kProfilePath("a/b/c/Profile Name?"); 3912385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch const char kApp1Filename[] = "chrome-extension1-Profile_Name_.desktop"; 3922385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch const char kApp2Filename[] = "chrome-extension2-Profile_Name_.desktop"; 3932385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch const char kUnrelatedAppFilename[] = "chrome-extension-Other_Profile.desktop"; 3942385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 3952385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch base::MessageLoop message_loop; 3962385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch content::TestBrowserThread file_thread(BrowserThread::FILE, &message_loop); 3972385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 3982385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch base::ScopedTempDir temp_dir; 3992385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); 4002385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch ASSERT_EQ(0, 401a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::WriteFile( 4022385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch temp_dir.path().AppendASCII(kApp1Filename), "", 0)); 4032385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch ASSERT_EQ(0, 404a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::WriteFile( 4052385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch temp_dir.path().AppendASCII(kApp2Filename), "", 0)); 4062385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // This file should not be returned in the results. 4072385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch ASSERT_EQ(0, 408a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::WriteFile( 4092385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch temp_dir.path().AppendASCII(kUnrelatedAppFilename), "", 0)); 4102385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch std::vector<base::FilePath> paths = 4112385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch ShellIntegrationLinux::GetExistingProfileShortcutFilenames( 4122385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch kProfilePath, temp_dir.path()); 4132385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // Path order is arbitrary. Sort the output for consistency. 4142385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch std::sort(paths.begin(), paths.end()); 4152385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch EXPECT_THAT(paths, 4162385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch ElementsAre(base::FilePath(kApp1Filename), 4172385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch base::FilePath(kApp2Filename))); 4182385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch} 4192385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ShellIntegrationTest, GetWebShortcutFilename) { 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const struct { 4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath::CharType* path; 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* url; 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } test_cases[] = { 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { FPL("http___foo_.desktop"), "http://foo" }, 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { FPL("http___foo_bar_.desktop"), "http://foo/bar/" }, 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { FPL("http___foo_bar_a=b&c=d.desktop"), "http://foo/bar?a=b&c=d" }, 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now we're starting to be more evil... 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { FPL("http___foo_.desktop"), "http://foo/bar/baz/../../../../../" }, 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { FPL("http___foo_.desktop"), "http://foo/bar/././../baz/././../" }, 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { FPL("http___.._.desktop"), "http://../../../../" }, 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_cases); i++) { 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string(chrome::kBrowserProcessExecutableName) + "-" + 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_cases[i].path, 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShellIntegrationLinux::GetWebShortcutFilename( 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL(test_cases[i].url)).value()) << 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " while testing " << test_cases[i].url; 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ShellIntegrationTest, GetDesktopFileContents) { 444c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::FilePath kChromeExePath("/opt/google/chrome/google-chrome"); 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const struct { 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* url; 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* title; 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* icon_name; 4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool nodisplay; 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* expected_output; 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } test_cases[] = { 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Real-world case. 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "http://gmail.com", 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "GMail", 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "chrome-http__gmail.com", 4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false, 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "#!/usr/bin/env xdg-open\n" 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "[Desktop Entry]\n" 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Version=1.0\n" 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Terminal=false\n" 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Type=Application\n" 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Name=GMail\n" 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Exec=/opt/google/chrome/google-chrome --app=http://gmail.com/\n" 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Icon=chrome-http__gmail.com\n" 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "StartupWMClass=gmail.com\n" 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure that empty icons are replaced by the chrome icon. 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "http://gmail.com", 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "GMail", 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "", 4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false, 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "#!/usr/bin/env xdg-open\n" 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "[Desktop Entry]\n" 477c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Version=1.0\n" 478c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Terminal=false\n" 479c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Type=Application\n" 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Name=GMail\n" 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Exec=/opt/google/chrome/google-chrome --app=http://gmail.com/\n" 4825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(GOOGLE_CHROME_BUILD) 4835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "Icon=google-chrome\n" 4845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#else 485c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Icon=chromium-browser\n" 4865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "StartupWMClass=gmail.com\n" 4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }, 4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Test adding NoDisplay=true. 4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "http://gmail.com", 4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "GMail", 4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "chrome-http__gmail.com", 4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) true, 4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "#!/usr/bin/env xdg-open\n" 4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "[Desktop Entry]\n" 498c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Version=1.0\n" 499c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Terminal=false\n" 500c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Type=Application\n" 5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "Name=GMail\n" 5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "Exec=/opt/google/chrome/google-chrome --app=http://gmail.com/\n" 5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "Icon=chrome-http__gmail.com\n" 5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "NoDisplay=true\n" 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "StartupWMClass=gmail.com\n" 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now we're starting to be more evil... 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "http://evil.com/evil --join-the-b0tnet", 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Ownz0red\nExec=rm -rf /", 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "chrome-http__evil.com_evil", 5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false, 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "#!/usr/bin/env xdg-open\n" 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "[Desktop Entry]\n" 516c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Version=1.0\n" 517c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Terminal=false\n" 518c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Type=Application\n" 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Name=http://evil.com/evil%20--join-the-b0tnet\n" 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Exec=/opt/google/chrome/google-chrome " 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "--app=http://evil.com/evil%20--join-the-b0tnet\n" 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Icon=chrome-http__evil.com_evil\n" 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "StartupWMClass=evil.com__evil%20--join-the-b0tnet\n" 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "http://evil.com/evil; rm -rf /; \"; rm -rf $HOME >ownz0red", 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Innocent Title", 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "chrome-http__evil.com_evil", 5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false, 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "#!/usr/bin/env xdg-open\n" 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "[Desktop Entry]\n" 532c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Version=1.0\n" 533c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Terminal=false\n" 534c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Type=Application\n" 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Name=Innocent Title\n" 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Exec=/opt/google/chrome/google-chrome " 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "\"--app=http://evil.com/evil;%20rm%20-rf%20/;%20%22;%20rm%20" 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note: $ is escaped as \$ within an arg to Exec, and then 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the \ is escaped as \\ as all strings in a Desktop file should 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // be; finally, \\ becomes \\\\ when represented in a C++ string! 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "-rf%20\\\\$HOME%20%3Eownz0red\"\n" 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Icon=chrome-http__evil.com_evil\n" 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "StartupWMClass=evil.com__evil;%20rm%20-rf%20_;%20%22;%20" 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "rm%20-rf%20$HOME%20%3Eownz0red\n" 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "http://evil.com/evil | cat `echo ownz0red` >/dev/null", 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Innocent Title", 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "chrome-http__evil.com_evil", 5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false, 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "#!/usr/bin/env xdg-open\n" 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "[Desktop Entry]\n" 553c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Version=1.0\n" 554c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Terminal=false\n" 555c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Type=Application\n" 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Name=Innocent Title\n" 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Exec=/opt/google/chrome/google-chrome " 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "--app=http://evil.com/evil%20%7C%20cat%20%60echo%20ownz0red" 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "%60%20%3E/dev/null\n" 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Icon=chrome-http__evil.com_evil\n" 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "StartupWMClass=evil.com__evil%20%7C%20cat%20%60echo%20ownz0red" 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "%60%20%3E_dev_null\n" 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_cases); i++) { 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SCOPED_TRACE(i); 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ( 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_cases[i].expected_output, 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShellIntegrationLinux::GetDesktopFileContents( 571c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kChromeExePath, 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_app::GenerateApplicationNameFromURL(GURL(test_cases[i].url)), 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL(test_cases[i].url), 574c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string(), 5755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::ASCIIToUTF16(test_cases[i].title), 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_cases[i].icon_name, 5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(), 5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_cases[i].nodisplay)); 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST(ShellIntegrationTest, GetDesktopFileContentsAppList) { 5835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::FilePath kChromeExePath("/opt/google/chrome/google-chrome"); 5845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CommandLine command_line(kChromeExePath); 5855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) command_line.AppendSwitch("--show-app-list"); 5865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ( 5875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "#!/usr/bin/env xdg-open\n" 5885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "[Desktop Entry]\n" 5895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "Version=1.0\n" 5905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "Terminal=false\n" 5915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "Type=Application\n" 5925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "Name=Chrome App Launcher\n" 5935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "Exec=/opt/google/chrome/google-chrome --show-app-list\n" 5945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "Icon=chrome_app_list\n" 5955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "StartupWMClass=chrome-app-list\n", 5965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ShellIntegrationLinux::GetDesktopFileContentsForCommand( 5975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) command_line, 5985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "chrome-app-list", 5995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GURL(), 6005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::ASCIIToUTF16("Chrome App Launcher"), 6015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "chrome_app_list", 6025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) false)); 6035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 6045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 605c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(ShellIntegrationTest, GetDirectoryFileContents) { 606c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const struct { 607c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const char* title; 608c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const char* icon_name; 609c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const char* expected_output; 610c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } test_cases[] = { 611c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Real-world case. 612c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { "Chrome Apps", 613c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "chrome-apps", 614c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 615c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "[Desktop Entry]\n" 616c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Version=1.0\n" 617c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Type=Directory\n" 618c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Name=Chrome Apps\n" 619c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Icon=chrome-apps\n" 620c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) }, 621c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 622c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Make sure that empty icons are replaced by the chrome icon. 623c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { "Chrome Apps", 624c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "", 625c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 626c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "[Desktop Entry]\n" 627c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Version=1.0\n" 628c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Type=Directory\n" 629c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Name=Chrome Apps\n" 6305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(GOOGLE_CHROME_BUILD) 6315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "Icon=google-chrome\n" 6325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#else 633c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Icon=chromium-browser\n" 6345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 635c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) }, 636c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) }; 637c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 638c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_cases); i++) { 639c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SCOPED_TRACE(i); 640c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ( 641c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) test_cases[i].expected_output, 642c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ShellIntegrationLinux::GetDirectoryFileContents( 6435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::ASCIIToUTF16(test_cases[i].title), 644c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) test_cases[i].icon_name)); 645c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 646c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 647