OLD | NEW |
---|---|
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 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
44 | 44 |
45 private: | 45 private: |
46 // IPC::Listener implemetation. | 46 // IPC::Listener implemetation. |
47 virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE; | 47 virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE; |
48 virtual void OnChannelError() OVERRIDE; | 48 virtual void OnChannelError() OVERRIDE; |
49 | 49 |
50 // If Chrome failed to launch the app, |success| will be false and the app | 50 // If Chrome failed to launch the app, |success| will be false and the app |
51 // shim process should die. | 51 // shim process should die. |
52 void OnLaunchAppDone(bool success); | 52 void OnLaunchAppDone(bool success); |
53 | 53 |
54 // Called when the app is activated, either by the user clicking on it in the | |
55 // dock or by Cmd+Tabbing to it. | |
56 void OnDidActivateApplication(); | |
57 | |
54 // Quits the app shim process. | 58 // Quits the app shim process. |
55 void Quit(); | 59 void Quit(); |
56 | 60 |
57 IPC::ChannelProxy* channel_; | 61 IPC::ChannelProxy* channel_; |
58 | 62 |
59 DISALLOW_COPY_AND_ASSIGN(AppShimController); | 63 DISALLOW_COPY_AND_ASSIGN(AppShimController); |
60 }; | 64 }; |
61 | 65 |
62 AppShimController::AppShimController() : channel_(NULL) { | 66 AppShimController::AppShimController() : channel_(NULL) { |
63 } | 67 } |
(...skipping 24 matching lines...) Expand all Loading... | |
88 | 92 |
89 return handled; | 93 return handled; |
90 } | 94 } |
91 | 95 |
92 void AppShimController::OnChannelError() { | 96 void AppShimController::OnChannelError() { |
93 LOG(ERROR) << "App shim channel error."; | 97 LOG(ERROR) << "App shim channel error."; |
94 Quit(); | 98 Quit(); |
95 } | 99 } |
96 | 100 |
97 void AppShimController::OnLaunchAppDone(bool success) { | 101 void AppShimController::OnLaunchAppDone(bool success) { |
98 if (!success) | 102 if (!success) { |
99 Quit(); | 103 Quit(); |
104 return; | |
105 } | |
106 [[[NSWorkspace sharedWorkspace] notificationCenter] | |
107 addObserverForName:NSWorkspaceDidActivateApplicationNotification | |
108 object:nil | |
109 queue:nil | |
110 usingBlock:^(NSNotification* notification) { | |
111 NSRunningApplication* activated_app = | |
Nico
2013/03/18 22:50:59
nit: block bodies are supposed to be indented 4 sp
jeremya
2013/03/18 23:17:14
Done.
| |
112 [[notification userInfo] objectForKey:NSWorkspaceApplicationKey]; | |
113 if ([activated_app isEqual:[NSRunningApplication currentApplication]]) | |
114 OnDidActivateApplication(); | |
115 }]; | |
100 } | 116 } |
101 | 117 |
102 void AppShimController::Quit() { | 118 void AppShimController::Quit() { |
103 [NSApp terminate:nil]; | 119 [NSApp terminate:nil]; |
104 } | 120 } |
105 | 121 |
122 void AppShimController::OnDidActivateApplication() { | |
123 channel_->Send(new AppShimHostMsg_FocusApp); | |
124 } | |
125 | |
106 //----------------------------------------------------------------------------- | 126 //----------------------------------------------------------------------------- |
107 | 127 |
108 // A ReplyEventHandler is a helper class to send an Apple Event to a process | 128 // A ReplyEventHandler is a helper class to send an Apple Event to a process |
109 // and call a callback when the reply returns. | 129 // and call a callback when the reply returns. |
110 // | 130 // |
111 // This is used to 'ping' the main Chrome process -- once Chrome has sent back | 131 // This is used to 'ping' the main Chrome process -- once Chrome has sent back |
112 // an Apple Event reply, it's guaranteed that it has opened the IPC channel | 132 // an Apple Event reply, it's guaranteed that it has opened the IPC channel |
113 // that the app shim will connect to. | 133 // that the app shim will connect to. |
114 @interface ReplyEventHandler : NSObject { | 134 @interface ReplyEventHandler : NSObject { |
115 base::Callback<void(bool)> onReply_; | 135 base::Callback<void(bool)> onReply_; |
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
287 // fully initialized don't receive a reply until its run loop starts. Once | 307 // fully initialized don't receive a reply until its run loop starts. Once |
288 // the reply is received, Chrome will have opened its IPC port, guaranteed. | 308 // the reply is received, Chrome will have opened its IPC port, guaranteed. |
289 [ReplyEventHandler pingProcess:psn andCall:base::Bind(&OnPingChromeReply)]; | 309 [ReplyEventHandler pingProcess:psn andCall:base::Bind(&OnPingChromeReply)]; |
290 | 310 |
291 MessageLoopForUI main_message_loop; | 311 MessageLoopForUI main_message_loop; |
292 main_message_loop.set_thread_name("MainThread"); | 312 main_message_loop.set_thread_name("MainThread"); |
293 base::PlatformThread::SetName("CrAppShimMain"); | 313 base::PlatformThread::SetName("CrAppShimMain"); |
294 main_message_loop.Run(); | 314 main_message_loop.Run(); |
295 return 0; | 315 return 0; |
296 } | 316 } |
OLD | NEW |