Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(21)

Side by Side Diff: chrome/app/chrome_main_app_mode_mac.mm

Issue 14579006: Start app shim when app launched. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Address comment Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
79 79
80 // Terminates the app shim process. 80 // Terminates the app shim process.
81 void Close(); 81 void Close();
82 82
83 IPC::ChannelProxy* channel_; 83 IPC::ChannelProxy* channel_;
84 scoped_nsobject<AppShimDelegate> nsapp_delegate_; 84 scoped_nsobject<AppShimDelegate> nsapp_delegate_;
85 85
86 DISALLOW_COPY_AND_ASSIGN(AppShimController); 86 DISALLOW_COPY_AND_ASSIGN(AppShimController);
87 }; 87 };
88 88
89 AppShimController::AppShimController() : channel_(NULL) { 89 AppShimController::AppShimController() : channel_(NULL) {}
90 }
91 90
92 void AppShimController::Init() { 91 void AppShimController::Init() {
93 DCHECK(g_io_thread); 92 DCHECK(g_io_thread);
94 NSString* chrome_bundle_path = 93 NSString* chrome_bundle_path =
95 base::SysUTF8ToNSString(g_info->chrome_outer_bundle_path.value()); 94 base::SysUTF8ToNSString(g_info->chrome_outer_bundle_path.value());
96 NSBundle* chrome_bundle = [NSBundle bundleWithPath:chrome_bundle_path]; 95 NSBundle* chrome_bundle = [NSBundle bundleWithPath:chrome_bundle_path];
97 base::FilePath user_data_dir; 96 base::FilePath user_data_dir;
98 if (!chrome::GetUserDataDirectoryForBrowserBundle(chrome_bundle, 97 if (!chrome::GetUserDataDirectoryForBrowserBundle(chrome_bundle,
99 &user_data_dir)) { 98 &user_data_dir)) {
100 Close(); 99 Close();
101 return; 100 return;
102 } 101 }
103 102
104 base::FilePath socket_path = 103 base::FilePath socket_path =
105 user_data_dir.Append(app_mode::kAppShimSocketName); 104 user_data_dir.Append(app_mode::kAppShimSocketName);
106 IPC::ChannelHandle handle(socket_path.value()); 105 IPC::ChannelHandle handle(socket_path.value());
107 channel_ = new IPC::ChannelProxy(handle, IPC::Channel::MODE_NAMED_CLIENT, 106 channel_ = new IPC::ChannelProxy(handle, IPC::Channel::MODE_NAMED_CLIENT,
108 this, g_io_thread->message_loop_proxy()); 107 this, g_io_thread->message_loop_proxy());
109 108
110 channel_->Send(new AppShimHostMsg_LaunchApp( 109 channel_->Send(new AppShimHostMsg_LaunchApp(
111 g_info->profile_dir.value(), g_info->app_mode_id)); 110 g_info->profile_dir, g_info->app_mode_id,
111 CommandLine::ForCurrentProcess()->HasSwitch(app_mode::kNoLaunchApp) ?
112 apps::APP_SHIM_LAUNCH_REGISTER_ONLY : apps::APP_SHIM_LAUNCH_NORMAL));
112 113
113 nsapp_delegate_.reset([[AppShimDelegate alloc] initWithController:this]); 114 nsapp_delegate_.reset([[AppShimDelegate alloc] initWithController:this]);
114 DCHECK(![NSApp delegate]); 115 DCHECK(![NSApp delegate]);
115 [NSApp setDelegate:nsapp_delegate_]; 116 [NSApp setDelegate:nsapp_delegate_];
116 } 117 }
117 118
118 void AppShimController::QuitApp() { 119 void AppShimController::QuitApp() {
119 channel_->Send(new AppShimHostMsg_QuitApp); 120 channel_->Send(new AppShimHostMsg_QuitApp);
120 } 121 }
121 122
122 bool AppShimController::OnMessageReceived(const IPC::Message& message) { 123 bool AppShimController::OnMessageReceived(const IPC::Message& message) {
123 bool handled = true; 124 bool handled = true;
124 IPC_BEGIN_MESSAGE_MAP(AppShimController, message) 125 IPC_BEGIN_MESSAGE_MAP(AppShimController, message)
125 IPC_MESSAGE_HANDLER(AppShimMsg_LaunchApp_Done, OnLaunchAppDone) 126 IPC_MESSAGE_HANDLER(AppShimMsg_LaunchApp_Done, OnLaunchAppDone)
126 IPC_MESSAGE_UNHANDLED(handled = false) 127 IPC_MESSAGE_UNHANDLED(handled = false)
127 IPC_END_MESSAGE_MAP() 128 IPC_END_MESSAGE_MAP()
128 129
129 return handled; 130 return handled;
130 } 131 }
131 132
132 void AppShimController::OnChannelError() { 133 void AppShimController::OnChannelError() {
133 LOG(ERROR) << "App shim channel error.";
134 Close(); 134 Close();
135 } 135 }
136 136
137 void AppShimController::OnLaunchAppDone(bool success) { 137 void AppShimController::OnLaunchAppDone(bool success) {
138 if (!success) { 138 if (!success) {
139 Close(); 139 Close();
140 return; 140 return;
141 } 141 }
142
142 [[[NSWorkspace sharedWorkspace] notificationCenter] 143 [[[NSWorkspace sharedWorkspace] notificationCenter]
143 addObserverForName:NSWorkspaceDidActivateApplicationNotification 144 addObserverForName:NSWorkspaceDidActivateApplicationNotification
144 object:nil 145 object:nil
145 queue:nil 146 queue:nil
146 usingBlock:^(NSNotification* notification) { 147 usingBlock:^(NSNotification* notification) {
147 NSRunningApplication* activated_app = 148 NSRunningApplication* activated_app =
148 [[notification userInfo] objectForKey:NSWorkspaceApplicationKey]; 149 [[notification userInfo] objectForKey:NSWorkspaceApplicationKey];
149 if ([activated_app isEqual:[NSRunningApplication currentApplication]]) 150 if ([activated_app isEqual:[NSRunningApplication currentApplication]])
150 OnDidActivateApplication(); 151 OnDidActivateApplication();
151 }]; 152 }];
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after
312 extern "C" { 313 extern "C" {
313 314
314 // |ChromeAppModeStart()| is the point of entry into the framework from the app 315 // |ChromeAppModeStart()| is the point of entry into the framework from the app
315 // mode loader. 316 // mode loader.
316 __attribute__((visibility("default"))) 317 __attribute__((visibility("default")))
317 int ChromeAppModeStart(const app_mode::ChromeAppModeInfo* info); 318 int ChromeAppModeStart(const app_mode::ChromeAppModeInfo* info);
318 319
319 } // extern "C" 320 } // extern "C"
320 321
321 int ChromeAppModeStart(const app_mode::ChromeAppModeInfo* info) { 322 int ChromeAppModeStart(const app_mode::ChromeAppModeInfo* info) {
323 CommandLine::Init(info->argc, info->argv);
324
322 base::mac::ScopedNSAutoreleasePool scoped_pool; 325 base::mac::ScopedNSAutoreleasePool scoped_pool;
323 base::AtExitManager exit_manager; 326 base::AtExitManager exit_manager;
324 chrome::RegisterPathProvider(); 327 chrome::RegisterPathProvider();
325 328
326 if (info->major_version < app_mode::kCurrentChromeAppModeInfoMajorVersion) { 329 if (info->major_version < app_mode::kCurrentChromeAppModeInfoMajorVersion) {
327 RAW_LOG(ERROR, "App Mode Loader too old."); 330 RAW_LOG(ERROR, "App Mode Loader too old.");
328 return 1; 331 return 1;
329 } 332 }
330 if (info->major_version > app_mode::kCurrentChromeAppModeInfoMajorVersion) { 333 if (info->major_version > app_mode::kCurrentChromeAppModeInfoMajorVersion) {
331 RAW_LOG(ERROR, "Browser Framework too old to load App Shortcut."); 334 RAW_LOG(ERROR, "Browser Framework too old to load App Shortcut.");
(...skipping 26 matching lines...) Expand all
358 // fully initialized don't receive a reply until its run loop starts. Once 361 // fully initialized don't receive a reply until its run loop starts. Once
359 // the reply is received, Chrome will have opened its IPC port, guaranteed. 362 // the reply is received, Chrome will have opened its IPC port, guaranteed.
360 [ReplyEventHandler pingProcess:psn andCall:base::Bind(&OnPingChromeReply)]; 363 [ReplyEventHandler pingProcess:psn andCall:base::Bind(&OnPingChromeReply)];
361 364
362 base::MessageLoopForUI main_message_loop; 365 base::MessageLoopForUI main_message_loop;
363 main_message_loop.set_thread_name("MainThread"); 366 main_message_loop.set_thread_name("MainThread");
364 base::PlatformThread::SetName("CrAppShimMain"); 367 base::PlatformThread::SetName("CrAppShimMain");
365 main_message_loop.Run(); 368 main_message_loop.Run();
366 return 0; 369 return 0;
367 } 370 }
OLDNEW
« no previous file with comments | « apps/app_shim/extension_app_shim_handler_mac_unittest.cc ('k') | chrome/browser/ui/app_list/app_list_service_mac.mm » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698