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> |
(...skipping 16 matching lines...) Expand all Loading... |
27 #include "base/message_loop/message_loop.h" | 27 #include "base/message_loop/message_loop.h" |
28 #include "base/strings/string_number_conversions.h" | 28 #include "base/strings/string_number_conversions.h" |
29 #include "base/strings/sys_string_conversions.h" | 29 #include "base/strings/sys_string_conversions.h" |
30 #include "base/threading/thread.h" | 30 #include "base/threading/thread.h" |
31 #include "chrome/common/chrome_constants.h" | 31 #include "chrome/common/chrome_constants.h" |
32 #include "chrome/common/chrome_paths.h" | 32 #include "chrome/common/chrome_paths.h" |
33 #include "chrome/common/chrome_switches.h" | 33 #include "chrome/common/chrome_switches.h" |
34 #include "chrome/common/mac/app_mode_common.h" | 34 #include "chrome/common/mac/app_mode_common.h" |
35 #include "chrome/common/mac/app_shim_messages.h" | 35 #include "chrome/common/mac/app_shim_messages.h" |
36 #include "chrome/grit/generated_resources.h" | 36 #include "chrome/grit/generated_resources.h" |
| 37 #include "ipc/ipc_channel_mojo.h" |
37 #include "ipc/ipc_channel_proxy.h" | 38 #include "ipc/ipc_channel_proxy.h" |
38 #include "ipc/ipc_listener.h" | 39 #include "ipc/ipc_listener.h" |
39 #include "ipc/ipc_message.h" | 40 #include "ipc/ipc_message.h" |
| 41 #include "mojo/edk/embedder/embedder.h" |
| 42 #include "mojo/edk/embedder/named_platform_handle.h" |
| 43 #include "mojo/edk/embedder/named_platform_handle_utils.h" |
| 44 #include "mojo/edk/embedder/scoped_ipc_support.h" |
| 45 #include "mojo/edk/embedder/scoped_platform_handle.h" |
40 #include "ui/base/l10n/l10n_util.h" | 46 #include "ui/base/l10n/l10n_util.h" |
41 #include "ui/base/resource/resource_bundle.h" | 47 #include "ui/base/resource/resource_bundle.h" |
42 | 48 |
43 namespace { | 49 namespace { |
44 | 50 |
45 // Timeout in seconds to wait for a reply for the initial Apple Event. Note that | 51 // Timeout in seconds to wait for a reply for the initial Apple Event. Note that |
46 // kAEDefaultTimeout on Mac is "about one minute" according to Apple's | 52 // kAEDefaultTimeout on Mac is "about one minute" according to Apple's |
47 // documentation, but is no longer supported for asynchronous Apple Events. | 53 // documentation, but is no longer supported for asynchronous Apple Events. |
48 const int kPingChromeTimeoutSeconds = 60; | 54 const int kPingChromeTimeoutSeconds = 60; |
49 | 55 |
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
205 return; | 211 return; |
206 } | 212 } |
207 | 213 |
208 app_mode::VerifySocketPermissions(socket_path); | 214 app_mode::VerifySocketPermissions(socket_path); |
209 | 215 |
210 CreateChannelAndSendLaunchApp(socket_path); | 216 CreateChannelAndSendLaunchApp(socket_path); |
211 } | 217 } |
212 | 218 |
213 void AppShimController::CreateChannelAndSendLaunchApp( | 219 void AppShimController::CreateChannelAndSendLaunchApp( |
214 const base::FilePath& socket_path) { | 220 const base::FilePath& socket_path) { |
215 IPC::ChannelHandle handle(socket_path.value()); | 221 channel_ = IPC::ChannelProxy::Create( |
216 channel_ = IPC::ChannelProxy::Create(handle, IPC::Channel::MODE_NAMED_CLIENT, | 222 IPC::ChannelMojo::CreateClientFactory( |
217 this, g_io_thread->task_runner().get()); | 223 mojo::edk::ConnectToPeerProcess(mojo::edk::CreateClientHandle( |
| 224 mojo::edk::NamedPlatformHandle(socket_path.value()))), |
| 225 g_io_thread->task_runner().get()), |
| 226 this, g_io_thread->task_runner().get()); |
218 | 227 |
219 bool launched_by_chrome = base::CommandLine::ForCurrentProcess()->HasSwitch( | 228 bool launched_by_chrome = base::CommandLine::ForCurrentProcess()->HasSwitch( |
220 app_mode::kLaunchedByChromeProcessId); | 229 app_mode::kLaunchedByChromeProcessId); |
221 apps::AppShimLaunchType launch_type = launched_by_chrome ? | 230 apps::AppShimLaunchType launch_type = launched_by_chrome ? |
222 apps::APP_SHIM_LAUNCH_REGISTER_ONLY : apps::APP_SHIM_LAUNCH_NORMAL; | 231 apps::APP_SHIM_LAUNCH_REGISTER_ONLY : apps::APP_SHIM_LAUNCH_NORMAL; |
223 | 232 |
224 [delegate_ setController:this]; | 233 [delegate_ setController:this]; |
225 | 234 |
226 std::vector<base::FilePath> files; | 235 std::vector<base::FilePath> files; |
227 [delegate_ getFilesToOpenAtStartup:&files]; | 236 [delegate_ getFilesToOpenAtStartup:&files]; |
(...skipping 394 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
622 ui::ResourceBundle::InitSharedInstanceWithLocale( | 631 ui::ResourceBundle::InitSharedInstanceWithLocale( |
623 locale, NULL, ui::ResourceBundle::DO_NOT_LOAD_COMMON_RESOURCES); | 632 locale, NULL, ui::ResourceBundle::DO_NOT_LOAD_COMMON_RESOURCES); |
624 | 633 |
625 // Launch the IO thread. | 634 // Launch the IO thread. |
626 base::Thread::Options io_thread_options; | 635 base::Thread::Options io_thread_options; |
627 io_thread_options.message_loop_type = base::MessageLoop::TYPE_IO; | 636 io_thread_options.message_loop_type = base::MessageLoop::TYPE_IO; |
628 base::Thread *io_thread = new base::Thread("CrAppShimIO"); | 637 base::Thread *io_thread = new base::Thread("CrAppShimIO"); |
629 io_thread->StartWithOptions(io_thread_options); | 638 io_thread->StartWithOptions(io_thread_options); |
630 g_io_thread = io_thread; | 639 g_io_thread = io_thread; |
631 | 640 |
| 641 mojo::edk::Init(); |
| 642 mojo::edk::ScopedIPCSupport ipc_support(io_thread->task_runner()); |
| 643 |
632 // Find already running instances of Chrome. | 644 // Find already running instances of Chrome. |
633 pid_t pid = -1; | 645 pid_t pid = -1; |
634 std::string chrome_process_id = | 646 std::string chrome_process_id = |
635 base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( | 647 base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( |
636 app_mode::kLaunchedByChromeProcessId); | 648 app_mode::kLaunchedByChromeProcessId); |
637 if (!chrome_process_id.empty()) { | 649 if (!chrome_process_id.empty()) { |
638 if (!base::StringToInt(chrome_process_id, &pid)) | 650 if (!base::StringToInt(chrome_process_id, &pid)) |
639 LOG(FATAL) << "Invalid PID: " << chrome_process_id; | 651 LOG(FATAL) << "Invalid PID: " << chrome_process_id; |
640 } else { | 652 } else { |
641 NSString* chrome_bundle_id = [base::mac::OuterBundle() bundleIdentifier]; | 653 NSString* chrome_bundle_id = [base::mac::OuterBundle() bundleIdentifier]; |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
696 // which is preferable to waiting for the Apple Event to timeout after one | 708 // which is preferable to waiting for the Apple Event to timeout after one |
697 // minute. | 709 // minute. |
698 main_message_loop.task_runner()->PostTask( | 710 main_message_loop.task_runner()->PostTask( |
699 FROM_HERE, | 711 FROM_HERE, |
700 base::Bind(&AppShimController::Init, base::Unretained(&controller))); | 712 base::Bind(&AppShimController::Init, base::Unretained(&controller))); |
701 } | 713 } |
702 | 714 |
703 main_message_loop.Run(); | 715 main_message_loop.Run(); |
704 return 0; | 716 return 0; |
705 } | 717 } |
OLD | NEW |