[SCM] WebKit Debian packaging branch, debian/experimental, updated. upstream/1.3.3-9427-gc2be6fc
commit-queue at webkit.org
commit-queue at webkit.org
Wed Dec 22 12:28:54 UTC 2010
The following commit has been merged in the debian/experimental branch:
commit 14df318e28a779b0e497bfddbb65aeb5cd003578
Author: commit-queue at webkit.org <commit-queue at webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date: Tue Aug 24 16:06:36 2010 +0000
2010-08-24 Daniel Cheng <dcheng at chromium.org>
Reviewed by Eric Seidel.
[chromium] Generate drag images for HTML elements and selections.
https://bugs.webkit.org/show_bug.cgi?id=43449
We weren't properly generating drag images if an HTML element was set
as the drag feedback image. I also implemented dragImageForSelection
while I was working on this part of the code.
No new tests.
* WebCore.exp.in:
* bindings/objc/DOM.mm:
(-[DOMNode renderedImage]):
* page/Frame.h:
* page/brew/FrameBrew.cpp:
(WebCore::Frame::nodeImage):
* page/chromium/FrameChromium.cpp:
(WebCore::):
(WebCore::Frame::nodeImage):
(WebCore::Frame::dragImageForSelection):
* page/efl/FrameEfl.cpp:
(WebCore::Frame::nodeImage):
* page/gtk/FrameGtk.cpp:
(WebCore::Frame::nodeImage):
* page/haiku/FrameHaiku.cpp:
(WebCore::Frame::nodeImage):
* page/mac/FrameMac.mm:
(WebCore::Frame::nodeImage):
(WebCore::Frame::dragImageForSelection):
* page/qt/FrameQt.cpp:
(WebCore::Frame::nodeImage):
(WebCore::Frame::dragImageForSelection):
* page/win/FrameCGWin.cpp:
(WebCore::Frame::nodeImage):
* page/win/FrameCairoWin.cpp:
(WebCore::Frame::nodeImage):
* page/wince/FrameWince.cpp:
(WebCore::Frame::nodeImage):
* page/wx/FrameWx.cpp:
(WebCore::Frame::nodeImage):
* platform/chromium/ClipboardChromium.cpp:
(WebCore::ClipboardChromium::createDragImage):
* rendering/RenderObject.cpp:
(WebCore::RenderObject::selectionForegroundColor):
2010-08-24 Daniel Cheng <dcheng at chromium.org>
Reviewed by Eric Seidel.
[chromium] Generate drag images for HTML elements and selections.
https://bugs.webkit.org/show_bug.cgi?id=43449
Fix up calls to Frame::nodeImage, which has a new signature.
* Plugins/WebBaseNetscapePluginView.mm:
(-[WebBaseNetscapePluginView halt]):
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@65904 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
index aceecc3..58fe299 100644
--- a/WebCore/ChangeLog
+++ b/WebCore/ChangeLog
@@ -1,3 +1,51 @@
+2010-08-24 Daniel Cheng <dcheng at chromium.org>
+
+ Reviewed by Eric Seidel.
+
+ [chromium] Generate drag images for HTML elements and selections.
+ https://bugs.webkit.org/show_bug.cgi?id=43449
+
+ We weren't properly generating drag images if an HTML element was set
+ as the drag feedback image. I also implemented dragImageForSelection
+ while I was working on this part of the code.
+
+ No new tests.
+
+ * WebCore.exp.in:
+ * bindings/objc/DOM.mm:
+ (-[DOMNode renderedImage]):
+ * page/Frame.h:
+ * page/brew/FrameBrew.cpp:
+ (WebCore::Frame::nodeImage):
+ * page/chromium/FrameChromium.cpp:
+ (WebCore::):
+ (WebCore::Frame::nodeImage):
+ (WebCore::Frame::dragImageForSelection):
+ * page/efl/FrameEfl.cpp:
+ (WebCore::Frame::nodeImage):
+ * page/gtk/FrameGtk.cpp:
+ (WebCore::Frame::nodeImage):
+ * page/haiku/FrameHaiku.cpp:
+ (WebCore::Frame::nodeImage):
+ * page/mac/FrameMac.mm:
+ (WebCore::Frame::nodeImage):
+ (WebCore::Frame::dragImageForSelection):
+ * page/qt/FrameQt.cpp:
+ (WebCore::Frame::nodeImage):
+ (WebCore::Frame::dragImageForSelection):
+ * page/win/FrameCGWin.cpp:
+ (WebCore::Frame::nodeImage):
+ * page/win/FrameCairoWin.cpp:
+ (WebCore::Frame::nodeImage):
+ * page/wince/FrameWince.cpp:
+ (WebCore::Frame::nodeImage):
+ * page/wx/FrameWx.cpp:
+ (WebCore::Frame::nodeImage):
+ * platform/chromium/ClipboardChromium.cpp:
+ (WebCore::ClipboardChromium::createDragImage):
+ * rendering/RenderObject.cpp:
+ (WebCore::RenderObject::selectionForegroundColor):
+
2010-08-24 Jeremy Orlow <jorlow at chromium.org>
Reviewed by Steve Block.
diff --git a/WebCore/WebCore.exp.in b/WebCore/WebCore.exp.in
index eacf471..c3d9e43 100644
--- a/WebCore/WebCore.exp.in
+++ b/WebCore/WebCore.exp.in
@@ -590,6 +590,7 @@ __ZN7WebCore5Frame28searchForLabelsBeforeElementEP7NSArrayPNS_7ElementEPmPb
__ZN7WebCore5Frame34setMarkedTextMatchesAreHighlightedEb
__ZN7WebCore5Frame6createEPNS_4PageEPNS_21HTMLFrameOwnerElementEPNS_17FrameLoaderClientE
__ZN7WebCore5Frame7setViewEN3WTF10PassRefPtrINS_9FrameViewEEE
+__ZN7WebCore5Frame9nodeImageEPNS_4NodeE
__ZN7WebCore5FrameD1Ev
__ZN7WebCore5Image12supportsTypeERKN3WTF6StringE
__ZN7WebCore5Image20loadPlatformResourceEPKc
@@ -995,7 +996,6 @@ __ZNK7WebCore5Frame31fontAttributesForSelectionStartEv
__ZNK7WebCore5Frame37baseWritingDirectionForSelectionStartEv
__ZNK7WebCore5Frame8settingsEv
__ZNK7WebCore5Frame9domWindowEv
-__ZNK7WebCore5Frame9nodeImageEPNS_4NodeE
__ZNK7WebCore5Range11startOffsetERi
__ZNK7WebCore5Range12endContainerERi
__ZNK7WebCore5Range12pastLastNodeEv
diff --git a/WebCore/bindings/objc/DOM.mm b/WebCore/bindings/objc/DOM.mm
index 008acec..c526123 100644
--- a/WebCore/bindings/objc/DOM.mm
+++ b/WebCore/bindings/objc/DOM.mm
@@ -377,7 +377,7 @@ id <DOMEventTarget> kit(WebCore::EventTarget* eventTarget)
WebCore::Frame* frame = node->document()->frame();
if (!frame)
return nil;
- return frame->nodeImage(node);
+ return frame->nodeImage(node).get();
}
- (NSArray *)textRects
diff --git a/WebCore/page/Frame.h b/WebCore/page/Frame.h
index 4e522c4..36803f8 100644
--- a/WebCore/page/Frame.h
+++ b/WebCore/page/Frame.h
@@ -221,6 +221,7 @@ namespace WebCore {
void textWillBeDeletedInTextField(Element* input);
void textDidChangeInTextArea(Element*);
+ DragImageRef nodeImage(Node*);
DragImageRef dragImageForSelection();
// === to be moved into SelectionController
@@ -285,7 +286,6 @@ namespace WebCore {
NSImage* selectionImage(bool forceBlackText = false) const;
NSImage* snapshotDragImage(Node*, NSRect* imageRect, NSRect* elementRect) const;
- NSImage* nodeImage(Node*) const;
private:
NSImage* imageFromRect(NSRect) const;
@@ -298,14 +298,6 @@ namespace WebCore {
#endif
-#if PLATFORM(WIN)
-
- public:
- // FIXME - We should have a single version of nodeImage instead of using platform types.
- HBITMAP nodeImage(Node*) const;
-
-#endif
-
private:
Page* m_page;
mutable FrameTree m_treeNode;
diff --git a/WebCore/page/brew/FrameBrew.cpp b/WebCore/page/brew/FrameBrew.cpp
index a590544..7825dbd 100644
--- a/WebCore/page/brew/FrameBrew.cpp
+++ b/WebCore/page/brew/FrameBrew.cpp
@@ -29,6 +29,12 @@
namespace WebCore {
+DragImageRef Frame::nodeImage(Node*)
+{
+ notImplemented();
+ return 0;
+}
+
DragImageRef Frame::dragImageForSelection()
{
notImplemented();
diff --git a/WebCore/page/chromium/FrameChromium.cpp b/WebCore/page/chromium/FrameChromium.cpp
index 548e0fa..4146b39 100644
--- a/WebCore/page/chromium/FrameChromium.cpp
+++ b/WebCore/page/chromium/FrameChromium.cpp
@@ -28,19 +28,91 @@
#include "Document.h"
#include "FloatRect.h"
+#include "ImageBuffer.h"
#include "RenderView.h"
#include "Settings.h"
-using std::min;
-
namespace WebCore {
+namespace {
+
+struct ScopedState {
+ ScopedState(Frame* theFrame, RenderObject* theRenderer)
+ : frame(theFrame)
+ , renderer(theRenderer)
+ , paintBehavior(frame->view()->paintBehavior())
+ , backgroundColor(frame->view()->baseBackgroundColor())
+ {
+ }
+
+ ~ScopedState()
+ {
+ if (renderer)
+ renderer->updateDragState(false);
+ frame->view()->setPaintBehavior(paintBehavior);
+ frame->view()->setBaseBackgroundColor(backgroundColor);
+ frame->view()->setNodeToDraw(0);
+ }
+
+ Frame* frame;
+ RenderObject* renderer;
+ PaintBehavior paintBehavior;
+ Color backgroundColor;
+};
+
+} // namespace
+
+DragImageRef Frame::nodeImage(Node* node)
+{
+ RenderObject* renderer = node->renderer();
+ if (!renderer)
+ return 0;
+
+ const ScopedState state(this, renderer);
+
+ renderer->updateDragState(true);
+ m_view->setPaintBehavior(state.paintBehavior | PaintBehaviorFlattenCompositingLayers);
+ // When generating the drag image for an element, ignore the document background.
+ m_view->setBaseBackgroundColor(colorWithOverrideAlpha(Color::white, 1.0));
+ m_doc->updateLayout();
+ m_view->setNodeToDraw(node); // Enable special sub-tree drawing mode.
+
+ IntRect topLevelRect;
+ IntRect paintingRect = renderer->paintingRootRect(topLevelRect);
+
+ OwnPtr<ImageBuffer> buffer(ImageBuffer::create(paintingRect.size()));
+ if (!buffer)
+ return 0;
+ buffer->context()->translate(-paintingRect.x(), -paintingRect.y());
+ buffer->context()->clip(FloatRect(0, 0, paintingRect.right(), paintingRect.bottom()));
+
+ m_view->paint(buffer->context(), paintingRect);
+
+ RefPtr<Image> image = buffer->copyImage();
+ return createDragImageFromImage(image.get());
+}
+
DragImageRef Frame::dragImageForSelection()
-{
- if (selection()->isRange())
- return 0; // FIXME: implement me!
+{
+ if (!selection()->isRange())
+ return 0;
+
+ const ScopedState state(this, 0);
+ m_view->setPaintBehavior(PaintBehaviorSelectionOnly);
+ m_doc->updateLayout();
+
+ IntRect paintingRect = enclosingIntRect(selectionBounds());
+
+ OwnPtr<ImageBuffer> buffer(ImageBuffer::create(paintingRect.size()));
+ if (!buffer)
+ return 0;
+ buffer->context()->translate(-paintingRect.x(), -paintingRect.y());
+ buffer->context()->clip(FloatRect(0, 0, paintingRect.right(), paintingRect.bottom()));
+
+ m_view->paint(buffer->context(), paintingRect);
- return 0;
+ RefPtr<Image> image = buffer->copyImage();
+ return createDragImageFromImage(image.get());
}
} // namespace WebCore
diff --git a/WebCore/page/efl/FrameEfl.cpp b/WebCore/page/efl/FrameEfl.cpp
index 783df7e..b1be9ca 100644
--- a/WebCore/page/efl/FrameEfl.cpp
+++ b/WebCore/page/efl/FrameEfl.cpp
@@ -32,6 +32,12 @@
namespace WebCore {
+DragImageRef Frame::nodeImage(Node* node)
+{
+ notImplemented();
+ return 0;
+}
+
DragImageRef Frame::dragImageForSelection()
{
notImplemented();
diff --git a/WebCore/page/gtk/FrameGtk.cpp b/WebCore/page/gtk/FrameGtk.cpp
index 3cab5a0..14a0f8b 100644
--- a/WebCore/page/gtk/FrameGtk.cpp
+++ b/WebCore/page/gtk/FrameGtk.cpp
@@ -28,6 +28,12 @@
namespace WebCore {
+DragImageRef Frame::nodeImage(Node*)
+{
+ notImplemented();
+ return 0;
+}
+
DragImageRef Frame::dragImageForSelection()
{
notImplemented();
diff --git a/WebCore/page/haiku/FrameHaiku.cpp b/WebCore/page/haiku/FrameHaiku.cpp
index 50168dd..5ff6950 100644
--- a/WebCore/page/haiku/FrameHaiku.cpp
+++ b/WebCore/page/haiku/FrameHaiku.cpp
@@ -33,6 +33,12 @@
namespace WebCore {
+DragImageRef Frame::nodeImage(Node*)
+{
+ notImplemented();
+ return 0;
+}
+
DragImageRef Frame::dragImageForSelection()
{
notImplemented();
@@ -40,4 +46,3 @@ DragImageRef Frame::dragImageForSelection()
}
} // namespace WebCore
-
diff --git a/WebCore/page/mac/FrameMac.mm b/WebCore/page/mac/FrameMac.mm
index bb11ac9..0365784 100644
--- a/WebCore/page/mac/FrameMac.mm
+++ b/WebCore/page/mac/FrameMac.mm
@@ -380,7 +380,7 @@ NSImage* Frame::snapshotDragImage(Node* node, NSRect* imageRect, NSRect* element
return result;
}
-NSImage* Frame::nodeImage(Node* node) const
+DragImageRef Frame::nodeImage(Node* node)
{
RenderObject* renderer = node->renderer();
if (!renderer)
@@ -535,7 +535,7 @@ NSMutableDictionary* Frame::dashboardRegionsDictionary()
}
#endif
-DragImageRef Frame::dragImageForSelection()
+DragImageRef Frame::dragImageForSelection()
{
if (!selection()->isRange())
return nil;
diff --git a/WebCore/page/qt/FrameQt.cpp b/WebCore/page/qt/FrameQt.cpp
index 493e60d..ed75eb8 100644
--- a/WebCore/page/qt/FrameQt.cpp
+++ b/WebCore/page/qt/FrameQt.cpp
@@ -24,10 +24,19 @@
#include "config.h"
#include "Frame.h"
+#include "NotImplemented.h"
+
namespace WebCore {
-DragImageRef Frame::dragImageForSelection()
+DragImageRef Frame::nodeImage(Node*)
+{
+ notImplemented();
+ return 0;
+}
+
+DragImageRef Frame::dragImageForSelection()
{
+ notImplemented();
return 0;
}
diff --git a/WebCore/page/win/FrameCGWin.cpp b/WebCore/page/win/FrameCGWin.cpp
index cce5004..b61deef 100644
--- a/WebCore/page/win/FrameCGWin.cpp
+++ b/WebCore/page/win/FrameCGWin.cpp
@@ -95,7 +95,7 @@ HBITMAP imageFromSelection(Frame* frame, bool forceBlackText)
return image;
}
-HBITMAP Frame::nodeImage(Node* node) const
+DragImageRef Frame::nodeImage(Node* node)
{
RenderObject* renderer = node->renderer();
if (!renderer)
diff --git a/WebCore/page/win/FrameCairoWin.cpp b/WebCore/page/win/FrameCairoWin.cpp
index 3e1fe28..f843ba1 100644
--- a/WebCore/page/win/FrameCairoWin.cpp
+++ b/WebCore/page/win/FrameCairoWin.cpp
@@ -40,7 +40,7 @@ HBITMAP imageFromSelection(Frame* frame, bool forceBlackText)
return 0;
}
-HBITMAP Frame::nodeImage(Node*) const
+DragImageRef Frame::nodeImage(Node*)
{
notImplemented();
return 0;
diff --git a/WebCore/page/wince/FrameWince.cpp b/WebCore/page/wince/FrameWince.cpp
index c806b98..7cfbae0 100644
--- a/WebCore/page/wince/FrameWince.cpp
+++ b/WebCore/page/wince/FrameWince.cpp
@@ -35,6 +35,7 @@
#include "HTMLNames.h"
#include "HTMLTableCellElement.h"
#include "KeyboardEvent.h"
+#include "NotImplemented.h"
#include "Page.h"
#include "RenderFrame.h"
#include "RenderLayer.h"
@@ -147,6 +148,12 @@ HBITMAP imageFromSelection(Frame* frame, bool forceBlackText)
return hBmp;
}
+DragImageRef Frame::nodeImage(Node*)
+{
+ notImplemented();
+ return 0;
+}
+
DragImageRef Frame::dragImageForSelection()
{
if (selection()->isRange())
diff --git a/WebCore/page/wx/FrameWx.cpp b/WebCore/page/wx/FrameWx.cpp
index b220694..6c16adc 100644
--- a/WebCore/page/wx/FrameWx.cpp
+++ b/WebCore/page/wx/FrameWx.cpp
@@ -29,6 +29,12 @@
namespace WebCore {
+DragImageRef Frame::nodeImage(Node*)
+{
+ notImplemented();
+ return 0;
+}
+
DragImageRef Frame::dragImageForSelection()
{
notImplemented();
diff --git a/WebCore/platform/chromium/ClipboardChromium.cpp b/WebCore/platform/chromium/ClipboardChromium.cpp
index 06244a2..23508a6 100644
--- a/WebCore/platform/chromium/ClipboardChromium.cpp
+++ b/WebCore/platform/chromium/ClipboardChromium.cpp
@@ -400,7 +400,12 @@ void ClipboardChromium::setDragImageElement(Node* node, const IntPoint& loc)
DragImageRef ClipboardChromium::createDragImage(IntPoint& loc) const
{
DragImageRef result = 0;
- if (m_dragImage) {
+ if (m_dragImageElement) {
+ if (m_frame) {
+ result = m_frame->nodeImage(m_dragImageElement.get());
+ loc = m_dragLoc;
+ }
+ } else if (m_dragImage) {
result = createDragImageFromImage(m_dragImage->image());
loc = m_dragLoc;
}
diff --git a/WebCore/rendering/RenderObject.cpp b/WebCore/rendering/RenderObject.cpp
index 27eabcd..11b4374 100644
--- a/WebCore/rendering/RenderObject.cpp
+++ b/WebCore/rendering/RenderObject.cpp
@@ -1591,7 +1591,10 @@ Color RenderObject::selectionBackgroundColor() const
Color RenderObject::selectionForegroundColor() const
{
Color color;
- if (style()->userSelect() == SELECT_NONE)
+ // If the element is unselectable, or we are only painting the selection,
+ // don't override the foreground color with the selection foreground color.
+ if (style()->userSelect() == SELECT_NONE
+ || (frame()->view()->paintBehavior() & PaintBehaviorSelectionOnly))
return color;
if (RefPtr<RenderStyle> pseudoStyle = getUncachedPseudoStyle(SELECTION)) {
diff --git a/WebKit/mac/ChangeLog b/WebKit/mac/ChangeLog
index 3afbe74..f89b7b1 100644
--- a/WebKit/mac/ChangeLog
+++ b/WebKit/mac/ChangeLog
@@ -1,3 +1,15 @@
+2010-08-24 Daniel Cheng <dcheng at chromium.org>
+
+ Reviewed by Eric Seidel.
+
+ [chromium] Generate drag images for HTML elements and selections.
+ https://bugs.webkit.org/show_bug.cgi?id=43449
+
+ Fix up calls to Frame::nodeImage, which has a new signature.
+
+ * Plugins/WebBaseNetscapePluginView.mm:
+ (-[WebBaseNetscapePluginView halt]):
+
2010-08-23 Mike Thole <mthole at apple.com>
Reviewed by Dan Bernstein.
diff --git a/WebKit/mac/Plugins/WebBaseNetscapePluginView.mm b/WebKit/mac/Plugins/WebBaseNetscapePluginView.mm
index 6ae7334..4966716 100644
--- a/WebKit/mac/Plugins/WebBaseNetscapePluginView.mm
+++ b/WebKit/mac/Plugins/WebBaseNetscapePluginView.mm
@@ -510,9 +510,9 @@ String WebHaltablePlugin::pluginName() const
ASSERT(_isStarted);
Element *element = [self element];
#if !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD)
- CGImageRef cgImage = CGImageRetain([core([self webFrame])->nodeImage(element) CGImageForProposedRect:nil context:nil hints:nil]);
+ CGImageRef cgImage = CGImageRetain([core([self webFrame])->nodeImage(element).get() CGImageForProposedRect:nil context:nil hints:nil]);
#else
- RetainPtr<CGImageSourceRef> imageRef(AdoptCF, CGImageSourceCreateWithData((CFDataRef)[core([self webFrame])->nodeImage(element) TIFFRepresentation], 0));
+ RetainPtr<CGImageSourceRef> imageRef(AdoptCF, CGImageSourceCreateWithData((CFDataRef)[core([self webFrame])->nodeImage(element).get() TIFFRepresentation], 0));
CGImageRef cgImage = CGImageSourceCreateImageAtIndex(imageRef.get(), 0, 0);
#endif
ASSERT(cgImage);
--
WebKit Debian packaging
More information about the Pkg-webkit-commits
mailing list