| Index: content/plugin/plugin_interpose_util_mac.mm
|
| diff --git a/content/plugin/plugin_interpose_util_mac.mm b/content/plugin/plugin_interpose_util_mac.mm
|
| deleted file mode 100644
|
| index 678fea294fe8b73a7afffe689dd60a6ae04a651d..0000000000000000000000000000000000000000
|
| --- a/content/plugin/plugin_interpose_util_mac.mm
|
| +++ /dev/null
|
| @@ -1,261 +0,0 @@
|
| -// Copyright (c) 2011 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "content/plugin/plugin_interpose_util_mac.h"
|
| -
|
| -#import <AppKit/AppKit.h>
|
| -#import <objc/runtime.h>
|
| -#include <stdint.h>
|
| -
|
| -#include "content/child/npapi/webplugin_delegate_impl.h"
|
| -#include "content/common/plugin_process_messages.h"
|
| -#include "content/plugin/plugin_thread.h"
|
| -
|
| -using content::PluginThread;
|
| -
|
| -namespace {
|
| -
|
| -// Brings the plugin process to the front so that the user can see its windows.
|
| -void SwitchToPluginProcess() {
|
| - ProcessSerialNumber this_process, front_process;
|
| - if ((GetCurrentProcess(&this_process) != noErr) ||
|
| - (GetFrontProcess(&front_process) != noErr)) {
|
| - return;
|
| - }
|
| -
|
| - Boolean matched = false;
|
| - if ((SameProcess(&this_process, &front_process, &matched) == noErr) &&
|
| - !matched) {
|
| - SetFrontProcess(&this_process);
|
| - }
|
| -}
|
| -
|
| -// Sends a message to the browser process to inform it that the given window
|
| -// has been shown.
|
| -void NotifyBrowserOfPluginShowWindow(uint32_t window_id,
|
| - CGRect bounds,
|
| - bool modal) {
|
| - PluginThread* plugin_thread = PluginThread::current();
|
| - if (plugin_thread) {
|
| - gfx::Rect window_bounds(bounds);
|
| - plugin_thread->Send(
|
| - new PluginProcessHostMsg_PluginShowWindow(window_id, window_bounds,
|
| - modal));
|
| - }
|
| -}
|
| -
|
| -// Sends a message to the browser process to inform it that the given window
|
| -// has been hidden, and switches focus back to the browser process if there are
|
| -// no remaining plugin windows.
|
| -void NotifyBrowserOfPluginHideWindow(uint32_t window_id, CGRect bounds) {
|
| - PluginThread* plugin_thread = PluginThread::current();
|
| - if (plugin_thread) {
|
| - gfx::Rect window_bounds(bounds);
|
| - plugin_thread->Send(
|
| - new PluginProcessHostMsg_PluginHideWindow(window_id, window_bounds));
|
| - }
|
| -}
|
| -
|
| -// Informs the host that the plugin has changed the cursor visibility.
|
| -void NotifyPluginOfSetCursorVisibility(bool visibility) {
|
| - PluginThread* plugin_thread = PluginThread::current();
|
| - if (plugin_thread) {
|
| - plugin_thread->Send(
|
| - new PluginProcessHostMsg_PluginSetCursorVisibility(visibility));
|
| - }
|
| -}
|
| -
|
| -struct WindowInfo {
|
| - uint32_t window_id;
|
| - CGRect bounds;
|
| - WindowInfo(NSWindow* window) {
|
| - NSInteger window_num = [window windowNumber];
|
| - window_id = window_num > 0 ? window_num : 0;
|
| - bounds = NSRectToCGRect([window frame]);
|
| - }
|
| -};
|
| -
|
| -void OnPluginWindowClosed(const WindowInfo& window_info) {
|
| - if (window_info.window_id == 0)
|
| - return;
|
| - NotifyBrowserOfPluginHideWindow(window_info.window_id, window_info.bounds);
|
| -}
|
| -
|
| -BOOL g_waiting_for_window_number = NO;
|
| -
|
| -void OnPluginWindowShown(const WindowInfo& window_info, BOOL is_modal) {
|
| - // The window id is 0 if it has never been shown (including while it is the
|
| - // process of being shown for the first time); when that happens, we'll catch
|
| - // it in _setWindowNumber instead.
|
| - static BOOL s_pending_display_is_modal = NO;
|
| - if (window_info.window_id == 0) {
|
| - g_waiting_for_window_number = YES;
|
| - if (is_modal)
|
| - s_pending_display_is_modal = YES;
|
| - return;
|
| - }
|
| - g_waiting_for_window_number = NO;
|
| - if (s_pending_display_is_modal) {
|
| - is_modal = YES;
|
| - s_pending_display_is_modal = NO;
|
| - }
|
| - NotifyBrowserOfPluginShowWindow(window_info.window_id, window_info.bounds,
|
| - is_modal);
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -@interface NSWindow (ChromePluginUtilities)
|
| -// Returns YES if the window is visible and actually on the screen.
|
| -- (BOOL)chromePlugin_isWindowOnScreen;
|
| -@end
|
| -
|
| -@implementation NSWindow (ChromePluginUtilities)
|
| -
|
| -- (BOOL)chromePlugin_isWindowOnScreen {
|
| - if (![self isVisible])
|
| - return NO;
|
| - NSRect window_frame = [self frame];
|
| - for (NSScreen* screen in [NSScreen screens]) {
|
| - if (NSIntersectsRect(window_frame, [screen frame]))
|
| - return YES;
|
| - }
|
| - return NO;
|
| -}
|
| -
|
| -@end
|
| -
|
| -@interface NSWindow (ChromePluginInterposing)
|
| -- (void)chromePlugin_orderOut:(id)sender;
|
| -- (void)chromePlugin_orderFront:(id)sender;
|
| -- (void)chromePlugin_makeKeyAndOrderFront:(id)sender;
|
| -- (void)chromePlugin_setWindowNumber:(NSInteger)num;
|
| -@end
|
| -
|
| -@implementation NSWindow (ChromePluginInterposing)
|
| -
|
| -- (void)chromePlugin_orderOut:(id)sender {
|
| - WindowInfo window_info(self);
|
| - [self chromePlugin_orderOut:sender];
|
| - OnPluginWindowClosed(window_info);
|
| -}
|
| -
|
| -- (void)chromePlugin_orderFront:(id)sender {
|
| - [self chromePlugin_orderFront:sender];
|
| - if ([self chromePlugin_isWindowOnScreen])
|
| - SwitchToPluginProcess();
|
| - OnPluginWindowShown(WindowInfo(self), NO);
|
| -}
|
| -
|
| -- (void)chromePlugin_makeKeyAndOrderFront:(id)sender {
|
| - [self chromePlugin_makeKeyAndOrderFront:sender];
|
| - if ([self chromePlugin_isWindowOnScreen])
|
| - SwitchToPluginProcess();
|
| - OnPluginWindowShown(WindowInfo(self), NO);
|
| -}
|
| -
|
| -- (void)chromePlugin_setWindowNumber:(NSInteger)num {
|
| - if (!g_waiting_for_window_number || num <= 0) {
|
| - [self chromePlugin_setWindowNumber:num];
|
| - return;
|
| - }
|
| - SwitchToPluginProcess();
|
| - [self chromePlugin_setWindowNumber:num];
|
| - OnPluginWindowShown(WindowInfo(self), NO);
|
| -}
|
| -
|
| -@end
|
| -
|
| -@interface NSApplication (ChromePluginInterposing)
|
| -- (NSInteger)chromePlugin_runModalForWindow:(NSWindow*)window;
|
| -@end
|
| -
|
| -@implementation NSApplication (ChromePluginInterposing)
|
| -
|
| -- (NSInteger)chromePlugin_runModalForWindow:(NSWindow*)window {
|
| - SwitchToPluginProcess();
|
| - // This is out-of-order relative to the other calls, but runModalForWindow:
|
| - // won't return until the window closes, and the order only matters for
|
| - // full-screen windows.
|
| - OnPluginWindowShown(WindowInfo(window), YES);
|
| - return [self chromePlugin_runModalForWindow:window];
|
| -}
|
| -
|
| -@end
|
| -
|
| -@interface NSCursor (ChromePluginInterposing)
|
| -- (void)chromePlugin_set;
|
| -+ (void)chromePlugin_hide;
|
| -+ (void)chromePlugin_unhide;
|
| -@end
|
| -
|
| -@implementation NSCursor (ChromePluginInterposing)
|
| -
|
| -- (void)chromePlugin_set {
|
| - content::WebPluginDelegateImpl* delegate =
|
| - content::WebPluginDelegateImpl::GetActiveDelegate();
|
| - if (delegate) {
|
| - delegate->SetNSCursor(self);
|
| - return;
|
| - }
|
| - [self chromePlugin_set];
|
| -}
|
| -
|
| -+ (void)chromePlugin_hide {
|
| - NotifyPluginOfSetCursorVisibility(false);
|
| -}
|
| -
|
| -+ (void)chromePlugin_unhide {
|
| - NotifyPluginOfSetCursorVisibility(true);
|
| -}
|
| -
|
| -@end
|
| -
|
| -#pragma mark -
|
| -
|
| -static void ExchangeMethods(Class target_class,
|
| - BOOL class_method,
|
| - SEL original,
|
| - SEL replacement) {
|
| - Method m1;
|
| - Method m2;
|
| - if (class_method) {
|
| - m1 = class_getClassMethod(target_class, original);
|
| - m2 = class_getClassMethod(target_class, replacement);
|
| - } else {
|
| - m1 = class_getInstanceMethod(target_class, original);
|
| - m2 = class_getInstanceMethod(target_class, replacement);
|
| - }
|
| - if (m1 && m2)
|
| - method_exchangeImplementations(m1, m2);
|
| - else
|
| - NOTREACHED() << "Cocoa swizzling failed";
|
| -}
|
| -
|
| -namespace mac_plugin_interposing {
|
| -
|
| -void SetUpCocoaInterposing() {
|
| - Class nswindow_class = [NSWindow class];
|
| - ExchangeMethods(nswindow_class, NO, @selector(orderOut:),
|
| - @selector(chromePlugin_orderOut:));
|
| - ExchangeMethods(nswindow_class, NO, @selector(orderFront:),
|
| - @selector(chromePlugin_orderFront:));
|
| - ExchangeMethods(nswindow_class, NO, @selector(makeKeyAndOrderFront:),
|
| - @selector(chromePlugin_makeKeyAndOrderFront:));
|
| - ExchangeMethods(nswindow_class, NO, @selector(_setWindowNumber:),
|
| - @selector(chromePlugin_setWindowNumber:));
|
| -
|
| - ExchangeMethods([NSApplication class], NO, @selector(runModalForWindow:),
|
| - @selector(chromePlugin_runModalForWindow:));
|
| -
|
| - Class nscursor_class = [NSCursor class];
|
| - ExchangeMethods(nscursor_class, NO, @selector(set),
|
| - @selector(chromePlugin_set));
|
| - ExchangeMethods(nscursor_class, YES, @selector(hide),
|
| - @selector(chromePlugin_hide));
|
| - ExchangeMethods(nscursor_class, YES, @selector(unhide),
|
| - @selector(chromePlugin_unhide));
|
| -}
|
| -
|
| -} // namespace mac_plugin_interposing
|
|
|