| Differences between
and this patch
- a/Source/WebCore/ChangeLog +33 lines
Lines 1-3 a/Source/WebCore/ChangeLog_sec1
1
2013-11-20  Gustavo Noronha Silva  <gustavo.noronha@collabora.com>
2
3
        [GTK] Support custom types for drag and drop data
4
        https://bugs.webkit.org/show_bug.cgi?id=124659
5
6
        Reviewed by NOBODY (OOPS!).
7
8
        No new tests (OOPS!).
9
10
        * platform/gtk/DataObjectGtk.cpp:
11
        (WebCore::DataObjectGtk::unknownTypes): returns a vector with all custom types set.
12
        (WebCore::DataObjectGtk::clearAllExceptFilenames): clear custom types.
13
        * platform/gtk/DataObjectGtk.h:
14
        (WebCore::DataObjectGtk::hasUnknownTypeData): returns whether custom types are set.
15
        (WebCore::DataObjectGtk::unknownTypeData): returns the data for a custom type.
16
        (WebCore::DataObjectGtk::setUnknownTypeData): sets the data for a custom type.
17
        * platform/gtk/PasteboardGtk.cpp:
18
        (WebCore::Pasteboard::writeString): handle unknown types as custom.
19
        (WebCore::Pasteboard::writePasteboard): ditto.
20
        (WebCore::Pasteboard::hasData): also check for custom types.
21
        (WebCore::Pasteboard::types): also obtain the list of custom types.
22
        (WebCore::Pasteboard::readString): handle unknown types as custom.
23
        * platform/gtk/PasteboardHelper.cpp:
24
        (WebCore::initGdkAtoms): new unknown atom.
25
        (WebCore::PasteboardHelper::PasteboardHelper): add custom type to the list of targets.
26
        (WebCore::PasteboardHelper::fillSelectionData): turns any custom types' data into a GVariant, which
27
        is in turn serialized to a single string for GtkSelectionData to hold.
28
        (WebCore::PasteboardHelper::targetListForDataObject): add custom data to the target list if any is
29
        set.
30
        (WebCore::PasteboardHelper::fillDataObjectFromDropData): retrieve the custom types and their data
31
        from the serialized GVariant string held by GtkSelectionData.
32
        (WebCore::PasteboardHelper::dropAtomsForContext): handle custom types.
33
1
2013-11-18  peavo@outlook.com  <peavo@outlook.com>
34
2013-11-18  peavo@outlook.com  <peavo@outlook.com>
2
35
3
        [Curl] Basic authentication is not reused.
36
        [Curl] Basic authentication is not reused.
- a/Source/WebCore/platform/gtk/DataObjectGtk.cpp +10 lines
Lines 50-55 String DataObjectGtk::markup() const a/Source/WebCore/platform/gtk/DataObjectGtk.cpp_sec1
50
    return m_markup;
50
    return m_markup;
51
}
51
}
52
52
53
Vector<String> DataObjectGtk::unknownTypes() const
54
{
55
    Vector<String> types;
56
    HashMap<String, String>::const_iterator end = m_unknownTypeData.end();
57
    for (HashMap<String, String>::const_iterator it = m_unknownTypeData.begin(); it != end; ++it)
58
        types.append(it->key);
59
    return types;
60
}
61
53
void DataObjectGtk::setText(const String& newText)
62
void DataObjectGtk::setText(const String& newText)
54
{
63
{
55
    m_range = 0;
64
    m_range = 0;
Lines 155-160 void DataObjectGtk::clearAllExceptFilenames() a/Source/WebCore/platform/gtk/DataObjectGtk.cpp_sec2
155
    m_url = URL();
164
    m_url = URL();
156
    m_image = 0;
165
    m_image = 0;
157
    m_range = 0;
166
    m_range = 0;
167
    m_unknownTypeData.clear();
158
}
168
}
159
169
160
void DataObjectGtk::clearAll()
170
void DataObjectGtk::clearAll()
- a/Source/WebCore/platform/gtk/DataObjectGtk.h +5 lines
Lines 43-48 public: a/Source/WebCore/platform/gtk/DataObjectGtk.h_sec1
43
    void setRange(PassRefPtr<Range> newRange) { m_range = newRange; }
43
    void setRange(PassRefPtr<Range> newRange) { m_range = newRange; }
44
    void setImage(GdkPixbuf* newImage) { m_image = newImage; }
44
    void setImage(GdkPixbuf* newImage) { m_image = newImage; }
45
    void setURL(const URL&, const String&);
45
    void setURL(const URL&, const String&);
46
    bool hasUnknownTypeData() const { return !m_unknownTypeData.isEmpty(); }
46
    bool hasText() const { return m_range || !m_text.isEmpty(); }
47
    bool hasText() const { return m_range || !m_text.isEmpty(); }
47
    bool hasMarkup() const { return m_range || !m_markup.isEmpty(); }
48
    bool hasMarkup() const { return m_range || !m_markup.isEmpty(); }
48
    bool hasURIList() const { return !m_uriList.isEmpty(); }
49
    bool hasURIList() const { return !m_uriList.isEmpty(); }
Lines 55-62 public: a/Source/WebCore/platform/gtk/DataObjectGtk.h_sec2
55
56
56
    String text() const;
57
    String text() const;
57
    String markup() const;
58
    String markup() const;
59
    String unknownTypeData(const String& type) const { return m_unknownTypeData.get(type); }
60
    Vector<String> unknownTypes() const;
58
    void setText(const String&);
61
    void setText(const String&);
59
    void setMarkup(const String&);
62
    void setMarkup(const String&);
63
    void setUnknownTypeData(const String& type, const String& data) { m_unknownTypeData.set(type, data); }
60
    void setURIList(const String&);
64
    void setURIList(const String&);
61
    String urlLabel() const;
65
    String urlLabel() const;
62
66
Lines 75-80 private: a/Source/WebCore/platform/gtk/DataObjectGtk.h_sec3
75
    Vector<String> m_filenames;
79
    Vector<String> m_filenames;
76
    GRefPtr<GdkPixbuf> m_image;
80
    GRefPtr<GdkPixbuf> m_image;
77
    RefPtr<Range> m_range;
81
    RefPtr<Range> m_range;
82
    HashMap<String, String> m_unknownTypeData;
78
};
83
};
79
84
80
}
85
}
- a/Source/WebCore/platform/gtk/PasteboardGtk.cpp -3 / +13 lines
Lines 149-156 bool Pasteboard::writeString(const String& type, const String& data) a/Source/WebCore/platform/gtk/PasteboardGtk.cpp_sec1
149
    case ClipboardDataTypeText:
149
    case ClipboardDataTypeText:
150
        m_dataObject->setText(data);
150
        m_dataObject->setText(data);
151
        return true;
151
        return true;
152
    case ClipboardDataTypeImage:
153
    case ClipboardDataTypeUnknown:
152
    case ClipboardDataTypeUnknown:
153
        m_dataObject->setUnknownTypeData(type, data);
154
        return true;
155
    case ClipboardDataTypeImage:
154
        break;
156
        break;
155
    }
157
    }
156
158
Lines 246-251 void Pasteboard::writePasteboard(const Pasteboard& sourcePasteboard) a/Source/WebCore/platform/gtk/PasteboardGtk.cpp_sec2
246
        m_dataObject->setURIList(sourceDataObject->uriList());
248
        m_dataObject->setURIList(sourceDataObject->uriList());
247
    if (sourceDataObject->hasImage())
249
    if (sourceDataObject->hasImage())
248
        m_dataObject->setImage(sourceDataObject->image());
250
        m_dataObject->setImage(sourceDataObject->image());
251
    if (sourceDataObject->hasUnknownTypeData()) {
252
        Vector<String> types = m_dataObject->unknownTypes();
253
        for (size_t i = 0; i < types.size(); i++)
254
            m_dataObject->setUnknownTypeData(types[i], sourceDataObject->unknownTypeData(types[i]));
255
    }
249
256
250
    if (m_gtkClipboard)
257
    if (m_gtkClipboard)
251
        PasteboardHelper::defaultPasteboardHelper()->writeClipboardContents(m_gtkClipboard);
258
        PasteboardHelper::defaultPasteboardHelper()->writeClipboardContents(m_gtkClipboard);
Lines 339-345 bool Pasteboard::hasData() a/Source/WebCore/platform/gtk/PasteboardGtk.cpp_sec3
339
    if (m_gtkClipboard)
346
    if (m_gtkClipboard)
340
        PasteboardHelper::defaultPasteboardHelper()->getClipboardContents(m_gtkClipboard);
347
        PasteboardHelper::defaultPasteboardHelper()->getClipboardContents(m_gtkClipboard);
341
348
342
    return m_dataObject->hasText() || m_dataObject->hasMarkup() || m_dataObject->hasURIList() || m_dataObject->hasImage();
349
    return m_dataObject->hasText() || m_dataObject->hasMarkup() || m_dataObject->hasURIList() || m_dataObject->hasImage() || m_dataObject->hasUnknownTypeData();
343
}
350
}
344
351
345
Vector<String> Pasteboard::types()
352
Vector<String> Pasteboard::types()
Lines 365-370 Vector<String> Pasteboard::types() a/Source/WebCore/platform/gtk/PasteboardGtk.cpp_sec4
365
    if (m_dataObject->hasFilenames())
372
    if (m_dataObject->hasFilenames())
366
        types.append(ASCIILiteral("Files"));
373
        types.append(ASCIILiteral("Files"));
367
374
375
    types.appendVector(m_dataObject->unknownTypes());
376
368
    return types;
377
    return types;
369
}
378
}
370
379
Lines 382-389 String Pasteboard::readString(const String& type) a/Source/WebCore/platform/gtk/PasteboardGtk.cpp_sec5
382
        return m_dataObject->markup();
391
        return m_dataObject->markup();
383
    case ClipboardDataTypeText:
392
    case ClipboardDataTypeText:
384
        return m_dataObject->text();
393
        return m_dataObject->text();
385
    case ClipboardDataTypeImage:
386
    case ClipboardDataTypeUnknown:
394
    case ClipboardDataTypeUnknown:
395
        return m_dataObject->unknownTypeData(type);
396
    case ClipboardDataTypeImage:
387
        break;
397
        break;
388
    }
398
    }
389
399
- a/Source/WebCore/platform/gtk/PasteboardHelper.cpp +40 lines
Lines 1-6 a/Source/WebCore/platform/gtk/PasteboardHelper.cpp_sec1
1
/*
1
/*
2
 * Copyright (C) 2010 Martin Robinson <mrobinson@webkit.org>
2
 * Copyright (C) 2010 Martin Robinson <mrobinson@webkit.org>
3
 * Copyright (C) Igalia S.L.
3
 * Copyright (C) Igalia S.L.
4
 * Copyright (C) 2013 Collabora Ltd.
4
 * All rights reserved.
5
 * All rights reserved.
5
 *
6
 *
6
 * This library is free software; you can redistribute it and/or
7
 * This library is free software; you can redistribute it and/or
Lines 31-36 a/Source/WebCore/platform/gtk/PasteboardHelper.cpp_sec2
31
#include "TextResourceDecoder.h"
32
#include "TextResourceDecoder.h"
32
#include <gtk/gtk.h>
33
#include <gtk/gtk.h>
33
#include <wtf/gobject/GOwnPtr.h>
34
#include <wtf/gobject/GOwnPtr.h>
35
#include <wtf/gobject/GRefPtr.h>
34
36
35
namespace WebCore {
37
namespace WebCore {
36
38
Lines 39-44 static GdkAtom markupAtom; a/Source/WebCore/platform/gtk/PasteboardHelper.cpp_sec3
39
static GdkAtom netscapeURLAtom;
41
static GdkAtom netscapeURLAtom;
40
static GdkAtom uriListAtom;
42
static GdkAtom uriListAtom;
41
static GdkAtom smartPasteAtom;
43
static GdkAtom smartPasteAtom;
44
static GdkAtom unknownAtom;
45
42
static String gMarkupPrefix;
46
static String gMarkupPrefix;
43
47
44
static void removeMarkupPrefix(String& markup)
48
static void removeMarkupPrefix(String& markup)
Lines 63-68 static void initGdkAtoms() a/Source/WebCore/platform/gtk/PasteboardHelper.cpp_sec4
63
    netscapeURLAtom = gdk_atom_intern("_NETSCAPE_URL", FALSE);
67
    netscapeURLAtom = gdk_atom_intern("_NETSCAPE_URL", FALSE);
64
    uriListAtom = gdk_atom_intern("text/uri-list", FALSE);
68
    uriListAtom = gdk_atom_intern("text/uri-list", FALSE);
65
    smartPasteAtom = gdk_atom_intern("application/vnd.webkitgtk.smartpaste", FALSE);
69
    smartPasteAtom = gdk_atom_intern("application/vnd.webkitgtk.smartpaste", FALSE);
70
    unknownAtom = gdk_atom_intern("application/vnd.webkitgtk.unknown", FALSE);
66
    gMarkupPrefix = "<meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\">";
71
    gMarkupPrefix = "<meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\">";
67
}
72
}
68
73
Lines 82-87 PasteboardHelper::PasteboardHelper() a/Source/WebCore/platform/gtk/PasteboardHelper.cpp_sec5
82
    gtk_target_list_add_uri_targets(m_targetList, PasteboardHelper::TargetTypeURIList);
87
    gtk_target_list_add_uri_targets(m_targetList, PasteboardHelper::TargetTypeURIList);
83
    gtk_target_list_add(m_targetList, netscapeURLAtom, 0, PasteboardHelper::TargetTypeNetscapeURL);
88
    gtk_target_list_add(m_targetList, netscapeURLAtom, 0, PasteboardHelper::TargetTypeNetscapeURL);
84
    gtk_target_list_add_image_targets(m_targetList, PasteboardHelper::TargetTypeImage, TRUE);
89
    gtk_target_list_add_image_targets(m_targetList, PasteboardHelper::TargetTypeImage, TRUE);
90
    gtk_target_list_add(m_targetList, unknownAtom, 0, PasteboardHelper::TargetTypeUnknown);
85
}
91
}
86
92
87
PasteboardHelper::~PasteboardHelper()
93
PasteboardHelper::~PasteboardHelper()
Lines 179-184 void PasteboardHelper::fillSelectionData(GtkSelectionData* selectionData, guint a/Source/WebCore/platform/gtk/PasteboardHelper.cpp_sec6
179
185
180
    else if (info == TargetTypeSmartPaste)
186
    else if (info == TargetTypeSmartPaste)
181
        gtk_selection_data_set_text(selectionData, "", -1);
187
        gtk_selection_data_set_text(selectionData, "", -1);
188
189
    else if (info == TargetTypeUnknown) {
190
        GVariantBuilder builder;
191
        g_variant_builder_init(&builder, G_VARIANT_TYPE_ARRAY);
192
193
        Vector<String> types = dataObject->unknownTypes();
194
        for (size_t i = 0; i < types.size(); i++) {
195
            GOwnPtr<gchar> dictItem(g_strdup_printf("{'%s', '%s'}", types[i].utf8().data(), dataObject->unknownTypeData(types[i]).utf8().data()));
196
            g_variant_builder_add_parsed(&builder, dictItem.get());
197
        }
198
199
        GRefPtr<GVariant> variant = adoptGRef(g_variant_builder_end(&builder));
200
        GOwnPtr<gchar> serializedVariant(g_variant_print(variant.get(), TRUE));
201
        gtk_selection_data_set(selectionData, unknownAtom, sizeof(char), reinterpret_cast<const guchar*>(serializedVariant.get()), strlen(serializedVariant.get()));
202
    }
182
}
203
}
183
204
184
GtkTargetList* PasteboardHelper::targetListForDataObject(DataObjectGtk* dataObject, SmartPasteInclusion shouldInludeSmartPaste)
205
GtkTargetList* PasteboardHelper::targetListForDataObject(DataObjectGtk* dataObject, SmartPasteInclusion shouldInludeSmartPaste)
Lines 199-204 GtkTargetList* PasteboardHelper::targetListForDataObject(DataObjectGtk* dataObje a/Source/WebCore/platform/gtk/PasteboardHelper.cpp_sec7
199
    if (dataObject->hasImage())
220
    if (dataObject->hasImage())
200
        gtk_target_list_add_image_targets(list, TargetTypeImage, TRUE);
221
        gtk_target_list_add_image_targets(list, TargetTypeImage, TRUE);
201
222
223
    if (dataObject->hasUnknownTypeData())
224
        gtk_target_list_add(list, unknownAtom, 0, TargetTypeUnknown);
225
202
    if (shouldInludeSmartPaste == IncludeSmartPaste)
226
    if (shouldInludeSmartPaste == IncludeSmartPaste)
203
        gtk_target_list_add(list, smartPasteAtom, 0, TargetTypeSmartPaste);
227
        gtk_target_list_add(list, smartPasteAtom, 0, TargetTypeSmartPaste);
204
228
Lines 230-235 void PasteboardHelper::fillDataObjectFromDropData(GtkSelectionData* data, guint a/Source/WebCore/platform/gtk/PasteboardHelper.cpp_sec8
230
            dataObject->setURIList(pieces[0]);
254
            dataObject->setURIList(pieces[0]);
231
        if (pieces.size() > 1)
255
        if (pieces.size() > 1)
232
            dataObject->setText(pieces[1]);
256
            dataObject->setText(pieces[1]);
257
    } else if (target == unknownAtom) {
258
        GRefPtr<GVariant> variant = adoptGRef(g_variant_new_parsed(reinterpret_cast<const char*>(gtk_selection_data_get_data(data))));
259
260
        GOwnPtr<gchar> key;
261
        GOwnPtr<gchar> value;
262
        GVariantIter iter;
263
264
        g_variant_iter_init(&iter, variant.get());
265
        while (g_variant_iter_next(&iter, "{ss}", &key.outPtr(), &value.outPtr())) {
266
            dataObject->setUnknownTypeData(key.get(), value.get());
267
268
            // FIXME: should GOwnPtr be smarter about this and replace the existing ptr when outPtr() is used?
269
            key.clear();
270
            value.clear();
271
        }
233
    }
272
    }
234
}
273
}
235
274
Lines 241-246 Vector<GdkAtom> PasteboardHelper::dropAtomsForContext(GtkWidget* widget, GdkDrag a/Source/WebCore/platform/gtk/PasteboardHelper.cpp_sec9
241
    dropAtoms.append(markupAtom);
280
    dropAtoms.append(markupAtom);
242
    dropAtoms.append(uriListAtom);
281
    dropAtoms.append(uriListAtom);
243
    dropAtoms.append(netscapeURLAtom);
282
    dropAtoms.append(netscapeURLAtom);
283
    dropAtoms.append(unknownAtom);
244
284
245
    // For images, try to find the most applicable image type.
285
    // For images, try to find the most applicable image type.
246
    GRefPtr<GtkTargetList> list = adoptGRef(gtk_target_list_new(0, 0));
286
    GRefPtr<GtkTargetList> list = adoptGRef(gtk_target_list_new(0, 0));
- a/LayoutTests/ChangeLog +9 lines
Lines 1-3 a/LayoutTests/ChangeLog_sec1
1
2013-11-20  Gustavo Noronha Silva  <gustavo.noronha@collabora.com>
2
3
        [GTK] Support custom types for drag and drop data
4
        https://bugs.webkit.org/show_bug.cgi?id=124659
5
6
        Reviewed by NOBODY (OOPS!).
7
8
        * platform/gtk/TestExpectations: remove failure expectation for test that now passes.
9
1
2013-11-18  Michał Pakuła vel Rutka  <m.pakula@samsung.com>
10
2013-11-18  Michał Pakuła vel Rutka  <m.pakula@samsung.com>
2
11
3
        Unreviewed EFL gardening
12
        Unreviewed EFL gardening
- a/LayoutTests/platform/gtk/TestExpectations -1 lines
Lines 227-233 webkit.org/b/85463 editing/inserting/smart-link-when-caret-is-moved-before-URL.h a/LayoutTests/platform/gtk/TestExpectations_sec1
227
227
228
# Custom MIME type support in DataTransfer is not yet implemented.
228
# Custom MIME type support in DataTransfer is not yet implemented.
229
webkit.org/b/99068 editing/pasteboard/clipboard-customData.html [ Failure ]
229
webkit.org/b/99068 editing/pasteboard/clipboard-customData.html [ Failure ]
230
webkit.org/b/99068 fast/events/drag-customData.html [ Failure ]
231
230
232
# PasteBoard::plainText() does not support file names.
231
# PasteBoard::plainText() does not support file names.
233
webkit.org/b/99070 editing/pasteboard/drag-files-to-editable-element.html [ Failure ]
232
webkit.org/b/99070 editing/pasteboard/drag-files-to-editable-element.html [ Failure ]

Return to Bug 124659