Changeset 65904 in webkit


Ignore:
Timestamp:
Aug 24, 2010 9:06:36 AM (14 years ago)
Author:
commit-queue@webkit.org
Message:

2010-08-24 Daniel Cheng <dcheng@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@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]):
Location:
trunk
Files:
19 edited

Legend:

Unmodified
Added
Removed
  • trunk/WebCore/ChangeLog

    r65902 r65904  
     12010-08-24  Daniel Cheng  <dcheng@chromium.org>
     2
     3        Reviewed by Eric Seidel.
     4
     5        [chromium] Generate drag images for HTML elements and selections.
     6        https://bugs.webkit.org/show_bug.cgi?id=43449
     7
     8        We weren't properly generating drag images if an HTML element was set
     9        as the drag feedback image. I also implemented dragImageForSelection
     10        while I was working on this part of the code.
     11
     12        No new tests.
     13
     14        * WebCore.exp.in:
     15        * bindings/objc/DOM.mm:
     16        (-[DOMNode renderedImage]):
     17        * page/Frame.h:
     18        * page/brew/FrameBrew.cpp:
     19        (WebCore::Frame::nodeImage):
     20        * page/chromium/FrameChromium.cpp:
     21        (WebCore::):
     22        (WebCore::Frame::nodeImage):
     23        (WebCore::Frame::dragImageForSelection):
     24        * page/efl/FrameEfl.cpp:
     25        (WebCore::Frame::nodeImage):
     26        * page/gtk/FrameGtk.cpp:
     27        (WebCore::Frame::nodeImage):
     28        * page/haiku/FrameHaiku.cpp:
     29        (WebCore::Frame::nodeImage):
     30        * page/mac/FrameMac.mm:
     31        (WebCore::Frame::nodeImage):
     32        (WebCore::Frame::dragImageForSelection):
     33        * page/qt/FrameQt.cpp:
     34        (WebCore::Frame::nodeImage):
     35        (WebCore::Frame::dragImageForSelection):
     36        * page/win/FrameCGWin.cpp:
     37        (WebCore::Frame::nodeImage):
     38        * page/win/FrameCairoWin.cpp:
     39        (WebCore::Frame::nodeImage):
     40        * page/wince/FrameWince.cpp:
     41        (WebCore::Frame::nodeImage):
     42        * page/wx/FrameWx.cpp:
     43        (WebCore::Frame::nodeImage):
     44        * platform/chromium/ClipboardChromium.cpp:
     45        (WebCore::ClipboardChromium::createDragImage):
     46        * rendering/RenderObject.cpp:
     47        (WebCore::RenderObject::selectionForegroundColor):
     48
    1492010-08-24  Jeremy Orlow  <jorlow@chromium.org>
    250
  • trunk/WebCore/WebCore.exp.in

    r65797 r65904  
    591591__ZN7WebCore5Frame6createEPNS_4PageEPNS_21HTMLFrameOwnerElementEPNS_17FrameLoaderClientE
    592592__ZN7WebCore5Frame7setViewEN3WTF10PassRefPtrINS_9FrameViewEEE
     593__ZN7WebCore5Frame9nodeImageEPNS_4NodeE
    593594__ZN7WebCore5FrameD1Ev
    594595__ZN7WebCore5Image12supportsTypeERKN3WTF6StringE
     
    996997__ZNK7WebCore5Frame8settingsEv
    997998__ZNK7WebCore5Frame9domWindowEv
    998 __ZNK7WebCore5Frame9nodeImageEPNS_4NodeE
    999999__ZNK7WebCore5Range11startOffsetERi
    10001000__ZNK7WebCore5Range12endContainerERi
  • trunk/WebCore/bindings/objc/DOM.mm

    r62092 r65904  
    378378    if (!frame)
    379379        return nil;
    380     return frame->nodeImage(node);
     380    return frame->nodeImage(node).get();
    381381}
    382382
  • trunk/WebCore/page/Frame.h

    r64409 r65904  
    222222        void textDidChangeInTextArea(Element*);
    223223
     224        DragImageRef nodeImage(Node*);
    224225        DragImageRef dragImageForSelection();
    225226
     
    286287        NSImage* selectionImage(bool forceBlackText = false) const;
    287288        NSImage* snapshotDragImage(Node*, NSRect* imageRect, NSRect* elementRect) const;
    288         NSImage* nodeImage(Node*) const;
    289289
    290290    private:
     
    296296        NSDictionary* fontAttributesForSelectionStart() const;
    297297        NSWritingDirection baseWritingDirectionForSelectionStart() const;
    298 
    299 #endif
    300 
    301 #if PLATFORM(WIN)
    302 
    303     public:
    304         // FIXME - We should have a single version of nodeImage instead of using platform types.
    305         HBITMAP nodeImage(Node*) const;
    306298
    307299#endif
  • trunk/WebCore/page/brew/FrameBrew.cpp

    r54632 r65904  
    3030namespace WebCore {
    3131
     32DragImageRef Frame::nodeImage(Node*)
     33{
     34    notImplemented();
     35    return 0;
     36}
     37
    3238DragImageRef Frame::dragImageForSelection()
    3339{
  • trunk/WebCore/page/chromium/FrameChromium.cpp

    r53527 r65904  
    2929#include "Document.h"
    3030#include "FloatRect.h"
     31#include "ImageBuffer.h"
    3132#include "RenderView.h"
    3233#include "Settings.h"
    3334
    34 using std::min;
    35 
    3635namespace WebCore {
    3736
     37namespace {
     38
     39struct ScopedState {
     40    ScopedState(Frame* theFrame, RenderObject* theRenderer)
     41        : frame(theFrame)
     42        , renderer(theRenderer)
     43        , paintBehavior(frame->view()->paintBehavior())
     44        , backgroundColor(frame->view()->baseBackgroundColor())
     45    {
     46    }
     47
     48    ~ScopedState()
     49    {
     50        if (renderer)
     51            renderer->updateDragState(false);
     52        frame->view()->setPaintBehavior(paintBehavior);
     53        frame->view()->setBaseBackgroundColor(backgroundColor);
     54        frame->view()->setNodeToDraw(0);
     55    }
     56
     57    Frame* frame;
     58    RenderObject* renderer;
     59    PaintBehavior paintBehavior;
     60    Color backgroundColor;
     61};
     62
     63} // namespace
     64
     65DragImageRef Frame::nodeImage(Node* node)
     66{
     67    RenderObject* renderer = node->renderer();
     68    if (!renderer)
     69        return 0;
     70
     71    const ScopedState state(this, renderer);
     72
     73    renderer->updateDragState(true);
     74    m_view->setPaintBehavior(state.paintBehavior | PaintBehaviorFlattenCompositingLayers);
     75    // When generating the drag image for an element, ignore the document background.
     76    m_view->setBaseBackgroundColor(colorWithOverrideAlpha(Color::white, 1.0));
     77    m_doc->updateLayout();
     78    m_view->setNodeToDraw(node); // Enable special sub-tree drawing mode.
     79
     80    IntRect topLevelRect;
     81    IntRect paintingRect = renderer->paintingRootRect(topLevelRect);
     82
     83    OwnPtr<ImageBuffer> buffer(ImageBuffer::create(paintingRect.size()));
     84    if (!buffer)
     85        return 0;
     86    buffer->context()->translate(-paintingRect.x(), -paintingRect.y());
     87    buffer->context()->clip(FloatRect(0, 0, paintingRect.right(), paintingRect.bottom()));
     88
     89    m_view->paint(buffer->context(), paintingRect);
     90
     91    RefPtr<Image> image = buffer->copyImage();
     92    return createDragImageFromImage(image.get());
     93}
     94
    3895DragImageRef Frame::dragImageForSelection()
    39 {   
    40     if (selection()->isRange())
    41         return 0;  // FIXME: implement me!
     96{
     97    if (!selection()->isRange())
     98        return 0;
    4299
    43     return 0;
     100    const ScopedState state(this, 0);
     101    m_view->setPaintBehavior(PaintBehaviorSelectionOnly);
     102    m_doc->updateLayout();
     103
     104    IntRect paintingRect = enclosingIntRect(selectionBounds());
     105
     106    OwnPtr<ImageBuffer> buffer(ImageBuffer::create(paintingRect.size()));
     107    if (!buffer)
     108        return 0;
     109    buffer->context()->translate(-paintingRect.x(), -paintingRect.y());
     110    buffer->context()->clip(FloatRect(0, 0, paintingRect.right(), paintingRect.bottom()));
     111
     112    m_view->paint(buffer->context(), paintingRect);
     113
     114    RefPtr<Image> image = buffer->copyImage();
     115    return createDragImageFromImage(image.get());
    44116}
    45117
  • trunk/WebCore/page/efl/FrameEfl.cpp

    r55343 r65904  
    3333namespace WebCore {
    3434
     35DragImageRef Frame::nodeImage(Node* node)
     36{
     37    notImplemented();
     38    return 0;
     39}
     40
    3541DragImageRef Frame::dragImageForSelection()
    3642{
  • trunk/WebCore/page/gtk/FrameGtk.cpp

    r35590 r65904  
    2929namespace WebCore {
    3030
     31DragImageRef Frame::nodeImage(Node*)
     32{
     33    notImplemented();
     34    return 0;
     35}
     36
    3137DragImageRef Frame::dragImageForSelection()
    3238{
  • trunk/WebCore/page/haiku/FrameHaiku.cpp

    r46011 r65904  
    3434namespace WebCore {
    3535
     36DragImageRef Frame::nodeImage(Node*)
     37{
     38    notImplemented();
     39    return 0;
     40}
     41
    3642DragImageRef Frame::dragImageForSelection()
    3743{
     
    4147
    4248} // namespace WebCore
    43 
  • trunk/WebCore/page/mac/FrameMac.mm

    r59956 r65904  
    381381}
    382382
    383 NSImage* Frame::nodeImage(Node* node) const
     383DragImageRef Frame::nodeImage(Node* node)
    384384{
    385385    RenderObject* renderer = node->renderer();
     
    536536#endif
    537537
    538 DragImageRef Frame::dragImageForSelection() 
     538DragImageRef Frame::dragImageForSelection()
    539539{
    540540    if (!selection()->isRange())
  • trunk/WebCore/page/qt/FrameQt.cpp

    r48082 r65904  
    2525#include "Frame.h"
    2626
     27#include "NotImplemented.h"
     28
    2729namespace WebCore {
    2830
    29 DragImageRef Frame::dragImageForSelection()
     31DragImageRef Frame::nodeImage(Node*)
    3032{
     33    notImplemented();
     34    return 0;
     35}
     36
     37DragImageRef Frame::dragImageForSelection()
     38{
     39    notImplemented();
    3140    return 0;
    3241}
  • trunk/WebCore/page/win/FrameCGWin.cpp

    r54505 r65904  
    9696}
    9797
    98 HBITMAP Frame::nodeImage(Node* node) const
     98DragImageRef Frame::nodeImage(Node* node)
    9999{
    100100    RenderObject* renderer = node->renderer();
  • trunk/WebCore/page/win/FrameCairoWin.cpp

    r52369 r65904  
    4141}
    4242
    43 HBITMAP Frame::nodeImage(Node*) const
     43DragImageRef Frame::nodeImage(Node*)
    4444{
    4545    notImplemented();
  • trunk/WebCore/page/wince/FrameWince.cpp

    r62963 r65904  
    3636#include "HTMLTableCellElement.h"
    3737#include "KeyboardEvent.h"
     38#include "NotImplemented.h"
    3839#include "Page.h"
    3940#include "RenderFrame.h"
     
    148149}
    149150
     151DragImageRef Frame::nodeImage(Node*)
     152{
     153    notImplemented();
     154    return 0;
     155}
     156
    150157DragImageRef Frame::dragImageForSelection()
    151158{
  • trunk/WebCore/page/wx/FrameWx.cpp

    r48352 r65904  
    3030namespace WebCore {
    3131
     32DragImageRef Frame::nodeImage(Node*)
     33{
     34    notImplemented();
     35    return 0;
     36}
     37
    3238DragImageRef Frame::dragImageForSelection()
    3339{
  • trunk/WebCore/platform/chromium/ClipboardChromium.cpp

    r64152 r65904  
    401401{
    402402    DragImageRef result = 0;
    403     if (m_dragImage) {
     403    if (m_dragImageElement) {
     404        if (m_frame) {
     405            result = m_frame->nodeImage(m_dragImageElement.get());
     406            loc = m_dragLoc;
     407        }
     408    } else if (m_dragImage) {
    404409        result = createDragImageFromImage(m_dragImage->image());
    405410        loc = m_dragLoc;
  • trunk/WebCore/rendering/RenderObject.cpp

    r63419 r65904  
    15921592{
    15931593    Color color;
    1594     if (style()->userSelect() == SELECT_NONE)
     1594    // If the element is unselectable, or we are only painting the selection,
     1595    // don't override the foreground color with the selection foreground color.
     1596    if (style()->userSelect() == SELECT_NONE
     1597        || (frame()->view()->paintBehavior() & PaintBehaviorSelectionOnly))
    15951598        return color;
    15961599
  • trunk/WebKit/mac/ChangeLog

    r65820 r65904  
     12010-08-24  Daniel Cheng  <dcheng@chromium.org>
     2
     3        Reviewed by Eric Seidel.
     4
     5        [chromium] Generate drag images for HTML elements and selections.
     6        https://bugs.webkit.org/show_bug.cgi?id=43449
     7
     8        Fix up calls to Frame::nodeImage, which has a new signature.
     9
     10        * Plugins/WebBaseNetscapePluginView.mm:
     11        (-[WebBaseNetscapePluginView halt]):
     12
    1132010-08-23  Mike Thole  <mthole@apple.com>
    214
  • trunk/WebKit/mac/Plugins/WebBaseNetscapePluginView.mm

    r63638 r65904  
    511511    Element *element = [self element];
    512512#if !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD)
    513     CGImageRef cgImage = CGImageRetain([core([self webFrame])->nodeImage(element) CGImageForProposedRect:nil context:nil hints:nil]);
     513    CGImageRef cgImage = CGImageRetain([core([self webFrame])->nodeImage(element).get() CGImageForProposedRect:nil context:nil hints:nil]);
    514514#else
    515     RetainPtr<CGImageSourceRef> imageRef(AdoptCF, CGImageSourceCreateWithData((CFDataRef)[core([self webFrame])->nodeImage(element) TIFFRepresentation], 0));
     515    RetainPtr<CGImageSourceRef> imageRef(AdoptCF, CGImageSourceCreateWithData((CFDataRef)[core([self webFrame])->nodeImage(element).get() TIFFRepresentation], 0));
    516516    CGImageRef cgImage = CGImageSourceCreateImageAtIndex(imageRef.get(), 0, 0);
    517517#endif
Note: See TracChangeset for help on using the changeset viewer.