Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3852)

Unified Diff: chrome/browser/shell_integration_unittest.cc

Issue 12321107: Move shell integration code from chrome/browser to apps (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698