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 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
124 | 124 |
125 // If Chrome failed to launch the app, |success| will be false and the app | 125 // If Chrome failed to launch the app, |success| will be false and the app |
126 // shim process should die. | 126 // shim process should die. |
127 void OnLaunchAppDone(apps::AppShimLaunchResult result); | 127 void OnLaunchAppDone(apps::AppShimLaunchResult result); |
128 | 128 |
129 // Hide this app. | 129 // Hide this app. |
130 void OnHide(); | 130 void OnHide(); |
131 | 131 |
132 // Requests user attention. | 132 // Requests user attention. |
133 void OnRequestUserAttention(); | 133 void OnRequestUserAttention(); |
| 134 void OnSetUserAttention(apps::AppShimAttentionType attention_type); |
134 | 135 |
135 // Terminates the app shim process. | 136 // Terminates the app shim process. |
136 void Close(); | 137 void Close(); |
137 | 138 |
138 base::FilePath user_data_dir_; | 139 base::FilePath user_data_dir_; |
139 scoped_ptr<IPC::ChannelProxy> channel_; | 140 scoped_ptr<IPC::ChannelProxy> channel_; |
140 base::scoped_nsobject<AppShimDelegate> delegate_; | 141 base::scoped_nsobject<AppShimDelegate> delegate_; |
141 bool launch_app_done_; | 142 bool launch_app_done_; |
142 bool ping_chrome_reply_received_; | 143 bool ping_chrome_reply_received_; |
| 144 NSInteger attention_request_id_; |
143 | 145 |
144 DISALLOW_COPY_AND_ASSIGN(AppShimController); | 146 DISALLOW_COPY_AND_ASSIGN(AppShimController); |
145 }; | 147 }; |
146 | 148 |
147 AppShimController::AppShimController() | 149 AppShimController::AppShimController() |
148 : delegate_([[AppShimDelegate alloc] init]), | 150 : delegate_([[AppShimDelegate alloc] init]), |
149 launch_app_done_(false), | 151 launch_app_done_(false), |
150 ping_chrome_reply_received_(false) { | 152 ping_chrome_reply_received_(false), |
| 153 attention_request_id_(0) { |
151 // Since AppShimController is created before the main message loop starts, | 154 // Since AppShimController is created before the main message loop starts, |
152 // NSApp will not be set, so use sharedApplication. | 155 // NSApp will not be set, so use sharedApplication. |
153 [[NSApplication sharedApplication] setDelegate:delegate_]; | 156 [[NSApplication sharedApplication] setDelegate:delegate_]; |
154 } | 157 } |
155 | 158 |
156 AppShimController::~AppShimController() { | 159 AppShimController::~AppShimController() { |
157 // Un-set the delegate since NSApplication does not retain it. | 160 // Un-set the delegate since NSApplication does not retain it. |
158 [[NSApplication sharedApplication] setDelegate:nil]; | 161 [[NSApplication sharedApplication] setDelegate:nil]; |
159 } | 162 } |
160 | 163 |
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
275 void AppShimController::SendQuitApp() { | 278 void AppShimController::SendQuitApp() { |
276 channel_->Send(new AppShimHostMsg_QuitApp); | 279 channel_->Send(new AppShimHostMsg_QuitApp); |
277 } | 280 } |
278 | 281 |
279 bool AppShimController::OnMessageReceived(const IPC::Message& message) { | 282 bool AppShimController::OnMessageReceived(const IPC::Message& message) { |
280 bool handled = true; | 283 bool handled = true; |
281 IPC_BEGIN_MESSAGE_MAP(AppShimController, message) | 284 IPC_BEGIN_MESSAGE_MAP(AppShimController, message) |
282 IPC_MESSAGE_HANDLER(AppShimMsg_LaunchApp_Done, OnLaunchAppDone) | 285 IPC_MESSAGE_HANDLER(AppShimMsg_LaunchApp_Done, OnLaunchAppDone) |
283 IPC_MESSAGE_HANDLER(AppShimMsg_Hide, OnHide) | 286 IPC_MESSAGE_HANDLER(AppShimMsg_Hide, OnHide) |
284 IPC_MESSAGE_HANDLER(AppShimMsg_RequestUserAttention, OnRequestUserAttention) | 287 IPC_MESSAGE_HANDLER(AppShimMsg_RequestUserAttention, OnRequestUserAttention) |
| 288 IPC_MESSAGE_HANDLER(AppShimMsg_SetUserAttention, OnSetUserAttention) |
285 IPC_MESSAGE_UNHANDLED(handled = false) | 289 IPC_MESSAGE_UNHANDLED(handled = false) |
286 IPC_END_MESSAGE_MAP() | 290 IPC_END_MESSAGE_MAP() |
287 | 291 |
288 return handled; | 292 return handled; |
289 } | 293 } |
290 | 294 |
291 void AppShimController::OnChannelError() { | 295 void AppShimController::OnChannelError() { |
292 Close(); | 296 Close(); |
293 } | 297 } |
294 | 298 |
295 void AppShimController::OnLaunchAppDone(apps::AppShimLaunchResult result) { | 299 void AppShimController::OnLaunchAppDone(apps::AppShimLaunchResult result) { |
296 if (result != apps::APP_SHIM_LAUNCH_SUCCESS) { | 300 if (result != apps::APP_SHIM_LAUNCH_SUCCESS) { |
297 Close(); | 301 Close(); |
298 return; | 302 return; |
299 } | 303 } |
300 | 304 |
301 std::vector<base::FilePath> files; | 305 std::vector<base::FilePath> files; |
302 if ([delegate_ getFilesToOpenAtStartup:&files]) | 306 if ([delegate_ getFilesToOpenAtStartup:&files]) |
303 SendFocusApp(apps::APP_SHIM_FOCUS_OPEN_FILES, files); | 307 SendFocusApp(apps::APP_SHIM_FOCUS_OPEN_FILES, files); |
304 | 308 |
305 launch_app_done_ = true; | 309 launch_app_done_ = true; |
306 } | 310 } |
307 | 311 |
308 void AppShimController::OnHide() { | 312 void AppShimController::OnHide() { |
309 [NSApp hide:nil]; | 313 [NSApp hide:nil]; |
310 } | 314 } |
311 | 315 |
312 void AppShimController::OnRequestUserAttention() { | 316 void AppShimController::OnRequestUserAttention() { |
313 [NSApp requestUserAttention:NSInformationalRequest]; | 317 OnSetUserAttention(apps::APP_SHIM_ATTENTION_INFORMATIONAL); |
| 318 } |
| 319 |
| 320 void AppShimController::OnSetUserAttention( |
| 321 apps::AppShimAttentionType attention_type) { |
| 322 switch (attention_type) { |
| 323 case apps::APP_SHIM_ATTENTION_CANCEL: |
| 324 [NSApp cancelUserAttentionRequest:attention_request_id_]; |
| 325 attention_request_id_ = 0; |
| 326 break; |
| 327 case apps::APP_SHIM_ATTENTION_CRITICAL: |
| 328 attention_request_id_ = [NSApp requestUserAttention:NSCriticalRequest]; |
| 329 break; |
| 330 case apps::APP_SHIM_ATTENTION_INFORMATIONAL: |
| 331 attention_request_id_ = |
| 332 [NSApp requestUserAttention:NSInformationalRequest]; |
| 333 break; |
| 334 case apps::APP_SHIM_ATTENTION_NUM_TYPES: |
| 335 NOTREACHED(); |
| 336 } |
314 } | 337 } |
315 | 338 |
316 void AppShimController::Close() { | 339 void AppShimController::Close() { |
317 [delegate_ terminateNow]; | 340 [delegate_ terminateNow]; |
318 } | 341 } |
319 | 342 |
320 bool AppShimController::SendFocusApp(apps::AppShimFocusType focus_type, | 343 bool AppShimController::SendFocusApp(apps::AppShimFocusType focus_type, |
321 const std::vector<base::FilePath>& files) { | 344 const std::vector<base::FilePath>& files) { |
322 if (launch_app_done_) { | 345 if (launch_app_done_) { |
323 channel_->Send(new AppShimHostMsg_FocusApp(focus_type, files)); | 346 channel_->Send(new AppShimHostMsg_FocusApp(focus_type, files)); |
(...skipping 337 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
661 // minute. | 684 // minute. |
662 main_message_loop.PostTask( | 685 main_message_loop.PostTask( |
663 FROM_HERE, | 686 FROM_HERE, |
664 base::Bind(&AppShimController::Init, | 687 base::Bind(&AppShimController::Init, |
665 base::Unretained(&controller))); | 688 base::Unretained(&controller))); |
666 } | 689 } |
667 | 690 |
668 main_message_loop.Run(); | 691 main_message_loop.Run(); |
669 return 0; | 692 return 0; |
670 } | 693 } |
OLD | NEW |