mirror of
https://github.com/servo/servo.git
synced 2025-06-12 18:34:39 +00:00
I converted them all with a few exceptions: - Methods that were used by trait objects, since trait objects don't work with `self` methods. - Methods that take an &'b JSRef<'a, T> and return an &'b. In reality, many (all?) could return an &'a instead, but this isn't allowed by the Deref trait. - Methods that internally rely on the same issue with Deref. - I left out the traits involved in layout entirely, even though not all of their methods suffer from one of the above problems. There will probably be solutions to all of these problems in the future.
122 lines
4.5 KiB
Rust
122 lines
4.5 KiB
Rust
/* 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::Bindings::EventHandlerBinding::EventHandlerNonNull;
|
|
use dom::bindings::codegen::Bindings::HTMLElementBinding;
|
|
use dom::bindings::codegen::Bindings::HTMLElementBinding::HTMLElementMethods;
|
|
use dom::bindings::codegen::Bindings::WindowBinding::WindowMethods;
|
|
use dom::bindings::codegen::InheritTypes::{ElementCast, HTMLFrameSetElementDerived};
|
|
use dom::bindings::codegen::InheritTypes::EventTargetCast;
|
|
use dom::bindings::codegen::InheritTypes::{HTMLElementDerived, HTMLBodyElementDerived};
|
|
use dom::bindings::js::{JSRef, Temporary};
|
|
use dom::bindings::utils::{Reflectable, Reflector};
|
|
use dom::document::Document;
|
|
use dom::element::{Element, ElementTypeId, HTMLElementTypeId};
|
|
use dom::eventtarget::{EventTarget, EventTargetHelpers, NodeTargetTypeId};
|
|
use dom::node::{Node, ElementNodeTypeId, window_from_node};
|
|
use dom::virtualmethods::VirtualMethods;
|
|
|
|
use servo_util::atom::Atom;
|
|
use servo_util::namespace;
|
|
use servo_util::str::DOMString;
|
|
|
|
#[deriving(Encodable)]
|
|
#[must_root]
|
|
pub struct HTMLElement {
|
|
pub element: Element
|
|
}
|
|
|
|
impl HTMLElementDerived for EventTarget {
|
|
fn is_htmlelement(&self) -> bool {
|
|
match self.type_id {
|
|
NodeTargetTypeId(ElementNodeTypeId(ElementTypeId)) => false,
|
|
NodeTargetTypeId(ElementNodeTypeId(_)) => true,
|
|
_ => false
|
|
}
|
|
}
|
|
}
|
|
|
|
impl HTMLElement {
|
|
pub fn new_inherited(type_id: ElementTypeId, tag_name: DOMString, document: JSRef<Document>) -> HTMLElement {
|
|
HTMLElement {
|
|
element: Element::new_inherited(type_id, tag_name, namespace::HTML, None, document)
|
|
}
|
|
}
|
|
|
|
#[allow(unrooted_must_root)]
|
|
pub fn new(localName: DOMString, document: JSRef<Document>) -> Temporary<HTMLElement> {
|
|
let element = HTMLElement::new_inherited(HTMLElementTypeId, localName, document);
|
|
Node::reflect_node(box element, document, HTMLElementBinding::Wrap)
|
|
}
|
|
}
|
|
|
|
trait PrivateHTMLElementHelpers {
|
|
fn is_body_or_frameset(self) -> bool;
|
|
}
|
|
|
|
impl<'a> PrivateHTMLElementHelpers for JSRef<'a, HTMLElement> {
|
|
fn is_body_or_frameset(self) -> bool {
|
|
let eventtarget: JSRef<EventTarget> = EventTargetCast::from_ref(self);
|
|
eventtarget.is_htmlbodyelement() || eventtarget.is_htmlframesetelement()
|
|
}
|
|
}
|
|
|
|
impl<'a> HTMLElementMethods for JSRef<'a, HTMLElement> {
|
|
fn GetOnclick(self) -> Option<EventHandlerNonNull> {
|
|
let eventtarget: JSRef<EventTarget> = EventTargetCast::from_ref(self);
|
|
eventtarget.get_event_handler_common("click")
|
|
}
|
|
|
|
fn SetOnclick(self, listener: Option<EventHandlerNonNull>) {
|
|
let eventtarget: JSRef<EventTarget> = EventTargetCast::from_ref(self);
|
|
eventtarget.set_event_handler_common("click", listener)
|
|
}
|
|
|
|
fn GetOnload(self) -> Option<EventHandlerNonNull> {
|
|
if self.is_body_or_frameset() {
|
|
let win = window_from_node(self).root();
|
|
win.deref().GetOnload()
|
|
} else {
|
|
None
|
|
}
|
|
}
|
|
|
|
fn SetOnload(self, listener: Option<EventHandlerNonNull>) {
|
|
if self.is_body_or_frameset() {
|
|
let win = window_from_node(self).root();
|
|
win.deref().SetOnload(listener)
|
|
}
|
|
}
|
|
}
|
|
|
|
impl<'a> VirtualMethods for JSRef<'a, HTMLElement> {
|
|
fn super_type<'a>(&'a self) -> Option<&'a VirtualMethods> {
|
|
let element: &JSRef<Element> = ElementCast::from_borrowed_ref(self);
|
|
Some(element as &VirtualMethods)
|
|
}
|
|
|
|
fn after_set_attr(&self, name: &Atom, value: DOMString) {
|
|
match self.super_type() {
|
|
Some(ref s) => s.after_set_attr(name, value.clone()),
|
|
_ => (),
|
|
}
|
|
|
|
if name.as_slice().starts_with("on") {
|
|
let window = window_from_node(*self).root();
|
|
let (cx, url, reflector) = (window.get_cx(),
|
|
window.get_url(),
|
|
window.reflector().get_jsobject());
|
|
let evtarget: JSRef<EventTarget> = EventTargetCast::from_ref(*self);
|
|
evtarget.set_event_handler_uncompiled(cx, url, reflector,
|
|
name.as_slice().slice_from(2),
|
|
value);
|
|
}
|
|
}
|
|
}
|
|
|
|
impl Reflectable for HTMLElement {
|
|
fn reflector<'a>(&'a self) -> &'a Reflector {
|
|
self.element.reflector()
|
|
}
|
|
}
|