Merge pull request #3468 from Manishearth/jstraceable

Replace our usage our Encodable with JSTraceable; r=jdm
This commit is contained in:
Manish Goregaokar 2014-09-24 21:25:41 +05:30
commit 95a4731c0e
135 changed files with 409 additions and 273 deletions

View file

@ -9,7 +9,6 @@ use geom::rect::Rect;
use geom::size::TypedSize2D;
use geom::scale_factor::ScaleFactor;
use layers::geometry::DevicePixel;
use serialize::Encodable;
use servo_util::geometry::{PagePx, ViewportPx};
use std::comm::{channel, Sender, Receiver};
use url::Url;
@ -37,7 +36,6 @@ pub struct Failure {
pub subpage_id: Option<SubpageId>,
}
#[deriving(Encodable)]
pub struct WindowSizeData {
/// The size of the initial layout viewport, before parsing an
/// http://www.w3.org/TR/css-device-adapt/#initial-viewport
@ -77,8 +75,8 @@ pub enum NavigationDirection {
Back,
}
#[deriving(Clone, PartialEq, Eq, Hash, Encodable)]
#[deriving(Clone, PartialEq, Eq, Hash)]
pub struct PipelineId(pub uint);
#[deriving(Clone, PartialEq, Eq, Hash, Encodable)]
#[deriving(Clone, PartialEq, Eq, Hash)]
pub struct SubpageId(pub uint);

View file

@ -0,0 +1,60 @@
/* 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 syntax::ext::base::ExtCtxt;
use syntax::codemap::Span;
use syntax::ptr::P;
use syntax::ast::{Item, MetaItem, Expr};
use syntax::ast;
use syntax::ext::build::AstBuilder;
use syntax::ext::deriving::generic::{combine_substructure, EnumMatching, FieldInfo, MethodDef, Struct, Substructure, TraitDef, ty};
pub fn expand_jstraceable(cx: &mut ExtCtxt, span: Span, mitem: &MetaItem, item: &Item, push: |P<Item>|) {
let trait_def = TraitDef {
span: span,
attributes: Vec::new(),
path: ty::Path::new(vec!("dom","bindings","trace","JSTraceable")),
additional_bounds: Vec::new(),
generics: ty::LifetimeBounds::empty(),
methods: vec!(
MethodDef {
name: "trace",
generics: ty::LifetimeBounds::empty(),
explicit_self: ty::borrowed_explicit_self(),
args: vec!(ty::Ptr(box ty::Literal(ty::Path::new(vec!("js","jsapi","JSTracer"))), ty::Raw(ast::MutMutable))),
ret_ty: ty::nil_ty(),
attributes: vec!(),
combine_substructure: combine_substructure(|a, b, c| {
jstraceable_substructure(a, b, c)
})
}
)
};
trait_def.expand(cx, mitem, item, push)
}
// Mostly copied from syntax::ext::deriving::hash
fn jstraceable_substructure(cx: &mut ExtCtxt, trait_span: Span, substr: &Substructure) -> P<Expr> {
let state_expr = match substr.nonself_args {
[ref state_expr] => state_expr,
_ => cx.span_bug(trait_span, "incorrect number of arguments in `jstraceable`")
};
let trace_ident = substr.method_ident;
let call_trace = |span, thing_expr| {
let expr = cx.expr_method_call(span, thing_expr, trace_ident, vec!(state_expr.clone()));
cx.stmt_expr(expr)
};
let mut stmts = Vec::new();
let fields = match *substr.fields {
Struct(ref fs) | EnumMatching(_, _, ref fs) => fs,
_ => cx.span_bug(trait_span, "impossible substructure in `jstraceable`")
};
for &FieldInfo { ref self_, span, .. } in fields.iter() {
stmts.push(call_trace(span, self_.clone()));
}
cx.expr_block(cx.block(trait_span, stmts, None))
}

View file

@ -6,8 +6,6 @@
#![deny(unused_imports, unused_variable)]
#[phase(plugin,link)]
extern crate syntax;
#[phase(plugin, link)]
@ -17,14 +15,18 @@ extern crate sync;
use rustc::lint::LintPassObject;
use rustc::plugin::Registry;
use syntax::ext::base::ItemDecorator;
use syntax::parse::token::intern;
mod lints;
mod macros;
mod jstraceable;
#[plugin_registrar]
pub fn plugin_registrar(reg: &mut Registry) {
reg.register_lint_pass(box lints::TransmutePass as LintPassObject);
reg.register_lint_pass(box lints::UnrootedPass as LintPassObject);
reg.register_syntax_extension(intern("jstraceable"), ItemDecorator(box jstraceable::expand_jstraceable))
}

View file

@ -28,7 +28,8 @@ pub enum AttrSettingType {
ReplacedAttr,
}
#[deriving(PartialEq, Clone, Encodable)]
#[deriving(PartialEq, Clone)]
#[jstraceable]
pub enum AttrValue {
StringAttrValue(DOMString),
TokenListAttrValue(DOMString, Vec<Atom>),
@ -72,7 +73,7 @@ impl Str for AttrValue {
}
}
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct Attr {
reflector_: Reflector,

View file

@ -13,13 +13,14 @@ This is very tricky and magically mechanism helped by Rust Compiler.
The outline is:
1. SpiderMonkey's GC calls `JSClass.trace` defined in `FooBinding` when marking phase. This JSClass is basis of each wrapper JSObject.
2. `JSClass.trace` calls `Foo::trace()` defined in InhertTypes.rs.
3. `Foo::trace()` calls `Foo::encode()`. This `encode()` method is derived by the annotation of `#[deriving(Encodable)]` for a Rust DOM Element struct.
4. `Foo::encode()` calls `JS<T>::encode()` method of `JS<T>` which is contained to `Foo`s member. So this is the compiler magic! Rust compiler generates [codes like this](https://github.com/mozilla/rust/blob/db5206c32a879d5058d6a5cdce39c13c763fbdd5/src/libsyntax/ext/deriving/encodable.rs) for all structs annotated `#[deriving(Encodable)]`. This is based on [the assumption](https://github.com/mozilla/servo/blob/54da52fa774ce2ee59fcf811af595bf292169ad8/src/components/script/dom/bindings/trace.rs#L16).
5. `JS<T>::encode()` calls `dom::bindings::trace::trace_reflector()`.
6. `trace_reflector()` fetches the reflector that is reachable from a Rust object, and notifies it to the GC with using JSTracer.
7. This operation continues to the end of the graph.
8. Finally, GC gets whether Rust object lives or not from JSObjects which is hold by Rust object.
2. `JSClass.trace` calls `Foo::trace()` (an implementation of `JSTraceable`).
This is typically derived via a #[jstraceable] annotation
3. For all fields (except those wrapped in `Untraceable`), `Foo::trace()`
calls `trace()` on the field. For example, for fields of type `JS<T>`, `JS<T>::trace()` calls
`trace_reflector()`.
4. `trace_reflector()` fetches the reflector that is reachable from a Rust object, and notifies it to the GC with using JSTracer.
5. This operation continues to the end of the graph.
6. Finally, GC gets whether Rust object lives or not from JSObjects which is hold by Rust object.
## Destruct

View file

@ -13,8 +13,6 @@ use js::jsval::{JSVal, UndefinedValue};
use std::ptr;
use serialize::{Encodable, Encoder};
/// The exception handling used for a call.
pub enum ExceptionHandling {
/// Report any exception and don't throw it to the caller code.
@ -28,7 +26,8 @@ pub enum ExceptionHandling {
}
/// A common base class for representing IDL callback function types.
#[deriving(Clone,PartialEq,Encodable)]
#[deriving(Clone,PartialEq)]
#[jstraceable]
pub struct CallbackFunction {
object: CallbackObject
}
@ -44,7 +43,8 @@ impl CallbackFunction {
}
/// A common base class for representing IDL callback interface types.
#[deriving(Clone,PartialEq,Encodable)]
#[deriving(Clone,PartialEq)]
#[jstraceable]
pub struct CallbackInterface {
object: CallbackObject
}
@ -52,7 +52,8 @@ pub struct CallbackInterface {
/// A common base class for representing IDL callback function and
/// callback interface types.
#[allow(raw_pointer_deriving)]
#[deriving(Clone,PartialEq,Encodable)]
#[deriving(Clone,PartialEq)]
#[jstraceable]
struct CallbackObject {
/// The underlying `JSObject`.
callback: Traceable<*mut JSObject>,

View file

@ -2754,7 +2754,8 @@ use js::jsapi::JSContext;
use js::jsval::JSVal;
#[repr(uint)]
#[deriving(Encodable, PartialEq)]
#[deriving(PartialEq)]
#[jstraceable]
pub enum valuelist {
%s
}
@ -4893,7 +4894,7 @@ class CGCallback(CGClass):
bases=[ClassBase(baseName)],
constructors=self.getConstructors(),
methods=realMethods+getters+setters,
decorators="#[deriving(PartialEq,Clone,Encodable)]")
decorators="#[deriving(PartialEq,Clone)]#[jstraceable]")
def getConstructors(self):
return [ClassConstructor(
@ -5438,7 +5439,6 @@ class GlobalGenRoots():
CGGeneric("use dom::bindings::js::{JS, JSRef, Temporary};\n"),
CGGeneric("use dom::bindings::trace::JSTraceable;\n"),
CGGeneric("use dom::bindings::utils::Reflectable;\n"),
CGGeneric("use serialize::{Encodable, Encoder};\n"),
CGGeneric("use js::jsapi::JSTracer;\n\n")]
for descriptor in descriptors:
name = descriptor.name
@ -5500,16 +5500,7 @@ class GlobalGenRoots():
'toBound': name + 'Derived'})),
CGGeneric("impl %s for %s {}\n\n" % (name + 'Cast', name))]
trace = [CGGeneric(string.Template('''impl JSTraceable for ${name} {
fn trace(&self, tracer: *mut JSTracer) {
unsafe {
self.encode(&mut *tracer).ok().expect("failed to encode");
}
}
}
''').substitute({'name': name}))]
allprotos += protos + derived + cast + trace
allprotos += protos + derived + cast
curr = CGList(allprotos)
curr = CGWrapper(curr, pre=AUTOGENERATED_WARNING_COMMENT)

View file

@ -33,7 +33,7 @@ pub enum GlobalRoot<'a, 'b> {
/// A traced reference to a global object, for use in fields of traced Rust
/// structures.
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub enum GlobalField {
WindowField(JS<Window>),

View file

@ -10,7 +10,8 @@ use std::path::BytesContainer;
use std::str;
/// Encapsulates the IDL `ByteString` type.
#[deriving(Encodable,Clone,Eq,PartialEq)]
#[deriving(Clone,Eq,PartialEq)]
#[jstraceable]
pub struct ByteString(Vec<u8>);
impl ByteString {

View file

@ -11,55 +11,46 @@
//! 1. The GC calls `_trace` defined in `FooBinding` during the marking
//! phase. (This happens through `JSClass.trace` for non-proxy bindings, and
//! through `ProxyTraps.trace` otherwise.)
//! 2. `_trace` calls `Foo::trace()` (an implementation of `JSTraceable`,
//! defined in `InheritTypes.rs`).
//! 3. `Foo::trace()` calls `Foo::encode()` (an implementation of `Encodable`).
//! This implementation is typically derived by a `#[deriving(Encodable)]`
//! annotation on the Rust struct.
//! 4. For all fields (except those wrapped in `Untraceable`), `Foo::encode()`
//! calls `encode()` on the field.
//!
//! For example, for fields of type `JS<T>`, `JS<T>::encode()` calls
//! 2. `_trace` calls `Foo::trace()` (an implementation of `JSTraceable`).
//! This is typically derived via a #[jstraceable] annotation
//! 3. For all fields (except those wrapped in `Untraceable`), `Foo::trace()`
//! calls `trace()` on the field.
//! For example, for fields of type `JS<T>`, `JS<T>::trace()` calls
//! `trace_reflector()`.
//! 6. `trace_reflector()` calls `trace_object()` with the `JSObject` for the
//! 4. `trace_reflector()` calls `trace_object()` with the `JSObject` for the
//! reflector.
//! 7. `trace_object()` calls `JS_CallTracer()` to notify the GC, which will
//! 5. `trace_object()` calls `JS_CallTracer()` to notify the GC, which will
//! add the object to the graph, and will trace that object as well.
//!
//! The untraceable!() macro adds an empty implementation of JSTraceable to
//! a datatype.
use dom::bindings::js::JS;
use dom::bindings::utils::{Reflectable, Reflector};
use js::jsapi::{JSObject, JSTracer, JS_CallTracer, JSTRACE_OBJECT};
use js::jsval::JSVal;
use libc;
use std::mem;
use std::rc::Rc;
use std::cell::{Cell, RefCell};
use 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.
use url::Url;
use servo_util::atom::Atom;
use servo_util::namespace::Namespace;
use msg::constellation_msg::{PipelineId, SubpageId, WindowSizeData};
use net::image_cache_task::ImageCacheTask;
use script_traits::ScriptControlChan;
use std::collections::hashmap::HashMap;
use collections::hash::Hash;
use style::PropertyDeclarationBlock;
fn get_jstracer<'a, S: Encoder<E>, E>(s: &'a mut S) -> &'a mut JSTracer {
unsafe {
mem::transmute(s)
impl<T: Reflectable> JSTraceable for JS<T> {
fn trace(&self, trc: *mut JSTracer) {
trace_reflector(trc, "", self.reflector());
}
}
impl<T: Reflectable+Encodable<S, E>, S: Encoder<E>, E> Encodable<S, E> for JS<T> {
fn encode(&self, s: &mut S) -> Result<(), E> {
trace_reflector(get_jstracer(s), "", self.reflector());
Ok(())
}
}
impl<S: Encoder<E>, E> Encodable<S, E> for Reflector {
fn encode(&self, _s: &mut S) -> Result<(), E> {
Ok(())
}
}
untraceable!(Reflector)
/// A trait to allow tracing (only) DOM objects.
pub trait JSTraceable {
@ -120,12 +111,6 @@ impl<T> Untraceable<T> {
}
}
impl<S: Encoder<E>, E, T> Encodable<S, E> for Untraceable<T> {
fn encode(&self, _s: &mut S) -> Result<(), E> {
Ok(())
}
}
impl<T> Deref<T> for Untraceable<T> {
fn deref<'a>(&'a self) -> &'a T {
&self.inner
@ -165,28 +150,90 @@ impl<T> Deref<T> for Traceable<T> {
}
}
impl<S: Encoder<E>, E, T: Encodable<S, E>> Encodable<S, E> for Traceable<RefCell<T>> {
fn encode(&self, s: &mut S) -> Result<(), E> {
self.borrow().encode(s)
impl<T: JSTraceable> JSTraceable for RefCell<T> {
fn trace(&self, trc: *mut JSTracer) {
self.borrow().trace(trc)
}
}
impl<S: Encoder<E>, E, T: Encodable<S, E>+Copy> Encodable<S, E> for Traceable<Cell<T>> {
fn encode(&self, s: &mut S) -> Result<(), E> {
self.deref().get().encode(s)
impl<T: JSTraceable> JSTraceable for Rc<T> {
fn trace(&self, trc: *mut JSTracer) {
self.deref().trace(trc)
}
}
impl<S: Encoder<E>, E> Encodable<S, E> for Traceable<*mut JSObject> {
fn encode(&self, s: &mut S) -> Result<(), E> {
trace_object(get_jstracer(s), "object", **self);
Ok(())
impl<T: JSTraceable> JSTraceable for Box<T> {
fn trace(&self, trc: *mut JSTracer) {
(**self).trace(trc)
}
}
impl<S: Encoder<E>, E> Encodable<S, E> for Traceable<JSVal> {
fn encode(&self, s: &mut S) -> Result<(), E> {
trace_jsval(get_jstracer(s), "val", **self);
Ok(())
impl<T: JSTraceable+Copy> JSTraceable for Traceable<Cell<T>> {
fn trace(&self, trc: *mut JSTracer) {
self.deref().get().trace(trc)
}
}
impl<T: JSTraceable+Copy> JSTraceable for Cell<T> {
fn trace(&self, trc: *mut JSTracer) {
self.get().trace(trc)
}
}
impl JSTraceable for Traceable<*mut JSObject> {
fn trace(&self, trc: *mut JSTracer) {
trace_object(trc, "object", **self);
}
}
impl JSTraceable for Traceable<JSVal> {
fn trace(&self, trc: *mut JSTracer) {
trace_jsval(trc, "val", **self);
}
}
// XXXManishearth Check if the following three are optimized to no-ops
// if e.trace() is a no-op (e.g it is an untraceable type)
impl<T: JSTraceable> JSTraceable for Vec<T> {
#[inline]
fn trace(&self, trc: *mut JSTracer) {
for e in self.iter() {
e.trace(trc);
}
}
}
impl<T: JSTraceable> JSTraceable for Option<T> {
#[inline]
fn trace(&self, trc: *mut JSTracer) {
self.as_ref().map(|e| e.trace(trc));
}
}
impl<K: Eq+Hash, V: JSTraceable> JSTraceable for HashMap<K, V> {
#[inline]
fn trace(&self, trc: *mut JSTracer) {
for e in self.iter() {
e.val1().trace(trc);
}
}
}
untraceable!(bool, f32, f64, String, Url)
untraceable!(uint, u8, u16, u32, u64)
untraceable!(int, i8, i16, i32, i64)
untraceable!(Untraceable<T>)
untraceable!(ImageCacheTask, ScriptControlChan)
untraceable!(Atom, Namespace)
untraceable!(PropertyDeclarationBlock)
// These three are interdependent, if you plan to put jsmanaged data
// in one of these make sure it is propagated properly to containing structs
untraceable!(SubpageId, WindowSizeData, PipelineId)
impl<'a> JSTraceable for &'a str {
#[inline]
fn trace(&self, _: *mut JSTracer) {
// Do nothing
}
}

View file

@ -52,7 +52,7 @@ use js::{JSFUN_CONSTRUCTOR, JSPROP_READONLY};
use js;
#[allow(raw_pointer_deriving)]
#[deriving(Encodable)]
#[jstraceable]
pub struct GlobalStaticData {
pub windowproxy_handler: Untraceable<*const libc::c_void>,
}

View file

@ -9,13 +9,13 @@ use dom::bindings::utils::{Reflectable, Reflector, reflect_dom_object};
use dom::bindings::error::Fallible;
use dom::bindings::codegen::Bindings::BlobBinding;
#[deriving(Encodable)]
#[jstraceable]
pub enum BlobType {
BlobTypeId,
FileTypeId
}
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct Blob {
reflector_: Reflector,

View file

@ -16,7 +16,7 @@ use libc::c_void;
use std::ptr;
#[allow(raw_pointer_deriving)]
#[deriving(Encodable)]
#[jstraceable]
pub struct BrowserContext {
history: Vec<SessionHistoryEntry>,
active_index: uint,
@ -66,7 +66,7 @@ impl BrowserContext {
}
}
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct SessionHistoryEntry {
document: JS<Document>,

View file

@ -16,7 +16,7 @@ use geom::size::Size2D;
use canvas::canvas_render_task::{CanvasMsg, CanvasRenderTask, ClearRect, Close, FillRect, Recreate, StrokeRect};
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct CanvasRenderingContext2D {
reflector_: Reflector,

View file

@ -17,7 +17,7 @@ use servo_util::str::DOMString;
use std::cell::RefCell;
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct CharacterData {
pub node: Node,

View file

@ -16,7 +16,7 @@ use dom::node::{CommentNodeTypeId, Node};
use servo_util::str::DOMString;
/// An HTML comment.
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct Comment {
pub characterdata: CharacterData,

View file

@ -9,7 +9,7 @@ use dom::bindings::js::{JSRef, Temporary};
use dom::bindings::utils::{Reflectable, Reflector, reflect_dom_object};
use servo_util::str::DOMString;
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct Console {
pub reflector_: Reflector

View file

@ -18,7 +18,7 @@ use servo_util::str::DOMString;
use std::cell::Cell;
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct CustomEvent {
event: Event,

View file

@ -36,7 +36,7 @@ use std::task::TaskBuilder;
use native::task::NativeTaskBuilder;
use url::Url;
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct DedicatedWorkerGlobalScope {
workerglobalscope: WorkerGlobalScope,

View file

@ -65,13 +65,14 @@ use std::cell::{Cell, RefCell};
use url::Url;
use time;
#[deriving(PartialEq,Encodable)]
#[deriving(PartialEq)]
#[jstraceable]
pub enum IsHTMLDocument {
HTMLDocument,
NonHTMLDocument,
}
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct Document {
pub node: Node,
@ -100,6 +101,7 @@ impl DocumentDerived for EventTarget {
}
}
#[jstraceable]
struct ImagesFilter;
impl CollectionFilter for ImagesFilter {
fn filter(&self, elem: JSRef<Element>, _root: JSRef<Node>) -> bool {
@ -107,6 +109,7 @@ impl CollectionFilter for ImagesFilter {
}
}
#[jstraceable]
struct EmbedsFilter;
impl CollectionFilter for EmbedsFilter {
fn filter(&self, elem: JSRef<Element>, _root: JSRef<Node>) -> bool {
@ -114,6 +117,7 @@ impl CollectionFilter for EmbedsFilter {
}
}
#[jstraceable]
struct LinksFilter;
impl CollectionFilter for LinksFilter {
fn filter(&self, elem: JSRef<Element>, _root: JSRef<Node>) -> bool {
@ -121,6 +125,7 @@ impl CollectionFilter for LinksFilter {
}
}
#[jstraceable]
struct FormsFilter;
impl CollectionFilter for FormsFilter {
fn filter(&self, elem: JSRef<Element>, _root: JSRef<Node>) -> bool {
@ -128,6 +133,7 @@ impl CollectionFilter for FormsFilter {
}
}
#[jstraceable]
struct ScriptsFilter;
impl CollectionFilter for ScriptsFilter {
fn filter(&self, elem: JSRef<Element>, _root: JSRef<Node>) -> bool {
@ -135,6 +141,7 @@ impl CollectionFilter for ScriptsFilter {
}
}
#[jstraceable]
struct AnchorsFilter;
impl CollectionFilter for AnchorsFilter {
fn filter(&self, elem: JSRef<Element>, _root: JSRef<Node>) -> bool {
@ -142,6 +149,7 @@ impl CollectionFilter for AnchorsFilter {
}
}
#[jstraceable]
struct AppletsFilter;
impl CollectionFilter for AppletsFilter {
fn filter(&self, elem: JSRef<Element>, _root: JSRef<Node>) -> bool {

View file

@ -18,7 +18,7 @@ use dom::node::{DocumentFragmentNodeTypeId, Node, NodeHelpers, window_from_node}
use dom::nodelist::NodeList;
use servo_util::str::DOMString;
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct DocumentFragment {
pub node: Node,

View file

@ -13,7 +13,7 @@ use dom::node::{Node, DoctypeNodeTypeId, NodeHelpers};
use servo_util::str::DOMString;
/// The `DOCTYPE` tag.
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct DocumentType {
pub node: Node,

View file

@ -13,7 +13,8 @@ use dom::bindings::utils::{Reflectable, Reflector, reflect_dom_object};
use servo_util::str::DOMString;
#[repr(uint)]
#[deriving(Show, Encodable)]
#[deriving(Show)]
#[jstraceable]
pub enum DOMErrorName {
IndexSizeError = DOMExceptionConstants::INDEX_SIZE_ERR as uint,
HierarchyRequestError = DOMExceptionConstants::HIERARCHY_REQUEST_ERR as uint,
@ -59,7 +60,7 @@ impl DOMErrorName {
}
}
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct DOMException {
pub code: DOMErrorName,

View file

@ -22,7 +22,7 @@ use dom::node::Node;
use dom::text::Text;
use servo_util::str::DOMString;
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct DOMImplementation {
document: JS<Document>,

View file

@ -13,7 +13,7 @@ use dom::document::{Document, HTMLDocument, NonHTMLDocument};
use dom::window::Window;
use servo_util::str::DOMString;
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct DOMParser {
window: JS<Window>, //XXXjdm Document instead?

View file

@ -10,7 +10,7 @@ use dom::bindings::utils::{Reflectable, Reflector, reflect_dom_object};
use dom::window::Window;
use servo_util::geometry::Au;
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct DOMRect {
reflector_: Reflector,

View file

@ -10,7 +10,7 @@ use dom::bindings::utils::{Reflectable, Reflector, reflect_dom_object};
use dom::domrect::DOMRect;
use dom::window::Window;
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct DOMRectList {
reflector_: Reflector,

View file

@ -16,7 +16,7 @@ use servo_util::atom::Atom;
use servo_util::namespace::Null;
use servo_util::str::{DOMString, HTML_SPACE_CHARACTERS};
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct DOMTokenList {
reflector_: Reflector,

View file

@ -43,7 +43,7 @@ use std::ascii::StrAsciiExt;
use std::cell::{Cell, RefCell};
use std::mem;
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct Element {
pub node: Node,
@ -71,7 +71,8 @@ impl Reflectable for Element {
}
}
#[deriving(PartialEq,Encodable)]
#[deriving(PartialEq)]
#[jstraceable]
pub enum ElementTypeId {
HTMLElementTypeId,
HTMLAnchorElementTypeId,

View file

@ -15,7 +15,7 @@ use std::cell::{Cell, RefCell};
use time;
#[deriving(Encodable)]
#[jstraceable]
pub enum EventPhase {
PhaseNone = EventConstants::NONE as int,
PhaseCapturing = EventConstants::CAPTURING_PHASE as int,
@ -23,7 +23,8 @@ pub enum EventPhase {
PhaseBubbling = EventConstants::BUBBLING_PHASE as int,
}
#[deriving(PartialEq, Encodable)]
#[deriving(PartialEq)]
#[jstraceable]
pub enum EventTypeId {
CustomEventTypeId,
HTMLEventTypeId,
@ -34,7 +35,7 @@ pub enum EventTypeId {
UIEventTypeId
}
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct Event {
pub type_id: EventTypeId,

View file

@ -26,13 +26,15 @@ use url::Url;
use std::collections::hashmap::HashMap;
#[deriving(PartialEq,Encodable)]
#[deriving(PartialEq)]
#[jstraceable]
pub enum ListenerPhase {
Capturing,
Bubbling,
}
#[deriving(PartialEq,Encodable)]
#[deriving(PartialEq)]
#[jstraceable]
pub enum EventTargetTypeId {
NodeTargetTypeId(NodeTypeId),
WindowTypeId,
@ -41,7 +43,8 @@ pub enum EventTargetTypeId {
XMLHttpRequestTargetTypeId(XMLHttpRequestId)
}
#[deriving(PartialEq, Encodable)]
#[deriving(PartialEq)]
#[jstraceable]
pub enum EventListenerType {
Additive(EventListener),
Inline(EventListener),
@ -55,13 +58,14 @@ impl EventListenerType {
}
}
#[deriving(PartialEq,Encodable)]
#[deriving(PartialEq)]
#[jstraceable]
pub struct EventListenerEntry {
pub phase: ListenerPhase,
pub listener: EventListenerType
}
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct EventTarget {
pub type_id: EventTargetTypeId,

View file

@ -10,7 +10,7 @@ use dom::bindings::utils::{Reflectable, Reflector, reflect_dom_object};
use dom::blob::{Blob, BlobType, FileTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct File {
pub blob: Blob,

View file

@ -18,14 +18,15 @@ use servo_util::str::DOMString;
use std::cell::RefCell;
use std::collections::hashmap::HashMap;
#[deriving(Encodable, Clone)]
#[deriving(Clone)]
#[jstraceable]
#[must_root]
pub enum FormDatum {
StringData(DOMString),
FileData(JS<File>)
}
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct FormData {
data: Traceable<RefCell<HashMap<DOMString, Vec<FormDatum>>>>,

View file

@ -23,7 +23,7 @@ use servo_util::atom::Atom;
use servo_util::namespace::Null;
use servo_util::str::DOMString;
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct HTMLAnchorElement {
pub htmlelement: HTMLElement

View file

@ -13,7 +13,7 @@ use dom::htmlelement::HTMLElement;
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct HTMLAppletElement {
pub htmlelement: HTMLElement

View file

@ -17,7 +17,7 @@ use dom::virtualmethods::VirtualMethods;
use servo_util::atom::Atom;
use servo_util::str::DOMString;
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct HTMLAreaElement {
pub htmlelement: HTMLElement

View file

@ -13,7 +13,7 @@ use dom::htmlmediaelement::HTMLMediaElement;
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct HTMLAudioElement {
pub htmlmediaelement: HTMLMediaElement

View file

@ -13,7 +13,7 @@ use dom::htmlelement::HTMLElement;
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct HTMLBaseElement {
pub htmlelement: HTMLElement

View file

@ -20,7 +20,7 @@ use dom::virtualmethods::VirtualMethods;
use servo_util::atom::Atom;
use servo_util::str::DOMString;
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct HTMLBodyElement {
pub htmlelement: HTMLElement

View file

@ -13,7 +13,7 @@ use dom::htmlelement::HTMLElement;
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct HTMLBRElement {
pub htmlelement: HTMLElement,

View file

@ -19,7 +19,7 @@ use dom::virtualmethods::VirtualMethods;
use servo_util::atom::Atom;
use servo_util::str::DOMString;
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct HTMLButtonElement {
pub htmlelement: HTMLElement

View file

@ -28,7 +28,7 @@ use std::cell::Cell;
static DefaultWidth: u32 = 300;
static DefaultHeight: u32 = 150;
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct HTMLCanvasElement {
pub htmlelement: HTMLElement,

View file

@ -7,6 +7,7 @@ use dom::bindings::codegen::Bindings::HTMLCollectionBinding::HTMLCollectionMetho
use dom::bindings::codegen::InheritTypes::{ElementCast, NodeCast};
use dom::bindings::global::Window;
use dom::bindings::js::{JS, JSRef, Temporary};
use dom::bindings::trace::JSTraceable;
use dom::bindings::utils::{Reflectable, Reflector, reflect_dom_object};
use dom::element::{Element, AttributeHandlers, ElementHelpers};
use dom::node::{Node, NodeHelpers};
@ -15,27 +16,20 @@ use servo_util::atom::Atom;
use servo_util::namespace::Namespace;
use servo_util::str::{DOMString, split_html_space_chars};
use serialize::{Encoder, Encodable};
use std::ascii::StrAsciiExt;
pub trait CollectionFilter {
pub trait CollectionFilter : JSTraceable {
fn filter(&self, elem: JSRef<Element>, root: JSRef<Node>) -> bool;
}
impl<S: Encoder<E>, E> Encodable<S, E> for Box<CollectionFilter+'static> {
fn encode(&self, _s: &mut S) -> Result<(), E> {
Ok(())
}
}
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub enum CollectionTypeId {
Static(Vec<JS<Element>>),
Live(JS<Node>, Box<CollectionFilter+'static>)
}
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct HTMLCollection {
collection: CollectionTypeId,
@ -64,6 +58,7 @@ impl HTMLCollection {
fn all_elements(window: JSRef<Window>, root: JSRef<Node>,
namespace_filter: Option<Namespace>) -> Temporary<HTMLCollection> {
#[jstraceable]
struct AllElementFilter {
namespace_filter: Option<Namespace>
}
@ -85,6 +80,7 @@ impl HTMLCollection {
return HTMLCollection::all_elements(window, root, None);
}
#[jstraceable]
struct TagNameFilter {
tag: Atom,
ascii_lower_tag: Atom,
@ -115,6 +111,7 @@ impl HTMLCollection {
if tag.as_slice() == "*" {
return HTMLCollection::all_elements(window, root, namespace_filter);
}
#[jstraceable]
struct TagNameNSFilter {
tag: Atom,
namespace_filter: Option<Namespace>
@ -139,6 +136,7 @@ impl HTMLCollection {
pub fn by_class_name(window: JSRef<Window>, root: JSRef<Node>, classes: DOMString)
-> Temporary<HTMLCollection> {
#[jstraceable]
struct ClassNameFilter {
classes: Vec<DOMString>
}
@ -154,6 +152,7 @@ impl HTMLCollection {
}
pub fn children(window: JSRef<Window>, root: JSRef<Node>) -> Temporary<HTMLCollection> {
#[jstraceable]
struct ElementChildFilter;
impl CollectionFilter for ElementChildFilter {
fn filter(&self, elem: JSRef<Element>, root: JSRef<Node>) -> bool {

View file

@ -13,7 +13,7 @@ use dom::htmlelement::HTMLElement;
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct HTMLDataElement {
pub htmlelement: HTMLElement

View file

@ -16,7 +16,7 @@ use dom::htmlelement::HTMLElement;
use dom::node::{Node, ElementNodeTypeId, window_from_node};
use servo_util::str::DOMString;
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct HTMLDataListElement {
pub htmlelement: HTMLElement
@ -44,6 +44,7 @@ impl HTMLDataListElement {
impl<'a> HTMLDataListElementMethods for JSRef<'a, HTMLDataListElement> {
fn Options(self) -> Temporary<HTMLCollection> {
#[jstraceable]
struct HTMLDataListOptionsFilter;
impl CollectionFilter for HTMLDataListOptionsFilter {
fn filter(&self, elem: JSRef<Element>, _root: JSRef<Node>) -> bool {

View file

@ -13,7 +13,7 @@ use dom::htmlelement::HTMLElement;
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct HTMLDirectoryElement {
pub htmlelement: HTMLElement

View file

@ -13,7 +13,7 @@ use dom::htmlelement::HTMLElement;
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct HTMLDivElement {
pub htmlelement: HTMLElement

View file

@ -13,7 +13,7 @@ use dom::htmlelement::HTMLElement;
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct HTMLDListElement {
pub htmlelement: HTMLElement

View file

@ -21,7 +21,7 @@ use servo_util::atom::Atom;
use servo_util::namespace;
use servo_util::str::DOMString;
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct HTMLElement {
pub element: Element

View file

@ -13,7 +13,7 @@ use dom::htmlelement::HTMLElement;
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct HTMLEmbedElement {
pub htmlelement: HTMLElement

View file

@ -21,7 +21,7 @@ use dom::virtualmethods::VirtualMethods;
use servo_util::atom::Atom;
use servo_util::str::{DOMString, StaticStringVec};
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct HTMLFieldSetElement {
pub htmlelement: HTMLElement
@ -50,6 +50,7 @@ impl HTMLFieldSetElement {
impl<'a> HTMLFieldSetElementMethods for JSRef<'a, HTMLFieldSetElement> {
// http://www.whatwg.org/html/#dom-fieldset-elements
fn Elements(self) -> Temporary<HTMLCollection> {
#[jstraceable]
struct ElementsFilter;
impl CollectionFilter for ElementsFilter {
fn filter(&self, elem: JSRef<Element>, root: JSRef<Node>) -> bool {

View file

@ -13,7 +13,7 @@ use dom::htmlelement::HTMLElement;
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct HTMLFontElement {
pub htmlelement: HTMLElement

View file

@ -13,7 +13,7 @@ use dom::htmlelement::HTMLElement;
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct HTMLFormElement {
pub htmlelement: HTMLElement

View file

@ -13,7 +13,7 @@ use dom::htmlelement::HTMLElement;
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct HTMLFrameElement {
pub htmlelement: HTMLElement

View file

@ -13,7 +13,7 @@ use dom::htmlelement::HTMLElement;
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct HTMLFrameSetElement {
pub htmlelement: HTMLElement

View file

@ -13,7 +13,7 @@ use dom::htmlelement::HTMLElement;
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct HTMLHeadElement {
pub htmlelement: HTMLElement

View file

@ -13,7 +13,7 @@ use dom::htmlelement::HTMLElement;
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
#[jstraceable]
pub enum HeadingLevel {
Heading1,
Heading2,
@ -23,7 +23,7 @@ pub enum HeadingLevel {
Heading6,
}
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct HTMLHeadingElement {
pub htmlelement: HTMLElement,

View file

@ -13,7 +13,7 @@ use dom::htmlelement::HTMLElement;
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct HTMLHRElement {
pub htmlelement: HTMLElement,

View file

@ -13,7 +13,7 @@ use dom::htmlelement::HTMLElement;
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct HTMLHtmlElement {
pub htmlelement: HTMLElement

View file

@ -41,7 +41,7 @@ enum SandboxAllowance {
AllowPopups = 0x20
}
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct HTMLIFrameElement {
pub htmlelement: HTMLElement,
@ -55,7 +55,7 @@ impl HTMLIFrameElementDerived for EventTarget {
}
}
#[deriving(Encodable)]
#[jstraceable]
pub struct IFrameSize {
pub pipeline_id: PipelineId,
pub subpage_id: SubpageId,

View file

@ -25,7 +25,7 @@ use url::{Url, UrlParser};
use std::cell::RefCell;
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct HTMLImageElement {
pub htmlelement: HTMLElement,

View file

@ -18,7 +18,7 @@ use dom::virtualmethods::VirtualMethods;
use servo_util::atom::Atom;
use servo_util::str::DOMString;
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct HTMLInputElement {
pub htmlelement: HTMLElement,

View file

@ -13,7 +13,7 @@ use dom::htmlelement::HTMLElement;
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct HTMLLabelElement {
pub htmlelement: HTMLElement,

View file

@ -13,7 +13,7 @@ use dom::htmlelement::HTMLElement;
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct HTMLLegendElement {
pub htmlelement: HTMLElement,

View file

@ -13,7 +13,7 @@ use dom::htmlelement::HTMLElement;
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct HTMLLIElement {
pub htmlelement: HTMLElement,

View file

@ -22,7 +22,7 @@ use servo_util::namespace::Null;
use std::ascii::StrAsciiExt;
use url::UrlParser;
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct HTMLLinkElement {
pub htmlelement: HTMLElement,

View file

@ -13,7 +13,7 @@ use dom::htmlelement::HTMLElement;
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct HTMLMapElement {
pub htmlelement: HTMLElement

View file

@ -12,7 +12,7 @@ use dom::htmlelement::HTMLElement;
use dom::node::ElementNodeTypeId;
use servo_util::str::DOMString;
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct HTMLMediaElement {
pub htmlelement: HTMLElement,

View file

@ -13,7 +13,7 @@ use dom::htmlelement::HTMLElement;
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct HTMLMetaElement {
pub htmlelement: HTMLElement,

View file

@ -13,7 +13,7 @@ use dom::htmlelement::HTMLElement;
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct HTMLMeterElement {
pub htmlelement: HTMLElement

View file

@ -13,7 +13,7 @@ use dom::htmlelement::HTMLElement;
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct HTMLModElement {
pub htmlelement: HTMLElement

View file

@ -26,7 +26,7 @@ use servo_util::str::DOMString;
use url::Url;
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct HTMLObjectElement {
pub htmlelement: HTMLElement,

View file

@ -13,7 +13,7 @@ use dom::htmlelement::HTMLElement;
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct HTMLOListElement {
pub htmlelement: HTMLElement,

View file

@ -18,7 +18,7 @@ use dom::virtualmethods::VirtualMethods;
use servo_util::atom::Atom;
use servo_util::str::DOMString;
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct HTMLOptGroupElement {
pub htmlelement: HTMLElement

View file

@ -23,7 +23,7 @@ use servo_util::atom::Atom;
use servo_util::namespace;
use servo_util::str::{DOMString, split_html_space_chars};
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct HTMLOptionElement {
pub htmlelement: HTMLElement

View file

@ -15,7 +15,7 @@ use dom::node::{Node, ElementNodeTypeId, window_from_node};
use dom::validitystate::ValidityState;
use servo_util::str::DOMString;
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct HTMLOutputElement {
pub htmlelement: HTMLElement

View file

@ -13,7 +13,7 @@ use dom::htmlelement::HTMLElement;
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct HTMLParagraphElement {
pub htmlelement: HTMLElement

View file

@ -13,7 +13,7 @@ use dom::htmlelement::HTMLElement;
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct HTMLParamElement {
pub htmlelement: HTMLElement

View file

@ -13,7 +13,7 @@ use dom::htmlelement::HTMLElement;
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct HTMLPreElement {
pub htmlelement: HTMLElement,

View file

@ -13,7 +13,7 @@ use dom::htmlelement::HTMLElement;
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct HTMLProgressElement {
pub htmlelement: HTMLElement,

View file

@ -13,7 +13,7 @@ use dom::htmlelement::HTMLElement;
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct HTMLQuoteElement {
pub htmlelement: HTMLElement,

View file

@ -19,7 +19,7 @@ use dom::node::{Node, NodeHelpers, ElementNodeTypeId};
use servo_util::namespace::Null;
use servo_util::str::{DOMString, HTML_SPACE_CHARACTERS, StaticStringVec};
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct HTMLScriptElement {
pub htmlelement: HTMLElement,

View file

@ -21,7 +21,7 @@ use dom::virtualmethods::VirtualMethods;
use servo_util::atom::Atom;
use servo_util::str::DOMString;
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct HTMLSelectElement {
pub htmlelement: HTMLElement

View file

@ -13,7 +13,7 @@ use dom::htmlelement::HTMLElement;
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct HTMLSourceElement {
pub htmlelement: HTMLElement

View file

@ -13,7 +13,7 @@ use dom::htmlelement::HTMLElement;
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct HTMLSpanElement {
pub htmlelement: HTMLElement

View file

@ -17,7 +17,7 @@ use layout_interface::{AddStylesheetMsg, LayoutChan};
use servo_util::str::DOMString;
use style::Stylesheet;
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct HTMLStyleElement {
pub htmlelement: HTMLElement,

View file

@ -13,7 +13,7 @@ use dom::htmlelement::HTMLElement;
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct HTMLTableCaptionElement {
pub htmlelement: HTMLElement

View file

@ -12,7 +12,7 @@ use dom::htmlelement::HTMLElement;
use dom::node::ElementNodeTypeId;
use servo_util::str::DOMString;
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct HTMLTableCellElement {
pub htmlelement: HTMLElement,

View file

@ -13,7 +13,7 @@ use dom::htmlelement::HTMLElement;
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct HTMLTableColElement {
pub htmlelement: HTMLElement,

View file

@ -13,7 +13,7 @@ use dom::htmltablecellelement::HTMLTableCellElement;
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct HTMLTableDataCellElement {
pub htmltablecellelement: HTMLTableCellElement,

View file

@ -17,7 +17,7 @@ use dom::htmltablecaptionelement::HTMLTableCaptionElement;
use dom::node::{Node, NodeHelpers, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct HTMLTableElement {
pub htmlelement: HTMLElement,

View file

@ -13,7 +13,7 @@ use dom::htmltablecellelement::HTMLTableCellElement;
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct HTMLTableHeaderCellElement {
pub htmltablecellelement: HTMLTableCellElement,

View file

@ -13,7 +13,7 @@ use dom::htmlelement::HTMLElement;
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct HTMLTableRowElement {
pub htmlelement: HTMLElement,

View file

@ -13,7 +13,7 @@ use dom::htmlelement::HTMLElement;
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct HTMLTableSectionElement {
pub htmlelement: HTMLElement,

View file

@ -13,7 +13,7 @@ use dom::htmlelement::HTMLElement;
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct HTMLTemplateElement {
pub htmlelement: HTMLElement,

View file

@ -18,7 +18,7 @@ use dom::virtualmethods::VirtualMethods;
use servo_util::atom::Atom;
use servo_util::str::DOMString;
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct HTMLTextAreaElement {
pub htmlelement: HTMLElement,

View file

@ -13,7 +13,7 @@ use dom::htmlelement::HTMLElement;
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct HTMLTimeElement {
pub htmlelement: HTMLElement

View file

@ -16,7 +16,7 @@ use dom::node::{Node, NodeHelpers, ElementNodeTypeId};
use dom::text::Text;
use servo_util::str::DOMString;
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct HTMLTitleElement {
pub htmlelement: HTMLElement,

View file

@ -13,7 +13,7 @@ use dom::htmlelement::HTMLElement;
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct HTMLTrackElement {
pub htmlelement: HTMLElement,

View file

@ -13,7 +13,7 @@ use dom::htmlelement::HTMLElement;
use dom::node::{Node, ElementNodeTypeId};
use servo_util::str::DOMString;
#[deriving(Encodable)]
#[jstraceable]
#[must_root]
pub struct HTMLUListElement {
pub htmlelement: HTMLElement

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