Chromium Code Reviews| 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 <fcntl.h> | 7 #include <fcntl.h> |
| 8 #include <glib.h> | 8 #include <glib.h> |
| 9 #include <stdlib.h> | 9 #include <stdlib.h> |
| 10 #include <sys/stat.h> | 10 #include <sys/stat.h> |
| (...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 217 "MimeType", | 217 "MimeType", |
| 218 "X-Ayatana-Desktop-Shortcuts", | 218 "X-Ayatana-Desktop-Shortcuts", |
| 219 "StartupWMClass", | 219 "StartupWMClass", |
| 220 NULL | 220 NULL |
| 221 }; | 221 }; |
| 222 | 222 |
| 223 const char* kDesktopEntry = "Desktop Entry"; | 223 const char* kDesktopEntry = "Desktop Entry"; |
| 224 | 224 |
| 225 const char* kXdgOpenShebang = "#!/usr/bin/env xdg-open"; | 225 const char* kXdgOpenShebang = "#!/usr/bin/env xdg-open"; |
| 226 | 226 |
| 227 const char* kXdgSettings = "xdg-settings"; | |
| 228 const char* kXdgSettingsDefaultBrowser = "default-web-browser"; | |
| 229 const char* kXdgSettingsDefaultSchemeHandler = "default-url-scheme-handler"; | |
|
Evan Martin
2011/09/20 14:45:51
Minor nit: can you make these const char[] instead
benwells
2011/09/20 23:09:03
Done.
| |
| 230 | |
| 227 } // namespace | 231 } // namespace |
| 228 | 232 |
| 229 // static | 233 // static |
| 230 std::string ShellIntegration::GetDesktopName(base::Environment* env) { | 234 std::string ShellIntegration::GetDesktopName(base::Environment* env) { |
| 231 #if defined(GOOGLE_CHROME_BUILD) | 235 #if defined(GOOGLE_CHROME_BUILD) |
| 232 return "google-chrome.desktop"; | 236 return "google-chrome.desktop"; |
| 233 #else // CHROMIUM_BUILD | 237 #else // CHROMIUM_BUILD |
| 234 // Allow $CHROME_DESKTOP to override the built-in value, so that development | 238 // Allow $CHROME_DESKTOP to override the built-in value, so that development |
| 235 // versions can set themselves as the default without interfering with | 239 // versions can set themselves as the default without interfering with |
| 236 // non-official, packaged versions using the built-in value. | 240 // non-official, packaged versions using the built-in value. |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 286 // copy. | 290 // copy. |
| 287 | 291 |
| 288 // If |protocol| is empty this function sets Chrome as the default browser, | 292 // If |protocol| is empty this function sets Chrome as the default browser, |
| 289 // otherwise it sets Chrome as the default handler application for |protocol|. | 293 // otherwise it sets Chrome as the default handler application for |protocol|. |
| 290 bool SetDefaultWebClient(const std::string& protocol) { | 294 bool SetDefaultWebClient(const std::string& protocol) { |
| 291 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); | 295 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); |
| 292 | 296 |
| 293 scoped_ptr<base::Environment> env(base::Environment::Create()); | 297 scoped_ptr<base::Environment> env(base::Environment::Create()); |
| 294 | 298 |
| 295 std::vector<std::string> argv; | 299 std::vector<std::string> argv; |
| 296 argv.push_back("xdg-settings"); | 300 argv.push_back(kXdgSettings); |
| 297 argv.push_back("set"); | 301 argv.push_back("set"); |
| 298 if (protocol.empty()) { | 302 if (protocol.empty()) { |
| 299 argv.push_back("default-web-browser"); | 303 argv.push_back(kXdgSettingsDefaultBrowser); |
| 300 } else { | 304 } else { |
| 301 argv.push_back("default-url-scheme-handler"); | 305 argv.push_back(kXdgSettingsDefaultSchemeHandler); |
| 302 argv.push_back(protocol); | 306 argv.push_back(protocol); |
| 303 } | 307 } |
| 304 argv.push_back(ShellIntegration::GetDesktopName(env.get())); | 308 argv.push_back(ShellIntegration::GetDesktopName(env.get())); |
| 305 | 309 |
| 306 int exit_code; | 310 int exit_code; |
| 307 bool ran_ok = LaunchXdgUtility(argv, &exit_code); | 311 bool ran_ok = LaunchXdgUtility(argv, &exit_code); |
| 308 if (ran_ok && exit_code == EXIT_XDG_SETTINGS_SYNTAX_ERROR) { | 312 if (ran_ok && exit_code == EXIT_XDG_SETTINGS_SYNTAX_ERROR) { |
| 309 if (GetChromeVersionOfScript("xdg-settings", &argv[0])) { | 313 if (GetChromeVersionOfScript(kXdgSettings, &argv[0])) { |
| 310 ran_ok = LaunchXdgUtility(argv, &exit_code); | 314 ran_ok = LaunchXdgUtility(argv, &exit_code); |
| 311 } | 315 } |
| 312 } | 316 } |
| 313 | 317 |
| 314 return ran_ok && exit_code == EXIT_SUCCESS; | 318 return ran_ok && exit_code == EXIT_SUCCESS; |
| 315 } | 319 } |
| 316 | 320 |
| 317 // If |protocol| is empty this function checks if Chrome is the default browser, | 321 // If |protocol| is empty this function checks if Chrome is the default browser, |
| 318 // otherwise it checks if Chrome is the default handler application for | 322 // otherwise it checks if Chrome is the default handler application for |
| 319 // |protocol|. | 323 // |protocol|. |
| 320 ShellIntegration::DefaultWebClientState GetIsDefaultWebClient( | 324 ShellIntegration::DefaultWebClientState GetIsDefaultWebClient( |
| 321 const std::string& protocol) { | 325 const std::string& protocol) { |
| 322 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); | 326 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); |
| 323 | 327 |
| 324 scoped_ptr<base::Environment> env(base::Environment::Create()); | 328 scoped_ptr<base::Environment> env(base::Environment::Create()); |
| 325 | 329 |
| 326 std::vector<std::string> argv; | 330 std::vector<std::string> argv; |
| 327 argv.push_back("xdg-settings"); | 331 argv.push_back(kXdgSettings); |
| 328 argv.push_back("check"); | 332 argv.push_back("check"); |
| 329 if (protocol.empty()) { | 333 if (protocol.empty()) { |
| 330 argv.push_back("default-web-browser"); | 334 argv.push_back(kXdgSettingsDefaultBrowser); |
| 331 } else { | 335 } else { |
| 332 argv.push_back("default-url-scheme-handler"); | 336 argv.push_back(kXdgSettingsDefaultSchemeHandler); |
| 333 argv.push_back(protocol); | 337 argv.push_back(protocol); |
| 334 } | 338 } |
| 335 argv.push_back(ShellIntegration::GetDesktopName(env.get())); | 339 argv.push_back(ShellIntegration::GetDesktopName(env.get())); |
| 336 | 340 |
| 337 std::string reply; | 341 std::string reply; |
| 338 int success_code; | 342 int success_code; |
| 339 bool ran_ok = base::GetAppOutputWithExitCode(CommandLine(argv), &reply, | 343 bool ran_ok = base::GetAppOutputWithExitCode(CommandLine(argv), &reply, |
| 340 &success_code); | 344 &success_code); |
| 341 if (ran_ok && success_code == EXIT_XDG_SETTINGS_SYNTAX_ERROR) { | 345 if (ran_ok && success_code == EXIT_XDG_SETTINGS_SYNTAX_ERROR) { |
| 342 if (GetChromeVersionOfScript("xdg_settings", &argv[0])) { | 346 if (GetChromeVersionOfScript(kXdgSettings, &argv[0])) { |
| 343 ran_ok = base::GetAppOutputWithExitCode(CommandLine(argv), &reply, | 347 ran_ok = base::GetAppOutputWithExitCode(CommandLine(argv), &reply, |
| 344 &success_code); | 348 &success_code); |
| 345 } | 349 } |
| 346 } | 350 } |
| 347 | 351 |
| 348 if (!ran_ok || success_code != EXIT_SUCCESS) { | 352 if (!ran_ok || success_code != EXIT_SUCCESS) { |
| 349 // xdg-settings failed: we can't determine or set the default browser. | 353 // xdg-settings failed: we can't determine or set the default browser. |
| 350 return ShellIntegration::UNKNOWN_DEFAULT_WEB_CLIENT; | 354 return ShellIntegration::UNKNOWN_DEFAULT_WEB_CLIENT; |
| 351 } | 355 } |
| 352 | 356 |
| (...skipping 26 matching lines...) Expand all Loading... | |
| 379 | 383 |
| 380 // static | 384 // static |
| 381 ShellIntegration::DefaultWebClientState | 385 ShellIntegration::DefaultWebClientState |
| 382 ShellIntegration::IsDefaultProtocolClient(const std::string& protocol) { | 386 ShellIntegration::IsDefaultProtocolClient(const std::string& protocol) { |
| 383 return GetIsDefaultWebClient(protocol); | 387 return GetIsDefaultWebClient(protocol); |
| 384 } | 388 } |
| 385 | 389 |
| 386 // static | 390 // static |
| 387 bool ShellIntegration::IsFirefoxDefaultBrowser() { | 391 bool ShellIntegration::IsFirefoxDefaultBrowser() { |
| 388 std::vector<std::string> argv; | 392 std::vector<std::string> argv; |
| 389 argv.push_back("xdg-settings"); | 393 argv.push_back(kXdgSettings); |
| 390 argv.push_back("get"); | 394 argv.push_back("get"); |
| 391 argv.push_back("default-web-browser"); | 395 argv.push_back(kXdgSettingsDefaultBrowser); |
| 392 | 396 |
| 393 std::string browser; | 397 std::string browser; |
| 394 // We don't care about the return value here. | 398 // We don't care about the return value here. |
| 395 base::GetAppOutput(CommandLine(argv), &browser); | 399 base::GetAppOutput(CommandLine(argv), &browser); |
| 396 return browser.find("irefox") != std::string::npos; | 400 return browser.find("irefox") != std::string::npos; |
| 397 } | 401 } |
| 398 | 402 |
| 399 // static | 403 // static |
| 400 bool ShellIntegration::GetDesktopShortcutTemplate( | 404 bool ShellIntegration::GetDesktopShortcutTemplate( |
| 401 base::Environment* env, std::string* output) { | 405 base::Environment* env, std::string* output) { |
| (...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 597 shortcut_info.extension_id, | 601 shortcut_info.extension_id, |
| 598 shortcut_info.title, | 602 shortcut_info.title, |
| 599 icon_name); | 603 icon_name); |
| 600 | 604 |
| 601 if (shortcut_info.create_on_desktop) | 605 if (shortcut_info.create_on_desktop) |
| 602 CreateShortcutOnDesktop(shortcut_filename, contents); | 606 CreateShortcutOnDesktop(shortcut_filename, contents); |
| 603 | 607 |
| 604 if (shortcut_info.create_in_applications_menu) | 608 if (shortcut_info.create_in_applications_menu) |
| 605 CreateShortcutInApplicationsMenu(shortcut_filename, contents); | 609 CreateShortcutInApplicationsMenu(shortcut_filename, contents); |
| 606 } | 610 } |
| OLD | NEW |