diff options
Diffstat (limited to 'components/script/dom')
-rw-r--r-- | components/script/dom/bindings/codegen/CodegenRust.py | 35 | ||||
-rw-r--r-- | components/script/dom/request.rs | 22 | ||||
-rw-r--r-- | components/script/dom/response.rs | 29 |
3 files changed, 57 insertions, 29 deletions
diff --git a/components/script/dom/bindings/codegen/CodegenRust.py b/components/script/dom/bindings/codegen/CodegenRust.py index 7c6b2fe3718..4ea45ef9ded 100644 --- a/components/script/dom/bindings/codegen/CodegenRust.py +++ b/components/script/dom/bindings/codegen/CodegenRust.py @@ -1984,15 +1984,15 @@ def DOMClassTypeId(desc): inner = "" if desc.hasDescendants(): if desc.interface.getExtendedAttribute("Abstract"): - return "::dom::bindings::codegen::InheritTypes::TopTypeId::Abstract" + return "::dom::bindings::codegen::InheritTypes::TopTypeId { abstract_: () }" name = desc.interface.identifier.name inner = "(::dom::bindings::codegen::InheritTypes::%sTypeId::%s)" % (name, name) elif len(protochain) == 1: - return "::dom::bindings::codegen::InheritTypes::TopTypeId::Alone" + return "::dom::bindings::codegen::InheritTypes::TopTypeId { alone: () }" reversed_protochain = list(reversed(protochain)) for (child, parent) in zip(reversed_protochain, reversed_protochain[1:]): inner = "(::dom::bindings::codegen::InheritTypes::%sTypeId::%s%s)" % (parent, child, inner) - return "::dom::bindings::codegen::InheritTypes::TopTypeId::%s%s" % (protochain[0], inner) + return "::dom::bindings::codegen::InheritTypes::TopTypeId { %s: %s }" % (protochain[0].lower(), inner) def DOMClass(descriptor): @@ -6931,18 +6931,26 @@ class GlobalGenRoots(): typeIdCode = [] topTypeVariants = [ - ("ID used by abstract interfaces.", "Abstract"), - ("ID used by interfaces that are not castable.", "Alone"), + ("ID used by abstract interfaces.", "pub abstract_: ()"), + ("ID used by interfaces that are not castable.", "pub alone: ()"), ] topTypeVariants += [ - ("ID used by interfaces that derive from %s." % typeName, "%s(%sTypeId)" % (typeName, typeName)) + ("ID used by interfaces that derive from %s." % typeName, + "pub %s: %sTypeId" % (typeName.lower(), typeName)) for typeName in topTypes ] topTypeVariantsAsStrings = [CGGeneric("/// %s\n%s," % variant) for variant in topTypeVariants] typeIdCode.append(CGWrapper(CGIndenter(CGList(topTypeVariantsAsStrings, "\n"), 4), - pre="#[derive(Clone, Copy, Debug)]\npub enum TopTypeId {\n", + pre="#[derive(Copy)]\npub union TopTypeId {\n", post="\n}\n\n")) + typeIdCode.append(CGGeneric("""\ +impl Clone for TopTypeId { + fn clone(&self) -> Self { *self } +} + +""")) + def type_id_variant(name): # If `name` is present in the hierarchy keys', that means some other interfaces # derive from it and this enum variant should have an argument with its own @@ -6962,17 +6970,16 @@ class GlobalGenRoots(): typeIdCode.append(CGGeneric("""\ impl %(base)s { pub fn type_id(&self) -> &'static %(base)sTypeId { - let domclass = unsafe { - get_dom_class(self.reflector().get_jsobject().get()).unwrap() - }; - match domclass.type_id { - TopTypeId::%(base)s(ref type_id) => type_id, - _ => unreachable!(), + unsafe { + &get_dom_class(self.reflector().get_jsobject().get()) + .unwrap() + .type_id + .%(field)s } } } -""" % {'base': base})) +""" % {'base': base, 'field': base.lower()})) curr = CGList(imports + typeIdCode + allprotos) curr = CGWrapper(curr, pre=AUTOGENERATED_WARNING_COMMENT) diff --git a/components/script/dom/request.rs b/components/script/dom/request.rs index ebfe0abf49e..fa665679c0d 100644 --- a/components/script/dom/request.rs +++ b/components/script/dom/request.rs @@ -36,7 +36,6 @@ use net_traits::request::Request as NetTraitsRequest; use net_traits::request::RequestMode as NetTraitsRequestMode; use net_traits::request::Type as NetTraitsRequestType; use std::cell::{Cell, Ref}; -use std::mem; use std::rc::Rc; use url::Url; @@ -47,6 +46,8 @@ pub struct Request { body_used: Cell<bool>, headers: MutNullableHeap<JS<Headers>>, mime_type: DOMRefCell<Vec<u8>>, + #[ignore_heap_size_of = "Rc"] + body_promise: DOMRefCell<Option<(Rc<Promise>, BodyType)>>, } impl Request { @@ -62,6 +63,7 @@ impl Request { body_used: Cell::new(false), headers: Default::default(), mime_type: DOMRefCell::new("".to_string().into_bytes()), + body_promise: DOMRefCell::new(None), } } @@ -662,20 +664,20 @@ impl BodyOperations for Request { self.BodyUsed() } + fn set_body_promise(&self, p: &Rc<Promise>, body_type: BodyType) { + assert!(self.body_promise.borrow().is_none()); + self.body_used.set(true); + *self.body_promise.borrow_mut() = Some((p.clone(), body_type)); + } + fn is_locked(&self) -> bool { self.locked() } fn take_body(&self) -> Option<Vec<u8>> { - let ref mut net_traits_req = *self.request.borrow_mut(); - let body: Option<Vec<u8>> = mem::replace(&mut *net_traits_req.body.borrow_mut(), None); - match body { - Some(_) => { - self.body_used.set(true); - body - }, - _ => None, - } + let request = self.request.borrow_mut(); + let body = request.body.borrow_mut().take(); + Some(body.unwrap_or(vec![])) } fn get_mime_type(&self) -> Ref<Vec<u8>> { diff --git a/components/script/dom/response.rs b/components/script/dom/response.rs index 66a7e84f112..2287bb181b4 100644 --- a/components/script/dom/response.rs +++ b/components/script/dom/response.rs @@ -2,7 +2,7 @@ * 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 body::{BodyOperations, BodyType, consume_body}; +use body::{BodyOperations, BodyType, consume_body, consume_body_with_promise}; use core::cell::Cell; use dom::bindings::cell::DOMRefCell; use dom::bindings::codegen::Bindings::HeadersBinding::HeadersMethods; @@ -44,6 +44,8 @@ pub struct Response { url_list: DOMRefCell<Vec<Url>>, // For now use the existing NetTraitsResponseBody enum body: DOMRefCell<NetTraitsResponseBody>, + #[ignore_heap_size_of = "Rc"] + body_promise: DOMRefCell<Option<(Rc<Promise>, BodyType)>>, } impl Response { @@ -59,6 +61,7 @@ impl Response { url: DOMRefCell::new(None), url_list: DOMRefCell::new(vec![]), body: DOMRefCell::new(NetTraitsResponseBody::Empty), + body_promise: DOMRefCell::new(None), } } @@ -194,18 +197,26 @@ impl BodyOperations for Response { self.BodyUsed() } + fn set_body_promise(&self, p: &Rc<Promise>, body_type: BodyType) { + assert!(self.body_promise.borrow().is_none()); + self.body_used.set(true); + *self.body_promise.borrow_mut() = Some((p.clone(), body_type)); + } + fn is_locked(&self) -> bool { self.locked() } fn take_body(&self) -> Option<Vec<u8>> { - let body: NetTraitsResponseBody = mem::replace(&mut *self.body.borrow_mut(), NetTraitsResponseBody::Empty); + let body = mem::replace(&mut *self.body.borrow_mut(), NetTraitsResponseBody::Empty); match body { - NetTraitsResponseBody::Done(bytes) | NetTraitsResponseBody::Receiving(bytes) => { - self.body_used.set(true); + NetTraitsResponseBody::Done(bytes) => { Some(bytes) }, - _ => None, + body => { + mem::replace(&mut *self.body.borrow_mut(), body); + None + }, } } @@ -366,4 +377,12 @@ impl Response { pub fn set_final_url(&self, final_url: Url) { *self.url.borrow_mut() = Some(final_url); } + + #[allow(unrooted_must_root)] + pub fn finish(&self, body: Vec<u8>) { + *self.body.borrow_mut() = NetTraitsResponseBody::Done(body); + if let Some((p, body_type)) = self.body_promise.borrow_mut().take() { + consume_body_with_promise(self, body_type, &p); + } + } } |