OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 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 #include "chrome/plugin/plugin_interpose_util_mac.h" | 5 #include "chrome/plugin/plugin_interpose_util_mac.h" |
6 | 6 |
7 #import <AppKit/AppKit.h> | 7 #import <AppKit/AppKit.h> |
8 #import <objc/runtime.h> | 8 #import <objc/runtime.h> |
9 | 9 |
10 #include "chrome/common/plugin_messages.h" | 10 #include "chrome/common/plugin_messages.h" |
11 #include "chrome/plugin/plugin_thread.h" | 11 #include "chrome/plugin/plugin_thread.h" |
12 #include "webkit/plugins/npapi/webplugin_delegate_impl.h" | 12 #include "webkit/glue/plugins/webplugin_delegate_impl.h" |
13 | 13 |
14 namespace mac_plugin_interposing { | 14 namespace mac_plugin_interposing { |
15 | 15 |
16 // TODO(stuartmorgan): Make this an IPC to order the plugin process above the | 16 // TODO(stuartmorgan): Make this an IPC to order the plugin process above the |
17 // browser process only if the browser is current frontmost. | 17 // browser process only if the browser is current frontmost. |
18 __attribute__((visibility("default"))) | 18 __attribute__((visibility("default"))) |
19 void SwitchToPluginProcess() { | 19 void SwitchToPluginProcess() { |
20 ProcessSerialNumber this_process, front_process; | 20 ProcessSerialNumber this_process, front_process; |
21 if ((GetCurrentProcess(&this_process) != noErr) || | 21 if ((GetCurrentProcess(&this_process) != noErr) || |
22 (GetFrontProcess(&front_process) != noErr)) { | 22 (GetFrontProcess(&front_process) != noErr)) { |
23 return; | 23 return; |
24 } | 24 } |
25 | 25 |
26 Boolean matched = false; | 26 Boolean matched = false; |
27 if ((SameProcess(&this_process, &front_process, &matched) == noErr) && | 27 if ((SameProcess(&this_process, &front_process, &matched) == noErr) && |
28 !matched) { | 28 !matched) { |
29 SetFrontProcess(&this_process); | 29 SetFrontProcess(&this_process); |
30 } | 30 } |
31 } | 31 } |
32 | 32 |
33 __attribute__((visibility("default"))) | 33 __attribute__((visibility("default"))) |
34 OpaquePluginRef GetActiveDelegate() { | 34 OpaquePluginRef GetActiveDelegate() { |
35 return webkit::npapi::WebPluginDelegateImpl::GetActiveDelegate(); | 35 return WebPluginDelegateImpl::GetActiveDelegate(); |
36 } | 36 } |
37 | 37 |
38 __attribute__((visibility("default"))) | 38 __attribute__((visibility("default"))) |
39 void NotifyBrowserOfPluginSelectWindow(uint32 window_id, CGRect bounds, | 39 void NotifyBrowserOfPluginSelectWindow(uint32 window_id, CGRect bounds, |
40 bool modal) { | 40 bool modal) { |
41 PluginThread* plugin_thread = PluginThread::current(); | 41 PluginThread* plugin_thread = PluginThread::current(); |
42 if (plugin_thread) { | 42 if (plugin_thread) { |
43 gfx::Rect window_bounds(bounds); | 43 gfx::Rect window_bounds(bounds); |
44 plugin_thread->Send( | 44 plugin_thread->Send( |
45 new PluginProcessHostMsg_PluginSelectWindow(window_id, window_bounds, | 45 new PluginProcessHostMsg_PluginSelectWindow(window_id, window_bounds, |
(...skipping 19 matching lines...) Expand all Loading... |
65 if (plugin_thread) { | 65 if (plugin_thread) { |
66 gfx::Rect window_bounds(bounds); | 66 gfx::Rect window_bounds(bounds); |
67 plugin_thread->Send( | 67 plugin_thread->Send( |
68 new PluginProcessHostMsg_PluginHideWindow(window_id, window_bounds)); | 68 new PluginProcessHostMsg_PluginHideWindow(window_id, window_bounds)); |
69 } | 69 } |
70 } | 70 } |
71 | 71 |
72 __attribute__((visibility("default"))) | 72 __attribute__((visibility("default"))) |
73 void NotifyPluginOfSetThemeCursor(OpaquePluginRef delegate, | 73 void NotifyPluginOfSetThemeCursor(OpaquePluginRef delegate, |
74 ThemeCursor cursor) { | 74 ThemeCursor cursor) { |
75 static_cast<webkit::npapi::WebPluginDelegateImpl*>(delegate)->SetThemeCursor( | 75 static_cast<WebPluginDelegateImpl*>(delegate)->SetThemeCursor(cursor); |
76 cursor); | |
77 } | 76 } |
78 | 77 |
79 __attribute__((visibility("default"))) | 78 __attribute__((visibility("default"))) |
80 void NotifyPluginOfSetCursor(OpaquePluginRef delegate, | 79 void NotifyPluginOfSetCursor(OpaquePluginRef delegate, |
81 const Cursor* cursor) { | 80 const Cursor* cursor) { |
82 static_cast<webkit::npapi::WebPluginDelegateImpl*>(delegate)->SetCursor( | 81 static_cast<WebPluginDelegateImpl*>(delegate)->SetCursor(cursor); |
83 cursor); | |
84 } | 82 } |
85 | 83 |
86 void NotifyPluginOfSetCursorVisibility(bool visibility) { | 84 void NotifyPluginOfSetCursorVisibility(bool visibility) { |
87 PluginThread* plugin_thread = PluginThread::current(); | 85 PluginThread* plugin_thread = PluginThread::current(); |
88 if (plugin_thread) { | 86 if (plugin_thread) { |
89 plugin_thread->Send( | 87 plugin_thread->Send( |
90 new PluginProcessHostMsg_PluginSetCursorVisibility(visibility)); | 88 new PluginProcessHostMsg_PluginSetCursorVisibility(visibility)); |
91 } | 89 } |
92 } | 90 } |
93 | 91 |
94 __attribute__((visibility("default"))) | 92 __attribute__((visibility("default"))) |
95 bool GetPluginWindowHasFocus(const OpaquePluginRef delegate) { | 93 bool GetPluginWindowHasFocus(const OpaquePluginRef delegate) { |
96 return static_cast<webkit::npapi::WebPluginDelegateImpl*>( | 94 return static_cast<WebPluginDelegateImpl*>(delegate)->GetWindowHasFocus(); |
97 delegate)->GetWindowHasFocus(); | |
98 } | 95 } |
99 | 96 |
100 } // namespace mac_plugin_interposing | 97 } // namespace mac_plugin_interposing |
101 | 98 |
102 #pragma mark - | 99 #pragma mark - |
103 | 100 |
104 struct WindowInfo { | 101 struct WindowInfo { |
105 uint32 window_id; | 102 uint32 window_id; |
106 CGRect bounds; | 103 CGRect bounds; |
107 WindowInfo(NSWindow* window) { | 104 WindowInfo(NSWindow* window) { |
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
233 - (void)chromePlugin_set; | 230 - (void)chromePlugin_set; |
234 + (void)chromePlugin_hide; | 231 + (void)chromePlugin_hide; |
235 + (void)chromePlugin_unhide; | 232 + (void)chromePlugin_unhide; |
236 @end | 233 @end |
237 | 234 |
238 @implementation NSCursor (ChromePluginInterposing) | 235 @implementation NSCursor (ChromePluginInterposing) |
239 | 236 |
240 - (void)chromePlugin_set { | 237 - (void)chromePlugin_set { |
241 OpaquePluginRef delegate = mac_plugin_interposing::GetActiveDelegate(); | 238 OpaquePluginRef delegate = mac_plugin_interposing::GetActiveDelegate(); |
242 if (delegate) { | 239 if (delegate) { |
243 static_cast<webkit::npapi::WebPluginDelegateImpl*>(delegate)->SetNSCursor( | 240 static_cast<WebPluginDelegateImpl*>(delegate)->SetNSCursor(self); |
244 self); | |
245 return; | 241 return; |
246 } | 242 } |
247 [self chromePlugin_set]; | 243 [self chromePlugin_set]; |
248 } | 244 } |
249 | 245 |
250 + (void)chromePlugin_hide { | 246 + (void)chromePlugin_hide { |
251 mac_plugin_interposing::NotifyPluginOfSetCursorVisibility(false); | 247 mac_plugin_interposing::NotifyPluginOfSetCursorVisibility(false); |
252 } | 248 } |
253 | 249 |
254 + (void)chromePlugin_unhide { | 250 + (void)chromePlugin_unhide { |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
297 Class nscursor_class = [NSCursor class]; | 293 Class nscursor_class = [NSCursor class]; |
298 ExchangeMethods(nscursor_class, NO, @selector(set), | 294 ExchangeMethods(nscursor_class, NO, @selector(set), |
299 @selector(chromePlugin_set)); | 295 @selector(chromePlugin_set)); |
300 ExchangeMethods(nscursor_class, YES, @selector(hide), | 296 ExchangeMethods(nscursor_class, YES, @selector(hide), |
301 @selector(chromePlugin_hide)); | 297 @selector(chromePlugin_hide)); |
302 ExchangeMethods(nscursor_class, YES, @selector(unhide), | 298 ExchangeMethods(nscursor_class, YES, @selector(unhide), |
303 @selector(chromePlugin_unhide)); | 299 @selector(chromePlugin_unhide)); |
304 } | 300 } |
305 | 301 |
306 } // namespace mac_plugin_interposing | 302 } // namespace mac_plugin_interposing |
OLD | NEW |