Title: [173686] trunk/Source
Revision
173686
Author
carlo...@webkit.org
Date
2014-09-16 23:27:46 -0700 (Tue, 16 Sep 2014)

Log Message

DragData should not depend on Clipboard, DocumentFragment, and Document
https://bugs.webkit.org/show_bug.cgi?id=21358

Reviewed by Darin Adler.

Source/WebCore:

Refactor DragData to not depend on Frame, DocumentFragment,
Document and Range. DragData::asFragment() has been moved to
DragController and implemented in the platform specific file.
DragData methods using Frame has been reworked in Mac to not use
Frame, since all other ports were ignoreing the frame parameter.

* page/DragController.cpp:
(WebCore::DragController::documentFragmentFromDragData): Make it
a static member to be able to use createFragmentFromDragData().
(WebCore::DragController::performDragOperation): Update to
DragData API changes.
(WebCore::DragController::dispatchTextInputEventFor): Ditto.
(WebCore::DragController::concludeEditDrag): Ditto.
(WebCore::documentFragmentFromDragData): Deleted.
* page/DragController.h:
* page/efl/DragControllerEfl.cpp:
(WebCore::DragController::createFragmentFromDragData): Move
DragData::asFragment() implementation here.
* page/gtk/DragControllerGtk.cpp:
(WebCore::DragController::dragOperation):
(WebCore::DragController::createFragmentFromDragData): Ditto.
* page/mac/DragControllerMac.mm:
(WebCore::DragController::dragOperation):
(WebCore::DragController::createFragmentFromDragData): Ditto.
* page/win/DragControllerWin.cpp:
(WebCore::DragController::createFragmentFromDragData): Ditto.
* platform/DragData.h:
* platform/efl/DragDataEfl.cpp:
(WebCore::DragData::asPlainText): Remove Frame parameter.
(WebCore::DragData::containsURL): Ditto.
(WebCore::DragData::asURL): Ditto.
(WebCore::DragData::asFragment): Deleted.
* platform/gtk/DragDataGtk.cpp:
(WebCore::DragData::asPlainText): Remove Frame parameter.
(WebCore::DragData::containsCompatibleContent):
(WebCore::DragData::containsURL): Ditto.
(WebCore::DragData::asURL): Ditto.
(WebCore::DragData::asFragment): Deleted.
* platform/mac/DragDataMac.mm:
(WebCore::DragData::asPlainText): Same implementation as the
Editor.
(WebCore::DragData::containsURL): Remove Frame parameter.
(WebCore::DragData::asURL): Use URLByCanonicalizingURL() instead
of using the Editor client.
(WebCore::DragData::asFragment): Deleted.
* platform/win/DragDataWin.cpp:
(WebCore::DragData::containsURL): Remove Frame parameter.
(WebCore::DragData::asURL): Ditto.
(WebCore::DragData::asPlainText): Ditto.
(WebCore::DragData::containsCompatibleContent):
(WebCore::DragData::asFragment): Deleted.

Source/WebKit2:

* UIProcess/WebPageProxy.cpp:
(WebKit::WebPageProxy::performDragControllerAction): Update to API
change in DragData::asURL().

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (173685 => 173686)


--- trunk/Source/WebCore/ChangeLog	2014-09-17 04:32:32 UTC (rev 173685)
+++ trunk/Source/WebCore/ChangeLog	2014-09-17 06:27:46 UTC (rev 173686)
@@ -1,3 +1,62 @@
+2014-09-16  Carlos Garcia Campos  <cgar...@igalia.com>
+
+        DragData should not depend on Clipboard, DocumentFragment, and Document
+        https://bugs.webkit.org/show_bug.cgi?id=21358
+
+        Reviewed by Darin Adler.
+
+        Refactor DragData to not depend on Frame, DocumentFragment,
+        Document and Range. DragData::asFragment() has been moved to
+        DragController and implemented in the platform specific file.
+        DragData methods using Frame has been reworked in Mac to not use
+        Frame, since all other ports were ignoreing the frame parameter.
+
+        * page/DragController.cpp:
+        (WebCore::DragController::documentFragmentFromDragData): Make it
+        a static member to be able to use createFragmentFromDragData().
+        (WebCore::DragController::performDragOperation): Update to
+        DragData API changes.
+        (WebCore::DragController::dispatchTextInputEventFor): Ditto.
+        (WebCore::DragController::concludeEditDrag): Ditto.
+        (WebCore::documentFragmentFromDragData): Deleted.
+        * page/DragController.h:
+        * page/efl/DragControllerEfl.cpp:
+        (WebCore::DragController::createFragmentFromDragData): Move
+        DragData::asFragment() implementation here.
+        * page/gtk/DragControllerGtk.cpp:
+        (WebCore::DragController::dragOperation):
+        (WebCore::DragController::createFragmentFromDragData): Ditto.
+        * page/mac/DragControllerMac.mm:
+        (WebCore::DragController::dragOperation):
+        (WebCore::DragController::createFragmentFromDragData): Ditto.
+        * page/win/DragControllerWin.cpp:
+        (WebCore::DragController::createFragmentFromDragData): Ditto.
+        * platform/DragData.h:
+        * platform/efl/DragDataEfl.cpp:
+        (WebCore::DragData::asPlainText): Remove Frame parameter.
+        (WebCore::DragData::containsURL): Ditto.
+        (WebCore::DragData::asURL): Ditto.
+        (WebCore::DragData::asFragment): Deleted.
+        * platform/gtk/DragDataGtk.cpp:
+        (WebCore::DragData::asPlainText): Remove Frame parameter.
+        (WebCore::DragData::containsCompatibleContent):
+        (WebCore::DragData::containsURL): Ditto.
+        (WebCore::DragData::asURL): Ditto.
+        (WebCore::DragData::asFragment): Deleted.
+        * platform/mac/DragDataMac.mm:
+        (WebCore::DragData::asPlainText): Same implementation as the
+        Editor.
+        (WebCore::DragData::containsURL): Remove Frame parameter.
+        (WebCore::DragData::asURL): Use URLByCanonicalizingURL() instead
+        of using the Editor client.
+        (WebCore::DragData::asFragment): Deleted.
+        * platform/win/DragDataWin.cpp:
+        (WebCore::DragData::containsURL): Remove Frame parameter.
+        (WebCore::DragData::asURL): Ditto.
+        (WebCore::DragData::asPlainText): Ditto.
+        (WebCore::DragData::containsCompatibleContent):
+        (WebCore::DragData::asFragment): Deleted.
+
 2014-09-16  Chris Dumez  <cdu...@apple.com>
 
         Rename Node::childNode(index) to traverseToChildAt(index) for clarity

Modified: trunk/Source/WebCore/page/DragController.cpp (173685 => 173686)


--- trunk/Source/WebCore/page/DragController.cpp	2014-09-17 04:32:32 UTC (rev 173685)
+++ trunk/Source/WebCore/page/DragController.cpp	2014-09-17 06:27:46 UTC (rev 173686)
@@ -114,25 +114,25 @@
     m_client.dragControllerDestroyed();
 }
 
-static PassRefPtr<DocumentFragment> documentFragmentFromDragData(DragData& dragData, Frame* frame, Range& context, bool allowPlainText, bool& chosePlainText)
+PassRefPtr<DocumentFragment> DragController::documentFragmentFromDragData(DragData& dragData, Frame& frame, Range& context, bool allowPlainText, bool& chosePlainText)
 {
     chosePlainText = false;
 
     Document& document = context.ownerDocument();
     if (dragData.containsCompatibleContent()) {
-        if (PassRefPtr<DocumentFragment> fragment = dragData.asFragment(frame, context, allowPlainText, chosePlainText))
+        if (PassRefPtr<DocumentFragment> fragment = createFragmentFromDragData(dragData, frame, context, allowPlainText, chosePlainText))
             return fragment;
 
-        if (dragData.containsURL(frame, DragData::DoNotConvertFilenames)) {
+        if (dragData.containsURL(DragData::DoNotConvertFilenames)) {
             String title;
-            String url = "" DragData::DoNotConvertFilenames, &title);
+            String url = "" &title);
             if (!url.isEmpty()) {
                 RefPtr<HTMLAnchorElement> anchor = HTMLAnchorElement::create(document);
                 anchor->setHref(url);
                 if (title.isEmpty()) {
                     // Try the plain text first because the url might be normalized or escaped.
                     if (dragData.containsPlainText())
-                        title = dragData.asPlainText(frame);
+                        title = dragData.asPlainText();
                     if (title.isEmpty())
                         title = url;
                 }
@@ -146,7 +146,7 @@
     }
     if (allowPlainText && dragData.containsPlainText()) {
         chosePlainText = true;
-        return createFragmentFromText(context, dragData.asPlainText(frame)).get();
+        return createFragmentFromText(context, dragData.asPlainText()).get();
     }
 
     return 0;
@@ -234,7 +234,7 @@
         return false;
 
     m_client.willPerformDragDestinationAction(DragDestinationActionLoad, dragData);
-    m_page.mainFrame().loader().load(FrameLoadRequest(&m_page.mainFrame(), ResourceRequest(dragData.asURL(&m_page.mainFrame()))));
+    m_page.mainFrame().loader().load(FrameLoadRequest(&m_page.mainFrame(), ResourceRequest(dragData.asURL())));
     return true;
 }
 
@@ -425,7 +425,7 @@
 bool DragController::dispatchTextInputEventFor(Frame* innerFrame, DragData& dragData)
 {
     ASSERT(m_page.dragCaretController().hasCaret());
-    String text = m_page.dragCaretController().isContentRichlyEditable() ? emptyString() : dragData.asPlainText(innerFrame);
+    String text = m_page.dragCaretController().isContentRichlyEditable() ? emptyString() : dragData.asPlainText();
     Node* target = innerFrame->editor().findEventTargetFrom(m_page.dragCaretController().caretPosition());
     return target->dispatchEvent(TextEvent::createForDrop(innerFrame->document()->domWindow(), text), IGNORE_EXCEPTION);
 }
@@ -494,7 +494,7 @@
     ResourceCacheValidationSuppressor validationSuppressor(cachedResourceLoader);
     if (dragIsMove(innerFrame->selection(), dragData) || dragCaret.isContentRichlyEditable()) {
         bool chosePlainText = false;
-        RefPtr<DocumentFragment> fragment = documentFragmentFromDragData(dragData, innerFrame.get(), *range, true, chosePlainText);
+        RefPtr<DocumentFragment> fragment = documentFragmentFromDragData(dragData, *innerFrame, *range, true, chosePlainText);
         if (!fragment || !innerFrame->editor().shouldInsertFragment(fragment, range, EditorInsertActionDropped)) {
             return false;
         }
@@ -517,7 +517,7 @@
             }
         }
     } else {
-        String text = dragData.asPlainText(innerFrame.get());
+        String text = dragData.asPlainText();
         if (text.isEmpty() || !innerFrame->editor().shouldInsertText(text, range.get(), EditorInsertActionDropped)) {
             return false;
         }

Modified: trunk/Source/WebCore/page/DragController.h (173685 => 173686)


--- trunk/Source/WebCore/page/DragController.h	2014-09-17 04:32:32 UTC (rev 173685)
+++ trunk/Source/WebCore/page/DragController.h	2014-09-17 06:27:46 UTC (rev 173686)
@@ -35,6 +35,7 @@
 
     class DataTransfer;
     class Document;
+    class DocumentFragment;
     class DragClient;
     class DragData;
     class Element;
@@ -44,6 +45,7 @@
     class IntRect;
     class Page;
     class PlatformMouseEvent;
+    class Range;
 
     struct DragState;
 
@@ -113,6 +115,10 @@
         void cleanupAfterSystemDrag();
         void declareAndWriteDragImage(DataTransfer&, Element&, const URL&, const String& label);
 
+        // FIXME: Move createFragmentFromDragData implementation to the Editor and make documentFragmentFromDragData a static function again.
+        static PassRefPtr<DocumentFragment> documentFragmentFromDragData(DragData&, Frame&, Range&, bool allowPlainText, bool& chosePlainText);
+        static PassRefPtr<DocumentFragment> createFragmentFromDragData(DragData&, Frame&, Range&, bool allowPlainText, bool& chosePlainText);
+
         Page& m_page;
         DragClient& m_client;
 

Modified: trunk/Source/WebCore/page/efl/DragControllerEfl.cpp (173685 => 173686)


--- trunk/Source/WebCore/page/efl/DragControllerEfl.cpp	2014-09-17 04:32:32 UTC (rev 173685)
+++ trunk/Source/WebCore/page/efl/DragControllerEfl.cpp	2014-09-17 06:27:46 UTC (rev 173686)
@@ -29,6 +29,8 @@
 #include "config.h"
 #include "DragController.h"
 
+#include "Document.h"
+#include "DocumentFragment.h"
 #include "DragData.h"
 #include "Frame.h"
 #include "FrameView.h"
@@ -50,7 +52,7 @@
 
 DragOperation DragController::dragOperation(DragData& dragData)
 {
-    if (dragData.containsURL(0))
+    if (dragData.containsURL())
         return DragOperationCopy;
 
     return DragOperationNone;
@@ -71,4 +73,9 @@
 {
 }
 
+PassRefPtr<DocumentFragment> DragController::createFragmentFromDragData(DragData&, Frame&, Range&, bool /*allowPlainText*/, bool& /*chosePlainText*/)
+{
+    return nullptr;
 }
+
+}

Modified: trunk/Source/WebCore/page/gtk/DragControllerGtk.cpp (173685 => 173686)


--- trunk/Source/WebCore/page/gtk/DragControllerGtk.cpp	2014-09-17 04:32:32 UTC (rev 173685)
+++ trunk/Source/WebCore/page/gtk/DragControllerGtk.cpp	2014-09-17 06:27:46 UTC (rev 173686)
@@ -26,13 +26,17 @@
 #include "config.h"
 #include "DragController.h"
 
+#include "DataObjectGtk.h"
 #include "DataTransfer.h"
+#include "Document.h"
+#include "DocumentFragment.h"
 #include "DragData.h"
 #include "Element.h"
 #include "Frame.h"
 #include "FrameView.h"
 #include "Page.h"
 #include "Pasteboard.h"
+#include "markup.h"
 
 namespace WebCore {
 
@@ -53,7 +57,7 @@
 DragOperation DragController::dragOperation(DragData& dragData)
 {
     // FIXME: This logic is incomplete
-    if (dragData.containsURL(0))
+    if (dragData.containsURL())
         return DragOperationCopy;
 
     return DragOperationNone;
@@ -74,4 +78,12 @@
     dataTransfer.pasteboard().writeImage(element, url, label);
 }
 
+PassRefPtr<DocumentFragment> DragController::createFragmentFromDragData(DragData& dragData, Frame& frame, Range&, bool /*allowPlainText*/, bool& /*chosePlainText*/)
+{
+    if (!dragData.platformData()->hasMarkup() || !frame.document())
+        return nullptr;
+
+    return createFragmentFromMarkup(*frame.document(), dragData.platformData()->markup(), "");
 }
+
+}

Modified: trunk/Source/WebCore/page/mac/DragControllerMac.mm (173685 => 173686)


--- trunk/Source/WebCore/page/mac/DragControllerMac.mm	2014-09-17 04:32:32 UTC (rev 173685)
+++ trunk/Source/WebCore/page/mac/DragControllerMac.mm	2014-09-17 06:27:46 UTC (rev 173686)
@@ -29,13 +29,18 @@
 #if ENABLE(DRAG_SUPPORT)
 
 #import "DataTransfer.h"
+#import "Document.h"
+#import "DocumentFragment.h"
 #import "DragClient.h"
 #import "DragData.h"
+#import "Editor.h"
+#import "EditorClient.h"
 #import "Element.h"
 #import "FrameView.h"
 #import "MainFrame.h"
 #import "Page.h"
 #import "Pasteboard.h"
+#import "Range.h"
 
 namespace WebCore {
 
@@ -54,7 +59,7 @@
     
 DragOperation DragController::dragOperation(DragData& dragData)
 {
-    if ((dragData.flags() & DragApplicationIsModal) || !dragData.containsURL(&m_page.mainFrame()))
+    if ((dragData.flags() & DragApplicationIsModal) || !dragData.containsURL())
         return DragOperationNone;
 
     if (!m_documentUnderMouse || (!(dragData.flags() & (DragApplicationHasAttachedSheet | DragApplicationIsSource))))
@@ -87,6 +92,12 @@
     m_client.declareAndWriteDragImage(dataTransfer.pasteboard().name(), element, url, label, element.document().frame());
 }
 
+PassRefPtr<DocumentFragment> DragController::createFragmentFromDragData(DragData& dragData, Frame& frame, Range& context, bool allowPlainText, bool& chosePlainText)
+{
+    Pasteboard pasteboard(dragData.pasteboardName());
+    return frame.editor().webContentFromPasteboard(pasteboard, context, allowPlainText, chosePlainText);
+}
+
 } // namespace WebCore
 
 #endif // ENABLE(DRAG_SUPPORT)

Modified: trunk/Source/WebCore/page/win/DragControllerWin.cpp (173685 => 173686)


--- trunk/Source/WebCore/page/win/DragControllerWin.cpp	2014-09-17 04:32:32 UTC (rev 173685)
+++ trunk/Source/WebCore/page/win/DragControllerWin.cpp	2014-09-17 06:27:46 UTC (rev 173686)
@@ -26,9 +26,13 @@
 #include "config.h"
 #include "DragController.h"
 
+#include "ClipboardUtilitiesWin.h"
 #include "DataTransfer.h"
+#include "Document.h"
+#include "DocumentFragment.h"
 #include "DragData.h"
 #include "Element.h"
+#include "Frame.h"
 #include "FrameSelection.h"
 #include "Pasteboard.h"
 #include "markup.h"
@@ -50,7 +54,7 @@
     //if we are a modal window, we are the drag source, or the window is an attached sheet
     //If this can be determined from within WebCore operationForDrag can be pulled into 
     //WebCore itself
-    return dragData.containsURL(0) && !m_didInitiateDrag ? DragOperationCopy : DragOperationNone;
+    return dragData.containsURL() && !m_didInitiateDrag ? DragOperationCopy : DragOperationNone;
 }
 
 bool DragController::isCopyKeyDown(DragData&)
@@ -83,4 +87,27 @@
     pasteboard.writeMarkup(createMarkup(element, IncludeNode, 0, ResolveAllURLs));
 }
 
+template <typename PlatformDragData>
+static PassRefPtr<DocumentFragment> createFragmentFromPlatformData(PlatformDragData* platformDragData, Frame& frame)
+{
+    if (containsFilenames(platformDragData)) {
+        if (PassRefPtr<DocumentFragment> fragment = fragmentFromFilenames(frame.document(), platformDragData))
+            return fragment;
+    }
+
+    if (containsHTML(platformDragData)) {
+        if (PassRefPtr<DocumentFragment> fragment = fragmentFromHTML(frame.document(), platformDragData))
+            return fragment;
+    }
+    return nullptr;
 }
+
+PassRefPtr<DocumentFragment> DragController::createFragmentFromDragData(DragData& dragData, Frame& frame, Range&, bool /*allowPlainText*/, bool& /*chosePlainText*/)
+{
+    if (DragDataRef platformDragData = dragData.platformData())
+        return createFragmentFromPlatformData(platformDragData, frame);
+
+    return createFragmentFromPlatformData(&dragData.dragDataMap(), frame);
+}
+
+}

Modified: trunk/Source/WebCore/platform/DragData.h (173685 => 173686)


--- trunk/Source/WebCore/platform/DragData.h	2014-09-17 04:32:32 UTC (rev 173685)
+++ trunk/Source/WebCore/platform/DragData.h	2014-09-17 06:27:46 UTC (rev 173686)
@@ -60,10 +60,7 @@
 
 namespace WebCore {
 
-class Frame;
-class DocumentFragment;
 class URL;
-class Range;
 
 enum DragApplicationFlags {
     DragApplicationNone = 0,
@@ -95,14 +92,13 @@
     DragApplicationFlags flags() const { return m_applicationFlags; }
     DragDataRef platformData() const { return m_platformDragData; }
     DragOperation draggingSourceOperationMask() const { return m_draggingSourceOperationMask; }
-    bool containsURL(Frame*, FilenameConversionPolicy filenamePolicy = ConvertFilenames) const;
+    bool containsURL(FilenameConversionPolicy = ConvertFilenames) const;
     bool containsPlainText() const;
     bool containsCompatibleContent() const;
-    String asURL(Frame*, FilenameConversionPolicy filenamePolicy = ConvertFilenames, String* title = 0) const;
-    String asPlainText(Frame*) const;
+    String asURL(FilenameConversionPolicy = ConvertFilenames, String* title = nullptr) const;
+    String asPlainText() const;
     void asFilenames(Vector<String>&) const;
     Color asColor() const;
-    PassRefPtr<DocumentFragment> asFragment(Frame*, Range& context, bool allowPlainText, bool& chosePlainText) const;
     bool canSmartReplace() const;
     bool containsColor() const;
     bool containsFiles() const;

Modified: trunk/Source/WebCore/platform/efl/DragDataEfl.cpp (173685 => 173686)


--- trunk/Source/WebCore/platform/efl/DragDataEfl.cpp	2014-09-17 04:32:32 UTC (rev 173685)
+++ trunk/Source/WebCore/platform/efl/DragDataEfl.cpp	2014-09-17 06:27:46 UTC (rev 173686)
@@ -21,8 +21,7 @@
 #include "config.h"
 #include "DragData.h"
 
-#include "Document.h"
-#include "DocumentFragment.h"
+#include <wtf/text/WTFString.h>
 
 namespace WebCore {
 
@@ -55,7 +54,7 @@
     return false;
 }
 
-String DragData::asPlainText(Frame*) const
+String DragData::asPlainText() const
 {
     return String();
 }
@@ -70,19 +69,14 @@
     return false;
 }
 
-bool DragData::containsURL(Frame*, FilenameConversionPolicy) const
+bool DragData::containsURL(FilenameConversionPolicy) const
 {
     return false;
 }
 
-String DragData::asURL(Frame*, FilenameConversionPolicy, String*) const
+String DragData::asURL(FilenameConversionPolicy, String*) const
 {
     return String();
 }
 
-PassRefPtr<DocumentFragment> DragData::asFragment(Frame*, Range&, bool, bool&) const
-{
-    return 0;
 }
-
-}

Modified: trunk/Source/WebCore/platform/gtk/DragDataGtk.cpp (173685 => 173686)


--- trunk/Source/WebCore/platform/gtk/DragDataGtk.cpp	2014-09-17 04:32:32 UTC (rev 173685)
+++ trunk/Source/WebCore/platform/gtk/DragDataGtk.cpp	2014-09-17 06:27:46 UTC (rev 173686)
@@ -18,10 +18,6 @@
 #include "DragData.h"
 
 #include "DataObjectGtk.h"
-#include "Document.h"
-#include "DocumentFragment.h"
-#include "Frame.h"
-#include "markup.h"
 
 namespace WebCore {
 
@@ -55,7 +51,7 @@
     return m_platformDragData->hasText();
 }
 
-String DragData::asPlainText(Frame*) const
+String DragData::asPlainText() const
 {
     return m_platformDragData->text();
 }
@@ -67,15 +63,15 @@
 
 bool DragData::containsCompatibleContent() const
 {
-    return containsPlainText() || containsURL(0) || m_platformDragData->hasMarkup() || containsColor() || containsFiles();
+    return containsPlainText() || containsURL() || m_platformDragData->hasMarkup() || containsColor() || containsFiles();
 }
 
-bool DragData::containsURL(Frame* frame, FilenameConversionPolicy filenamePolicy) const
+bool DragData::containsURL(FilenameConversionPolicy filenamePolicy) const
 {
-    return !asURL(frame, filenamePolicy).isEmpty();
+    return !asURL(filenamePolicy).isEmpty();
 }
 
-String DragData::asURL(Frame*, FilenameConversionPolicy filenamePolicy, String* title) const
+String DragData::asURL(FilenameConversionPolicy filenamePolicy, String* title) const
 {
     if (!m_platformDragData->hasURL())
         return String();
@@ -91,16 +87,4 @@
     return url;
 }
 
-
-PassRefPtr<DocumentFragment> DragData::asFragment(Frame* frame, Range&, bool, bool&) const
-{
-    if (!m_platformDragData->hasMarkup())
-        return nullptr;
-
-    if (!frame->document())
-        return nullptr;
-
-    return createFragmentFromMarkup(*frame->document(), m_platformDragData->markup(), "");
 }
-
-}

Modified: trunk/Source/WebCore/platform/mac/DragDataMac.mm (173685 => 173686)


--- trunk/Source/WebCore/platform/mac/DragDataMac.mm	2014-09-17 04:32:32 UTC (rev 173685)
+++ trunk/Source/WebCore/platform/mac/DragDataMac.mm	2014-09-17 06:27:46 UTC (rev 173686)
@@ -27,18 +27,11 @@
 #import "DragData.h"
 
 #if ENABLE(DRAG_SUPPORT)
-#import "Document.h"
-#import "DocumentFragment.h"
-#import "DOMDocumentFragment.h"
-#import "DOMDocumentFragmentInternal.h"
-#import "Editor.h"
-#import "EditorClient.h"
-#import "Frame.h"
 #import "MIMETypeRegistry.h"
 #import "Pasteboard.h"
 #import "PasteboardStrategy.h"
 #import "PlatformStrategies.h"
-#import "Range.h"
+#import "WebCoreNSURLExtras.h"
 
 namespace WebCore {
 
@@ -107,9 +100,20 @@
         || platformStrategies()->pasteboardStrategy()->stringForType(String(NSURLPboardType), m_pasteboardName).length();
 }
 
-String DragData::asPlainText(Frame *frame) const
+String DragData::asPlainText() const
 {
-    return frame->editor().readPlainTextFromPasteboard(*Pasteboard::create(m_pasteboardName));
+    Pasteboard pasteboard(m_pasteboardName);
+    PasteboardPlainText text;
+    pasteboard.read(text);
+    String string = text.text;
+
+    // FIXME: It's not clear this is 100% correct since we know -[NSURL URLWithString:] does not handle
+    // all the same cases we handle well in the URL code for creating an NSURL.
+    if (text.isURL)
+        return userVisibleString([NSURL URLWithString:string]);
+
+    // FIXME: WTF should offer a non-Mac-specific way to convert string to precomposed form so we can do it for all platforms.
+    return [(NSString *)string precomposedStringWithCanonicalMapping];
 }
 
 Color DragData::asColor() const
@@ -134,12 +138,12 @@
         || types.contains(String(kUTTypePNG));
 }
     
-bool DragData::containsURL(Frame* frame, FilenameConversionPolicy filenamePolicy) const
+bool DragData::containsURL(FilenameConversionPolicy filenamePolicy) const
 {
-    return !asURL(frame, filenamePolicy).isEmpty();
+    return !asURL(filenamePolicy).isEmpty();
 }
 
-String DragData::asURL(Frame* frame, FilenameConversionPolicy, String* title) const
+String DragData::asURL(FilenameConversionPolicy, String* title) const
 {
     // FIXME: Use filenamePolicy.
 
@@ -151,17 +155,13 @@
     
     Vector<String> types;
     platformStrategies()->pasteboardStrategy()->getTypes(types, m_pasteboardName);
-    
-    // FIXME: using the editorClient to call into WebKit, for now, since 
-    // calling webkit_canonicalize from WebCore involves migrating a sizable amount of 
-    // helper code that should either be done in a separate patch or figured out in another way.
-    
+
     if (types.contains(String(NSURLPboardType))) {
         NSURL *URLFromPasteboard = [NSURL URLWithString:platformStrategies()->pasteboardStrategy()->stringForType(String(NSURLPboardType), m_pasteboardName)];
         NSString *scheme = [URLFromPasteboard scheme];
         // Cannot drop other schemes unless <rdar://problem/10562662> and <rdar://problem/11187315> are fixed.
         if ([scheme isEqualToString:@"http"] || [scheme isEqualToString:@"https"])
-            return [frame->editor().client()->canonicalizeURL(URLFromPasteboard) absoluteString];
+            return [URLByCanonicalizingURL(URLFromPasteboard) absoluteString];
     }
     
     if (types.contains(String(NSStringPboardType))) {
@@ -171,7 +171,7 @@
         // The result of this function is used to initiate navigation, so we shouldn't allow arbitrary file URLs.
         // FIXME: Should we allow only http family schemes, or anything non-local?
         if ([scheme isEqualToString:@"http"] || [scheme isEqualToString:@"https"])
-            return [frame->editor().client()->canonicalizeURL(URLFromPasteboard) absoluteString];
+            return [URLByCanonicalizingURL(URLFromPasteboard) absoluteString];
     }
     
     if (types.contains(String(NSFilenamesPboardType))) {
@@ -181,19 +181,13 @@
             BOOL isDirectory;
             if ([[NSFileManager defaultManager] fileExistsAtPath:files[0] isDirectory:&isDirectory] && isDirectory)
                 return String();
-            return [frame->editor().client()->canonicalizeURL([NSURL fileURLWithPath:files[0]]) absoluteString];
+            return [URLByCanonicalizingURL([NSURL fileURLWithPath:files[0]]) absoluteString];
         }
     }
     
     return String();        
 }
 
-PassRefPtr<DocumentFragment> DragData::asFragment(Frame* frame, Range& range, bool allowPlainText, bool& chosePlainText) const
-{
-    Pasteboard pasteboard(m_pasteboardName);
-    return frame->editor().webContentFromPasteboard(pasteboard, range, allowPlainText, chosePlainText);
-}
-    
 } // namespace WebCore
 
 #endif // ENABLE(DRAG_SUPPORT)

Modified: trunk/Source/WebCore/platform/win/ClipboardUtilitiesWin.h (173685 => 173686)


--- trunk/Source/WebCore/platform/win/ClipboardUtilitiesWin.h	2014-09-17 04:32:32 UTC (rev 173685)
+++ trunk/Source/WebCore/platform/win/ClipboardUtilitiesWin.h	2014-09-17 06:27:46 UTC (rev 173686)
@@ -33,6 +33,7 @@
 namespace WebCore {
 
 class Document;
+class DocumentFragment;
 class URL;
 
 HGLOBAL createGlobalData(const String&);

Modified: trunk/Source/WebCore/platform/win/DragDataWin.cpp (173685 => 173686)


--- trunk/Source/WebCore/platform/win/DragDataWin.cpp	2014-09-17 04:32:32 UTC (rev 173685)
+++ trunk/Source/WebCore/platform/win/DragDataWin.cpp	2014-09-17 06:27:46 UTC (rev 173686)
@@ -29,10 +29,6 @@
 
 #include "COMPtr.h"
 #include "ClipboardUtilitiesWin.h"
-#include "Frame.h"
-#include "DocumentFragment.h"
-#include "Markup.h"
-#include "Range.h"
 #include "TextEncoding.h"
 #include <objidl.h>
 #include <shlwapi.h>
@@ -56,7 +52,7 @@
 {
 }
 
-bool DragData::containsURL(Frame*, FilenameConversionPolicy filenamePolicy) const
+bool DragData::containsURL(FilenameConversionPolicy filenamePolicy) const
 {
     if (m_platformDragData)
         return SUCCEEDED(m_platformDragData->QueryGetData(urlWFormat())) 
@@ -101,7 +97,7 @@
         getFileContentData(m_platformDragData, size, dataBlob);
 }
 
-String DragData::asURL(Frame*, FilenameConversionPolicy filenamePolicy, String* title) const
+String DragData::asURL(FilenameConversionPolicy filenamePolicy, String* title) const
 {
     return (m_platformDragData) ? getURL(m_platformDragData, filenamePolicy, title) : getURL(&m_dragDataMap, filenamePolicy, title);
 }
@@ -181,7 +177,7 @@
     return m_dragDataMap.contains(plainTextWFormat()->cfFormat) || m_dragDataMap.contains(plainTextFormat()->cfFormat);
 }
 
-String DragData::asPlainText(Frame*) const
+String DragData::asPlainText() const
 {
     return (m_platformDragData) ? getPlainText(m_platformDragData) : getPlainText(&m_dragDataMap);
 }
@@ -200,48 +196,12 @@
 
 bool DragData::containsCompatibleContent() const
 {
-    return containsPlainText() || containsURL(0) 
+    return containsPlainText() || containsURL()
         || ((m_platformDragData) ? (containsHTML(m_platformDragData) || containsFilenames(m_platformDragData))
             : (containsHTML(&m_dragDataMap) || containsFilenames(&m_dragDataMap)))
         || containsColor();
 }
 
-PassRefPtr<DocumentFragment> DragData::asFragment(Frame* frame, Range&, bool, bool&) const
-{     
-    /*
-     * Order is richest format first. On OSX this is:
-     * * Web Archive
-     * * Filenames
-     * * HTML
-     * * RTF
-     * * TIFF
-     * * PICT
-     */
-     
-    if (m_platformDragData) {
-        if (containsFilenames(m_platformDragData)) {
-            if (PassRefPtr<DocumentFragment> fragment = fragmentFromFilenames(frame->document(), m_platformDragData))
-                return fragment;
-        }
-
-        if (containsHTML(m_platformDragData)) {
-            if (PassRefPtr<DocumentFragment> fragment = fragmentFromHTML(frame->document(), m_platformDragData))
-                return fragment;
-        }
-    } else {
-        if (containsFilenames(&m_dragDataMap)) {
-            if (PassRefPtr<DocumentFragment> fragment = fragmentFromFilenames(frame->document(), &m_dragDataMap))
-                return fragment;
-        }
-
-        if (containsHTML(&m_dragDataMap)) {
-            if (PassRefPtr<DocumentFragment> fragment = fragmentFromHTML(frame->document(), &m_dragDataMap))
-                return fragment;
-        }
-    }
-    return 0;
-}
-
 Color DragData::asColor() const
 {
     return Color();

Modified: trunk/Source/WebKit2/ChangeLog (173685 => 173686)


--- trunk/Source/WebKit2/ChangeLog	2014-09-17 04:32:32 UTC (rev 173685)
+++ trunk/Source/WebKit2/ChangeLog	2014-09-17 06:27:46 UTC (rev 173686)
@@ -1,3 +1,14 @@
+2014-09-16  Carlos Garcia Campos  <cgar...@igalia.com>
+
+        DragData should not depend on Clipboard, DocumentFragment, and Document
+        https://bugs.webkit.org/show_bug.cgi?id=21358
+
+        Reviewed by Darin Adler.
+
+        * UIProcess/WebPageProxy.cpp:
+        (WebKit::WebPageProxy::performDragControllerAction): Update to API
+        change in DragData::asURL().
+
 2014-09-16  Daniel Bates  <daba...@apple.com>
 
         [iOS] Add iOS SDK name and version suffix to WebKitSystemInterface debug/release product name

Modified: trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp (173685 => 173686)


--- trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp	2014-09-17 04:32:32 UTC (rev 173685)
+++ trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp	2014-09-17 06:27:46 UTC (rev 173686)
@@ -1369,7 +1369,7 @@
     UNUSED_PARAM(sandboxExtensionHandle);
     UNUSED_PARAM(sandboxExtensionsForUpload);
 
-    String url = ""
+    String url = ""
     if (!url.isEmpty())
         m_process->assumeReadAccessToBaseURL(url);
     m_process->send(Messages::WebPage::PerformDragControllerAction(action, dragData), m_pageID);
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to