| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // On Mac, one can't make shortcuts with command-line arguments. Instead, we | 5 // On Mac, one can't make shortcuts with command-line arguments. Instead, we |
| 6 // produce small app bundles which locate the Chromium framework and load it, | 6 // produce small app bundles which locate the Chromium framework and load it, |
| 7 // passing the appropriate data. This is the entry point into the framework for | 7 // passing the appropriate data. This is the entry point into the framework for |
| 8 // those app bundles. | 8 // those app bundles. |
| 9 | 9 |
| 10 #import <Cocoa/Cocoa.h> | 10 #import <Cocoa/Cocoa.h> |
| 11 #include <vector> | 11 #include <vector> |
| 12 | 12 |
| 13 #include "base/at_exit.h" | 13 #include "base/at_exit.h" |
| 14 #include "base/command_line.h" | 14 #include "base/command_line.h" |
| 15 #include "base/files/file_path.h" | 15 #include "base/files/file_path.h" |
| 16 #include "base/files/file_util.h" | 16 #include "base/files/file_util.h" |
| 17 #include "base/logging.h" | 17 #include "base/logging.h" |
| 18 #include "base/mac/bundle_locations.h" | 18 #include "base/mac/bundle_locations.h" |
| 19 #include "base/mac/foundation_util.h" | 19 #include "base/mac/foundation_util.h" |
| 20 #include "base/mac/launch_services_util.h" | 20 #import "base/mac/launch_services_util.h" |
| 21 #include "base/mac/mac_logging.h" | 21 #include "base/mac/mac_logging.h" |
| 22 #include "base/mac/mac_util.h" | 22 #include "base/mac/mac_util.h" |
| 23 #include "base/mac/scoped_nsautorelease_pool.h" | 23 #include "base/mac/scoped_nsautorelease_pool.h" |
| 24 #include "base/mac/scoped_nsobject.h" | 24 #include "base/mac/scoped_nsobject.h" |
| 25 #include "base/mac/sdk_forward_declarations.h" | 25 #include "base/mac/sdk_forward_declarations.h" |
| 26 #include "base/macros.h" | 26 #include "base/macros.h" |
| 27 #include "base/message_loop/message_loop.h" | 27 #include "base/message_loop/message_loop.h" |
| 28 #include "base/run_loop.h" | 28 #include "base/run_loop.h" |
| 29 #include "base/strings/string_number_conversions.h" | 29 #include "base/strings/string_number_conversions.h" |
| 30 #include "base/strings/sys_string_conversions.h" | 30 #include "base/strings/sys_string_conversions.h" |
| (...skipping 643 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 674 | 674 |
| 675 // If the shim is the app launcher, pass --show-app-list when starting a new | 675 // If the shim is the app launcher, pass --show-app-list when starting a new |
| 676 // Chrome process to inform startup codepaths and load the correct profile. | 676 // Chrome process to inform startup codepaths and load the correct profile. |
| 677 if (info->app_mode_id == app_mode::kAppListModeId) { | 677 if (info->app_mode_id == app_mode::kAppListModeId) { |
| 678 command_line.AppendSwitch(switches::kShowAppList); | 678 command_line.AppendSwitch(switches::kShowAppList); |
| 679 } else { | 679 } else { |
| 680 command_line.AppendSwitchPath(switches::kProfileDirectory, | 680 command_line.AppendSwitchPath(switches::kProfileDirectory, |
| 681 info->profile_dir); | 681 info->profile_dir); |
| 682 } | 682 } |
| 683 | 683 |
| 684 bool success = | 684 base::Process app = base::mac::OpenApplicationWithPath( |
| 685 base::mac::OpenApplicationWithPath(base::mac::OuterBundlePath(), | 685 base::mac::OuterBundlePath(), command_line, NSWorkspaceLaunchDefault); |
| 686 command_line, | 686 |
| 687 kLSLaunchDefaults, | 687 // TODO(crbug.com/652563): Do not use deprecated GetProcessForPID. Change |
| 688 &psn); | 688 // |ReplyEventHandler| to take |pid_t| instead of |ProcessSerialNumber|. |
| 689 if (!success) | 689 if (!app.IsValid() || GetProcessForPID(app.Pid(), &psn) != noErr) |
| 690 return 1; | 690 return 1; |
| 691 | 691 |
| 692 base::Callback<void(bool)> on_ping_chrome_reply = | 692 base::Callback<void(bool)> on_ping_chrome_reply = |
| 693 base::Bind(&AppShimController::OnPingChromeReply, | 693 base::Bind(&AppShimController::OnPingChromeReply, |
| 694 base::Unretained(&controller)); | 694 base::Unretained(&controller)); |
| 695 | 695 |
| 696 // This code abuses the fact that Apple Events sent before the process is | 696 // This code abuses the fact that Apple Events sent before the process is |
| 697 // fully initialized don't receive a reply until its run loop starts. Once | 697 // fully initialized don't receive a reply until its run loop starts. Once |
| 698 // the reply is received, Chrome will have opened its IPC port, guaranteed. | 698 // the reply is received, Chrome will have opened its IPC port, guaranteed. |
| 699 [ReplyEventHandler pingProcess:psn | 699 [ReplyEventHandler pingProcess:psn |
| 700 andCall:on_ping_chrome_reply]; | 700 andCall:on_ping_chrome_reply]; |
| 701 | 701 |
| 702 main_message_loop.task_runner()->PostDelayedTask( | 702 main_message_loop.task_runner()->PostDelayedTask( |
| 703 FROM_HERE, base::Bind(&AppShimController::OnPingChromeTimeout, | 703 FROM_HERE, base::Bind(&AppShimController::OnPingChromeTimeout, |
| 704 base::Unretained(&controller)), | 704 base::Unretained(&controller)), |
| 705 base::TimeDelta::FromSeconds(kPingChromeTimeoutSeconds)); | 705 base::TimeDelta::FromSeconds(kPingChromeTimeoutSeconds)); |
| 706 } else { | 706 } else { |
| 707 // Chrome already running. Proceed to init. This could still fail if Chrome | 707 // Chrome already running. Proceed to init. This could still fail if Chrome |
| 708 // is still starting up or shutting down, but the process will exit quickly, | 708 // is still starting up or shutting down, but the process will exit quickly, |
| 709 // which is preferable to waiting for the Apple Event to timeout after one | 709 // which is preferable to waiting for the Apple Event to timeout after one |
| 710 // minute. | 710 // minute. |
| 711 main_message_loop.task_runner()->PostTask( | 711 main_message_loop.task_runner()->PostTask( |
| 712 FROM_HERE, | 712 FROM_HERE, |
| 713 base::Bind(&AppShimController::Init, base::Unretained(&controller))); | 713 base::Bind(&AppShimController::Init, base::Unretained(&controller))); |
| 714 } | 714 } |
| 715 | 715 |
| 716 base::RunLoop().Run(); | 716 base::RunLoop().Run(); |
| 717 return 0; | 717 return 0; |
| 718 } | 718 } |
| OLD | NEW |