| Index: chrome/browser/shell_integration_unittest.cc
|
| diff --git a/chrome/browser/shell_integration_unittest.cc b/chrome/browser/shell_integration_unittest.cc
|
| deleted file mode 100644
|
| index 39ca70ad9a1852253b7545663f90b34bf5dbcc64..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/shell_integration_unittest.cc
|
| +++ /dev/null
|
| @@ -1,417 +0,0 @@
|
| -// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "chrome/browser/shell_integration.h"
|
| -
|
| -#include <cstdlib>
|
| -#include <map>
|
| -
|
| -#include "base/file_util.h"
|
| -#include "base/files/file_path.h"
|
| -#include "base/files/scoped_temp_dir.h"
|
| -#include "base/message_loop.h"
|
| -#include "base/stl_util.h"
|
| -#include "base/string_util.h"
|
| -#include "base/utf_string_conversions.h"
|
| -#include "chrome/browser/web_applications/web_app.h"
|
| -#include "chrome/common/chrome_constants.h"
|
| -#include "content/public/test/test_browser_thread.h"
|
| -#include "googleurl/src/gurl.h"
|
| -#include "testing/gtest/include/gtest/gtest.h"
|
| -
|
| -#if defined(OS_POSIX) && !defined(OS_MACOSX)
|
| -#include "base/environment.h"
|
| -#include "chrome/browser/shell_integration_linux.h"
|
| -#endif
|
| -
|
| -#define FPL FILE_PATH_LITERAL
|
| -
|
| -using content::BrowserThread;
|
| -
|
| -#if defined(OS_POSIX) && !defined(OS_MACOSX)
|
| -namespace {
|
| -
|
| -// Provides mock environment variables values based on a stored map.
|
| -class MockEnvironment : public base::Environment {
|
| - public:
|
| - MockEnvironment() {}
|
| -
|
| - void Set(const std::string& name, const std::string& value) {
|
| - variables_[name] = value;
|
| - }
|
| -
|
| - virtual bool GetVar(const char* variable_name, std::string* result) OVERRIDE {
|
| - if (ContainsKey(variables_, variable_name)) {
|
| - *result = variables_[variable_name];
|
| - return true;
|
| - }
|
| -
|
| - return false;
|
| - }
|
| -
|
| - virtual bool SetVar(const char* variable_name,
|
| - const std::string& new_value) OVERRIDE {
|
| - ADD_FAILURE();
|
| - return false;
|
| - }
|
| -
|
| - virtual bool UnSetVar(const char* variable_name) OVERRIDE {
|
| - ADD_FAILURE();
|
| - return false;
|
| - }
|
| -
|
| - private:
|
| - std::map<std::string, std::string> variables_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(MockEnvironment);
|
| -};
|
| -
|
| -// Allows you to change the real environment, but reverts changes upon
|
| -// destruction.
|
| -class ScopedEnvironment {
|
| - public:
|
| - ScopedEnvironment() {}
|
| -
|
| - ~ScopedEnvironment() {
|
| - for (std::map<std::string, std::string>::const_iterator
|
| - it = old_variables_.begin(); it != old_variables_.end(); ++it) {
|
| - if (it->second.empty()) {
|
| - unsetenv(it->first.c_str());
|
| - } else {
|
| - setenv(it->first.c_str(), it->second.c_str(), 1);
|
| - }
|
| - }
|
| - }
|
| -
|
| - void Set(const std::string& name, const std::string& value) {
|
| - if (!ContainsKey(old_variables_, name)) {
|
| - const char* value = getenv(name.c_str());
|
| - if (value != NULL) {
|
| - old_variables_[name] = value;
|
| - } else {
|
| - old_variables_[name] = std::string();
|
| - }
|
| - }
|
| - setenv(name.c_str(), value.c_str(), 1);
|
| - }
|
| -
|
| - private:
|
| - // Map from name to original value, or the empty string if there was no
|
| - // previous value.
|
| - std::map<std::string, std::string> old_variables_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(ScopedEnvironment);
|
| -};
|
| -
|
| -} // namespace
|
| -
|
| -TEST(ShellIntegrationTest, GetDesktopShortcutTemplate) {
|
| -#if defined(GOOGLE_CHROME_BUILD)
|
| - const char kTemplateFilename[] = "google-chrome.desktop";
|
| -#else // CHROMIUM_BUILD
|
| - const char kTemplateFilename[] = "chromium-browser.desktop";
|
| -#endif
|
| -
|
| - const char kTestData1[] = "a magical testing string";
|
| - const char kTestData2[] = "a different testing string";
|
| -
|
| - MessageLoop message_loop;
|
| - content::TestBrowserThread file_thread(BrowserThread::FILE, &message_loop);
|
| -
|
| - {
|
| - base::ScopedTempDir temp_dir;
|
| - ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
|
| -
|
| - MockEnvironment env;
|
| - env.Set("XDG_DATA_HOME", temp_dir.path().value());
|
| - ASSERT_TRUE(file_util::WriteFile(
|
| - temp_dir.path().AppendASCII(kTemplateFilename),
|
| - kTestData1, strlen(kTestData1)));
|
| - std::string contents;
|
| - ASSERT_TRUE(ShellIntegrationLinux::GetDesktopShortcutTemplate(&env,
|
| - &contents));
|
| - EXPECT_EQ(kTestData1, contents);
|
| - }
|
| -
|
| - {
|
| - base::ScopedTempDir temp_dir;
|
| - ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
|
| -
|
| - MockEnvironment env;
|
| - env.Set("XDG_DATA_DIRS", temp_dir.path().value());
|
| - ASSERT_TRUE(file_util::CreateDirectory(
|
| - temp_dir.path().AppendASCII("applications")));
|
| - ASSERT_TRUE(file_util::WriteFile(
|
| - temp_dir.path().AppendASCII("applications")
|
| - .AppendASCII(kTemplateFilename),
|
| - kTestData2, strlen(kTestData2)));
|
| - std::string contents;
|
| - ASSERT_TRUE(ShellIntegrationLinux::GetDesktopShortcutTemplate(&env,
|
| - &contents));
|
| - EXPECT_EQ(kTestData2, contents);
|
| - }
|
| -
|
| - {
|
| - base::ScopedTempDir temp_dir;
|
| - ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
|
| -
|
| - MockEnvironment env;
|
| - env.Set("XDG_DATA_DIRS", temp_dir.path().value() + ":" +
|
| - temp_dir.path().AppendASCII("applications").value());
|
| - ASSERT_TRUE(file_util::CreateDirectory(
|
| - temp_dir.path().AppendASCII("applications")));
|
| - ASSERT_TRUE(file_util::WriteFile(
|
| - temp_dir.path().AppendASCII(kTemplateFilename),
|
| - kTestData1, strlen(kTestData1)));
|
| - ASSERT_TRUE(file_util::WriteFile(
|
| - temp_dir.path().AppendASCII("applications")
|
| - .AppendASCII(kTemplateFilename),
|
| - kTestData2, strlen(kTestData2)));
|
| - std::string contents;
|
| - ASSERT_TRUE(ShellIntegrationLinux::GetDesktopShortcutTemplate(&env,
|
| - &contents));
|
| - EXPECT_EQ(kTestData1, contents);
|
| - }
|
| -}
|
| -
|
| -TEST(ShellIntegrationTest, GetWebShortcutFilename) {
|
| - const struct {
|
| - const base::FilePath::CharType* path;
|
| - const char* url;
|
| - } test_cases[] = {
|
| - { FPL("http___foo_.desktop"), "http://foo" },
|
| - { FPL("http___foo_bar_.desktop"), "http://foo/bar/" },
|
| - { FPL("http___foo_bar_a=b&c=d.desktop"), "http://foo/bar?a=b&c=d" },
|
| -
|
| - // Now we're starting to be more evil...
|
| - { FPL("http___foo_.desktop"), "http://foo/bar/baz/../../../../../" },
|
| - { FPL("http___foo_.desktop"), "http://foo/bar/././../baz/././../" },
|
| - { FPL("http___.._.desktop"), "http://../../../../" },
|
| - };
|
| - for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_cases); i++) {
|
| - EXPECT_EQ(std::string(chrome::kBrowserProcessExecutableName) + "-" +
|
| - test_cases[i].path,
|
| - ShellIntegrationLinux::GetWebShortcutFilename(
|
| - GURL(test_cases[i].url)).value()) <<
|
| - " while testing " << test_cases[i].url;
|
| - }
|
| -}
|
| -
|
| -TEST(ShellIntegrationTest, GetDesktopFileContents) {
|
| - const struct {
|
| - const char* url;
|
| - const char* title;
|
| - const char* icon_name;
|
| - const char* template_contents;
|
| - const char* expected_output;
|
| - } test_cases[] = {
|
| - // Dumb case.
|
| - { "ignored", "ignored", "ignored", "", "#!/usr/bin/env xdg-open\n" },
|
| -
|
| - // Real-world case.
|
| - { "http://gmail.com",
|
| - "GMail",
|
| - "chrome-http__gmail.com",
|
| -
|
| - "[Desktop Entry]\n"
|
| - "Version=1.0\n"
|
| - "Encoding=UTF-8\n"
|
| - "Name=Google Chrome\n"
|
| - "GenericName=Web Browser\n"
|
| - "Comment=The web browser from Google\n"
|
| - "Exec=/opt/google/chrome/google-chrome %U\n"
|
| - "Terminal=false\n"
|
| - "Icon=/opt/google/chrome/product_logo_48.png\n"
|
| - "Type=Application\n"
|
| - "Categories=Application;Network;WebBrowser;\n"
|
| - "MimeType=text/html;text/xml;application/xhtml_xml;\n"
|
| - "X-Ayatana-Desktop-Shortcuts=NewWindow;\n"
|
| - "\n"
|
| - "[NewWindow Shortcut Group]\n"
|
| - "Name=Open New Window\n"
|
| - "Exec=/opt/google/chrome/google-chrome\n"
|
| - "TargetEnvironment=Unity\n",
|
| -
|
| - "#!/usr/bin/env xdg-open\n"
|
| - "[Desktop Entry]\n"
|
| - "Version=1.0\n"
|
| - "Encoding=UTF-8\n"
|
| - "Name=GMail\n"
|
| - "Exec=/opt/google/chrome/google-chrome --app=http://gmail.com/\n"
|
| - "Terminal=false\n"
|
| - "Icon=chrome-http__gmail.com\n"
|
| - "Type=Application\n"
|
| - "Categories=Application;Network;WebBrowser;\n"
|
| -#if !defined(USE_AURA)
|
| - // Aura Chrome does not (yet) set WMClass, so we only expect
|
| - // StartupWMClass on non-Aura builds.
|
| - "StartupWMClass=gmail.com\n"
|
| -#endif
|
| - },
|
| -
|
| - // Make sure we don't insert duplicate shebangs.
|
| - { "http://gmail.com",
|
| - "GMail",
|
| - "chrome-http__gmail.com",
|
| -
|
| - "#!/some/shebang\n"
|
| - "[Desktop Entry]\n"
|
| - "Name=Google Chrome\n"
|
| - "Exec=/opt/google/chrome/google-chrome %U\n",
|
| -
|
| - "#!/usr/bin/env xdg-open\n"
|
| - "[Desktop Entry]\n"
|
| - "Name=GMail\n"
|
| - "Exec=/opt/google/chrome/google-chrome --app=http://gmail.com/\n"
|
| - "Icon=chrome-http__gmail.com\n"
|
| -#if !defined(USE_AURA)
|
| - // Aura Chrome does not (yet) set WMClass, so we only expect
|
| - // StartupWMClass on non-Aura builds.
|
| - "StartupWMClass=gmail.com\n"
|
| -#endif
|
| - },
|
| -
|
| - // Make sure i18n-ed names and other fields are removed.
|
| - { "http://gmail.com",
|
| - "GMail",
|
| - "chrome-http__gmail.com",
|
| -
|
| - "[Desktop Entry]\n"
|
| - "Name=Google Chrome\n"
|
| - "Name[en_AU]=Google Chrome\n"
|
| - "Name[pl]=Google Chrome\n"
|
| - "GenericName=Web Browser\n"
|
| - "GenericName[en_AU]=Web Browser\n"
|
| - "GenericName[pl]=Navegador Web\n"
|
| - "Exec=/opt/google/chrome/google-chrome %U\n"
|
| - "Comment[en_AU]=Some comment.\n"
|
| - "Comment[pl]=Jakis komentarz.\n",
|
| -
|
| - "#!/usr/bin/env xdg-open\n"
|
| - "[Desktop Entry]\n"
|
| - "Name=GMail\n"
|
| - "Exec=/opt/google/chrome/google-chrome --app=http://gmail.com/\n"
|
| - "Icon=chrome-http__gmail.com\n"
|
| -#if !defined(USE_AURA)
|
| - // Aura Chrome does not (yet) set WMClass, so we only expect
|
| - // StartupWMClass on non-Aura builds.
|
| - "StartupWMClass=gmail.com\n"
|
| -#endif
|
| - },
|
| -
|
| - // Make sure that empty icons are replaced by the chrome icon.
|
| - { "http://gmail.com",
|
| - "GMail",
|
| - "",
|
| -
|
| - "[Desktop Entry]\n"
|
| - "Name=Google Chrome\n"
|
| - "Exec=/opt/google/chrome/google-chrome %U\n"
|
| - "Comment[pl]=Jakis komentarz.\n"
|
| - "Icon=/opt/google/chrome/product_logo_48.png\n",
|
| -
|
| - "#!/usr/bin/env xdg-open\n"
|
| - "[Desktop Entry]\n"
|
| - "Name=GMail\n"
|
| - "Exec=/opt/google/chrome/google-chrome --app=http://gmail.com/\n"
|
| - "Icon=/opt/google/chrome/product_logo_48.png\n"
|
| -#if !defined(USE_AURA)
|
| - // Aura Chrome does not (yet) set WMClass, so we only expect
|
| - // StartupWMClass on non-Aura builds.
|
| - "StartupWMClass=gmail.com\n"
|
| -#endif
|
| - },
|
| -
|
| - // Now we're starting to be more evil...
|
| - { "http://evil.com/evil --join-the-b0tnet",
|
| - "Ownz0red\nExec=rm -rf /",
|
| - "chrome-http__evil.com_evil",
|
| -
|
| - "[Desktop Entry]\n"
|
| - "Name=Google Chrome\n"
|
| - "Exec=/opt/google/chrome/google-chrome %U\n",
|
| -
|
| - "#!/usr/bin/env xdg-open\n"
|
| - "[Desktop Entry]\n"
|
| - "Name=http://evil.com/evil%20--join-the-b0tnet\n"
|
| - "Exec=/opt/google/chrome/google-chrome "
|
| - "--app=http://evil.com/evil%20--join-the-b0tnet\n"
|
| - "Icon=chrome-http__evil.com_evil\n"
|
| -#if !defined(USE_AURA)
|
| - // Aura Chrome does not (yet) set WMClass, so we only expect
|
| - // StartupWMClass on non-Aura builds.
|
| - "StartupWMClass=evil.com__evil%20--join-the-b0tnet\n"
|
| -#endif
|
| - },
|
| - { "http://evil.com/evil; rm -rf /; \"; rm -rf $HOME >ownz0red",
|
| - "Innocent Title",
|
| - "chrome-http__evil.com_evil",
|
| -
|
| - "[Desktop Entry]\n"
|
| - "Name=Google Chrome\n"
|
| - "Exec=/opt/google/chrome/google-chrome %U\n",
|
| -
|
| - "#!/usr/bin/env xdg-open\n"
|
| - "[Desktop Entry]\n"
|
| - "Name=Innocent Title\n"
|
| - "Exec=/opt/google/chrome/google-chrome "
|
| - "\"--app=http://evil.com/evil;%20rm%20-rf%20/;%20%22;%20rm%20"
|
| - // Note: $ is escaped as \$ within an arg to Exec, and then
|
| - // the \ is escaped as \\ as all strings in a Desktop file should
|
| - // be; finally, \\ becomes \\\\ when represented in a C++ string!
|
| - "-rf%20\\\\$HOME%20%3Eownz0red\"\n"
|
| - "Icon=chrome-http__evil.com_evil\n"
|
| -#if !defined(USE_AURA)
|
| - // Aura Chrome does not (yet) set WMClass, so we only expect
|
| - // StartupWMClass on non-Aura builds.
|
| - "StartupWMClass=evil.com__evil;%20rm%20-rf%20_;%20%22;%20"
|
| - "rm%20-rf%20$HOME%20%3Eownz0red\n"
|
| -#endif
|
| - },
|
| - { "http://evil.com/evil | cat `echo ownz0red` >/dev/null",
|
| - "Innocent Title",
|
| - "chrome-http__evil.com_evil",
|
| -
|
| - "[Desktop Entry]\n"
|
| - "Name=Google Chrome\n"
|
| - "Exec=/opt/google/chrome/google-chrome %U\n",
|
| -
|
| - "#!/usr/bin/env xdg-open\n"
|
| - "[Desktop Entry]\n"
|
| - "Name=Innocent Title\n"
|
| - "Exec=/opt/google/chrome/google-chrome "
|
| - "--app=http://evil.com/evil%20%7C%20cat%20%60echo%20ownz0red"
|
| - "%60%20%3E/dev/null\n"
|
| - "Icon=chrome-http__evil.com_evil\n"
|
| -#if !defined(USE_AURA)
|
| - // Aura Chrome does not (yet) set WMClass, so we only expect
|
| - // StartupWMClass on non-Aura builds.
|
| - "StartupWMClass=evil.com__evil%20%7C%20cat%20%60echo%20ownz0red"
|
| - "%60%20%3E_dev_null\n"
|
| -#endif
|
| - },
|
| - };
|
| -
|
| - // Set the language to en_AU. This causes glib to copy the en_AU localized
|
| - // strings into the shortcut file. (We want to test that they are removed.)
|
| - ScopedEnvironment env;
|
| - env.Set("LC_ALL", "en_AU.UTF-8");
|
| - env.Set("LANGUAGE", "en_AU.UTF-8");
|
| -
|
| - for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_cases); i++) {
|
| - SCOPED_TRACE(i);
|
| - EXPECT_EQ(
|
| - test_cases[i].expected_output,
|
| - ShellIntegrationLinux::GetDesktopFileContents(
|
| - test_cases[i].template_contents,
|
| - web_app::GenerateApplicationNameFromURL(GURL(test_cases[i].url)),
|
| - GURL(test_cases[i].url),
|
| - "",
|
| - base::FilePath(),
|
| - ASCIIToUTF16(test_cases[i].title),
|
| - test_cases[i].icon_name,
|
| - base::FilePath()));
|
| - }
|
| -}
|
| -#endif
|
|
|