mirror of
https://github.com/servo/servo.git
synced 2025-06-11 18:10:11 +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.
132 lines
4.7 KiB
Rust
132 lines
4.7 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::AttrBinding::AttrMethods;
|
|
use dom::bindings::codegen::Bindings::HTMLScriptElementBinding;
|
|
use dom::bindings::codegen::Bindings::HTMLScriptElementBinding::HTMLScriptElementMethods;
|
|
use dom::bindings::codegen::Bindings::NodeBinding::NodeMethods;
|
|
use dom::bindings::codegen::InheritTypes::HTMLScriptElementDerived;
|
|
use dom::bindings::codegen::InheritTypes::{ElementCast, NodeCast};
|
|
use dom::bindings::js::{JSRef, Temporary, OptionalRootable};
|
|
use dom::bindings::utils::{Reflectable, Reflector};
|
|
use dom::document::Document;
|
|
use dom::element::{HTMLScriptElementTypeId, Element, AttributeHandlers};
|
|
use dom::eventtarget::{EventTarget, NodeTargetTypeId};
|
|
use dom::htmlelement::HTMLElement;
|
|
use dom::node::{Node, NodeHelpers, ElementNodeTypeId};
|
|
|
|
use servo_util::namespace::Null;
|
|
use servo_util::str::{DOMString, HTML_SPACE_CHARACTERS, StaticStringVec};
|
|
|
|
#[deriving(Encodable)]
|
|
#[must_root]
|
|
pub struct HTMLScriptElement {
|
|
pub htmlelement: HTMLElement,
|
|
}
|
|
|
|
impl HTMLScriptElementDerived for EventTarget {
|
|
fn is_htmlscriptelement(&self) -> bool {
|
|
self.type_id == NodeTargetTypeId(ElementNodeTypeId(HTMLScriptElementTypeId))
|
|
}
|
|
}
|
|
|
|
impl HTMLScriptElement {
|
|
pub fn new_inherited(localName: DOMString, document: JSRef<Document>) -> HTMLScriptElement {
|
|
HTMLScriptElement {
|
|
htmlelement: HTMLElement::new_inherited(HTMLScriptElementTypeId, localName, document)
|
|
}
|
|
}
|
|
|
|
#[allow(unrooted_must_root)]
|
|
pub fn new(localName: DOMString, document: JSRef<Document>) -> Temporary<HTMLScriptElement> {
|
|
let element = HTMLScriptElement::new_inherited(localName, document);
|
|
Node::reflect_node(box element, document, HTMLScriptElementBinding::Wrap)
|
|
}
|
|
}
|
|
|
|
pub trait HTMLScriptElementHelpers {
|
|
/// Prepare a script (<http://www.whatwg.org/html/#prepare-a-script>),
|
|
/// steps 6 and 7.
|
|
fn is_javascript(self) -> bool;
|
|
}
|
|
|
|
/// Supported script types as defined by
|
|
/// <http://whatwg.org/html/#support-the-scripting-language>.
|
|
static SCRIPT_JS_MIMES: StaticStringVec = &[
|
|
"application/ecmascript",
|
|
"application/javascript",
|
|
"application/x-ecmascript",
|
|
"application/x-javascript",
|
|
"text/ecmascript",
|
|
"text/javascript",
|
|
"text/javascript1.0",
|
|
"text/javascript1.1",
|
|
"text/javascript1.2",
|
|
"text/javascript1.3",
|
|
"text/javascript1.4",
|
|
"text/javascript1.5",
|
|
"text/jscript",
|
|
"text/livescript",
|
|
"text/x-ecmascript",
|
|
"text/x-javascript",
|
|
];
|
|
|
|
impl<'a> HTMLScriptElementHelpers for JSRef<'a, HTMLScriptElement> {
|
|
fn is_javascript(self) -> bool {
|
|
let element: JSRef<Element> = ElementCast::from_ref(self);
|
|
match element.get_attribute(Null, "type").root().map(|s| s.Value()) {
|
|
Some(ref s) if s.is_empty() => {
|
|
// type attr exists, but empty means js
|
|
debug!("script type empty, inferring js");
|
|
true
|
|
},
|
|
Some(ref s) => {
|
|
debug!("script type={:s}", *s);
|
|
SCRIPT_JS_MIMES.contains(&s.as_slice().trim_chars(HTML_SPACE_CHARACTERS))
|
|
},
|
|
None => {
|
|
debug!("no script type");
|
|
match element.get_attribute(Null, "language").root().map(|s| s.Value()) {
|
|
Some(ref s) if s.is_empty() => {
|
|
debug!("script language empty, inferring js");
|
|
true
|
|
},
|
|
Some(ref s) => {
|
|
debug!("script language={:s}", *s);
|
|
SCRIPT_JS_MIMES.contains(&"text/".to_string().append(s.as_slice()).as_slice())
|
|
},
|
|
None => {
|
|
debug!("no script type or language, inferring js");
|
|
true
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
impl<'a> HTMLScriptElementMethods for JSRef<'a, HTMLScriptElement> {
|
|
fn Src(self) -> DOMString {
|
|
let element: JSRef<Element> = ElementCast::from_ref(self);
|
|
element.get_url_attribute("src")
|
|
}
|
|
|
|
// http://www.whatwg.org/html/#dom-script-text
|
|
fn Text(self) -> DOMString {
|
|
let node: JSRef<Node> = NodeCast::from_ref(self);
|
|
Node::collect_text_contents(node.children())
|
|
}
|
|
|
|
// http://www.whatwg.org/html/#dom-script-text
|
|
fn SetText(self, value: DOMString) {
|
|
let node: JSRef<Node> = NodeCast::from_ref(self);
|
|
node.SetTextContent(Some(value))
|
|
}
|
|
}
|
|
|
|
impl Reflectable for HTMLScriptElement {
|
|
fn reflector<'a>(&'a self) -> &'a Reflector {
|
|
self.htmlelement.reflector()
|
|
}
|
|
}
|