fix most of the issues I found with Clipboard and DnD.
authorhausmann <hausmann@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 31 Oct 2007 11:08:50 +0000 (11:08 +0000)
committerhausmann <hausmann@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 31 Oct 2007 11:08:50 +0000 (11:08 +0000)
git-svn-id: https://svn.webkit.org/repository/webkit/trunk@27312 268f45cc-cd09-0410-ab3c-d52691b4dbfc

WebCore/ChangeLog
WebCore/editing/qt/EditorQt.cpp
WebCore/platform/qt/ClipboardQt.cpp
WebCore/platform/qt/ClipboardQt.h
WebCore/platform/qt/DragDataQt.cpp
WebKit/qt/Api/qwebpage.cpp
WebKit/qt/ChangeLog

index d7e43591db94d0902ca68ca216bb762e7bcc5aa4..821c70115423641e573d9699df55e0f47b0226c5 100644 (file)
@@ -1,3 +1,30 @@
+2007-10-31  Lars Knoll  <lars@trolltech.com>
+
+        Reviewed by Simon.
+
+        fix most of the issues I found with Clipboard and DnD.
+
+        WARNING: NO TEST CASES ADDED OR CHANGED
+
+        * editing/qt/EditorQt.cpp:
+        * platform/qt/ClipboardQt.cpp:
+        (WebCore::ClipboardQt::ClipboardQt):
+        (WebCore::ClipboardQt::~ClipboardQt):
+        (WebCore::ClipboardQt::clearData):
+        (WebCore::ClipboardQt::clearAllData):
+        (WebCore::ClipboardQt::getData):
+        (WebCore::ClipboardQt::setData):
+        (WebCore::ClipboardQt::types):
+        (WebCore::ClipboardQt::setDragImage):
+        (WebCore::ClipboardQt::setDragImageElement):
+        (WebCore::ClipboardQt::declareAndWriteDragImage):
+        (WebCore::ClipboardQt::writeURL):
+        (WebCore::ClipboardQt::writeRange):
+        (WebCore::ClipboardQt::hasData):
+        * platform/qt/ClipboardQt.h:
+        * platform/qt/DragDataQt.cpp:
+        (WebCore::DragData::asURL):
+
 2007-10-30  Mark Rowe  <mrowe@apple.com>
 
         Fix the Gtk and Qt builds by stubbing out PlatformKeyboardEvent::currentCapsLockState.
index 2f833cc3a3e1fbd44ef815a6cfa3b6d8a6fc5088..5f12450daea84461a6d212e195082348d5f5e762 100644 (file)
 #include "htmlediting.h"
 #include "visible_units.h"
 
-#include <QApplication>
-#include <QClipboard>
-
 namespace WebCore {
 
 PassRefPtr<Clipboard> Editor::newGeneralClipboard(ClipboardAccessPolicy policy)
 {
-    return new ClipboardQt(policy, QApplication::clipboard()->mimeData(), false); 
+    return new ClipboardQt(policy);
 }
 
 } // namespace WebCore
index 9242ff6344ed9975c5711db827414c2d61ce1431..c092e3c95592e399f632868d5ce624891fc2ed6f 100644 (file)
 #include <QMimeData>
 #include <QStringList>
 #include <QUrl>
+#include <QApplication>
+#include <QClipboard>
 
 
+#define methodDebug() qDebug("ClipboardQt: %s", __FUNCTION__)
+
 namespace WebCore {
     
-ClipboardQt::ClipboardQt(ClipboardAccessPolicy policy, const QMimeData* readableClipboard, bool forDragging)
-    : Clipboard(policy, forDragging)
+ClipboardQt::ClipboardQt(ClipboardAccessPolicy policy, const QMimeData* readableClipboard)
+    : Clipboard(policy, true)
     , m_readableData(readableClipboard)
     , m_writableData(0)
-{
-    ASSERT(m_readableData);
+{ 
+    Q_ASSERT(policy == ClipboardReadable || policy == ClipboardTypesReadable);
 }    
 
 ClipboardQt::ClipboardQt(ClipboardAccessPolicy policy, bool forDragging)
     : Clipboard(policy, forDragging)
+    , m_readableData(0)
+    , m_writableData(0)
 {
-    m_writableData = new QMimeData();
-    m_readableData = m_writableData;    
+    Q_ASSERT(policy == ClipboardReadable || policy == ClipboardWritable || policy == ClipboardNumb);
+
+    if (policy == ClipboardWritable) {
+        m_writableData = new QMimeData();
+    } else {
+        Q_ASSERT(!forDragging);
+        m_readableData = QApplication::clipboard()->mimeData();
+    } 
 }
 
 ClipboardQt::~ClipboardQt()
 {
-    delete m_writableData;
+    if (m_writableData && !isForDragging())
+        QApplication::clipboard()->setMimeData(m_writableData);
+    else
+        delete m_writableData;
     m_readableData = 0;
 }
 
 void ClipboardQt::clearData(const String& type)
 {
+    if (policy() != ClipboardWritable)
+        return;
+
     ASSERT(m_writableData);
     notImplemented();
 }
 
 void ClipboardQt::clearAllData() 
 {
+    if (policy() != ClipboardWritable)
+        return;
+    
     ASSERT(m_writableData);
     m_writableData->clear();
 }
 
 String ClipboardQt::getData(const String& type, bool& success) const 
 {
-    ASSERT(m_writableData);
+
+    if (policy() != ClipboardReadable)
+        return String();
+    
+    ASSERT(m_readableData);
     QByteArray data = m_writableData->data(QString(type));
     success = !data.isEmpty();
     return String(data.data(), data.size());
@@ -86,6 +111,9 @@ String ClipboardQt::getData(const String& type, bool& success) const
 
 bool ClipboardQt::setData(const String& type, const String& data) 
 {
+    if (policy() != ClipboardWritable)
+        return false;
+    
     ASSERT(m_writableData);
     QByteArray array(reinterpret_cast<const char*>(data.characters()),
                      data.length());
@@ -96,40 +124,30 @@ bool ClipboardQt::setData(const String& type, const String& data)
 // extensions beyond IE's API
 HashSet<String> ClipboardQt::types() const
 {
+    if (policy() != ClipboardReadable && policy() != ClipboardTypesReadable)
+        return HashSet<String>();
+
+    ASSERT(m_readableData);
     HashSet<String> result;
-    QStringList formats = m_writableData->formats();
-    for (int i = 0; i < formats.count(); ++i) {
-        String type(formats.at(i).toLatin1().data());
-        result.add(type);
-    }
+    QStringList formats = m_readableData->formats();
+    for (int i = 0; i < formats.count(); ++i)
+        result.add(formats.at(i));
     return result;
 }
 
-IntPoint ClipboardQt::dragLocation() const 
-{ 
-    notImplemented();
-    return IntPoint(0,0);
-}
-
-CachedImage* ClipboardQt::dragImage() const 
-{
-    notImplemented();
-    return 0; 
-}
-
 void ClipboardQt::setDragImage(CachedImage*, const IntPoint&) 
 {
-    notImplemented();
-}
+    if (policy() != ClipboardImageWritable && policy() != ClipboardWritable)
+        return;
 
-Node* ClipboardQt::dragImageElement() 
-{
     notImplemented();
-    return 0; 
 }
 
 void ClipboardQt::setDragImageElement(Node*, const IntPoint&)
 {
+    if (policy() != ClipboardImageWritable && policy() != ClipboardWritable)
+        return;
+
     notImplemented();
 }
 
@@ -139,30 +157,40 @@ DragImageRef ClipboardQt::createDragImage(IntPoint& dragLoc) const
     return 0;
 }
 
-void ClipboardQt::declareAndWriteDragImage(Element*, const KURL&, const String&, Frame*) 
+void ClipboardQt::declareAndWriteDragImage(Element*, const KURL&, const String&, Frame* frame
 {
+    ASSERT(frame);
     ASSERT(m_writableData);
+
     notImplemented();
 }
 
 void ClipboardQt::writeURL(const KURL& url, const String&, Frame* frame) 
 {
+    ASSERT(frame);
     ASSERT(m_writableData);
+    
     QList<QUrl> urls;
     urls.append(QUrl(frame->document()->completeURL(url.url())));
     m_writableData->setUrls(urls);
 }
 
-void ClipboardQt::writeRange(Range* range, Frame*) 
+void ClipboardQt::writeRange(Range* range, Frame* frame
 {
+    ASSERT(range);
+    ASSERT(frame);
     ASSERT(m_writableData);
+    
     m_writableData->setText(range->text());
     m_writableData->setHtml(range->toHTML());
 }
 
 bool ClipboardQt::hasData() 
 {
-    return m_readableData->formats().count() > 0;
+    const QMimeData *data = m_readableData ? m_readableData : m_writableData;
+    if (!data)
+        return false;
+    return data->formats().count() > 0;
 }
 
 }
index dea1501fa9688f3f119a8dea47c5995e46f1943b..0063b4e0dd75a3ddebf9b8b153b555c9b694c296 100644 (file)
@@ -38,10 +38,10 @@ namespace WebCore {
     // State available during IE's events for drag and drop and copy/paste
     class ClipboardQt : public Clipboard {
     public:
-        ClipboardQt(ClipboardAccessPolicy policy, const QMimeData* readableClipboard, bool forDragging);
+        ClipboardQt(ClipboardAccessPolicy policy, const QMimeData* readableClipboard);
         
         // Clipboard is writable so it will create its own QMimeData object
-        ClipboardQt(ClipboardAccessPolicy policy, bool forDragging);
+        ClipboardQt(ClipboardAccessPolicy policy, bool forDragging = false);
         ~ClipboardQt();
     
         void clearData(const String& type);
@@ -52,10 +52,7 @@ namespace WebCore {
         // extensions beyond IE's API
         HashSet<String> types() const;
     
-        IntPoint dragLocation() const;
-        CachedImage* dragImage() const;
         void setDragImage(CachedImage*, const IntPoint&);
-        Node* dragImageElement();
         void setDragImageElement(Node*, const IntPoint&);
 
         virtual DragImageRef createDragImage(IntPoint& dragLoc) const;
index 1c93d099c74e0dc21f307ffbfdbb3727fa6f3bf9..5e79801d862cd75be540b9a7d9b2f44166a3ca47 100644 (file)
@@ -104,7 +104,7 @@ Color DragData::asColor() const
 
 Clipboard* DragData::createClipboard(ClipboardAccessPolicy policy) const
 {
-    return new ClipboardQt(policy, m_platformDragData, true);
+    return new ClipboardQt(policy, m_platformDragData);
 }
     
 bool DragData::containsCompatibleContent() const
@@ -123,6 +123,8 @@ bool DragData::containsURL() const
     
 String DragData::asURL(String* title) const
 {
+    if (!m_platformDragData)
+        return String();
     QList<QUrl> urls = m_platformDragData->urls();
     return urls.first().toString();
 }
index 6d04d8747c9a827680a9d98d2591115b0c65d4af..b62a1239fab16fc44aa2d5212af4ecaec158c12f 100644 (file)
@@ -602,7 +602,11 @@ void QWebPage::dragEnterEvent(QDragEnterEvent *ev)
 
 void QWebPage::dragLeaveEvent(QDragLeaveEvent *ev)
 {
-    // nothing to do here for the moment
+#ifndef QT_NO_DRAGANDDROP
+    DragData dragData(0, IntPoint(), QCursor::pos(), DragOperationNone);
+    d->page->dragController()->dragExited(&dragData);
+    ev->accept();
+#endif
 }
 
 void QWebPage::dragMoveEvent(QDragMoveEvent *ev)
index 7b442335e8a41529ee51171a2ed45b6652e610c8..5616f35d615fe3abf74204901b2bbdb88715433e 100644 (file)
@@ -1,3 +1,12 @@
+2007-10-31  Lars Knoll  <lars@trolltech.com>
+
+        Reviewed by Simon.
+
+        fix most of the issues I found with Clipboard and DnD.
+
+        * Api/qwebpage.cpp:
+        (QWebPage::dragLeaveEvent):
+
 2007-10-31  Lars Knoll  <lars@trolltech.com>
 
         Reviewed by Simon.