Index: chrome/app/app_mode_loader_mac.mm |
diff --git a/chrome/app/app_mode_loader_mac.mm b/chrome/app/app_mode_loader_mac.mm |
index 402aea80391101a2660b19e36bedbf6aafcb30c8..7a489ebea0ca0b02663cf2e75a989be7a6b9f357 100644 |
--- a/chrome/app/app_mode_loader_mac.mm |
+++ b/chrome/app/app_mode_loader_mac.mm |
@@ -20,7 +20,9 @@ |
#include "base/mac/foundation_util.h" |
#include "base/mac/launch_services_util.h" |
#include "base/mac/scoped_nsautorelease_pool.h" |
+#include "base/process/launch.h" |
#include "base/strings/sys_string_conversions.h" |
+#include "chrome/common/chrome_switches.h" |
#import "chrome/common/mac/app_mode_chrome_locator.h" |
#include "chrome/common/mac/app_mode_common.h" |
@@ -67,11 +69,15 @@ int LoadFrameworkAndStart(app_mode::ChromeAppModeInfo* info) { |
} |
// ** 2: Read information from the Chrome bundle. |
+ base::FilePath executable_path; |
base::string16 raw_version_str; |
base::FilePath version_path; |
base::FilePath framework_shlib_path; |
- if (!app_mode::GetChromeBundleInfo(cr_bundle_path, &raw_version_str, |
- &version_path, &framework_shlib_path)) { |
+ if (!app_mode::GetChromeBundleInfo(cr_bundle_path, |
+ &executable_path, |
+ &raw_version_str, |
+ &version_path, |
+ &framework_shlib_path)) { |
LOG(FATAL) << "Couldn't ready Chrome bundle info"; |
} |
base::FilePath app_mode_bundle_path = |
@@ -115,28 +121,53 @@ int LoadFrameworkAndStart(app_mode::ChromeAppModeInfo* info) { |
LOG(ERROR) << "Couldn't load framework: " << dlerror(); |
} |
- if (ChromeAppModeStart) { |
+ if (ChromeAppModeStart) |
return ChromeAppModeStart(info); |
- } else { |
- LOG(ERROR) << "Loading Chrome failed, launching with command line."; |
- // Launch Chrome instead and have it update this app_mode_loader bundle. |
- CommandLine command_line(CommandLine::NO_PROGRAM); |
- command_line.AppendSwitchPath(app_mode::kAppShimError, |
- app_mode_bundle_path); |
- if (!base::mac::OpenApplicationWithPath( |
- cr_bundle_path, command_line, kLSLaunchDefaults, NULL)) { |
- LOG(ERROR) << "Could not launch Chrome from: " << cr_bundle_path.value(); |
- return 1; |
- } |
- return 0; |
+ LOG(ERROR) << "Loading Chrome failed, launching Chrome with command line"; |
+ CommandLine command_line(executable_path); |
+ // The user_data_dir from the plist is actually the app data dir. |
+ command_line.AppendSwitchPath( |
+ switches::kUserDataDir, |
+ info->user_data_dir.DirName().DirName().DirName()); |
+ if (CommandLine::ForCurrentProcess()->HasSwitch( |
+ app_mode::kLaunchedByChromeProcessId) || |
+ info->app_mode_id == app_mode::kAppListModeId) { |
+ // Pass --app-shim-error to have Chrome rebuild this shim. |
+ // If Chrome has rebuilt this shim once already, then rebuilding doesn't fix |
+ // the problem, so don't try again. |
+ if (!CommandLine::ForCurrentProcess()->HasSwitch( |
+ app_mode::kLaunchedAfterRebuild)) { |
+ command_line.AppendSwitchPath(app_mode::kAppShimError, |
+ app_mode_bundle_path); |
+ } |
+ } else { |
+ // If the shim was launched directly (instead of by Chrome), first ask |
+ // Chrome to launch the app. Chrome will launch the shim again, the same |
+ // error will occur and be handled above. This approach allows the app to be |
+ // started without blocking on fixing the shim and guarantees that the |
+ // profile is loaded when Chrome receives --app-shim-error. |
+ command_line.AppendSwitchPath(switches::kProfileDirectory, |
+ info->profile_dir); |
+ command_line.AppendSwitchASCII(switches::kAppId, info->app_mode_id); |
+ } |
+ // Launch the executable directly since base::mac::OpenApplicationWithPath |
+ // uses LSOpenApplication which doesn't pass command line arguments if the |
+ // application is already running. |
+ if (!base::LaunchProcess(command_line, base::LaunchOptions(), NULL)) { |
+ LOG(ERROR) << "Could not launch Chrome: " |
+ << command_line.GetCommandLineString(); |
+ return 1; |
} |
+ |
+ return 0; |
} |
} // namespace |
__attribute__((visibility("default"))) |
int main(int argc, char** argv) { |
+ CommandLine::Init(argc, argv); |
app_mode::ChromeAppModeInfo info; |
// Hard coded info parameters. |