summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/plugin/plugin_interpose_util_mac.mm21
-rw-r--r--webkit/glue/plugins/webplugin_delegate_impl.h4
-rw-r--r--webkit/glue/plugins/webplugin_delegate_impl_mac.mm4
-rw-r--r--webkit/glue/webcursor.h3
-rw-r--r--webkit/glue/webcursor_mac.mm55
5 files changed, 82 insertions, 5 deletions
diff --git a/chrome/plugin/plugin_interpose_util_mac.mm b/chrome/plugin/plugin_interpose_util_mac.mm
index 7743175..f919c2b 100644
--- a/chrome/plugin/plugin_interpose_util_mac.mm
+++ b/chrome/plugin/plugin_interpose_util_mac.mm
@@ -75,7 +75,6 @@ void NotifyPluginOfSetThemeCursor(WebPluginDelegateImpl* delegate,
delegate->SetThemeCursor(cursor);
}
-
} // namespace mac_plugin_interposing
#pragma mark -
@@ -169,6 +168,23 @@ static void OnPluginWindowShown(const WindowInfo& window_info, BOOL is_modal) {
@end
+@interface NSCursor (ChromePluginInterposing)
+- (void)chromePlugin_set;
+@end
+
+@implementation NSCursor (ChromePluginInterposing)
+
+- (void)chromePlugin_set {
+ WebPluginDelegateImpl* delegate = mac_plugin_interposing::GetActiveDelegate();
+ if (delegate) {
+ delegate->SetNSCursor(self);
+ return;
+ }
+ [self chromePlugin_set];
+}
+
+@end
+
#pragma mark -
static void ExchangeMethods(Class target_class, SEL original, SEL replacement) {
@@ -195,6 +211,9 @@ void SetUpCocoaInterposing() {
ExchangeMethods([NSApplication class], @selector(runModalForWindow:),
@selector(chromePlugin_runModalForWindow:));
+
+ ExchangeMethods([NSCursor class], @selector(set),
+ @selector(chromePlugin_set));
}
} // namespace mac_plugin_interposing
diff --git a/webkit/glue/plugins/webplugin_delegate_impl.h b/webkit/glue/plugins/webplugin_delegate_impl.h
index 4e66936..a246f60 100644
--- a/webkit/glue/plugins/webplugin_delegate_impl.h
+++ b/webkit/glue/plugins/webplugin_delegate_impl.h
@@ -133,8 +133,10 @@ class WebPluginDelegateImpl : public webkit_glue::WebPluginDelegate {
void SetFocusNotifier(void (*notifier)(WebPluginDelegateImpl*)) {
focus_notifier_ = notifier;
}
- // Informs the delegate that the plugin set a theme cursor.
+ // Informs the delegate that the plugin set a Carbon ThemeCursor.
void SetThemeCursor(ThemeCursor cursor);
+ // Informs the delegate that the plugin set a Cocoa NSCursor.
+ void SetNSCursor(NSCursor* cursor);
#endif
#if !defined(OS_MACOSX)
diff --git a/webkit/glue/plugins/webplugin_delegate_impl_mac.mm b/webkit/glue/plugins/webplugin_delegate_impl_mac.mm
index 92edf23..2d6fdc6 100644
--- a/webkit/glue/plugins/webplugin_delegate_impl_mac.mm
+++ b/webkit/glue/plugins/webplugin_delegate_impl_mac.mm
@@ -440,6 +440,10 @@ void WebPluginDelegateImpl::SetThemeCursor(ThemeCursor cursor) {
current_windowless_cursor_.InitFromThemeCursor(cursor);
}
+void WebPluginDelegateImpl::SetNSCursor(NSCursor* cursor) {
+ current_windowless_cursor_.InitFromNSCursor(cursor);
+}
+
void WebPluginDelegateImpl::UpdatePluginLocation(const WebMouseEvent& event) {
instance()->set_plugin_origin(gfx::Point(event.globalX - event.x,
event.globalY - event.y));
diff --git a/webkit/glue/webcursor.h b/webkit/glue/webcursor.h
index ed59e0b..341a92a 100644
--- a/webkit/glue/webcursor.h
+++ b/webkit/glue/webcursor.h
@@ -91,6 +91,9 @@ class WebCursor {
// Initialize this from the given Carbon ThemeCursor.
void InitFromThemeCursor(ThemeCursor cursor);
+
+ // Initialize this from the given Cocoa NSCursor.
+ void InitFromNSCursor(NSCursor* cursor);
#endif
private:
diff --git a/webkit/glue/webcursor_mac.mm b/webkit/glue/webcursor_mac.mm
index 4a80d32..4a82327 100644
--- a/webkit/glue/webcursor_mac.mm
+++ b/webkit/glue/webcursor_mac.mm
@@ -20,7 +20,7 @@ using WebKit::WebSize;
namespace {
-// TODO: This image fech can (and probably should) be serviced by the resource
+// TODO: This image fetch can (and probably should) be serviced by the resource
// resource bundle instead of going through nsimage_cache.
NSCursor* LoadCursor(const char* name, int x, int y) {
NSString* file_name = [NSString stringWithUTF8String:name];
@@ -34,9 +34,9 @@ NSCursor* LoadCursor(const char* name, int x, int y) {
CGImageRef CreateCGImageFromCustomData(const std::vector<char>& custom_data,
const gfx::Size& custom_size) {
scoped_cftyperef<CGColorSpaceRef> cg_color(CGColorSpaceCreateDeviceRGB());
- // this is safe since we're not going to draw into the context we're creating
+ // This is safe since we're not going to draw into the context we're creating.
void* data = const_cast<char*>(&custom_data[0]);
- // settings here match SetCustomData() below; keep in sync
+ // The settings here match SetCustomData() below; keep in sync.
scoped_cftyperef<CGContextRef> context(
CGBitmapContextCreate(data,
custom_size.width(),
@@ -224,6 +224,55 @@ void WebCursor::InitFromThemeCursor(ThemeCursor cursor) {
InitFromCursorInfo(cursor_info);
}
+void WebCursor::InitFromNSCursor(NSCursor* cursor) {
+ WebKit::WebCursorInfo cursor_info;
+
+ if ([cursor isEqual:[NSCursor arrowCursor]]) {
+ cursor_info.type = WebCursorInfo::TypePointer;
+ } else if ([cursor isEqual:[NSCursor IBeamCursor]]) {
+ cursor_info.type = WebCursorInfo::TypeIBeam;
+ } else if ([cursor isEqual:[NSCursor crosshairCursor]]) {
+ cursor_info.type = WebCursorInfo::TypeCross;
+ } else if ([cursor isEqual:[NSCursor pointingHandCursor]]) {
+ cursor_info.type = WebCursorInfo::TypeHand;
+ } else if ([cursor isEqual:[NSCursor resizeLeftCursor]]) {
+ cursor_info.type = WebCursorInfo::TypeWestResize;
+ } else if ([cursor isEqual:[NSCursor resizeRightCursor]]) {
+ cursor_info.type = WebCursorInfo::TypeEastResize;
+ } else if ([cursor isEqual:[NSCursor resizeLeftRightCursor]]) {
+ cursor_info.type = WebCursorInfo::TypeEastWestResize;
+ } else if ([cursor isEqual:[NSCursor resizeUpCursor]]) {
+ cursor_info.type = WebCursorInfo::TypeNorthResize;
+ } else if ([cursor isEqual:[NSCursor resizeDownCursor]]) {
+ cursor_info.type = WebCursorInfo::TypeSouthResize;
+ } else if ([cursor isEqual:[NSCursor resizeUpDownCursor]]) {
+ cursor_info.type = WebCursorInfo::TypeNorthSouthResize;
+ } else {
+ // Also handles the [NSCursor closedHandCursor], [NSCursor openHandCursor],
+ // and [NSCursor disappearingItemCursor] cases. Quick-and-dirty image
+ // conversion; TODO(avi): do better.
+ CGImageRef cg_image = nil;
+ NSImage* image = [cursor image];
+ for (id rep in [image representations]) {
+ if ([rep isKindOfClass:[NSBitmapImageRep class]]) {
+ cg_image = [rep CGImage];
+ break;
+ }
+ }
+
+ if (cg_image) {
+ cursor_info.type = WebCursorInfo::TypeCustom;
+ NSPoint hot_spot = [cursor hotSpot];
+ cursor_info.hotSpot = WebKit::WebPoint(hot_spot.x, hot_spot.y);
+ cursor_info.customImage = cg_image;
+ } else {
+ cursor_info.type = WebCursorInfo::TypePointer;
+ }
+ }
+
+ InitFromCursorInfo(cursor_info);
+}
+
void WebCursor::SetCustomData(const WebImage& image) {
if (image.isNull())
return;