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