| // 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 |