Merge master into this branch

This commit is contained in:
Sankha Narayan Guria 2014-02-27 03:31:05 +05:30
commit 1e9fec9172
163 changed files with 4714 additions and 3380 deletions

View file

@ -3,6 +3,7 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use dom::bindings::codegen::AttrBinding;
use dom::bindings::js::JS;
use dom::bindings::utils::{Reflectable, Reflector, reflect_dom_object};
use dom::window::Window;
use servo_util::namespace::{Namespace, Null};
@ -10,6 +11,7 @@ use servo_util::str::DOMString;
use std::util;
#[deriving(Encodable)]
pub struct Attr {
reflector_: Reflector,
local_name: DOMString,
@ -43,22 +45,22 @@ impl Attr {
}
}
pub fn new(window: &Window, local_name: DOMString, value: DOMString) -> @mut Attr {
pub fn new(window: &Window, local_name: DOMString, value: DOMString) -> JS<Attr> {
let name = local_name.clone();
Attr::new_helper(window, local_name, value, name, Null, None)
}
pub fn new_ns(window: &Window, local_name: DOMString, value: DOMString,
name: DOMString, namespace: Namespace,
prefix: Option<DOMString>) -> @mut Attr {
prefix: Option<DOMString>) -> JS<Attr> {
Attr::new_helper(window, local_name, value, name, namespace, prefix)
}
fn new_helper(window: &Window, local_name: DOMString, value: DOMString,
name: DOMString, namespace: Namespace,
prefix: Option<DOMString>) -> @mut Attr {
prefix: Option<DOMString>) -> JS<Attr> {
let attr = Attr::new_inherited(local_name, value, name, namespace, prefix);
reflect_dom_object(@mut attr, window, AttrBinding::Wrap)
reflect_dom_object(~attr, window, AttrBinding::Wrap)
}
pub fn set_value(&mut self, mut value: DOMString) -> DOMString {

View file

@ -4,18 +4,20 @@
use dom::attr::Attr;
use dom::bindings::codegen::AttrListBinding;
use dom::bindings::js::JS;
use dom::bindings::utils::{Reflectable, Reflector, reflect_dom_object};
use dom::node::{AbstractNode};
use dom::element::Element;
use dom::window::Window;
#[deriving(Encodable)]
pub struct AttrList {
reflector_: Reflector,
window: @mut Window,
owner: AbstractNode,
window: JS<Window>,
owner: JS<Element>,
}
impl AttrList {
pub fn new_inherited(window: @mut Window, elem: AbstractNode) -> AttrList {
pub fn new_inherited(window: JS<Window>, elem: JS<Element>) -> AttrList {
AttrList {
reflector_: Reflector::new(),
window: window,
@ -23,22 +25,20 @@ impl AttrList {
}
}
pub fn new(window: @mut Window, elem: AbstractNode) -> @mut AttrList {
reflect_dom_object(@mut AttrList::new_inherited(window, elem),
window, AttrListBinding::Wrap)
pub fn new(window: &JS<Window>, elem: &JS<Element>) -> JS<AttrList> {
reflect_dom_object(~AttrList::new_inherited(window.clone(), elem.clone()),
window.get(), AttrListBinding::Wrap)
}
pub fn Length(&self) -> u32 {
self.owner.with_imm_element(|elem| elem.attrs.len() as u32)
self.owner.get().attrs.len() as u32
}
pub fn Item(&self, index: u32) -> Option<@mut Attr> {
self.owner.with_imm_element(|elem| {
elem.attrs.get_opt(index as uint).map(|&x| x)
})
pub fn Item(&self, index: u32) -> Option<JS<Attr>> {
self.owner.get().attrs.get_opt(index as uint).map(|x| x.clone())
}
pub fn IndexedGetter(&self, index: u32, found: &mut bool) -> Option<@mut Attr> {
pub fn IndexedGetter(&self, index: u32, found: &mut bool) -> Option<JS<Attr>> {
let item = self.Item(index);
*found = item.is_some();
item

View file

@ -4,12 +4,15 @@
use dom::bindings::utils::Reflectable;
use js::jsapi::{JSContext, JSObject, JS_WrapObject, JSVal, JS_ObjectIsCallable};
use js::jsapi::JS_GetProperty;
use js::{JSVAL_IS_OBJECT, JSVAL_TO_OBJECT};
use js::jsapi::{JS_GetProperty, JSTracer, JS_CallTracer};
use js::{JSVAL_IS_OBJECT, JSVAL_TO_OBJECT, JSTRACE_OBJECT};
use std::cast;
use std::libc;
use std::ptr;
use extra::serialize::{Encodable, Encoder};
pub enum ExceptionHandling {
// Report any exception and don't throw it to the caller code.
eReportExceptions,
@ -26,6 +29,20 @@ pub struct CallbackInterface {
callback: *JSObject
}
impl<S: Encoder> Encodable<S> for CallbackInterface {
fn encode(&self, s: &mut S) {
unsafe {
let tracer: *mut JSTracer = cast::transmute(s);
"callback".to_c_str().with_ref(|name| {
(*tracer).debugPrinter = ptr::null();
(*tracer).debugPrintIndex = -1;
(*tracer).debugPrintArg = name as *libc::c_void;
JS_CallTracer(tracer as *JSTracer, self.callback, JSTRACE_OBJECT as u32);
});
}
}
}
pub trait CallbackContainer {
fn callback(&self) -> *JSObject;
}
@ -66,7 +83,7 @@ pub fn GetJSObjectFromCallback<T: CallbackContainer>(callback: &T) -> *JSObject
pub fn WrapCallThisObject<T: 'static + CallbackContainer + Reflectable>(cx: *JSContext,
_scope: *JSObject,
p: @mut T) -> *JSObject {
p: ~T) -> *JSObject {
let obj = GetJSObjectFromCallback(p);
assert!(obj.is_not_null());

View file

@ -96,7 +96,6 @@ DOMInterfaces = {
'Blob': [
{
'headerFile': 'nsIDOMFile.h',
},
#{
# 'workers': True,
@ -121,19 +120,14 @@ DOMInterfaces = {
}],
'CharacterData': {
'nativeType': 'AbstractNode',
'concreteType': 'CharacterData',
'pointerType': ''
},
'ClientRect': [
{
'nativeType': 'ClientRect',
}],
'ClientRectList': [
{
'nativeType': 'ClientRectList',
}],
'Console': {
@ -150,8 +144,6 @@ DOMInterfaces = {
},
'Document': {
'nativeType': 'AbstractDocument',
'pointerType': '',
'customTrace': 'trace',
'needsAbstract': [
'createComment',
@ -165,15 +157,12 @@ DOMInterfaces = {
},
'DOMException': {
'nativeType': 'DOMException',
},
'DOMImplementation': {
'nativeType': 'DOMImplementation',
},
'DOMParser': {
'nativeType': 'DOMParser',
},
'DOMSettableTokenList': [
@ -195,15 +184,10 @@ DOMInterfaces = {
}],
'Element': {
'nativeType': 'AbstractNode',
'pointerType': '',
'needsAbstract': ['getClientRects', 'getBoundingClientRect', 'setAttribute', 'setAttributeNS', 'removeAttribute', 'removeAttributeNS', 'id', 'attributes', 'innerHTML', 'outerHTML']
},
'Event': {
'nativeType': 'AbstractEvent',
'concreteType': 'Event',
'pointerType': '',
},
'EventListener': {
@ -211,9 +195,6 @@ DOMInterfaces = {
},
'EventTarget': {
'nativeType': 'AbstractEventTarget',
'concreteType': 'EventTarget',
'pointerType': '',
'needsAbstract': ['dispatchEvent']
},
@ -241,22 +222,8 @@ DOMInterfaces = {
'HTMLCollection': [
{
'nativeType': 'HTMLCollection',
'pointerType': '@mut '
}],
'HTMLDocument': {
'nativeType': 'AbstractDocument',
'pointerType': '',
'customTrace': 'trace'
},
'HTMLFormElement': {
'nativeType': 'AbstractNode',
'pointerType': '',
'register': False
},
'HTMLOptionsCollection': [
{
'nativeType': 'nsHTMLOptionCollection',
@ -306,27 +273,21 @@ DOMInterfaces = {
}],
'MouseEvent': {
'nativeType': 'AbstractEvent',
'concreteType': 'MouseEvent',
'pointerType': '',
},
'Navigator': {
},
'Node': {
'nativeType': 'AbstractNode',
'concreteType': 'Node',
'pointerType': '',
'needsAbstract': [
'appendChild',
'insertBefore',
'replaceChild',
'childNodes',
'insertBefore',
'nodeName',
'nodeValue',
'removeChild',
'replaceChild',
'textContent',
'childNodes',
'contains',
'isEqualNode',
]
@ -334,8 +295,6 @@ DOMInterfaces = {
'NodeList': [
{
'nativeType': 'NodeList',
'pointerType': '@mut ',
'resultNotAddRefed': ['item']
}],
@ -410,9 +369,6 @@ DOMInterfaces = {
}],
'UIEvent': {
'nativeType': 'AbstractEvent',
'concreteType': 'UIEvent',
'pointerType': '',
},
'ValidityState': {
@ -592,7 +548,7 @@ def addExternalIface(iface, nativeType=None, headerFile=None, pointerType=None):
# FIXME: This should be renamed: https://github.com/mozilla/servo/issues/1625
def addHTMLElement(element, concrete=None, needsAbstract=[]):
DOMInterfaces[element] = {
'nativeType': 'AbstractNode',
'nativeType': 'JS<%s>' % element,
'pointerType': '',
'concreteType': concrete if concrete else element,
'customTrace': 'trace',

File diff suppressed because it is too large Load diff

View file

@ -158,10 +158,9 @@ class Descriptor(DescriptorProvider):
if self.workers:
nativeTypeDefault = "workers::" + ifaceName
else:
nativeTypeDefault = ifaceName
nativeTypeDefault = 'JS<%s>' % ifaceName
self.nativeType = desc.get('nativeType', nativeTypeDefault)
self.pointerType = desc.get('pointerType', '@mut ')
self.concreteType = desc.get('concreteType', ifaceName)
self.needsAbstract = desc.get('needsAbstract', [])
self.hasInstanceInterface = desc.get('hasInstanceInterface', None)
@ -253,7 +252,7 @@ class Descriptor(DescriptorProvider):
self.prefable = desc.get('prefable', False)
self.nativeIsISupports = not self.workers
self.customTrace = desc.get('customTrace', self.workers)
self.customTrace = desc.get('customTrace', self.workers) or 'trace'
self.customFinalize = desc.get('customFinalize', self.workers)
self.wrapperCache = self.workers or desc.get('wrapperCache', True)

View file

@ -83,12 +83,14 @@ def main():
# Generate the type list.
generate_file(config, 'InterfaceTypes', 'declare+define')
# Generate the type list.
generate_file(config, 'InheritTypes', 'declare+define')
# Generate the module declarations.
generate_file(config, 'BindingDeclarations', 'declare+define')
#XXXjdm No union support yet
#generate_file(config, 'UnionTypes', 'declare')
#generate_file(config, 'UnionConversions', 'declare')
generate_file(config, 'UnionTypes', 'declare+define')
generate_file(config, 'UnionConversions', 'declare+define')
if __name__ == '__main__':
main()

View file

@ -95,7 +95,7 @@ CSS2Properties.webidl: $(topsrcdir)/layout/style/nsCSSPropList.h \
$(srcdir)/GenerateCSS2PropertiesWebIDL.py \
$(GLOBAL_DEPS)
$(CPP) $(DEFINES) $(ACDEFINES) -I$(topsrcdir)/layout/style $(webidl_base)/CSS2PropertiesProps.h | \
PYTHONDONTWRITEBYTECODE=1 $(PYTHON) \
$(PYTHON) \
$(srcdir)/GenerateCSS2PropertiesWebIDL.py $(webidl_base)/CSS2Properties.webidl.in > CSS2Properties.webidl
$(webidl_files): %: $(webidl_base)/%
@ -107,7 +107,7 @@ $(test_webidl_files): %: $(srcdir)/test/%
$(binding_header_files): %Binding.h: $(bindinggen_dependencies) \
%.webidl \
$(NULL)
PYTHONDONTWRITEBYTECODE=1 $(PYTHON) $(topsrcdir)/config/pythonpath.py \
$(PYTHON) $(topsrcdir)/config/pythonpath.py \
$(PLY_INCLUDE) -I$(srcdir)/parser \
$(srcdir)/BindingGen.py header \
$(srcdir)/Bindings.conf $*Binding \
@ -116,7 +116,7 @@ $(binding_header_files): %Binding.h: $(bindinggen_dependencies) \
$(binding_cpp_files): %Binding.cpp: $(bindinggen_dependencies) \
%.webidl \
$(NULL)
PYTHONDONTWRITEBYTECODE=1 $(PYTHON) $(topsrcdir)/config/pythonpath.py \
$(PYTHON) $(topsrcdir)/config/pythonpath.py \
$(PLY_INCLUDE) -I$(srcdir)/parser \
$(srcdir)/BindingGen.py cpp \
$(srcdir)/Bindings.conf $*Binding \
@ -142,7 +142,7 @@ $(CACHE_DIR)/.done:
ParserResults.pkl: $(globalgen_dependencies) \
$(all_webidl_files)
PYTHONDONTWRITEBYTECODE=1 $(PYTHON) $(topsrcdir)/config/pythonpath.py \
$(PYTHON) $(topsrcdir)/config/pythonpath.py \
$(PLY_INCLUDE) -I$(srcdir)/parser \
$(srcdir)/GlobalGen.py $(srcdir)/Bindings.conf . \
--cachedir=$(CACHE_DIR) \

View file

@ -79,9 +79,9 @@ $(CPPSRCS): ../%Binding.cpp: $(bindinggen_dependencies) \
$(MAKE) -C .. $*Binding.cpp
check::
PYTHONDONTWRITEBYTECODE=1 $(PYTHON) $(topsrcdir)/config/pythonpath.py \
$(PYTHON) $(topsrcdir)/config/pythonpath.py \
$(PLY_INCLUDE) $(srcdir)/../parser/runtests.py
check-interactive:
PYTHONDONTWRITEBYTECODE=1 $(PYTHON) $(topsrcdir)/config/pythonpath.py \
$(PYTHON) $(topsrcdir)/config/pythonpath.py \
$(PLY_INCLUDE) $(srcdir)/../parser/runtests.py -q

View file

@ -4,7 +4,9 @@
use js::jsapi::JSVal;
use js::{JSVAL_FALSE, JSVAL_TRUE};
use js::glue::{RUST_UINT_TO_JSVAL, RUST_JSVAL_TO_INT, RUST_DOUBLE_TO_JSVAL, RUST_JSVAL_TO_DOUBLE};
use js::glue::{RUST_UINT_TO_JSVAL, RUST_JSVAL_TO_INT, RUST_DOUBLE_TO_JSVAL};
use js::glue::{RUST_JSVAL_TO_DOUBLE, RUST_JSVAL_IS_INT, RUST_JSVAL_IS_DOUBLE};
use js::glue::{RUST_JSVAL_IS_BOOLEAN, RUST_JSVAL_TO_BOOLEAN};
pub trait JSValConvertible {
fn to_jsval(&self) -> JSVal;
@ -21,7 +23,11 @@ impl JSValConvertible for i64 {
fn from_jsval(val: JSVal) -> Option<i64> {
unsafe {
Some(RUST_JSVAL_TO_DOUBLE(val) as i64)
if RUST_JSVAL_IS_INT(val) != 0 {
Some(RUST_JSVAL_TO_DOUBLE(val) as i64)
} else {
None
}
}
}
}
@ -35,7 +41,11 @@ impl JSValConvertible for u32 {
fn from_jsval(val: JSVal) -> Option<u32> {
unsafe {
Some(RUST_JSVAL_TO_INT(val) as u32)
if RUST_JSVAL_IS_INT(val) != 0 {
Some(RUST_JSVAL_TO_INT(val) as u32)
} else {
None
}
}
}
}
@ -49,7 +59,11 @@ impl JSValConvertible for i32 {
fn from_jsval(val: JSVal) -> Option<i32> {
unsafe {
Some(RUST_JSVAL_TO_INT(val) as i32)
if RUST_JSVAL_IS_INT(val) != 0 {
Some(RUST_JSVAL_TO_INT(val) as i32)
} else {
None
}
}
}
}
@ -63,7 +77,11 @@ impl JSValConvertible for u16 {
fn from_jsval(val: JSVal) -> Option<u16> {
unsafe {
Some(RUST_JSVAL_TO_INT(val) as u16)
if RUST_JSVAL_IS_INT(val) != 0 {
Some(RUST_JSVAL_TO_INT(val) as u16)
} else {
None
}
}
}
}
@ -78,12 +96,12 @@ impl JSValConvertible for bool {
}
fn from_jsval(val: JSVal) -> Option<bool> {
if val == JSVAL_TRUE {
Some(true)
} else if val == JSVAL_FALSE {
Some(false)
} else {
None
unsafe {
if RUST_JSVAL_IS_BOOLEAN(val) != 0 {
Some(RUST_JSVAL_TO_BOOLEAN(val) != 0)
} else {
None
}
}
}
}
@ -97,7 +115,11 @@ impl JSValConvertible for f32 {
fn from_jsval(val: JSVal) -> Option<f32> {
unsafe {
Some(RUST_JSVAL_TO_DOUBLE(val) as f32)
if RUST_JSVAL_IS_DOUBLE(val) != 0 {
Some(RUST_JSVAL_TO_DOUBLE(val) as f32)
} else {
None
}
}
}
}
@ -111,7 +133,11 @@ impl JSValConvertible for f64 {
fn from_jsval(val: JSVal) -> Option<f64> {
unsafe {
Some(RUST_JSVAL_TO_DOUBLE(val) as f64)
if RUST_JSVAL_IS_DOUBLE(val) != 0 {
Some(RUST_JSVAL_TO_DOUBLE(val) as f64)
} else {
None
}
}
}
}

View file

@ -3,9 +3,7 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use dom::types::*;
use dom::bindings::utils::{Reflectable, Reflector, Traceable};
use js::jsapi::JSTracer;
use dom::bindings::utils::{Reflectable, Reflector};
// generate_cacheable_wrapper
macro_rules! generate_cacheable_wrapper(
@ -58,277 +56,149 @@ macro_rules! generate_cacheable_wrapper_base(
)
)
// generate_traceable
macro_rules! generate_traceable(
($name: path) => (
generate_traceable_base!($name, element)
)
)
macro_rules! generate_traceable_characterdata(
($name: path) => (
generate_traceable_base!($name, characterdata)
)
)
macro_rules! generate_traceable_htmlelement(
($name: path) => (
generate_traceable_base!($name, htmlelement)
)
)
macro_rules! generate_traceable_htmlmediaelement(
($name: path) => (
generate_traceable_base!($name, htmlmediaelement)
)
)
macro_rules! generate_traceable_htmltablecellelement(
($name: path) => (
generate_traceable_base!($name, htmltablecellelement)
)
)
macro_rules! generate_traceable_node(
($name: path) => (
generate_traceable_base!($name, node)
)
)
macro_rules! generate_traceable_base(
($name: path, $parent: ident) => (
impl Traceable for $name {
fn trace(&self, trc: *mut JSTracer) {
self.$parent.trace(trc);
}
}
)
)
generate_cacheable_wrapper_characterdata!(Comment, CommentBinding::Wrap)
generate_traceable_characterdata!(Comment)
generate_cacheable_wrapper_node!(DocumentFragment, DocumentFragmentBinding::Wrap)
generate_traceable_node!(DocumentFragment)
generate_cacheable_wrapper_node!(DocumentType, DocumentTypeBinding::Wrap)
generate_traceable_node!(DocumentType)
generate_cacheable_wrapper_characterdata!(Text, TextBinding::Wrap)
generate_traceable_characterdata!(Text)
generate_cacheable_wrapper_characterdata!(ProcessingInstruction, ProcessingInstruction::Wrap)
generate_traceable_characterdata!(ProcessingInstruction)
generate_cacheable_wrapper_htmlelement!(HTMLHeadElement, HTMLHeadElementBinding::Wrap)
generate_traceable_htmlelement!(HTMLHeadElement)
generate_cacheable_wrapper_htmlelement!(HTMLAnchorElement, HTMLAnchorElementBinding::Wrap)
generate_traceable_htmlelement!(HTMLAnchorElement)
generate_cacheable_wrapper_htmlelement!(HTMLAppletElement, HTMLAppletElementBinding::Wrap)
generate_traceable_htmlelement!(HTMLAppletElement)
generate_cacheable_wrapper_htmlelement!(HTMLAreaElement, HTMLAreaElementBinding::Wrap)
generate_traceable_htmlelement!(HTMLAreaElement)
generate_cacheable_wrapper_htmlmediaelement!(HTMLAudioElement, HTMLAudioElementBinding::Wrap)
generate_traceable_htmlmediaelement!(HTMLAudioElement)
generate_cacheable_wrapper_htmlelement!(HTMLBaseElement, HTMLBaseElementBinding::Wrap)
generate_traceable_htmlelement!(HTMLBaseElement)
generate_cacheable_wrapper_htmlelement!(HTMLBodyElement, HTMLBodyElementBinding::Wrap)
generate_traceable_htmlelement!(HTMLBodyElement)
generate_cacheable_wrapper_htmlelement!(HTMLButtonElement, HTMLButtonElementBinding::Wrap)
generate_traceable_htmlelement!(HTMLButtonElement)
generate_cacheable_wrapper_htmlelement!(HTMLCanvasElement, HTMLCanvasElementBinding::Wrap)
generate_traceable_htmlelement!(HTMLCanvasElement)
generate_cacheable_wrapper_htmlelement!(HTMLDataListElement, HTMLDataListElementBinding::Wrap)
generate_traceable_htmlelement!(HTMLDataListElement)
generate_cacheable_wrapper_htmlelement!(HTMLDListElement, HTMLDListElementBinding::Wrap)
generate_traceable_htmlelement!(HTMLDListElement)
generate_cacheable_wrapper_htmlelement!(HTMLFormElement, HTMLFormElementBinding::Wrap)
generate_traceable_htmlelement!(HTMLFormElement)
generate_cacheable_wrapper_htmlelement!(HTMLFrameElement, HTMLFrameElementBinding::Wrap)
generate_traceable_htmlelement!(HTMLFrameElement)
generate_cacheable_wrapper_htmlelement!(HTMLFrameSetElement, HTMLFrameSetElementBinding::Wrap)
generate_traceable_htmlelement!(HTMLFrameSetElement)
generate_cacheable_wrapper_htmlelement!(HTMLBRElement, HTMLBRElementBinding::Wrap)
generate_traceable_htmlelement!(HTMLBRElement)
generate_cacheable_wrapper_htmlelement!(HTMLHRElement, HTMLHRElementBinding::Wrap)
generate_traceable_htmlelement!(HTMLHRElement)
generate_cacheable_wrapper_htmlelement!(HTMLHtmlElement, HTMLHtmlElementBinding::Wrap)
generate_traceable_htmlelement!(HTMLHtmlElement)
generate_cacheable_wrapper_htmlelement!(HTMLDataElement, HTMLDataElementBinding::Wrap)
generate_traceable_htmlelement!(HTMLDataElement)
generate_cacheable_wrapper_htmlelement!(HTMLDirectoryElement, HTMLDirectoryElementBinding::Wrap)
generate_traceable_htmlelement!(HTMLDirectoryElement)
generate_cacheable_wrapper_htmlelement!(HTMLDivElement, HTMLDivElementBinding::Wrap)
generate_traceable_htmlelement!(HTMLDivElement)
generate_cacheable_wrapper_htmlelement!(HTMLEmbedElement, HTMLEmbedElementBinding::Wrap)
generate_traceable_htmlelement!(HTMLEmbedElement)
generate_cacheable_wrapper_htmlelement!(HTMLFieldSetElement, HTMLFieldSetElementBinding::Wrap)
generate_traceable_htmlelement!(HTMLFieldSetElement)
generate_cacheable_wrapper_htmlelement!(HTMLFontElement, HTMLFontElementBinding::Wrap)
generate_traceable_htmlelement!(HTMLFontElement)
generate_cacheable_wrapper_htmlelement!(HTMLHeadingElement, HTMLHeadingElementBinding::Wrap)
generate_traceable_htmlelement!(HTMLHeadingElement)
generate_cacheable_wrapper_htmlelement!(HTMLIFrameElement, HTMLIFrameElementBinding::Wrap)
generate_traceable_htmlelement!(HTMLIFrameElement)
generate_cacheable_wrapper_htmlelement!(HTMLImageElement, HTMLImageElementBinding::Wrap)
generate_traceable_htmlelement!(HTMLImageElement)
generate_cacheable_wrapper_htmlelement!(HTMLInputElement, HTMLInputElementBinding::Wrap)
generate_traceable_htmlelement!(HTMLInputElement)
generate_cacheable_wrapper_htmlelement!(HTMLLabelElement, HTMLLabelElementBinding::Wrap)
generate_traceable_htmlelement!(HTMLLabelElement)
generate_cacheable_wrapper_htmlelement!(HTMLLegendElement, HTMLLegendElementBinding::Wrap)
generate_traceable_htmlelement!(HTMLLegendElement)
generate_cacheable_wrapper_htmlelement!(HTMLLIElement, HTMLLIElementBinding::Wrap)
generate_traceable_htmlelement!(HTMLLIElement)
generate_cacheable_wrapper_htmlelement!(HTMLLinkElement, HTMLLinkElementBinding::Wrap)
generate_traceable_htmlelement!(HTMLLinkElement)
generate_cacheable_wrapper_htmlelement!(HTMLMainElement, HTMLMainElementBinding::Wrap)
generate_traceable_htmlelement!(HTMLMainElement)
generate_cacheable_wrapper_htmlelement!(HTMLMapElement, HTMLMapElementBinding::Wrap)
generate_traceable_htmlelement!(HTMLMapElement)
generate_cacheable_wrapper_htmlelement!(HTMLMediaElement, HTMLMediaElementBinding::Wrap)
generate_traceable_htmlelement!(HTMLMediaElement)
generate_cacheable_wrapper_htmlelement!(HTMLMetaElement, HTMLMetaElementBinding::Wrap)
generate_traceable_htmlelement!(HTMLMetaElement)
generate_cacheable_wrapper_htmlelement!(HTMLMeterElement, HTMLMeterElementBinding::Wrap)
generate_traceable_htmlelement!(HTMLMeterElement)
generate_cacheable_wrapper_htmlelement!(HTMLModElement, HTMLModElementBinding::Wrap)
generate_traceable_htmlelement!(HTMLModElement)
generate_cacheable_wrapper_htmlelement!(HTMLObjectElement, HTMLObjectElementBinding::Wrap)
generate_traceable_htmlelement!(HTMLObjectElement)
generate_cacheable_wrapper_htmlelement!(HTMLOListElement, HTMLOListElementBinding::Wrap)
generate_traceable_htmlelement!(HTMLOListElement)
generate_cacheable_wrapper_htmlelement!(HTMLOptGroupElement, HTMLOptGroupElementBinding::Wrap)
generate_traceable_htmlelement!(HTMLOptGroupElement)
generate_cacheable_wrapper_htmlelement!(HTMLOptionElement, HTMLOptionElementBinding::Wrap)
generate_traceable_htmlelement!(HTMLOptionElement)
generate_cacheable_wrapper_htmlelement!(HTMLOutputElement, HTMLOutputElementBinding::Wrap)
generate_traceable_htmlelement!(HTMLOutputElement)
generate_cacheable_wrapper_htmlelement!(HTMLParagraphElement, HTMLParagraphElementBinding::Wrap)
generate_traceable_htmlelement!(HTMLParagraphElement)
generate_cacheable_wrapper_htmlelement!(HTMLParamElement, HTMLParamElementBinding::Wrap)
generate_traceable_htmlelement!(HTMLParamElement)
generate_cacheable_wrapper_htmlelement!(HTMLPreElement, HTMLPreElementBinding::Wrap)
generate_traceable_htmlelement!(HTMLPreElement)
generate_cacheable_wrapper_htmlelement!(HTMLProgressElement, HTMLProgressElementBinding::Wrap)
generate_traceable_htmlelement!(HTMLProgressElement)
generate_cacheable_wrapper_htmlelement!(HTMLQuoteElement, HTMLQuoteElementBinding::Wrap)
generate_traceable_htmlelement!(HTMLQuoteElement)
generate_cacheable_wrapper_htmlelement!(HTMLScriptElement, HTMLScriptElementBinding::Wrap)
generate_traceable_htmlelement!(HTMLScriptElement)
generate_cacheable_wrapper_htmlelement!(HTMLSelectElement, HTMLSelectElementBinding::Wrap)
generate_traceable_htmlelement!(HTMLSelectElement)
generate_cacheable_wrapper_htmlelement!(HTMLSourceElement, HTMLSourceElementBinding::Wrap)
generate_traceable_htmlelement!(HTMLSourceElement)
generate_cacheable_wrapper_htmlelement!(HTMLSpanElement, HTMLSpanElementBinding::Wrap)
generate_traceable_htmlelement!(HTMLSpanElement)
generate_cacheable_wrapper_htmlelement!(HTMLStyleElement, HTMLStyleElementBinding::Wrap)
generate_traceable_htmlelement!(HTMLStyleElement)
generate_cacheable_wrapper_htmlelement!(HTMLTableElement, HTMLTableElementBinding::Wrap)
generate_traceable_htmlelement!(HTMLTableElement)
generate_cacheable_wrapper_htmlelement!(HTMLTableCaptionElement, HTMLTableCaptionElementBinding::Wrap)
generate_traceable_htmlelement!(HTMLTableCaptionElement)
generate_cacheable_wrapper_htmlelement!(HTMLTableCellElement, HTMLTableCellElementBinding::Wrap)
generate_traceable_htmlelement!(HTMLTableCellElement)
generate_cacheable_wrapper_htmltablecellelement!(HTMLTableDataCellElement, HTMLTableDataCellElementBinding::Wrap)
generate_traceable_htmltablecellelement!(HTMLTableDataCellElement)
generate_cacheable_wrapper_htmltablecellelement!(HTMLTableHeaderCellElement, HTMLTableHeaderCellElementBinding::Wrap)
generate_traceable_htmltablecellelement!(HTMLTableHeaderCellElement)
generate_cacheable_wrapper_htmlelement!(HTMLTableColElement, HTMLTableColElementBinding::Wrap)
generate_traceable_htmlelement!(HTMLTableColElement)
generate_cacheable_wrapper_htmlelement!(HTMLTableRowElement, HTMLTableRowElementBinding::Wrap)
generate_traceable_htmlelement!(HTMLTableRowElement)
generate_cacheable_wrapper_htmlelement!(HTMLTableSectionElement, HTMLTableSectionElementBinding::Wrap)
generate_traceable_htmlelement!(HTMLTableSectionElement)
generate_cacheable_wrapper_htmlelement!(HTMLTemplateElement, HTMLTemplateElementBinding::Wrap)
generate_traceable_htmlelement!(HTMLTemplateElement)
generate_cacheable_wrapper_htmlelement!(HTMLTextAreaElement, HTMLTextAreaElementBinding::Wrap)
generate_traceable_htmlelement!(HTMLTextAreaElement)
generate_cacheable_wrapper_htmlelement!(HTMLTitleElement, HTMLTitleElementBinding::Wrap)
generate_traceable_htmlelement!(HTMLTitleElement)
generate_cacheable_wrapper_htmlelement!(HTMLTimeElement, HTMLTimeElementBinding::Wrap)
generate_traceable_htmlelement!(HTMLTimeElement)
generate_cacheable_wrapper_htmlelement!(HTMLTrackElement, HTMLTrackElementBinding::Wrap)
generate_traceable_htmlelement!(HTMLTrackElement)
generate_cacheable_wrapper_htmlelement!(HTMLUListElement, HTMLUListElementBinding::Wrap)
generate_traceable_htmlelement!(HTMLUListElement)
generate_cacheable_wrapper_htmlelement!(HTMLUnknownElement, HTMLUnknownElementBinding::Wrap)
generate_traceable_htmlelement!(HTMLUnknownElement)
generate_cacheable_wrapper_htmlmediaelement!(HTMLVideoElement, HTMLVideoElementBinding::Wrap)
generate_traceable_htmlmediaelement!(HTMLVideoElement)
generate_cacheable_wrapper!(HTMLElement, HTMLElementBinding::Wrap)
generate_traceable!(HTMLElement)
generate_traceable_node!(Element)
generate_traceable_node!(CharacterData)

View file

@ -0,0 +1,99 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* 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 dom::bindings::utils::{Reflector, Reflectable};
use dom::window;
use js::jsapi::{JSContext, JSObject};
use layout_interface::TrustedNodeAddress;
use std::cast;
use std::cell::RefCell;
use std::unstable::raw::Box;
pub struct JS<T> {
priv ptr: RefCell<*mut T>
}
impl<T> Eq for JS<T> {
fn eq(&self, other: &JS<T>) -> bool {
self.ptr == other.ptr
}
}
impl <T> Clone for JS<T> {
fn clone(&self) -> JS<T> {
JS {
ptr: self.ptr.clone()
}
}
}
impl<T: Reflectable> JS<T> {
pub fn new(mut obj: ~T,
window: &window::Window,
wrap_fn: extern "Rust" fn(*JSContext, *JSObject, ~T) -> *JSObject) -> JS<T> {
let cx = window.get_cx();
let scope = window.reflector().get_jsobject();
let raw: *mut T = &mut *obj;
if wrap_fn(cx, scope, obj).is_null() {
fail!("Could not eagerly wrap object");
}
JS {
ptr: RefCell::new(raw)
}
}
pub unsafe fn from_raw(raw: *mut T) -> JS<T> {
JS {
ptr: RefCell::new(raw)
}
}
pub unsafe fn from_box(box_: *mut Box<T>) -> JS<T> {
let raw: *mut T = &mut (*box_).data;
JS {
ptr: RefCell::new(raw)
}
}
pub unsafe fn from_trusted_node_address(inner: TrustedNodeAddress) -> JS<T> {
JS {
ptr: RefCell::new(inner as *mut T)
}
}
}
impl<T: Reflectable> Reflectable for JS<T> {
fn reflector<'a>(&'a self) -> &'a Reflector {
self.get().reflector()
}
fn mut_reflector<'a>(&'a mut self) -> &'a mut Reflector {
self.get_mut().mut_reflector()
}
}
impl<T> JS<T> {
pub fn get<'a>(&'a self) -> &'a T {
let borrowed = self.ptr.borrow();
unsafe {
&(**borrowed.get())
}
}
pub fn get_mut<'a>(&'a mut self) -> &'a mut T {
let mut borrowed = self.ptr.borrow_mut();
unsafe {
&mut (**borrowed.get())
}
}
}
impl<From, To> JS<From> {
//XXXjdm It would be lovely if this could be private.
pub unsafe fn transmute(self) -> JS<To> {
cast::transmute(self)
}
}

View file

@ -1,52 +0,0 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* 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 dom::bindings::utils::{Reflectable, Reflector, Traceable, trace_reflector};
use dom::types::*;
use dom::node::AbstractNode;
use std::cast;
use std::libc;
use std::ptr;
use js::jsapi::{JSTracer, JSTRACE_OBJECT, JS_CallTracer};
impl Reflectable for AbstractNode {
fn reflector<'a>(&'a self) -> &'a Reflector {
self.node().reflector()
}
fn mut_reflector<'a>(&'a mut self) -> &'a mut Reflector {
self.mut_node().mut_reflector()
}
}
impl Traceable for Node {
fn trace(&self, tracer: *mut JSTracer) {
fn trace_node(tracer: *mut JSTracer, node: Option<AbstractNode>, name: &str) {
if node.is_none() {
return;
}
debug!("tracing {:s}", name);
let node = node.unwrap();
let obj = node.reflector().get_jsobject();
assert!(obj.is_not_null());
unsafe {
(*tracer).debugPrinter = ptr::null();
(*tracer).debugPrintIndex = -1;
name.to_c_str().with_ref(|name| {
(*tracer).debugPrintArg = name as *libc::c_void;
JS_CallTracer(cast::transmute(tracer), obj, JSTRACE_OBJECT as u32);
});
}
}
debug!("tracing {:p}?:", self.reflector().get_jsobject());
trace_node(tracer, self.parent_node, "parent");
trace_node(tracer, self.first_child, "first child");
trace_node(tracer, self.last_child, "last child");
trace_node(tracer, self.next_sibling, "next sibling");
trace_node(tracer, self.prev_sibling, "prev sibling");
let owner_doc = self.owner_doc();
trace_reflector(tracer, "document", owner_doc.reflector());
}
}

View file

@ -0,0 +1,28 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* 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 dom::bindings::js::JS;
use dom::bindings::utils::{Reflectable, trace_reflector, Reflector};
use js::jsapi::JSTracer;
use std::cast;
use extra::serialize::{Encodable, Encoder};
// IMPORTANT: We rely on the fact that we never attempt to encode DOM objects using
// any encoder but JSTracer. Since we derive trace hooks automatically,
// we are unfortunately required to use generic types everywhere and
// unsafely cast to the concrete JSTracer we actually require.
impl<T: Reflectable+Encodable<S>, S: Encoder> Encodable<S> for JS<T> {
fn encode(&self, s: &mut S) {
let s: &mut JSTracer = unsafe { cast::transmute(s) };
trace_reflector(s, "", self.reflector());
}
}
impl<S: Encoder> Encodable<S> for Reflector {
fn encode(&self, _s: &mut S) {
}
}

View file

@ -4,11 +4,13 @@
use dom::bindings::codegen::PrototypeList;
use dom::bindings::codegen::PrototypeList::MAX_PROTO_CHAIN_LENGTH;
use dom::bindings::js::JS;
use dom::window;
use servo_util::str::DOMString;
use std::libc::c_uint;
use std::cast;
use std::cmp::Eq;
use std::hashmap::HashMap;
use std::libc;
use std::ptr;
@ -32,7 +34,7 @@ use js::jsapi::{JSContext, JSObject, JSBool, jsid, JSClass, JSNative, JSTracer};
use js::jsapi::{JSFunctionSpec, JSPropertySpec, JSVal, JSPropertyDescriptor};
use js::jsapi::{JS_NewGlobalObject, JS_InitStandardClasses};
use js::jsapi::{JSString, JS_CallTracer, JSTRACE_OBJECT};
use js::jsapi::{JS_IsExceptionPending};
use js::jsapi::{JS_IsExceptionPending, JS_AllowGC, JS_InhibitGC};
use js::jsfriendapi::bindgen::JS_NewObjectWithUniqueType;
use js::{JSPROP_ENUMERATE, JSVAL_NULL, JSCLASS_IS_GLOBAL, JSCLASS_IS_DOMJSCLASS};
use js::{JSPROP_PERMANENT, JSID_VOID, JSPROP_NATIVE_ACCESSORS, JSPROP_GETTER};
@ -174,6 +176,17 @@ pub fn unwrap_object<T>(obj: *JSObject, proto_id: PrototypeList::id::ID, proto_d
}
}
pub fn unwrap_jsmanaged<T: Reflectable>(obj: *JSObject,
proto_id: PrototypeList::id::ID,
proto_depth: uint) -> Result<JS<T>, ()> {
let result: Result<*mut Box<T>, ()> = unwrap_object(obj, proto_id, proto_depth);
result.map(|unwrapped| {
unsafe {
JS::from_box(unwrapped)
}
})
}
pub fn unwrap_value<T>(val: *JSVal, proto_id: PrototypeList::id::ID, proto_depth: uint) -> Result<T, ()> {
unsafe {
let obj = RUST_JSVAL_TO_OBJECT(*val);
@ -182,8 +195,11 @@ pub fn unwrap_value<T>(val: *JSVal, proto_id: PrototypeList::id::ID, proto_depth
}
pub unsafe fn squirrel_away<T>(x: @mut T) -> *Box<T> {
let y: *Box<T> = cast::transmute(x);
y
cast::transmute(x)
}
pub unsafe fn squirrel_away_unique<T>(x: ~T) -> *Box<T> {
cast::transmute(x)
}
pub fn jsstring_to_str(cx: *JSContext, s: *JSString) -> DOMString {
@ -557,10 +573,6 @@ pub fn trace_reflector(tracer: *mut JSTracer, description: &str, reflector: &Ref
}
}
pub fn trace_option<T: Reflectable>(tracer: *mut JSTracer, description: &str, option: Option<@mut T>) {
option.map(|some| trace_reflector(tracer, description, some.reflector()));
}
pub fn initialize_global(global: *JSObject) {
let protoArray = @mut ([0 as *JSObject, ..PrototypeList::id::_ID_Count as uint]);
unsafe {
@ -579,21 +591,17 @@ pub trait Reflectable {
}
pub fn reflect_dom_object<T: Reflectable>
(obj: @mut T,
(obj: ~T,
window: &window::Window,
wrap_fn: extern "Rust" fn(*JSContext, *JSObject, @mut T) -> *JSObject)
-> @mut T {
let cx = window.get_cx();
let scope = window.reflector().get_jsobject();
if wrap_fn(cx, scope, obj).is_null() {
fail!("Could not eagerly wrap object");
}
assert!(obj.reflector().get_jsobject().is_not_null());
obj
wrap_fn: extern "Rust" fn(*JSContext, *JSObject, ~T) -> *JSObject)
-> JS<T> {
JS::new(obj, window, wrap_fn)
}
#[deriving(Eq)]
pub struct Reflector {
object: *JSObject
object: *JSObject,
force_box_layout: @int,
}
impl Reflector {
@ -610,7 +618,8 @@ impl Reflector {
pub fn new() -> Reflector {
Reflector {
object: ptr::null()
object: ptr::null(),
force_box_layout: @1,
}
}
}
@ -849,11 +858,11 @@ fn cx_for_dom_reflector(obj: *JSObject) -> *JSContext {
}
/// Returns the global object of the realm that the given DOM object was created in.
pub fn global_object_for_dom_object<T: Reflectable>(obj: &mut T) -> *Box<window::Window> {
pub fn global_object_for_dom_object<T: Reflectable>(obj: &T) -> *Box<window::Window> {
global_object_for_js_object(obj.reflector().get_jsobject())
}
pub fn cx_for_dom_object<T: Reflectable>(obj: &mut T) -> *JSContext {
pub fn cx_for_dom_object<T: Reflectable>(obj: &T) -> *JSContext {
cx_for_dom_reflector(obj.reflector().get_jsobject())
}
@ -870,6 +879,35 @@ pub fn throw_method_failed_with_details<T>(cx: *JSContext,
return 0;
}
pub fn throw_not_in_union(cx: *JSContext, names: &'static str) -> JSBool {
assert!(unsafe { JS_IsExceptionPending(cx) } == 0);
let message = format!("argument could not be converted to any of: {}", names);
message.with_c_str(|string| {
unsafe { ReportError(cx, string) };
});
return 0;
}
/// Execute arbitrary code with the JS GC enabled, then disable it afterwards.
pub fn with_gc_enabled<R>(cx: *JSContext, f: || -> R) -> R {
unsafe {
JS_AllowGC(cx);
let rv = f();
JS_InhibitGC(cx);
rv
}
}
/// Execute arbitrary code with the JS GC disabled, then enable it afterwards.
pub fn with_gc_disabled<R>(cx: *JSContext, f: || -> R) -> R {
unsafe {
JS_InhibitGC(cx);
let rv = f();
JS_AllowGC(cx);
rv
}
}
/// Check if an element name is valid. See http://www.w3.org/TR/xml/#NT-Name
/// for details.
#[deriving(Eq)]

View file

@ -2,32 +2,36 @@
* 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 dom::bindings::js::JS;
use dom::bindings::utils::{Reflectable, Reflector, reflect_dom_object};
use dom::bindings::utils::Fallible;
use dom::bindings::codegen::BlobBinding;
use dom::window::Window;
use servo_util::str::DOMString;
#[deriving(Encodable)]
pub struct Blob {
reflector_: Reflector,
window: @mut Window,
window: JS<Window>
}
impl Blob {
pub fn new_inherited(window: @mut Window) -> Blob {
pub fn new_inherited(window: JS<Window>) -> Blob {
Blob {
reflector_: Reflector::new(),
window: window,
window: window
}
}
pub fn new(window: @mut Window) -> @mut Blob {
reflect_dom_object(@mut Blob::new_inherited(window), window, BlobBinding::Wrap)
pub fn new(window: &JS<Window>) -> JS<Blob> {
reflect_dom_object(~Blob::new_inherited(window.clone()),
window.get(),
BlobBinding::Wrap)
}
}
impl Blob {
pub fn Constructor(window: @mut Window) -> Fallible<@mut Blob> {
pub fn Constructor(window: &JS<Window>) -> Fallible<JS<Blob>> {
Ok(Blob::new(window))
}
@ -39,8 +43,8 @@ impl Blob {
~""
}
pub fn Slice(&self, _start: i64, _end: i64, _contentType: Option<DOMString>) -> @mut Blob {
Blob::new(self.window)
pub fn Slice(&self, _start: i64, _end: i64, _contentType: Option<DOMString>) -> JS<Blob> {
Blob::new(&self.window)
}
pub fn Close(&self) {}

View file

@ -4,19 +4,34 @@
//! DOM bindings for `CharacterData`.
use dom::bindings::codegen::InheritTypes::CharacterDataDerived;
use dom::bindings::js::JS;
use dom::bindings::utils::{Fallible, ErrorResult};
use dom::bindings::utils::{Reflectable, Reflector};
use dom::document::AbstractDocument;
use dom::node::{Node, NodeTypeId};
use dom::document::Document;
use dom::eventtarget::{EventTarget, NodeTargetTypeId};
use dom::node::{CommentNodeTypeId, Node, NodeTypeId, TextNodeTypeId, ProcessingInstructionNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
pub struct CharacterData {
node: Node,
data: DOMString,
}
impl CharacterDataDerived for EventTarget {
fn is_characterdata(&self) -> bool {
match self.type_id {
NodeTargetTypeId(TextNodeTypeId) |
NodeTargetTypeId(CommentNodeTypeId) |
NodeTargetTypeId(ProcessingInstructionNodeTypeId) => true,
_ => false
}
}
}
impl CharacterData {
pub fn new_inherited(id: NodeTypeId, data: DOMString, document: AbstractDocument) -> CharacterData {
pub fn new_inherited(id: NodeTypeId, data: DOMString, document: JS<Document>) -> CharacterData {
CharacterData {
node: Node::new_inherited(id, document),
data: data

View file

@ -3,21 +3,23 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use dom::bindings::codegen::ClientRectBinding;
use dom::bindings::js::JS;
use dom::bindings::utils::{Reflectable, Reflector, reflect_dom_object};
use dom::window::Window;
use servo_util::geometry::Au;
#[deriving(Encodable)]
pub struct ClientRect {
reflector_: Reflector,
top: f32,
bottom: f32,
left: f32,
right: f32,
window: @mut Window,
window: JS<Window>,
}
impl ClientRect {
pub fn new_inherited(window: @mut Window,
pub fn new_inherited(window: JS<Window>,
top: Au, bottom: Au,
left: Au, right: Au) -> ClientRect {
ClientRect {
@ -30,11 +32,11 @@ impl ClientRect {
}
}
pub fn new(window: @mut Window,
pub fn new(window: &JS<Window>,
top: Au, bottom: Au,
left: Au, right: Au) -> @mut ClientRect {
let rect = ClientRect::new_inherited(window, top, bottom, left, right);
reflect_dom_object(@mut rect, window, ClientRectBinding::Wrap)
left: Au, right: Au) -> JS<ClientRect> {
let rect = ClientRect::new_inherited(window.clone(), top, bottom, left, right);
reflect_dom_object(~rect, window.get(), ClientRectBinding::Wrap)
}

View file

@ -3,19 +3,21 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use dom::bindings::codegen::ClientRectListBinding;
use dom::bindings::js::JS;
use dom::bindings::utils::{Reflectable, Reflector, reflect_dom_object};
use dom::clientrect::ClientRect;
use dom::window::Window;
#[deriving(Encodable)]
pub struct ClientRectList {
reflector_: Reflector,
rects: ~[@mut ClientRect],
window: @mut Window,
rects: ~[JS<ClientRect>],
window: JS<Window>,
}
impl ClientRectList {
pub fn new_inherited(window: @mut Window,
rects: ~[@mut ClientRect]) -> ClientRectList {
pub fn new_inherited(window: JS<Window>,
rects: ~[JS<ClientRect>]) -> ClientRectList {
ClientRectList {
reflector_: Reflector::new(),
rects: rects,
@ -23,25 +25,25 @@ impl ClientRectList {
}
}
pub fn new(window: @mut Window,
rects: ~[@mut ClientRect]) -> @mut ClientRectList {
reflect_dom_object(@mut ClientRectList::new_inherited(window, rects),
window, ClientRectListBinding::Wrap)
pub fn new(window: &JS<Window>,
rects: ~[JS<ClientRect>]) -> JS<ClientRectList> {
reflect_dom_object(~ClientRectList::new_inherited(window.clone(), rects),
window.get(), ClientRectListBinding::Wrap)
}
pub fn Length(&self) -> u32 {
self.rects.len() as u32
}
pub fn Item(&self, index: u32) -> Option<@mut ClientRect> {
pub fn Item(&self, index: u32) -> Option<JS<ClientRect>> {
if index < self.rects.len() as u32 {
Some(self.rects[index])
Some(self.rects[index].clone())
} else {
None
}
}
pub fn IndexedGetter(&self, index: u32, found: &mut bool) -> Option<@mut ClientRect> {
pub fn IndexedGetter(&self, index: u32, found: &mut bool) -> Option<JS<ClientRect>> {
*found = index < self.rects.len() as u32;
self.Item(index)
}

View file

@ -2,32 +2,45 @@
* 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 dom::bindings::codegen::InheritTypes::CommentDerived;
use dom::bindings::codegen::CommentBinding;
use dom::bindings::js::JS;
use dom::bindings::utils::Fallible;
use dom::characterdata::CharacterData;
use dom::document::AbstractDocument;
use dom::node::{AbstractNode, CommentNodeTypeId, Node};
use dom::document::Document;
use dom::eventtarget::{EventTarget, NodeTargetTypeId};
use dom::node::{CommentNodeTypeId, Node};
use dom::window::Window;
use servo_util::str::DOMString;
/// An HTML comment.
#[deriving(Encodable)]
pub struct Comment {
characterdata: CharacterData,
}
impl CommentDerived for EventTarget {
fn is_comment(&self) -> bool {
match self.type_id {
NodeTargetTypeId(CommentNodeTypeId) => true,
_ => false
}
}
}
impl Comment {
pub fn new_inherited(text: DOMString, document: AbstractDocument) -> Comment {
pub fn new_inherited(text: DOMString, document: JS<Document>) -> Comment {
Comment {
characterdata: CharacterData::new_inherited(CommentNodeTypeId, text, document)
}
}
pub fn new(text: DOMString, document: AbstractDocument) -> AbstractNode {
let node = Comment::new_inherited(text, document);
Node::reflect_node(@mut node, document, CommentBinding::Wrap)
pub fn new(text: DOMString, document: &JS<Document>) -> JS<Comment> {
let node = Comment::new_inherited(text, document.clone());
Node::reflect_node(~node, document, CommentBinding::Wrap)
}
pub fn Constructor(owner: @mut Window, data: DOMString) -> Fallible<AbstractNode> {
Ok(Comment::new(data, owner.Document()))
pub fn Constructor(owner: &JS<Window>, data: DOMString) -> Fallible<JS<Comment>> {
Ok(Comment::new(data, &owner.get().Document()))
}
}

View file

@ -2,11 +2,13 @@
* 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 dom::bindings::utils::{Reflectable, Reflector, reflect_dom_object};
use dom::bindings::codegen::ConsoleBinding;
use dom::bindings::js::JS;
use dom::bindings::utils::{Reflectable, Reflector, reflect_dom_object};
use dom::window::Window;
use servo_util::str::DOMString;
#[deriving(Encodable)]
pub struct Console {
reflector_: Reflector
}
@ -18,8 +20,8 @@ impl Console {
}
}
pub fn new(window: &Window) -> @mut Console {
reflect_dom_object(@mut Console::new_inherited(), window, ConsoleBinding::Wrap)
pub fn new(window: &Window) -> JS<Console> {
reflect_dom_object(~Console::new_inherited(), window, ConsoleBinding::Wrap)
}
pub fn Log(&self, message: DOMString) {

View file

@ -2,25 +2,35 @@
* 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 dom::comment::Comment;
use dom::bindings::codegen::InheritTypes::{DocumentDerived, EventCast, HTMLElementCast};
use dom::bindings::codegen::InheritTypes::{DocumentBase, NodeCast, DocumentCast};
use dom::bindings::codegen::InheritTypes::{HTMLHeadElementCast, TextCast, ElementCast};
use dom::bindings::codegen::InheritTypes::{DocumentTypeCast, HTMLHtmlElementCast};
use dom::bindings::codegen::DocumentBinding;
use dom::bindings::utils::{Reflectable, Reflector, Traceable, reflect_dom_object};
use dom::bindings::js::JS;
use dom::bindings::utils::{Reflectable, Reflector, reflect_dom_object};
use dom::bindings::utils::{ErrorResult, Fallible, NotSupported, InvalidCharacter, HierarchyRequest};
use dom::bindings::utils::{xml_name_type, InvalidXMLName};
use dom::comment::Comment;
use dom::documentfragment::DocumentFragment;
use dom::documenttype::DocumentType;
use dom::domimplementation::DOMImplementation;
use dom::element::{Element};
use dom::element::{HTMLHtmlElementTypeId, HTMLHeadElementTypeId, HTMLTitleElementTypeId, HTMLBodyElementTypeId, HTMLFrameSetElementTypeId};
use dom::event::{AbstractEvent, Event};
use dom::element::{HTMLHtmlElementTypeId, HTMLHeadElementTypeId, HTMLTitleElementTypeId};
use dom::element::{HTMLBodyElementTypeId, HTMLFrameSetElementTypeId};
use dom::event::Event;
use dom::eventtarget::{EventTarget, NodeTargetTypeId};
use dom::htmlcollection::HTMLCollection;
use dom::htmldocument::HTMLDocument;
use dom::htmlelement::HTMLElement;
use dom::htmlheadelement::HTMLHeadElement;
use dom::htmlhtmlelement::HTMLHtmlElement;
use dom::htmltitleelement::HTMLTitleElement;
use dom::mouseevent::MouseEvent;
use dom::node::{AbstractNode, Node, ElementNodeTypeId, DocumentNodeTypeId};
use dom::node::{Node, ElementNodeTypeId, DocumentNodeTypeId, NodeHelpers, INode};
use dom::text::Text;
use dom::processinginstruction::ProcessingInstruction;
use dom::uievent::UIEvent;
use dom::window::Window;
use dom::htmltitleelement::HTMLTitleElement;
use html::hubbub_html_parser::build_element_from_tag;
use hubbub::hubbub::{QuirksMode, NoQuirks, LimitedQuirks, FullQuirks};
use layout_interface::{DocumentDamageLevel, ContentChangedDocumentDamage};
@ -28,154 +38,109 @@ use servo_util::namespace::Null;
use servo_util::str::DOMString;
use extra::url::{Url, from_str};
use js::jsapi::{JSObject, JSContext, JSTracer};
use js::jsapi::{JSObject, JSContext};
use std::ascii::StrAsciiExt;
use std::cast;
use std::hashmap::HashMap;
use std::unstable::raw::Box;
#[deriving(Eq)]
pub enum DocumentTypeId {
PlainDocumentTypeId,
HTMLDocumentTypeId
}
#[deriving(Eq)]
pub struct AbstractDocument {
document: *mut Box<Document>
}
impl AbstractDocument {
pub fn document<'a>(&'a self) -> &'a Document {
unsafe {
&(*self.document).data
}
}
pub fn mut_document<'a>(&'a self) -> &'a mut Document {
unsafe {
&mut (*self.document).data
}
}
unsafe fn transmute<T, R>(&self, f: |&T| -> R) -> R {
let box_: *Box<T> = cast::transmute(self.document);
f(&(*box_).data)
}
pub fn with_html<R>(&self, callback: |&HTMLDocument| -> R) -> R {
match self.document().doctype {
HTML => unsafe { self.transmute(callback) },
_ => fail!("attempt to downcast a non-HTMLDocument to HTMLDocument")
}
}
pub fn from_box<T>(ptr: *mut Box<T>) -> AbstractDocument {
AbstractDocument {
document: ptr as *mut Box<Document>
}
}
pub fn from_node(node: AbstractNode) -> AbstractDocument {
if !node.is_document() {
fail!("node is not a document");
}
unsafe {
cast::transmute(node)
}
}
}
#[deriving(Eq)]
pub enum DocumentType {
HTML,
SVG,
XML
use extra::serialize::{Encoder, Encodable};
#[deriving(Eq,Encodable)]
pub enum IsHTMLDocument {
HTMLDocument,
NonHTMLDocument,
}
#[deriving(Encodable)]
pub struct Document {
node: Node,
reflector_: Reflector,
window: @mut Window,
doctype: DocumentType,
idmap: HashMap<DOMString, AbstractNode>,
implementation: Option<@mut DOMImplementation>,
window: JS<Window>,
idmap: HashMap<DOMString, JS<Element>>,
implementation: Option<JS<DOMImplementation>>,
content_type: DOMString,
encoding_name: DOMString,
is_html_document: bool,
extra: Untraceable,
}
struct Untraceable {
url: Url,
quirks_mode: QuirksMode,
encoding_name: DOMString,
}
impl<S: Encoder> Encodable<S> for Untraceable {
fn encode(&self, _: &mut S) {
}
}
impl DocumentDerived for EventTarget {
fn is_document(&self) -> bool {
match self.type_id {
NodeTargetTypeId(DocumentNodeTypeId) => true,
_ => false
}
}
}
impl Document {
pub fn reflect_document<D: Reflectable>
(document: @mut D,
window: @mut Window,
wrap_fn: extern "Rust" fn(*JSContext, *JSObject, @mut D) -> *JSObject)
-> AbstractDocument {
pub fn reflect_document<D: Reflectable+DocumentBase>
(document: ~D,
window: &JS<Window>,
wrap_fn: extern "Rust" fn(*JSContext, *JSObject, ~D) -> *JSObject)
-> JS<D> {
assert!(document.reflector().get_jsobject().is_null());
let document = reflect_dom_object(document, window, wrap_fn);
assert!(document.reflector().get_jsobject().is_not_null());
let raw_doc = reflect_dom_object(document, window.get(), wrap_fn);
assert!(raw_doc.reflector().get_jsobject().is_not_null());
// JS object now owns the Document, so transmute_copy is needed
let abstract = AbstractDocument {
document: unsafe { cast::transmute_copy(&document) }
};
abstract.mut_document().node.set_owner_doc(abstract);
abstract
let document = DocumentCast::from(&raw_doc);
let mut node: JS<Node> = NodeCast::from(&document);
node.get_mut().set_owner_doc(&document);
raw_doc
}
pub fn new_inherited(window: @mut Window, url: Option<Url>, doctype: DocumentType, content_type: Option<DOMString>) -> Document {
let node_type = match doctype {
HTML => HTMLDocumentTypeId,
SVG | XML => PlainDocumentTypeId
};
pub fn new_inherited(window: JS<Window>,
url: Option<Url>,
is_html_document: IsHTMLDocument,
content_type: Option<DOMString>) -> Document {
Document {
node: Node::new_without_doc(DocumentNodeTypeId(node_type)),
node: Node::new_without_doc(DocumentNodeTypeId),
reflector_: Reflector::new(),
window: window,
doctype: doctype,
idmap: HashMap::new(),
implementation: None,
content_type: match content_type {
Some(string) => string.clone(),
None => match doctype {
None => match is_html_document {
// http://dom.spec.whatwg.org/#dom-domimplementation-createhtmldocument
HTML => ~"text/html",
HTMLDocument => ~"text/html",
// http://dom.spec.whatwg.org/#concept-document-content-type
SVG | XML => ~"application/xml"
NonHTMLDocument => ~"application/xml"
}
},
url: match url {
None => from_str("about:blank").unwrap(),
Some(_url) => _url
extra: Untraceable {
url: match url {
None => from_str("about:blank").unwrap(),
Some(_url) => _url
},
// http://dom.spec.whatwg.org/#concept-document-quirks
quirks_mode: NoQuirks,
},
// http://dom.spec.whatwg.org/#concept-document-quirks
quirks_mode: NoQuirks,
// http://dom.spec.whatwg.org/#concept-document-encoding
encoding_name: ~"utf-8",
is_html_document: is_html_document == HTMLDocument,
}
}
pub fn new(window: @mut Window, url: Option<Url>, doctype: DocumentType, content_type: Option<DOMString>) -> AbstractDocument {
let document = Document::new_inherited(window, url, doctype, content_type);
Document::reflect_document(@mut document, window, DocumentBinding::Wrap)
pub fn new(window: &JS<Window>, url: Option<Url>, doctype: IsHTMLDocument, content_type: Option<DOMString>) -> JS<Document> {
let document = Document::new_inherited(window.clone(), url, doctype, content_type);
Document::reflect_document(~document, window, DocumentBinding::Wrap)
}
}
impl Document {
// http://dom.spec.whatwg.org/#dom-document
pub fn Constructor(owner: @mut Window) -> Fallible<AbstractDocument> {
Ok(Document::new(owner, None, XML, None))
}
}
impl Reflectable for AbstractDocument {
fn reflector<'a>(&'a self) -> &'a Reflector {
self.document().reflector()
}
fn mut_reflector<'a>(&'a mut self) -> &'a mut Reflector {
self.mut_document().mut_reflector()
pub fn Constructor(owner: &JS<Window>) -> Fallible<JS<Document>> {
Ok(Document::new(owner, None, NonHTMLDocument, None))
}
}
@ -191,16 +156,16 @@ impl Reflectable for Document {
impl Document {
// http://dom.spec.whatwg.org/#dom-document-implementation
pub fn Implementation(&mut self) -> @mut DOMImplementation {
pub fn Implementation(&mut self) -> JS<DOMImplementation> {
if self.implementation.is_none() {
self.implementation = Some(DOMImplementation::new(self.window));
self.implementation = Some(DOMImplementation::new(&self.window));
}
self.implementation.unwrap()
self.implementation.get_ref().clone()
}
// http://dom.spec.whatwg.org/#dom-document-url
pub fn URL(&self) -> DOMString {
self.url.to_str()
self.extra.url.to_str()
}
// http://dom.spec.whatwg.org/#dom-document-documenturi
@ -210,14 +175,14 @@ impl Document {
// http://dom.spec.whatwg.org/#dom-document-compatmode
pub fn CompatMode(&self) -> DOMString {
match self.quirks_mode {
match self.extra.quirks_mode {
NoQuirks => ~"CSS1Compat",
LimitedQuirks | FullQuirks => ~"BackCompat"
}
}
pub fn set_quirks_mode(&mut self, mode: QuirksMode) {
self.quirks_mode = mode;
self.extra.quirks_mode = mode;
}
// http://dom.spec.whatwg.org/#dom-document-characterset
@ -235,43 +200,34 @@ impl Document {
}
// http://dom.spec.whatwg.org/#dom-document-doctype
pub fn GetDoctype(&self) -> Option<AbstractNode> {
pub fn GetDoctype(&self) -> Option<JS<DocumentType>> {
self.node.children().find(|child| child.is_doctype())
.map(|node| DocumentTypeCast::to(&node))
}
// http://dom.spec.whatwg.org/#dom-document-documentelement
pub fn GetDocumentElement(&self) -> Option<AbstractNode> {
pub fn GetDocumentElement(&self) -> Option<JS<Element>> {
self.node.child_elements().next()
}
// http://dom.spec.whatwg.org/#dom-document-getelementsbytagname
pub fn GetElementsByTagName(&self, tag: DOMString) -> @mut HTMLCollection {
pub fn GetElementsByTagName(&self, tag: DOMString) -> JS<HTMLCollection> {
self.createHTMLCollection(|elem| elem.tag_name == tag)
}
// http://dom.spec.whatwg.org/#dom-document-getelementsbytagnamens
pub fn GetElementsByTagNameNS(&self, _ns: Option<DOMString>, _tag: DOMString) -> @mut HTMLCollection {
HTMLCollection::new(self.window, ~[])
}
// http://dom.spec.whatwg.org/#dom-document-getelementsbyclassname
pub fn GetElementsByClassName(&self, _class: DOMString) -> @mut HTMLCollection {
HTMLCollection::new(self.window, ~[])
}
// http://dom.spec.whatwg.org/#dom-nonelementparentnode-getelementbyid
pub fn GetElementById(&self, id: DOMString) -> Option<AbstractNode> {
pub fn GetElementById(&self, id: DOMString) -> Option<JS<Element>> {
// TODO: "in tree order, within the context object's tree"
// http://dom.spec.whatwg.org/#dom-document-getelementbyid.
match self.idmap.find_equiv(&id) {
None => None,
Some(node) => Some(*node),
Some(node) => Some(node.clone()),
}
}
// http://dom.spec.whatwg.org/#dom-document-createelement
pub fn CreateElement(&self, abstract_self: AbstractDocument, local_name: DOMString)
-> Fallible<AbstractNode> {
pub fn CreateElement(&self, abstract_self: &JS<Document>, local_name: DOMString)
-> Fallible<JS<Element>> {
if xml_name_type(local_name) == InvalidXMLName {
debug!("Not a valid element name");
return Err(InvalidCharacter);
@ -281,24 +237,24 @@ impl Document {
}
// http://dom.spec.whatwg.org/#dom-document-createdocumentfragment
pub fn CreateDocumentFragment(&self, abstract_self: AbstractDocument) -> AbstractNode {
pub fn CreateDocumentFragment(&self, abstract_self: &JS<Document>) -> JS<DocumentFragment> {
DocumentFragment::new(abstract_self)
}
// http://dom.spec.whatwg.org/#dom-document-createtextnode
pub fn CreateTextNode(&self, abstract_self: AbstractDocument, data: DOMString)
-> AbstractNode {
pub fn CreateTextNode(&self, abstract_self: &JS<Document>, data: DOMString)
-> JS<Text> {
Text::new(data, abstract_self)
}
// http://dom.spec.whatwg.org/#dom-document-createcomment
pub fn CreateComment(&self, abstract_self: AbstractDocument, data: DOMString) -> AbstractNode {
pub fn CreateComment(&self, abstract_self: &JS<Document>, data: DOMString) -> JS<Comment> {
Comment::new(data, abstract_self)
}
// http://dom.spec.whatwg.org/#dom-document-createprocessinginstruction
pub fn CreateProcessingInstruction(&self, abstract_self: AbstractDocument, target: DOMString,
data: DOMString) -> Fallible<AbstractNode> {
pub fn CreateProcessingInstruction(&self, abstract_self: &JS<Document>, target: DOMString,
data: DOMString) -> Fallible<JS<ProcessingInstruction>> {
// Step 1.
if xml_name_type(target) == InvalidXMLName {
return Err(InvalidCharacter);
@ -314,43 +270,29 @@ impl Document {
}
// http://dom.spec.whatwg.org/#dom-document-createevent
pub fn CreateEvent(&self, interface: DOMString) -> Fallible<AbstractEvent> {
pub fn CreateEvent(&self, interface: DOMString) -> Fallible<JS<Event>> {
match interface.as_slice() {
"UIEvents" => Ok(UIEvent::new(self.window)),
"MouseEvents" => Ok(MouseEvent::new(self.window)),
"HTMLEvents" => Ok(Event::new(self.window)),
"UIEvents" => Ok(EventCast::from(&UIEvent::new(&self.window))),
"MouseEvents" => Ok(EventCast::from(&MouseEvent::new(&self.window))),
"HTMLEvents" => Ok(Event::new(&self.window)),
_ => Err(NotSupported)
}
}
// http://www.whatwg.org/specs/web-apps/current-work/#document.title
pub fn Title(&self, _: AbstractDocument) -> DOMString {
pub fn Title(&self, _: &JS<Document>) -> DOMString {
let mut title = ~"";
match self.doctype {
SVG => {
fail!("no SVG document yet")
},
_ => {
match self.GetDocumentElement() {
None => {},
Some(root) => {
for node in root.traverse_preorder() {
if node.type_id() != ElementNodeTypeId(HTMLTitleElementTypeId) {
continue;
}
for child in node.children() {
if child.is_text() {
child.with_imm_text(|text| {
title.push_str(text.characterdata.data.as_slice());
});
}
}
break;
}
self.GetDocumentElement().map(|root| {
let root: JS<Node> = NodeCast::from(&root);
root.traverse_preorder()
.find(|node| node.type_id() == ElementNodeTypeId(HTMLTitleElementTypeId))
.map(|title_elem| {
for child in title_elem.children() {
let text: JS<Text> = TextCast::to(&child);
title.push_str(text.get().characterdata.data.as_slice());
}
}
}
}
});
});
let v: ~[&str] = title.words().collect();
title = v.connect(" ");
title = title.trim().to_owned();
@ -358,85 +300,74 @@ impl Document {
}
// http://www.whatwg.org/specs/web-apps/current-work/#document.title
pub fn SetTitle(&self, abstract_self: AbstractDocument, title: DOMString) -> ErrorResult {
match self.doctype {
SVG => {
fail!("no SVG document yet")
},
_ => {
match self.GetDocumentElement() {
None => {},
Some(root) => {
for node in root.traverse_preorder() {
if node.type_id() != ElementNodeTypeId(HTMLHeadElementTypeId) {
continue;
}
let mut has_title = false;
for child in node.children() {
if child.type_id() != ElementNodeTypeId(HTMLTitleElementTypeId) {
continue;
}
has_title = true;
for title_child in child.children() {
child.RemoveChild(title_child);
}
child.AppendChild(self.CreateTextNode(abstract_self, title.clone()));
break;
}
if !has_title {
let new_title = HTMLTitleElement::new(~"title", abstract_self);
new_title.AppendChild(self.CreateTextNode(abstract_self, title.clone()));
node.AppendChild(new_title);
}
break;
}
pub fn SetTitle(&self, abstract_self: &JS<Document>, title: DOMString) -> ErrorResult {
self.GetDocumentElement().map(|root| {
let root: JS<Node> = NodeCast::from(&root);
let mut head_node = root.traverse_preorder().find(|child| {
child.get().type_id == ElementNodeTypeId(HTMLHeadElementTypeId)
});
head_node.as_mut().map(|head| {
let mut title_node = head.children().find(|child| {
child.get().type_id == ElementNodeTypeId(HTMLTitleElementTypeId)
});
title_node.as_mut().map(|title_node| {
for mut title_child in title_node.children() {
title_node.RemoveChild(&mut title_child);
}
let new_text = self.CreateTextNode(abstract_self, title.clone());
title_node.AppendChild(&mut NodeCast::from(&new_text));
});
if title_node.is_none() {
let mut new_title: JS<Node> =
NodeCast::from(&HTMLTitleElement::new(~"title", abstract_self));
let new_text = self.CreateTextNode(abstract_self, title.clone());
new_title.AppendChild(&mut NodeCast::from(&new_text));
head.AppendChild(&mut new_title);
}
}
}
});
});
Ok(())
}
fn get_html_element(&self) -> Option<AbstractNode> {
fn get_html_element(&self) -> Option<JS<HTMLHtmlElement>> {
self.GetDocumentElement().filtered(|root| {
match root.type_id() {
ElementNodeTypeId(HTMLHtmlElementTypeId) => true,
_ => false
}
})
root.get().node.type_id == ElementNodeTypeId(HTMLHtmlElementTypeId)
}).map(|elem| HTMLHtmlElementCast::to(&elem))
}
// http://www.whatwg.org/specs/web-apps/current-work/#dom-document-head
pub fn GetHead(&self) -> Option<AbstractNode> {
pub fn GetHead(&self) -> Option<JS<HTMLHeadElement>> {
self.get_html_element().and_then(|root| {
root.children().find(|child| {
let node: JS<Node> = NodeCast::from(&root);
node.children().find(|child| {
child.type_id() == ElementNodeTypeId(HTMLHeadElementTypeId)
})
}).map(|node| HTMLHeadElementCast::to(&node))
})
}
// http://www.whatwg.org/specs/web-apps/current-work/#dom-document-body
pub fn GetBody(&self, _: AbstractDocument) -> Option<AbstractNode> {
match self.get_html_element() {
None => None,
Some(root) => {
root.children().find(|child| {
match child.type_id() {
ElementNodeTypeId(HTMLBodyElementTypeId) |
ElementNodeTypeId(HTMLFrameSetElementTypeId) => true,
_ => false
}
})
}
}
pub fn GetBody(&self, _: &JS<Document>) -> Option<JS<HTMLElement>> {
self.get_html_element().and_then(|root| {
let node: JS<Node> = NodeCast::from(&root);
node.children().find(|child| {
match child.type_id() {
ElementNodeTypeId(HTMLBodyElementTypeId) |
ElementNodeTypeId(HTMLFrameSetElementTypeId) => true,
_ => false
}
}).map(|node| HTMLElementCast::to(&node))
})
}
// http://www.whatwg.org/specs/web-apps/current-work/#dom-document-body
pub fn SetBody(&self, abstract_self: AbstractDocument, new_body: Option<AbstractNode>) -> ErrorResult {
pub fn SetBody(&self, abstract_self: &JS<Document>, new_body: Option<JS<HTMLElement>>) -> ErrorResult {
// Step 1.
match new_body {
Some(node) => {
match node.type_id() {
Some(ref node) => {
match node.get().element.node.type_id {
ElementNodeTypeId(HTMLBodyElementTypeId) | ElementNodeTypeId(HTMLFrameSetElementTypeId) => {}
_ => return Err(HierarchyRequest)
}
@ -445,7 +376,7 @@ impl Document {
}
// Step 2.
let old_body: Option<AbstractNode> = self.GetBody(abstract_self);
let old_body: Option<JS<HTMLElement>> = self.GetBody(abstract_self);
if old_body == new_body {
return Ok(());
}
@ -455,41 +386,84 @@ impl Document {
// Step 4.
None => return Err(HierarchyRequest),
Some(root) => {
let mut new_body: JS<Node> = NodeCast::from(&new_body.unwrap());
let mut root: JS<Node> = NodeCast::from(&root);
match old_body {
Some(child) => { root.ReplaceChild(new_body.unwrap(), child); }
None => { root.AppendChild(new_body.unwrap()); }
}
Some(child) => {
let mut child: JS<Node> = NodeCast::from(&child);
root.ReplaceChild(&mut new_body, &mut child)
}
None => root.AppendChild(&mut new_body)
};
}
}
Ok(())
}
// http://www.whatwg.org/specs/web-apps/current-work/#dom-document-getelementsbyname
pub fn GetElementsByName(&self, name: DOMString) -> @mut HTMLCollection {
pub fn GetElementsByName(&self, name: DOMString) -> JS<HTMLCollection> {
self.createHTMLCollection(|elem| {
elem.get_attribute(Null, "name").map_default(false, |attr| {
attr.value_ref() == name
attr.get().value_ref() == name
})
})
}
pub fn createHTMLCollection(&self, callback: |elem: &Element| -> bool) -> @mut HTMLCollection {
pub fn Images(&self) -> JS<HTMLCollection> {
self.createHTMLCollection(|elem| "img" == elem.tag_name)
}
pub fn Embeds(&self) -> JS<HTMLCollection> {
self.createHTMLCollection(|elem| "embed" == elem.tag_name)
}
pub fn Plugins(&self) -> JS<HTMLCollection> {
self.Embeds()
}
pub fn Links(&self) -> JS<HTMLCollection> {
self.createHTMLCollection(|elem| {
("a" == elem.tag_name || "area" == elem.tag_name) &&
elem.get_attribute(Null, "href").is_some()
})
}
pub fn Forms(&self) -> JS<HTMLCollection> {
self.createHTMLCollection(|elem| "form" == elem.tag_name)
}
pub fn Scripts(&self) -> JS<HTMLCollection> {
self.createHTMLCollection(|elem| "script" == elem.tag_name)
}
pub fn Anchors(&self) -> JS<HTMLCollection> {
self.createHTMLCollection(|elem| {
"a" == elem.tag_name && elem.get_attribute(Null, "name").is_some()
})
}
pub fn Applets(&self) -> JS<HTMLCollection> {
// FIXME: This should be return OBJECT elements containing applets.
self.createHTMLCollection(|elem| "applet" == elem.tag_name)
}
pub fn createHTMLCollection(&self, callback: |elem: &Element| -> bool) -> JS<HTMLCollection> {
let mut elements = ~[];
match self.GetDocumentElement() {
None => {},
Some(root) => {
let root: JS<Node> = NodeCast::from(&root);
for child in root.traverse_preorder() {
if child.is_element() {
child.with_imm_element(|elem| {
if callback(elem) {
elements.push(child);
}
});
let elem: JS<Element> = ElementCast::to(&child);
if callback(elem.get()) {
elements.push(elem);
}
}
}
}
}
HTMLCollection::new(self.window, elements)
HTMLCollection::new(&self.window, elements)
}
pub fn content_changed(&self) {
@ -497,22 +471,22 @@ impl Document {
}
pub fn damage_and_reflow(&self, damage: DocumentDamageLevel) {
self.window.damage_and_reflow(damage);
self.window.get().damage_and_reflow(damage);
}
pub fn wait_until_safe_to_modify_dom(&self) {
self.window.wait_until_safe_to_modify_dom();
self.window.get().wait_until_safe_to_modify_dom();
}
pub fn register_nodes_with_id(&mut self, root: &AbstractNode) {
foreach_ided_elements(root, |id: &DOMString, abstract_node: &AbstractNode| {
pub fn register_nodes_with_id(&mut self, root: &JS<Element>) {
foreach_ided_elements(root, |id: &DOMString, abstract_node: &JS<Element>| {
// TODO: "in tree order, within the context object's tree"
// http://dom.spec.whatwg.org/#dom-document-getelementbyid.
self.idmap.find_or_insert(id.clone(), *abstract_node);
self.idmap.find_or_insert(id.clone(), abstract_node.clone());
});
}
pub fn unregister_nodes_with_id(&mut self, root: &AbstractNode) {
pub fn unregister_nodes_with_id(&mut self, root: &JS<Element>) {
foreach_ided_elements(root, |id: &DOMString, _| {
// TODO: "in tree order, within the context object's tree"
// http://dom.spec.whatwg.org/#dom-document-getelementbyid.
@ -521,7 +495,7 @@ impl Document {
}
pub fn update_idmap(&mut self,
abstract_self: AbstractNode,
abstract_self: &JS<Element>,
new_id: Option<DOMString>,
old_id: Option<DOMString>) {
// remove old ids:
@ -539,11 +513,11 @@ impl Document {
Some(new_id) => {
// TODO: support the case if multiple elements
// which haves same id are in the same document.
self.idmap.mangle(new_id, abstract_self,
|_, new_node: AbstractNode| -> AbstractNode {
self.idmap.mangle(new_id, abstract_self.clone(),
|_, new_node: JS<Element>| -> JS<Element> {
new_node
},
|_, old_node: &mut AbstractNode, new_node: AbstractNode| {
|_, old_node: &mut JS<Element>, new_node: JS<Element>| {
*old_node = new_node;
});
}
@ -553,25 +527,19 @@ impl Document {
}
#[inline(always)]
fn foreach_ided_elements(root: &AbstractNode, callback: |&DOMString, &AbstractNode|) {
fn foreach_ided_elements(root: &JS<Element>, callback: |&DOMString, &JS<Element>|) {
let root: JS<Node> = NodeCast::from(root);
for node in root.traverse_preorder() {
if !node.is_element() {
continue;
}
node.with_imm_element(|element| {
match element.get_attribute(Null, "id") {
Some(id) => {
callback(&id.Value(), &node);
}
None => ()
let element: JS<Element> = ElementCast::to(&node);
match element.get().get_attribute(Null, "id") {
Some(id) => {
callback(&id.get().Value(), &element);
}
});
}
}
impl Traceable for Document {
fn trace(&self, tracer: *mut JSTracer) {
self.node.trace(tracer);
None => ()
}
}
}

View file

@ -2,32 +2,45 @@
* 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 dom::bindings::codegen::InheritTypes::DocumentFragmentDerived;
use dom::bindings::codegen::DocumentFragmentBinding;
use dom::bindings::js::JS;
use dom::bindings::utils::Fallible;
use dom::document::AbstractDocument;
use dom::node::{AbstractNode, DocumentFragmentNodeTypeId, Node};
use dom::document::Document;
use dom::eventtarget::{EventTarget, NodeTargetTypeId};
use dom::node::{DocumentFragmentNodeTypeId, Node};
use dom::window::Window;
#[deriving(Encodable)]
pub struct DocumentFragment {
node: Node,
}
impl DocumentFragmentDerived for EventTarget {
fn is_documentfragment(&self) -> bool {
match self.type_id {
NodeTargetTypeId(DocumentFragmentNodeTypeId) => true,
_ => false
}
}
}
impl DocumentFragment {
/// Creates a new DocumentFragment.
pub fn new_inherited(document: AbstractDocument) -> DocumentFragment {
pub fn new_inherited(document: JS<Document>) -> DocumentFragment {
DocumentFragment {
node: Node::new_inherited(DocumentFragmentNodeTypeId, document),
}
}
pub fn new(document: AbstractDocument) -> AbstractNode {
let node = DocumentFragment::new_inherited(document);
Node::reflect_node(@mut node, document, DocumentFragmentBinding::Wrap)
pub fn new(document: &JS<Document>) -> JS<DocumentFragment> {
let node = DocumentFragment::new_inherited(document.clone());
Node::reflect_node(~node, document, DocumentFragmentBinding::Wrap)
}
}
impl DocumentFragment {
pub fn Constructor(owner: @mut Window) -> Fallible<AbstractNode> {
Ok(DocumentFragment::new(owner.Document()))
pub fn Constructor(owner: &JS<Window>) -> Fallible<JS<DocumentFragment>> {
Ok(DocumentFragment::new(&owner.get().Document()))
}
}

View file

@ -2,12 +2,16 @@
* 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 dom::bindings::codegen::InheritTypes::DocumentTypeDerived;
use dom::bindings::codegen::DocumentTypeBinding;
use dom::document::AbstractDocument;
use dom::node::{AbstractNode, Node, DoctypeNodeTypeId};
use dom::bindings::js::JS;
use dom::document::Document;
use dom::eventtarget::{EventTarget, NodeTargetTypeId};
use dom::node::{Node, DoctypeNodeTypeId};
use servo_util::str::DOMString;
/// The `DOCTYPE` tag.
#[deriving(Encodable)]
pub struct DocumentType {
node: Node,
name: DOMString,
@ -15,11 +19,20 @@ pub struct DocumentType {
system_id: DOMString,
}
impl DocumentTypeDerived for EventTarget {
fn is_documenttype(&self) -> bool {
match self.type_id {
NodeTargetTypeId(DoctypeNodeTypeId) => true,
_ => false
}
}
}
impl DocumentType {
pub fn new_inherited(name: DOMString,
public_id: Option<DOMString>,
system_id: Option<DOMString>,
document: AbstractDocument)
document: JS<Document>)
-> DocumentType {
DocumentType {
node: Node::new_inherited(DoctypeNodeTypeId, document),
@ -32,13 +45,13 @@ impl DocumentType {
pub fn new(name: DOMString,
public_id: Option<DOMString>,
system_id: Option<DOMString>,
document: AbstractDocument)
-> AbstractNode {
document: &JS<Document>)
-> JS<DocumentType> {
let documenttype = DocumentType::new_inherited(name,
public_id,
system_id,
document);
Node::reflect_node(@mut documenttype, document, DocumentTypeBinding::Wrap)
document.clone());
Node::reflect_node(~documenttype, document, DocumentTypeBinding::Wrap)
}
}

View file

@ -3,12 +3,13 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use dom::bindings::codegen::DOMExceptionBinding;
use dom::bindings::js::JS;
use dom::bindings::utils::{Reflectable, Reflector, reflect_dom_object};
use dom::window::Window;
use servo_util::str::DOMString;
#[repr(uint)]
#[deriving(ToStr)]
#[deriving(ToStr, Encodable)]
enum DOMErrorName {
IndexSizeError = 1,
HierarchyRequestError = 3,
@ -33,6 +34,7 @@ enum DOMErrorName {
EncodingError
}
#[deriving(Encodable)]
pub struct DOMException {
code: DOMErrorName,
reflector_: Reflector
@ -46,8 +48,8 @@ impl DOMException {
}
}
pub fn new(window: &Window, code: DOMErrorName) -> @mut DOMException {
reflect_dom_object(@mut DOMException::new_inherited(code), window, DOMExceptionBinding::Wrap)
pub fn new(window: &Window, code: DOMErrorName) -> JS<DOMException> {
reflect_dom_object(~DOMException::new_inherited(code), window, DOMExceptionBinding::Wrap)
}
}
@ -67,7 +69,7 @@ impl DOMException {
match self.code {
// http://dom.spec.whatwg.org/#concept-throw
EncodingError => 0,
_ => self.code as u16
code => code as u16
}
}

View file

@ -3,36 +3,38 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use dom::bindings::codegen::DOMImplementationBinding;
use dom::bindings::codegen::InheritTypes::NodeCast;
use dom::bindings::js::JS;
use dom::bindings::utils::{Reflector, Reflectable, reflect_dom_object};
use dom::bindings::utils::{Fallible, InvalidCharacter, NamespaceError};
use dom::bindings::utils::{QName, Name, InvalidXMLName, xml_name_type};
use dom::document::{AbstractDocument, HTML, HTMLDocumentTypeId};
use dom::document::{Document, HTMLDocument};
use dom::documenttype::DocumentType;
use dom::htmldocument::HTMLDocument;
use dom::htmlbodyelement::HTMLBodyElement;
use dom::htmlheadelement::HTMLHeadElement;
use dom::htmlhtmlelement::HTMLHtmlElement;
use dom::htmltitleelement::HTMLTitleElement;
use dom::node::{AbstractNode, DocumentNodeTypeId};
use dom::node::{Node, INode};
use dom::text::Text;
use dom::window::Window;
use servo_util::str::DOMString;
#[deriving(Encodable)]
pub struct DOMImplementation {
owner: @mut Window,
reflector_: Reflector
owner: JS<Window>,
reflector_: Reflector,
}
impl DOMImplementation {
pub fn new_inherited(owner: @mut Window) -> DOMImplementation {
pub fn new_inherited(owner: JS<Window>) -> DOMImplementation {
DOMImplementation {
owner: owner,
reflector_: Reflector::new()
reflector_: Reflector::new(),
}
}
pub fn new(owner: @mut Window) -> @mut DOMImplementation {
reflect_dom_object(@mut DOMImplementation::new_inherited(owner), owner,
pub fn new(owner: &JS<Window>) -> JS<DOMImplementation> {
reflect_dom_object(~DOMImplementation::new_inherited(owner.clone()), owner.get(),
DOMImplementationBinding::Wrap)
}
}
@ -50,66 +52,63 @@ impl Reflectable for DOMImplementation {
// http://dom.spec.whatwg.org/#domimplementation
impl DOMImplementation {
// http://dom.spec.whatwg.org/#dom-domimplementation-createdocumenttype
pub fn CreateDocumentType(&self, qname: DOMString, pubid: DOMString, sysid: DOMString) -> Fallible<AbstractNode> {
pub fn CreateDocumentType(&self, qname: DOMString, pubid: DOMString, sysid: DOMString) -> Fallible<JS<DocumentType>> {
match xml_name_type(qname) {
// Step 1.
InvalidXMLName => Err(InvalidCharacter),
// Step 2.
Name => Err(NamespaceError),
// Step 3.
QName => Ok(DocumentType::new(qname, Some(pubid), Some(sysid), self.owner.Document()))
QName => Ok(DocumentType::new(qname, Some(pubid), Some(sysid), &self.owner.get().Document()))
}
}
// http://dom.spec.whatwg.org/#dom-domimplementation-createhtmldocument
pub fn CreateHTMLDocument(&self, title: Option<DOMString>) -> AbstractDocument {
pub fn CreateHTMLDocument(&self, title: Option<DOMString>) -> JS<Document> {
// Step 1-2.
let abstract_doc = HTMLDocument::new(self.owner, None);
assert!(abstract_doc.document().doctype == HTML);
let abstract_node = AbstractNode::from_document(abstract_doc);
assert!(abstract_node.type_id() == DocumentNodeTypeId(HTMLDocumentTypeId));
let doc = Document::new(&self.owner, None, HTMLDocument, None);
let mut doc_node: JS<Node> = NodeCast::from(&doc);
{
// Step 3.
let doc_type = DocumentType::new(~"html", None, None, abstract_doc);
abstract_node.AppendChild(doc_type);
let doc_type = DocumentType::new(~"html", None, None, &doc);
doc_node.AppendChild(&mut NodeCast::from(&doc_type));
}
{
// Step 4.
let doc_html = HTMLHtmlElement::new(~"html", abstract_doc);
abstract_node.AppendChild(doc_html);
let mut doc_html = NodeCast::from(&HTMLHtmlElement::new(~"html", &doc));
doc_node.AppendChild(&mut doc_html);
{
// Step 5.
let doc_head = HTMLHeadElement::new(~"head", abstract_doc);
doc_html.AppendChild(doc_head);
let mut doc_head = NodeCast::from(&HTMLHeadElement::new(~"head", &doc));
doc_html.AppendChild(&mut doc_head);
// Step 6.
match title {
None => (),
Some(title_str) => {
// Step 6.1.
let doc_title = HTMLTitleElement::new(~"title", abstract_doc);
doc_head.AppendChild(doc_title);
let mut doc_title = NodeCast::from(&HTMLTitleElement::new(~"title", &doc));
doc_head.AppendChild(&mut doc_title);
// Step 6.2.
let title_text = Text::new(title_str, abstract_doc);
doc_title.AppendChild(title_text);
let title_text = Text::new(title_str, &doc);
doc_title.AppendChild(&mut NodeCast::from(&title_text));
}
}
}
// Step 7.
let doc_body = HTMLBodyElement::new(~"body", abstract_doc);
doc_html.AppendChild(doc_body);
let doc_body = HTMLBodyElement::new(~"body", &doc);
doc_html.AppendChild(&mut NodeCast::from(&doc_body));
}
// Step 8.
// FIXME: https://github.com/mozilla/servo/issues/1522
// Step 9.
abstract_doc
doc
}
}

View file

@ -4,46 +4,47 @@
use dom::bindings::codegen::DOMParserBinding;
use dom::bindings::codegen::DOMParserBinding::SupportedTypeValues::{Text_html, Text_xml};
use dom::bindings::js::JS;
use dom::bindings::utils::{Reflector, Reflectable, reflect_dom_object};
use dom::bindings::utils::Fallible;
use dom::bindings::utils::FailureUnknown;
use dom::document::{AbstractDocument, Document};
use dom::htmldocument::HTMLDocument;
use dom::document::{Document, HTMLDocument};
use dom::window::Window;
use servo_util::str::DOMString;
#[deriving(Encodable)]
pub struct DOMParser {
owner: @mut Window, //XXXjdm Document instead?
owner: JS<Window>, //XXXjdm Document instead?
reflector_: Reflector
}
impl DOMParser {
pub fn new_inherited(owner: @mut Window) -> DOMParser {
pub fn new_inherited(owner: JS<Window>) -> DOMParser {
DOMParser {
owner: owner,
reflector_: Reflector::new()
}
}
pub fn new(owner: @mut Window) -> @mut DOMParser {
reflect_dom_object(@mut DOMParser::new_inherited(owner), owner,
pub fn new(owner: &JS<Window>) -> JS<DOMParser> {
reflect_dom_object(~DOMParser::new_inherited(owner.clone()), owner.get(),
DOMParserBinding::Wrap)
}
pub fn Constructor(owner: @mut Window) -> Fallible<@mut DOMParser> {
pub fn Constructor(owner: &JS<Window>) -> Fallible<JS<DOMParser>> {
Ok(DOMParser::new(owner))
}
pub fn ParseFromString(&self,
_s: DOMString,
ty: DOMParserBinding::SupportedType)
-> Fallible<AbstractDocument> {
-> Fallible<JS<Document>> {
match ty {
Text_html => {
Ok(HTMLDocument::new(self.owner, None))
Ok(Document::new(&self.owner, None, HTMLDocument, None))
}
Text_xml => {
Document::Constructor(self.owner)
Document::Constructor(&self.owner)
}
_ => {
Err(FailureUnknown)

View file

@ -6,15 +6,22 @@
use dom::attr::Attr;
use dom::attrlist::AttrList;
use dom::bindings::codegen::InheritTypes::{ElementDerived, HTMLImageElementCast};
use dom::bindings::codegen::InheritTypes::{HTMLIFrameElementCast, NodeCast};
use dom::bindings::codegen::InheritTypes::HTMLObjectElementCast;
use dom::bindings::js::JS;
use dom::bindings::utils::{Reflectable, Reflector};
use dom::bindings::utils::{ErrorResult, Fallible, NamespaceError, InvalidCharacter};
use dom::bindings::utils::{QName, Name, InvalidXMLName, xml_name_type};
use dom::htmlcollection::HTMLCollection;
use dom::clientrect::ClientRect;
use dom::clientrectlist::ClientRectList;
use dom::document::AbstractDocument;
use dom::node::{AbstractNode, ElementNodeTypeId, Node, NodeIterator};
use dom::document;
use dom::document::Document;
use dom::eventtarget::{EventTarget, NodeTargetTypeId};
use dom::htmlimageelement::HTMLImageElement;
use dom::htmliframeelement::HTMLIFrameElement;
use dom::htmlobjectelement::HTMLObjectElement;
use dom::node::{ElementNodeTypeId, Node, NodeHelpers, NodeIterator};
use dom::htmlserializer::serialize;
use layout_interface::{ContentBoxQuery, ContentBoxResponse, ContentBoxesQuery};
use layout_interface::{ContentBoxesResponse, ContentChangedDocumentDamage};
@ -26,15 +33,24 @@ use servo_util::str::{DOMString, null_str_as_empty_ref};
use std::ascii::StrAsciiExt;
use std::cast;
use std::unstable::raw::Box;
#[deriving(Encodable)]
pub struct Element {
node: Node,
tag_name: DOMString, // TODO: This should be an atom, not a DOMString.
namespace: Namespace,
attrs: ~[@mut Attr],
attrs: ~[JS<Attr>],
style_attribute: Option<style::PropertyDeclarationBlock>,
attr_list: Option<@mut AttrList>
attr_list: Option<JS<AttrList>>
}
impl ElementDerived for EventTarget {
fn is_element(&self) -> bool {
match self.type_id {
NodeTargetTypeId(ElementNodeTypeId(_)) => true,
_ => false
}
}
}
impl Reflectable for Element {
@ -47,7 +63,7 @@ impl Reflectable for Element {
}
}
#[deriving(Eq)]
#[deriving(Eq,Encodable)]
pub enum ElementTypeId {
HTMLElementTypeId,
HTMLAnchorElementTypeId,
@ -104,7 +120,6 @@ pub enum ElementTypeId {
HTMLStyleElementTypeId,
HTMLTableElementTypeId,
HTMLTableCaptionElementTypeId,
HTMLTableCellElementTypeId,
HTMLTableDataCellElementTypeId,
HTMLTableHeaderCellElementTypeId,
HTMLTableColElementTypeId,
@ -124,9 +139,8 @@ pub enum ElementTypeId {
// Element methods
//
impl Element {
pub fn new_inherited(type_id: ElementTypeId, tag_name: ~str, namespace: Namespace, document: AbstractDocument) -> Element {
pub fn new_inherited(type_id: ElementTypeId, tag_name: ~str, namespace: Namespace, document: JS<Document>) -> Element {
Element {
node: Node::new_inherited(ElementNodeTypeId(type_id), document),
tag_name: tag_name,
@ -138,41 +152,40 @@ impl Element {
}
pub fn html_element_in_html_document(&self) -> bool {
let owner = self.node.owner_doc();
self.namespace == namespace::HTML &&
// FIXME: check that this matches what the spec calls "is in an HTML document"
owner.document().doctype == document::HTML
self.node.owner_doc().get().is_html_document
}
pub fn get_attribute(&self,
namespace: Namespace,
name: &str) -> Option<@mut Attr> {
name: &str) -> Option<JS<Attr>> {
self.attrs.iter().find(|attr| {
let attr = attr.get();
name == attr.local_name && attr.namespace == namespace
}).map(|&x| x)
}).map(|x| x.clone())
}
#[inline]
pub unsafe fn get_attr_val_for_layout(&self, namespace: &Namespace, name: &str)
-> Option<&'static str> {
self.attrs.iter().find(|attr: & &@mut Attr| {
self.attrs.iter().find(|attr: & &JS<Attr>| {
// unsafely avoid a borrow because this is accessed by many tasks
// during parallel layout
let attr: ***Box<Attr> = cast::transmute(attr);
name == (***attr).data.local_name && (***attr).data.namespace == *namespace
let attr: ***Attr = cast::transmute(attr);
name == (***attr).local_name && (***attr).namespace == *namespace
}).map(|attr| {
let attr: **Box<Attr> = cast::transmute(attr);
cast::transmute((**attr).data.value.as_slice())
let attr: **Attr = cast::transmute(attr);
cast::transmute((**attr).value.as_slice())
})
}
pub fn set_attr(&mut self, abstract_self: AbstractNode, name: DOMString, value: DOMString)
pub fn set_attr(&mut self, abstract_self: &JS<Element>, name: DOMString, value: DOMString)
-> ErrorResult {
self.set_attribute(abstract_self, namespace::Null, name, value)
}
pub fn set_attribute(&mut self,
abstract_self: AbstractNode,
abstract_self: &JS<Element>,
namespace: Namespace,
name: DOMString,
value: DOMString) -> ErrorResult {
@ -192,7 +205,8 @@ impl Element {
// FIXME: reduce the time of `value.clone()`.
let mut old_raw_value: Option<DOMString> = None;
for attr in self.attrs.iter() {
for attr in self.attrs.mut_iter() {
let attr = attr.get_mut();
if attr.local_name == local_name {
old_raw_value = Some(attr.set_value(value.clone()));
break;
@ -200,8 +214,9 @@ impl Element {
}
if old_raw_value.is_none() {
let win = self.node.owner_doc().document().window;
let new_attr = Attr::new_ns(win, local_name.clone(), value.clone(),
let doc = self.node.owner_doc();
let doc = doc.get();
let new_attr = Attr::new_ns(doc.window.get(), local_name.clone(), value.clone(),
name.clone(), namespace.clone(),
prefix);
self.attrs.push(new_attr);
@ -214,7 +229,7 @@ impl Element {
}
fn after_set_attr(&mut self,
abstract_self: AbstractNode,
abstract_self: &JS<Element>,
local_name: DOMString,
value: DOMString,
old_value: Option<DOMString>) {
@ -222,36 +237,36 @@ impl Element {
match local_name.as_slice() {
"style" => {
let doc = self.node.owner_doc();
let base_url = doc.document().url.clone();
let base_url = doc.get().extra.url.clone();
self.style_attribute = Some(style::parse_style_attribute(value, &base_url))
}
"id" if abstract_self.is_in_doc() => {
// XXX: this dual declaration are workaround to avoid the compile error:
// "borrowed value does not live long enough"
let doc = self.node.owner_doc();
let doc = doc.mut_document();
doc.update_idmap(abstract_self, Some(value.clone()), old_value);
"id" => {
let self_node: JS<Node> = NodeCast::from(abstract_self);
if self_node.is_in_doc() {
// XXX: this dual declaration are workaround to avoid the compile error:
// "borrowed value does not live long enough"
let mut doc = self.node.owner_doc();
let doc = doc.get_mut();
doc.update_idmap(abstract_self, Some(value.clone()), old_value);
}
}
_ => ()
}
//XXXjdm We really need something like a vtable so we can call AfterSetAttr.
// This hardcoding is awful.
match abstract_self.type_id() {
match abstract_self.get().node.type_id {
ElementNodeTypeId(HTMLImageElementTypeId) => {
abstract_self.with_mut_image_element(|image| {
image.AfterSetAttr(local_name.clone(), value.clone());
});
let mut elem: JS<HTMLImageElement> = HTMLImageElementCast::to(abstract_self);
elem.get_mut().AfterSetAttr(local_name.clone(), value.clone());
}
ElementNodeTypeId(HTMLIframeElementTypeId) => {
abstract_self.with_mut_iframe_element(|iframe| {
iframe.AfterSetAttr(local_name.clone(), value.clone());
});
let mut elem: JS<HTMLIFrameElement> = HTMLIFrameElementCast::to(abstract_self);
elem.get_mut().AfterSetAttr(local_name.clone(), value.clone());
}
ElementNodeTypeId(HTMLObjectElementTypeId) => {
abstract_self.with_mut_object_element(|object| {
object.AfterSetAttr(local_name.clone(), value.clone());
});
let mut elem: JS<HTMLObjectElement> = HTMLObjectElementCast::to(abstract_self);
elem.get_mut().AfterSetAttr(local_name.clone(), value.clone());
}
_ => ()
}
@ -260,22 +275,22 @@ impl Element {
}
pub fn remove_attribute(&mut self,
abstract_self: AbstractNode,
abstract_self: &JS<Element>,
namespace: Namespace,
name: DOMString) -> ErrorResult {
let (_, local_name) = get_attribute_parts(name.clone());
self.node.wait_until_safe_to_modify_dom();
let idx = self.attrs.iter().position(|attr: &@mut Attr| -> bool {
attr.local_name == local_name
let idx = self.attrs.iter().position(|attr: &JS<Attr>| -> bool {
attr.get().local_name == local_name
});
match idx {
None => (),
Some(idx) => {
let removed = self.attrs.remove(idx);
let removed_raw_value = Some(removed.Value());
let removed_raw_value = Some(removed.get().Value());
if namespace == namespace::Null {
self.after_remove_attr(abstract_self, local_name, removed_raw_value);
@ -287,35 +302,36 @@ impl Element {
}
fn after_remove_attr(&mut self,
abstract_self: AbstractNode,
abstract_self: &JS<Element>,
local_name: DOMString,
old_value: Option<DOMString>) {
match local_name.as_slice() {
"style" => {
self.style_attribute = None
}
"id" if abstract_self.is_in_doc() => {
// XXX: this dual declaration are workaround to avoid the compile error:
// "borrowed value does not live long enough"
let doc = self.node.owner_doc();
let doc = doc.mut_document();
doc.update_idmap(abstract_self, None, old_value);
"id" => {
let self_node: JS<Node> = NodeCast::from(abstract_self);
if self_node.is_in_doc() {
// XXX: this dual declaration are workaround to avoid the compile error:
// "borrowed value does not live long enough"
let mut doc = self.node.owner_doc();
let doc = doc.get_mut();
doc.update_idmap(abstract_self, None, old_value);
}
}
_ => ()
}
//XXXjdm We really need something like a vtable so we can call AfterSetAttr.
// This hardcoding is awful.
match abstract_self.type_id() {
match abstract_self.get().node.type_id {
ElementNodeTypeId(HTMLImageElementTypeId) => {
abstract_self.with_mut_image_element(|image| {
image.AfterRemoveAttr(local_name.clone());
});
let mut elem: JS<HTMLImageElement> = HTMLImageElementCast::to(abstract_self);
elem.get_mut().AfterRemoveAttr(local_name.clone());
}
ElementNodeTypeId(HTMLIframeElementTypeId) => {
abstract_self.with_mut_iframe_element(|iframe| {
iframe.AfterRemoveAttr(local_name.clone());
});
let mut elem: JS<HTMLIFrameElement> = HTMLIFrameElementCast::to(abstract_self);
elem.get_mut().AfterRemoveAttr(local_name.clone());
}
_ => ()
}
@ -324,15 +340,16 @@ impl Element {
}
fn notify_attribute_changed(&self,
abstract_self: AbstractNode,
abstract_self: &JS<Element>,
local_name: DOMString) {
if abstract_self.is_in_doc() {
let node: JS<Node> = NodeCast::from(abstract_self);
if node.is_in_doc() {
let damage = match local_name.as_slice() {
"style" | "id" | "class" => MatchSelectorsDocumentDamage,
_ => ContentChangedDocumentDamage
};
let document = self.node.owner_doc();
document.document().damage_and_reflow(damage);
document.get().damage_and_reflow(damage);
}
}
@ -357,18 +374,18 @@ impl Element {
// XXX Resolve URL.
self.get_string_attribute(name)
}
pub fn set_url_attribute(&mut self, abstract_self: AbstractNode,
pub fn set_url_attribute(&mut self, abstract_self: &JS<Element>,
name: &str, value: DOMString) {
self.set_string_attribute(abstract_self, name, value);
}
pub fn get_string_attribute(&self, name: &str) -> DOMString {
match self.get_attribute(Null, name) {
Some(x) => x.Value(),
Some(x) => x.get().Value(),
None => ~""
}
}
pub fn set_string_attribute(&mut self, abstract_self: AbstractNode,
pub fn set_string_attribute(&mut self, abstract_self: &JS<Element>,
name: &str, value: DOMString) {
assert!(name == name.to_ascii_lower());
self.set_attribute(abstract_self, Null, name.to_owned(), value);
@ -382,25 +399,26 @@ impl Element {
}
// http://dom.spec.whatwg.org/#dom-element-id
pub fn Id(&self, _abstract_self: AbstractNode) -> DOMString {
pub fn Id(&self, _abstract_self: &JS<Element>) -> DOMString {
self.get_string_attribute("id")
}
// http://dom.spec.whatwg.org/#dom-element-id
pub fn SetId(&mut self, abstract_self: AbstractNode, id: DOMString) {
pub fn SetId(&mut self, abstract_self: &JS<Element>, id: DOMString) {
self.set_string_attribute(abstract_self, "id", id);
}
// http://dom.spec.whatwg.org/#dom-element-attributes
pub fn Attributes(&mut self, abstract_self: AbstractNode) -> @mut AttrList {
pub fn Attributes(&mut self, abstract_self: &JS<Element>) -> JS<AttrList> {
match self.attr_list {
None => {
let window = self.node.owner_doc().document().window;
let list = AttrList::new(window, abstract_self);
self.attr_list = Some(list);
let doc = self.node.owner_doc();
let doc = doc.get();
let list = AttrList::new(&doc.window, abstract_self);
self.attr_list = Some(list.clone());
list
}
Some(list) => list
Some(ref list) => list.clone()
}
}
@ -411,18 +429,18 @@ impl Element {
} else {
name
};
self.get_attribute(Null, name).map(|s| s.Value())
self.get_attribute(Null, name).map(|s| s.get().Value())
}
// http://dom.spec.whatwg.org/#dom-element-getattributens
pub fn GetAttributeNS(&self, namespace: Option<DOMString>, local_name: DOMString) -> Option<DOMString> {
let namespace = Namespace::from_str(null_str_as_empty_ref(&namespace));
self.get_attribute(namespace, local_name)
.map(|attr| attr.value.clone())
.map(|attr| attr.get().value.clone())
}
// http://dom.spec.whatwg.org/#dom-element-setattribute
pub fn SetAttribute(&mut self, abstract_self: AbstractNode, name: DOMString, value: DOMString)
pub fn SetAttribute(&mut self, abstract_self: &JS<Element>, name: DOMString, value: DOMString)
-> ErrorResult {
// FIXME: If name does not match the Name production in XML, throw an "InvalidCharacterError" exception.
let name = if self.html_element_in_html_document() {
@ -435,7 +453,7 @@ impl Element {
// http://dom.spec.whatwg.org/#dom-element-setattributens
pub fn SetAttributeNS(&mut self,
abstract_self: AbstractNode,
abstract_self: &JS<Element>,
namespace_url: Option<DOMString>,
name: DOMString,
value: DOMString) -> ErrorResult {
@ -452,7 +470,7 @@ impl Element {
// http://dom.spec.whatwg.org/#dom-element-removeattribute
pub fn RemoveAttribute(&mut self,
abstract_self: AbstractNode,
abstract_self: &JS<Element>,
name: DOMString) -> ErrorResult {
let name = if self.html_element_in_html_document() {
name.to_ascii_lower()
@ -464,7 +482,7 @@ impl Element {
// http://dom.spec.whatwg.org/#dom-element-removeattributens
pub fn RemoveAttributeNS(&mut self,
abstract_self: AbstractNode,
abstract_self: &JS<Element>,
namespace: Option<DOMString>,
localname: DOMString) -> ErrorResult {
let namespace = Namespace::from_str(null_str_as_empty_ref(&namespace));
@ -482,21 +500,24 @@ impl Element {
}
// http://dom.spec.whatwg.org/#dom-element-getelementsbytagname
pub fn GetElementsByTagName(&self, _localname: DOMString) -> @mut HTMLCollection {
pub fn GetElementsByTagName(&self, _localname: DOMString) -> JS<HTMLCollection> {
// FIXME: stub - https://github.com/mozilla/servo/issues/1660
HTMLCollection::new(self.node.owner_doc().document().window, ~[])
let doc = self.node.owner_doc();
HTMLCollection::new(&doc.get().window, ~[])
}
// http://dom.spec.whatwg.org/#dom-element-getelementsbytagnamens
pub fn GetElementsByTagNameNS(&self, _namespace: Option<DOMString>, _localname: DOMString) -> Fallible<@mut HTMLCollection> {
pub fn GetElementsByTagNameNS(&self, _namespace: Option<DOMString>, _localname: DOMString) -> Fallible<JS<HTMLCollection>> {
// FIXME: stub - https://github.com/mozilla/servo/issues/1660
Ok(HTMLCollection::new(self.node.owner_doc().document().window, ~[]))
let doc = self.node.owner_doc();
Ok(HTMLCollection::new(&doc.get().window, ~[]))
}
// http://dom.spec.whatwg.org/#dom-element-getelementsbyclassname
pub fn GetElementsByClassName(&self, _names: DOMString) -> @mut HTMLCollection {
pub fn GetElementsByClassName(&self, _names: DOMString) -> JS<HTMLCollection> {
// FIXME: stub - https://github.com/mozilla/servo/issues/1660
HTMLCollection::new(self.node.owner_doc().document().window, ~[])
let doc = self.node.owner_doc();
HTMLCollection::new(&doc.get().window, ~[])
}
// http://dom.spec.whatwg.org/#dom-element-matches
@ -517,13 +538,14 @@ impl Element {
pub fn MozRequestPointerLock(&self) {
}
pub fn GetClientRects(&self, abstract_self: AbstractNode) -> @mut ClientRectList {
let win = self.node.owner_doc().document().window;
let node = abstract_self;
assert!(node.is_element());
pub fn GetClientRects(&self, abstract_self: &JS<Element>) -> JS<ClientRectList> {
let doc = self.node.owner_doc();
let win = &doc.get().window;
let node: JS<Node> = NodeCast::from(abstract_self);
let (port, chan) = Chan::new();
let addr = node.to_trusted_node_address();
let rects =
match win.page.query_layout(ContentBoxesQuery(node, chan), port) {
match win.get().page.query_layout(ContentBoxesQuery(addr, chan), port) {
ContentBoxesResponse(rects) => {
rects.map(|r| {
ClientRect::new(
@ -539,12 +561,13 @@ impl Element {
ClientRectList::new(win, rects)
}
pub fn GetBoundingClientRect(&self, abstract_self: AbstractNode) -> @mut ClientRect {
let win = self.node.owner_doc().document().window;
let node = abstract_self;
assert!(node.is_element());
pub fn GetBoundingClientRect(&self, abstract_self: &JS<Element>) -> JS<ClientRect> {
let doc = self.node.owner_doc();
let win = &doc.get().window;
let node: JS<Node> = NodeCast::from(abstract_self);
let (port, chan) = Chan::new();
match win.page.query_layout(ContentBoxQuery(node, chan), port) {
let addr = node.to_trusted_node_address();
match win.get().page.query_layout(ContentBoxQuery(addr, chan), port) {
ContentBoxResponse(rect) => {
ClientRect::new(
win,
@ -597,20 +620,20 @@ impl Element {
0
}
pub fn GetInnerHTML(&self, abstract_self: AbstractNode) -> Fallible<DOMString> {
pub fn GetInnerHTML(&self, abstract_self: &JS<Element>) -> Fallible<DOMString> {
//XXX TODO: XML case
Ok(serialize(&mut NodeIterator::new(abstract_self, false, false)))
Ok(serialize(&mut NodeIterator::new(NodeCast::from(abstract_self), false, false)))
}
pub fn SetInnerHTML(&mut self, _abstract_self: AbstractNode, _value: DOMString) -> ErrorResult {
pub fn SetInnerHTML(&mut self, _abstract_self: &JS<Element>, _value: DOMString) -> ErrorResult {
Ok(())
}
pub fn GetOuterHTML(&self, abstract_self:AbstractNode) -> Fallible<DOMString> {
Ok(serialize(&mut NodeIterator::new(abstract_self, true, false)))
pub fn GetOuterHTML(&self, abstract_self: &JS<Element>) -> Fallible<DOMString> {
Ok(serialize(&mut NodeIterator::new(NodeCast::from(abstract_self), true, false)))
}
pub fn SetOuterHTML(&mut self, _abstract_self: AbstractNode, _value: DOMString) -> ErrorResult {
pub fn SetOuterHTML(&mut self, _abstract_self: &JS<Element>, _value: DOMString) -> ErrorResult {
Ok(())
}
@ -618,7 +641,7 @@ impl Element {
Ok(())
}
pub fn QuerySelector(&self, _selectors: DOMString) -> Fallible<Option<AbstractNode>> {
pub fn QuerySelector(&self, _selectors: DOMString) -> Fallible<Option<JS<Element>>> {
Ok(None)
}
}

View file

@ -2,20 +2,16 @@
* 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 dom::eventtarget::AbstractEventTarget;
use dom::window::Window;
use dom::bindings::codegen::EventBinding;
use dom::bindings::js::JS;
use dom::bindings::utils::{Reflectable, Reflector, reflect_dom_object};
use dom::bindings::utils::{Fallible, ErrorResult};
use dom::mouseevent::MouseEvent;
use dom::uievent::UIEvent;
use dom::eventtarget::EventTarget;
use dom::window::Window;
use servo_util::str::DOMString;
use geom::point::Point2D;
use std::cast;
use std::unstable::raw::Box;
pub enum Event_ {
ResizeEvent(uint, uint),
ReflowEvent,
@ -25,10 +21,7 @@ pub enum Event_ {
MouseMoveEvent(Point2D<f32>)
}
pub struct AbstractEvent {
event: *mut Box<Event>
}
#[deriving(Encodable)]
pub enum EventPhase {
Phase_None = 0,
Phase_Capturing,
@ -36,91 +29,7 @@ pub enum EventPhase {
Phase_Bubbling
}
impl AbstractEvent {
pub fn from_box(box_: *mut Box<Event>) -> AbstractEvent {
AbstractEvent {
event: box_
}
}
//
// Downcasting borrows
//
fn transmute<'a, T>(&'a self) -> &'a T {
unsafe {
let box_: *Box<T> = self.event as *Box<T>;
&(*box_).data
}
}
fn transmute_mut<'a, T>(&'a self) -> &'a mut T {
unsafe {
let box_: *mut Box<T> = self.event as *mut Box<T>;
&mut (*box_).data
}
}
pub fn type_id(&self) -> EventTypeId {
self.event().type_id
}
pub fn event<'a>(&'a self) -> &'a Event {
self.transmute()
}
pub fn mut_event<'a>(&'a self) -> &'a mut Event {
self.transmute_mut()
}
pub fn is_uievent(&self) -> bool {
self.type_id() == UIEventTypeId
}
pub fn uievent<'a>(&'a self) -> &'a UIEvent {
assert!(self.is_uievent());
self.transmute()
}
pub fn mut_uievent<'a>(&'a self) -> &'a mut UIEvent {
assert!(self.is_uievent());
self.transmute_mut()
}
pub fn is_mouseevent(&self) -> bool {
self.type_id() == MouseEventTypeId
}
pub fn mouseevent<'a>(&'a self) -> &'a MouseEvent {
assert!(self.is_mouseevent());
self.transmute()
}
pub fn mut_mouseevent<'a>(&'a self) -> &'a mut MouseEvent {
assert!(self.is_mouseevent());
self.transmute_mut()
}
pub fn propagation_stopped(&self) -> bool {
self.event().stop_propagation
}
pub fn bubbles(&self) -> bool {
self.event().bubbles
}
}
impl Reflectable for AbstractEvent {
fn reflector<'a>(&'a self) -> &'a Reflector {
self.event().reflector()
}
fn mut_reflector<'a>(&'a mut self) -> &'a mut Reflector {
self.mut_event().mut_reflector()
}
}
#[deriving(Eq)]
#[deriving(Eq, Encodable)]
pub enum EventTypeId {
HTMLEventTypeId,
UIEventTypeId,
@ -128,11 +37,12 @@ pub enum EventTypeId {
KeyEventTypeId
}
#[deriving(Encodable)]
pub struct Event {
type_id: EventTypeId,
reflector_: Reflector,
current_target: Option<AbstractEventTarget>,
target: Option<AbstractEventTarget>,
current_target: Option<JS<EventTarget>>,
target: Option<JS<EventTarget>>,
type_: DOMString,
phase: EventPhase,
default_prevented: bool,
@ -142,7 +52,7 @@ pub struct Event {
bubbles: bool,
trusted: bool,
dispatching: bool,
initialized: bool
initialized: bool,
}
impl Event {
@ -165,18 +75,10 @@ impl Event {
}
}
//FIXME: E should be bounded by some trait that is only implemented for Event types
pub fn as_abstract<E>(event: @mut E) -> AbstractEvent {
// This surrenders memory management of the event!
AbstractEvent {
event: unsafe { cast::transmute(event) },
}
}
pub fn new(window: @mut Window) -> AbstractEvent {
let ev = reflect_dom_object(@mut Event::new_inherited(HTMLEventTypeId),
window, EventBinding::Wrap);
Event::as_abstract(ev)
pub fn new(window: &JS<Window>) -> JS<Event> {
reflect_dom_object(~Event::new_inherited(HTMLEventTypeId),
window.get(),
EventBinding::Wrap)
}
pub fn EventPhase(&self) -> u16 {
@ -187,12 +89,12 @@ impl Event {
self.type_.clone()
}
pub fn GetTarget(&self) -> Option<AbstractEventTarget> {
self.target
pub fn GetTarget(&self) -> Option<JS<EventTarget>> {
self.target.clone()
}
pub fn GetCurrentTarget(&self) -> Option<AbstractEventTarget> {
self.current_target
pub fn GetCurrentTarget(&self) -> Option<JS<EventTarget>> {
self.current_target.clone()
}
pub fn DefaultPrevented(&self) -> bool {
@ -241,11 +143,11 @@ impl Event {
self.trusted
}
pub fn Constructor(global: @mut Window,
pub fn Constructor(global: &JS<Window>,
type_: DOMString,
init: &EventBinding::EventInit) -> Fallible<AbstractEvent> {
let ev = Event::new(global);
ev.mut_event().InitEvent(type_, init.bubbles, init.cancelable);
init: &EventBinding::EventInit) -> Fallible<JS<Event>> {
let mut ev = Event::new(global);
ev.get_mut().InitEvent(type_, init.bubbles, init.cancelable);
Ok(ev)
}
}

View file

@ -3,50 +3,57 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use dom::bindings::callback::eReportExceptions;
use dom::eventtarget::{AbstractEventTarget, Capturing, Bubbling};
use dom::event::{AbstractEvent, Phase_At_Target, Phase_None, Phase_Bubbling, Phase_Capturing};
use dom::node::AbstractNode;
use dom::bindings::codegen::InheritTypes::{EventTargetCast, NodeCast, NodeDerived};
use dom::bindings::js::JS;
use dom::eventtarget::{Capturing, Bubbling, EventTarget};
use dom::event::{Event, Phase_At_Target, Phase_None, Phase_Bubbling, Phase_Capturing};
use dom::node::{Node, NodeHelpers};
// See http://dom.spec.whatwg.org/#concept-event-dispatch for the full dispatch algorithm
pub fn dispatch_event(target: AbstractEventTarget,
pseudo_target: Option<AbstractEventTarget>,
event: AbstractEvent) -> bool {
assert!(!event.event().dispatching);
pub fn dispatch_event(target: &JS<EventTarget>,
pseudo_target: Option<JS<EventTarget>>,
event: &mut JS<Event>) -> bool {
assert!(!event.get().dispatching);
{
let event = event.mut_event();
event.target = Some(pseudo_target.unwrap_or(target));
let event = event.get_mut();
event.target = match pseudo_target {
Some(pseudo_target) => Some(pseudo_target),
None => Some(target.clone())
};
event.dispatching = true;
}
let type_ = event.event().type_.clone();
let type_ = event.get().type_.clone();
let mut chain = ~[];
//TODO: no chain if not participating in a tree
if target.is_node() {
for ancestor in AbstractNode::from_eventtarget(target).ancestors() {
chain.push(AbstractEventTarget::from_node(ancestor));
if target.get().is_node() {
let target_node: JS<Node> = NodeCast::to(target);
for ancestor in target_node.ancestors() {
let ancestor_target: JS<EventTarget> = EventTargetCast::from(&ancestor);
chain.push(ancestor_target);
}
}
event.mut_event().phase = Phase_Capturing;
event.get_mut().phase = Phase_Capturing;
//FIXME: The "callback this value" should be currentTarget
/* capturing */
for &cur_target in chain.rev_iter() {
let stopped = match cur_target.eventtarget().get_listeners_for(type_, Capturing) {
for cur_target in chain.rev_iter() {
let stopped = match cur_target.get().get_listeners_for(type_, Capturing) {
Some(listeners) => {
event.mut_event().current_target = Some(cur_target);
event.get_mut().current_target = Some(cur_target.clone());
for listener in listeners.iter() {
listener.HandleEvent__(event, eReportExceptions);
if event.event().stop_immediate {
if event.get().stop_immediate {
break;
}
}
event.propagation_stopped()
event.get().stop_propagation
}
None => false
};
@ -57,18 +64,18 @@ pub fn dispatch_event(target: AbstractEventTarget,
}
/* at target */
if !event.propagation_stopped() {
if !event.get().stop_propagation {
{
let event = event.mut_event();
let event = event.get_mut();
event.phase = Phase_At_Target;
event.current_target = Some(target);
event.current_target = Some(target.clone());
}
let opt_listeners = target.eventtarget().get_listeners(type_);
let opt_listeners = target.get().get_listeners(type_);
for listeners in opt_listeners.iter() {
for listener in listeners.iter() {
listener.HandleEvent__(event, eReportExceptions);
if event.event().stop_immediate {
if event.get().stop_immediate {
break;
}
}
@ -76,22 +83,22 @@ pub fn dispatch_event(target: AbstractEventTarget,
}
/* bubbling */
if event.bubbles() && !event.propagation_stopped() {
event.mut_event().phase = Phase_Bubbling;
if event.get().bubbles && !event.get().stop_propagation {
event.get_mut().phase = Phase_Bubbling;
for &cur_target in chain.iter() {
let stopped = match cur_target.eventtarget().get_listeners_for(type_, Bubbling) {
for cur_target in chain.iter() {
let stopped = match cur_target.get().get_listeners_for(type_, Bubbling) {
Some(listeners) => {
event.mut_event().current_target = Some(cur_target);
event.get_mut().current_target = Some(cur_target.clone());
for listener in listeners.iter() {
listener.HandleEvent__(event, eReportExceptions);
if event.event().stop_immediate {
if event.get().stop_immediate {
break;
}
}
event.propagation_stopped()
event.get().stop_propagation
}
None => false
};
@ -101,7 +108,7 @@ pub fn dispatch_event(target: AbstractEventTarget,
}
}
let event = event.mut_event();
let event = event.get_mut();
event.dispatching = false;
event.phase = Phase_None;
event.current_target = None;

View file

@ -2,122 +2,42 @@
* 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 dom::bindings::js::JS;
use dom::bindings::utils::{Reflectable, Reflector};
use dom::bindings::utils::{Fallible, InvalidState};
use dom::bindings::codegen::EventListenerBinding::EventListener;
use dom::document::AbstractDocument;
use dom::event::AbstractEvent;
use dom::event::Event;
use dom::eventdispatcher::dispatch_event;
use dom::node::AbstractNode;
use dom::window::Window;
use dom::node::NodeTypeId;
use servo_util::str::DOMString;
use std::cast;
use std::hashmap::HashMap;
use std::unstable::raw::Box;
#[deriving(Eq)]
#[deriving(Eq,Encodable)]
pub enum ListenerPhase {
Capturing,
Bubbling,
}
#[deriving(Eq)]
#[deriving(Eq,Encodable)]
pub enum EventTargetTypeId {
WindowTypeId,
NodeTypeId
NodeTargetTypeId(NodeTypeId)
}
#[deriving(Eq)]
#[deriving(Eq,Encodable)]
struct EventListenerEntry {
phase: ListenerPhase,
listener: EventListener
}
#[deriving(Encodable)]
pub struct EventTarget {
type_id: EventTargetTypeId,
reflector_: Reflector,
handlers: HashMap<DOMString, ~[EventListenerEntry]>,
}
pub struct AbstractEventTarget {
eventtarget: *mut Box<EventTarget>
}
impl AbstractEventTarget {
pub fn from_box<T>(box_: *mut Box<T>) -> AbstractEventTarget {
AbstractEventTarget {
eventtarget: box_ as *mut Box<EventTarget>
}
}
pub fn from_node(node: AbstractNode) -> AbstractEventTarget {
unsafe {
cast::transmute(node)
}
}
pub fn from_window(window: @mut Window) -> AbstractEventTarget {
AbstractEventTarget {
eventtarget: unsafe { cast::transmute(window) }
}
}
pub fn from_document(document: AbstractDocument) -> AbstractEventTarget {
unsafe {
cast::transmute(document)
}
}
pub fn type_id(&self) -> EventTargetTypeId {
self.eventtarget().type_id
}
pub fn is_window(&self) -> bool {
self.type_id() == WindowTypeId
}
pub fn is_node(&self) -> bool {
self.type_id() == NodeTypeId
}
//
// Downcasting borrows
//
fn transmute<'a, T>(&'a self) -> &'a T {
unsafe {
let box_: *Box<T> = self.eventtarget as *Box<T>;
&(*box_).data
}
}
fn transmute_mut<'a, T>(&'a mut self) -> &'a mut T {
unsafe {
let box_: *mut Box<T> = self.eventtarget as *mut Box<T>;
&mut (*box_).data
}
}
pub fn eventtarget<'a>(&'a self) -> &'a EventTarget {
self.transmute()
}
pub fn mut_eventtarget<'a>(&'a mut self) -> &'a mut EventTarget {
self.transmute_mut()
}
}
impl Reflectable for AbstractEventTarget {
fn reflector<'a>(&'a self) -> &'a Reflector {
self.eventtarget().reflector()
}
fn mut_reflector<'a>(&'a mut self) -> &'a mut Reflector {
self.mut_eventtarget().mut_reflector()
}
}
impl EventTarget {
pub fn new_inherited(type_id: EventTargetTypeId) -> EventTarget {
EventTarget {
@ -178,15 +98,16 @@ impl EventTarget {
}
}
pub fn DispatchEvent(&self, abstract_self: AbstractEventTarget, event: AbstractEvent) -> Fallible<bool> {
pub fn DispatchEvent(&self, abstract_self: &JS<EventTarget>,
event: &mut JS<Event>) -> Fallible<bool> {
self.dispatch_event_with_target(abstract_self, None, event)
}
pub fn dispatch_event_with_target(&self,
abstract_self: AbstractEventTarget,
abstract_target: Option<AbstractEventTarget>,
event: AbstractEvent) -> Fallible<bool> {
if event.event().dispatching || !event.event().initialized {
abstract_self: &JS<EventTarget>,
abstract_target: Option<JS<EventTarget>>,
event: &mut JS<Event>) -> Fallible<bool> {
if event.get().dispatching || !event.get().initialized {
return Err(InvalidState);
}
Ok(dispatch_event(abstract_self, abstract_target, event))

View file

@ -4,27 +4,30 @@
use dom::bindings::utils::{Fallible, Reflectable, Reflector, reflect_dom_object};
use dom::bindings::codegen::FormDataBinding;
use dom::bindings::js::JS;
use dom::blob::Blob;
use dom::node::AbstractNode;
use dom::htmlformelement::HTMLFormElement;
use dom::window::Window;
use servo_util::str::DOMString;
use std::hashmap::HashMap;
#[deriving(Encodable)]
enum FormDatum {
StringData(DOMString),
BlobData { blob: @mut Blob, name: DOMString }
BlobData { blob: JS<Blob>, name: DOMString }
}
#[deriving(Encodable)]
pub struct FormData {
data: HashMap<DOMString, FormDatum>,
reflector_: Reflector,
window: @mut Window,
form: Option<AbstractNode>
window: JS<Window>,
form: Option<JS<HTMLFormElement>>
}
impl FormData {
pub fn new_inherited(form: Option<AbstractNode>, window: @mut Window) -> FormData {
pub fn new_inherited(form: Option<JS<HTMLFormElement>>, window: JS<Window>) -> FormData {
FormData {
data: HashMap::new(),
reflector_: Reflector::new(),
@ -33,18 +36,18 @@ impl FormData {
}
}
pub fn new(form: Option<AbstractNode>, window: @mut Window) -> @mut FormData {
reflect_dom_object(@mut FormData::new_inherited(form, window), window, FormDataBinding::Wrap)
pub fn new(form: Option<JS<HTMLFormElement>>, window: &JS<Window>) -> JS<FormData> {
reflect_dom_object(~FormData::new_inherited(form, window.clone()), window.get(), FormDataBinding::Wrap)
}
pub fn Constructor(window: @mut Window, form: Option<AbstractNode>)
-> Fallible<@mut FormData> {
pub fn Constructor(window: &JS<Window>, form: Option<JS<HTMLFormElement>>)
-> Fallible<JS<FormData>> {
Ok(FormData::new(form, window))
}
pub fn Append(&mut self, name: DOMString, value: @mut Blob, filename: Option<DOMString>) {
pub fn Append(&mut self, name: DOMString, value: &JS<Blob>, filename: Option<DOMString>) {
let blob = BlobData {
blob: value,
blob: value.clone(),
name: filename.unwrap_or(~"default")
};
self.data.insert(name.clone(), blob);

View file

@ -3,27 +3,40 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use dom::bindings::codegen::HTMLAnchorElementBinding;
use dom::bindings::codegen::InheritTypes::HTMLAnchorElementDerived;
use dom::bindings::js::JS;
use dom::bindings::utils::ErrorResult;
use dom::document::AbstractDocument;
use dom::document::Document;
use dom::element::HTMLAnchorElementTypeId;
use dom::eventtarget::{EventTarget, NodeTargetTypeId};
use dom::htmlelement::HTMLElement;
use dom::node::{AbstractNode, Node};
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
pub struct HTMLAnchorElement {
htmlelement: HTMLElement
}
impl HTMLAnchorElementDerived for EventTarget {
fn is_htmlanchorelement(&self) -> bool {
match self.type_id {
NodeTargetTypeId(ElementNodeTypeId(HTMLAnchorElementTypeId)) => true,
_ => false
}
}
}
impl HTMLAnchorElement {
pub fn new_inherited(localName: DOMString, document: AbstractDocument) -> HTMLAnchorElement {
pub fn new_inherited(localName: DOMString, document: JS<Document>) -> HTMLAnchorElement {
HTMLAnchorElement {
htmlelement: HTMLElement::new_inherited(HTMLAnchorElementTypeId, localName, document)
}
}
pub fn new(localName: DOMString, document: AbstractDocument) -> AbstractNode {
let element = HTMLAnchorElement::new_inherited(localName, document);
Node::reflect_node(@mut element, document, HTMLAnchorElementBinding::Wrap)
pub fn new(localName: DOMString, document: &JS<Document>) -> JS<HTMLAnchorElement> {
let element = HTMLAnchorElement::new_inherited(localName, document.clone());
Node::reflect_node(~element, document, HTMLAnchorElementBinding::Wrap)
}
}

View file

@ -3,27 +3,40 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use dom::bindings::codegen::HTMLAppletElementBinding;
use dom::bindings::codegen::InheritTypes::HTMLAppletElementDerived;
use dom::bindings::js::JS;
use dom::bindings::utils::ErrorResult;
use dom::document::AbstractDocument;
use dom::document::Document;
use dom::element::HTMLAppletElementTypeId;
use dom::eventtarget::{EventTarget, NodeTargetTypeId};
use dom::htmlelement::HTMLElement;
use dom::node::{AbstractNode, Node};
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
pub struct HTMLAppletElement {
htmlelement: HTMLElement
}
impl HTMLAppletElementDerived for EventTarget {
fn is_htmlappletelement(&self) -> bool {
match self.type_id {
NodeTargetTypeId(ElementNodeTypeId(HTMLAppletElementTypeId)) => true,
_ => false
}
}
}
impl HTMLAppletElement {
pub fn new_inherited(localName: DOMString, document: AbstractDocument) -> HTMLAppletElement {
pub fn new_inherited(localName: DOMString, document: JS<Document>) -> HTMLAppletElement {
HTMLAppletElement {
htmlelement: HTMLElement::new_inherited(HTMLAppletElementTypeId, localName, document)
}
}
pub fn new(localName: DOMString, document: AbstractDocument) -> AbstractNode {
let element = HTMLAppletElement::new_inherited(localName, document);
Node::reflect_node(@mut element, document, HTMLAppletElementBinding::Wrap)
pub fn new(localName: DOMString, document: &JS<Document>) -> JS<HTMLAppletElement> {
let element = HTMLAppletElement::new_inherited(localName, document.clone());
Node::reflect_node(~element, document, HTMLAppletElementBinding::Wrap)
}
}

View file

@ -3,27 +3,40 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use dom::bindings::codegen::HTMLAreaElementBinding;
use dom::bindings::codegen::InheritTypes::HTMLAreaElementDerived;
use dom::bindings::js::JS;
use dom::bindings::utils::ErrorResult;
use dom::document::AbstractDocument;
use dom::document::Document;
use dom::element::HTMLAreaElementTypeId;
use dom::eventtarget::{EventTarget, NodeTargetTypeId};
use dom::htmlelement::HTMLElement;
use dom::node::{AbstractNode, Node};
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
pub struct HTMLAreaElement {
htmlelement: HTMLElement
}
impl HTMLAreaElementDerived for EventTarget {
fn is_htmlareaelement(&self) -> bool {
match self.type_id {
NodeTargetTypeId(ElementNodeTypeId(HTMLAreaElementTypeId)) => true,
_ => false
}
}
}
impl HTMLAreaElement {
pub fn new_inherited(localName: DOMString, document: AbstractDocument) -> HTMLAreaElement {
pub fn new_inherited(localName: DOMString, document: JS<Document>) -> HTMLAreaElement {
HTMLAreaElement {
htmlelement: HTMLElement::new_inherited(HTMLAreaElementTypeId, localName, document)
}
}
pub fn new(localName: DOMString, document: AbstractDocument) -> AbstractNode {
let element = HTMLAreaElement::new_inherited(localName, document);
Node::reflect_node(@mut element, document, HTMLAreaElementBinding::Wrap)
pub fn new(localName: DOMString, document: &JS<Document>) -> JS<HTMLAreaElement> {
let element = HTMLAreaElement::new_inherited(localName, document.clone());
Node::reflect_node(~element, document, HTMLAreaElementBinding::Wrap)
}
}

View file

@ -3,25 +3,38 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use dom::bindings::codegen::HTMLAudioElementBinding;
use dom::document::AbstractDocument;
use dom::bindings::codegen::InheritTypes::HTMLAudioElementDerived;
use dom::bindings::js::JS;
use dom::document::Document;
use dom::element::HTMLAudioElementTypeId;
use dom::eventtarget::{EventTarget, NodeTargetTypeId};
use dom::htmlmediaelement::HTMLMediaElement;
use dom::node::{AbstractNode, Node};
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
pub struct HTMLAudioElement {
htmlmediaelement: HTMLMediaElement
}
impl HTMLAudioElementDerived for EventTarget {
fn is_htmlaudioelement(&self) -> bool {
match self.type_id {
NodeTargetTypeId(ElementNodeTypeId(HTMLAudioElementTypeId)) => true,
_ => false
}
}
}
impl HTMLAudioElement {
pub fn new_inherited(localName: DOMString, document: AbstractDocument) -> HTMLAudioElement {
pub fn new_inherited(localName: DOMString, document: JS<Document>) -> HTMLAudioElement {
HTMLAudioElement {
htmlmediaelement: HTMLMediaElement::new_inherited(HTMLAudioElementTypeId, localName, document)
}
}
pub fn new(localName: DOMString, document: AbstractDocument) -> AbstractNode {
let element = HTMLAudioElement::new_inherited(localName, document);
Node::reflect_node(@mut element, document, HTMLAudioElementBinding::Wrap)
pub fn new(localName: DOMString, document: &JS<Document>) -> JS<HTMLAudioElement> {
let element = HTMLAudioElement::new_inherited(localName, document.clone());
Node::reflect_node(~element, document, HTMLAudioElementBinding::Wrap)
}
}

View file

@ -3,27 +3,40 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use dom::bindings::codegen::HTMLBaseElementBinding;
use dom::bindings::codegen::InheritTypes::HTMLBaseElementDerived;
use dom::bindings::utils::ErrorResult;
use dom::document::AbstractDocument;
use dom::bindings::js::JS;
use dom::document::Document;
use dom::element::HTMLBaseElementTypeId;
use dom::eventtarget::{EventTarget, NodeTargetTypeId};
use dom::htmlelement::HTMLElement;
use dom::node::{AbstractNode, Node};
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
pub struct HTMLBaseElement {
htmlelement: HTMLElement
}
impl HTMLBaseElementDerived for EventTarget {
fn is_htmlbaseelement(&self) -> bool {
match self.type_id {
NodeTargetTypeId(ElementNodeTypeId(HTMLBaseElementTypeId)) => true,
_ => false
}
}
}
impl HTMLBaseElement {
pub fn new_inherited(localName: DOMString, document: AbstractDocument) -> HTMLBaseElement {
pub fn new_inherited(localName: DOMString, document: JS<Document>) -> HTMLBaseElement {
HTMLBaseElement {
htmlelement: HTMLElement::new_inherited(HTMLBaseElementTypeId, localName, document)
}
}
pub fn new(localName: DOMString, document: AbstractDocument) -> AbstractNode {
let element = HTMLBaseElement::new_inherited(localName, document);
Node::reflect_node(@mut element, document, HTMLBaseElementBinding::Wrap)
pub fn new(localName: DOMString, document: &JS<Document>) -> JS<HTMLBaseElement> {
let element = HTMLBaseElement::new_inherited(localName, document.clone());
Node::reflect_node(~element, document, HTMLBaseElementBinding::Wrap)
}
}

View file

@ -3,27 +3,40 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use dom::bindings::codegen::HTMLBodyElementBinding;
use dom::bindings::codegen::InheritTypes::HTMLBodyElementDerived;
use dom::bindings::utils::ErrorResult;
use dom::document::AbstractDocument;
use dom::bindings::js::JS;
use dom::document::Document;
use dom::element::HTMLBodyElementTypeId;
use dom::eventtarget::{EventTarget, NodeTargetTypeId};
use dom::htmlelement::HTMLElement;
use dom::node::{AbstractNode, Node};
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
pub struct HTMLBodyElement {
htmlelement: HTMLElement
}
impl HTMLBodyElementDerived for EventTarget {
fn is_htmlbodyelement(&self) -> bool {
match self.type_id {
NodeTargetTypeId(ElementNodeTypeId(HTMLBodyElementTypeId)) => true,
_ => false
}
}
}
impl HTMLBodyElement {
pub fn new_inherited(localName: DOMString, document: AbstractDocument) -> HTMLBodyElement {
pub fn new_inherited(localName: DOMString, document: JS<Document>) -> HTMLBodyElement {
HTMLBodyElement {
htmlelement: HTMLElement::new_inherited(HTMLBodyElementTypeId, localName, document)
}
}
pub fn new(localName: DOMString, document: AbstractDocument) -> AbstractNode {
let element = HTMLBodyElement::new_inherited(localName, document);
Node::reflect_node(@mut element, document, HTMLBodyElementBinding::Wrap)
pub fn new(localName: DOMString, document: &JS<Document>) -> JS<HTMLBodyElement> {
let element = HTMLBodyElement::new_inherited(localName, document.clone());
Node::reflect_node(~element, document, HTMLBodyElementBinding::Wrap)
}
}

View file

@ -3,27 +3,40 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use dom::bindings::codegen::HTMLBRElementBinding;
use dom::bindings::codegen::InheritTypes::HTMLBRElementDerived;
use dom::bindings::utils::ErrorResult;
use dom::document::AbstractDocument;
use dom::bindings::js::JS;
use dom::document::Document;
use dom::element::HTMLBRElementTypeId;
use dom::eventtarget::{EventTarget, NodeTargetTypeId};
use dom::htmlelement::HTMLElement;
use dom::node::{AbstractNode, Node};
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
pub struct HTMLBRElement {
htmlelement: HTMLElement,
}
impl HTMLBRElementDerived for EventTarget {
fn is_htmlbrelement(&self) -> bool {
match self.type_id {
NodeTargetTypeId(ElementNodeTypeId(HTMLBRElementTypeId)) => true,
_ => false
}
}
}
impl HTMLBRElement {
pub fn new_inherited(localName: DOMString, document: AbstractDocument) -> HTMLBRElement {
pub fn new_inherited(localName: DOMString, document: JS<Document>) -> HTMLBRElement {
HTMLBRElement {
htmlelement: HTMLElement::new_inherited(HTMLBRElementTypeId, localName, document)
}
}
pub fn new(localName: DOMString, document: AbstractDocument) -> AbstractNode {
let element = HTMLBRElement::new_inherited(localName, document);
Node::reflect_node(@mut element, document, HTMLBRElementBinding::Wrap)
pub fn new(localName: DOMString, document: &JS<Document>) -> JS<HTMLBRElement> {
let element = HTMLBRElement::new_inherited(localName, document.clone());
Node::reflect_node(~element, document, HTMLBRElementBinding::Wrap)
}
}

View file

@ -3,28 +3,42 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use dom::bindings::codegen::HTMLButtonElementBinding;
use dom::bindings::codegen::InheritTypes::HTMLButtonElementDerived;
use dom::bindings::js::JS;
use dom::bindings::utils::ErrorResult;
use dom::document::AbstractDocument;
use dom::document::Document;
use dom::element::HTMLButtonElementTypeId;
use dom::eventtarget::{EventTarget, NodeTargetTypeId};
use dom::htmlelement::HTMLElement;
use dom::node::{AbstractNode, Node};
use dom::htmlformelement::HTMLFormElement;
use dom::node::{Node, ElementNodeTypeId};
use dom::validitystate::ValidityState;
use servo_util::str::DOMString;
#[deriving(Encodable)]
pub struct HTMLButtonElement {
htmlelement: HTMLElement
}
impl HTMLButtonElementDerived for EventTarget {
fn is_htmlbuttonelement(&self) -> bool {
match self.type_id {
NodeTargetTypeId(ElementNodeTypeId(HTMLButtonElementTypeId)) => true,
_ => false
}
}
}
impl HTMLButtonElement {
pub fn new_inherited(localName: DOMString, document: AbstractDocument) -> HTMLButtonElement {
pub fn new_inherited(localName: DOMString, document: JS<Document>) -> HTMLButtonElement {
HTMLButtonElement {
htmlelement: HTMLElement::new_inherited(HTMLButtonElementTypeId, localName, document)
}
}
pub fn new(localName: DOMString, document: AbstractDocument) -> AbstractNode {
let element = HTMLButtonElement::new_inherited(localName, document);
Node::reflect_node(@mut element, document, HTMLButtonElementBinding::Wrap)
pub fn new(localName: DOMString, document: &JS<Document>) -> JS<HTMLButtonElement> {
let element = HTMLButtonElement::new_inherited(localName, document.clone());
Node::reflect_node(~element, document, HTMLButtonElementBinding::Wrap)
}
}
@ -45,7 +59,7 @@ impl HTMLButtonElement {
Ok(())
}
pub fn GetForm(&self) -> Option<AbstractNode> {
pub fn GetForm(&self) -> Option<JS<HTMLFormElement>> {
None
}
@ -120,12 +134,13 @@ impl HTMLButtonElement {
pub fn SetWillValidate(&mut self, _will_validate: bool) {
}
pub fn Validity(&self) -> @mut ValidityState {
let global = self.htmlelement.element.node.owner_doc().document().window;
ValidityState::new(global)
pub fn Validity(&self) -> JS<ValidityState> {
let doc = self.htmlelement.element.node.owner_doc();
let doc = doc.get();
ValidityState::new(&doc.window)
}
pub fn SetValidity(&mut self, _validity: @mut ValidityState) {
pub fn SetValidity(&mut self, _validity: JS<ValidityState>) {
}
pub fn ValidationMessage(&self) -> DOMString {

View file

@ -3,27 +3,40 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use dom::bindings::codegen::HTMLCanvasElementBinding;
use dom::bindings::codegen::InheritTypes::HTMLCanvasElementDerived;
use dom::bindings::js::JS;
use dom::bindings::utils::{ErrorResult};
use dom::document::AbstractDocument;
use dom::document::Document;
use dom::element::HTMLCanvasElementTypeId;
use dom::eventtarget::{EventTarget, NodeTargetTypeId};
use dom::htmlelement::HTMLElement;
use dom::node::{AbstractNode, Node};
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
pub struct HTMLCanvasElement {
htmlelement: HTMLElement,
}
impl HTMLCanvasElementDerived for EventTarget {
fn is_htmlcanvaselement(&self) -> bool {
match self.type_id {
NodeTargetTypeId(ElementNodeTypeId(HTMLCanvasElementTypeId)) => true,
_ => false
}
}
}
impl HTMLCanvasElement {
pub fn new_inherited(localName: DOMString, document: AbstractDocument) -> HTMLCanvasElement {
pub fn new_inherited(localName: DOMString, document: JS<Document>) -> HTMLCanvasElement {
HTMLCanvasElement {
htmlelement: HTMLElement::new_inherited(HTMLCanvasElementTypeId, localName, document)
}
}
pub fn new(localName: DOMString, document: AbstractDocument) -> AbstractNode {
let element = HTMLCanvasElement::new_inherited(localName, document);
Node::reflect_node(@mut element, document, HTMLCanvasElementBinding::Wrap)
pub fn new(localName: DOMString, document: &JS<Document>) -> JS<HTMLCanvasElement> {
let element = HTMLCanvasElement::new_inherited(localName, document.clone());
Node::reflect_node(~element, document, HTMLCanvasElementBinding::Wrap)
}
}

View file

@ -3,9 +3,10 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use dom::bindings::codegen::HTMLCollectionBinding;
use dom::bindings::js::JS;
use dom::bindings::utils::{Reflectable, Reflector, reflect_dom_object};
use dom::bindings::utils::Fallible;
use dom::node::AbstractNode;
use dom::element::Element;
use dom::window::Window;
use servo_util::str::DOMString;
@ -13,14 +14,15 @@ use js::jsapi::{JSObject, JSContext};
use std::ptr;
#[deriving(Encodable)]
pub struct HTMLCollection {
elements: ~[AbstractNode],
elements: ~[JS<Element>],
reflector_: Reflector,
window: @mut Window,
window: JS<Window>,
}
impl HTMLCollection {
pub fn new_inherited(window: @mut Window, elements: ~[AbstractNode]) -> HTMLCollection {
pub fn new_inherited(window: JS<Window>, elements: ~[JS<Element>]) -> HTMLCollection {
HTMLCollection {
elements: elements,
reflector_: Reflector::new(),
@ -28,18 +30,18 @@ impl HTMLCollection {
}
}
pub fn new(window: @mut Window, elements: ~[AbstractNode]) -> @mut HTMLCollection {
reflect_dom_object(@mut HTMLCollection::new_inherited(window, elements),
window, HTMLCollectionBinding::Wrap)
pub fn new(window: &JS<Window>, elements: ~[JS<Element>]) -> JS<HTMLCollection> {
reflect_dom_object(~HTMLCollection::new_inherited(window.clone(), elements),
window.get(), HTMLCollectionBinding::Wrap)
}
pub fn Length(&self) -> u32 {
self.elements.len() as u32
}
pub fn Item(&self, index: u32) -> Option<AbstractNode> {
pub fn Item(&self, index: u32) -> Option<JS<Element>> {
if index < self.Length() {
Some(self.elements[index])
Some(self.elements[index].clone())
} else {
None
}
@ -49,7 +51,7 @@ impl HTMLCollection {
Ok(ptr::null())
}
pub fn IndexedGetter(&self, index: u32, found: &mut bool) -> Option<AbstractNode> {
pub fn IndexedGetter(&self, index: u32, found: &mut bool) -> Option<JS<Element>> {
*found = true;
self.Item(index)
}

View file

@ -3,27 +3,40 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use dom::bindings::codegen::HTMLDataElementBinding;
use dom::bindings::codegen::InheritTypes::HTMLDataElementDerived;
use dom::bindings::js::JS;
use dom::bindings::utils::ErrorResult;
use dom::document::AbstractDocument;
use dom::document::Document;
use dom::element::HTMLDataElementTypeId;
use dom::eventtarget::{EventTarget, NodeTargetTypeId};
use dom::htmlelement::HTMLElement;
use dom::node::{AbstractNode, Node};
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
pub struct HTMLDataElement {
htmlelement: HTMLElement
}
impl HTMLDataElementDerived for EventTarget {
fn is_htmldataelement(&self) -> bool {
match self.type_id {
NodeTargetTypeId(ElementNodeTypeId(HTMLDataElementTypeId)) => true,
_ => false
}
}
}
impl HTMLDataElement {
pub fn new_inherited(localName: DOMString, document: AbstractDocument) -> HTMLDataElement {
pub fn new_inherited(localName: DOMString, document: JS<Document>) -> HTMLDataElement {
HTMLDataElement {
htmlelement: HTMLElement::new_inherited(HTMLDataElementTypeId, localName, document)
}
}
pub fn new(localName: DOMString, document: AbstractDocument) -> AbstractNode {
let element = HTMLDataElement::new_inherited(localName, document);
Node::reflect_node(@mut element, document, HTMLDataElementBinding::Wrap)
pub fn new(localName: DOMString, document: &JS<Document>) -> JS<HTMLDataElement> {
let element = HTMLDataElement::new_inherited(localName, document.clone());
Node::reflect_node(~element, document, HTMLDataElementBinding::Wrap)
}
}

View file

@ -3,33 +3,47 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use dom::bindings::codegen::HTMLDataListElementBinding;
use dom::document::AbstractDocument;
use dom::bindings::codegen::InheritTypes::HTMLDataListElementDerived;
use dom::bindings::js::JS;
use dom::document::Document;
use dom::element::HTMLDataListElementTypeId;
use dom::eventtarget::{EventTarget, NodeTargetTypeId};
use dom::htmlcollection::HTMLCollection;
use dom::htmlelement::HTMLElement;
use dom::node::{AbstractNode, Node};
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
pub struct HTMLDataListElement {
htmlelement: HTMLElement
}
impl HTMLDataListElementDerived for EventTarget {
fn is_htmldatalistelement(&self) -> bool {
match self.type_id {
NodeTargetTypeId(ElementNodeTypeId(HTMLDataListElementTypeId)) => true,
_ => false
}
}
}
impl HTMLDataListElement {
pub fn new_inherited(localName: DOMString, document: AbstractDocument) -> HTMLDataListElement {
pub fn new_inherited(localName: DOMString, document: JS<Document>) -> HTMLDataListElement {
HTMLDataListElement {
htmlelement: HTMLElement::new_inherited(HTMLDataListElementTypeId, localName, document)
}
}
pub fn new(localName: DOMString, document: AbstractDocument) -> AbstractNode {
let element = HTMLDataListElement::new_inherited(localName, document);
Node::reflect_node(@mut element, document, HTMLDataListElementBinding::Wrap)
pub fn new(localName: DOMString, document: &JS<Document>) -> JS<HTMLDataListElement> {
let element = HTMLDataListElement::new_inherited(localName, document.clone());
Node::reflect_node(~element, document, HTMLDataListElementBinding::Wrap)
}
}
impl HTMLDataListElement {
pub fn Options(&self) -> @mut HTMLCollection {
let window = self.htmlelement.element.node.owner_doc().document().window;
HTMLCollection::new(window, ~[])
pub fn Options(&self) -> JS<HTMLCollection> {
let doc = self.htmlelement.element.node.owner_doc();
let doc = doc.get();
HTMLCollection::new(&doc.window, ~[])
}
}

View file

@ -3,27 +3,40 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use dom::bindings::codegen::HTMLDirectoryElementBinding;
use dom::bindings::codegen::InheritTypes::HTMLDirectoryElementDerived;
use dom::bindings::js::JS;
use dom::bindings::utils::ErrorResult;
use dom::document::AbstractDocument;
use dom::document::Document;
use dom::element::HTMLDirectoryElementTypeId;
use dom::eventtarget::{EventTarget, NodeTargetTypeId};
use dom::htmlelement::HTMLElement;
use dom::node::{AbstractNode, Node};
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
pub struct HTMLDirectoryElement {
htmlelement: HTMLElement
}
impl HTMLDirectoryElementDerived for EventTarget {
fn is_htmldirectoryelement(&self) -> bool {
match self.type_id {
NodeTargetTypeId(ElementNodeTypeId(HTMLDirectoryElementTypeId)) => true,
_ => false
}
}
}
impl HTMLDirectoryElement {
pub fn new_inherited(localName: DOMString, document: AbstractDocument) -> HTMLDirectoryElement {
pub fn new_inherited(localName: DOMString, document: JS<Document>) -> HTMLDirectoryElement {
HTMLDirectoryElement {
htmlelement: HTMLElement::new_inherited(HTMLDirectoryElementTypeId, localName, document)
}
}
pub fn new(localName: DOMString, document: AbstractDocument) -> AbstractNode {
let element = HTMLDirectoryElement::new_inherited(localName, document);
Node::reflect_node(@mut element, document, HTMLDirectoryElementBinding::Wrap)
pub fn new(localName: DOMString, document: &JS<Document>) -> JS<HTMLDirectoryElement> {
let element = HTMLDirectoryElement::new_inherited(localName, document.clone());
Node::reflect_node(~element, document, HTMLDirectoryElementBinding::Wrap)
}
}

View file

@ -3,27 +3,40 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use dom::bindings::codegen::HTMLDivElementBinding;
use dom::bindings::codegen::InheritTypes::HTMLDivElementDerived;
use dom::bindings::js::JS;
use dom::bindings::utils::ErrorResult;
use dom::document::AbstractDocument;
use dom::document::Document;
use dom::element::HTMLDivElementTypeId;
use dom::eventtarget::{EventTarget, NodeTargetTypeId};
use dom::htmlelement::HTMLElement;
use dom::node::{AbstractNode, Node};
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
pub struct HTMLDivElement {
htmlelement: HTMLElement
}
impl HTMLDivElementDerived for EventTarget {
fn is_htmldivelement(&self) -> bool {
match self.type_id {
NodeTargetTypeId(ElementNodeTypeId(HTMLDivElementTypeId)) => true,
_ => false
}
}
}
impl HTMLDivElement {
pub fn new_inherited(localName: DOMString, document: AbstractDocument) -> HTMLDivElement {
pub fn new_inherited(localName: DOMString, document: JS<Document>) -> HTMLDivElement {
HTMLDivElement {
htmlelement: HTMLElement::new_inherited(HTMLDivElementTypeId, localName, document)
}
}
pub fn new(localName: DOMString, document: AbstractDocument) -> AbstractNode {
let element = HTMLDivElement::new_inherited(localName, document);
Node::reflect_node(@mut element, document, HTMLDivElementBinding::Wrap)
pub fn new(localName: DOMString, document: &JS<Document>) -> JS<HTMLDivElement> {
let element = HTMLDivElement::new_inherited(localName, document.clone());
Node::reflect_node(~element, document, HTMLDivElementBinding::Wrap)
}
}

View file

@ -3,27 +3,40 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use dom::bindings::codegen::HTMLDListElementBinding;
use dom::bindings::codegen::InheritTypes::HTMLDListElementDerived;
use dom::bindings::js::JS;
use dom::bindings::utils::ErrorResult;
use dom::document::AbstractDocument;
use dom::document::Document;
use dom::element::HTMLDListElementTypeId;
use dom::eventtarget::{EventTarget, NodeTargetTypeId};
use dom::htmlelement::HTMLElement;
use dom::node::{AbstractNode, Node};
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
pub struct HTMLDListElement {
htmlelement: HTMLElement
}
impl HTMLDListElementDerived for EventTarget {
fn is_htmldlistelement(&self) -> bool {
match self.type_id {
NodeTargetTypeId(ElementNodeTypeId(HTMLDListElementTypeId)) => true,
_ => false
}
}
}
impl HTMLDListElement {
pub fn new_inherited(localName: DOMString, document: AbstractDocument) -> HTMLDListElement {
pub fn new_inherited(localName: DOMString, document: JS<Document>) -> HTMLDListElement {
HTMLDListElement {
htmlelement: HTMLElement::new_inherited(HTMLDListElementTypeId, localName, document)
}
}
pub fn new(localName: DOMString, document: AbstractDocument) -> AbstractNode {
let element = HTMLDListElement::new_inherited(localName, document);
Node::reflect_node(@mut element, document, HTMLDListElementBinding::Wrap)
pub fn new(localName: DOMString, document: &JS<Document>) -> JS<HTMLDListElement> {
let element = HTMLDListElement::new_inherited(localName, document.clone());
Node::reflect_node(~element, document, HTMLDListElementBinding::Wrap)
}
}

View file

@ -1,86 +0,0 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* 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 dom::bindings::codegen::HTMLDocumentBinding;
use dom::bindings::utils::{Reflectable, Reflector, Traceable};
use dom::document::{AbstractDocument, Document, HTML};
use dom::htmlcollection::HTMLCollection;
use dom::window::Window;
use servo_util::namespace::Null;
use extra::url::Url;
use js::jsapi::JSTracer;
pub struct HTMLDocument {
parent: Document
}
impl HTMLDocument {
pub fn new_inherited(window: @mut Window, url: Option<Url>) -> HTMLDocument {
HTMLDocument {
parent: Document::new_inherited(window, url, HTML, None)
}
}
pub fn new(window: @mut Window, url: Option<Url>) -> AbstractDocument {
let document = HTMLDocument::new_inherited(window, url);
Document::reflect_document(@mut document, window, HTMLDocumentBinding::Wrap)
}
}
impl HTMLDocument {
pub fn Images(&self) -> @mut HTMLCollection {
self.parent.createHTMLCollection(|elem| "img" == elem.tag_name)
}
pub fn Embeds(&self) -> @mut HTMLCollection {
self.parent.createHTMLCollection(|elem| "embed" == elem.tag_name)
}
pub fn Plugins(&self) -> @mut HTMLCollection {
self.Embeds()
}
pub fn Links(&self) -> @mut HTMLCollection {
self.parent.createHTMLCollection(|elem| {
("a" == elem.tag_name || "area" == elem.tag_name) &&
elem.get_attribute(Null, "href").is_some()
})
}
pub fn Forms(&self) -> @mut HTMLCollection {
self.parent.createHTMLCollection(|elem| "form" == elem.tag_name)
}
pub fn Scripts(&self) -> @mut HTMLCollection {
self.parent.createHTMLCollection(|elem| "script" == elem.tag_name)
}
pub fn Anchors(&self) -> @mut HTMLCollection {
self.parent.createHTMLCollection(|elem| {
"a" == elem.tag_name && elem.get_attribute(Null, "name").is_some()
})
}
pub fn Applets(&self) -> @mut HTMLCollection {
// FIXME: This should be return OBJECT elements containing applets.
self.parent.createHTMLCollection(|elem| "applet" == elem.tag_name)
}
}
impl Reflectable for HTMLDocument {
fn reflector<'a>(&'a self) -> &'a Reflector {
self.parent.reflector()
}
fn mut_reflector<'a>(&'a mut self) -> &'a mut Reflector {
self.parent.mut_reflector()
}
}
impl Traceable for HTMLDocument {
fn trace(&self, tracer: *mut JSTracer) {
self.parent.trace(tracer);
}
}

View file

@ -3,29 +3,42 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use dom::bindings::codegen::HTMLElementBinding;
use dom::bindings::utils::{Fallible, ErrorResult};
use dom::document::AbstractDocument;
use dom::bindings::codegen::InheritTypes::HTMLElementDerived;
use dom::bindings::js::JS;
use dom::bindings::utils::{ErrorResult, Fallible};
use dom::document::Document;
use dom::element::{Element, ElementTypeId, HTMLElementTypeId};
use dom::node::{AbstractNode, Node};
use dom::eventtarget::{EventTarget, NodeTargetTypeId};
use dom::node::{Node, ElementNodeTypeId};
use js::jsapi::{JSContext, JSVal};
use js::JSVAL_NULL;
use servo_util::namespace;
use servo_util::str::DOMString;
#[deriving(Encodable)]
pub struct HTMLElement {
element: Element
}
impl HTMLElementDerived for EventTarget {
fn is_htmlelement(&self) -> bool {
match self.type_id {
NodeTargetTypeId(ElementNodeTypeId(_)) => true,
_ => false
}
}
}
impl HTMLElement {
pub fn new_inherited(type_id: ElementTypeId, tag_name: DOMString, document: AbstractDocument) -> HTMLElement {
pub fn new_inherited(type_id: ElementTypeId, tag_name: DOMString, document: JS<Document>) -> HTMLElement {
HTMLElement {
element: Element::new_inherited(type_id, tag_name, namespace::HTML, document)
}
}
pub fn new(localName: DOMString, document: AbstractDocument) -> AbstractNode {
let element = HTMLElement::new_inherited(HTMLElementTypeId, localName, document);
Node::reflect_node(@mut element, document, HTMLElementBinding::Wrap)
pub fn new(localName: DOMString, document: &JS<Document>) -> JS<HTMLElement> {
let element = HTMLElement::new_inherited(HTMLElementTypeId, localName, document.clone());
Node::reflect_node(~element, document, HTMLElementBinding::Wrap)
}
}
@ -134,7 +147,7 @@ impl HTMLElement {
pub fn SetClassName(&self, _class: DOMString) {
}
pub fn GetOffsetParent(&self) -> Option<AbstractNode> {
pub fn GetOffsetParent(&self) -> Option<JS<Element>> {
None
}

View file

@ -3,27 +3,40 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use dom::bindings::codegen::HTMLEmbedElementBinding;
use dom::bindings::codegen::InheritTypes::HTMLEmbedElementDerived;
use dom::bindings::js::JS;
use dom::bindings::utils::ErrorResult;
use dom::document::AbstractDocument;
use dom::document::Document;
use dom::element::HTMLEmbedElementTypeId;
use dom::eventtarget::{EventTarget, NodeTargetTypeId};
use dom::htmlelement::HTMLElement;
use dom::node::{AbstractNode, Node};
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
pub struct HTMLEmbedElement {
htmlelement: HTMLElement
}
impl HTMLEmbedElementDerived for EventTarget {
fn is_htmlembedelement(&self) -> bool {
match self.type_id {
NodeTargetTypeId(ElementNodeTypeId(HTMLEmbedElementTypeId)) => true,
_ => false
}
}
}
impl HTMLEmbedElement {
pub fn new_inherited(localName: DOMString, document: AbstractDocument) -> HTMLEmbedElement {
pub fn new_inherited(localName: DOMString, document: JS<Document>) -> HTMLEmbedElement {
HTMLEmbedElement {
htmlelement: HTMLElement::new_inherited(HTMLEmbedElementTypeId, localName, document)
}
}
pub fn new(localName: DOMString, document: AbstractDocument) -> AbstractNode {
let element = HTMLEmbedElement::new_inherited(localName, document);
Node::reflect_node(@mut element, document, HTMLEmbedElementBinding::Wrap)
pub fn new(localName: DOMString, document: &JS<Document>) -> JS<HTMLEmbedElement> {
let element = HTMLEmbedElement::new_inherited(localName, document.clone());
Node::reflect_node(~element, document, HTMLEmbedElementBinding::Wrap)
}
}
@ -76,7 +89,7 @@ impl HTMLEmbedElement {
Ok(())
}
pub fn GetSVGDocument(&self) -> Option<AbstractDocument> {
pub fn GetSVGDocument(&self) -> Option<JS<Document>> {
None
}
}

View file

@ -3,29 +3,43 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use dom::bindings::codegen::HTMLFieldSetElementBinding;
use dom::bindings::codegen::InheritTypes::HTMLFieldSetElementDerived;
use dom::bindings::js::JS;
use dom::bindings::utils::ErrorResult;
use dom::document::AbstractDocument;
use dom::document::Document;
use dom::element::HTMLFieldSetElementTypeId;
use dom::eventtarget::{EventTarget, NodeTargetTypeId};
use dom::htmlformelement::HTMLFormElement;
use dom::htmlcollection::HTMLCollection;
use dom::htmlelement::HTMLElement;
use dom::node::{AbstractNode, Node};
use dom::node::{Node, ElementNodeTypeId};
use dom::validitystate::ValidityState;
use servo_util::str::DOMString;
#[deriving(Encodable)]
pub struct HTMLFieldSetElement {
htmlelement: HTMLElement
}
impl HTMLFieldSetElementDerived for EventTarget {
fn is_htmlfieldsetelement(&self) -> bool {
match self.type_id {
NodeTargetTypeId(ElementNodeTypeId(HTMLFieldSetElementTypeId)) => true,
_ => false
}
}
}
impl HTMLFieldSetElement {
pub fn new_inherited(localName: DOMString, document: AbstractDocument) -> HTMLFieldSetElement {
pub fn new_inherited(localName: DOMString, document: JS<Document>) -> HTMLFieldSetElement {
HTMLFieldSetElement {
htmlelement: HTMLElement::new_inherited(HTMLFieldSetElementTypeId, localName, document)
}
}
pub fn new(localName: DOMString, document: AbstractDocument) -> AbstractNode {
let element = HTMLFieldSetElement::new_inherited(localName, document);
Node::reflect_node(@mut element, document, HTMLFieldSetElementBinding::Wrap)
pub fn new(localName: DOMString, document: &JS<Document>) -> JS<HTMLFieldSetElement> {
let element = HTMLFieldSetElement::new_inherited(localName, document.clone());
Node::reflect_node(~element, document, HTMLFieldSetElementBinding::Wrap)
}
}
@ -38,7 +52,7 @@ impl HTMLFieldSetElement {
Ok(())
}
pub fn GetForm(&self) -> Option<AbstractNode> {
pub fn GetForm(&self) -> Option<JS<HTMLFormElement>> {
None
}
@ -54,18 +68,20 @@ impl HTMLFieldSetElement {
~""
}
pub fn Elements(&self) -> @mut HTMLCollection {
let window = self.htmlelement.element.node.owner_doc().document().window;
HTMLCollection::new(window, ~[])
pub fn Elements(&self) -> JS<HTMLCollection> {
let doc = self.htmlelement.element.node.owner_doc();
let doc = doc.get();
HTMLCollection::new(&doc.window, ~[])
}
pub fn WillValidate(&self) -> bool {
false
}
pub fn Validity(&self) -> @mut ValidityState {
let global = self.htmlelement.element.node.owner_doc().document().window;
ValidityState::new(global)
pub fn Validity(&self) -> JS<ValidityState> {
let doc = self.htmlelement.element.node.owner_doc();
let doc = doc.get();
ValidityState::new(&doc.window)
}
pub fn ValidationMessage(&self) -> DOMString {

View file

@ -3,27 +3,40 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use dom::bindings::codegen::HTMLFontElementBinding;
use dom::bindings::codegen::InheritTypes::HTMLFontElementDerived;
use dom::bindings::js::JS;
use dom::bindings::utils::ErrorResult;
use dom::document::AbstractDocument;
use dom::document::Document;
use dom::element::HTMLFontElementTypeId;
use dom::eventtarget::{EventTarget, NodeTargetTypeId};
use dom::htmlelement::HTMLElement;
use dom::node::{AbstractNode, Node};
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
pub struct HTMLFontElement {
htmlelement: HTMLElement
}
impl HTMLFontElementDerived for EventTarget {
fn is_htmlfontelement(&self) -> bool {
match self.type_id {
NodeTargetTypeId(ElementNodeTypeId(HTMLFontElementTypeId)) => true,
_ => false
}
}
}
impl HTMLFontElement {
pub fn new_inherited(localName: DOMString, document: AbstractDocument) -> HTMLFontElement {
pub fn new_inherited(localName: DOMString, document: JS<Document>) -> HTMLFontElement {
HTMLFontElement {
htmlelement: HTMLElement::new_inherited(HTMLFontElementTypeId, localName, document)
}
}
pub fn new(localName: DOMString, document: AbstractDocument) -> AbstractNode {
let element = HTMLFontElement::new_inherited(localName, document);
Node::reflect_node(@mut element, document, HTMLFontElementBinding::Wrap)
pub fn new(localName: DOMString, document: &JS<Document>) -> JS<HTMLFontElement> {
let element = HTMLFontElement::new_inherited(localName, document.clone());
Node::reflect_node(~element, document, HTMLFontElementBinding::Wrap)
}
}

View file

@ -3,28 +3,41 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use dom::bindings::codegen::HTMLFormElementBinding;
use dom::bindings::codegen::InheritTypes::HTMLFormElementDerived;
use dom::bindings::js::JS;
use dom::bindings::utils::ErrorResult;
use dom::document::AbstractDocument;
use dom::element::HTMLFormElementTypeId;
use dom::document::Document;
use dom::element::{Element, HTMLFormElementTypeId};
use dom::eventtarget::{EventTarget, NodeTargetTypeId};
use dom::htmlcollection::HTMLCollection;
use dom::htmlelement::HTMLElement;
use dom::node::{AbstractNode, Node};
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
pub struct HTMLFormElement {
htmlelement: HTMLElement
}
impl HTMLFormElementDerived for EventTarget {
fn is_htmlformelement(&self) -> bool {
match self.type_id {
NodeTargetTypeId(ElementNodeTypeId(HTMLFormElementTypeId)) => true,
_ => false
}
}
}
impl HTMLFormElement {
pub fn new_inherited(localName: DOMString, document: AbstractDocument) -> HTMLFormElement {
pub fn new_inherited(localName: DOMString, document: JS<Document>) -> HTMLFormElement {
HTMLFormElement {
htmlelement: HTMLElement::new_inherited(HTMLFormElementTypeId, localName, document)
}
}
pub fn new(localName: DOMString, document: AbstractDocument) -> AbstractNode {
let element = HTMLFormElement::new_inherited(localName, document);
Node::reflect_node(@mut element, document, HTMLFormElementBinding::Wrap)
pub fn new(localName: DOMString, document: &JS<Document>) -> JS<HTMLFormElement> {
let element = HTMLFormElement::new_inherited(localName, document.clone());
Node::reflect_node(~element, document, HTMLFormElementBinding::Wrap)
}
}
@ -101,9 +114,10 @@ impl HTMLFormElement {
Ok(())
}
pub fn Elements(&self) -> @mut HTMLCollection {
let window = self.htmlelement.element.node.owner_doc().document().window;
HTMLCollection::new(window, ~[])
pub fn Elements(&self) -> JS<HTMLCollection> {
let doc = self.htmlelement.element.node.owner_doc();
let doc = doc.get();
HTMLCollection::new(&doc.window, ~[])
}
pub fn Length(&self) -> i32 {
@ -121,7 +135,7 @@ impl HTMLFormElement {
false
}
pub fn IndexedGetter(&self, _index: u32, _found: &mut bool) -> AbstractNode {
pub fn IndexedGetter(&self, _index: u32, _found: &mut bool) -> JS<Element> {
fail!("Not implemented.")
}
}

View file

@ -3,28 +3,41 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use dom::bindings::codegen::HTMLFrameElementBinding;
use dom::bindings::codegen::InheritTypes::HTMLFrameElementDerived;
use dom::bindings::js::JS;
use dom::bindings::utils::ErrorResult;
use dom::document::AbstractDocument;
use dom::document::Document;
use dom::element::HTMLFrameElementTypeId;
use dom::eventtarget::{EventTarget, NodeTargetTypeId};
use dom::htmlelement::HTMLElement;
use dom::node::{AbstractNode, Node};
use dom::node::{Node, ElementNodeTypeId};
use dom::windowproxy::WindowProxy;
use servo_util::str::DOMString;
#[deriving(Encodable)]
pub struct HTMLFrameElement {
htmlelement: HTMLElement
}
impl HTMLFrameElementDerived for EventTarget {
fn is_htmlframeelement(&self) -> bool {
match self.type_id {
NodeTargetTypeId(ElementNodeTypeId(HTMLFrameElementTypeId)) => true,
_ => false
}
}
}
impl HTMLFrameElement {
pub fn new_inherited(localName: DOMString, document: AbstractDocument) -> HTMLFrameElement {
pub fn new_inherited(localName: DOMString, document: JS<Document>) -> HTMLFrameElement {
HTMLFrameElement {
htmlelement: HTMLElement::new_inherited(HTMLFrameElementTypeId, localName, document)
}
}
pub fn new(localName: DOMString, document: AbstractDocument) -> AbstractNode {
let element = HTMLFrameElement::new_inherited(localName, document);
Node::reflect_node(@mut element, document, HTMLFrameElementBinding::Wrap)
pub fn new(localName: DOMString, document: &JS<Document>) -> JS<HTMLFrameElement> {
let element = HTMLFrameElement::new_inherited(localName, document.clone());
Node::reflect_node(~element, document, HTMLFrameElementBinding::Wrap)
}
}
@ -77,11 +90,11 @@ impl HTMLFrameElement {
Ok(())
}
pub fn GetContentDocument(&self) -> Option<AbstractDocument> {
pub fn GetContentDocument(&self) -> Option<JS<Document>> {
None
}
pub fn GetContentWindow(&self) -> Option<@mut WindowProxy> {
pub fn GetContentWindow(&self) -> Option<JS<WindowProxy>> {
None
}

View file

@ -3,27 +3,40 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use dom::bindings::codegen::HTMLFrameSetElementBinding;
use dom::bindings::codegen::InheritTypes::HTMLFrameSetElementDerived;
use dom::bindings::js::JS;
use dom::bindings::utils::ErrorResult;
use dom::document::AbstractDocument;
use dom::document::Document;
use dom::element::HTMLFrameSetElementTypeId;
use dom::eventtarget::{EventTarget, NodeTargetTypeId};
use dom::htmlelement::HTMLElement;
use dom::node::{AbstractNode, Node};
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
pub struct HTMLFrameSetElement {
htmlelement: HTMLElement
}
impl HTMLFrameSetElementDerived for EventTarget {
fn is_htmlframesetelement(&self) -> bool {
match self.type_id {
NodeTargetTypeId(ElementNodeTypeId(HTMLFrameSetElementTypeId)) => true,
_ => false
}
}
}
impl HTMLFrameSetElement {
pub fn new_inherited(localName: DOMString, document: AbstractDocument) -> HTMLFrameSetElement {
pub fn new_inherited(localName: DOMString, document: JS<Document>) -> HTMLFrameSetElement {
HTMLFrameSetElement {
htmlelement: HTMLElement::new_inherited(HTMLFrameSetElementTypeId, localName, document)
}
}
pub fn new(localName: DOMString, document: AbstractDocument) -> AbstractNode {
let element = HTMLFrameSetElement::new_inherited(localName, document);
Node::reflect_node(@mut element, document, HTMLFrameSetElementBinding::Wrap)
pub fn new(localName: DOMString, document: &JS<Document>) -> JS<HTMLFrameSetElement> {
let element = HTMLFrameSetElement::new_inherited(localName, document.clone());
Node::reflect_node(~element, document, HTMLFrameSetElementBinding::Wrap)
}
}

View file

@ -3,25 +3,38 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use dom::bindings::codegen::HTMLHeadElementBinding;
use dom::document::AbstractDocument;
use dom::bindings::codegen::InheritTypes::HTMLHeadElementDerived;
use dom::bindings::js::JS;
use dom::document::Document;
use dom::element::HTMLHeadElementTypeId;
use dom::eventtarget::{EventTarget, NodeTargetTypeId};
use dom::htmlelement::HTMLElement;
use dom::node::{AbstractNode, Node};
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
pub struct HTMLHeadElement {
htmlelement: HTMLElement
}
impl HTMLHeadElementDerived for EventTarget {
fn is_htmlheadelement(&self) -> bool {
match self.type_id {
NodeTargetTypeId(ElementNodeTypeId(HTMLHeadElementTypeId)) => true,
_ => false
}
}
}
impl HTMLHeadElement {
pub fn new_inherited(localName: DOMString, document: AbstractDocument) -> HTMLHeadElement {
pub fn new_inherited(localName: DOMString, document: JS<Document>) -> HTMLHeadElement {
HTMLHeadElement {
htmlelement: HTMLElement::new_inherited(HTMLHeadElementTypeId, localName, document)
}
}
pub fn new(localName: DOMString, document: AbstractDocument) -> AbstractNode {
let element = HTMLHeadElement::new_inherited(localName, document);
Node::reflect_node(@mut element, document, HTMLHeadElementBinding::Wrap)
pub fn new(localName: DOMString, document: &JS<Document>) -> JS<HTMLHeadElement> {
let element = HTMLHeadElement::new_inherited(localName, document.clone());
Node::reflect_node(~element, document, HTMLHeadElementBinding::Wrap)
}
}

View file

@ -3,12 +3,16 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use dom::bindings::codegen::HTMLHeadingElementBinding;
use dom::document::AbstractDocument;
use dom::bindings::codegen::InheritTypes::HTMLHeadingElementDerived;
use dom::bindings::js::JS;
use dom::document::Document;
use dom::element::HTMLHeadingElementTypeId;
use dom::eventtarget::{EventTarget, NodeTargetTypeId};
use dom::htmlelement::HTMLElement;
use dom::node::{AbstractNode, Node};
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
pub enum HeadingLevel {
Heading1,
Heading2,
@ -18,22 +22,32 @@ pub enum HeadingLevel {
Heading6,
}
#[deriving(Encodable)]
pub struct HTMLHeadingElement {
htmlelement: HTMLElement,
level: HeadingLevel,
}
impl HTMLHeadingElementDerived for EventTarget {
fn is_htmlheadingelement(&self) -> bool {
match self.type_id {
NodeTargetTypeId(ElementNodeTypeId(HTMLHeadingElementTypeId)) => true,
_ => false
}
}
}
impl HTMLHeadingElement {
pub fn new_inherited(localName: DOMString, document: AbstractDocument, level: HeadingLevel) -> HTMLHeadingElement {
pub fn new_inherited(localName: DOMString, document: JS<Document>, level: HeadingLevel) -> HTMLHeadingElement {
HTMLHeadingElement {
htmlelement: HTMLElement::new_inherited(HTMLHeadingElementTypeId, localName, document),
level: level,
}
}
pub fn new(localName: DOMString, document: AbstractDocument, level: HeadingLevel) -> AbstractNode {
let element = HTMLHeadingElement::new_inherited(localName, document, level);
Node::reflect_node(@mut element, document, HTMLHeadingElementBinding::Wrap)
pub fn new(localName: DOMString, document: &JS<Document>, level: HeadingLevel) -> JS<HTMLHeadingElement> {
let element = HTMLHeadingElement::new_inherited(localName, document.clone(), level);
Node::reflect_node(~element, document, HTMLHeadingElementBinding::Wrap)
}
}

View file

@ -3,27 +3,40 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use dom::bindings::codegen::HTMLHRElementBinding;
use dom::bindings::codegen::InheritTypes::HTMLHRElementDerived;
use dom::bindings::js::JS;
use dom::bindings::utils::ErrorResult;
use dom::document::AbstractDocument;
use dom::document::Document;
use dom::element::HTMLHRElementTypeId;
use dom::eventtarget::{EventTarget, NodeTargetTypeId};
use dom::htmlelement::HTMLElement;
use dom::node::{AbstractNode, Node};
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
pub struct HTMLHRElement {
htmlelement: HTMLElement,
}
impl HTMLHRElementDerived for EventTarget {
fn is_htmlhrelement(&self) -> bool {
match self.type_id {
NodeTargetTypeId(ElementNodeTypeId(HTMLHRElementTypeId)) => true,
_ => false
}
}
}
impl HTMLHRElement {
pub fn new_inherited(localName: DOMString, document: AbstractDocument) -> HTMLHRElement {
pub fn new_inherited(localName: DOMString, document: JS<Document>) -> HTMLHRElement {
HTMLHRElement {
htmlelement: HTMLElement::new_inherited(HTMLHRElementTypeId, localName, document)
}
}
pub fn new(localName: DOMString, document: AbstractDocument) -> AbstractNode {
let element = HTMLHRElement::new_inherited(localName, document);
Node::reflect_node(@mut element, document, HTMLHRElementBinding::Wrap)
pub fn new(localName: DOMString, document: &JS<Document>) -> JS<HTMLHRElement> {
let element = HTMLHRElement::new_inherited(localName, document.clone());
Node::reflect_node(~element, document, HTMLHRElementBinding::Wrap)
}
}

View file

@ -3,27 +3,40 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use dom::bindings::codegen::HTMLHtmlElementBinding;
use dom::bindings::codegen::InheritTypes::HTMLHtmlElementDerived;
use dom::bindings::js::JS;
use dom::bindings::utils::ErrorResult;
use dom::document::AbstractDocument;
use dom::document::Document;
use dom::element::HTMLHtmlElementTypeId;
use dom::eventtarget::{EventTarget, NodeTargetTypeId};
use dom::htmlelement::HTMLElement;
use dom::node::{AbstractNode, Node};
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
pub struct HTMLHtmlElement {
htmlelement: HTMLElement
}
impl HTMLHtmlElementDerived for EventTarget {
fn is_htmlhtmlelement(&self) -> bool {
match self.type_id {
NodeTargetTypeId(ElementNodeTypeId(HTMLHtmlElementTypeId)) => true,
_ => false
}
}
}
impl HTMLHtmlElement {
pub fn new_inherited(localName: DOMString, document: AbstractDocument) -> HTMLHtmlElement {
pub fn new_inherited(localName: DOMString, document: JS<Document>) -> HTMLHtmlElement {
HTMLHtmlElement {
htmlelement: HTMLElement::new_inherited(HTMLHtmlElementTypeId, localName, document)
}
}
pub fn new(localName: DOMString, document: AbstractDocument) -> AbstractNode {
let element = HTMLHtmlElement::new_inherited(localName, document);
Node::reflect_node(@mut element, document, HTMLHtmlElementBinding::Wrap)
pub fn new(localName: DOMString, document: &JS<Document>) -> JS<HTMLHtmlElement> {
let element = HTMLHtmlElement::new_inherited(localName, document.clone());
Node::reflect_node(~element, document, HTMLHtmlElementBinding::Wrap)
}
}

View file

@ -3,17 +3,21 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use dom::bindings::codegen::HTMLIFrameElementBinding;
use dom::bindings::codegen::InheritTypes::{ElementCast, HTMLIFrameElementDerived};
use dom::bindings::js::JS;
use dom::bindings::utils::ErrorResult;
use dom::document::AbstractDocument;
use dom::document::Document;
use dom::element::HTMLIframeElementTypeId;
use dom::eventtarget::{EventTarget, NodeTargetTypeId};
use dom::htmlelement::HTMLElement;
use dom::node::{AbstractNode, Node};
use dom::node::{Node, ElementNodeTypeId};
use dom::windowproxy::WindowProxy;
use servo_util::str::DOMString;
use extra::url::Url;
use servo_msg::constellation_msg::{PipelineId, SubpageId};
use std::ascii::StrAsciiExt;
use extra::serialize::{Encoder, Encodable};
enum SandboxAllowance {
AllowNothing = 0x00,
@ -25,13 +29,33 @@ enum SandboxAllowance {
AllowPopups = 0x20
}
#[deriving(Encodable)]
pub struct HTMLIFrameElement {
htmlelement: HTMLElement,
frame: Option<Url>,
extra: Untraceable,
size: Option<IFrameSize>,
sandbox: Option<u8>
}
struct Untraceable {
frame: Option<Url>,
}
impl<S: Encoder> Encodable<S> for Untraceable {
fn encode(&self, _s: &mut S) {
}
}
impl HTMLIFrameElementDerived for EventTarget {
fn is_htmliframeelement(&self) -> bool {
match self.type_id {
NodeTargetTypeId(ElementNodeTypeId(HTMLIframeElementTypeId)) => true,
_ => false
}
}
}
#[deriving(Encodable)]
pub struct IFrameSize {
pipeline_id: PipelineId,
subpage_id: SubpageId,
@ -44,18 +68,20 @@ impl HTMLIFrameElement {
}
impl HTMLIFrameElement {
pub fn new_inherited(localName: DOMString, document: AbstractDocument) -> HTMLIFrameElement {
pub fn new_inherited(localName: DOMString, document: JS<Document>) -> HTMLIFrameElement {
HTMLIFrameElement {
htmlelement: HTMLElement::new_inherited(HTMLIframeElementTypeId, localName, document),
frame: None,
extra: Untraceable {
frame: None
},
size: None,
sandbox: None,
}
}
pub fn new(localName: DOMString, document: AbstractDocument) -> AbstractNode {
let element = HTMLIFrameElement::new_inherited(localName, document);
Node::reflect_node(@mut element, document, HTMLIFrameElementBinding::Wrap)
pub fn new(localName: DOMString, document: &JS<Document>) -> JS<HTMLIFrameElement> {
let element = HTMLIFrameElement::new_inherited(localName, document.clone());
Node::reflect_node(~element, document, HTMLIFrameElementBinding::Wrap)
}
}
@ -84,12 +110,13 @@ impl HTMLIFrameElement {
Ok(())
}
pub fn Sandbox(&self, _abstract_self: AbstractNode) -> DOMString {
pub fn Sandbox(&self, _abstract_self: &JS<HTMLIFrameElement>) -> DOMString {
self.htmlelement.element.get_string_attribute("sandbox")
}
pub fn SetSandbox(&mut self, abstract_self: AbstractNode, sandbox: DOMString) {
self.htmlelement.element.set_string_attribute(abstract_self, "sandbox",
pub fn SetSandbox(&mut self, abstract_self: &JS<HTMLIFrameElement>, sandbox: DOMString) {
self.htmlelement.element.set_string_attribute(&ElementCast::from(abstract_self),
"sandbox",
sandbox);
}
@ -143,11 +170,11 @@ impl HTMLIFrameElement {
Ok(())
}
pub fn GetContentDocument(&self) -> Option<AbstractDocument> {
pub fn GetContentDocument(&self) -> Option<JS<Document>> {
None
}
pub fn GetContentWindow(&self) -> Option<@mut WindowProxy> {
pub fn GetContentWindow(&self) -> Option<JS<WindowProxy>> {
None
}
@ -199,7 +226,7 @@ impl HTMLIFrameElement {
Ok(())
}
pub fn GetSVGDocument(&self) -> Option<AbstractDocument> {
pub fn GetSVGDocument(&self) -> Option<JS<Document>> {
None
}
}

View file

@ -3,11 +3,15 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use dom::bindings::codegen::HTMLImageElementBinding;
use dom::bindings::codegen::InheritTypes::{NodeCast, HTMLImageElementDerived};
use dom::bindings::codegen::InheritTypes::{ElementCast};
use dom::bindings::js::JS;
use dom::bindings::utils::ErrorResult;
use dom::document::AbstractDocument;
use dom::element::HTMLImageElementTypeId;
use dom::document::Document;
use dom::element::{Element, HTMLImageElementTypeId};
use dom::eventtarget::{EventTarget, NodeTargetTypeId};
use dom::htmlelement::HTMLElement;
use dom::node::{AbstractNode, Node};
use dom::node::{Node, ElementNodeTypeId, NodeHelpers};
use extra::url::Url;
use servo_util::geometry::to_px;
use layout_interface::{ContentBoxQuery, ContentBoxResponse};
@ -17,22 +21,45 @@ use servo_util::url::parse_url;
use servo_util::namespace::Null;
use servo_util::str::DOMString;
use extra::serialize::{Encoder, Encodable};
#[deriving(Encodable)]
pub struct HTMLImageElement {
htmlelement: HTMLElement,
extra: Untraceable,
}
struct Untraceable {
image: Option<Url>,
}
impl<S: Encoder> Encodable<S> for Untraceable {
fn encode(&self, _s: &mut S) {
}
}
impl HTMLImageElementDerived for EventTarget {
fn is_htmlimageelement(&self) -> bool {
match self.type_id {
NodeTargetTypeId(ElementNodeTypeId(HTMLImageElementTypeId)) => true,
_ => false
}
}
}
impl HTMLImageElement {
pub fn new_inherited(localName: DOMString, document: AbstractDocument) -> HTMLImageElement {
pub fn new_inherited(localName: DOMString, document: JS<Document>) -> HTMLImageElement {
HTMLImageElement {
htmlelement: HTMLElement::new_inherited(HTMLImageElementTypeId, localName, document),
image: None,
extra: Untraceable {
image: None,
}
}
}
pub fn new(localName: DOMString, document: AbstractDocument) -> AbstractNode {
let element = HTMLImageElement::new_inherited(localName, document);
Node::reflect_node(@mut element, document, HTMLImageElementBinding::Wrap)
pub fn new(localName: DOMString, document: &JS<Document>) -> JS<HTMLImageElement> {
let element = HTMLImageElement::new_inherited(localName, document.clone());
Node::reflect_node(~element, document, HTMLImageElementBinding::Wrap)
}
}
@ -41,12 +68,12 @@ impl HTMLImageElement {
/// prefetching the image. This method must be called after `src` is changed.
pub fn update_image(&mut self, image_cache: ImageCacheTask, url: Option<Url>) {
let elem = &mut self.htmlelement.element;
let src_opt = elem.get_attribute(Null, "src").map(|x| x.Value());
let src_opt = elem.get_attribute(Null, "src").map(|x| x.get().Value());
match src_opt {
None => {}
Some(src) => {
let img_url = parse_url(src, url);
self.image = Some(img_url.clone());
self.extra.image = Some(img_url.clone());
// inform the image cache to load this, but don't store a
// handle.
@ -61,7 +88,7 @@ impl HTMLImageElement {
pub fn AfterSetAttr(&mut self, name: DOMString, _value: DOMString) {
if "src" == name {
let document = self.htmlelement.element.node.owner_doc();
let window = document.document().window;
let window = document.get().window.get();
let url = window.page.url.as_ref().map(|&(ref url, _)| url.clone());
self.update_image(window.image_cache_task.clone(), url);
}
@ -73,7 +100,7 @@ impl HTMLImageElement {
// `self.update_image()` will see the missing src attribute and return early.
if "src" == name {
let document = self.htmlelement.element.node.owner_doc();
let window = document.document().window;
let window = document.get().window.get();
self.update_image(window.image_cache_task.clone(), None);
}
}
@ -86,13 +113,13 @@ impl HTMLImageElement {
Ok(())
}
pub fn Src(&self, _abstract_self: AbstractNode) -> DOMString {
pub fn Src(&self, _abstract_self: &JS<HTMLImageElement>) -> DOMString {
~""
}
pub fn SetSrc(&mut self, abstract_self: AbstractNode, src: DOMString) -> ErrorResult {
pub fn SetSrc(&mut self, abstract_self: &JS<HTMLImageElement>, src: DOMString) -> ErrorResult {
let node = &mut self.htmlelement.element;
node.set_attr(abstract_self, ~"src", src.clone());
node.set_attr(&ElementCast::from(abstract_self), ~"src", src.clone());
Ok(())
}
@ -120,37 +147,43 @@ impl HTMLImageElement {
Ok(())
}
pub fn Width(&self, abstract_self: AbstractNode) -> u32 {
let node = &self.htmlelement.element.node;
let page = node.owner_doc().document().window.page;
pub fn Width(&self, abstract_self: &JS<HTMLImageElement>) -> u32 {
let node: JS<Node> = NodeCast::from(abstract_self);
let doc = node.get().owner_doc();
let page = doc.get().window.get().page;
let (port, chan) = Chan::new();
match page.query_layout(ContentBoxQuery(abstract_self, chan), port) {
let addr = node.to_trusted_node_address();
match page.query_layout(ContentBoxQuery(addr, chan), port) {
ContentBoxResponse(rect) => {
to_px(rect.size.width) as u32
}
}
}
pub fn SetWidth(&mut self, abstract_self: AbstractNode, width: u32) -> ErrorResult {
let node = &mut self.htmlelement.element;
node.set_attr(abstract_self, ~"width", width.to_str());
pub fn SetWidth(&mut self, abstract_self: &JS<HTMLImageElement>, width: u32) -> ErrorResult {
let mut elem: JS<Element> = ElementCast::from(abstract_self);
let mut elem_clone = elem.clone();
elem.get_mut().set_attr(&mut elem_clone, ~"width", width.to_str());
Ok(())
}
pub fn Height(&self, abstract_self: AbstractNode) -> u32 {
pub fn Height(&self, abstract_self: &JS<HTMLImageElement>) -> u32 {
let node = &self.htmlelement.element.node;
let page = node.owner_doc().document().window.page;
let doc = node.owner_doc();
let page = doc.get().window.get().page;
let (port, chan) = Chan::new();
match page.query_layout(ContentBoxQuery(abstract_self, chan), port) {
let this_node: JS<Node> = NodeCast::from(abstract_self);
let addr = this_node.to_trusted_node_address();
match page.query_layout(ContentBoxQuery(addr, chan), port) {
ContentBoxResponse(rect) => {
to_px(rect.size.height) as u32
}
}
}
pub fn SetHeight(&mut self, abstract_self: AbstractNode, height: u32) -> ErrorResult {
pub fn SetHeight(&mut self, abstract_self: &JS<HTMLImageElement>, height: u32) -> ErrorResult {
let node = &mut self.htmlelement.element;
node.set_attr(abstract_self, ~"height", height.to_str());
node.set_attr(&ElementCast::from(abstract_self), ~"height", height.to_str());
Ok(())
}

View file

@ -3,27 +3,40 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use dom::bindings::codegen::HTMLInputElementBinding;
use dom::bindings::utils::{Fallible, ErrorResult};
use dom::document::AbstractDocument;
use dom::bindings::codegen::InheritTypes::HTMLInputElementDerived;
use dom::bindings::js::JS;
use dom::bindings::utils::{ErrorResult, Fallible};
use dom::document::Document;
use dom::element::HTMLInputElementTypeId;
use dom::eventtarget::{EventTarget, NodeTargetTypeId};
use dom::htmlelement::HTMLElement;
use dom::node::{AbstractNode, Node};
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
pub struct HTMLInputElement {
htmlelement: HTMLElement,
}
impl HTMLInputElementDerived for EventTarget {
fn is_htmlinputelement(&self) -> bool {
match self.type_id {
NodeTargetTypeId(ElementNodeTypeId(HTMLInputElementTypeId)) => true,
_ => false
}
}
}
impl HTMLInputElement {
pub fn new_inherited(localName: DOMString, document: AbstractDocument) -> HTMLInputElement {
pub fn new_inherited(localName: DOMString, document: JS<Document>) -> HTMLInputElement {
HTMLInputElement {
htmlelement: HTMLElement::new_inherited(HTMLInputElementTypeId, localName, document)
}
}
pub fn new(localName: DOMString, document: AbstractDocument) -> AbstractNode {
let element = HTMLInputElement::new_inherited(localName, document);
Node::reflect_node(@mut element, document, HTMLInputElementBinding::Wrap)
pub fn new(localName: DOMString, document: &JS<Document>) -> JS<HTMLInputElement> {
let element = HTMLInputElement::new_inherited(localName, document.clone());
Node::reflect_node(~element, document, HTMLInputElementBinding::Wrap)
}
}

View file

@ -3,26 +3,39 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use dom::bindings::codegen::HTMLLabelElementBinding;
use dom::document::AbstractDocument;
use dom::bindings::codegen::InheritTypes::HTMLLabelElementDerived;
use dom::bindings::js::JS;
use dom::document::Document;
use dom::element::HTMLLabelElementTypeId;
use dom::eventtarget::{EventTarget, NodeTargetTypeId};
use dom::htmlelement::HTMLElement;
use dom::node::{AbstractNode, Node};
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
pub struct HTMLLabelElement {
htmlelement: HTMLElement,
}
impl HTMLLabelElementDerived for EventTarget {
fn is_htmllabelelement(&self) -> bool {
match self.type_id {
NodeTargetTypeId(ElementNodeTypeId(HTMLLabelElementTypeId)) => true,
_ => false
}
}
}
impl HTMLLabelElement {
pub fn new_inherited(localName: DOMString, document: AbstractDocument) -> HTMLLabelElement {
pub fn new_inherited(localName: DOMString, document: JS<Document>) -> HTMLLabelElement {
HTMLLabelElement {
htmlelement: HTMLElement::new_inherited(HTMLLabelElementTypeId, localName, document)
}
}
pub fn new(localName: DOMString, document: AbstractDocument) -> AbstractNode {
let element = HTMLLabelElement::new_inherited(localName, document);
Node::reflect_node(@mut element, document, HTMLLabelElementBinding::Wrap)
pub fn new(localName: DOMString, document: &JS<Document>) -> JS<HTMLLabelElement> {
let element = HTMLLabelElement::new_inherited(localName, document.clone());
Node::reflect_node(~element, document, HTMLLabelElementBinding::Wrap)
}
}

View file

@ -3,27 +3,40 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use dom::bindings::codegen::HTMLLegendElementBinding;
use dom::bindings::codegen::InheritTypes::HTMLLegendElementDerived;
use dom::bindings::js::JS;
use dom::bindings::utils::ErrorResult;
use dom::document::AbstractDocument;
use dom::document::Document;
use dom::element::HTMLLegendElementTypeId;
use dom::eventtarget::{EventTarget, NodeTargetTypeId};
use dom::htmlelement::HTMLElement;
use dom::node::{AbstractNode, Node};
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
pub struct HTMLLegendElement {
htmlelement: HTMLElement,
}
impl HTMLLegendElementDerived for EventTarget {
fn is_htmllegendelement(&self) -> bool {
match self.type_id {
NodeTargetTypeId(ElementNodeTypeId(HTMLLegendElementTypeId)) => true,
_ => false
}
}
}
impl HTMLLegendElement {
pub fn new_inherited(localName: DOMString, document: AbstractDocument) -> HTMLLegendElement {
pub fn new_inherited(localName: DOMString, document: JS<Document>) -> HTMLLegendElement {
HTMLLegendElement {
htmlelement: HTMLElement::new_inherited(HTMLLegendElementTypeId, localName, document)
}
}
pub fn new(localName: DOMString, document: AbstractDocument) -> AbstractNode {
let element = HTMLLegendElement::new_inherited(localName, document);
Node::reflect_node(@mut element, document, HTMLLegendElementBinding::Wrap)
pub fn new(localName: DOMString, document: &JS<Document>) -> JS<HTMLLegendElement> {
let element = HTMLLegendElement::new_inherited(localName, document.clone());
Node::reflect_node(~element, document, HTMLLegendElementBinding::Wrap)
}
}

View file

@ -3,27 +3,40 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use dom::bindings::codegen::HTMLLIElementBinding;
use dom::bindings::codegen::InheritTypes::HTMLLIElementDerived;
use dom::bindings::js::JS;
use dom::bindings::utils::ErrorResult;
use dom::document::AbstractDocument;
use dom::document::Document;
use dom::element::HTMLLIElementTypeId;
use dom::eventtarget::{EventTarget, NodeTargetTypeId};
use dom::htmlelement::HTMLElement;
use dom::node::{AbstractNode, Node};
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
pub struct HTMLLIElement {
htmlelement: HTMLElement,
}
impl HTMLLIElementDerived for EventTarget {
fn is_htmllielement(&self) -> bool {
match self.type_id {
NodeTargetTypeId(ElementNodeTypeId(HTMLLIElementTypeId)) => true,
_ => false
}
}
}
impl HTMLLIElement {
pub fn new_inherited(localName: DOMString, document: AbstractDocument) -> HTMLLIElement {
pub fn new_inherited(localName: DOMString, document: JS<Document>) -> HTMLLIElement {
HTMLLIElement {
htmlelement: HTMLElement::new_inherited(HTMLLIElementTypeId, localName, document)
}
}
pub fn new(localName: DOMString, document: AbstractDocument) -> AbstractNode {
let element = HTMLLIElement::new_inherited(localName, document);
Node::reflect_node(@mut element, document, HTMLLIElementBinding::Wrap)
pub fn new(localName: DOMString, document: &JS<Document>) -> JS<HTMLLIElement> {
let element = HTMLLIElement::new_inherited(localName, document.clone());
Node::reflect_node(~element, document, HTMLLIElementBinding::Wrap)
}
}

View file

@ -3,27 +3,40 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use dom::bindings::codegen::HTMLLinkElementBinding;
use dom::bindings::codegen::InheritTypes::HTMLLinkElementDerived;
use dom::bindings::js::JS;
use dom::bindings::utils::ErrorResult;
use dom::document::AbstractDocument;
use dom::document::Document;
use dom::element::HTMLLinkElementTypeId;
use dom::eventtarget::{EventTarget, NodeTargetTypeId};
use dom::htmlelement::HTMLElement;
use dom::node::{AbstractNode, Node};
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
pub struct HTMLLinkElement {
htmlelement: HTMLElement,
}
impl HTMLLinkElementDerived for EventTarget {
fn is_htmllinkelement(&self) -> bool {
match self.type_id {
NodeTargetTypeId(ElementNodeTypeId(HTMLLinkElementTypeId)) => true,
_ => false
}
}
}
impl HTMLLinkElement {
pub fn new_inherited(localName: DOMString, document: AbstractDocument) -> HTMLLinkElement {
pub fn new_inherited(localName: DOMString, document: JS<Document>) -> HTMLLinkElement {
HTMLLinkElement {
htmlelement: HTMLElement::new_inherited(HTMLLinkElementTypeId, localName, document)
}
}
pub fn new(localName: DOMString, document: AbstractDocument) -> AbstractNode {
let element = HTMLLinkElement::new_inherited(localName, document);
Node::reflect_node(@mut element, document, HTMLLinkElementBinding::Wrap)
pub fn new(localName: DOMString, document: &JS<Document>) -> JS<HTMLLinkElement> {
let element = HTMLLinkElement::new_inherited(localName, document.clone());
Node::reflect_node(~element, document, HTMLLinkElementBinding::Wrap)
}
}

View file

@ -3,25 +3,38 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use dom::bindings::codegen::HTMLMainElementBinding;
use dom::document::AbstractDocument;
use dom::bindings::codegen::InheritTypes::HTMLMainElementDerived;
use dom::bindings::js::JS;
use dom::document::Document;
use dom::element::HTMLMainElementTypeId;
use dom::eventtarget::{EventTarget, NodeTargetTypeId};
use dom::htmlelement::HTMLElement;
use dom::node::{AbstractNode, Node};
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
pub struct HTMLMainElement {
htmlelement: HTMLElement
}
impl HTMLMainElementDerived for EventTarget {
fn is_htmlmainelement(&self) -> bool {
match self.type_id {
NodeTargetTypeId(ElementNodeTypeId(HTMLMainElementTypeId)) => true,
_ => false
}
}
}
impl HTMLMainElement {
pub fn new_inherited(localName: DOMString, document: AbstractDocument) -> HTMLMainElement {
pub fn new_inherited(localName: DOMString, document: JS<Document>) -> HTMLMainElement {
HTMLMainElement {
htmlelement: HTMLElement::new_inherited(HTMLMainElementTypeId, localName, document)
}
}
pub fn new(localName: DOMString, document: AbstractDocument) -> AbstractNode {
let element = HTMLMainElement::new_inherited(localName, document);
Node::reflect_node(@mut element, document, HTMLMainElementBinding::Wrap)
pub fn new(localName: DOMString, document: &JS<Document>) -> JS<HTMLMainElement> {
let element = HTMLMainElement::new_inherited(localName, document.clone());
Node::reflect_node(~element, document, HTMLMainElementBinding::Wrap)
}
}

View file

@ -3,28 +3,41 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use dom::bindings::codegen::HTMLMapElementBinding;
use dom::bindings::codegen::InheritTypes::HTMLMapElementDerived;
use dom::bindings::js::JS;
use dom::bindings::utils::ErrorResult;
use dom::htmlcollection::HTMLCollection;
use dom::document::AbstractDocument;
use dom::document::Document;
use dom::element::HTMLMapElementTypeId;
use dom::eventtarget::{EventTarget, NodeTargetTypeId};
use dom::htmlcollection::HTMLCollection;
use dom::htmlelement::HTMLElement;
use dom::node::{AbstractNode, Node};
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
pub struct HTMLMapElement {
htmlelement: HTMLElement
}
impl HTMLMapElementDerived for EventTarget {
fn is_htmlmapelement(&self) -> bool {
match self.type_id {
NodeTargetTypeId(ElementNodeTypeId(HTMLMapElementTypeId)) => true,
_ => false
}
}
}
impl HTMLMapElement {
pub fn new_inherited(localName: DOMString, document: AbstractDocument) -> HTMLMapElement {
pub fn new_inherited(localName: DOMString, document: JS<Document>) -> HTMLMapElement {
HTMLMapElement {
htmlelement: HTMLElement::new_inherited(HTMLMapElementTypeId, localName, document)
}
}
pub fn new(localName: DOMString, document: AbstractDocument) -> AbstractNode {
let element = HTMLMapElement::new_inherited(localName, document);
Node::reflect_node(@mut element, document, HTMLMapElementBinding::Wrap)
pub fn new(localName: DOMString, document: &JS<Document>) -> JS<HTMLMapElement> {
let element = HTMLMapElement::new_inherited(localName, document.clone());
Node::reflect_node(~element, document, HTMLMapElementBinding::Wrap)
}
}
@ -37,8 +50,9 @@ impl HTMLMapElement {
Ok(())
}
pub fn Areas(&self) -> @mut HTMLCollection {
let window = self.htmlelement.element.node.owner_doc().document().window;
HTMLCollection::new(window, ~[])
pub fn Areas(&self) -> JS<HTMLCollection> {
let doc = self.htmlelement.element.node.owner_doc();
let doc = doc.get();
HTMLCollection::new(&doc.window, ~[])
}
}

View file

@ -2,18 +2,33 @@
* 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 dom::bindings::js::JS;
use dom::bindings::codegen::InheritTypes::HTMLMediaElementDerived;
use dom::bindings::utils::ErrorResult;
use dom::document::AbstractDocument;
use dom::element::ElementTypeId;
use dom::document::Document;
use dom::element::{ElementTypeId, HTMLAudioElementTypeId, HTMLVideoElementTypeId};
use dom::eventtarget::{EventTarget, NodeTargetTypeId};
use dom::htmlelement::HTMLElement;
use dom::node::ElementNodeTypeId;
use servo_util::str::DOMString;
#[deriving(Encodable)]
pub struct HTMLMediaElement {
htmlelement: HTMLElement,
}
impl HTMLMediaElementDerived for EventTarget {
fn is_htmlmediaelement(&self) -> bool {
match self.type_id {
NodeTargetTypeId(ElementNodeTypeId(HTMLVideoElementTypeId)) |
NodeTargetTypeId(ElementNodeTypeId(HTMLAudioElementTypeId)) => true,
_ => false
}
}
}
impl HTMLMediaElement {
pub fn new_inherited(type_id: ElementTypeId, tag_name: DOMString, document: AbstractDocument) -> HTMLMediaElement {
pub fn new_inherited(type_id: ElementTypeId, tag_name: DOMString, document: JS<Document>) -> HTMLMediaElement {
HTMLMediaElement {
htmlelement: HTMLElement::new_inherited(type_id, tag_name, document)
}

View file

@ -3,27 +3,40 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use dom::bindings::codegen::HTMLMetaElementBinding;
use dom::bindings::codegen::InheritTypes::HTMLMetaElementDerived;
use dom::bindings::js::JS;
use dom::bindings::utils::ErrorResult;
use dom::document::AbstractDocument;
use dom::document::Document;
use dom::element::HTMLMetaElementTypeId;
use dom::eventtarget::{EventTarget, NodeTargetTypeId};
use dom::htmlelement::HTMLElement;
use dom::node::{AbstractNode, Node};
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
pub struct HTMLMetaElement {
htmlelement: HTMLElement,
}
impl HTMLMetaElementDerived for EventTarget {
fn is_htmlmetaelement(&self) -> bool {
match self.type_id {
NodeTargetTypeId(ElementNodeTypeId(HTMLMetaElementTypeId)) => true,
_ => false
}
}
}
impl HTMLMetaElement {
pub fn new_inherited(localName: DOMString, document: AbstractDocument) -> HTMLMetaElement {
pub fn new_inherited(localName: DOMString, document: JS<Document>) -> HTMLMetaElement {
HTMLMetaElement {
htmlelement: HTMLElement::new_inherited(HTMLMetaElementTypeId, localName, document)
}
}
pub fn new(localName: DOMString, document: AbstractDocument) -> AbstractNode {
let element = HTMLMetaElement::new_inherited(localName, document);
Node::reflect_node(@mut element, document, HTMLMetaElementBinding::Wrap)
pub fn new(localName: DOMString, document: &JS<Document>) -> JS<HTMLMetaElement> {
let element = HTMLMetaElement::new_inherited(localName, document.clone());
Node::reflect_node(~element, document, HTMLMetaElementBinding::Wrap)
}
}

View file

@ -3,27 +3,40 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use dom::bindings::codegen::HTMLMeterElementBinding;
use dom::bindings::codegen::InheritTypes::HTMLMeterElementDerived;
use dom::bindings::js::JS;
use dom::bindings::utils::ErrorResult;
use dom::document::AbstractDocument;
use dom::document::Document;
use dom::element::HTMLMeterElementTypeId;
use dom::eventtarget::{EventTarget, NodeTargetTypeId};
use dom::htmlelement::HTMLElement;
use dom::node::{AbstractNode, Node};
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
pub struct HTMLMeterElement {
htmlelement: HTMLElement
}
impl HTMLMeterElementDerived for EventTarget {
fn is_htmlmeterelement(&self) -> bool {
match self.type_id {
NodeTargetTypeId(ElementNodeTypeId(HTMLMeterElementTypeId)) => true,
_ => false
}
}
}
impl HTMLMeterElement {
pub fn new_inherited(localName: DOMString, document: AbstractDocument) -> HTMLMeterElement {
pub fn new_inherited(localName: DOMString, document: JS<Document>) -> HTMLMeterElement {
HTMLMeterElement {
htmlelement: HTMLElement::new_inherited(HTMLMeterElementTypeId, localName, document)
}
}
pub fn new(localName: DOMString, document: AbstractDocument) -> AbstractNode {
let element = HTMLMeterElement::new_inherited(localName, document);
Node::reflect_node(@mut element, document, HTMLMeterElementBinding::Wrap)
pub fn new(localName: DOMString, document: &JS<Document>) -> JS<HTMLMeterElement> {
let element = HTMLMeterElement::new_inherited(localName, document.clone());
Node::reflect_node(~element, document, HTMLMeterElementBinding::Wrap)
}
}

View file

@ -3,27 +3,40 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use dom::bindings::codegen::HTMLModElementBinding;
use dom::bindings::codegen::InheritTypes::HTMLModElementDerived;
use dom::bindings::js::JS;
use dom::bindings::utils::ErrorResult;
use dom::document::AbstractDocument;
use dom::document::Document;
use dom::element::HTMLModElementTypeId;
use dom::eventtarget::{EventTarget, NodeTargetTypeId};
use dom::htmlelement::HTMLElement;
use dom::node::{AbstractNode, Node};
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
pub struct HTMLModElement {
htmlelement: HTMLElement
}
impl HTMLModElementDerived for EventTarget {
fn is_htmlmodelement(&self) -> bool {
match self.type_id {
NodeTargetTypeId(ElementNodeTypeId(HTMLModElementTypeId)) => true,
_ => false
}
}
}
impl HTMLModElement {
pub fn new_inherited(localName: DOMString, document: AbstractDocument) -> HTMLModElement {
pub fn new_inherited(localName: DOMString, document: JS<Document>) -> HTMLModElement {
HTMLModElement {
htmlelement: HTMLElement::new_inherited(HTMLModElementTypeId, localName, document)
}
}
pub fn new(localName: DOMString, document: AbstractDocument) -> AbstractNode {
let element = HTMLModElement::new_inherited(localName, document);
Node::reflect_node(@mut element, document, HTMLModElementBinding::Wrap)
pub fn new(localName: DOMString, document: &JS<Document>) -> JS<HTMLModElement> {
let element = HTMLModElement::new_inherited(localName, document.clone());
Node::reflect_node(~element, document, HTMLModElementBinding::Wrap)
}
}

View file

@ -3,11 +3,15 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use dom::bindings::codegen::HTMLObjectElementBinding;
use dom::bindings::codegen::InheritTypes::HTMLObjectElementDerived;
use dom::bindings::js::JS;
use dom::bindings::utils::ErrorResult;
use dom::document::AbstractDocument;
use dom::document::Document;
use dom::element::HTMLObjectElementTypeId;
use dom::eventtarget::{EventTarget, NodeTargetTypeId};
use dom::htmlelement::HTMLElement;
use dom::node::{AbstractNode, Node};
use dom::htmlformelement::HTMLFormElement;
use dom::node::{Node, ElementNodeTypeId};
use dom::validitystate::ValidityState;
use dom::windowproxy::WindowProxy;
use servo_util::str::DOMString;
@ -19,20 +23,30 @@ use servo_util::url::parse_url;
use servo_util::namespace::Null;
use servo_util::url::is_image_data;
#[deriving(Encodable)]
pub struct HTMLObjectElement {
htmlelement: HTMLElement,
}
impl HTMLObjectElementDerived for EventTarget {
fn is_htmlobjectelement(&self) -> bool {
match self.type_id {
NodeTargetTypeId(ElementNodeTypeId(HTMLObjectElementTypeId)) => true,
_ => false
}
}
}
impl HTMLObjectElement {
pub fn new_inherited(localName: DOMString, document: AbstractDocument) -> HTMLObjectElement {
pub fn new_inherited(localName: DOMString, document: JS<Document>) -> HTMLObjectElement {
HTMLObjectElement {
htmlelement: HTMLElement::new_inherited(HTMLObjectElementTypeId, localName, document),
}
}
pub fn new(localName: DOMString, document: AbstractDocument) -> AbstractNode {
let element = HTMLObjectElement::new_inherited(localName, document);
Node::reflect_node(@mut element, document, HTMLObjectElementBinding::Wrap)
pub fn new(localName: DOMString, document: &JS<Document>) -> JS<HTMLObjectElement> {
let element = HTMLObjectElement::new_inherited(localName, document.clone());
Node::reflect_node(~element, document, HTMLObjectElementBinding::Wrap)
}
}
@ -44,8 +58,8 @@ impl HTMLObjectElement {
let elem = &mut self.htmlelement.element;
// TODO: support other values
match (elem.get_attribute(Null, "type").map(|x| x.Value()),
elem.get_attribute(Null, "data").map(|x| x.Value())) {
match (elem.get_attribute(Null, "type").map(|x| x.get().Value()),
elem.get_attribute(Null, "data").map(|x| x.get().Value())) {
(None, Some(uri)) => {
if is_image_data(uri) {
let data_url = parse_url(uri, url);
@ -60,9 +74,9 @@ impl HTMLObjectElement {
pub fn AfterSetAttr(&mut self, name: DOMString, _value: DOMString) {
if "data" == name {
let document = self.htmlelement.element.node.owner_doc();
let window = document.document().window;
let url = window.page.url.as_ref().map(|&(ref url, _)| url.clone());
self.process_data_url(window.image_cache_task.clone(), url);
let window = document.get().window.clone();
let url = window.get().page.url.as_ref().map(|&(ref url, _)| url.clone());
self.process_data_url(window.get().image_cache_task.clone(), url);
}
}
@ -98,7 +112,7 @@ impl HTMLObjectElement {
Ok(())
}
pub fn GetForm(&self) -> Option<AbstractNode> {
pub fn GetForm(&self) -> Option<JS<HTMLFormElement>> {
None
}
@ -118,11 +132,11 @@ impl HTMLObjectElement {
Ok(())
}
pub fn GetContentDocument(&self) -> Option<AbstractDocument> {
pub fn GetContentDocument(&self) -> Option<JS<Document>> {
None
}
pub fn GetContentWindow(&self) -> Option<@mut WindowProxy> {
pub fn GetContentWindow(&self) -> Option<JS<WindowProxy>> {
None
}
@ -130,9 +144,10 @@ impl HTMLObjectElement {
false
}
pub fn Validity(&self) -> @mut ValidityState {
let global = self.htmlelement.element.node.owner_doc().document().window;
ValidityState::new(global)
pub fn Validity(&self) -> JS<ValidityState> {
let doc = self.htmlelement.element.node.owner_doc();
let doc = doc.get();
ValidityState::new(&doc.window)
}
pub fn ValidationMessage(&self) -> DOMString {
@ -226,7 +241,7 @@ impl HTMLObjectElement {
Ok(())
}
pub fn GetSVGDocument(&self) -> Option<AbstractDocument> {
pub fn GetSVGDocument(&self) -> Option<JS<Document>> {
None
}
}

View file

@ -3,27 +3,40 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use dom::bindings::codegen::HTMLOListElementBinding;
use dom::bindings::codegen::InheritTypes::HTMLOListElementDerived;
use dom::bindings::js::JS;
use dom::bindings::utils::ErrorResult;
use dom::document::AbstractDocument;
use dom::document::Document;
use dom::element::HTMLOListElementTypeId;
use dom::eventtarget::{EventTarget, NodeTargetTypeId};
use dom::htmlelement::HTMLElement;
use dom::node::{AbstractNode, Node};
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
pub struct HTMLOListElement {
htmlelement: HTMLElement,
}
impl HTMLOListElementDerived for EventTarget {
fn is_htmlolistelement(&self) -> bool {
match self.type_id {
NodeTargetTypeId(ElementNodeTypeId(HTMLOListElementTypeId)) => true,
_ => false
}
}
}
impl HTMLOListElement {
pub fn new_inherited(localName: DOMString, document: AbstractDocument) -> HTMLOListElement {
pub fn new_inherited(localName: DOMString, document: JS<Document>) -> HTMLOListElement {
HTMLOListElement {
htmlelement: HTMLElement::new_inherited(HTMLOListElementTypeId, localName, document)
}
}
pub fn new(localName: DOMString, document: AbstractDocument) -> AbstractNode {
let element = HTMLOListElement::new_inherited(localName, document);
Node::reflect_node(@mut element, document, HTMLOListElementBinding::Wrap)
pub fn new(localName: DOMString, document: &JS<Document>) -> JS<HTMLOListElement> {
let element = HTMLOListElement::new_inherited(localName, document.clone());
Node::reflect_node(~element, document, HTMLOListElementBinding::Wrap)
}
}

View file

@ -3,27 +3,40 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use dom::bindings::codegen::HTMLOptGroupElementBinding;
use dom::bindings::codegen::InheritTypes::HTMLOptGroupElementDerived;
use dom::bindings::js::JS;
use dom::bindings::utils::ErrorResult;
use dom::document::AbstractDocument;
use dom::document::Document;
use dom::element::HTMLOptGroupElementTypeId;
use dom::eventtarget::{EventTarget, NodeTargetTypeId};
use dom::htmlelement::HTMLElement;
use dom::node::{AbstractNode, Node};
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
pub struct HTMLOptGroupElement {
htmlelement: HTMLElement
}
impl HTMLOptGroupElementDerived for EventTarget {
fn is_htmloptgroupelement(&self) -> bool {
match self.type_id {
NodeTargetTypeId(ElementNodeTypeId(HTMLOptGroupElementTypeId)) => true,
_ => false
}
}
}
impl HTMLOptGroupElement {
pub fn new_inherited(localName: DOMString, document: AbstractDocument) -> HTMLOptGroupElement {
pub fn new_inherited(localName: DOMString, document: JS<Document>) -> HTMLOptGroupElement {
HTMLOptGroupElement {
htmlelement: HTMLElement::new_inherited(HTMLOptGroupElementTypeId, localName, document)
}
}
pub fn new(localName: DOMString, document: AbstractDocument) -> AbstractNode {
let element = HTMLOptGroupElement::new_inherited(localName, document);
Node::reflect_node(@mut element, document, HTMLOptGroupElementBinding::Wrap)
pub fn new(localName: DOMString, document: &JS<Document>) -> JS<HTMLOptGroupElement> {
let element = HTMLOptGroupElement::new_inherited(localName, document.clone());
Node::reflect_node(~element, document, HTMLOptGroupElementBinding::Wrap)
}
}

View file

@ -3,27 +3,41 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use dom::bindings::codegen::HTMLOptionElementBinding;
use dom::bindings::codegen::InheritTypes::HTMLOptionElementDerived;
use dom::bindings::js::JS;
use dom::bindings::utils::ErrorResult;
use dom::document::AbstractDocument;
use dom::document::Document;
use dom::element::HTMLOptionElementTypeId;
use dom::eventtarget::{EventTarget, NodeTargetTypeId};
use dom::htmlelement::HTMLElement;
use dom::node::{AbstractNode, Node};
use dom::htmlformelement::HTMLFormElement;
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
pub struct HTMLOptionElement {
htmlelement: HTMLElement
}
impl HTMLOptionElementDerived for EventTarget {
fn is_htmloptionelement(&self) -> bool {
match self.type_id {
NodeTargetTypeId(ElementNodeTypeId(HTMLOptionElementTypeId)) => true,
_ => false
}
}
}
impl HTMLOptionElement {
pub fn new_inherited(localName: DOMString, document: AbstractDocument) -> HTMLOptionElement {
pub fn new_inherited(localName: DOMString, document: JS<Document>) -> HTMLOptionElement {
HTMLOptionElement {
htmlelement: HTMLElement::new_inherited(HTMLOptionElementTypeId, localName, document)
}
}
pub fn new(localName: DOMString, document: AbstractDocument) -> AbstractNode {
let element = HTMLOptionElement::new_inherited(localName, document);
Node::reflect_node(@mut element, document, HTMLOptionElementBinding::Wrap)
pub fn new(localName: DOMString, document: &JS<Document>) -> JS<HTMLOptionElement> {
let element = HTMLOptionElement::new_inherited(localName, document.clone());
Node::reflect_node(~element, document, HTMLOptionElementBinding::Wrap)
}
}
@ -36,7 +50,7 @@ impl HTMLOptionElement {
Ok(())
}
pub fn GetForm(&self) -> Option<AbstractNode> {
pub fn GetForm(&self) -> Option<JS<HTMLFormElement>> {
None
}

View file

@ -3,33 +3,47 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use dom::bindings::codegen::HTMLOutputElementBinding;
use dom::bindings::codegen::InheritTypes::HTMLOutputElementDerived;
use dom::bindings::js::JS;
use dom::bindings::utils::ErrorResult;
use dom::document::AbstractDocument;
use dom::document::Document;
use dom::element::HTMLOutputElementTypeId;
use dom::eventtarget::{EventTarget, NodeTargetTypeId};
use dom::htmlelement::HTMLElement;
use dom::node::{AbstractNode, Node};
use dom::htmlformelement::HTMLFormElement;
use dom::node::{Node, ElementNodeTypeId};
use dom::validitystate::ValidityState;
use servo_util::str::DOMString;
#[deriving(Encodable)]
pub struct HTMLOutputElement {
htmlelement: HTMLElement
}
impl HTMLOutputElementDerived for EventTarget {
fn is_htmloutputelement(&self) -> bool {
match self.type_id {
NodeTargetTypeId(ElementNodeTypeId(HTMLOutputElementTypeId)) => true,
_ => false
}
}
}
impl HTMLOutputElement {
pub fn new_inherited(localName: DOMString, document: AbstractDocument) -> HTMLOutputElement {
pub fn new_inherited(localName: DOMString, document: JS<Document>) -> HTMLOutputElement {
HTMLOutputElement {
htmlelement: HTMLElement::new_inherited(HTMLOutputElementTypeId, localName, document)
}
}
pub fn new(localName: DOMString, document: AbstractDocument) -> AbstractNode {
let element = HTMLOutputElement::new_inherited(localName, document);
Node::reflect_node(@mut element, document, HTMLOutputElementBinding::Wrap)
pub fn new(localName: DOMString, document: &JS<Document>) -> JS<HTMLOutputElement> {
let element = HTMLOutputElement::new_inherited(localName, document.clone());
Node::reflect_node(~element, document, HTMLOutputElementBinding::Wrap)
}
}
impl HTMLOutputElement {
pub fn GetForm(&self) -> Option<AbstractNode> {
pub fn GetForm(&self) -> Option<JS<HTMLFormElement>> {
None
}
@ -68,12 +82,13 @@ impl HTMLOutputElement {
pub fn SetWillValidate(&mut self, _will_validate: bool) {
}
pub fn Validity(&self) -> @mut ValidityState {
let global = self.htmlelement.element.node.owner_doc().document().window;
ValidityState::new(global)
pub fn Validity(&self) -> JS<ValidityState> {
let doc = self.htmlelement.element.node.owner_doc();
let doc = doc.get();
ValidityState::new(&doc.window)
}
pub fn SetValidity(&mut self, _validity: @mut ValidityState) {
pub fn SetValidity(&mut self, _validity: JS<ValidityState>) {
}
pub fn ValidationMessage(&self) -> DOMString {

View file

@ -3,27 +3,40 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use dom::bindings::codegen::HTMLParagraphElementBinding;
use dom::bindings::codegen::InheritTypes::HTMLParagraphElementDerived;
use dom::bindings::js::JS;
use dom::bindings::utils::ErrorResult;
use dom::document::AbstractDocument;
use dom::document::Document;
use dom::element::HTMLParagraphElementTypeId;
use dom::eventtarget::{EventTarget, NodeTargetTypeId};
use dom::htmlelement::HTMLElement;
use dom::node::{AbstractNode, Node};
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
pub struct HTMLParagraphElement {
htmlelement: HTMLElement
}
impl HTMLParagraphElementDerived for EventTarget {
fn is_htmlparagraphelement(&self) -> bool {
match self.type_id {
NodeTargetTypeId(ElementNodeTypeId(HTMLParagraphElementTypeId)) => true,
_ => false
}
}
}
impl HTMLParagraphElement {
pub fn new_inherited(localName: DOMString, document: AbstractDocument) -> HTMLParagraphElement {
pub fn new_inherited(localName: DOMString, document: JS<Document>) -> HTMLParagraphElement {
HTMLParagraphElement {
htmlelement: HTMLElement::new_inherited(HTMLParagraphElementTypeId, localName, document)
}
}
pub fn new(localName: DOMString, document: AbstractDocument) -> AbstractNode {
let element = HTMLParagraphElement::new_inherited(localName, document);
Node::reflect_node(@mut element, document, HTMLParagraphElementBinding::Wrap)
pub fn new(localName: DOMString, document: &JS<Document>) -> JS<HTMLParagraphElement> {
let element = HTMLParagraphElement::new_inherited(localName, document.clone());
Node::reflect_node(~element, document, HTMLParagraphElementBinding::Wrap)
}
}

View file

@ -3,27 +3,40 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use dom::bindings::codegen::HTMLParamElementBinding;
use dom::bindings::codegen::InheritTypes::HTMLParamElementDerived;
use dom::bindings::js::JS;
use dom::bindings::utils::ErrorResult;
use dom::document::AbstractDocument;
use dom::document::Document;
use dom::element::HTMLParamElementTypeId;
use dom::eventtarget::{EventTarget, NodeTargetTypeId};
use dom::htmlelement::HTMLElement;
use dom::node::{AbstractNode, Node};
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
pub struct HTMLParamElement {
htmlelement: HTMLElement
}
impl HTMLParamElementDerived for EventTarget {
fn is_htmlparamelement(&self) -> bool {
match self.type_id {
NodeTargetTypeId(ElementNodeTypeId(HTMLParamElementTypeId)) => true,
_ => false
}
}
}
impl HTMLParamElement {
pub fn new_inherited(localName: DOMString, document: AbstractDocument) -> HTMLParamElement {
pub fn new_inherited(localName: DOMString, document: JS<Document>) -> HTMLParamElement {
HTMLParamElement {
htmlelement: HTMLElement::new_inherited(HTMLParamElementTypeId, localName, document)
}
}
pub fn new(localName: DOMString, document: AbstractDocument) -> AbstractNode {
let element = HTMLParamElement::new_inherited(localName, document);
Node::reflect_node(@mut element, document, HTMLParamElementBinding::Wrap)
pub fn new(localName: DOMString, document: &JS<Document>) -> JS<HTMLParamElement> {
let element = HTMLParamElement::new_inherited(localName, document.clone());
Node::reflect_node(~element, document, HTMLParamElementBinding::Wrap)
}
}

View file

@ -3,27 +3,40 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use dom::bindings::codegen::HTMLPreElementBinding;
use dom::bindings::codegen::InheritTypes::HTMLPreElementDerived;
use dom::bindings::js::JS;
use dom::bindings::utils::{ErrorResult};
use dom::document::AbstractDocument;
use dom::document::Document;
use dom::element::HTMLPreElementTypeId;
use dom::eventtarget::{EventTarget, NodeTargetTypeId};
use dom::htmlelement::HTMLElement;
use dom::node::{AbstractNode, Node};
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
pub struct HTMLPreElement {
htmlelement: HTMLElement,
}
impl HTMLPreElementDerived for EventTarget {
fn is_htmlpreelement(&self) -> bool {
match self.type_id {
NodeTargetTypeId(ElementNodeTypeId(HTMLPreElementTypeId)) => true,
_ => false
}
}
}
impl HTMLPreElement {
pub fn new_inherited(localName: DOMString, document: AbstractDocument) -> HTMLPreElement {
pub fn new_inherited(localName: DOMString, document: JS<Document>) -> HTMLPreElement {
HTMLPreElement {
htmlelement: HTMLElement::new_inherited(HTMLPreElementTypeId, localName, document)
}
}
pub fn new(localName: DOMString, document: AbstractDocument) -> AbstractNode {
let element = HTMLPreElement::new_inherited(localName, document);
Node::reflect_node(@mut element, document, HTMLPreElementBinding::Wrap)
pub fn new(localName: DOMString, document: &JS<Document>) -> JS<HTMLPreElement> {
let element = HTMLPreElement::new_inherited(localName, document.clone());
Node::reflect_node(~element, document, HTMLPreElementBinding::Wrap)
}
}

View file

@ -3,27 +3,40 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use dom::bindings::codegen::HTMLProgressElementBinding;
use dom::bindings::codegen::InheritTypes::HTMLProgressElementDerived;
use dom::bindings::js::JS;
use dom::bindings::utils::{ErrorResult, Fallible};
use dom::document::AbstractDocument;
use dom::document::Document;
use dom::element::HTMLProgressElementTypeId;
use dom::eventtarget::{EventTarget, NodeTargetTypeId};
use dom::htmlelement::HTMLElement;
use dom::node::{AbstractNode, Node};
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
pub struct HTMLProgressElement {
htmlelement: HTMLElement,
}
impl HTMLProgressElementDerived for EventTarget {
fn is_htmlprogresselement(&self) -> bool {
match self.type_id {
NodeTargetTypeId(ElementNodeTypeId(HTMLProgressElementTypeId)) => true,
_ => false
}
}
}
impl HTMLProgressElement {
pub fn new_inherited(localName: DOMString, document: AbstractDocument) -> HTMLProgressElement {
pub fn new_inherited(localName: DOMString, document: JS<Document>) -> HTMLProgressElement {
HTMLProgressElement {
htmlelement: HTMLElement::new_inherited(HTMLProgressElementTypeId, localName, document)
}
}
pub fn new(localName: DOMString, document: AbstractDocument) -> AbstractNode {
let element = HTMLProgressElement::new_inherited(localName, document);
Node::reflect_node(@mut element, document, HTMLProgressElementBinding::Wrap)
pub fn new(localName: DOMString, document: &JS<Document>) -> JS<HTMLProgressElement> {
let element = HTMLProgressElement::new_inherited(localName, document.clone());
Node::reflect_node(~element, document, HTMLProgressElementBinding::Wrap)
}
}

View file

@ -3,27 +3,40 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use dom::bindings::codegen::HTMLQuoteElementBinding;
use dom::bindings::codegen::InheritTypes::HTMLQuoteElementDerived;
use dom::bindings::js::JS;
use dom::bindings::utils::ErrorResult;
use dom::document::AbstractDocument;
use dom::document::Document;
use dom::element::HTMLQuoteElementTypeId;
use dom::eventtarget::{EventTarget, NodeTargetTypeId};
use dom::htmlelement::HTMLElement;
use dom::node::{AbstractNode, Node};
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
pub struct HTMLQuoteElement {
htmlelement: HTMLElement,
}
impl HTMLQuoteElementDerived for EventTarget {
fn is_htmlquoteelement(&self) -> bool {
match self.type_id {
NodeTargetTypeId(ElementNodeTypeId(HTMLQuoteElementTypeId)) => true,
_ => false
}
}
}
impl HTMLQuoteElement {
pub fn new_inherited(localName: DOMString, document: AbstractDocument) -> HTMLQuoteElement {
pub fn new_inherited(localName: DOMString, document: JS<Document>) -> HTMLQuoteElement {
HTMLQuoteElement {
htmlelement: HTMLElement::new_inherited(HTMLQuoteElementTypeId, localName, document)
}
}
pub fn new(localName: DOMString, document: AbstractDocument) -> AbstractNode {
let element = HTMLQuoteElement::new_inherited(localName, document);
Node::reflect_node(@mut element, document, HTMLQuoteElementBinding::Wrap)
pub fn new(localName: DOMString, document: &JS<Document>) -> JS<HTMLQuoteElement> {
let element = HTMLQuoteElement::new_inherited(localName, document.clone());
Node::reflect_node(~element, document, HTMLQuoteElementBinding::Wrap)
}
}

View file

@ -3,27 +3,40 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use dom::bindings::codegen::HTMLScriptElementBinding;
use dom::bindings::codegen::InheritTypes::HTMLScriptElementDerived;
use dom::bindings::js::JS;
use dom::bindings::utils::ErrorResult;
use dom::document::AbstractDocument;
use dom::document::Document;
use dom::element::HTMLScriptElementTypeId;
use dom::eventtarget::{EventTarget, NodeTargetTypeId};
use dom::htmlelement::HTMLElement;
use dom::node::{AbstractNode, Node};
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
pub struct HTMLScriptElement {
htmlelement: HTMLElement,
}
impl HTMLScriptElementDerived for EventTarget {
fn is_htmlscriptelement(&self) -> bool {
match self.type_id {
NodeTargetTypeId(ElementNodeTypeId(HTMLScriptElementTypeId)) => true,
_ => false
}
}
}
impl HTMLScriptElement {
pub fn new_inherited(localName: DOMString, document: AbstractDocument) -> HTMLScriptElement {
pub fn new_inherited(localName: DOMString, document: JS<Document>) -> HTMLScriptElement {
HTMLScriptElement {
htmlelement: HTMLElement::new_inherited(HTMLScriptElementTypeId, localName, document)
}
}
pub fn new(localName: DOMString, document: AbstractDocument) -> AbstractNode {
let element = HTMLScriptElement::new_inherited(localName, document);
Node::reflect_node(@mut element, document, HTMLScriptElementBinding::Wrap)
pub fn new(localName: DOMString, document: &JS<Document>) -> JS<HTMLScriptElement> {
let element = HTMLScriptElement::new_inherited(localName, document.clone());
Node::reflect_node(~element, document, HTMLScriptElementBinding::Wrap)
}
}

View file

@ -3,28 +3,44 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use dom::bindings::codegen::HTMLSelectElementBinding;
use dom::bindings::codegen::InheritTypes::HTMLSelectElementDerived;
use dom::bindings::codegen::UnionTypes::{HTMLElementOrLong, HTMLOptionElementOrHTMLOptGroupElement};
use dom::bindings::js::JS;
use dom::bindings::utils::ErrorResult;
use dom::document::AbstractDocument;
use dom::element::HTMLSelectElementTypeId;
use dom::document::Document;
use dom::element::{Element, HTMLSelectElementTypeId};
use dom::eventtarget::{EventTarget, NodeTargetTypeId};
use dom::htmlelement::HTMLElement;
use dom::node::{AbstractNode, Node};
use dom::htmlformelement::HTMLFormElement;
use dom::node::{Node, ElementNodeTypeId};
use dom::htmloptionelement::HTMLOptionElement;
use dom::validitystate::ValidityState;
use servo_util::str::DOMString;
#[deriving(Encodable)]
pub struct HTMLSelectElement {
htmlelement: HTMLElement
}
impl HTMLSelectElementDerived for EventTarget {
fn is_htmlselectelement(&self) -> bool {
match self.type_id {
NodeTargetTypeId(ElementNodeTypeId(HTMLSelectElementTypeId)) => true,
_ => false
}
}
}
impl HTMLSelectElement {
pub fn new_inherited(localName: DOMString, document: AbstractDocument) -> HTMLSelectElement {
pub fn new_inherited(localName: DOMString, document: JS<Document>) -> HTMLSelectElement {
HTMLSelectElement {
htmlelement: HTMLElement::new_inherited(HTMLSelectElementTypeId, localName, document)
}
}
pub fn new(localName: DOMString, document: AbstractDocument) -> AbstractNode {
let element = HTMLSelectElement::new_inherited(localName, document);
Node::reflect_node(@mut element, document, HTMLSelectElementBinding::Wrap)
pub fn new(localName: DOMString, document: &JS<Document>) -> JS<HTMLSelectElement> {
let element = HTMLSelectElement::new_inherited(localName, document.clone());
Node::reflect_node(~element, document, HTMLSelectElementBinding::Wrap)
}
}
@ -45,7 +61,7 @@ impl HTMLSelectElement {
Ok(())
}
pub fn GetForm(&self) -> Option<AbstractNode> {
pub fn GetForm(&self) -> Option<JS<HTMLFormElement>> {
None
}
@ -93,19 +109,19 @@ impl HTMLSelectElement {
Ok(())
}
pub fn Item(&self, _index: u32) -> Option<AbstractNode> {
pub fn Item(&self, _index: u32) -> Option<JS<Element>> {
None
}
pub fn NamedItem(&self, _name: DOMString) -> Option<AbstractNode> {
pub fn NamedItem(&self, _name: DOMString) -> Option<JS<HTMLOptionElement>> {
None
}
pub fn IndexedGetter(&self, _index: u32, _found: &mut bool) -> Option<AbstractNode> {
pub fn IndexedGetter(&self, _index: u32, _found: &mut bool) -> Option<JS<Element>> {
None
}
pub fn IndexedSetter(&mut self, _index: u32, _option: Option<AbstractNode>) -> ErrorResult {
pub fn IndexedSetter(&mut self, _index: u32, _option: Option<JS<HTMLOptionElement>>) -> ErrorResult {
Ok(())
}
@ -137,12 +153,13 @@ impl HTMLSelectElement {
pub fn SetWillValidate(&mut self, _will_validate: bool) {
}
pub fn Validity(&self) -> @mut ValidityState {
let global = self.htmlelement.element.node.owner_doc().document().window;
ValidityState::new(global)
pub fn Validity(&self) -> JS<ValidityState> {
let doc = self.htmlelement.element.node.owner_doc();
let doc = doc.get();
ValidityState::new(&doc.window)
}
pub fn SetValidity(&mut self, _validity: @mut ValidityState) {
pub fn SetValidity(&mut self, _validity: JS<ValidityState>) {
}
pub fn ValidationMessage(&self) -> DOMString {
@ -159,4 +176,8 @@ impl HTMLSelectElement {
pub fn SetCustomValidity(&mut self, _error: DOMString) {
}
pub fn Add(&self, _element: HTMLOptionElementOrHTMLOptGroupElement, _before: Option<HTMLElementOrLong>) -> ErrorResult {
Ok(())
}
}

View file

@ -4,10 +4,20 @@
use servo_util::namespace;
use dom::attr::Attr;
use dom::bindings::codegen::InheritTypes::{ElementCast, TextCast, CommentCast};
use dom::bindings::codegen::InheritTypes::{DocumentTypeCast, CharacterDataCast};
use dom::bindings::codegen::InheritTypes::ProcessingInstructionCast;
use dom::bindings::js::JS;
use dom::characterdata::CharacterData;
use dom::comment::Comment;
use dom::documenttype::DocumentType;
use dom::element::Element;
use dom::node::NodeIterator;
use dom::node::{DoctypeNodeTypeId, DocumentFragmentNodeTypeId, CommentNodeTypeId};
use dom::node::{DocumentNodeTypeId, ElementNodeTypeId, ProcessingInstructionNodeTypeId};
use dom::node::{TextNodeTypeId, AbstractNode};
use dom::node::{TextNodeTypeId, NodeHelpers};
use dom::processinginstruction::ProcessingInstruction;
use dom::text::Text;
pub fn serialize(iterator: &mut NodeIterator) -> ~str {
let mut html = ~"";
@ -20,28 +30,33 @@ pub fn serialize(iterator: &mut NodeIterator) -> ~str {
html.push_str(
match node.type_id() {
ElementNodeTypeId(..) => {
serialize_elem(node, &mut open_elements)
let elem: JS<Element> = ElementCast::to(&node);
serialize_elem(&elem, &mut open_elements)
}
CommentNodeTypeId => {
serialize_comment(node)
let comment: JS<Comment> = CommentCast::to(&node);
serialize_comment(&comment)
}
TextNodeTypeId => {
serialize_text(node)
let text: JS<Text> = TextCast::to(&node);
serialize_text(&text)
}
DoctypeNodeTypeId => {
serialize_doctype(node)
let doctype: JS<DocumentType> = DocumentTypeCast::to(&node);
serialize_doctype(&doctype)
}
ProcessingInstructionNodeTypeId => {
serialize_processing_instruction(node)
let processing_instruction: JS<ProcessingInstruction> = ProcessingInstructionCast::to(&node);
serialize_processing_instruction(&processing_instruction)
}
DocumentFragmentNodeTypeId => {
~""
}
DocumentNodeTypeId(_) => {
DocumentNodeTypeId => {
fail!("It shouldn't be possible to serialize a document node")
}
}
);
);
}
while open_elements.len() > 0 {
html.push_str(~"</" + open_elements.pop() + ">");
@ -49,88 +64,75 @@ pub fn serialize(iterator: &mut NodeIterator) -> ~str {
html
}
fn serialize_comment(node: AbstractNode) -> ~str {
node.with_imm_characterdata(|comment| {
~"<!--" + comment.data + "-->"
})
fn serialize_comment(comment: &JS<Comment>) -> ~str {
~"<!--" + comment.get().characterdata.data + "-->"
}
fn serialize_text(node: AbstractNode) -> ~str {
node.with_imm_characterdata(|text| {
match node.parent_node() {
Some(parent) if parent.is_element() => {
parent.with_imm_element(|elem| {
match elem.tag_name.as_slice() {
"style" | "script" | "xmp" | "iframe" |
"noembed" | "noframes" | "plaintext" |
"noscript" if elem.namespace == namespace::HTML => {
text.data.clone()
},
_ => escape(text.data, false)
}
})
},
_ => escape(text.data, false)
fn serialize_text(text: &JS<Text>) -> ~str {
match text.get().characterdata.node.parent_node {
Some(ref parent) if parent.is_element() => {
let elem: JS<Element> = ElementCast::to(parent);
match elem.get().tag_name.as_slice() {
"style" | "script" | "xmp" | "iframe" |
"noembed" | "noframes" | "plaintext" |
"noscript" if elem.get().namespace == namespace::HTML => {
text.get().characterdata.data.clone()
},
_ => escape(text.get().characterdata.data, false)
}
}
})
_ => escape(text.get().characterdata.data, false)
}
}
fn serialize_processing_instruction(node: AbstractNode) -> ~str {
node.with_imm_processing_instruction(|processing_instruction| {
~"<?" + processing_instruction.target + " " + processing_instruction.characterdata.data + "?>"
})
fn serialize_processing_instruction(processing_instruction: &JS<ProcessingInstruction>) -> ~str {
~"<?" + processing_instruction.get().target + " " + processing_instruction.get().characterdata.data + "?>"
}
fn serialize_doctype(node: AbstractNode) -> ~str {
node.with_imm_doctype(|doctype| {
~"<!DOCTYPE" + doctype.name + ">"
})
fn serialize_doctype(doctype: &JS<DocumentType>) -> ~str {
~"<!DOCTYPE" + doctype.get().name + ">"
}
fn serialize_elem(node: AbstractNode, open_elements: &mut ~[~str]) -> ~str {
node.with_imm_element(|elem| {
let mut rv = ~"<" + elem.tag_name;
for attr in elem.attrs.iter() {
rv.push_str(serialize_attr(attr));
};
rv.push_str(">");
match elem.tag_name.as_slice() {
"pre" | "listing" | "textarea" if
elem.namespace == namespace::HTML => {
match node.first_child() {
Some(child) if child.is_text() => {
child.with_imm_characterdata(|text| {
if text.data[0] == 0x0A as u8 {
rv.push_str("\x0A");
}
})
},
_ => {}
}
},
_ => {}
}
if !elem.is_void() {
open_elements.push(elem.tag_name.clone());
}
rv
})
}
fn serialize_attr(attr: &@mut Attr) -> ~str {
let attr_name = if attr.namespace == namespace::XML {
~"xml:" + attr.local_name.clone()
} else if attr.namespace == namespace::XMLNS &&
attr.local_name.as_slice() == "xmlns" {
~"xmlns"
} else if attr.namespace == namespace::XMLNS {
~"xmlns:" + attr.local_name.clone()
} else if attr.namespace == namespace::XLink {
~"xlink:" + attr.local_name.clone()
} else {
attr.name.clone()
fn serialize_elem(elem: &JS<Element>, open_elements: &mut ~[~str]) -> ~str {
let mut rv = ~"<" + elem.get().tag_name;
for attr in elem.get().attrs.iter() {
rv.push_str(serialize_attr(attr));
};
~" " + attr_name + "=\"" + escape(attr.value, true) + "\""
rv.push_str(">");
match elem.get().tag_name.as_slice() {
"pre" | "listing" | "textarea" if elem.get().namespace == namespace::HTML => {
match elem.get().node.first_child {
Some(ref child) if child.is_text() => {
let text: JS<CharacterData> = CharacterDataCast::to(child);
if text.get().data[0] == 0x0A as u8 {
rv.push_str("\x0A");
}
},
_ => {}
}
},
_ => {}
}
if !elem.get().is_void() {
open_elements.push(elem.get().tag_name.clone());
}
rv
}
fn serialize_attr(attr: &JS<Attr>) -> ~str {
let attr_name = if attr.get().namespace == namespace::XML {
~"xml:" + attr.get().local_name.clone()
} else if attr.get().namespace == namespace::XMLNS &&
attr.get().local_name.as_slice() == "xmlns" {
~"xmlns"
} else if attr.get().namespace == namespace::XMLNS {
~"xmlns:" + attr.get().local_name.clone()
} else if attr.get().namespace == namespace::XLink {
~"xlink:" + attr.get().local_name.clone()
} else {
attr.get().name.clone()
};
~" " + attr_name + "=\"" + escape(attr.get().value, true) + "\""
}
fn escape(string: &str, attr_mode: bool) -> ~str {

View file

@ -3,27 +3,40 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use dom::bindings::codegen::HTMLSourceElementBinding;
use dom::bindings::codegen::InheritTypes::HTMLSourceElementDerived;
use dom::bindings::js::JS;
use dom::bindings::utils::ErrorResult;
use dom::document::AbstractDocument;
use dom::document::Document;
use dom::element::HTMLSourceElementTypeId;
use dom::eventtarget::{EventTarget, NodeTargetTypeId};
use dom::htmlelement::HTMLElement;
use dom::node::{AbstractNode, Node};
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
pub struct HTMLSourceElement {
htmlelement: HTMLElement
}
impl HTMLSourceElementDerived for EventTarget {
fn is_htmlsourceelement(&self) -> bool {
match self.type_id {
NodeTargetTypeId(ElementNodeTypeId(HTMLSourceElementTypeId)) => true,
_ => false
}
}
}
impl HTMLSourceElement {
pub fn new_inherited(localName: DOMString, document: AbstractDocument) -> HTMLSourceElement {
pub fn new_inherited(localName: DOMString, document: JS<Document>) -> HTMLSourceElement {
HTMLSourceElement {
htmlelement: HTMLElement::new_inherited(HTMLSourceElementTypeId, localName, document)
}
}
pub fn new(localName: DOMString, document: AbstractDocument) -> AbstractNode {
let element = HTMLSourceElement::new_inherited(localName, document);
Node::reflect_node(@mut element, document, HTMLSourceElementBinding::Wrap)
pub fn new(localName: DOMString, document: &JS<Document>) -> JS<HTMLSourceElement> {
let element = HTMLSourceElement::new_inherited(localName, document.clone());
Node::reflect_node(~element, document, HTMLSourceElementBinding::Wrap)
}
}

View file

@ -3,25 +3,38 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use dom::bindings::codegen::HTMLSpanElementBinding;
use dom::document::AbstractDocument;
use dom::bindings::codegen::InheritTypes::HTMLSpanElementDerived;
use dom::bindings::js::JS;
use dom::document::Document;
use dom::element::HTMLSpanElementTypeId;
use dom::eventtarget::{EventTarget, NodeTargetTypeId};
use dom::htmlelement::HTMLElement;
use dom::node::{AbstractNode, Node};
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
pub struct HTMLSpanElement {
htmlelement: HTMLElement
}
impl HTMLSpanElementDerived for EventTarget {
fn is_htmlspanelement(&self) -> bool {
match self.type_id {
NodeTargetTypeId(ElementNodeTypeId(HTMLSpanElementTypeId)) => true,
_ => false
}
}
}
impl HTMLSpanElement {
pub fn new_inherited(localName: DOMString, document: AbstractDocument) -> HTMLSpanElement {
pub fn new_inherited(localName: DOMString, document: JS<Document>) -> HTMLSpanElement {
HTMLSpanElement {
htmlelement: HTMLElement::new_inherited(HTMLSpanElementTypeId, localName, document)
}
}
pub fn new(localName: DOMString, document: AbstractDocument) -> AbstractNode {
let element = HTMLSpanElement::new_inherited(localName, document);
Node::reflect_node(@mut element, document, HTMLSpanElementBinding::Wrap)
pub fn new(localName: DOMString, document: &JS<Document>) -> JS<HTMLSpanElement> {
let element = HTMLSpanElement::new_inherited(localName, document.clone());
Node::reflect_node(~element, document, HTMLSpanElementBinding::Wrap)
}
}

View file

@ -3,27 +3,40 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use dom::bindings::codegen::HTMLStyleElementBinding;
use dom::bindings::codegen::InheritTypes::HTMLStyleElementDerived;
use dom::bindings::js::JS;
use dom::bindings::utils::ErrorResult;
use dom::document::AbstractDocument;
use dom::document::Document;
use dom::element::HTMLStyleElementTypeId;
use dom::eventtarget::{EventTarget, NodeTargetTypeId};
use dom::htmlelement::HTMLElement;
use dom::node::{AbstractNode, Node};
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
pub struct HTMLStyleElement {
htmlelement: HTMLElement,
}
impl HTMLStyleElementDerived for EventTarget {
fn is_htmlstyleelement(&self) -> bool {
match self.type_id {
NodeTargetTypeId(ElementNodeTypeId(HTMLStyleElementTypeId)) => true,
_ => false
}
}
}
impl HTMLStyleElement {
pub fn new_inherited(localName: DOMString, document: AbstractDocument) -> HTMLStyleElement {
pub fn new_inherited(localName: DOMString, document: JS<Document>) -> HTMLStyleElement {
HTMLStyleElement {
htmlelement: HTMLElement::new_inherited(HTMLStyleElementTypeId, localName, document)
}
}
pub fn new(localName: DOMString, document: AbstractDocument) -> AbstractNode {
let element = HTMLStyleElement::new_inherited(localName, document);
Node::reflect_node(@mut element, document, HTMLStyleElementBinding::Wrap)
pub fn new(localName: DOMString, document: &JS<Document>) -> JS<HTMLStyleElement> {
let element = HTMLStyleElement::new_inherited(localName, document.clone());
Node::reflect_node(~element, document, HTMLStyleElementBinding::Wrap)
}
}

View file

@ -3,27 +3,40 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use dom::bindings::codegen::HTMLTableCaptionElementBinding;
use dom::bindings::codegen::InheritTypes::HTMLTableCaptionElementDerived;
use dom::bindings::js::JS;
use dom::bindings::utils::ErrorResult;
use dom::document::AbstractDocument;
use dom::document::Document;
use dom::element::HTMLTableCaptionElementTypeId;
use dom::eventtarget::{EventTarget, NodeTargetTypeId};
use dom::htmlelement::HTMLElement;
use dom::node::{AbstractNode, Node};
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
pub struct HTMLTableCaptionElement {
htmlelement: HTMLElement
}
impl HTMLTableCaptionElementDerived for EventTarget {
fn is_htmltablecaptionelement(&self) -> bool {
match self.type_id {
NodeTargetTypeId(ElementNodeTypeId(HTMLTableCaptionElementTypeId)) => true,
_ => false
}
}
}
impl HTMLTableCaptionElement {
pub fn new_inherited(localName: DOMString, document: AbstractDocument) -> HTMLTableCaptionElement {
pub fn new_inherited(localName: DOMString, document: JS<Document>) -> HTMLTableCaptionElement {
HTMLTableCaptionElement {
htmlelement: HTMLElement::new_inherited(HTMLTableCaptionElementTypeId, localName, document)
}
}
pub fn new(localName: DOMString, document: AbstractDocument) -> AbstractNode {
let element = HTMLTableCaptionElement::new_inherited(localName, document);
Node::reflect_node(@mut element, document, HTMLTableCaptionElementBinding::Wrap)
pub fn new(localName: DOMString, document: &JS<Document>) -> JS<HTMLTableCaptionElement> {
let element = HTMLTableCaptionElement::new_inherited(localName, document.clone());
Node::reflect_node(~element, document, HTMLTableCaptionElementBinding::Wrap)
}
}

View file

@ -2,18 +2,33 @@
* 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 dom::bindings::codegen::InheritTypes::HTMLTableCellElementDerived;
use dom::bindings::js::JS;
use dom::bindings::utils::ErrorResult;
use dom::document::AbstractDocument;
use dom::element::ElementTypeId;
use dom::document::Document;
use dom::element::{ElementTypeId, HTMLTableDataCellElementTypeId, HTMLTableHeaderCellElementTypeId};
use dom::eventtarget::{EventTarget, NodeTargetTypeId};
use dom::htmlelement::HTMLElement;
use dom::node::ElementNodeTypeId;
use servo_util::str::DOMString;
#[deriving(Encodable)]
pub struct HTMLTableCellElement {
htmlelement: HTMLElement,
}
impl HTMLTableCellElementDerived for EventTarget {
fn is_htmltablecellelement(&self) -> bool {
match self.type_id {
NodeTargetTypeId(ElementNodeTypeId(HTMLTableDataCellElementTypeId)) |
NodeTargetTypeId(ElementNodeTypeId(HTMLTableHeaderCellElementTypeId)) => true,
_ => false
}
}
}
impl HTMLTableCellElement {
pub fn new_inherited(type_id: ElementTypeId, tag_name: DOMString, document: AbstractDocument) -> HTMLTableCellElement {
pub fn new_inherited(type_id: ElementTypeId, tag_name: DOMString, document: JS<Document>) -> HTMLTableCellElement {
HTMLTableCellElement {
htmlelement: HTMLElement::new_inherited(type_id, tag_name, document)
}

View file

@ -3,27 +3,40 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use dom::bindings::codegen::HTMLTableColElementBinding;
use dom::bindings::codegen::InheritTypes::HTMLTableColElementDerived;
use dom::bindings::js::JS;
use dom::bindings::utils::ErrorResult;
use dom::document::AbstractDocument;
use dom::document::Document;
use dom::element::HTMLTableColElementTypeId;
use dom::eventtarget::{EventTarget, NodeTargetTypeId};
use dom::htmlelement::HTMLElement;
use dom::node::{AbstractNode, Node};
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
pub struct HTMLTableColElement {
htmlelement: HTMLElement,
}
impl HTMLTableColElementDerived for EventTarget {
fn is_htmltablecolelement(&self) -> bool {
match self.type_id {
NodeTargetTypeId(ElementNodeTypeId(HTMLTableColElementTypeId)) => true,
_ => false
}
}
}
impl HTMLTableColElement {
pub fn new_inherited(localName: DOMString, document: AbstractDocument) -> HTMLTableColElement {
pub fn new_inherited(localName: DOMString, document: JS<Document>) -> HTMLTableColElement {
HTMLTableColElement {
htmlelement: HTMLElement::new_inherited(HTMLTableColElementTypeId, localName, document)
}
}
pub fn new(localName: DOMString, document: AbstractDocument) -> AbstractNode {
let element = HTMLTableColElement::new_inherited(localName, document);
Node::reflect_node(@mut element, document, HTMLTableColElementBinding::Wrap)
pub fn new(localName: DOMString, document: &JS<Document>) -> JS<HTMLTableColElement> {
let element = HTMLTableColElement::new_inherited(localName, document.clone());
Node::reflect_node(~element, document, HTMLTableColElementBinding::Wrap)
}
}

View file

@ -3,25 +3,38 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use dom::bindings::codegen::HTMLTableDataCellElementBinding;
use dom::document::AbstractDocument;
use dom::bindings::codegen::InheritTypes::HTMLTableDataCellElementDerived;
use dom::bindings::js::JS;
use dom::document::Document;
use dom::element::HTMLTableDataCellElementTypeId;
use dom::eventtarget::{EventTarget, NodeTargetTypeId};
use dom::htmltablecellelement::HTMLTableCellElement;
use dom::node::{AbstractNode, Node};
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
pub struct HTMLTableDataCellElement {
htmltablecellelement: HTMLTableCellElement,
}
impl HTMLTableDataCellElementDerived for EventTarget {
fn is_htmltabledatacellelement(&self) -> bool {
match self.type_id {
NodeTargetTypeId(ElementNodeTypeId(HTMLTableDataCellElementTypeId)) => true,
_ => false
}
}
}
impl HTMLTableDataCellElement {
pub fn new_inherited(localName: DOMString, document: AbstractDocument) -> HTMLTableDataCellElement {
pub fn new_inherited(localName: DOMString, document: JS<Document>) -> HTMLTableDataCellElement {
HTMLTableDataCellElement {
htmltablecellelement: HTMLTableCellElement::new_inherited(HTMLTableDataCellElementTypeId, localName, document)
}
}
pub fn new(localName: DOMString, document: AbstractDocument) -> AbstractNode {
let element = HTMLTableDataCellElement::new_inherited(localName, document);
Node::reflect_node(@mut element, document, HTMLTableDataCellElementBinding::Wrap)
pub fn new(localName: DOMString, document: &JS<Document>) -> JS<HTMLTableDataCellElement> {
let element = HTMLTableDataCellElement::new_inherited(localName, document.clone());
Node::reflect_node(~element, document, HTMLTableDataCellElementBinding::Wrap)
}
}

View file

@ -3,27 +3,40 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use dom::bindings::codegen::HTMLTableElementBinding;
use dom::bindings::codegen::InheritTypes::HTMLTableElementDerived;
use dom::bindings::js::JS;
use dom::bindings::utils::ErrorResult;
use dom::document::AbstractDocument;
use dom::document::Document;
use dom::element::HTMLTableElementTypeId;
use dom::eventtarget::{EventTarget, NodeTargetTypeId};
use dom::htmlelement::HTMLElement;
use dom::node::{AbstractNode, Node};
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
pub struct HTMLTableElement {
htmlelement: HTMLElement,
}
impl HTMLTableElementDerived for EventTarget {
fn is_htmltableelement(&self) -> bool {
match self.type_id {
NodeTargetTypeId(ElementNodeTypeId(HTMLTableElementTypeId)) => true,
_ => false
}
}
}
impl HTMLTableElement {
pub fn new_inherited(localName: DOMString, document: AbstractDocument) -> HTMLTableElement {
pub fn new_inherited(localName: DOMString, document: JS<Document>) -> HTMLTableElement {
HTMLTableElement {
htmlelement: HTMLElement::new_inherited(HTMLTableElementTypeId, localName, document)
}
}
pub fn new(localName: DOMString, document: AbstractDocument) -> AbstractNode {
let element = HTMLTableElement::new_inherited(localName, document);
Node::reflect_node(@mut element, document, HTMLTableElementBinding::Wrap)
pub fn new(localName: DOMString, document: &JS<Document>) -> JS<HTMLTableElement> {
let element = HTMLTableElement::new_inherited(localName, document.clone());
Node::reflect_node(~element, document, HTMLTableElementBinding::Wrap)
}
}

View file

@ -3,25 +3,38 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use dom::bindings::codegen::HTMLTableHeaderCellElementBinding;
use dom::document::AbstractDocument;
use dom::bindings::codegen::InheritTypes::HTMLTableHeaderCellElementDerived;
use dom::bindings::js::JS;
use dom::document::Document;
use dom::element::HTMLTableHeaderCellElementTypeId;
use dom::eventtarget::{EventTarget, NodeTargetTypeId};
use dom::htmltablecellelement::HTMLTableCellElement;
use dom::node::{AbstractNode, Node};
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
pub struct HTMLTableHeaderCellElement {
htmltablecellelement: HTMLTableCellElement,
}
impl HTMLTableHeaderCellElementDerived for EventTarget {
fn is_htmltableheadercellelement(&self) -> bool {
match self.type_id {
NodeTargetTypeId(ElementNodeTypeId(HTMLTableHeaderCellElementTypeId)) => true,
_ => false
}
}
}
impl HTMLTableHeaderCellElement {
pub fn new_inherited(localName: DOMString, document: AbstractDocument) -> HTMLTableHeaderCellElement {
pub fn new_inherited(localName: DOMString, document: JS<Document>) -> HTMLTableHeaderCellElement {
HTMLTableHeaderCellElement {
htmltablecellelement: HTMLTableCellElement::new_inherited(HTMLTableHeaderCellElementTypeId, localName, document)
}
}
pub fn new(localName: DOMString, document: AbstractDocument) -> AbstractNode {
let element = HTMLTableHeaderCellElement::new_inherited(localName, document);
Node::reflect_node(@mut element, document, HTMLTableHeaderCellElementBinding::Wrap)
pub fn new(localName: DOMString, document: &JS<Document>) -> JS<HTMLTableHeaderCellElement> {
let element = HTMLTableHeaderCellElement::new_inherited(localName, document.clone());
Node::reflect_node(~element, document, HTMLTableHeaderCellElementBinding::Wrap)
}
}

View file

@ -3,27 +3,40 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use dom::bindings::codegen::HTMLTableRowElementBinding;
use dom::bindings::codegen::InheritTypes::HTMLTableRowElementDerived;
use dom::bindings::js::JS;
use dom::bindings::utils::ErrorResult;
use dom::document::AbstractDocument;
use dom::document::Document;
use dom::element::HTMLTableRowElementTypeId;
use dom::eventtarget::{EventTarget, NodeTargetTypeId};
use dom::htmlelement::HTMLElement;
use dom::node::{AbstractNode, Node};
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
pub struct HTMLTableRowElement {
htmlelement: HTMLElement,
}
impl HTMLTableRowElementDerived for EventTarget {
fn is_htmltablerowelement(&self) -> bool {
match self.type_id {
NodeTargetTypeId(ElementNodeTypeId(HTMLTableRowElementTypeId)) => true,
_ => false
}
}
}
impl HTMLTableRowElement {
pub fn new_inherited(localName: DOMString, document: AbstractDocument) -> HTMLTableRowElement {
pub fn new_inherited(localName: DOMString, document: JS<Document>) -> HTMLTableRowElement {
HTMLTableRowElement {
htmlelement: HTMLElement::new_inherited(HTMLTableRowElementTypeId, localName, document)
}
}
pub fn new(localName: DOMString, document: AbstractDocument) -> AbstractNode {
let element = HTMLTableRowElement::new_inherited(localName, document);
Node::reflect_node(@mut element, document, HTMLTableRowElementBinding::Wrap)
pub fn new(localName: DOMString, document: &JS<Document>) -> JS<HTMLTableRowElement> {
let element = HTMLTableRowElement::new_inherited(localName, document.clone());
Node::reflect_node(~element, document, HTMLTableRowElementBinding::Wrap)
}
}

View file

@ -3,27 +3,40 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use dom::bindings::codegen::HTMLTableSectionElementBinding;
use dom::bindings::codegen::InheritTypes::HTMLTableSectionElementDerived;
use dom::bindings::js::JS;
use dom::bindings::utils::ErrorResult;
use dom::document::AbstractDocument;
use dom::document::Document;
use dom::element::HTMLTableSectionElementTypeId;
use dom::eventtarget::{EventTarget, NodeTargetTypeId};
use dom::htmlelement::HTMLElement;
use dom::node::{AbstractNode, Node};
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
pub struct HTMLTableSectionElement {
htmlelement: HTMLElement,
}
impl HTMLTableSectionElementDerived for EventTarget {
fn is_htmltablesectionelement(&self) -> bool {
match self.type_id {
NodeTargetTypeId(ElementNodeTypeId(HTMLTableSectionElementTypeId)) => true,
_ => false
}
}
}
impl HTMLTableSectionElement {
pub fn new_inherited(localName: DOMString, document: AbstractDocument) -> HTMLTableSectionElement {
pub fn new_inherited(localName: DOMString, document: JS<Document>) -> HTMLTableSectionElement {
HTMLTableSectionElement {
htmlelement: HTMLElement::new_inherited(HTMLTableSectionElementTypeId, localName, document)
}
}
pub fn new(localName: DOMString, document: AbstractDocument) -> AbstractNode {
let element = HTMLTableSectionElement::new_inherited(localName, document);
Node::reflect_node(@mut element, document, HTMLTableSectionElementBinding::Wrap)
pub fn new(localName: DOMString, document: &JS<Document>) -> JS<HTMLTableSectionElement> {
let element = HTMLTableSectionElement::new_inherited(localName, document.clone());
Node::reflect_node(~element, document, HTMLTableSectionElementBinding::Wrap)
}
}

View file

@ -3,25 +3,38 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use dom::bindings::codegen::HTMLTemplateElementBinding;
use dom::document::AbstractDocument;
use dom::bindings::codegen::InheritTypes::HTMLTemplateElementDerived;
use dom::bindings::js::JS;
use dom::document::Document;
use dom::element::HTMLTemplateElementTypeId;
use dom::eventtarget::{EventTarget, NodeTargetTypeId};
use dom::htmlelement::HTMLElement;
use dom::node::{AbstractNode, Node};
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
pub struct HTMLTemplateElement {
htmlelement: HTMLElement,
}
impl HTMLTemplateElementDerived for EventTarget {
fn is_htmltemplateelement(&self) -> bool {
match self.type_id {
NodeTargetTypeId(ElementNodeTypeId(HTMLTemplateElementTypeId)) => true,
_ => false
}
}
}
impl HTMLTemplateElement {
pub fn new_inherited(localName: DOMString, document: AbstractDocument) -> HTMLTemplateElement {
pub fn new_inherited(localName: DOMString, document: JS<Document>) -> HTMLTemplateElement {
HTMLTemplateElement {
htmlelement: HTMLElement::new_inherited(HTMLTemplateElementTypeId, localName, document)
}
}
pub fn new(localName: DOMString, document: AbstractDocument) -> AbstractNode {
let element = HTMLTemplateElement::new_inherited(localName, document);
Node::reflect_node(@mut element, document, HTMLTemplateElementBinding::Wrap)
pub fn new(localName: DOMString, document: &JS<Document>) -> JS<HTMLTemplateElement> {
let element = HTMLTemplateElement::new_inherited(localName, document.clone());
Node::reflect_node(~element, document, HTMLTemplateElementBinding::Wrap)
}
}

View file

@ -3,27 +3,40 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use dom::bindings::codegen::HTMLTextAreaElementBinding;
use dom::bindings::utils::{Fallible, ErrorResult};
use dom::document::AbstractDocument;
use dom::bindings::codegen::InheritTypes::HTMLTextAreaElementDerived;
use dom::bindings::js::JS;
use dom::bindings::utils::{ErrorResult, Fallible};
use dom::document::Document;
use dom::element::HTMLTextAreaElementTypeId;
use dom::eventtarget::{EventTarget, NodeTargetTypeId};
use dom::htmlelement::HTMLElement;
use dom::node::{AbstractNode, Node};
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
pub struct HTMLTextAreaElement {
htmlelement: HTMLElement,
}
impl HTMLTextAreaElementDerived for EventTarget {
fn is_htmltextareaelement(&self) -> bool {
match self.type_id {
NodeTargetTypeId(ElementNodeTypeId(HTMLTextAreaElementTypeId)) => true,
_ => false
}
}
}
impl HTMLTextAreaElement {
pub fn new_inherited(localName: DOMString, document: AbstractDocument) -> HTMLTextAreaElement {
pub fn new_inherited(localName: DOMString, document: JS<Document>) -> HTMLTextAreaElement {
HTMLTextAreaElement {
htmlelement: HTMLElement::new_inherited(HTMLTextAreaElementTypeId, localName, document)
}
}
pub fn new(localName: DOMString, document: AbstractDocument) -> AbstractNode {
let element = HTMLTextAreaElement::new_inherited(localName, document);
Node::reflect_node(@mut element, document, HTMLTextAreaElementBinding::Wrap)
pub fn new(localName: DOMString, document: &JS<Document>) -> JS<HTMLTextAreaElement> {
let element = HTMLTextAreaElement::new_inherited(localName, document.clone());
Node::reflect_node(~element, document, HTMLTextAreaElementBinding::Wrap)
}
}

View file

@ -3,27 +3,40 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use dom::bindings::codegen::HTMLTimeElementBinding;
use dom::bindings::codegen::InheritTypes::HTMLTimeElementDerived;
use dom::bindings::js::JS;
use dom::bindings::utils::ErrorResult;
use dom::document::AbstractDocument;
use dom::document::Document;
use dom::element::HTMLTimeElementTypeId;
use dom::eventtarget::{EventTarget, NodeTargetTypeId};
use dom::htmlelement::HTMLElement;
use dom::node::{AbstractNode, Node};
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
pub struct HTMLTimeElement {
htmlelement: HTMLElement
}
impl HTMLTimeElementDerived for EventTarget {
fn is_htmltimeelement(&self) -> bool {
match self.type_id {
NodeTargetTypeId(ElementNodeTypeId(HTMLTimeElementTypeId)) => true,
_ => false
}
}
}
impl HTMLTimeElement {
pub fn new_inherited(localName: DOMString, document: AbstractDocument) -> HTMLTimeElement {
pub fn new_inherited(localName: DOMString, document: JS<Document>) -> HTMLTimeElement {
HTMLTimeElement {
htmlelement: HTMLElement::new_inherited(HTMLTimeElementTypeId, localName, document)
}
}
pub fn new(localName: DOMString, document: AbstractDocument) -> AbstractNode {
let element = HTMLTimeElement::new_inherited(localName, document);
Node::reflect_node(@mut element, document, HTMLTimeElementBinding::Wrap)
pub fn new(localName: DOMString, document: &JS<Document>) -> JS<HTMLTimeElement> {
let element = HTMLTimeElement::new_inherited(localName, document.clone());
Node::reflect_node(~element, document, HTMLTimeElementBinding::Wrap)
}
}

View file

@ -3,27 +3,40 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use dom::bindings::codegen::HTMLTitleElementBinding;
use dom::bindings::codegen::InheritTypes::HTMLTitleElementDerived;
use dom::bindings::js::JS;
use dom::bindings::utils::ErrorResult;
use dom::document::AbstractDocument;
use dom::document::Document;
use dom::element::HTMLTitleElementTypeId;
use dom::eventtarget::{EventTarget, NodeTargetTypeId};
use dom::htmlelement::HTMLElement;
use dom::node::{AbstractNode, Node};
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
pub struct HTMLTitleElement {
htmlelement: HTMLElement,
}
impl HTMLTitleElementDerived for EventTarget {
fn is_htmltitleelement(&self) -> bool {
match self.type_id {
NodeTargetTypeId(ElementNodeTypeId(HTMLTitleElementTypeId)) => true,
_ => false
}
}
}
impl HTMLTitleElement {
pub fn new_inherited(localName: DOMString, document: AbstractDocument) -> HTMLTitleElement {
pub fn new_inherited(localName: DOMString, document: JS<Document>) -> HTMLTitleElement {
HTMLTitleElement {
htmlelement: HTMLElement::new_inherited(HTMLTitleElementTypeId, localName, document)
}
}
pub fn new(localName: DOMString, document: AbstractDocument) -> AbstractNode {
let element = HTMLTitleElement::new_inherited(localName, document);
Node::reflect_node(@mut element, document, HTMLTitleElementBinding::Wrap)
pub fn new(localName: DOMString, document: &JS<Document>) -> JS<HTMLTitleElement> {
let element = HTMLTitleElement::new_inherited(localName, document.clone());
Node::reflect_node(~element, document, HTMLTitleElementBinding::Wrap)
}
}

Some files were not shown because too many files have changed in this diff Show more