| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/shell_integration.h" | 5 #include "chrome/browser/shell_integration.h" |
| 6 | 6 |
| 7 #include <map> | 7 #include <map> |
| 8 | 8 |
| 9 #include "base/file_path.h" | 9 #include "base/file_path.h" |
| 10 #include "base/file_util.h" | 10 #include "base/file_util.h" |
| 11 #include "base/memory/scoped_temp_dir.h" | 11 #include "base/memory/scoped_temp_dir.h" |
| 12 #include "base/message_loop.h" | 12 #include "base/message_loop.h" |
| 13 #include "base/stl_util-inl.h" | 13 #include "base/stl_util-inl.h" |
| 14 #include "base/string_util.h" | 14 #include "base/string_util.h" |
| 15 #include "base/utf_string_conversions.h" | 15 #include "base/utf_string_conversions.h" |
| 16 #include "chrome/browser/web_applications/web_app.h" |
| 16 #include "chrome/common/chrome_constants.h" | 17 #include "chrome/common/chrome_constants.h" |
| 17 #include "chrome/common/chrome_paths_internal.h" | 18 #include "chrome/common/chrome_paths_internal.h" |
| 18 #include "content/browser/browser_thread.h" | 19 #include "content/browser/browser_thread.h" |
| 19 #include "googleurl/src/gurl.h" | 20 #include "googleurl/src/gurl.h" |
| 20 #include "testing/gtest/include/gtest/gtest.h" | 21 #include "testing/gtest/include/gtest/gtest.h" |
| 21 | 22 |
| 22 #if defined(OS_WIN) | 23 #if defined(OS_WIN) |
| 23 #include "chrome/installer/util/browser_distribution.h" | 24 #include "chrome/installer/util/browser_distribution.h" |
| 24 #elif defined(OS_LINUX) | 25 #elif defined(OS_LINUX) |
| 25 #include "base/environment.h" | 26 #include "base/environment.h" |
| (...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 189 "#!/usr/bin/env xdg-open\n" | 190 "#!/usr/bin/env xdg-open\n" |
| 190 "[Desktop Entry]\n" | 191 "[Desktop Entry]\n" |
| 191 "Version=1.0\n" | 192 "Version=1.0\n" |
| 192 "Encoding=UTF-8\n" | 193 "Encoding=UTF-8\n" |
| 193 "Name=GMail\n" | 194 "Name=GMail\n" |
| 194 "Exec=/opt/google/chrome/google-chrome --app=http://gmail.com/\n" | 195 "Exec=/opt/google/chrome/google-chrome --app=http://gmail.com/\n" |
| 195 "Terminal=false\n" | 196 "Terminal=false\n" |
| 196 "Icon=chrome-http__gmail.com\n" | 197 "Icon=chrome-http__gmail.com\n" |
| 197 "Type=Application\n" | 198 "Type=Application\n" |
| 198 "Categories=Application;Network;WebBrowser;\n" | 199 "Categories=Application;Network;WebBrowser;\n" |
| 200 "StartupWMClass=gmail.com\n" |
| 199 }, | 201 }, |
| 200 | 202 |
| 201 // Make sure we don't insert duplicate shebangs. | 203 // Make sure we don't insert duplicate shebangs. |
| 202 { "http://gmail.com", | 204 { "http://gmail.com", |
| 203 "GMail", | 205 "GMail", |
| 204 "chrome-http__gmail.com", | 206 "chrome-http__gmail.com", |
| 205 | 207 |
| 206 "#!/some/shebang\n" | 208 "#!/some/shebang\n" |
| 207 "Name=Google Chrome\n" | 209 "Name=Google Chrome\n" |
| 208 "Exec=/opt/google/chrome/google-chrome %U\n", | 210 "Exec=/opt/google/chrome/google-chrome %U\n", |
| 209 | 211 |
| 210 "#!/usr/bin/env xdg-open\n" | 212 "#!/usr/bin/env xdg-open\n" |
| 211 "Name=GMail\n" | 213 "Name=GMail\n" |
| 212 "Exec=/opt/google/chrome/google-chrome --app=http://gmail.com/\n" | 214 "Exec=/opt/google/chrome/google-chrome --app=http://gmail.com/\n" |
| 215 "StartupWMClass=gmail.com\n" |
| 213 }, | 216 }, |
| 214 | 217 |
| 215 // Make sure i18n-ed comments are removed. | 218 // Make sure i18n-ed comments are removed. |
| 216 { "http://gmail.com", | 219 { "http://gmail.com", |
| 217 "GMail", | 220 "GMail", |
| 218 "chrome-http__gmail.com", | 221 "chrome-http__gmail.com", |
| 219 | 222 |
| 220 "Name=Google Chrome\n" | 223 "Name=Google Chrome\n" |
| 221 "Exec=/opt/google/chrome/google-chrome %U\n" | 224 "Exec=/opt/google/chrome/google-chrome %U\n" |
| 222 "Comment[pl]=Jakis komentarz.\n", | 225 "Comment[pl]=Jakis komentarz.\n", |
| 223 | 226 |
| 224 "#!/usr/bin/env xdg-open\n" | 227 "#!/usr/bin/env xdg-open\n" |
| 225 "Name=GMail\n" | 228 "Name=GMail\n" |
| 226 "Exec=/opt/google/chrome/google-chrome --app=http://gmail.com/\n" | 229 "Exec=/opt/google/chrome/google-chrome --app=http://gmail.com/\n" |
| 230 "StartupWMClass=gmail.com\n" |
| 227 }, | 231 }, |
| 228 | 232 |
| 229 // Make sure that empty icons are replaced by the chrome icon. | 233 // Make sure that empty icons are replaced by the chrome icon. |
| 230 { "http://gmail.com", | 234 { "http://gmail.com", |
| 231 "GMail", | 235 "GMail", |
| 232 "", | 236 "", |
| 233 | 237 |
| 234 "Name=Google Chrome\n" | 238 "Name=Google Chrome\n" |
| 235 "Exec=/opt/google/chrome/google-chrome %U\n" | 239 "Exec=/opt/google/chrome/google-chrome %U\n" |
| 236 "Comment[pl]=Jakis komentarz.\n" | 240 "Comment[pl]=Jakis komentarz.\n" |
| 237 "Icon=/opt/google/chrome/product_logo_48.png\n", | 241 "Icon=/opt/google/chrome/product_logo_48.png\n", |
| 238 | 242 |
| 239 "#!/usr/bin/env xdg-open\n" | 243 "#!/usr/bin/env xdg-open\n" |
| 240 "Name=GMail\n" | 244 "Name=GMail\n" |
| 241 "Exec=/opt/google/chrome/google-chrome --app=http://gmail.com/\n" | 245 "Exec=/opt/google/chrome/google-chrome --app=http://gmail.com/\n" |
| 242 "Icon=/opt/google/chrome/product_logo_48.png\n" | 246 "Icon=/opt/google/chrome/product_logo_48.png\n" |
| 247 "StartupWMClass=gmail.com\n" |
| 243 }, | 248 }, |
| 244 | 249 |
| 245 // Now we're starting to be more evil... | 250 // Now we're starting to be more evil... |
| 246 { "http://evil.com/evil --join-the-b0tnet", | 251 { "http://evil.com/evil --join-the-b0tnet", |
| 247 "Ownz0red\nExec=rm -rf /", | 252 "Ownz0red\nExec=rm -rf /", |
| 248 "chrome-http__evil.com_evil", | 253 "chrome-http__evil.com_evil", |
| 249 | 254 |
| 250 "Name=Google Chrome\n" | 255 "Name=Google Chrome\n" |
| 251 "Exec=/opt/google/chrome/google-chrome %U\n", | 256 "Exec=/opt/google/chrome/google-chrome %U\n", |
| 252 | 257 |
| 253 "#!/usr/bin/env xdg-open\n" | 258 "#!/usr/bin/env xdg-open\n" |
| 254 "Name=http://evil.com/evil%20--join-the-b0tnet\n" | 259 "Name=http://evil.com/evil%20--join-the-b0tnet\n" |
| 255 "Exec=/opt/google/chrome/google-chrome " | 260 "Exec=/opt/google/chrome/google-chrome " |
| 256 "--app=http://evil.com/evil%20--join-the-b0tnet\n" | 261 "--app=http://evil.com/evil%20--join-the-b0tnet\n" |
| 262 "StartupWMClass=evil.com__evil%20--join-the-b0tnet\n" |
| 257 }, | 263 }, |
| 258 { "http://evil.com/evil; rm -rf /; \"; rm -rf $HOME >ownz0red", | 264 { "http://evil.com/evil; rm -rf /; \"; rm -rf $HOME >ownz0red", |
| 259 "Innocent Title", | 265 "Innocent Title", |
| 260 "chrome-http__evil.com_evil", | 266 "chrome-http__evil.com_evil", |
| 261 | 267 |
| 262 "Name=Google Chrome\n" | 268 "Name=Google Chrome\n" |
| 263 "Exec=/opt/google/chrome/google-chrome %U\n", | 269 "Exec=/opt/google/chrome/google-chrome %U\n", |
| 264 | 270 |
| 265 "#!/usr/bin/env xdg-open\n" | 271 "#!/usr/bin/env xdg-open\n" |
| 266 "Name=Innocent Title\n" | 272 "Name=Innocent Title\n" |
| 267 "Exec=/opt/google/chrome/google-chrome " | 273 "Exec=/opt/google/chrome/google-chrome " |
| 268 "\"--app=http://evil.com/evil;%20rm%20-rf%20/;%20%22;%20rm%20" | 274 "\"--app=http://evil.com/evil;%20rm%20-rf%20/;%20%22;%20rm%20" |
| 269 // Note: $ is escaped as \$ within an arg to Exec, and then | 275 // Note: $ is escaped as \$ within an arg to Exec, and then |
| 270 // the \ is escaped as \\ as all strings in a Desktop file should | 276 // the \ is escaped as \\ as all strings in a Desktop file should |
| 271 // be; finally, \\ becomes \\\\ when represented in a C++ string! | 277 // be; finally, \\ becomes \\\\ when represented in a C++ string! |
| 272 "-rf%20\\\\$HOME%20%3Eownz0red\"\n" | 278 "-rf%20\\\\$HOME%20%3Eownz0red\"\n" |
| 279 "StartupWMClass=evil.com__evil;%20rm%20-rf%20_;%20%22;%20" |
| 280 "rm%20-rf%20$HOME%20%3Eownz0red\n" |
| 273 }, | 281 }, |
| 274 { "http://evil.com/evil | cat `echo ownz0red` >/dev/null", | 282 { "http://evil.com/evil | cat `echo ownz0red` >/dev/null", |
| 275 "Innocent Title", | 283 "Innocent Title", |
| 276 "chrome-http__evil.com_evil", | 284 "chrome-http__evil.com_evil", |
| 277 | 285 |
| 278 "Name=Google Chrome\n" | 286 "Name=Google Chrome\n" |
| 279 "Exec=/opt/google/chrome/google-chrome %U\n", | 287 "Exec=/opt/google/chrome/google-chrome %U\n", |
| 280 | 288 |
| 281 "#!/usr/bin/env xdg-open\n" | 289 "#!/usr/bin/env xdg-open\n" |
| 282 "Name=Innocent Title\n" | 290 "Name=Innocent Title\n" |
| 283 "Exec=/opt/google/chrome/google-chrome " | 291 "Exec=/opt/google/chrome/google-chrome " |
| 284 "--app=http://evil.com/evil%20%7C%20cat%20%60echo%20ownz0red" | 292 "--app=http://evil.com/evil%20%7C%20cat%20%60echo%20ownz0red" |
| 285 "%60%20%3E/dev/null\n" | 293 "%60%20%3E/dev/null\n" |
| 294 "StartupWMClass=evil.com__evil%20%7C%20cat%20%60echo%20ownz0red" |
| 295 "%60%20%3E_dev_null\n" |
| 286 }, | 296 }, |
| 287 }; | 297 }; |
| 288 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_cases); i++) { | 298 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_cases); i++) { |
| 289 SCOPED_TRACE(i); | 299 SCOPED_TRACE(i); |
| 290 EXPECT_EQ(test_cases[i].expected_output, | 300 EXPECT_EQ( |
| 291 ShellIntegration::GetDesktopFileContents( | 301 test_cases[i].expected_output, |
| 292 test_cases[i].template_contents, | 302 ShellIntegration::GetDesktopFileContents( |
| 293 GURL(test_cases[i].url), | 303 test_cases[i].template_contents, |
| 294 "", | 304 web_app::GenerateApplicationNameFromURL(GURL(test_cases[i].url)), |
| 295 ASCIIToUTF16(test_cases[i].title), | 305 GURL(test_cases[i].url), |
| 296 test_cases[i].icon_name)); | 306 "", |
| 307 ASCIIToUTF16(test_cases[i].title), |
| 308 test_cases[i].icon_name)); |
| 297 } | 309 } |
| 298 } | 310 } |
| 299 #elif defined(OS_WIN) | 311 #elif defined(OS_WIN) |
| 300 TEST(ShellIntegrationTest, GetChromiumAppIdTest) { | 312 TEST(ShellIntegrationTest, GetChromiumAppIdTest) { |
| 301 // Empty profile path should get chrome::kBrowserAppID | 313 // Empty profile path should get chrome::kBrowserAppID |
| 302 FilePath empty_path; | 314 FilePath empty_path; |
| 303 EXPECT_EQ(BrowserDistribution::GetDistribution()->GetBrowserAppId(), | 315 EXPECT_EQ(BrowserDistribution::GetDistribution()->GetBrowserAppId(), |
| 304 ShellIntegration::GetChromiumAppId(empty_path)); | 316 ShellIntegration::GetChromiumAppId(empty_path)); |
| 305 | 317 |
| 306 // Default profile path should get chrome::kBrowserAppID | 318 // Default profile path should get chrome::kBrowserAppID |
| 307 FilePath default_user_data_dir; | 319 FilePath default_user_data_dir; |
| 308 chrome::GetDefaultUserDataDirectory(&default_user_data_dir); | 320 chrome::GetDefaultUserDataDirectory(&default_user_data_dir); |
| 309 FilePath default_profile_path = | 321 FilePath default_profile_path = |
| 310 default_user_data_dir.AppendASCII(chrome::kNotSignedInProfile); | 322 default_user_data_dir.AppendASCII(chrome::kNotSignedInProfile); |
| 311 EXPECT_EQ(BrowserDistribution::GetDistribution()->GetBrowserAppId(), | 323 EXPECT_EQ(BrowserDistribution::GetDistribution()->GetBrowserAppId(), |
| 312 ShellIntegration::GetChromiumAppId(default_profile_path)); | 324 ShellIntegration::GetChromiumAppId(default_profile_path)); |
| 313 | 325 |
| 314 // Non-default profile path should get chrome::kBrowserAppID joined with | 326 // Non-default profile path should get chrome::kBrowserAppID joined with |
| 315 // profile info. | 327 // profile info. |
| 316 FilePath profile_path(FILE_PATH_LITERAL("root")); | 328 FilePath profile_path(FILE_PATH_LITERAL("root")); |
| 317 profile_path = profile_path.Append(FILE_PATH_LITERAL("udd")); | 329 profile_path = profile_path.Append(FILE_PATH_LITERAL("udd")); |
| 318 profile_path = profile_path.Append(FILE_PATH_LITERAL("User Data - Test")); | 330 profile_path = profile_path.Append(FILE_PATH_LITERAL("User Data - Test")); |
| 319 EXPECT_EQ(BrowserDistribution::GetDistribution()->GetBrowserAppId() + | 331 EXPECT_EQ(BrowserDistribution::GetDistribution()->GetBrowserAppId() + |
| 320 L".udd.UserDataTest", | 332 L".udd.UserDataTest", |
| 321 ShellIntegration::GetChromiumAppId(profile_path)); | 333 ShellIntegration::GetChromiumAppId(profile_path)); |
| 322 } | 334 } |
| 323 #endif | 335 #endif |
| OLD | NEW |