diff options
author | bors-servo <release+servo@mozilla.com> | 2013-09-10 15:27:42 -0700 |
---|---|---|
committer | bors-servo <release+servo@mozilla.com> | 2013-09-10 15:27:42 -0700 |
commit | 25a3d4a93fd9892686976d1084d3b23baa05d11a (patch) | |
tree | 1f646854565792356c67d1d6e2140daee30d98d7 /src | |
parent | 7b7fd475ee578d5ce5c439ebcb0e23bd7a2c74b2 (diff) | |
parent | 227bb95213c13fc8267e14b612dadd9a9f223246 (diff) | |
download | servo-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.webidl | 4 | ||||
-rw-r--r-- | src/components/script/dom/document.rs | 17 | ||||
-rw-r--r-- | src/components/script/html/hubbub_html_parser.rs | 2 | ||||
-rw-r--r-- | src/test/html/content/test_create_element.html | 17 |
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> |