aboutsummaryrefslogtreecommitdiffstats
path: root/components/script
diff options
context:
space:
mode:
authorAnthony Ramine <n.oxyde@gmail.com>2015-04-27 01:51:28 +0200
committerAnthony Ramine <n.oxyde@gmail.com>2015-04-27 10:45:38 +0200
commitafafde5191e5de9934103d4ecad5c51559146dc9 (patch)
tree09b45de622b1d9eaf69b8bc29a19f424dbdcb4ed /components/script
parent21c38d0de8e82e29d187929535a73bfd297538b8 (diff)
downloadservo-afafde5191e5de9934103d4ecad5c51559146dc9.tar.gz
servo-afafde5191e5de9934103d4ecad5c51559146dc9.zip
Change MutNullableJS<T> to MutNullableHeap<JS<T>>
Diffstat (limited to 'components/script')
-rw-r--r--components/script/dom/attr.rs10
-rw-r--r--components/script/dom/bindings/js.rs81
-rw-r--r--components/script/dom/document.rs42
-rw-r--r--components/script/dom/element.rs9
-rw-r--r--components/script/dom/event.rs18
-rw-r--r--components/script/dom/htmlanchorelement.rs5
-rw-r--r--components/script/dom/htmlareaelement.rs4
-rw-r--r--components/script/dom/htmlcanvaselement.rs12
-rw-r--r--components/script/dom/htmlelement.rs6
-rw-r--r--components/script/dom/htmlinputelement.rs9
-rw-r--r--components/script/dom/htmllinkelement.rs5
-rw-r--r--components/script/dom/mouseevent.rs9
-rw-r--r--components/script/dom/node.rs83
-rw-r--r--components/script/dom/storageevent.rs9
-rw-r--r--components/script/dom/uievent.rs9
-rw-r--r--components/script/dom/window.rs15
-rw-r--r--components/script/dom/workerglobalscope.rs8
-rw-r--r--components/script/dom/xmlhttprequest.rs7
18 files changed, 172 insertions, 169 deletions
diff --git a/components/script/dom/attr.rs b/components/script/dom/attr.rs
index 1387131e0f8..c25c9d4d611 100644
--- a/components/script/dom/attr.rs
+++ b/components/script/dom/attr.rs
@@ -6,7 +6,7 @@ use dom::bindings::cell::DOMRefCell;
use dom::bindings::codegen::Bindings::AttrBinding::{self, AttrMethods};
use dom::bindings::codegen::InheritTypes::NodeCast;
use dom::bindings::global::GlobalRef;
-use dom::bindings::js::{JSRef, MutNullableJS, Temporary};
+use dom::bindings::js::{JS, JSRef, MutNullableHeap, Temporary};
use dom::bindings::js::{OptionalRootable, OptionalRootedRootable};
use dom::bindings::js::RootedReference;
use dom::bindings::utils::{Reflector, reflect_dom_object};
@@ -104,7 +104,7 @@ pub struct Attr {
prefix: Option<DOMString>,
/// the element that owns this attribute.
- owner: MutNullableJS<Element>,
+ owner: MutNullableHeap<JS<Element>>,
}
impl Attr {
@@ -117,7 +117,7 @@ impl Attr {
name: name,
namespace: namespace,
prefix: prefix,
- owner: MutNullableJS::new(owner),
+ owner: MutNullableHeap::new(owner.map(JS::from_rooted)),
}
}
@@ -271,11 +271,11 @@ impl<'a> AttrHelpers<'a> for JSRef<'a, Attr> {
}
(old, new) => assert!(old == new)
}
- self.owner.assign(owner)
+ self.owner.set(owner.map(JS::from_rooted))
}
fn owner(self) -> Option<Temporary<Element>> {
- self.owner.get()
+ self.owner.get().map(Temporary::new)
}
fn summarize(self) -> AttrInfo {
diff --git a/components/script/dom/bindings/js.rs b/components/script/dom/bindings/js.rs
index cb8aaf04160..80eb1317f32 100644
--- a/components/script/dom/bindings/js.rs
+++ b/components/script/dom/bindings/js.rs
@@ -339,76 +339,65 @@ impl<T: HeapGCValue+Copy> MutHeap<T> {
}
}
-/// A mutable `JS<T>` value, with nullability represented by an enclosing
-/// Option wrapper. Must be used in place of traditional internal mutability
-/// to ensure that the proper GC barriers are enforced.
+/// A mutable holder for GC-managed values such as `JSval` and `JS<T>`, with
+/// nullability represented by an enclosing Option wrapper. Must be used in
+/// place of traditional internal mutability to ensure that the proper GC
+/// barriers are enforced.
#[must_root]
#[jstraceable]
-pub struct MutNullableJS<T: Reflectable> {
- ptr: Cell<Option<JS<T>>>
+pub struct MutNullableHeap<T: HeapGCValue+Copy> {
+ ptr: Cell<Option<T>>
}
-impl<U: Reflectable> MutNullableJS<U> {
- /// Create a new `MutNullableJS`
- pub fn new<T: Assignable<U>>(initial: Option<T>) -> MutNullableJS<U> {
- MutNullableJS {
- ptr: Cell::new(initial.map(|initial| {
- unsafe { initial.get_js() }
- }))
+impl<T: HeapGCValue+Copy> MutNullableHeap<T> {
+ /// Create a new `MutNullableHeap`.
+ pub fn new(initial: Option<T>) -> MutNullableHeap<T> {
+ MutNullableHeap {
+ ptr: Cell::new(initial)
}
}
-}
-
-impl<T: Reflectable> Default for MutNullableJS<T> {
- fn default() -> MutNullableJS<T> {
- MutNullableJS {
- ptr: Cell::new(None)
- }
- }
-}
-
-impl<T: Reflectable> MutNullableJS<T> {
- /// Store an unrooted value in this field. This is safe under the
- /// assumption that `MutNullableJS<T>` values are only used as fields in
- /// DOM types that are reachable in the GC graph, so this unrooted value
- /// becomes transitively rooted for the lifetime of its new owner.
- pub fn assign<U: Assignable<T>>(&self, val: Option<U>) {
- self.ptr.set(val.map(|val| {
- unsafe { val.get_js() }
- }));
- }
- /// Set the inner value to null, without making API users jump through
- /// useless type-ascription hoops.
- pub fn clear(&self) {
- self.assign(None::<JS<T>>);
+ /// Set this `MutNullableHeap` to the given value, calling write barriers
+ /// as appropriate.
+ pub fn set(&self, val: Option<T>) {
+ self.ptr.set(val);
}
/// Retrieve a copy of the current optional inner value.
- pub fn get(&self) -> Option<Temporary<T>> {
- self.ptr.get().map(Temporary::new)
- }
-
- /// Retrieve a copy of the inner optional `JS<T>` as `LayoutJS<T>`.
- /// For use by layout, which can't use safe types like Temporary.
- pub unsafe fn get_inner_as_layout(&self) -> Option<LayoutJS<T>> {
- self.ptr.get().map(|js| js.to_layout())
+ pub fn get(&self) -> Option<T> {
+ self.ptr.get()
}
+}
+impl<T: Reflectable> MutNullableHeap<JS<T>> {
/// Retrieve a copy of the current inner value. If it is `None`, it is
/// initialized with the result of `cb` first.
pub fn or_init<F>(&self, cb: F) -> Temporary<T>
where F: FnOnce() -> Temporary<T>
{
match self.get() {
- Some(inner) => inner,
+ Some(inner) => Temporary::new(inner),
None => {
let inner = cb();
- self.assign(Some(inner.clone()));
+ self.set(Some(JS::from_rooted(inner.clone())));
inner
},
}
}
+
+ /// Retrieve a copy of the inner optional `JS<T>` as `LayoutJS<T>`.
+ /// For use by layout, which can't use safe types like Temporary.
+ pub unsafe fn get_inner_as_layout(&self) -> Option<LayoutJS<T>> {
+ self.ptr.get().map(|js| js.to_layout())
+ }
+}
+
+impl<T: HeapGCValue+Copy> Default for MutNullableHeap<T> {
+ fn default() -> MutNullableHeap<T> {
+ MutNullableHeap {
+ ptr: Cell::new(None)
+ }
+ }
}
impl<T: Reflectable> JS<T> {
diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs
index e83f9c51bbb..8cd3655d7c5 100644
--- a/components/script/dom/document.rs
+++ b/components/script/dom/document.rs
@@ -24,8 +24,10 @@ use dom::bindings::error::{ErrorResult, Fallible};
use dom::bindings::error::Error::{NotSupported, InvalidCharacter, Security};
use dom::bindings::error::Error::HierarchyRequest;
use dom::bindings::global::GlobalRef;
-use dom::bindings::js::{MutNullableJS, JS, JSRef, LayoutJS, Temporary, TemporaryPushable};
-use dom::bindings::js::{OptionalRootable, RootedReference};
+use dom::bindings::js::{JS, JSRef, LayoutJS, MutNullableHeap};
+use dom::bindings::js::{OptionalRootable, OptionalRootedRootable};
+use dom::bindings::js::{RootedReference, Temporary};
+use dom::bindings::js::TemporaryPushable;
use dom::bindings::refcounted::Trusted;
use dom::bindings::trace::RootedVec;
use dom::bindings::utils::reflect_dom_object;
@@ -102,28 +104,28 @@ pub struct Document {
node: Node,
window: JS<Window>,
idmap: DOMRefCell<HashMap<Atom, Vec<JS<Element>>>>,
- implementation: MutNullableJS<DOMImplementation>,
- location: MutNullableJS<Location>,
+ implementation: MutNullableHeap<JS<DOMImplementation>>,
+ location: MutNullableHeap<JS<Location>>,
content_type: DOMString,
last_modified: Option<DOMString>,
encoding_name: DOMRefCell<DOMString>,
is_html_document: bool,
url: Url,
quirks_mode: Cell<QuirksMode>,
- images: MutNullableJS<HTMLCollection>,
- embeds: MutNullableJS<HTMLCollection>,
- links: MutNullableJS<HTMLCollection>,
- forms: MutNullableJS<HTMLCollection>,
- scripts: MutNullableJS<HTMLCollection>,
- anchors: MutNullableJS<HTMLCollection>,
- applets: MutNullableJS<HTMLCollection>,
+ images: MutNullableHeap<JS<HTMLCollection>>,
+ embeds: MutNullableHeap<JS<HTMLCollection>>,
+ links: MutNullableHeap<JS<HTMLCollection>>,
+ forms: MutNullableHeap<JS<HTMLCollection>>,
+ scripts: MutNullableHeap<JS<HTMLCollection>>,
+ anchors: MutNullableHeap<JS<HTMLCollection>>,
+ applets: MutNullableHeap<JS<HTMLCollection>>,
ready_state: Cell<DocumentReadyState>,
/// The element that has most recently requested focus for itself.
- possibly_focused: MutNullableJS<Element>,
+ possibly_focused: MutNullableHeap<JS<Element>>,
/// The element that currently has the document focus context.
- focused: MutNullableJS<Element>,
+ focused: MutNullableHeap<JS<Element>>,
/// The script element that is currently executing.
- current_script: MutNullableJS<HTMLScriptElement>,
+ current_script: MutNullableHeap<JS<HTMLScriptElement>>,
/// https://html.spec.whatwg.org/multipage/#concept-n-noscript
/// True if scripting is enabled for all scripts in this document
scripting_enabled: Cell<bool>,
@@ -440,19 +442,19 @@ impl<'a> DocumentHelpers<'a> for JSRef<'a, Document> {
/// Return the element that currently has focus.
// https://dvcs.w3.org/hg/dom3events/raw-file/tip/html/DOM3-Events.html#events-focusevent-doc-focus
fn get_focused_element(self) -> Option<Temporary<Element>> {
- self.focused.get()
+ self.focused.get().map(Temporary::new)
}
/// Initiate a new round of checking for elements requesting focus. The last element to call
/// `request_focus` before `commit_focus_transaction` is called will receive focus.
fn begin_focus_transaction(self) {
- self.possibly_focused.clear();
+ self.possibly_focused.set(None);
}
/// Request that the given element receive focus once the current transaction is complete.
fn request_focus(self, elem: JSRef<Element>) {
if elem.is_focusable_area() {
- self.possibly_focused.assign(Some(elem))
+ self.possibly_focused.set(Some(JS::from_rooted(elem)))
}
}
@@ -466,7 +468,7 @@ impl<'a> DocumentHelpers<'a> for JSRef<'a, Document> {
node.set_focus_state(false);
}
- self.focused.assign(self.possibly_focused.get());
+ self.focused.set(self.possibly_focused.get());
if let Some(ref elem) = self.focused.get().root() {
let node: JSRef<Node> = NodeCast::from_ref(elem.r());
@@ -741,7 +743,7 @@ impl<'a> DocumentHelpers<'a> for JSRef<'a, Document> {
}
fn set_current_script(self, script: Option<JSRef<HTMLScriptElement>>) {
- self.current_script.assign(script);
+ self.current_script.set(script.map(JS::from_rooted));
}
fn trigger_mozbrowser_event(self, event: MozBrowserEvent) {
@@ -1250,7 +1252,7 @@ impl<'a> DocumentMethods for JSRef<'a, Document> {
// https://html.spec.whatwg.org/#dom-document-currentscript
fn GetCurrentScript(self) -> Option<Temporary<HTMLScriptElement>> {
- self.current_script.get()
+ self.current_script.get().map(Temporary::new)
}
// https://html.spec.whatwg.org/#dom-document-body
diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs
index 3f0ba0e8ca1..c17d4dce43f 100644
--- a/components/script/dom/element.rs
+++ b/components/script/dom/element.rs
@@ -27,8 +27,9 @@ use dom::bindings::codegen::UnionTypes::NodeOrString;
use dom::bindings::error::{ErrorResult, Fallible};
use dom::bindings::error::Error::{InvalidCharacter, Syntax};
use dom::bindings::error::Error::NoModificationAllowed;
-use dom::bindings::js::{MutNullableJS, JS, JSRef, LayoutJS, Temporary, TemporaryPushable};
-use dom::bindings::js::{OptionalRootable, RootedReference};
+use dom::bindings::js::{JS, JSRef, LayoutJS, MutNullableHeap};
+use dom::bindings::js::{OptionalRootable, RootedReference, Temporary};
+use dom::bindings::js::TemporaryPushable;
use dom::bindings::trace::RootedVec;
use dom::bindings::utils::{xml_name_type, validate_and_extract};
use dom::bindings::utils::XMLName::InvalidXMLName;
@@ -88,8 +89,8 @@ pub struct Element {
prefix: Option<DOMString>,
attrs: DOMRefCell<Vec<JS<Attr>>>,
style_attribute: DOMRefCell<Option<PropertyDeclarationBlock>>,
- attr_list: MutNullableJS<NamedNodeMap>,
- class_list: MutNullableJS<DOMTokenList>,
+ attr_list: MutNullableHeap<JS<NamedNodeMap>>,
+ class_list: MutNullableHeap<JS<DOMTokenList>>,
}
impl ElementDerived for EventTarget {
diff --git a/components/script/dom/event.rs b/components/script/dom/event.rs
index b44fef145a1..8a969fb3e9b 100644
--- a/components/script/dom/event.rs
+++ b/components/script/dom/event.rs
@@ -7,7 +7,7 @@ use dom::bindings::codegen::Bindings::EventBinding;
use dom::bindings::codegen::Bindings::EventBinding::{EventConstants, EventMethods};
use dom::bindings::error::Fallible;
use dom::bindings::global::GlobalRef;
-use dom::bindings::js::{MutNullableJS, JSRef, Temporary};
+use dom::bindings::js::{JS, JSRef, MutNullableHeap, Temporary};
use dom::bindings::utils::{Reflector, reflect_dom_object};
use dom::eventtarget::{EventTarget, EventTargetHelpers};
use util::str::DOMString;
@@ -58,8 +58,8 @@ pub enum EventCancelable {
pub struct Event {
reflector_: Reflector,
type_id: EventTypeId,
- current_target: MutNullableJS<EventTarget>,
- target: MutNullableJS<EventTarget>,
+ current_target: MutNullableHeap<JS<EventTarget>>,
+ target: MutNullableHeap<JS<EventTarget>>,
type_: DOMRefCell<DOMString>,
phase: Cell<EventPhase>,
canceled: Cell<bool>,
@@ -124,17 +124,17 @@ impl Event {
#[inline]
pub fn clear_current_target(&self) {
- self.current_target.clear();
+ self.current_target.set(None);
}
#[inline]
pub fn set_current_target(&self, val: JSRef<EventTarget>) {
- self.current_target.assign(Some(val));
+ self.current_target.set(Some(JS::from_rooted(val)));
}
#[inline]
pub fn set_target(&self, val: JSRef<EventTarget>) {
- self.target.assign(Some(val));
+ self.target.set(Some(JS::from_rooted(val)));
}
#[inline]
@@ -188,12 +188,12 @@ impl<'a> EventMethods for JSRef<'a, Event> {
// https://dom.spec.whatwg.org/#dom-event-target
fn GetTarget(self) -> Option<Temporary<EventTarget>> {
- self.target.get()
+ self.target.get().map(Temporary::new)
}
// https://dom.spec.whatwg.org/#dom-event-currenttarget
fn GetCurrentTarget(self) -> Option<Temporary<EventTarget>> {
- self.current_target.get()
+ self.current_target.get().map(Temporary::new)
}
// https://dom.spec.whatwg.org/#dom-event-defaultprevented
@@ -248,7 +248,7 @@ impl<'a> EventMethods for JSRef<'a, Event> {
self.stop_immediate.set(false);
self.canceled.set(false);
self.trusted.set(false);
- self.target.clear();
+ self.target.set(None);
*self.type_.borrow_mut() = type_;
self.bubbles.set(bubbles);
self.cancelable.set(cancelable);
diff --git a/components/script/dom/htmlanchorelement.rs b/components/script/dom/htmlanchorelement.rs
index 80e5d476837..74c8e8b2d85 100644
--- a/components/script/dom/htmlanchorelement.rs
+++ b/components/script/dom/htmlanchorelement.rs
@@ -13,7 +13,8 @@ use dom::bindings::codegen::Bindings::NodeBinding::NodeMethods;
use dom::bindings::codegen::InheritTypes::{HTMLAnchorElementDerived, HTMLImageElementDerived};
use dom::bindings::codegen::InheritTypes::{ElementCast, HTMLElementCast};
use dom::bindings::codegen::InheritTypes::{MouseEventCast, NodeCast};
-use dom::bindings::js::{MutNullableJS, JSRef, Temporary, OptionalRootable};
+use dom::bindings::js::{JS, JSRef, MutNullableHeap, Temporary};
+use dom::bindings::js::OptionalRootable;
use dom::document::{Document, DocumentHelpers};
use dom::domtokenlist::DOMTokenList;
use dom::element::{Element, AttributeHandlers, ElementTypeId};
@@ -32,7 +33,7 @@ use util::str::DOMString;
#[dom_struct]
pub struct HTMLAnchorElement {
htmlelement: HTMLElement,
- rel_list: MutNullableJS<DOMTokenList>,
+ rel_list: MutNullableHeap<JS<DOMTokenList>>,
}
impl HTMLAnchorElementDerived for EventTarget {
diff --git a/components/script/dom/htmlareaelement.rs b/components/script/dom/htmlareaelement.rs
index 0a88f6153a8..9c7d255a5b4 100644
--- a/components/script/dom/htmlareaelement.rs
+++ b/components/script/dom/htmlareaelement.rs
@@ -7,7 +7,7 @@ use dom::bindings::codegen::Bindings::HTMLAreaElementBinding;
use dom::bindings::codegen::Bindings::HTMLAreaElementBinding::HTMLAreaElementMethods;
use dom::bindings::codegen::InheritTypes::{HTMLAreaElementDerived, HTMLElementCast};
use dom::bindings::codegen::InheritTypes::ElementCast;
-use dom::bindings::js::{MutNullableJS, JSRef, Temporary};
+use dom::bindings::js::{JS, JSRef, MutNullableHeap, Temporary};
use dom::bindings::utils::Reflectable;
use dom::document::Document;
use dom::domtokenlist::DOMTokenList;
@@ -24,7 +24,7 @@ use util::str::DOMString;
#[dom_struct]
pub struct HTMLAreaElement {
htmlelement: HTMLElement,
- rel_list: MutNullableJS<DOMTokenList>,
+ rel_list: MutNullableHeap<JS<DOMTokenList>>,
}
impl HTMLAreaElementDerived for EventTarget {
diff --git a/components/script/dom/htmlcanvaselement.rs b/components/script/dom/htmlcanvaselement.rs
index efeb61386e0..5beb415f3e1 100644
--- a/components/script/dom/htmlcanvaselement.rs
+++ b/components/script/dom/htmlcanvaselement.rs
@@ -11,7 +11,8 @@ use dom::bindings::codegen::InheritTypes::HTMLCanvasElementDerived;
use dom::bindings::codegen::InheritTypes::{ElementCast, HTMLElementCast};
use dom::bindings::codegen::UnionTypes::CanvasRenderingContext2DOrWebGLRenderingContext;
use dom::bindings::global::GlobalRef;
-use dom::bindings::js::{MutNullableJS, JSRef, LayoutJS, Temporary, Unrooted};
+use dom::bindings::js::{JS, JSRef, LayoutJS, MutNullableHeap, Temporary};
+use dom::bindings::js::Unrooted;
use dom::bindings::utils::{Reflectable};
use dom::canvasrenderingcontext2d::{CanvasRenderingContext2D, LayoutCanvasRenderingContext2DHelpers};
use dom::document::Document;
@@ -37,8 +38,8 @@ const DEFAULT_HEIGHT: u32 = 150;
#[dom_struct]
pub struct HTMLCanvasElement {
htmlelement: HTMLElement,
- context_2d: MutNullableJS<CanvasRenderingContext2D>,
- context_webgl: MutNullableJS<WebGLRenderingContext>,
+ context_2d: MutNullableHeap<JS<CanvasRenderingContext2D>>,
+ context_webgl: MutNullableHeap<JS<WebGLRenderingContext>>,
width: Cell<u32>,
height: Cell<u32>,
}
@@ -192,11 +193,12 @@ impl<'a> HTMLCanvasElementMethods for JSRef<'a, HTMLCanvasElement> {
let window = window_from_node(self).root();
let size = self.get_size();
- self.context_webgl.assign(WebGLRenderingContext::new(GlobalRef::Window(window.r()), self, size))
+ self.context_webgl.set(
+ WebGLRenderingContext::new(GlobalRef::Window(window.r()), self, size).map(JS::from_rooted))
}
self.context_webgl.get().map( |ctx|
- CanvasRenderingContext2DOrWebGLRenderingContext::eWebGLRenderingContext(Unrooted::from_temporary(ctx)))
+ CanvasRenderingContext2DOrWebGLRenderingContext::eWebGLRenderingContext(Unrooted::from_js(ctx)))
}
_ => None
}
diff --git a/components/script/dom/htmlelement.rs b/components/script/dom/htmlelement.rs
index 8c0445b8ea2..c0431b3856a 100644
--- a/components/script/dom/htmlelement.rs
+++ b/components/script/dom/htmlelement.rs
@@ -12,7 +12,7 @@ use dom::bindings::codegen::Bindings::WindowBinding::WindowMethods;
use dom::bindings::codegen::InheritTypes::{ElementCast, HTMLFrameSetElementDerived};
use dom::bindings::codegen::InheritTypes::{EventTargetCast, HTMLInputElementCast, NodeCast};
use dom::bindings::codegen::InheritTypes::{HTMLElementDerived, HTMLBodyElementDerived};
-use dom::bindings::js::{JSRef, Temporary, MutNullableJS};
+use dom::bindings::js::{JS, JSRef, MutNullableHeap, Temporary};
use dom::bindings::error::ErrorResult;
use dom::bindings::error::Error::Syntax;
use dom::bindings::utils::Reflectable;
@@ -39,8 +39,8 @@ use std::default::Default;
#[dom_struct]
pub struct HTMLElement {
element: Element,
- style_decl: MutNullableJS<CSSStyleDeclaration>,
- dataset: MutNullableJS<DOMStringMap>,
+ style_decl: MutNullableHeap<JS<CSSStyleDeclaration>>,
+ dataset: MutNullableHeap<JS<DOMStringMap>>,
}
impl HTMLElementDerived for EventTarget {
diff --git a/components/script/dom/htmlinputelement.rs b/components/script/dom/htmlinputelement.rs
index d8f5407a9d1..56596a181e9 100644
--- a/components/script/dom/htmlinputelement.rs
+++ b/components/script/dom/htmlinputelement.rs
@@ -14,8 +14,9 @@ use dom::bindings::codegen::InheritTypes::{ElementCast, HTMLElementCast, HTMLInp
use dom::bindings::codegen::InheritTypes::{HTMLInputElementDerived, HTMLFieldSetElementDerived, EventTargetCast};
use dom::bindings::codegen::InheritTypes::KeyboardEventCast;
use dom::bindings::global::GlobalRef;
-use dom::bindings::js::{Comparable, JSRef, LayoutJS, Root, Temporary, OptionalRootable};
-use dom::bindings::js::{ResultRootable, RootedReference, MutNullableJS};
+use dom::bindings::js::{Comparable, JS, JSRef, LayoutJS, MutNullableHeap};
+use dom::bindings::js::{OptionalRootable, OptionalRootedRootable};
+use dom::bindings::js::{ResultRootable, Root, RootedReference, Temporary};
use dom::document::{Document, DocumentHelpers};
use dom::element::{AttributeHandlers, Element};
use dom::element::{RawLayoutElementHelpers, ActivationElementHelpers};
@@ -80,7 +81,7 @@ struct InputActivationState {
indeterminate: bool,
checked: bool,
checked_changed: bool,
- checked_radio: MutNullableJS<HTMLInputElement>,
+ checked_radio: MutNullableHeap<JS<HTMLInputElement>>,
// In case mutability changed
was_mutable: bool,
// In case the type changed
@@ -694,7 +695,7 @@ impl<'a> Activatable for JSRef<'a, HTMLInputElement> {
r.r().Checked()
})
};
- cache.checked_radio.assign(checked_member.r());
+ cache.checked_radio.set(checked_member.r().map(JS::from_rooted));
cache.checked_changed = self.checked_changed.get();
self.SetChecked(true);
}
diff --git a/components/script/dom/htmllinkelement.rs b/components/script/dom/htmllinkelement.rs
index c1b455ccf49..0a415c8d0be 100644
--- a/components/script/dom/htmllinkelement.rs
+++ b/components/script/dom/htmllinkelement.rs
@@ -8,7 +8,8 @@ use dom::bindings::codegen::Bindings::HTMLLinkElementBinding;
use dom::bindings::codegen::Bindings::HTMLLinkElementBinding::HTMLLinkElementMethods;
use dom::bindings::codegen::InheritTypes::HTMLLinkElementDerived;
use dom::bindings::codegen::InheritTypes::{ElementCast, HTMLElementCast, NodeCast};
-use dom::bindings::js::{MutNullableJS, JSRef, Temporary, OptionalRootable};
+use dom::bindings::js::{JS, JSRef, MutNullableHeap, Temporary};
+use dom::bindings::js::OptionalRootable;
use dom::document::Document;
use dom::domtokenlist::DOMTokenList;
use dom::element::{AttributeHandlers, Element};
@@ -33,7 +34,7 @@ use string_cache::Atom;
#[dom_struct]
pub struct HTMLLinkElement {
htmlelement: HTMLElement,
- rel_list: MutNullableJS<DOMTokenList>,
+ rel_list: MutNullableHeap<JS<DOMTokenList>>,
}
impl HTMLLinkElementDerived for EventTarget {
diff --git a/components/script/dom/mouseevent.rs b/components/script/dom/mouseevent.rs
index 1af4adf79c4..71e95fb4b02 100644
--- a/components/script/dom/mouseevent.rs
+++ b/components/script/dom/mouseevent.rs
@@ -8,7 +8,8 @@ use dom::bindings::codegen::Bindings::UIEventBinding::UIEventMethods;
use dom::bindings::codegen::InheritTypes::{EventCast, UIEventCast, MouseEventDerived};
use dom::bindings::error::Fallible;
use dom::bindings::global::GlobalRef;
-use dom::bindings::js::{MutNullableJS, JSRef, RootedReference, Temporary};
+use dom::bindings::js::{JS, JSRef, MutNullableHeap, RootedReference};
+use dom::bindings::js::Temporary;
use dom::bindings::utils::reflect_dom_object;
use dom::event::{Event, EventTypeId, EventBubbles, EventCancelable};
use dom::eventtarget::EventTarget;
@@ -30,7 +31,7 @@ pub struct MouseEvent {
alt_key: Cell<bool>,
meta_key: Cell<bool>,
button: Cell<i16>,
- related_target: MutNullableJS<EventTarget>
+ related_target: MutNullableHeap<JS<EventTarget>>,
}
impl MouseEventDerived for Event {
@@ -142,7 +143,7 @@ impl<'a> MouseEventMethods for JSRef<'a, MouseEvent> {
}
fn GetRelatedTarget(self) -> Option<Temporary<EventTarget>> {
- self.related_target.get()
+ self.related_target.get().map(Temporary::new)
}
fn InitMouseEvent(self,
@@ -177,7 +178,7 @@ impl<'a> MouseEventMethods for JSRef<'a, MouseEvent> {
self.shift_key.set(shiftKeyArg);
self.meta_key.set(metaKeyArg);
self.button.set(buttonArg);
- self.related_target.assign(relatedTargetArg);
+ self.related_target.set(relatedTargetArg.map(JS::from_rooted));
}
}
diff --git a/components/script/dom/node.rs b/components/script/dom/node.rs
index 8037454d5dc..525130af9fc 100644
--- a/components/script/dom/node.rs
+++ b/components/script/dom/node.rs
@@ -24,9 +24,10 @@ use dom::bindings::conversions;
use dom::bindings::error::{ErrorResult, Fallible};
use dom::bindings::error::Error::{NotFound, HierarchyRequest, Syntax};
use dom::bindings::global::GlobalRef;
-use dom::bindings::js::{JS, JSRef, LayoutJS, RootedReference, Temporary, Root, Unrooted};
-use dom::bindings::js::{TemporaryPushable, OptionalRootedRootable};
-use dom::bindings::js::{ResultRootable, OptionalRootable, MutNullableJS};
+use dom::bindings::js::{JS, JSRef, LayoutJS, OptionalRootable};
+use dom::bindings::js::{OptionalRootedRootable, MutNullableHeap};
+use dom::bindings::js::{ResultRootable, Root, RootedReference, Temporary};
+use dom::bindings::js::{TemporaryPushable, Unrooted};
use dom::bindings::trace::JSTraceable;
use dom::bindings::trace::RootedVec;
use dom::bindings::utils::{Reflectable, reflect_dom_object};
@@ -85,25 +86,25 @@ pub struct Node {
type_id: NodeTypeId,
/// The parent of this node.
- parent_node: MutNullableJS<Node>,
+ parent_node: MutNullableHeap<JS<Node>>,
/// The first child of this node.
- first_child: MutNullableJS<Node>,
+ first_child: MutNullableHeap<JS<Node>>,
/// The last child of this node.
- last_child: MutNullableJS<Node>,
+ last_child: MutNullableHeap<JS<Node>>,
/// The next sibling of this node.
- next_sibling: MutNullableJS<Node>,
+ next_sibling: MutNullableHeap<JS<Node>>,
/// The previous sibling of this node.
- prev_sibling: MutNullableJS<Node>,
+ prev_sibling: MutNullableHeap<JS<Node>>,
/// The document that this node belongs to.
- owner_doc: MutNullableJS<Document>,
+ owner_doc: MutNullableHeap<JS<Document>>,
/// The live list of children return by .childNodes.
- child_list: MutNullableJS<NodeList>,
+ child_list: MutNullableHeap<JS<NodeList>>,
/// A bitfield of flags for node items.
flags: Cell<NodeFlags>,
@@ -328,31 +329,31 @@ impl<'a> PrivateNodeHelpers for JSRef<'a, Node> {
match before.prev_sibling().root() {
None => {
assert!(Some(*before) == self.first_child().root().r());
- self.first_child.assign(Some(new_child));
+ self.first_child.set(Some(JS::from_rooted(new_child)));
},
Some(prev_sibling) => {
- prev_sibling.r().next_sibling.assign(Some(new_child));
- new_child.prev_sibling.assign(Some(prev_sibling.r()));
+ prev_sibling.r().next_sibling.set(Some(JS::from_rooted(new_child)));
+ new_child.prev_sibling.set(Some(JS::from_rooted(prev_sibling.r())));
},
}
- before.prev_sibling.assign(Some(new_child));
- new_child.next_sibling.assign(Some(*before));
+ before.prev_sibling.set(Some(JS::from_rooted(new_child)));
+ new_child.next_sibling.set(Some(JS::from_rooted(*before)));
},
None => {
match self.last_child().root() {
- None => self.first_child.assign(Some(new_child)),
+ None => self.first_child.set(Some(JS::from_rooted(new_child))),
Some(last_child) => {
assert!(last_child.r().next_sibling().is_none());
- last_child.r().next_sibling.assign(Some(new_child));
- new_child.prev_sibling.assign(Some(last_child.r()));
+ last_child.r().next_sibling.set(Some(JS::from_rooted(new_child)));
+ new_child.prev_sibling.set(Some(JS::from_rooted(last_child.r())));
}
}
- self.last_child.assign(Some(new_child));
+ self.last_child.set(Some(JS::from_rooted(new_child)));
},
}
- new_child.parent_node.assign(Some(self));
+ new_child.parent_node.set(Some(JS::from_rooted(self)));
}
/// Removes the given child from this node's list of children.
@@ -363,25 +364,25 @@ impl<'a> PrivateNodeHelpers for JSRef<'a, Node> {
match child.prev_sibling.get().root() {
None => {
- self.first_child.assign(child.next_sibling.get());
+ self.first_child.set(child.next_sibling.get());
}
Some(prev_sibling) => {
- prev_sibling.r().next_sibling.assign(child.next_sibling.get());
+ prev_sibling.r().next_sibling.set(child.next_sibling.get());
}
}
match child.next_sibling.get().root() {
None => {
- self.last_child.assign(child.prev_sibling.get());
+ self.last_child.set(child.prev_sibling.get());
}
Some(next_sibling) => {
- next_sibling.r().prev_sibling.assign(child.prev_sibling.get());
+ next_sibling.r().prev_sibling.set(child.prev_sibling.get());
}
}
- child.prev_sibling.clear();
- child.next_sibling.clear();
- child.parent_node.clear();
+ child.prev_sibling.set(None);
+ child.next_sibling.set(None);
+ child.parent_node.set(None);
}
}
@@ -569,25 +570,25 @@ impl<'a> NodeHelpers for JSRef<'a, Node> {
}
fn parent_node(self) -> Option<Temporary<Node>> {
- self.parent_node.get()
+ self.parent_node.get().map(Temporary::new)
}
fn first_child(self) -> Option<Temporary<Node>> {
- self.first_child.get()
+ self.first_child.get().map(Temporary::new)
}
fn last_child(self) -> Option<Temporary<Node>> {
- self.last_child.get()
+ self.last_child.get().map(Temporary::new)
}
/// Returns the previous sibling of this node. Fails if this node is borrowed mutably.
fn prev_sibling(self) -> Option<Temporary<Node>> {
- self.prev_sibling.get()
+ self.prev_sibling.get().map(Temporary::new)
}
/// Returns the next sibling of this node. Fails if this node is borrowed mutably.
fn next_sibling(self) -> Option<Temporary<Node>> {
- self.next_sibling.get()
+ self.next_sibling.get().map(Temporary::new)
}
#[inline]
@@ -946,11 +947,11 @@ impl<'a> NodeHelpers for JSRef<'a, Node> {
}
fn owner_doc(self) -> Temporary<Document> {
- self.owner_doc.get().unwrap()
+ Temporary::new(self.owner_doc.get().unwrap())
}
fn set_owner_doc(self, document: JSRef<Document>) {
- self.owner_doc.assign(Some(document.clone()));
+ self.owner_doc.set(Some(JS::from_rooted(document)));
}
fn is_in_html_doc(self) -> bool {
@@ -959,7 +960,7 @@ impl<'a> NodeHelpers for JSRef<'a, Node> {
fn children(self) -> NodeSiblingIterator {
NodeSiblingIterator {
- current: self.first_child.get(),
+ current: self.first_child(),
}
}
@@ -1346,7 +1347,7 @@ impl Node {
last_child: Default::default(),
next_sibling: Default::default(),
prev_sibling: Default::default(),
- owner_doc: MutNullableJS::new(doc),
+ owner_doc: MutNullableHeap::new(doc.map(JS::from_rooted)),
child_list: Default::default(),
flags: Cell::new(NodeFlags::new(type_id)),
@@ -1872,7 +1873,7 @@ impl<'a> NodeMethods for JSRef<'a, Node> {
// https://dom.spec.whatwg.org/#dom-node-parentnode
fn GetParentNode(self) -> Option<Temporary<Node>> {
- self.parent_node.get()
+ self.parent_node.get().map(Temporary::new)
}
// https://dom.spec.whatwg.org/#dom-node-parentelement
@@ -1902,22 +1903,22 @@ impl<'a> NodeMethods for JSRef<'a, Node> {
// https://dom.spec.whatwg.org/#dom-node-firstchild
fn GetFirstChild(self) -> Option<Temporary<Node>> {
- self.first_child.get()
+ self.first_child.get().map(Temporary::new)
}
// https://dom.spec.whatwg.org/#dom-node-lastchild
fn GetLastChild(self) -> Option<Temporary<Node>> {
- self.last_child.get()
+ self.last_child.get().map(Temporary::new)
}
// https://dom.spec.whatwg.org/#dom-node-previoussibling
fn GetPreviousSibling(self) -> Option<Temporary<Node>> {
- self.prev_sibling.get()
+ self.prev_sibling.get().map(Temporary::new)
}
// https://dom.spec.whatwg.org/#dom-node-nextsibling
fn GetNextSibling(self) -> Option<Temporary<Node>> {
- self.next_sibling.get()
+ self.next_sibling.get().map(Temporary::new)
}
// https://dom.spec.whatwg.org/#dom-node-nodevalue
diff --git a/components/script/dom/storageevent.rs b/components/script/dom/storageevent.rs
index 18de6ae88f0..ba394df0ee8 100644
--- a/components/script/dom/storageevent.rs
+++ b/components/script/dom/storageevent.rs
@@ -10,7 +10,8 @@ use dom::bindings::codegen::Bindings::StorageEventBinding::{StorageEventMethods}
use dom::bindings::codegen::InheritTypes::{EventCast};
use dom::bindings::error::Fallible;
use dom::bindings::global::GlobalRef;
-use dom::bindings::js::{MutNullableJS, JSRef, RootedReference, Temporary};
+use dom::bindings::js::{JS, JSRef, MutNullableHeap, RootedReference};
+use dom::bindings::js::Temporary;
use dom::bindings::utils::{reflect_dom_object};
use dom::event::{Event, EventTypeId, EventBubbles, EventCancelable};
use dom::storage::Storage;
@@ -23,7 +24,7 @@ pub struct StorageEvent {
oldValue: DOMRefCell<Option<DOMString>>,
newValue: DOMRefCell<Option<DOMString>>,
url: DOMRefCell<DOMString>,
- storageArea: MutNullableJS<Storage>
+ storageArea: MutNullableHeap<JS<Storage>>
}
@@ -40,7 +41,7 @@ impl StorageEvent {
oldValue: DOMRefCell::new(oldValue),
newValue: DOMRefCell::new(newValue),
url: DOMRefCell::new(url),
- storageArea: MutNullableJS::new(storageArea)
+ storageArea: MutNullableHeap::new(storageArea.map(JS::from_rooted))
}
}
@@ -107,7 +108,7 @@ impl<'a> StorageEventMethods for JSRef<'a, StorageEvent> {
}
fn GetStorageArea(self) -> Option<Temporary<Storage>> {
- self.storageArea.get()
+ self.storageArea.get().map(Temporary::new)
}
}
diff --git a/components/script/dom/uievent.rs b/components/script/dom/uievent.rs
index 24d029cbce7..eec08a0193b 100644
--- a/components/script/dom/uievent.rs
+++ b/components/script/dom/uievent.rs
@@ -8,7 +8,8 @@ use dom::bindings::codegen::Bindings::UIEventBinding::UIEventMethods;
use dom::bindings::codegen::InheritTypes::{EventCast, UIEventDerived};
use dom::bindings::error::Fallible;
use dom::bindings::global::GlobalRef;
-use dom::bindings::js::{MutNullableJS, JSRef, RootedReference, Temporary};
+use dom::bindings::js::{JS, JSRef, MutNullableHeap, RootedReference};
+use dom::bindings::js::Temporary;
use dom::bindings::utils::reflect_dom_object;
use dom::event::{Event, EventTypeId, EventBubbles, EventCancelable};
@@ -22,7 +23,7 @@ use std::default::Default;
#[dom_struct]
pub struct UIEvent {
event: Event,
- view: MutNullableJS<Window>,
+ view: MutNullableHeap<JS<Window>>,
detail: Cell<i32>
}
@@ -73,7 +74,7 @@ impl UIEvent {
impl<'a> UIEventMethods for JSRef<'a, UIEvent> {
// https://dvcs.w3.org/hg/dom3events/raw-file/tip/html/DOM3-Events.html#widl-UIEvent-view
fn GetView(self) -> Option<Temporary<Window>> {
- self.view.get()
+ self.view.get().map(Temporary::new)
}
// https://dvcs.w3.org/hg/dom3events/raw-file/tip/html/DOM3-Events.html#widl-UIEvent-detail
@@ -93,7 +94,7 @@ impl<'a> UIEventMethods for JSRef<'a, UIEvent> {
}
event.InitEvent(type_, can_bubble, cancelable);
- self.view.assign(view);
+ self.view.set(view.map(JS::from_rooted));
self.detail.set(detail);
}
}
diff --git a/components/script/dom/window.rs b/components/script/dom/window.rs
index ec98dfff19f..f8c468e14fc 100644
--- a/components/script/dom/window.rs
+++ b/components/script/dom/window.rs
@@ -13,7 +13,8 @@ use dom::bindings::global::global_object_for_js_object;
use dom::bindings::error::{report_pending_exception, Fallible};
use dom::bindings::error::Error::InvalidCharacter;
use dom::bindings::global::GlobalRef;
-use dom::bindings::js::{MutNullableJS, JSRef, Temporary, OptionalRootable, RootedReference};
+use dom::bindings::js::{JS, JSRef, MutNullableHeap, OptionalRootable};
+use dom::bindings::js::{RootedReference, Temporary};
use dom::bindings::utils::{GlobalStaticData, Reflectable, WindowProxyHandler};
use dom::browsercontext::BrowserContext;
use dom::console::Console;
@@ -87,19 +88,19 @@ pub struct Window {
eventtarget: EventTarget,
script_chan: Box<ScriptChan+Send>,
control_chan: ScriptControlChan,
- console: MutNullableJS<Console>,
- navigator: MutNullableJS<Navigator>,
+ console: MutNullableHeap<JS<Console>>,
+ navigator: MutNullableHeap<JS<Navigator>>,
image_cache_task: ImageCacheTask,
image_cache_chan: ImageCacheChan,
compositor: DOMRefCell<Box<ScriptListener+'static>>,
browser_context: DOMRefCell<Option<BrowserContext>>,
page: Rc<Page>,
- performance: MutNullableJS<Performance>,
+ performance: MutNullableHeap<JS<Performance>>,
navigation_start: u64,
navigation_start_precise: f64,
- screen: MutNullableJS<Screen>,
- session_storage: MutNullableJS<Storage>,
- local_storage: MutNullableJS<Storage>,
+ screen: MutNullableHeap<JS<Screen>>,
+ session_storage: MutNullableHeap<JS<Storage>>,
+ local_storage: MutNullableHeap<JS<Storage>>,
timers: TimerManager,
next_worker_id: Cell<WorkerId>,
diff --git a/components/script/dom/workerglobalscope.rs b/components/script/dom/workerglobalscope.rs
index 170dd317c7b..ec58f3e4221 100644
--- a/components/script/dom/workerglobalscope.rs
+++ b/components/script/dom/workerglobalscope.rs
@@ -8,7 +8,7 @@ use dom::bindings::codegen::InheritTypes::DedicatedWorkerGlobalScopeCast;
use dom::bindings::error::{ErrorResult, Fallible};
use dom::bindings::error::Error::{Syntax, Network, JSFailed};
use dom::bindings::global::GlobalRef;
-use dom::bindings::js::{MutNullableJS, JSRef, Temporary};
+use dom::bindings::js::{JS, JSRef, MutNullableHeap, Temporary};
use dom::bindings::utils::Reflectable;
use dom::console::Console;
use dom::dedicatedworkerglobalscope::{DedicatedWorkerGlobalScope, DedicatedWorkerGlobalScopeHelpers};
@@ -48,9 +48,9 @@ pub struct WorkerGlobalScope {
js_context: Rc<Cx>,
next_worker_id: Cell<WorkerId>,
resource_task: ResourceTask,
- location: MutNullableJS<WorkerLocation>,
- navigator: MutNullableJS<WorkerNavigator>,
- console: MutNullableJS<Console>,
+ location: MutNullableHeap<JS<WorkerLocation>>,
+ navigator: MutNullableHeap<JS<WorkerNavigator>>,
+ console: MutNullableHeap<JS<Console>>,
timers: TimerManager,
devtools_chan: Option<DevtoolsControlChan>,
}
diff --git a/components/script/dom/xmlhttprequest.rs b/components/script/dom/xmlhttprequest.rs
index ffb0b2e17f5..69295ea3f30 100644
--- a/components/script/dom/xmlhttprequest.rs
+++ b/components/script/dom/xmlhttprequest.rs
@@ -14,7 +14,8 @@ use dom::bindings::error::{Error, ErrorResult, Fallible};
use dom::bindings::error::Error::{InvalidState, InvalidAccess};
use dom::bindings::error::Error::{Network, Syntax, Security, Abort, Timeout};
use dom::bindings::global::{GlobalField, GlobalRef, GlobalRoot};
-use dom::bindings::js::{MutNullableJS, JS, JSRef, Temporary, OptionalRootedRootable};
+use dom::bindings::js::{JS, JSRef, MutNullableHeap, Temporary};
+use dom::bindings::js::OptionalRootedRootable;
use dom::bindings::refcounted::Trusted;
use dom::bindings::str::ByteString;
use dom::bindings::utils::{Reflectable, reflect_dom_object};
@@ -125,7 +126,7 @@ pub struct XMLHttpRequest {
status_text: DOMRefCell<ByteString>,
response: DOMRefCell<ByteString>,
response_type: Cell<XMLHttpRequestResponseType>,
- response_xml: MutNullableJS<Document>,
+ response_xml: MutNullableHeap<JS<Document>>,
response_headers: DOMRefCell<Headers>,
// Associated concepts
@@ -710,7 +711,7 @@ impl<'a> XMLHttpRequestMethods for JSRef<'a, XMLHttpRequest> {
// https://xhr.spec.whatwg.org/#the-responsexml-attribute
fn GetResponseXML(self) -> Option<Temporary<Document>> {
- self.response_xml.get()
+ self.response_xml.get().map(Temporary::new)
}
}