aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorbors-servo <release+servo@mozilla.com>2013-09-10 15:27:42 -0700
committerbors-servo <release+servo@mozilla.com>2013-09-10 15:27:42 -0700
commit25a3d4a93fd9892686976d1084d3b23baa05d11a (patch)
tree1f646854565792356c67d1d6e2140daee30d98d7 /src
parent7b7fd475ee578d5ce5c439ebcb0e23bd7a2c74b2 (diff)
parent227bb95213c13fc8267e14b612dadd9a9f223246 (diff)
downloadservo-25a3d4a93fd9892686976d1084d3b23baa05d11a.tar.gz
servo-25a3d4a93fd9892686976d1084d3b23baa05d11a.zip
auto merge of #899 : metajack/servo/create-element, r=jdm
This re-uses the parser's node creation code. That could probably be put somewhere nicer. Suggestions welcome!
Diffstat (limited to 'src')
-rw-r--r--src/components/script/dom/bindings/codegen/Document.webidl4
-rw-r--r--src/components/script/dom/document.rs17
-rw-r--r--src/components/script/html/hubbub_html_parser.rs2
-rw-r--r--src/test/html/content/test_create_element.html17
4 files changed, 34 insertions, 6 deletions
diff --git a/src/components/script/dom/bindings/codegen/Document.webidl b/src/components/script/dom/bindings/codegen/Document.webidl
index 2e61ae1a27e..40bc8b836a3 100644
--- a/src/components/script/dom/bindings/codegen/Document.webidl
+++ b/src/components/script/dom/bindings/codegen/Document.webidl
@@ -45,10 +45,10 @@ interface Document /*: Node*/ { //XXXjdm Requires servo/#623
[Creator, Throws]
Element createElementNS(DOMString? namespace, DOMString qualifiedName);
/*[Creator]
- DocumentFragment createDocumentFragment();
+ DocumentFragment createDocumentFragment();*/
[Creator]
Text createTextNode(DOMString data);
- [Creator]
+ /*[Creator]
Comment createComment(DOMString data);
[Creator, Throws]
ProcessingInstruction createProcessingInstruction(DOMString target, DOMString data);*/
diff --git a/src/components/script/dom/document.rs b/src/components/script/dom/document.rs
index ca06acbb61e..51352b2faeb 100644
--- a/src/components/script/dom/document.rs
+++ b/src/components/script/dom/document.rs
@@ -17,7 +17,7 @@ use dom::text::Text;
use dom::window::Window;
use dom::windowproxy::WindowProxy;
use dom::htmltitleelement::HTMLTitleElement;
-
+use html::hubbub_html_parser::build_element_from_tag;
use js::jsapi::{JS_AddObjectRoot, JS_RemoveObjectRoot, JSObject, JSContext, JSVal};
use js::glue::RUST_OBJECT_TO_JSVAL;
use servo_util::tree::TreeNodeRef;
@@ -213,6 +213,11 @@ impl Document {
Some(self.root)
}
+ fn get_cx(&self) -> *JSContext {
+ let win = self.window.get_ref();
+ unsafe {(*win.page).js_info.get_ref().js_compartment.cx.ptr}
+ }
+
fn get_scope_and_cx(&self) -> (*JSObject, *JSContext) {
let win = self.window.get_ref();
let cx = unsafe {(*win.page).js_info.get_ref().js_compartment.cx.ptr};
@@ -239,14 +244,20 @@ impl Document {
None
}
- pub fn CreateElement(&self, _local_name: &DOMString, _rv: &mut ErrorResult) -> AbstractNode<ScriptView> {
- fail!("stub")
+ pub fn CreateElement(&self, local_name: &DOMString, _rv: &mut ErrorResult) -> AbstractNode<ScriptView> {
+ let cx = self.get_cx();
+ build_element_from_tag(cx, local_name.to_str())
}
pub fn CreateElementNS(&self, _namespace: &DOMString, _qualified_name: &DOMString, _rv: &mut ErrorResult) -> AbstractNode<ScriptView> {
fail!("stub")
}
+ pub fn CreateTextNode(&self, data: &DOMString) -> AbstractNode<ScriptView> {
+ let cx = self.get_cx();
+ unsafe { Node::as_abstract_node(cx, @Text::new(data.to_str())) }
+ }
+
pub fn CreateEvent(&self, _interface: &DOMString, _rv: &mut ErrorResult) -> @mut Event {
fail!("stub")
}
diff --git a/src/components/script/html/hubbub_html_parser.rs b/src/components/script/html/hubbub_html_parser.rs
index c4ac7db18ef..64340a28b77 100644
--- a/src/components/script/html/hubbub_html_parser.rs
+++ b/src/components/script/html/hubbub_html_parser.rs
@@ -209,7 +209,7 @@ fn js_script_listener(to_parent: SharedChan<HtmlDiscoveryMessage>,
// Silly macros to handle constructing DOM nodes. This produces bad code and should be optimized
// via atomization (issue #85).
-fn build_element_from_tag(cx: *JSContext, tag: &str) -> AbstractNode<ScriptView> {
+pub fn build_element_from_tag(cx: *JSContext, tag: &str) -> AbstractNode<ScriptView> {
// TODO (Issue #85): use atoms
handle_element!(cx, tag, "a", HTMLAnchorElementTypeId, HTMLAnchorElement, []);
handle_element!(cx, tag, "applet", HTMLAppletElementTypeId, HTMLAppletElement, []);
diff --git a/src/test/html/content/test_create_element.html b/src/test/html/content/test_create_element.html
new file mode 100644
index 00000000000..c59106b6603
--- /dev/null
+++ b/src/test/html/content/test_create_element.html
@@ -0,0 +1,17 @@
+<html>
+<head>
+ <title></title>
+ <script src="harness.js"></script>
+</head>
+<body>
+ <script>
+ var elem = document.createElement("foo");
+ is(elem.tagName, "FOO");
+ var elem = document.createElement("p");
+ is(elem instanceof HTMLParagraphElement, true);
+ var text = document.createTextNode("hello");
+ is(text instanceof Text, true);
+ finish();
+ </script>
+</body>
+</html>