|  | // Copyright 2013 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. | 
|  |  | 
|  | #import "base/mac/launch_services_util.h" | 
|  |  | 
|  | #include "base/logging.h" | 
|  | #include "base/strings/sys_string_conversions.h" | 
|  |  | 
|  | namespace base { | 
|  | namespace mac { | 
|  |  | 
|  | Process OpenApplicationWithPath(const base::FilePath& bundle_path, | 
|  | const CommandLine& command_line, | 
|  | NSWorkspaceLaunchOptions launch_options) { | 
|  | NSString* bundle_url_spec = base::SysUTF8ToNSString(bundle_path.value()); | 
|  | NSURL* bundle_url = [NSURL fileURLWithPath:bundle_url_spec isDirectory:YES]; | 
|  | DCHECK(bundle_url); | 
|  | if (!bundle_url) { | 
|  | return Process(); | 
|  | } | 
|  |  | 
|  | // NSWorkspace automatically adds the binary path as the first argument and | 
|  | // it should not be included into the list. | 
|  | std::vector<std::string> argv = command_line.argv(); | 
|  | int argc = argv.size(); | 
|  | NSMutableArray* launch_args = [NSMutableArray arrayWithCapacity:argc - 1]; | 
|  | for (int i = 1; i < argc; ++i) { | 
|  | [launch_args addObject:base::SysUTF8ToNSString(argv[i])]; | 
|  | } | 
|  |  | 
|  | NSDictionary* configuration = @{ | 
|  | NSWorkspaceLaunchConfigurationArguments : launch_args, | 
|  | }; | 
|  | NSError* launch_error = nil; | 
|  | // TODO(jeremya): this opens a new browser window if Chrome is already | 
|  | // running without any windows open. | 
|  | NSRunningApplication* app = | 
|  | [[NSWorkspace sharedWorkspace] launchApplicationAtURL:bundle_url | 
|  | options:launch_options | 
|  | configuration:configuration | 
|  | error:&launch_error]; | 
|  | if (launch_error) { | 
|  | LOG(ERROR) << base::SysNSStringToUTF8([launch_error localizedDescription]); | 
|  | return Process(); | 
|  | } | 
|  | DCHECK(app); | 
|  | return Process([app processIdentifier]); | 
|  | } | 
|  |  | 
|  | }  // namespace mac | 
|  | }  // namespace base |