Implement filter for file-type input's accept attribute

This commit is contained in:
Zhen Zhang 2016-06-16 08:35:30 +08:00
parent 881c02ec89
commit 74eb80dbd8
9 changed files with 78 additions and 45 deletions

View file

@ -37,7 +37,8 @@ ipc-channel = {git = "https://github.com/servo/ipc-channel"}
js = {git = "https://github.com/servo/rust-mozjs"}
libc = "0.2"
log = "0.3.5"
mime = "0.2.0"
mime = "0.2.1"
mime_guess = "1.8.0"
msg = {path = "../msg"}
net_traits = {path = "../net_traits"}
num-traits = "0.1.32"

View file

@ -32,6 +32,7 @@ use dom::nodelist::NodeList;
use dom::validation::Validatable;
use dom::virtualmethods::VirtualMethods;
use ipc_channel::ipc::{self, IpcSender};
use mime_guess;
use net_traits::IpcSend;
use net_traits::filemanager_thread::{FileManagerThreadMsg, FilterPattern};
use script_traits::ScriptMsg as ConstellationMsg;
@ -44,6 +45,7 @@ use style::element_state::*;
use textinput::KeyReaction::{DispatchInput, Nothing, RedrawSelection, TriggerDefaultAction};
use textinput::Lines::Single;
use textinput::{TextInput, SelectionDirection};
use util::str::split_commas;
const DEFAULT_SUBMIT_VALUE: &'static str = "Submit";
const DEFAULT_RESET_VALUE: &'static str = "Reset";
@ -1140,7 +1142,7 @@ impl Activatable for HTMLInputElement {
let mut files: Vec<Root<File>> = vec![];
let mut error = None;
let filter = filter_from_accept(self.Accept());
let filter = filter_from_accept(&self.Accept());
if self.Multiple() {
let (chan, recv) = ipc::channel().expect("Error initializing channel");
@ -1231,9 +1233,20 @@ impl Activatable for HTMLInputElement {
}
}
fn filter_from_accept(_s: DOMString) -> Vec<FilterPattern> {
/// TODO: it means not pattern restriction now
/// Blocked by https://github.com/cybergeek94/mime_guess/issues/19
vec![]
}
// https://html.spec.whatwg.org/multipage/#attr-input-accept
fn filter_from_accept(s: &DOMString) -> Vec<FilterPattern> {
let mut filter = vec![];
for p in split_commas(s) {
if let Some('.') = p.chars().nth(0) {
filter.push(FilterPattern(p[1..].to_string()));
} else {
if let Some(exts) = mime_guess::get_mime_extensions_str(p) {
for ext in exts {
filter.push(FilterPattern(ext.to_string()));
}
}
}
}
filter
}

View file

@ -55,6 +55,7 @@ extern crate libc;
extern crate log;
#[macro_use]
extern crate mime;
extern crate mime_guess;
extern crate msg;
extern crate net_traits;
extern crate num_traits;