1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright (c) 2009 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/platform_util.h"
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <gtk/gtk.h>
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/file_util.h"
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/process_util.h"
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/utf_string_conversions.h"
12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/process_watcher.h"
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "googleurl/src/gurl.h"
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace {
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
174a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochvoid XDGUtil(const std::string& util, const std::string& arg) {
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::vector<std::string> argv;
194a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  argv.push_back(util);
204a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  argv.push_back(arg);
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  base::environment_vector env;
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // xdg-open can fall back on mailcap which eventually might plumb through
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // to a command that needs a terminal.  Set the environment variable telling
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // it that we definitely don't have a terminal available and that it should
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // bring up a new terminal if necessary.  See "man mailcap".
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  env.push_back(std::make_pair("MM_NOTTTY", "1"));
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // In Google Chrome, we do not let GNOME's bug-buddy intercept our crashes.
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // However, we do not want this environment variable to propagate to external
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // applications. See http://crbug.com/24120
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  char* disable_gnome_bug_buddy = getenv("GNOME_DISABLE_CRASH_DIALOG");
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (disable_gnome_bug_buddy &&
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      disable_gnome_bug_buddy == std::string("SET_BY_GOOGLE_CHROME")) {
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    env.push_back(std::make_pair("GNOME_DISABLE_CRASH_DIALOG", ""));
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  base::file_handle_mapping_vector no_files;
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  base::ProcessHandle handle;
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (base::LaunchApp(argv, env, no_files, false, &handle))
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ProcessWatcher::EnsureProcessGetsReaped(handle);
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
444a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochvoid XDGOpen(const std::string& path) {
454a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  XDGUtil("xdg-open", path);
464a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch}
474a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
484a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochvoid XDGEmail(const std::string& email) {
494a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  XDGUtil("xdg-email", email);
504a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch}
514a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace platform_util {
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// TODO(estade): It would be nice to be able to select the file in the file
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// manager, but that probably requires extending xdg-open. For now just
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// show the folder.
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ShowItemInFolder(const FilePath& full_path) {
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath dir = full_path.DirName();
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!file_util::DirectoryExists(dir))
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  XDGOpen(dir.value());
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid OpenItem(const FilePath& full_path) {
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  XDGOpen(full_path.value());
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid OpenExternal(const GURL& url) {
724a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  if (url.SchemeIs("mailto"))
734a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    XDGEmail(url.spec());
744a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  else
754a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    XDGOpen(url.spec());
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace platform_util
79