aboutsummaryrefslogtreecommitdiffstats
path: root/src/components/script
diff options
context:
space:
mode:
Diffstat (limited to 'src/components/script')
-rw-r--r--src/components/script/dom/document.rs83
-rw-r--r--src/components/script/dom/htmldocument.rs13
-rw-r--r--src/components/script/dom/node.rs7
3 files changed, 90 insertions, 13 deletions
diff --git a/src/components/script/dom/document.rs b/src/components/script/dom/document.rs
index 7c41a58134f..e338eee5dae 100644
--- a/src/components/script/dom/document.rs
+++ b/src/components/script/dom/document.rs
@@ -5,12 +5,12 @@
use dom::bindings::codegen::DocumentBinding;
use dom::bindings::utils::{DOMString, WrapperCache, ErrorResult, null_string, str};
use dom::bindings::utils::{BindingObject, CacheableWrapper, rust_box, DerivedWrapper};
-use dom::element::{HTMLHtmlElement, HTMLHtmlElementTypeId};
+use dom::element::{HTMLHtmlElement, HTMLTitleElement, HTMLHtmlElementTypeId, HTMLHeadElementTypeId, HTMLTitleElementTypeId};
use dom::event::Event;
use dom::htmlcollection::HTMLCollection;
use dom::htmldocument::HTMLDocument;
use dom::htmlelement::HTMLElement;
-use dom::node::{AbstractNode, ScriptView, Node};
+use dom::node::{AbstractNode, ScriptView, Node, ElementNodeTypeId, Text};
use dom::window::Window;
use dom::windowproxy::WindowProxy;
@@ -274,14 +274,77 @@ impl Document {
}
pub fn Title(&self) -> DOMString {
- str(self.title.clone())
- }
-
- pub fn SetTitle(&mut self, title: &DOMString, _rv: &mut ErrorResult) {
- self.title = match title {
- &str(ref s) => s.clone(),
- &null_string => ~""
- };
+ let mut title = ~"";
+ match self.doctype {
+ SVG => {
+ fail!("no SVG document yet")
+ },
+ _ => {
+ let _ = for self.root.traverse_preorder |node| {
+ if node.type_id() != ElementNodeTypeId(HTMLTitleElementTypeId) {
+ loop;
+ }
+ for node.children().advance |child| {
+ if child.is_text() {
+ do child.with_imm_text() |text| {
+ let s = text.parent.Data();
+ title = title + s.to_str();
+ }
+ }
+ }
+ break;
+ };
+ }
+ }
+ let v: ~[&str] = title.word_iter().collect();
+ title = v.connect(" ");
+ title = title.trim().to_owned();
+ str(title)
+ }
+
+ pub fn SetTitle(&self, title: &DOMString, _rv: &mut ErrorResult) {
+ match self.doctype {
+ SVG => {
+ fail!("no SVG document yet")
+ },
+ _ => {
+ let (_scope, cx) = self.get_scope_and_cx();
+ let _ = for self.root.traverse_preorder |node| {
+ if node.type_id() != ElementNodeTypeId(HTMLHeadElementTypeId) {
+ loop;
+ }
+ let mut has_title = false;
+ for node.children().advance |child| {
+ if child.type_id() != ElementNodeTypeId(HTMLTitleElementTypeId) {
+ loop;
+ }
+ has_title = true;
+ for child.children().advance |title_child| {
+ child.remove_child(title_child);
+ }
+ let new_text = unsafe {
+ Node::as_abstract_node(cx, @Text::new(title.to_str()))
+ };
+ child.add_child(new_text);
+ break;
+ }
+ if !has_title {
+ let new_title = @HTMLTitleElement {
+ parent: HTMLElement::new(HTMLTitleElementTypeId, ~"title")
+ };
+ let new_title = unsafe {
+ Node::as_abstract_node(cx, new_title)
+ };
+ let new_text = unsafe {
+ Node::as_abstract_node(cx, @Text::new(title.to_str()))
+ };
+ new_title.add_child(new_text);
+ node.add_child(new_title);
+ }
+ break;
+ };
+ }
+ }
}
pub fn Dir(&self) -> DOMString {
diff --git a/src/components/script/dom/htmldocument.rs b/src/components/script/dom/htmldocument.rs
index 619390352f8..a102fd8aa81 100644
--- a/src/components/script/dom/htmldocument.rs
+++ b/src/components/script/dom/htmldocument.rs
@@ -6,9 +6,9 @@ use dom::bindings::codegen::HTMLDocumentBinding;
use dom::bindings::utils::{DOMString, ErrorResult, null_string};
use dom::bindings::utils::{CacheableWrapper, BindingObject, WrapperCache};
use dom::document::{AbstractDocument, Document, WrappableDocument, HTML};
-use dom::element::Element;
+use dom::element::{Element, HTMLHeadElementTypeId};
use dom::htmlcollection::HTMLCollection;
-use dom::node::{AbstractNode, ScriptView};
+use dom::node::{AbstractNode, ScriptView, ElementNodeTypeId};
use dom::window::Window;
use js::jsapi::{JSObject, JSContext};
@@ -68,7 +68,14 @@ impl HTMLDocument {
}
pub fn GetHead(&self) -> Option<AbstractNode<ScriptView>> {
- None
+ let mut headNode: Option<AbstractNode<ScriptView>> = None;
+ let _ = for self.parent.root.traverse_preorder |child| {
+ if child.type_id() == ElementNodeTypeId(HTMLHeadElementTypeId) {
+ headNode = Some(child);
+ break;
+ }
+ };
+ headNode
}
pub fn Images(&self) -> @mut HTMLCollection {
diff --git a/src/components/script/dom/node.rs b/src/components/script/dom/node.rs
index 6e94d2f8ef0..7bf7e53b7ac 100644
--- a/src/components/script/dom/node.rs
+++ b/src/components/script/dom/node.rs
@@ -349,6 +349,13 @@ impl<'self, View> AbstractNode<View> {
self.transmute(f)
}
+ pub fn with_mut_text<R>(self, f: &fn(&mut Text) -> R) -> R {
+ if !self.is_text() {
+ fail!(~"node is not text");
+ }
+ self.transmute_mut(f)
+ }
+
pub fn is_element(self) -> bool {
match self.type_id() {
ElementNodeTypeId(*) => true,