diff --git a/src/components/script/dom/bindings/codegen/Bindings.conf b/src/components/script/dom/bindings/codegen/Bindings.conf index 571231afa3d..4322a8cfa8b 100644 --- a/src/components/script/dom/bindings/codegen/Bindings.conf +++ b/src/components/script/dom/bindings/codegen/Bindings.conf @@ -171,7 +171,7 @@ DOMInterfaces = { 'Element': { 'nativeType': 'AbstractNode', 'pointerType': '', - 'needsAbstract': ['getClientRects', 'getBoundingClientRect'] + 'needsAbstract': ['getClientRects', 'getBoundingClientRect', 'setAttribute'] }, 'Event': { @@ -588,7 +588,7 @@ addHTMLElement('HTMLHeadElement') addHTMLElement('HTMLHeadingElement') addHTMLElement('HTMLHtmlElement') addHTMLElement('HTMLHRElement') -addHTMLElement('HTMLIFrameElement') +addHTMLElement('HTMLIFrameElement', needsAbstract=['sandbox']) addHTMLElement('HTMLImageElement', needsAbstract=['width', 'height']) addHTMLElement('HTMLInputElement') addHTMLElement('HTMLLabelElement') diff --git a/src/components/script/dom/bindings/codegen/CodegenRust.py b/src/components/script/dom/bindings/codegen/CodegenRust.py index 92f1f73c17d..1e433b25608 100644 --- a/src/components/script/dom/bindings/codegen/CodegenRust.py +++ b/src/components/script/dom/bindings/codegen/CodegenRust.py @@ -3140,8 +3140,8 @@ class CGSetterCall(CGPerSignatureCall): A class to generate a native object setter call for a particular IDL setter. """ - def __init__(self, argType, nativeMethodName, descriptor, attr): - CGPerSignatureCall.__init__(self, None, [], + def __init__(self, argsPre, argType, nativeMethodName, descriptor, attr): + CGPerSignatureCall.__init__(self, None, argsPre, [FakeArgument(argType, attr)], nativeMethodName, False, descriptor, attr, setter=True) @@ -3357,9 +3357,16 @@ class CGSpecializedSetter(CGAbstractExternMethod): def definition_body(self): name = self.attr.identifier.name nativeName = "Set" + MakeNativeName(self.descriptor.binaryNames.get(name, name)) - return CGWrapper(CGIndenter(CGSetterCall(self.attr.type, nativeName, + argsPre = [] + extraPre = '' + if name in self.descriptor.needsAbstract: + abstractName = re.sub(r'<\w+>', '', self.descriptor.nativeType) + extraPre = ' let abstract_this = %s::from_box(this);\n' % abstractName + argsPre = ['abstract_this'] + return CGWrapper(CGIndenter(CGSetterCall(argsPre, self.attr.type, nativeName, self.descriptor, self.attr)), - pre=" let obj = (*obj.unnamed);\n" + + pre=extraPre + + " let obj = (*obj.unnamed);\n" + " let this = &mut (*this).payload;\n").define() def infallibleForMember(member, type, descriptorProvider): diff --git a/src/components/script/dom/element.rs b/src/components/script/dom/element.rs index 49a24004bb8..d679a3aeab0 100644 --- a/src/components/script/dom/element.rs +++ b/src/components/script/dom/element.rs @@ -139,7 +139,10 @@ impl<'self> Element { return None; } - pub fn set_attr(&mut self, raw_name: &DOMString, raw_value: &DOMString) { + pub fn set_attr(&mut self, + abstract_self: AbstractNode, + raw_name: &DOMString, + raw_value: &DOMString) { let name = raw_name.to_str(); let value_cell = Cell::new(raw_value.to_str()); let mut found = false; @@ -163,8 +166,8 @@ impl<'self> Element { //XXXjdm We really need something like a vtable so we can call AfterSetAttr. // This hardcoding is awful. - if self.parent.abstract.unwrap().is_iframe_element() { - do self.parent.abstract.unwrap().with_mut_iframe_element |iframe| { + if abstract_self.is_iframe_element() { + do abstract_self.with_mut_iframe_element |iframe| { iframe.AfterSetAttr(raw_name, raw_value); } } @@ -208,8 +211,12 @@ impl Element { null_string } - pub fn SetAttribute(&mut self, name: &DOMString, value: &DOMString, _rv: &mut ErrorResult) { - self.set_attr(name, value); + pub fn SetAttribute(&mut self, + abstract_self: AbstractNode, + name: &DOMString, + value: &DOMString, + _rv: &mut ErrorResult) { + self.set_attr(abstract_self, name, value); } pub fn SetAttributeNS(&self, _namespace: &DOMString, _localname: &DOMString, _value: &DOMString, _rv: &mut ErrorResult) { diff --git a/src/components/script/dom/htmliframeelement.rs b/src/components/script/dom/htmliframeelement.rs index 4c45e570b54..27a6dee1601 100644 --- a/src/components/script/dom/htmliframeelement.rs +++ b/src/components/script/dom/htmliframeelement.rs @@ -5,6 +5,7 @@ use dom::bindings::utils::{DOMString, null_string, ErrorResult, str}; use dom::document::AbstractDocument; use dom::htmlelement::HTMLElement; +use dom::node::{AbstractNode, ScriptView}; use dom::windowproxy::WindowProxy; use geom::size::Size2D; use geom::rect::Rect; @@ -79,13 +80,13 @@ impl HTMLIFrameElement { pub fn SetName(&mut self, _name: &DOMString, _rv: &mut ErrorResult) { } - pub fn Sandbox(&self) -> DOMString { + pub fn Sandbox(&self, _abstract_self: AbstractNode) -> DOMString { self.parent.parent.GetAttribute(&str(~"sandbox")) } - pub fn SetSandbox(&mut self, sandbox: &DOMString) { + pub fn SetSandbox(&mut self, abstract_self: AbstractNode, sandbox: &DOMString) { let mut rv = Ok(()); - self.parent.parent.SetAttribute(&str(~"sandbox"), sandbox, &mut rv); + self.parent.parent.SetAttribute(abstract_self, &str(~"sandbox"), sandbox, &mut rv); } pub fn AfterSetAttr(&mut self, name: &DOMString, value: &DOMString) { diff --git a/src/components/script/dom/htmlimageelement.rs b/src/components/script/dom/htmlimageelement.rs index e700c8efb50..c0922859ce7 100644 --- a/src/components/script/dom/htmlimageelement.rs +++ b/src/components/script/dom/htmlimageelement.rs @@ -77,9 +77,13 @@ impl HTMLImageElement { } } - pub fn SetWidth(&mut self, width: u32, _rv: &mut ErrorResult) { + pub fn SetWidth(&mut self, + abstract_self: AbstractNode, + width: u32, + _rv: &mut ErrorResult) { let node = &mut self.parent.parent; - node.set_attr(&str(~"width"), + node.set_attr(abstract_self, + &str(~"width"), &str(width.to_str())); } @@ -110,9 +114,13 @@ impl HTMLImageElement { } } - pub fn SetHeight(&mut self, height: u32, _rv: &mut ErrorResult) { + pub fn SetHeight(&mut self, + abstract_self: AbstractNode, + height: u32, + _rv: &mut ErrorResult) { let node = &mut self.parent.parent; - node.set_attr(&str(~"height"), + node.set_attr(abstract_self, + &str(~"height"), &str(height.to_str())); } diff --git a/src/components/script/html/hubbub_html_parser.rs b/src/components/script/html/hubbub_html_parser.rs index 42c9e43cf48..c24341c5c80 100644 --- a/src/components/script/html/hubbub_html_parser.rs +++ b/src/components/script/html/hubbub_html_parser.rs @@ -375,7 +375,7 @@ pub fn parse_html(cx: *JSContext, debug!("-- attach attrs"); do node.as_mut_element |element| { for attr in tag.attributes.iter() { - element.set_attr(&str(attr.name.clone()), &str(attr.value.clone())); + element.set_attr(node, &str(attr.name.clone()), &str(attr.value.clone())); } }