diff --git a/components/script/dom/filelist.rs b/components/script/dom/filelist.rs new file mode 100644 index 00000000000..75e06d026d5 --- /dev/null +++ b/components/script/dom/filelist.rs @@ -0,0 +1,51 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +use dom::bindings::codegen::Bindings::FileListBinding; +use dom::bindings::codegen::Bindings::FileListBinding::FileListMethods; +use dom::bindings::global::GlobalRef; +use dom::bindings::js::{JS, Root}; +use dom::bindings::utils::{Reflector, reflect_dom_object}; +use dom::file::File; +use dom::window::Window; + +// https://w3c.github.io/FileAPI/#dfn-filelist +#[dom_struct] +pub struct FileList { + reflector_: Reflector, + list: Vec> +} + +impl FileList { + fn new_inherited(files: Vec>) -> FileList { + FileList { + reflector_: Reflector::new(), + list: files + } + } + + pub fn new(window: &Window, files: Vec>) -> Root { + reflect_dom_object(box FileList::new_inherited(files), GlobalRef::Window(window), FileListBinding::Wrap) + } +} + +impl<'a> FileListMethods for &'a FileList { + // https://w3c.github.io/FileAPI/#dfn-length + fn Length(self) -> u32 { + self.list.len() as u32 + } + + // https://w3c.github.io/FileAPI/#dfn-item + fn Item(self, index: u32) -> Option> { + Some(self.list[index as usize].root()) + } + + // check-tidy: no specs after this line + fn IndexedGetter(self, index: u32, found: &mut bool) -> Option> { + let item = self.Item(index); + *found = item.is_some(); + item + } +} + diff --git a/components/script/dom/mod.rs b/components/script/dom/mod.rs index b6e9667e034..663d14784a6 100644 --- a/components/script/dom/mod.rs +++ b/components/script/dom/mod.rs @@ -215,6 +215,7 @@ pub mod event; pub mod eventdispatcher; pub mod eventtarget; pub mod file; +pub mod filelist; pub mod filereader; pub mod formdata; pub mod htmlanchorelement; diff --git a/components/script/dom/webidls/FileList.webidl b/components/script/dom/webidls/FileList.webidl new file mode 100644 index 00000000000..aa1f9791427 --- /dev/null +++ b/components/script/dom/webidls/FileList.webidl @@ -0,0 +1,11 @@ +/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +// https://w3c.github.io/FileAPI/#dfn-filelist + +interface FileList { + getter File? item(unsigned long index); + readonly attribute unsigned long length; +}; diff --git a/python/tidy.py b/python/tidy.py index 8f185483d1d..21b7c74e36c 100644 --- a/python/tidy.py +++ b/python/tidy.py @@ -202,6 +202,7 @@ def check_webidl_spec(file_name, contents): "//xhr.spec.whatwg.org", "//www.whatwg.org/html", "//www.whatwg.org/specs", + "//w3c.github.io", # Not a URL "// This interface is entirely internal to Servo, and should not be" + " accessible to\n// web pages." diff --git a/tests/wpt/metadata/FileAPI/filelist-section/filelist.html.ini b/tests/wpt/metadata/FileAPI/filelist-section/filelist.html.ini index f890a69db47..4c198fa1a2f 100644 --- a/tests/wpt/metadata/FileAPI/filelist-section/filelist.html.ini +++ b/tests/wpt/metadata/FileAPI/filelist-section/filelist.html.ini @@ -1,11 +1,5 @@ [filelist.html] type: testharness - [Check if window has a FileList property] - expected: FAIL - - [Check if FileList.length is 0] - expected: FAIL - [Check if item is a instanceof Function] expected: FAIL diff --git a/tests/wpt/metadata/FileAPI/idlharness.html.ini b/tests/wpt/metadata/FileAPI/idlharness.html.ini index 8f91c767de4..1e55a714eab 100644 --- a/tests/wpt/metadata/FileAPI/idlharness.html.ini +++ b/tests/wpt/metadata/FileAPI/idlharness.html.ini @@ -48,24 +48,6 @@ [Blob interface: new File(["myFileBits"\], "myFileName") must inherit property "close" with the proper type (4)] expected: FAIL - [FileList interface: existence and properties of interface object] - expected: FAIL - - [FileList interface object length] - expected: FAIL - - [FileList interface: existence and properties of interface prototype object] - expected: FAIL - - [FileList interface: existence and properties of interface prototype object's "constructor" property] - expected: FAIL - - [FileList interface: operation item(unsigned long)] - expected: FAIL - - [FileList interface: attribute length] - expected: FAIL - [FileList must be primary interface of file_input.files] expected: FAIL diff --git a/tests/wpt/metadata/FileAPI/idlharness.worker.js.ini b/tests/wpt/metadata/FileAPI/idlharness.worker.js.ini index 221a609a2a2..7979f7a0066 100644 --- a/tests/wpt/metadata/FileAPI/idlharness.worker.js.ini +++ b/tests/wpt/metadata/FileAPI/idlharness.worker.js.ini @@ -48,24 +48,6 @@ [Blob interface: new File(["myFileBits"\], "myFileName") must inherit property "close" with the proper type (4)] expected: FAIL - [FileList interface: existence and properties of interface object] - expected: FAIL - - [FileList interface object length] - expected: FAIL - - [FileList interface: existence and properties of interface prototype object] - expected: FAIL - - [FileList interface: existence and properties of interface prototype object's "constructor" property] - expected: FAIL - - [FileList interface: operation item(unsigned long)] - expected: FAIL - - [FileList interface: attribute length] - expected: FAIL - [FileReader interface: existence and properties of interface object] expected: FAIL diff --git a/tests/wpt/metadata/workers/semantics/interface-objects/001.worker.js.ini b/tests/wpt/metadata/workers/semantics/interface-objects/001.worker.js.ini index b1ea2b0bbdf..3c18db71f27 100644 --- a/tests/wpt/metadata/workers/semantics/interface-objects/001.worker.js.ini +++ b/tests/wpt/metadata/workers/semantics/interface-objects/001.worker.js.ini @@ -9,9 +9,6 @@ [The MessageChannel interface object should be exposed.] expected: FAIL - [The FileList interface object should be exposed.] - expected: FAIL - [The CanvasProxy interface object should be exposed.] expected: FAIL diff --git a/tests/wpt/mozilla/tests/mozilla/interfaces.html b/tests/wpt/mozilla/tests/mozilla/interfaces.html index 0f3cc380888..546d55354d4 100644 --- a/tests/wpt/mozilla/tests/mozilla/interfaces.html +++ b/tests/wpt/mozilla/tests/mozilla/interfaces.html @@ -99,6 +99,7 @@ var interfaceNamesInGlobalScope = [ "Event", "EventTarget", "File", + "FileList", "FileReader", "FormData", "HTMLAnchorElement",