aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorBruno de Oliveira Abinader <bruno.d@partner.samsung.com>2014-01-29 14:24:49 -0400
committerBruno de Oliveira Abinader <bruno.d@partner.samsung.com>2014-01-30 10:41:24 -0400
commit43416ef91f03378f7b86ecee98aeea359cb9807c (patch)
tree9ee15cce1b1f1a7c7fae7c32874ad47c12110be0 /src
parent0777f211df28e45349a9294a71b81c17800310e7 (diff)
downloadservo-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.rs27
-rw-r--r--src/components/script/dom/domimplementation.rs2
-rw-r--r--src/components/script/dom/domparser.rs2
-rw-r--r--src/components/script/dom/htmldocument.rs9
-rw-r--r--src/components/script/dom/webidls/Document.webidl4
-rw-r--r--src/components/script/script_task.rs2
-rw-r--r--src/test/html/content/test_document_url.html32
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>