Make DataTransferItemList work with plain text entries
[WebKit-https.git] / Source / WebCore / dom / DataTransferItemList.cpp
1 /*
2  * Copyright (C) 2017 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #include "config.h"
27 #include "DataTransferItemList.h"
28
29 #include "DataTransferItem.h"
30 #include "FileList.h"
31
32 namespace WebCore {
33
34 unsigned DataTransferItemList::length() const
35 {
36     return ensureItems().size();
37 }
38
39 RefPtr<DataTransferItem> DataTransferItemList::item(unsigned index)
40 {
41     auto& items = ensureItems();
42     if (items.size() <= index)
43         return nullptr;
44     return items[index].get();
45 }
46
47 ExceptionOr<void> DataTransferItemList::add(const String&, const String&)
48 {
49     return { };
50 }
51
52 void DataTransferItemList::add(RefPtr<File>&&)
53 {
54 }
55
56 void DataTransferItemList::remove(unsigned)
57 {
58 }
59
60 void DataTransferItemList::clear()
61 {
62 }
63
64 // FIXME: DataTransfer should filter types itself.
65 static bool isSupportedType(const String& type)
66 {
67     return equalIgnoringASCIICase(type, "text/plain");
68 }
69
70 Vector<std::unique_ptr<DataTransferItem>>& DataTransferItemList::ensureItems() const
71 {
72     if (m_items)
73         return *m_items;
74
75     Vector<std::unique_ptr<DataTransferItem>> items;
76     for (String& type : m_dataTransfer.types()) {
77         if (isSupportedType(type))
78             items.append(std::make_unique<DataTransferItem>(m_dataTransfer, type));
79     }
80
81     FileList& files = m_dataTransfer.files();
82     for (unsigned i = 0, length = files.length(); i < length; ++i) {
83         File& file = *files.item(i);
84         String type = File::contentTypeForFile(file.path());
85         if (isSupportedType(type))
86             items.append(std::make_unique<DataTransferItem>(m_dataTransfer, type, file));
87     }
88
89
90     m_items = WTFMove(items);
91
92     return *m_items;
93 }
94
95 }
96