Support FormData outside Window scopes.

This commit is contained in:
Ms2ger 2014-07-15 20:05:51 +02:00
parent 829259fb79
commit 350a6080d7

View file

@ -6,14 +6,13 @@ use dom::bindings::codegen::Bindings::FormDataBinding;
use dom::bindings::codegen::InheritTypes::FileCast; use dom::bindings::codegen::InheritTypes::FileCast;
use dom::bindings::codegen::UnionTypes::FileOrString::{FileOrString, eFile, eString}; use dom::bindings::codegen::UnionTypes::FileOrString::{FileOrString, eFile, eString};
use dom::bindings::error::{Fallible}; use dom::bindings::error::{Fallible};
use dom::bindings::global::{GlobalRef, Window}; use dom::bindings::global::{GlobalRef, GlobalField};
use dom::bindings::js::{JS, JSRef, Temporary}; use dom::bindings::js::{JS, JSRef, Temporary};
use dom::bindings::trace::Traceable; use dom::bindings::trace::Traceable;
use dom::bindings::utils::{Reflectable, Reflector, reflect_dom_object}; use dom::bindings::utils::{Reflectable, Reflector, reflect_dom_object};
use dom::blob::Blob; use dom::blob::Blob;
use dom::file::File; use dom::file::File;
use dom::htmlformelement::HTMLFormElement; use dom::htmlformelement::HTMLFormElement;
use dom::window::Window;
use servo_util::str::DOMString; use servo_util::str::DOMString;
use std::cell::RefCell; use std::cell::RefCell;
use std::collections::hashmap::HashMap; use std::collections::hashmap::HashMap;
@ -28,27 +27,27 @@ pub enum FormDatum {
pub struct FormData { pub struct FormData {
data: Traceable<RefCell<HashMap<DOMString, Vec<FormDatum>>>>, data: Traceable<RefCell<HashMap<DOMString, Vec<FormDatum>>>>,
reflector_: Reflector, reflector_: Reflector,
window: JS<Window>, global: GlobalField,
form: Option<JS<HTMLFormElement>> form: Option<JS<HTMLFormElement>>
} }
impl FormData { impl FormData {
pub fn new_inherited(form: Option<JSRef<HTMLFormElement>>, window: &JSRef<Window>) -> FormData { pub fn new_inherited(form: Option<JSRef<HTMLFormElement>>, global: &GlobalRef) -> FormData {
FormData { FormData {
data: Traceable::new(RefCell::new(HashMap::new())), data: Traceable::new(RefCell::new(HashMap::new())),
reflector_: Reflector::new(), reflector_: Reflector::new(),
window: JS::from_rooted(window), global: GlobalField::from_rooted(global),
form: form.map(|f| JS::from_rooted(&f)), form: form.map(|f| JS::from_rooted(&f)),
} }
} }
pub fn new(form: Option<JSRef<HTMLFormElement>>, window: &JSRef<Window>) -> Temporary<FormData> { pub fn new(form: Option<JSRef<HTMLFormElement>>, global: &GlobalRef) -> Temporary<FormData> {
reflect_dom_object(box FormData::new_inherited(form, window), reflect_dom_object(box FormData::new_inherited(form, global),
&Window(*window), FormDataBinding::Wrap) global, FormDataBinding::Wrap)
} }
pub fn Constructor(global: &GlobalRef, form: Option<JSRef<HTMLFormElement>>) -> Fallible<Temporary<FormData>> { pub fn Constructor(global: &GlobalRef, form: Option<JSRef<HTMLFormElement>>) -> Fallible<Temporary<FormData>> {
Ok(FormData::new(form, global.as_window())) Ok(FormData::new(form, global))
} }
} }
@ -117,9 +116,9 @@ trait PrivateFormDataHelpers{
impl PrivateFormDataHelpers for FormData { impl PrivateFormDataHelpers for FormData {
fn get_file_from_blob(&self, value: &JSRef<Blob>, filename: Option<DOMString>) -> Temporary<File> { fn get_file_from_blob(&self, value: &JSRef<Blob>, filename: Option<DOMString>) -> Temporary<File> {
let window = self.window.root(); let global = self.global.root();
let f: Option<&JSRef<File>> = FileCast::to_ref(value); let f: Option<&JSRef<File>> = FileCast::to_ref(value);
let name = filename.unwrap_or(f.map(|inner| inner.name.clone()).unwrap_or("blob".to_string())); let name = filename.unwrap_or(f.map(|inner| inner.name.clone()).unwrap_or("blob".to_string()));
File::new(&Window(*window), value, name) File::new(&global.root_ref(), value, name)
} }
} }