aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/dom')
-rw-r--r--components/script/dom/bindings/codegen/CodegenRust.py35
-rw-r--r--components/script/dom/request.rs22
-rw-r--r--components/script/dom/response.rs29
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);
+ }
+ }
}