diff options
author | Bruno de Oliveira Abinader <bruno.d@partner.samsung.com> | 2014-01-29 14:24:49 -0400 |
---|---|---|
committer | Bruno de Oliveira Abinader <bruno.d@partner.samsung.com> | 2014-01-30 10:41:24 -0400 |
commit | 43416ef91f03378f7b86ecee98aeea359cb9807c (patch) | |
tree | 9ee15cce1b1f1a7c7fae7c32874ad47c12110be0 /src | |
parent | 0777f211df28e45349a9294a71b81c17800310e7 (diff) | |
download | servo-43416ef91f03378f7b86ecee98aeea359cb9807c.tar.gz servo-43416ef91f03378f7b86ecee98aeea359cb9807c.zip |
Implement document.URL & document.documentURI
Specs:
http://dom.spec.whatwg.org/#dom-document-url
http://dom.spec.whatwg.org/#dom-document-documenturi
This is a sub-task for #1428.
Diffstat (limited to 'src')
-rw-r--r-- | src/components/script/dom/document.rs | 27 | ||||
-rw-r--r-- | src/components/script/dom/domimplementation.rs | 2 | ||||
-rw-r--r-- | src/components/script/dom/domparser.rs | 2 | ||||
-rw-r--r-- | src/components/script/dom/htmldocument.rs | 9 | ||||
-rw-r--r-- | src/components/script/dom/webidls/Document.webidl | 4 | ||||
-rw-r--r-- | src/components/script/script_task.rs | 2 | ||||
-rw-r--r-- | src/test/html/content/test_document_url.html | 32 |
7 files changed, 64 insertions, 14 deletions
diff --git a/src/components/script/dom/document.rs b/src/components/script/dom/document.rs index 092b3e63abe..db6302e34d9 100644 --- a/src/components/script/dom/document.rs +++ b/src/components/script/dom/document.rs @@ -25,6 +25,7 @@ use html::hubbub_html_parser::build_element_from_tag; use layout_interface::{DocumentDamageLevel, ContentChangedDocumentDamage}; use servo_util::namespace::Null; +use extra::url::{Url, from_str}; use js::jsapi::{JSObject, JSContext, JSTracer}; use std::ascii::StrAsciiExt; use std::cast; @@ -89,7 +90,8 @@ pub struct Document { doctype: DocumentType, idmap: HashMap<DOMString, AbstractNode>, implementation: Option<@mut DOMImplementation>, - content_type: DOMString + content_type: DOMString, + url: Url } impl Document { @@ -110,7 +112,7 @@ impl Document { abstract } - pub fn new_inherited(window: @mut Window, doctype: DocumentType, content_type: Option<DOMString>) -> Document { + pub fn new_inherited(window: @mut Window, url: Option<Url>, doctype: DocumentType, content_type: Option<DOMString>) -> Document { let node_type = match doctype { HTML => HTMLDocumentTypeId, SVG | XML => PlainDocumentTypeId @@ -130,19 +132,23 @@ impl Document { // http://dom.spec.whatwg.org/#concept-document-content-type SVG | XML => ~"application/xml" } + }, + url: match url { + None => from_str("about:blank").unwrap(), + Some(_url) => _url } } } - pub fn new(window: @mut Window, doctype: DocumentType, content_type: Option<DOMString>) -> AbstractDocument { - let document = Document::new_inherited(window, doctype, content_type); + pub fn new(window: @mut Window, url: Option<Url>, doctype: DocumentType, content_type: Option<DOMString>) -> AbstractDocument { + let document = Document::new_inherited(window, url, doctype, content_type); Document::reflect_document(@mut document, window, DocumentBinding::Wrap) } } impl Document { pub fn Constructor(owner: @mut Window) -> Fallible<AbstractDocument> { - Ok(Document::new(owner, XML, None)) + Ok(Document::new(owner, None, XML, None)) } } @@ -167,6 +173,7 @@ impl Reflectable for Document { } impl Document { + // http://dom.spec.whatwg.org/#dom-document-implementation pub fn Implementation(&mut self) -> @mut DOMImplementation { if self.implementation.is_none() { self.implementation = Some(DOMImplementation::new(self.window)); @@ -174,6 +181,16 @@ impl Document { self.implementation.unwrap() } + // http://dom.spec.whatwg.org/#dom-document-url + pub fn URL(&self) -> DOMString { + self.url.to_str() + } + + // http://dom.spec.whatwg.org/#dom-document-documenturi + pub fn DocumentURI(&self) -> DOMString { + self.URL() + } + // http://dom.spec.whatwg.org/#dom-document-content_type pub fn ContentType(&self) -> DOMString { self.content_type.clone() diff --git a/src/components/script/dom/domimplementation.rs b/src/components/script/dom/domimplementation.rs index 33a97be5c55..adadb20b64b 100644 --- a/src/components/script/dom/domimplementation.rs +++ b/src/components/script/dom/domimplementation.rs @@ -63,7 +63,7 @@ impl DOMImplementation { // http://dom.spec.whatwg.org/#dom-domimplementation-createhtmldocument pub fn CreateHTMLDocument(&self, title: Option<DOMString>) -> AbstractDocument { // Step 1-2. - let abstract_doc = HTMLDocument::new(self.owner); + let abstract_doc = HTMLDocument::new(self.owner, None); assert!(abstract_doc.document().doctype == HTML); let abstract_node = AbstractNode::from_document(abstract_doc); diff --git a/src/components/script/dom/domparser.rs b/src/components/script/dom/domparser.rs index c7515c549ea..00033983490 100644 --- a/src/components/script/dom/domparser.rs +++ b/src/components/script/dom/domparser.rs @@ -38,7 +38,7 @@ impl DOMParser { -> Fallible<AbstractDocument> { match ty { Text_html => { - Ok(HTMLDocument::new(self.owner)) + Ok(HTMLDocument::new(self.owner, None)) } Text_xml => { Document::Constructor(self.owner) diff --git a/src/components/script/dom/htmldocument.rs b/src/components/script/dom/htmldocument.rs index 0dad2905d89..6dcab51fa89 100644 --- a/src/components/script/dom/htmldocument.rs +++ b/src/components/script/dom/htmldocument.rs @@ -9,6 +9,7 @@ use dom::htmlcollection::HTMLCollection; use dom::window::Window; use servo_util::namespace::Null; +use extra::url::Url; use js::jsapi::JSTracer; use std::str::eq_slice; @@ -17,14 +18,14 @@ pub struct HTMLDocument { } impl HTMLDocument { - pub fn new_inherited(window: @mut Window) -> HTMLDocument { + pub fn new_inherited(window: @mut Window, url: Option<Url>) -> HTMLDocument { HTMLDocument { - parent: Document::new_inherited(window, HTML, None) + parent: Document::new_inherited(window, url, HTML, None) } } - pub fn new(window: @mut Window) -> AbstractDocument { - let document = HTMLDocument::new_inherited(window); + pub fn new(window: @mut Window, url: Option<Url>) -> AbstractDocument { + let document = HTMLDocument::new_inherited(window, url); Document::reflect_document(@mut document, window, HTMLDocumentBinding::Wrap) } } diff --git a/src/components/script/dom/webidls/Document.webidl b/src/components/script/dom/webidls/Document.webidl index 2637afdaf34..6bf6ab776d2 100644 --- a/src/components/script/dom/webidls/Document.webidl +++ b/src/components/script/dom/webidls/Document.webidl @@ -26,8 +26,8 @@ enum VisibilityState { "hidden", "visible" }; [Constructor] interface Document : Node { readonly attribute DOMImplementation implementation; - // readonly attribute DOMString URL; - // readonly attribute DOMString documentURI; + readonly attribute DOMString URL; + readonly attribute DOMString documentURI; // readonly attribute DOMString compatMode; // readonly attribute DOMString characterSet; readonly attribute DOMString contentType; diff --git a/src/components/script/script_task.rs b/src/components/script/script_task.rs index b226f05916b..02ffdc49f75 100644 --- a/src/components/script/script_task.rs +++ b/src/components/script/script_task.rs @@ -690,7 +690,7 @@ impl ScriptTask { // Parse HTML. // // Note: We can parse the next document in parallel with any previous documents. - let document = HTMLDocument::new(window); + let document = HTMLDocument::new(window, Some(url.clone())); let html_parsing_result = hubbub_html_parser::parse_html(cx.ptr, document, url.clone(), diff --git a/src/test/html/content/test_document_url.html b/src/test/html/content/test_document_url.html new file mode 100644 index 00000000000..fc0d8c338c1 --- /dev/null +++ b/src/test/html/content/test_document_url.html @@ -0,0 +1,32 @@ +<!doctype html> +<html> + <head> + <title></title> + <script src="harness.js"></script> + <script> + // test1: URL & documentURI + { + isnot(document.URL, null, "test1-0, URL & documentURI"); + isnot(document.documentURI, null, "test1-1, URL & documentURI"); + is(document.URL, document.documentURI, "test1-2, URL & documentURI"); + } + + // test2: new document + { + var doc = new Document(); + is(doc.URL, "about:blank", "test2-0, new document"); + } + + // test3: current document + { + var url = document.URL.split("/"); + is(url[0], "file:", "test3-0, current document"); + is(url[url.length-1], "test_document_url.html", "test3-1, current document"); + } + + finish(); + </script> + </head> + <body> + </body> +</html> |