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