summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorthakis@chromium.org <thakis@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-04-05 18:45:33 +0000
committerthakis@chromium.org <thakis@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-04-05 18:45:33 +0000
commit78043bddf1744180a28682f8cdf3359a9bfdef4b (patch)
tree55a8fb8cf8a99a039cb0e3bf2de96c6232782b93
parent0a6d4ce8805679d6350dd4ce596d53dcd25837f4 (diff)
downloadchromium_src-78043bddf1744180a28682f8cdf3359a9bfdef4b.zip
chromium_src-78043bddf1744180a28682f8cdf3359a9bfdef4b.tar.gz
chromium_src-78043bddf1744180a28682f8cdf3359a9bfdef4b.tar.bz2
Mac: Make image dragging 162.4% more awesome.
Also needs a webkit patch to do anything ( https://bugs.webkit.org/show_bug.cgi?id=37069 ), but can be landed independently. BUG=11457,18992 TEST=(all require the webkit patch, so this won't work yet) http://html5demos.com/drag and http://ljouanneau.com/lab/html5/demodragdrop.html Dragging should show image http://www.google.com/ Dragging google image should show image http://www.travelvivi.com/wp-content/uploads/2009/09/Eiffel_Tower.jpg Dragging image should work, drag image should be smaller than image itself Random website Mark some text, drag it. Should show drag cursor and no image Review URL: http://codereview.chromium.org/1539018 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@43631 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/browser/cocoa/web_drag_source.h8
-rw-r--r--chrome/browser/cocoa/web_drag_source.mm28
-rw-r--r--chrome/browser/tab_contents/tab_contents_view_mac.mm17
-rw-r--r--chrome/renderer/render_view.cc5
-rw-r--r--skia/ext/skia_utils_mac.mm3
5 files changed, 44 insertions, 17 deletions
diff --git a/chrome/browser/cocoa/web_drag_source.h b/chrome/browser/cocoa/web_drag_source.h
index 623a197..425eb09 100644
--- a/chrome/browser/cocoa/web_drag_source.h
+++ b/chrome/browser/cocoa/web_drag_source.h
@@ -23,6 +23,12 @@ struct WebDropData;
// Our drop data. Should only be initialized once.
scoped_ptr<WebDropData> dropData_;
+ // The image to show as drag image. Can be nil.
+ scoped_nsobject<NSImage> dragImage_;
+
+ // The offset to draw |dragImage_| at.
+ NSPoint imageOffset_;
+
// Our pasteboard.
scoped_nsobject<NSPasteboard> pasteboard_;
@@ -41,6 +47,8 @@ struct WebDropData;
// with data types appropriate for dropData.
- (id)initWithContentsView:(TabContentsViewCocoa*)contentsView
dropData:(const WebDropData*)dropData
+ image:(NSImage*)image
+ offset:(NSPoint)offset
pasteboard:(NSPasteboard*)pboard
dragOperationMask:(NSDragOperation)dragOperationMask;
diff --git a/chrome/browser/cocoa/web_drag_source.mm b/chrome/browser/cocoa/web_drag_source.mm
index 8f5efe7..62733bc 100644
--- a/chrome/browser/cocoa/web_drag_source.mm
+++ b/chrome/browser/cocoa/web_drag_source.mm
@@ -35,16 +35,6 @@ namespace {
// |NSURLPboardType|.
NSString* const kNSURLTitlePboardType = @"public.url-name";
-// Make a drag image from the drop data.
-// TODO(viettrungluu): Move this somewhere more sensible.
-NSImage* MakeDragImage(const WebDropData* drop_data) {
- // TODO(viettrungluu): Just a stub for now. Make it do something (see, e.g.,
- // WebKit/WebKit/mac/Misc/WebNSViewExtras.m: |-_web_DragImageForElement:...|).
-
- // Default to returning a generic image.
- return nsimage_cache::ImageNamed(@"nav.pdf");
-}
-
// Returns a filename appropriate for the drop data
// TODO(viettrungluu): Refactor to make it common across platforms,
// and move it somewhere sensible.
@@ -122,6 +112,8 @@ void PromiseWriterTask::Run() {
- (id)initWithContentsView:(TabContentsViewCocoa*)contentsView
dropData:(const WebDropData*)dropData
+ image:(NSImage*)image
+ offset:(NSPoint)offset
pasteboard:(NSPasteboard*)pboard
dragOperationMask:(NSDragOperation)dragOperationMask {
if ((self = [super init])) {
@@ -131,6 +123,9 @@ void PromiseWriterTask::Run() {
dropData_.reset(new WebDropData(*dropData));
DCHECK(dropData_.get());
+ dragImage_.reset([image retain]);
+ imageOffset_ = offset;
+
pasteboard_.reset([pboard retain]);
DCHECK(pasteboard_.get());
@@ -225,6 +220,13 @@ void PromiseWriterTask::Run() {
clickCount:1
pressure:1.0];
+ if (dragImage_) {
+ position.x -= imageOffset_.x;
+ // Deal with Cocoa's flipped coordinate system.
+ position.y -= [dragImage_.get() size].height - imageOffset_.y;
+ }
+ // Per kwebster, offset arg is ignored, see -_web_DragImageForElement: in
+ // third_party/WebKit/WebKit/mac/Misc/WebNSViewExtras.m.
[window dragImage:[self dragImage]
at:position
offset:NSZeroSize
@@ -386,7 +388,11 @@ void PromiseWriterTask::Run() {
}
- (NSImage*)dragImage {
- return MakeDragImage(dropData_.get());
+ if (dragImage_)
+ return dragImage_;
+
+ // Default to returning a generic image.
+ return nsimage_cache::ImageNamed(@"nav.pdf");
}
@end // @implementation WebDragSource (Private)
diff --git a/chrome/browser/tab_contents/tab_contents_view_mac.mm b/chrome/browser/tab_contents/tab_contents_view_mac.mm
index 393d707..731425f 100644
--- a/chrome/browser/tab_contents/tab_contents_view_mac.mm
+++ b/chrome/browser/tab_contents/tab_contents_view_mac.mm
@@ -26,6 +26,7 @@
#include "chrome/common/notification_type.h"
#include "chrome/common/notification_service.h"
#include "chrome/common/render_messages.h"
+#include "skia/ext/skia_utils_mac.h"
#import "third_party/mozilla/include/NSPasteboard+Utils.h"
using WebKit::WebDragOperation;
@@ -49,7 +50,9 @@ COMPILE_ASSERT_MATCHING_ENUM(DragOperationEvery);
- (void)registerDragTypes;
- (void)setCurrentDragOperation:(NSDragOperation)operation;
- (void)startDragWithDropData:(const WebDropData&)dropData
- dragOperationMask:(NSDragOperation)operationMask;
+ dragOperationMask:(NSDragOperation)operationMask
+ image:(NSImage*)image
+ offset:(NSPoint)offset;
- (void)cancelDeferredClose;
- (void)closeTabAfterEvent;
@end
@@ -141,10 +144,12 @@ void TabContentsViewMac::StartDragging(
// The drag invokes a nested event loop, arrange to continue
// processing events.
MessageLoop::ScopedNestableTaskAllower allow(MessageLoop::current());
- // TODO(estade): make use of |image| and |image_offset|.
NSDragOperation mask = static_cast<NSDragOperation>(allowed_operations);
+ NSPoint offset = NSPointFromCGPoint(image_offset.ToCGPoint());
[cocoa_view_ startDragWithDropData:drop_data
- dragOperationMask:mask];
+ dragOperationMask:mask
+ image:gfx::SkBitmapToNSImage(image)
+ offset:offset];
}
void TabContentsViewMac::RenderViewCreated(RenderViewHost* host) {
@@ -376,10 +381,14 @@ void TabContentsViewMac::Observe(NotificationType type,
}
- (void)startDragWithDropData:(const WebDropData&)dropData
- dragOperationMask:(NSDragOperation)operationMask {
+ dragOperationMask:(NSDragOperation)operationMask
+ image:(NSImage*)image
+ offset:(NSPoint)offset {
dragSource_.reset([[WebDragSource alloc]
initWithContentsView:self
dropData:&dropData
+ image:image
+ offset:offset
pasteboard:[NSPasteboard pasteboardWithName:NSDragPboard]
dragOperationMask:operationMask]);
[dragSource_ startDrag];
diff --git a/chrome/renderer/render_view.cc b/chrome/renderer/render_view.cc
index 1834a13..3aba9a3 100644
--- a/chrome/renderer/render_view.cc
+++ b/chrome/renderer/render_view.cc
@@ -128,6 +128,8 @@
#include "gfx/native_theme_win.h"
#elif defined(USE_X11)
#include "third_party/WebKit/WebKit/chromium/public/linux/WebRenderTheme.h"
+#elif defined(OS_MACOSX)
+#include "skia/ext/skia_utils_mac.h"
#endif
using appcache::WebApplicationCacheHostImpl;
@@ -1905,8 +1907,7 @@ void RenderView::startDragging(const WebDragData& data,
#if WEBKIT_USING_SKIA
SkBitmap bitmap(image.getSkBitmap());
#elif WEBKIT_USING_CG
- // Needs implementing: http://crbug.com/11457
- SkBitmap bitmap;
+ SkBitmap bitmap = gfx::CGImageToSkBitmap(image.getCGImageRef());
#endif
Send(new ViewHostMsg_StartDragging(routing_id_,
diff --git a/skia/ext/skia_utils_mac.mm b/skia/ext/skia_utils_mac.mm
index 3568d88..a913587 100644
--- a/skia/ext/skia_utils_mac.mm
+++ b/skia/ext/skia_utils_mac.mm
@@ -168,6 +168,9 @@ SkBitmap NSImageToSkBitmap(NSImage* image, NSSize size, bool is_opaque) {
}
NSImage* SkBitmapToNSImage(const SkBitmap& skiaBitmap) {
+ if (skiaBitmap.isNull())
+ return nil;
+
// First convert SkBitmap to CGImageRef.
CGImageRef cgimage = SkCreateCGImageRef(skiaBitmap);