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" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h" 151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.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) 33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace shell_integration_linux { 34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Provides mock environment variables values based on a stored map. 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockEnvironment : public base::Environment { 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockEnvironment() {} 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Set(const std::string& name, const std::string& value) { 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) variables_[name] = value; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool GetVar(const char* variable_name, std::string* result) OVERRIDE { 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ContainsKey(variables_, variable_name)) { 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *result = variables_[variable_name]; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool SetVar(const char* variable_name, 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& new_value) OVERRIDE { 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ADD_FAILURE(); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool UnSetVar(const char* variable_name) OVERRIDE { 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ADD_FAILURE(); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::map<std::string, std::string> variables_; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(MockEnvironment); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 742385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen MurdochTEST(ShellIntegrationTest, GetDataWriteLocation) { 752385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch base::MessageLoop message_loop; 762385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch content::TestBrowserThread file_thread(BrowserThread::FILE, &message_loop); 772385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 782385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // Test that it returns $XDG_DATA_HOME. 792385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch { 802385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch MockEnvironment env; 812385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch env.Set("HOME", "/home/user"); 822385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch env.Set("XDG_DATA_HOME", "/user/path"); 832385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch base::FilePath path; 84cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ASSERT_TRUE(GetDataWriteLocation(&env, &path)); 852385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch EXPECT_EQ(base::FilePath("/user/path"), path); 862385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch } 872385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 882385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // Test that $XDG_DATA_HOME falls back to $HOME/.local/share. 892385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch { 902385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch MockEnvironment env; 912385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch env.Set("HOME", "/home/user"); 922385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch base::FilePath path; 93cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ASSERT_TRUE(GetDataWriteLocation(&env, &path)); 942385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch EXPECT_EQ(base::FilePath("/home/user/.local/share"), path); 952385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch } 962385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 972385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // Test that if neither $XDG_DATA_HOME nor $HOME are specified, it fails. 982385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch { 992385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch MockEnvironment env; 1002385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch base::FilePath path; 101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ASSERT_FALSE(GetDataWriteLocation(&env, &path)); 1022385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch } 1032385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch} 1042385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 1052385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen MurdochTEST(ShellIntegrationTest, GetDataSearchLocations) { 1062385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch base::MessageLoop message_loop; 1072385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch content::TestBrowserThread file_thread(BrowserThread::FILE, &message_loop); 1082385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 1092385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // Test that it returns $XDG_DATA_HOME + $XDG_DATA_DIRS. 1102385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch { 1112385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch MockEnvironment env; 1122385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch env.Set("HOME", "/home/user"); 1132385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch env.Set("XDG_DATA_HOME", "/user/path"); 1142385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch env.Set("XDG_DATA_DIRS", "/system/path/1:/system/path/2"); 1152385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch EXPECT_THAT( 116cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GetDataSearchLocations(&env), 1172385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch ElementsAre(base::FilePath("/user/path"), 1182385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch base::FilePath("/system/path/1"), 1192385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch base::FilePath("/system/path/2"))); 1202385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch } 1212385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 1222385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // Test that $XDG_DATA_HOME falls back to $HOME/.local/share. 1232385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch { 1242385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch MockEnvironment env; 1252385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch env.Set("HOME", "/home/user"); 1262385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch env.Set("XDG_DATA_DIRS", "/system/path/1:/system/path/2"); 1272385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch EXPECT_THAT( 128cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GetDataSearchLocations(&env), 1292385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch ElementsAre(base::FilePath("/home/user/.local/share"), 1302385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch base::FilePath("/system/path/1"), 1312385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch base::FilePath("/system/path/2"))); 1322385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch } 1332385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 1342385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // Test that if neither $XDG_DATA_HOME nor $HOME are specified, it still 1352385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // succeeds. 1362385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch { 1372385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch MockEnvironment env; 1382385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch env.Set("XDG_DATA_DIRS", "/system/path/1:/system/path/2"); 1392385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch EXPECT_THAT( 140cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GetDataSearchLocations(&env), 1412385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch ElementsAre(base::FilePath("/system/path/1"), 1422385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch base::FilePath("/system/path/2"))); 1432385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch } 1442385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 1452385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // Test that $XDG_DATA_DIRS falls back to the two default paths. 1462385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch { 1472385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch MockEnvironment env; 1482385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch env.Set("HOME", "/home/user"); 1492385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch env.Set("XDG_DATA_HOME", "/user/path"); 1502385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch EXPECT_THAT( 151cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GetDataSearchLocations(&env), 1522385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch ElementsAre(base::FilePath("/user/path"), 1532385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch base::FilePath("/usr/local/share"), 1542385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch base::FilePath("/usr/share"))); 1552385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch } 1562385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch} 1572385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(ShellIntegrationTest, GetExistingShortcutLocations) { 1597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::FilePath kProfilePath("Profile 1"); 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char kExtensionId[] = "test_extension"; 1617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const char kTemplateFilename[] = "chrome-test_extension-Profile_1.desktop"; 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath kTemplateFilepath(kTemplateFilename); 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char kNoDisplayDesktopFile[] = "[Desktop Entry]\nNoDisplay=true"; 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop message_loop; 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::TestBrowserThread file_thread(BrowserThread::FILE, &message_loop); 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // No existing shortcuts. 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockEnvironment env; 171a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch web_app::ShortcutLocations result = 172cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GetExistingShortcutLocations(&env, kProfilePath, kExtensionId); 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(result.on_desktop); 174a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ(web_app::APP_MENU_LOCATION_NONE, 175a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) result.applications_menu_location); 176a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(result.in_quick_launch_bar); 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)); 191cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) web_app::ShortcutLocations result = GetExistingShortcutLocations( 192cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) &env, kProfilePath, kExtensionId, desktop_path); 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(result.on_desktop); 194a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ(web_app::APP_MENU_LOCATION_NONE, 195a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) result.applications_menu_location); 196a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(result.in_quick_launch_bar); 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Shortcut in applications directory. 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ScopedTempDir temp_dir; 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath apps_path = temp_dir.path().AppendASCII("applications"); 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockEnvironment env; 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) env.Set("XDG_DATA_HOME", temp_dir.path().value()); 208a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(base::CreateDirectory(apps_path)); 209a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_FALSE(base::WriteFile( 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) apps_path.AppendASCII(kTemplateFilename), 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "", 0)); 212a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch web_app::ShortcutLocations result = 213cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GetExistingShortcutLocations(&env, kProfilePath, kExtensionId); 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(result.on_desktop); 215a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ(web_app::APP_MENU_LOCATION_SUBDIR_CHROMEAPPS, 216a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) result.applications_menu_location); 217a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(result.in_quick_launch_bar); 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Shortcut in applications directory with NoDisplay=true. 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ScopedTempDir temp_dir; 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath apps_path = temp_dir.path().AppendASCII("applications"); 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockEnvironment env; 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) env.Set("XDG_DATA_HOME", temp_dir.path().value()); 229a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(base::CreateDirectory(apps_path)); 230a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_TRUE(base::WriteFile( 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) apps_path.AppendASCII(kTemplateFilename), 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kNoDisplayDesktopFile, strlen(kNoDisplayDesktopFile))); 233a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch web_app::ShortcutLocations result = 234cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GetExistingShortcutLocations(&env, kProfilePath, kExtensionId); 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Doesn't count as being in applications menu. 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(result.on_desktop); 237f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(web_app::APP_MENU_LOCATION_HIDDEN, 238a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) result.applications_menu_location); 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(result.in_quick_launch_bar); 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Shortcut on desktop and in applications directory. 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ScopedTempDir temp_dir1; 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(temp_dir1.CreateUniqueTempDir()); 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath desktop_path = temp_dir1.path(); 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ScopedTempDir temp_dir2; 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(temp_dir2.CreateUniqueTempDir()); 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath apps_path = temp_dir2.path().AppendASCII("applications"); 2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockEnvironment env; 253a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(base::CreateDirectory(desktop_path)); 254a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_FALSE(base::WriteFile( 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) desktop_path.AppendASCII(kTemplateFilename), 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "", 0)); 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) env.Set("XDG_DATA_HOME", temp_dir2.path().value()); 258a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(base::CreateDirectory(apps_path)); 259a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_FALSE(base::WriteFile( 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) apps_path.AppendASCII(kTemplateFilename), 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "", 0)); 262cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) web_app::ShortcutLocations result = GetExistingShortcutLocations( 263cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) &env, kProfilePath, kExtensionId, desktop_path); 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(result.on_desktop); 265a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ(web_app::APP_MENU_LOCATION_SUBDIR_CHROMEAPPS, 266a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) result.applications_menu_location); 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(result.in_quick_launch_bar); 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(ShellIntegrationTest, GetExistingShortcutContents) { 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char kTemplateFilename[] = "shortcut-test.desktop"; 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath kTemplateFilepath(kTemplateFilename); 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char kTestData1[] = "a magical testing string"; 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char kTestData2[] = "a different testing string"; 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop message_loop; 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::TestBrowserThread file_thread(BrowserThread::FILE, &message_loop); 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Test that it searches $XDG_DATA_HOME/applications. 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ScopedTempDir temp_dir; 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockEnvironment env; 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) env.Set("XDG_DATA_HOME", temp_dir.path().value()); 2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Create a file in a non-applications directory. This should be ignored. 288a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_TRUE(base::WriteFile( 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) temp_dir.path().AppendASCII(kTemplateFilename), 2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kTestData2, strlen(kTestData2))); 291a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(base::CreateDirectory( 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) temp_dir.path().AppendASCII("applications"))); 293a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_TRUE(base::WriteFile( 2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) temp_dir.path().AppendASCII("applications") 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) .AppendASCII(kTemplateFilename), 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kTestData1, strlen(kTestData1))); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string contents; 2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE( 299cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GetExistingShortcutContents(&env, kTemplateFilepath, &contents)); 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kTestData1, contents); 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Test that it falls back to $HOME/.local/share/applications. 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ScopedTempDir temp_dir; 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockEnvironment env; 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) env.Set("HOME", temp_dir.path().value()); 310a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(base::CreateDirectory( 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) temp_dir.path().AppendASCII(".local/share/applications"))); 312a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_TRUE(base::WriteFile( 3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) temp_dir.path().AppendASCII(".local/share/applications") 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) .AppendASCII(kTemplateFilename), 3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kTestData1, strlen(kTestData1))); 3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string contents; 3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE( 318cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GetExistingShortcutContents(&env, kTemplateFilepath, &contents)); 3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(kTestData1, contents); 3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Test that it searches $XDG_DATA_DIRS/applications. 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ScopedTempDir temp_dir; 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockEnvironment env; 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) env.Set("XDG_DATA_DIRS", temp_dir.path().value()); 329a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(base::CreateDirectory( 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) temp_dir.path().AppendASCII("applications"))); 331a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_TRUE(base::WriteFile( 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) temp_dir.path().AppendASCII("applications") 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .AppendASCII(kTemplateFilename), 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kTestData2, strlen(kTestData2))); 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string contents; 3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE( 337cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GetExistingShortcutContents(&env, kTemplateFilepath, &contents)); 3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(kTestData2, contents); 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Test that it searches $X/applications for each X in $XDG_DATA_DIRS. 3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ScopedTempDir temp_dir1; 3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(temp_dir1.CreateUniqueTempDir()); 3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ScopedTempDir temp_dir2; 3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(temp_dir2.CreateUniqueTempDir()); 3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockEnvironment env; 3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) env.Set("XDG_DATA_DIRS", temp_dir1.path().value() + ":" + 3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) temp_dir2.path().value()); 3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Create a file in a non-applications directory. This should be ignored. 352a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_TRUE(base::WriteFile( 3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) temp_dir1.path().AppendASCII(kTemplateFilename), 3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kTestData1, strlen(kTestData1))); 3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Only create a findable desktop file in the second path. 356a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(base::CreateDirectory( 3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) temp_dir2.path().AppendASCII("applications"))); 358a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_TRUE(base::WriteFile( 3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) temp_dir2.path().AppendASCII("applications") 3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) .AppendASCII(kTemplateFilename), 3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kTestData2, strlen(kTestData2))); 3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string contents; 3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE( 364cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GetExistingShortcutContents(&env, kTemplateFilepath, &contents)); 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kTestData2, contents); 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3692385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen MurdochTEST(ShellIntegrationTest, GetExtensionShortcutFilename) { 3702385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch base::FilePath kProfilePath("a/b/c/Profile Name?"); 3712385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch const char kExtensionId[] = "extensionid"; 3722385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch EXPECT_EQ(base::FilePath("chrome-extensionid-Profile_Name_.desktop"), 373cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GetExtensionShortcutFilename(kProfilePath, kExtensionId)); 3742385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch} 3752385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 3762385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen MurdochTEST(ShellIntegrationTest, GetExistingProfileShortcutFilenames) { 3772385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch base::FilePath kProfilePath("a/b/c/Profile Name?"); 3782385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch const char kApp1Filename[] = "chrome-extension1-Profile_Name_.desktop"; 3792385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch const char kApp2Filename[] = "chrome-extension2-Profile_Name_.desktop"; 3802385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch const char kUnrelatedAppFilename[] = "chrome-extension-Other_Profile.desktop"; 3812385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 3822385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch base::MessageLoop message_loop; 3832385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch content::TestBrowserThread file_thread(BrowserThread::FILE, &message_loop); 3842385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 3852385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch base::ScopedTempDir temp_dir; 3862385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); 3872385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch ASSERT_EQ(0, 388a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::WriteFile( 3892385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch temp_dir.path().AppendASCII(kApp1Filename), "", 0)); 3902385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch ASSERT_EQ(0, 391a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::WriteFile( 3922385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch temp_dir.path().AppendASCII(kApp2Filename), "", 0)); 3932385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // This file should not be returned in the results. 3942385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch ASSERT_EQ(0, 395a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::WriteFile( 3962385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch temp_dir.path().AppendASCII(kUnrelatedAppFilename), "", 0)); 3972385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch std::vector<base::FilePath> paths = 398cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GetExistingProfileShortcutFilenames(kProfilePath, temp_dir.path()); 3992385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // Path order is arbitrary. Sort the output for consistency. 4002385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch std::sort(paths.begin(), paths.end()); 4012385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch EXPECT_THAT(paths, 4022385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch ElementsAre(base::FilePath(kApp1Filename), 4032385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch base::FilePath(kApp2Filename))); 4042385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch} 4052385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ShellIntegrationTest, GetWebShortcutFilename) { 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const struct { 4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath::CharType* path; 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* url; 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } test_cases[] = { 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { FPL("http___foo_.desktop"), "http://foo" }, 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { FPL("http___foo_bar_.desktop"), "http://foo/bar/" }, 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { FPL("http___foo_bar_a=b&c=d.desktop"), "http://foo/bar?a=b&c=d" }, 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now we're starting to be more evil... 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { FPL("http___foo_.desktop"), "http://foo/bar/baz/../../../../../" }, 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { FPL("http___foo_.desktop"), "http://foo/bar/././../baz/././../" }, 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { FPL("http___.._.desktop"), "http://../../../../" }, 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_cases); i++) { 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string(chrome::kBrowserProcessExecutableName) + "-" + 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_cases[i].path, 423cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GetWebShortcutFilename(GURL(test_cases[i].url)).value()) << 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " while testing " << test_cases[i].url; 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ShellIntegrationTest, GetDesktopFileContents) { 429c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::FilePath kChromeExePath("/opt/google/chrome/google-chrome"); 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const struct { 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* url; 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* title; 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* icon_name; 4345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const char* categories; 4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool nodisplay; 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* expected_output; 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } test_cases[] = { 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Real-world case. 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "http://gmail.com", 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "GMail", 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "chrome-http__gmail.com", 4425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "", 4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false, 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "#!/usr/bin/env xdg-open\n" 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "[Desktop Entry]\n" 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Version=1.0\n" 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Terminal=false\n" 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Type=Application\n" 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Name=GMail\n" 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Exec=/opt/google/chrome/google-chrome --app=http://gmail.com/\n" 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Icon=chrome-http__gmail.com\n" 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "StartupWMClass=gmail.com\n" 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure that empty icons are replaced by the chrome icon. 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "http://gmail.com", 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "GMail", 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "", 4605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "", 4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false, 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "#!/usr/bin/env xdg-open\n" 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "[Desktop Entry]\n" 465c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Version=1.0\n" 466c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Terminal=false\n" 467c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Type=Application\n" 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Name=GMail\n" 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Exec=/opt/google/chrome/google-chrome --app=http://gmail.com/\n" 4705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(GOOGLE_CHROME_BUILD) 4715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "Icon=google-chrome\n" 4725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#else 473c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Icon=chromium-browser\n" 4745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "StartupWMClass=gmail.com\n" 4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }, 4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Test adding categories and NoDisplay=true. 4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "http://gmail.com", 4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "GMail", 4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "chrome-http__gmail.com", 4825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "Graphics;Education;", 4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) true, 4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "#!/usr/bin/env xdg-open\n" 4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "[Desktop Entry]\n" 487c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Version=1.0\n" 488c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Terminal=false\n" 489c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Type=Application\n" 4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "Name=GMail\n" 4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "Exec=/opt/google/chrome/google-chrome --app=http://gmail.com/\n" 4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "Icon=chrome-http__gmail.com\n" 4935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "Categories=Graphics;Education;\n" 4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "NoDisplay=true\n" 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "StartupWMClass=gmail.com\n" 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now we're starting to be more evil... 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "http://evil.com/evil --join-the-b0tnet", 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Ownz0red\nExec=rm -rf /", 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "chrome-http__evil.com_evil", 5025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "", 5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false, 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "#!/usr/bin/env xdg-open\n" 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "[Desktop Entry]\n" 507c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Version=1.0\n" 508c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Terminal=false\n" 509c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Type=Application\n" 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Name=http://evil.com/evil%20--join-the-b0tnet\n" 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Exec=/opt/google/chrome/google-chrome " 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "--app=http://evil.com/evil%20--join-the-b0tnet\n" 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Icon=chrome-http__evil.com_evil\n" 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "StartupWMClass=evil.com__evil%20--join-the-b0tnet\n" 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "http://evil.com/evil; rm -rf /; \"; rm -rf $HOME >ownz0red", 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Innocent Title", 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "chrome-http__evil.com_evil", 5195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "", 5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false, 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "#!/usr/bin/env xdg-open\n" 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "[Desktop Entry]\n" 524c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Version=1.0\n" 525c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Terminal=false\n" 526c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Type=Application\n" 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Name=Innocent Title\n" 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Exec=/opt/google/chrome/google-chrome " 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "\"--app=http://evil.com/evil;%20rm%20-rf%20/;%20%22;%20rm%20" 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note: $ is escaped as \$ within an arg to Exec, and then 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the \ is escaped as \\ as all strings in a Desktop file should 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // be; finally, \\ becomes \\\\ when represented in a C++ string! 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "-rf%20\\\\$HOME%20%3Eownz0red\"\n" 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Icon=chrome-http__evil.com_evil\n" 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "StartupWMClass=evil.com__evil;%20rm%20-rf%20_;%20%22;%20" 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "rm%20-rf%20$HOME%20%3Eownz0red\n" 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "http://evil.com/evil | cat `echo ownz0red` >/dev/null", 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Innocent Title", 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "chrome-http__evil.com_evil", 5415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "", 5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false, 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "#!/usr/bin/env xdg-open\n" 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "[Desktop Entry]\n" 546c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Version=1.0\n" 547c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Terminal=false\n" 548c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Type=Application\n" 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Name=Innocent Title\n" 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Exec=/opt/google/chrome/google-chrome " 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "--app=http://evil.com/evil%20%7C%20cat%20%60echo%20ownz0red" 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "%60%20%3E/dev/null\n" 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Icon=chrome-http__evil.com_evil\n" 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "StartupWMClass=evil.com__evil%20%7C%20cat%20%60echo%20ownz0red" 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "%60%20%3E_dev_null\n" 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_cases); i++) { 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SCOPED_TRACE(i); 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ( 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_cases[i].expected_output, 563cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GetDesktopFileContents( 564c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kChromeExePath, 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_app::GenerateApplicationNameFromURL(GURL(test_cases[i].url)), 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL(test_cases[i].url), 567c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string(), 5685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::ASCIIToUTF16(test_cases[i].title), 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_cases[i].icon_name, 5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(), 5715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu test_cases[i].categories, 5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_cases[i].nodisplay)); 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST(ShellIntegrationTest, GetDesktopFileContentsAppList) { 5775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::FilePath kChromeExePath("/opt/google/chrome/google-chrome"); 578cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::CommandLine command_line(kChromeExePath); 5795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) command_line.AppendSwitch("--show-app-list"); 5805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ( 5815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "#!/usr/bin/env xdg-open\n" 5825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "[Desktop Entry]\n" 5835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "Version=1.0\n" 5845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "Terminal=false\n" 5855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "Type=Application\n" 5865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "Name=Chrome App Launcher\n" 5875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "Exec=/opt/google/chrome/google-chrome --show-app-list\n" 5885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "Icon=chrome_app_list\n" 5895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "Categories=Network;WebBrowser;\n" 5905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "StartupWMClass=chrome-app-list\n", 591cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GetDesktopFileContentsForCommand( 5925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) command_line, 5935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "chrome-app-list", 5945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GURL(), 5955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::ASCIIToUTF16("Chrome App Launcher"), 5965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "chrome_app_list", 5975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "Network;WebBrowser;", 5985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) false)); 5995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 6005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 601c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(ShellIntegrationTest, GetDirectoryFileContents) { 602c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const struct { 603c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const char* title; 604c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const char* icon_name; 605c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const char* expected_output; 606c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } test_cases[] = { 607c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Real-world case. 608c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { "Chrome Apps", 609c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "chrome-apps", 610c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 611c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "[Desktop Entry]\n" 612c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Version=1.0\n" 613c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Type=Directory\n" 614c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Name=Chrome Apps\n" 615c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Icon=chrome-apps\n" 616c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) }, 617c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 618c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Make sure that empty icons are replaced by the chrome icon. 619c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { "Chrome Apps", 620c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "", 621c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 622c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "[Desktop Entry]\n" 623c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Version=1.0\n" 624c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Type=Directory\n" 625c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Name=Chrome Apps\n" 6265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(GOOGLE_CHROME_BUILD) 6275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "Icon=google-chrome\n" 6285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#else 629c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Icon=chromium-browser\n" 6305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 631c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) }, 632c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) }; 633c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 634c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_cases); i++) { 635c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SCOPED_TRACE(i); 636cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(test_cases[i].expected_output, 637cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GetDirectoryFileContents(base::ASCIIToUTF16(test_cases[i].title), 638cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) test_cases[i].icon_name)); 639c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 640c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 641cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 642cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} // namespace shell_integration_linux 643