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