Diff
Modified: trunk/LayoutTests/ChangeLog (159836 => 159837)
--- trunk/LayoutTests/ChangeLog 2013-11-28 10:28:04 UTC (rev 159836)
+++ trunk/LayoutTests/ChangeLog 2013-11-28 12:40:59 UTC (rev 159837)
@@ -1,3 +1,12 @@
+2013-11-27 Gustavo Noronha Silva <gustavo.noro...@collabora.com>
+
+ [GTK] Support custom types for drag and drop data
+ https://bugs.webkit.org/show_bug.cgi?id=124659
+
+ Reviewed by Martin Robinson.
+
+ * platform/gtk/TestExpectations: remove failure expectation for test that now passes.
+
2013-11-27 Filip Pizlo <fpi...@apple.com>
Infer one-time scopes
Modified: trunk/LayoutTests/platform/gtk/TestExpectations (159836 => 159837)
--- trunk/LayoutTests/platform/gtk/TestExpectations 2013-11-28 10:28:04 UTC (rev 159836)
+++ trunk/LayoutTests/platform/gtk/TestExpectations 2013-11-28 12:40:59 UTC (rev 159837)
@@ -220,14 +220,15 @@
webkit.org/b/98940 fast/events/drag-dataTransferItemList.html [ Skip ]
webkit.org/b/98940 fast/events/drag-dataTransferItemList-file-handling.html [ Skip ]
+# Custom MIME type support in DataTransfer is not yet implemented; this test was added
+# by Google while implementing a different pasteboard API that was only being used by
+# Chromium and Qt, might make sense to remove.
+webkit.org/b/99068 editing/pasteboard/clipboard-customData.html [ Failure ]
+
# setAutomaticLinkDetectionEnabled is not yet implemented.
webkit.org/b/99069 editing/inserting/typing-space-to-trigger-smart-link.html [ Failure ]
webkit.org/b/85463 editing/inserting/smart-link-when-caret-is-moved-before-URL.html [ Failure ]
-# Custom MIME type support in DataTransfer is not yet implemented.
-webkit.org/b/99068 editing/pasteboard/clipboard-customData.html [ Failure ]
-webkit.org/b/99068 fast/events/drag-customData.html [ Failure ]
-
# PasteBoard::plainText() does not support file names.
webkit.org/b/99070 editing/pasteboard/drag-files-to-editable-element.html [ Failure ]
Modified: trunk/Source/WebCore/ChangeLog (159836 => 159837)
--- trunk/Source/WebCore/ChangeLog 2013-11-28 10:28:04 UTC (rev 159836)
+++ trunk/Source/WebCore/ChangeLog 2013-11-28 12:40:59 UTC (rev 159837)
@@ -1,3 +1,36 @@
+2013-11-27 Gustavo Noronha Silva <gustavo.noro...@collabora.com>
+
+ [GTK] Support custom types for drag and drop data
+ https://bugs.webkit.org/show_bug.cgi?id=124659
+
+ Reviewed by Martin Robinson.
+
+ Covered by fast/events/drag-customData.html.
+
+ * platform/gtk/DataObjectGtk.cpp:
+ (WebCore::DataObjectGtk::unknownTypes): returns a hash map with all custom types set.
+ (WebCore::DataObjectGtk::clearAllExceptFilenames): clear custom types.
+ * platform/gtk/DataObjectGtk.h:
+ (WebCore::DataObjectGtk::hasUnknownTypeData): returns whether custom types are set.
+ (WebCore::DataObjectGtk::unknownTypeData): returns the data for a custom type.
+ (WebCore::DataObjectGtk::setUnknownTypeData): sets the data for a custom type.
+ * platform/gtk/PasteboardGtk.cpp:
+ (WebCore::Pasteboard::writeString): handle unknown types as custom.
+ (WebCore::Pasteboard::writePasteboard): ditto.
+ (WebCore::Pasteboard::hasData): also check for custom types.
+ (WebCore::Pasteboard::types): also obtain the list of custom types.
+ (WebCore::Pasteboard::readString): handle unknown types as custom.
+ * platform/gtk/PasteboardHelper.cpp:
+ (WebCore::initGdkAtoms): new unknown atom.
+ (WebCore::PasteboardHelper::PasteboardHelper): add custom type to the list of targets.
+ (WebCore::PasteboardHelper::fillSelectionData): turns any custom types' data into a GVariant, which
+ is in turn serialized to a single string for GtkSelectionData to hold.
+ (WebCore::PasteboardHelper::targetListForDataObject): add custom data to the target list if any is
+ set.
+ (WebCore::PasteboardHelper::fillDataObjectFromDropData): retrieve the custom types and their data
+ from the serialized GVariant string held by GtkSelectionData.
+ (WebCore::PasteboardHelper::dropAtomsForContext): handle custom types.
+
2013-11-27 Eric Carlson <eric.carl...@apple.com>
Allow the QuickTime plug-in to be replaced by script in an isolated word
Modified: trunk/Source/WebCore/platform/gtk/DataObjectGtk.cpp (159836 => 159837)
--- trunk/Source/WebCore/platform/gtk/DataObjectGtk.cpp 2013-11-28 10:28:04 UTC (rev 159836)
+++ trunk/Source/WebCore/platform/gtk/DataObjectGtk.cpp 2013-11-28 12:40:59 UTC (rev 159837)
@@ -50,6 +50,11 @@
return m_markup;
}
+HashMap<String, String> DataObjectGtk::unknownTypes() const
+{
+ return m_unknownTypeData;
+}
+
void DataObjectGtk::setText(const String& newText)
{
m_range = 0;
@@ -155,6 +160,7 @@
m_url = URL();
m_image = 0;
m_range = 0;
+ m_unknownTypeData.clear();
}
void DataObjectGtk::clearAll()
Modified: trunk/Source/WebCore/platform/gtk/DataObjectGtk.h (159836 => 159837)
--- trunk/Source/WebCore/platform/gtk/DataObjectGtk.h 2013-11-28 10:28:04 UTC (rev 159836)
+++ trunk/Source/WebCore/platform/gtk/DataObjectGtk.h 2013-11-28 12:40:59 UTC (rev 159837)
@@ -43,6 +43,7 @@
void setRange(PassRefPtr<Range> newRange) { m_range = newRange; }
void setImage(GdkPixbuf* newImage) { m_image = newImage; }
void setURL(const URL&, const String&);
+ bool hasUnknownTypeData() const { return !m_unknownTypeData.isEmpty(); }
bool hasText() const { return m_range || !m_text.isEmpty(); }
bool hasMarkup() const { return m_range || !m_markup.isEmpty(); }
bool hasURIList() const { return !m_uriList.isEmpty(); }
@@ -55,8 +56,11 @@
String text() const;
String markup() const;
+ String unknownTypeData(const String& type) const { return m_unknownTypeData.get(type); }
+ HashMap<String, String> unknownTypes() const;
void setText(const String&);
void setMarkup(const String&);
+ void setUnknownTypeData(const String& type, const String& data) { m_unknownTypeData.set(type, data); }
void setURIList(const String&);
String urlLabel() const;
@@ -75,6 +79,7 @@
Vector<String> m_filenames;
GRefPtr<GdkPixbuf> m_image;
RefPtr<Range> m_range;
+ HashMap<String, String> m_unknownTypeData;
};
}
Modified: trunk/Source/WebCore/platform/gtk/PasteboardGtk.cpp (159836 => 159837)
--- trunk/Source/WebCore/platform/gtk/PasteboardGtk.cpp 2013-11-28 10:28:04 UTC (rev 159836)
+++ trunk/Source/WebCore/platform/gtk/PasteboardGtk.cpp 2013-11-28 12:40:59 UTC (rev 159837)
@@ -149,8 +149,10 @@
case ClipboardDataTypeText:
m_dataObject->setText(data);
return true;
+ case ClipboardDataTypeUnknown:
+ m_dataObject->setUnknownTypeData(type, data);
+ return true;
case ClipboardDataTypeImage:
- case ClipboardDataTypeUnknown:
break;
}
@@ -246,6 +248,12 @@
m_dataObject->setURIList(sourceDataObject->uriList());
if (sourceDataObject->hasImage())
m_dataObject->setImage(sourceDataObject->image());
+ if (sourceDataObject->hasUnknownTypeData()) {
+ auto types = m_dataObject->unknownTypes();
+ auto end = types.end();
+ for (auto it = types.begin(); it != end; ++it)
+ m_dataObject->setUnknownTypeData(it->key, it->value);
+ }
if (m_gtkClipboard)
PasteboardHelper::defaultPasteboardHelper()->writeClipboardContents(m_gtkClipboard);
@@ -339,7 +347,7 @@
if (m_gtkClipboard)
PasteboardHelper::defaultPasteboardHelper()->getClipboardContents(m_gtkClipboard);
- return m_dataObject->hasText() || m_dataObject->hasMarkup() || m_dataObject->hasURIList() || m_dataObject->hasImage();
+ return m_dataObject->hasText() || m_dataObject->hasMarkup() || m_dataObject->hasURIList() || m_dataObject->hasImage() || m_dataObject->hasUnknownTypeData();
}
Vector<String> Pasteboard::types()
@@ -365,6 +373,11 @@
if (m_dataObject->hasFilenames())
types.append(ASCIILiteral("Files"));
+ auto unknownTypes = m_dataObject->unknownTypes();
+ auto end = unknownTypes.end();
+ for (auto it = unknownTypes.begin(); it != end; ++it)
+ types.append(it->key);
+
return types;
}
@@ -382,8 +395,9 @@
return m_dataObject->markup();
case ClipboardDataTypeText:
return m_dataObject->text();
+ case ClipboardDataTypeUnknown:
+ return m_dataObject->unknownTypeData(type);
case ClipboardDataTypeImage:
- case ClipboardDataTypeUnknown:
break;
}
Modified: trunk/Source/WebCore/platform/gtk/PasteboardHelper.cpp (159836 => 159837)
--- trunk/Source/WebCore/platform/gtk/PasteboardHelper.cpp 2013-11-28 10:28:04 UTC (rev 159836)
+++ trunk/Source/WebCore/platform/gtk/PasteboardHelper.cpp 2013-11-28 12:40:59 UTC (rev 159837)
@@ -1,6 +1,7 @@
/*
* Copyright (C) 2010 Martin Robinson <mrobin...@webkit.org>
* Copyright (C) Igalia S.L.
+ * Copyright (C) 2013 Collabora Ltd.
* All rights reserved.
*
* This library is free software; you can redistribute it and/or
@@ -25,6 +26,7 @@
#include "Chrome.h"
#include "DataObjectGtk.h"
#include "Frame.h"
+#include "GRefPtrGtk.h"
#include "GtkVersioning.h"
#include "Page.h"
#include "Pasteboard.h"
@@ -39,6 +41,8 @@
static GdkAtom netscapeURLAtom;
static GdkAtom uriListAtom;
static GdkAtom smartPasteAtom;
+static GdkAtom unknownAtom;
+
static String gMarkupPrefix;
static void removeMarkupPrefix(String& markup)
@@ -63,6 +67,7 @@
netscapeURLAtom = gdk_atom_intern("_NETSCAPE_URL", FALSE);
uriListAtom = gdk_atom_intern("text/uri-list", FALSE);
smartPasteAtom = gdk_atom_intern("application/vnd.webkitgtk.smartpaste", FALSE);
+ unknownAtom = gdk_atom_intern("application/vnd.webkitgtk.unknown", FALSE);
gMarkupPrefix = "<meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\">";
}
@@ -82,6 +87,7 @@
gtk_target_list_add_uri_targets(m_targetList, PasteboardHelper::TargetTypeURIList);
gtk_target_list_add(m_targetList, netscapeURLAtom, 0, PasteboardHelper::TargetTypeNetscapeURL);
gtk_target_list_add_image_targets(m_targetList, PasteboardHelper::TargetTypeImage, TRUE);
+ gtk_target_list_add(m_targetList, unknownAtom, 0, PasteboardHelper::TargetTypeUnknown);
}
PasteboardHelper::~PasteboardHelper()
@@ -179,6 +185,22 @@
else if (info == TargetTypeSmartPaste)
gtk_selection_data_set_text(selectionData, "", -1);
+
+ else if (info == TargetTypeUnknown) {
+ GVariantBuilder builder;
+ g_variant_builder_init(&builder, G_VARIANT_TYPE_ARRAY);
+
+ auto types = dataObject->unknownTypes();
+ auto end = types.end();
+ for (auto it = types.begin(); it != end; ++it) {
+ GOwnPtr<gchar> dictItem(g_strdup_printf("{'%s', '%s'}", it->key.utf8().data(), it->value.utf8().data()));
+ g_variant_builder_add_parsed(&builder, dictItem.get());
+ }
+
+ GRefPtr<GVariant> variant = adoptGRef(g_variant_builder_end(&builder));
+ GOwnPtr<gchar> serializedVariant(g_variant_print(variant.get(), TRUE));
+ gtk_selection_data_set(selectionData, unknownAtom, 1, reinterpret_cast<const guchar*>(serializedVariant.get()), strlen(serializedVariant.get()));
+ }
}
GtkTargetList* PasteboardHelper::targetListForDataObject(DataObjectGtk* dataObject, SmartPasteInclusion shouldInludeSmartPaste)
@@ -199,6 +221,9 @@
if (dataObject->hasImage())
gtk_target_list_add_image_targets(list, TargetTypeImage, TRUE);
+ if (dataObject->hasUnknownTypeData())
+ gtk_target_list_add(list, unknownAtom, 0, TargetTypeUnknown);
+
if (shouldInludeSmartPaste == IncludeSmartPaste)
gtk_target_list_add(list, smartPasteAtom, 0, TargetTypeSmartPaste);
@@ -230,6 +255,21 @@
dataObject->setURIList(pieces[0]);
if (pieces.size() > 1)
dataObject->setText(pieces[1]);
+ } else if (target == unknownAtom) {
+ GRefPtr<GVariant> variant = adoptGRef(g_variant_new_parsed(reinterpret_cast<const char*>(gtk_selection_data_get_data(data))));
+
+ GOwnPtr<gchar> key;
+ GOwnPtr<gchar> value;
+ GVariantIter iter;
+
+ g_variant_iter_init(&iter, variant.get());
+ while (g_variant_iter_next(&iter, "{ss}", &key.outPtr(), &value.outPtr())) {
+ dataObject->setUnknownTypeData(key.get(), value.get());
+
+ // FIXME: should GOwnPtr be smarter about this and replace the existing ptr when outPtr() is used?
+ key.clear();
+ value.clear();
+ }
}
}
@@ -241,6 +281,7 @@
dropAtoms.append(markupAtom);
dropAtoms.append(uriListAtom);
dropAtoms.append(netscapeURLAtom);
+ dropAtoms.append(unknownAtom);
// For images, try to find the most applicable image type.
GRefPtr<GtkTargetList> list = adoptGRef(gtk_target_list_new(0, 0));
Modified: trunk/Source/WebKit2/ChangeLog (159836 => 159837)
--- trunk/Source/WebKit2/ChangeLog 2013-11-28 10:28:04 UTC (rev 159836)
+++ trunk/Source/WebKit2/ChangeLog 2013-11-28 12:40:59 UTC (rev 159837)
@@ -1,3 +1,14 @@
+2013-11-27 Gustavo Noronha Silva <gustavo.noro...@collabora.com>
+
+ [GTK] Support custom types for drag and drop data
+ https://bugs.webkit.org/show_bug.cgi?id=124659
+
+ Reviewed by Martin Robinson.
+
+ * Shared/gtk/ArgumentCodersGtk.cpp:
+ (CoreIPC::encodeDataObject): encode the unknown types data.
+ (CoreIPC::decodeDataObject): decode the unknown types data.
+
2013-11-27 Sam Weinig <s...@webkit.org>
Give the PageClient a chance to handle geolocation permission requests if the UIClient doesn't handle it
Modified: trunk/Source/WebKit2/Shared/gtk/ArgumentCodersGtk.cpp (159836 => 159837)
--- trunk/Source/WebKit2/Shared/gtk/ArgumentCodersGtk.cpp 2013-11-28 10:28:04 UTC (rev 159836)
+++ trunk/Source/WebKit2/Shared/gtk/ArgumentCodersGtk.cpp 2013-11-28 12:40:59 UTC (rev 159837)
@@ -108,6 +108,11 @@
encoder << hasImage;
if (hasImage)
encodeImage(encoder, dataObject->image());
+
+ bool hasUnknownTypeData = dataObject->hasUnknownTypeData();
+ encoder << hasUnknownTypeData;
+ if (hasUnknownTypeData)
+ encoder << dataObject->unknownTypes();
}
static bool decodeDataObject(ArgumentDecoder& decoder, RefPtr<DataObjectGtk>& dataObject)
@@ -164,6 +169,19 @@
data->setImage(image.get());
}
+ bool hasUnknownTypeData;
+ if (!decoder.decode(hasUnknownTypeData))
+ return false;
+ if (hasUnknownTypeData) {
+ HashMap<String, String> unknownTypes;
+ if (!decoder.decode(unknownTypes))
+ return false;
+
+ auto end = unknownTypes.end();
+ for (auto it = unknownTypes.begin(); it != end; ++it)
+ data->setUnknownTypeData(it->key, it->value);
+ }
+
dataObject = data;
return true;