[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