1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package org.htmlunit.javascript.host.draganddrop;
16
17 import java.util.ArrayList;
18
19 import org.htmlunit.corejs.javascript.Context;
20 import org.htmlunit.corejs.javascript.Function;
21 import org.htmlunit.corejs.javascript.Scriptable;
22 import org.htmlunit.javascript.HtmlUnitScriptable;
23 import org.htmlunit.javascript.JavaScriptEngine;
24 import org.htmlunit.javascript.configuration.JsxClass;
25 import org.htmlunit.javascript.configuration.JsxConstructor;
26 import org.htmlunit.javascript.configuration.JsxFunction;
27 import org.htmlunit.javascript.configuration.JsxGetter;
28 import org.htmlunit.javascript.configuration.JsxSymbol;
29 import org.htmlunit.javascript.host.file.File;
30 import org.htmlunit.javascript.host.file.FileList;
31
32
33
34
35
36
37
38 @JsxClass
39 public class DataTransferItemList extends HtmlUnitScriptable {
40
41 private ArrayList<DataTransferItem> items_;
42 private FileList fileList_;
43
44
45
46
47 @JsxConstructor
48 public void jsConstructor() {
49
50 }
51
52
53
54
55 @JsxGetter
56 public int getLength() {
57 if (items_ == null) {
58 return 0;
59 }
60 return items_.size();
61 }
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76 @JsxFunction
77 public static DataTransferItem add(final Context context, final Scriptable scope,
78 final Scriptable thisObj, final Object[] args, final Function function) {
79 final DataTransferItemList itemList = (DataTransferItemList) thisObj;
80 if (args.length == 1) {
81 if (args[0] instanceof File) {
82 final DataTransferItem item = DataTransferItem.buildFileItem((File) args[0]);
83 item.setParentScope(itemList.getParentScope());
84 item.setPrototype(itemList.getPrototype(item.getClass()));
85
86 if (itemList.items_ == null) {
87 itemList.items_ = new ArrayList<>();
88 }
89 itemList.items_.add(item);
90 itemList.updateFileList();
91
92 return item;
93 }
94 throw JavaScriptEngine.typeError(
95 "Failed to execute 'add' on 'DataTransferItemList': parameter 1 is not of type 'File'.");
96 }
97
98 if (args.length > 1) {
99 final String data = JavaScriptEngine.toString(args[0]);
100 final String type = JavaScriptEngine.toString(args[1]);
101 final DataTransferItem item = DataTransferItem.buildStringItem(data, type);
102 item.setParentScope(itemList.getParentScope());
103 item.setPrototype(itemList.getPrototype(item.getClass()));
104
105 if (itemList.items_ == null) {
106 itemList.items_ = new ArrayList<>();
107 }
108 itemList.items_.add(item);
109
110 return item;
111 }
112
113 throw JavaScriptEngine.typeError(
114 "Failed to execute 'add' on 'DataTransferItemList' - no args provided.");
115 }
116
117
118
119
120 @JsxFunction
121 public void clear() {
122 if (items_ != null) {
123 items_.clear();
124 if (fileList_ != null) {
125 fileList_.updateFiles(new ArrayList<>());
126 }
127 }
128 }
129
130
131
132
133
134
135
136 @JsxFunction
137 public void remove(final int index) {
138 if (items_ != null) {
139 if (index >= 0 && index < items_.size()) {
140 items_.remove(index);
141 updateFileList();
142 }
143 }
144 }
145
146
147
148
149 @Override
150 public Object get(final int index, final Scriptable start) {
151 if (this == start) {
152 if (index >= 0 && index < items_.size()) {
153 return items_.get(index);
154 }
155 }
156 return super.get(index, start);
157 }
158
159
160
161
162
163 @JsxSymbol(symbolName = "iterator")
164 public Scriptable values() {
165 return JavaScriptEngine.newArrayIteratorTypeValues(getParentScope(), this);
166 }
167
168
169
170
171
172
173 public FileList getFiles() {
174 if (fileList_ == null) {
175 final FileList list = new FileList(new java.io.File[0]);
176 list.setParentScope(getParentScope());
177 list.setPrototype(getPrototype(list.getClass()));
178 fileList_ = list;
179
180 if (items_ != null) {
181 updateFileList();
182 }
183 }
184 return fileList_;
185 }
186
187 private void updateFileList() {
188 if (fileList_ != null) {
189 final ArrayList<File> files = new ArrayList<>();
190 for (final DataTransferItem item : items_) {
191 if (item.isFile()) {
192 files.add(item.getAsFile());
193 }
194 }
195 fileList_.updateFiles(files);
196 }
197 }
198 }