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