aboutsummaryrefslogtreecommitdiffstats
path: root/src/components/script/dom/htmliframeelement.rs
diff options
context:
space:
mode:
authorbors-servo <release+servo@mozilla.com>2014-05-03 14:25:22 -0400
committerbors-servo <release+servo@mozilla.com>2014-05-03 14:25:22 -0400
commit731e66ff132e41cdc49bc5324c0e15be19c46ec2 (patch)
treeccce9b42e8a6c54245e53620082efe0b9840eae1 /src/components/script/dom/htmliframeelement.rs
parent4051a8096d7ba7e7f9c86e76d0b4bffd83e85805 (diff)
parent91278da9dd55582401154e07f9eea34425a332c2 (diff)
downloadservo-731e66ff132e41cdc49bc5324c0e15be19c46ec2.tar.gz
servo-731e66ff132e41cdc49bc5324c0e15be19c46ec2.zip
auto merge of #2101 : jdm/servo/newroot_rebase, r=Ms2ger
As described in #1764, this strategy uses the following properties: * DOM members are `JS<T>` types. These cannot be used with being explicitly rooted, but they are required for compiler-derived trace hooks. * Methods that take DOM type arguments receive `&[mut] JSRef<T>`. These are rooted value references that are cloneable but cannot escape. * Methods that return DOM values use `Unrooted<T>`. These are values that may or may not be rooted elsewhere, but callers must root them in order to interact with them in any way. One unsoundness hole exists - `Unrooted` values must be rooted ASAP, or there exists the danger that JSAPI calls could be made that could cause the underlying JS value to be GCed. * All methods are implemented on `JSRef<T>`, enforcing the requirement that all DOM values are rooted for the duration of a method call (with a few exceptions for layout-related code, which cannot root values and therefore interacts with `JS<T>` and `&T` values - this is safe under the assumption that layout code interacts with DOM nodes that are in the tree, therefore rooted, and does not run concurrently with content code)
Diffstat (limited to 'src/components/script/dom/htmliframeelement.rs')
-rw-r--r--src/components/script/dom/htmliframeelement.rs127
1 files changed, 82 insertions, 45 deletions
diff --git a/src/components/script/dom/htmliframeelement.rs b/src/components/script/dom/htmliframeelement.rs
index 99ddf3d30f2..31c2981a5e1 100644
--- a/src/components/script/dom/htmliframeelement.rs
+++ b/src/components/script/dom/htmliframeelement.rs
@@ -5,7 +5,7 @@
use dom::bindings::codegen::BindingDeclarations::HTMLIFrameElementBinding;
use dom::bindings::codegen::InheritTypes::{ElementCast, HTMLIFrameElementDerived, HTMLElementCast};
use dom::bindings::error::ErrorResult;
-use dom::bindings::js::JS;
+use dom::bindings::js::{JSRef, Temporary};
use dom::bindings::trace::Untraceable;
use dom::document::Document;
use dom::element::{HTMLIFrameElementTypeId, Element};
@@ -54,18 +54,23 @@ pub struct IFrameSize {
pub subpage_id: SubpageId,
}
-impl HTMLIFrameElement {
- pub fn is_sandboxed(&self) -> bool {
+pub trait HTMLIFrameElementHelpers {
+ fn is_sandboxed(&self) -> bool;
+ fn set_frame(&mut self, frame: Url);
+}
+
+impl<'a> HTMLIFrameElementHelpers for JSRef<'a, HTMLIFrameElement> {
+ fn is_sandboxed(&self) -> bool {
self.sandbox.is_some()
}
- pub fn set_frame(&mut self, frame: Url) {
+ fn set_frame(&mut self, frame: Url) {
*self.frame = Some(frame);
}
}
impl HTMLIFrameElement {
- pub fn new_inherited(localName: DOMString, document: JS<Document>) -> HTMLIFrameElement {
+ pub fn new_inherited(localName: DOMString, document: &JSRef<Document>) -> HTMLIFrameElement {
HTMLIFrameElement {
htmlelement: HTMLElement::new_inherited(HTMLIFrameElementTypeId, localName, document),
frame: Untraceable::new(None),
@@ -74,136 +79,168 @@ impl HTMLIFrameElement {
}
}
- pub fn new(localName: DOMString, document: &JS<Document>) -> JS<HTMLIFrameElement> {
- let element = HTMLIFrameElement::new_inherited(localName, document.clone());
+ pub fn new(localName: DOMString, document: &JSRef<Document>) -> Temporary<HTMLIFrameElement> {
+ let element = HTMLIFrameElement::new_inherited(localName, document);
Node::reflect_node(~element, document, HTMLIFrameElementBinding::Wrap)
}
}
-impl HTMLIFrameElement {
- pub fn Src(&self) -> DOMString {
+pub trait HTMLIFrameElementMethods {
+ fn Src(&self) -> DOMString;
+ fn SetSrc(&mut self, _src: DOMString) -> ErrorResult;
+ fn Srcdoc(&self) -> DOMString;
+ fn SetSrcdoc(&mut self, _srcdoc: DOMString) -> ErrorResult;
+ fn Name(&self) -> DOMString;
+ fn SetName(&mut self, _name: DOMString) -> ErrorResult;
+ fn Sandbox(&self) -> DOMString;
+ fn SetSandbox(&mut self, sandbox: DOMString);
+ fn AllowFullscreen(&self) -> bool;
+ fn SetAllowFullscreen(&mut self, _allow: bool) -> ErrorResult;
+ fn Width(&self) -> DOMString;
+ fn SetWidth(&mut self, _width: DOMString) -> ErrorResult;
+ fn Height(&self) -> DOMString;
+ fn SetHeight(&mut self, _height: DOMString) -> ErrorResult;
+ fn GetContentDocument(&self) -> Option<Temporary<Document>>;
+ fn GetContentWindow(&self) -> Option<Temporary<Window>>;
+ fn Align(&self) -> DOMString;
+ fn SetAlign(&mut self, _align: DOMString) -> ErrorResult;
+ fn Scrolling(&self) -> DOMString;
+ fn SetScrolling(&mut self, _scrolling: DOMString) -> ErrorResult;
+ fn FrameBorder(&self) -> DOMString;
+ fn SetFrameBorder(&mut self, _frameborder: DOMString) -> ErrorResult;
+ fn LongDesc(&self) -> DOMString;
+ fn SetLongDesc(&mut self, _longdesc: DOMString) -> ErrorResult;
+ fn MarginHeight(&self) -> DOMString;
+ fn SetMarginHeight(&mut self, _marginheight: DOMString) -> ErrorResult;
+ fn MarginWidth(&self) -> DOMString;
+ fn SetMarginWidth(&mut self, _marginwidth: DOMString) -> ErrorResult;
+ fn GetSVGDocument(&self) -> Option<Temporary<Document>>;
+}
+
+impl<'a> HTMLIFrameElementMethods for JSRef<'a, HTMLIFrameElement> {
+ fn Src(&self) -> DOMString {
~""
}
- pub fn SetSrc(&mut self, _src: DOMString) -> ErrorResult {
+ fn SetSrc(&mut self, _src: DOMString) -> ErrorResult {
Ok(())
}
- pub fn Srcdoc(&self) -> DOMString {
+ fn Srcdoc(&self) -> DOMString {
~""
}
- pub fn SetSrcdoc(&mut self, _srcdoc: DOMString) -> ErrorResult {
+ fn SetSrcdoc(&mut self, _srcdoc: DOMString) -> ErrorResult {
Ok(())
}
- pub fn Name(&self) -> DOMString {
+ fn Name(&self) -> DOMString {
~""
}
- pub fn SetName(&mut self, _name: DOMString) -> ErrorResult {
+ fn SetName(&mut self, _name: DOMString) -> ErrorResult {
Ok(())
}
- pub fn Sandbox(&self, abstract_self: &JS<HTMLIFrameElement>) -> DOMString {
- let element: JS<Element> = ElementCast::from(abstract_self);
+ fn Sandbox(&self) -> DOMString {
+ let element: &JSRef<Element> = ElementCast::from_ref(self);
element.get_string_attribute("sandbox")
}
- pub fn SetSandbox(&mut self, abstract_self: &mut JS<HTMLIFrameElement>, sandbox: DOMString) {
- let mut element: JS<Element> = ElementCast::from(abstract_self);
+ fn SetSandbox(&mut self, sandbox: DOMString) {
+ let element: &mut JSRef<Element> = ElementCast::from_mut_ref(self);
element.set_string_attribute("sandbox", sandbox);
}
- pub fn AllowFullscreen(&self) -> bool {
+ fn AllowFullscreen(&self) -> bool {
false
}
- pub fn SetAllowFullscreen(&mut self, _allow: bool) -> ErrorResult {
+ fn SetAllowFullscreen(&mut self, _allow: bool) -> ErrorResult {
Ok(())
}
- pub fn Width(&self) -> DOMString {
+ fn Width(&self) -> DOMString {
~""
}
- pub fn SetWidth(&mut self, _width: DOMString) -> ErrorResult {
+ fn SetWidth(&mut self, _width: DOMString) -> ErrorResult {
Ok(())
}
- pub fn Height(&self) -> DOMString {
+ fn Height(&self) -> DOMString {
~""
}
- pub fn SetHeight(&mut self, _height: DOMString) -> ErrorResult {
+ fn SetHeight(&mut self, _height: DOMString) -> ErrorResult {
Ok(())
}
- pub fn GetContentDocument(&self) -> Option<JS<Document>> {
+ fn GetContentDocument(&self) -> Option<Temporary<Document>> {
None
}
- pub fn GetContentWindow(&self) -> Option<JS<Window>> {
+ fn GetContentWindow(&self) -> Option<Temporary<Window>> {
None
}
- pub fn Align(&self) -> DOMString {
+ fn Align(&self) -> DOMString {
~""
}
- pub fn SetAlign(&mut self, _align: DOMString) -> ErrorResult {
+ fn SetAlign(&mut self, _align: DOMString) -> ErrorResult {
Ok(())
}
- pub fn Scrolling(&self) -> DOMString {
+ fn Scrolling(&self) -> DOMString {
~""
}
- pub fn SetScrolling(&mut self, _scrolling: DOMString) -> ErrorResult {
+ fn SetScrolling(&mut self, _scrolling: DOMString) -> ErrorResult {
Ok(())
}
- pub fn FrameBorder(&self) -> DOMString {
+ fn FrameBorder(&self) -> DOMString {
~""
}
- pub fn SetFrameBorder(&mut self, _frameborder: DOMString) -> ErrorResult {
+ fn SetFrameBorder(&mut self, _frameborder: DOMString) -> ErrorResult {
Ok(())
}
- pub fn LongDesc(&self) -> DOMString {
+ fn LongDesc(&self) -> DOMString {
~""
}
- pub fn SetLongDesc(&mut self, _longdesc: DOMString) -> ErrorResult {
+ fn SetLongDesc(&mut self, _longdesc: DOMString) -> ErrorResult {
Ok(())
}
- pub fn MarginHeight(&self) -> DOMString {
+ fn MarginHeight(&self) -> DOMString {
~""
}
- pub fn SetMarginHeight(&mut self, _marginheight: DOMString) -> ErrorResult {
+ fn SetMarginHeight(&mut self, _marginheight: DOMString) -> ErrorResult {
Ok(())
}
- pub fn MarginWidth(&self) -> DOMString {
+ fn MarginWidth(&self) -> DOMString {
~""
}
- pub fn SetMarginWidth(&mut self, _marginwidth: DOMString) -> ErrorResult {
+ fn SetMarginWidth(&mut self, _marginwidth: DOMString) -> ErrorResult {
Ok(())
}
- pub fn GetSVGDocument(&self) -> Option<JS<Document>> {
+ fn GetSVGDocument(&self) -> Option<Temporary<Document>> {
None
}
}
-impl VirtualMethods for JS<HTMLIFrameElement> {
- fn super_type(&self) -> Option<~VirtualMethods:> {
- let htmlelement: JS<HTMLElement> = HTMLElementCast::from(self);
- Some(~htmlelement as ~VirtualMethods:)
+impl<'a> VirtualMethods for JSRef<'a, HTMLIFrameElement> {
+ fn super_type<'a>(&'a mut self) -> Option<&'a mut VirtualMethods:> {
+ let htmlelement: &mut JSRef<HTMLElement> = HTMLElementCast::from_mut_ref(self);
+ Some(htmlelement as &mut VirtualMethods:)
}
fn after_set_attr(&mut self, name: DOMString, value: DOMString) {
@@ -227,7 +264,7 @@ impl VirtualMethods for JS<HTMLIFrameElement> {
_ => AllowNothing
} as u8;
}
- self.get_mut().sandbox = Some(modes);
+ self.deref_mut().sandbox = Some(modes);
}
}
@@ -238,7 +275,7 @@ impl VirtualMethods for JS<HTMLIFrameElement> {
}
if "sandbox" == name {
- self.get_mut().sandbox = None;
+ self.deref_mut().sandbox = None;
}
}
}