aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--components/net/about_loader.rs1
-rw-r--r--components/net/blob_loader.rs1
-rw-r--r--components/net/http_loader.rs1
-rw-r--r--components/net_traits/lib.rs4
-rw-r--r--components/script/dom/document.rs26
-rw-r--r--components/script/dom/domimplementation.rs3
-rw-r--r--components/script/dom/domparser.rs6
-rw-r--r--components/script/dom/node.rs2
-rw-r--r--components/script/dom/webidls/Document.webidl2
-rw-r--r--components/script/dom/xmldocument.rs3
-rw-r--r--components/script/dom/xmlhttprequest.rs4
-rw-r--r--components/script/parse/html.rs3
-rw-r--r--components/script/script_thread.rs8
-rw-r--r--tests/wpt/metadata/XMLHttpRequest/responsexml-document-properties.htm.ini3
-rw-r--r--tests/wpt/metadata/html/dom/interfaces.html.ini9
-rw-r--r--tests/wpt/mozilla/tests/mozilla/referrer-policy/generic/referrer-policy-test-case.js9
-rw-r--r--tests/wpt/mozilla/tests/mozilla/referrer-policy/generic/template/document.html.template2
17 files changed, 55 insertions, 32 deletions
diff --git a/components/net/about_loader.rs b/components/net/about_loader.rs
index e5b1756cac3..92f910cbca0 100644
--- a/components/net/about_loader.rs
+++ b/components/net/about_loader.rs
@@ -36,6 +36,7 @@ pub fn factory(mut load_data: LoadData,
headers: None,
status: Some(RawStatus(200, "OK".into())),
https_state: HttpsState::None,
+ referrer: None,
};
if let Ok(chan) = start_sending_sniffed_opt(start_chan,
metadata,
diff --git a/components/net/blob_loader.rs b/components/net/blob_loader.rs
index 09a426fbc65..df0c7468d42 100644
--- a/components/net/blob_loader.rs
+++ b/components/net/blob_loader.rs
@@ -46,6 +46,7 @@ pub fn load_blob(load_data: LoadData, start_chan: LoadConsumer,
// https://w3c.github.io/FileAPI/#TwoHundredOK
status: Some(RawStatus(200, "OK".into())),
https_state: HttpsState::None,
+ referrer: None
};
if let Ok(chan) =
diff --git a/components/net/http_loader.rs b/components/net/http_loader.rs
index 10279b79f0d..5b0aeb764f7 100644
--- a/components/net/http_loader.rs
+++ b/components/net/http_loader.rs
@@ -1071,6 +1071,7 @@ pub fn load<A, B>(load_data: &LoadData,
} else {
HttpsState::None
};
+ metadata.referrer = referrer_url;
// Only notify the devtools about the final request that received a response.
if let Some(msg) = msg {
diff --git a/components/net_traits/lib.rs b/components/net_traits/lib.rs
index 60163bb090a..875bbd106aa 100644
--- a/components/net_traits/lib.rs
+++ b/components/net_traits/lib.rs
@@ -565,6 +565,9 @@ pub struct Metadata {
/// Is successful HTTPS connection
pub https_state: HttpsState,
+
+ /// Referrer Url
+ pub referrer: Option<Url>,
}
impl Metadata {
@@ -578,6 +581,7 @@ impl Metadata {
// https://fetch.spec.whatwg.org/#concept-response-status-message
status: Some(RawStatus(200, "OK".into())),
https_state: HttpsState::None,
+ referrer: None,
}
}
diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs
index 8630d64eb7a..44a8e2231ea 100644
--- a/components/script/dom/document.rs
+++ b/components/script/dom/document.rs
@@ -239,6 +239,8 @@ pub struct Document {
origin: Origin,
/// https://w3c.github.io/webappsec-referrer-policy/#referrer-policy-states
referrer_policy: Cell<Option<ReferrerPolicy>>,
+ /// https://html.spec.whatwg.org/multipage/#dom-document-referrer
+ referrer: Option<String>,
}
#[derive(JSTraceable, HeapSizeOf)]
@@ -1630,7 +1632,8 @@ impl Document {
content_type: Option<DOMString>,
last_modified: Option<String>,
source: DocumentSource,
- doc_loader: DocumentLoader)
+ doc_loader: DocumentLoader,
+ referrer: Option<String>)
-> Document {
let url = url.unwrap_or_else(|| Url::parse("about:blank").unwrap());
@@ -1717,6 +1720,7 @@ impl Document {
origin: origin,
//TODO - setting this for now so no Referer header set
referrer_policy: Cell::new(Some(ReferrerPolicy::NoReferrer)),
+ referrer: referrer,
}
}
@@ -1733,7 +1737,8 @@ impl Document {
None,
None,
DocumentSource::NotFromParser,
- docloader))
+ docloader,
+ None))
}
pub fn new(window: &Window,
@@ -1743,7 +1748,8 @@ impl Document {
content_type: Option<DOMString>,
last_modified: Option<String>,
source: DocumentSource,
- doc_loader: DocumentLoader)
+ doc_loader: DocumentLoader,
+ referrer: Option<String>)
-> Root<Document> {
let document = reflect_dom_object(box Document::new_inherited(window,
browsing_context,
@@ -1752,7 +1758,8 @@ impl Document {
content_type,
last_modified,
source,
- doc_loader),
+ doc_loader,
+ referrer),
GlobalRef::Window(window),
DocumentBinding::Wrap);
{
@@ -1816,7 +1823,8 @@ impl Document {
None,
None,
DocumentSource::NotFromParser,
- DocumentLoader::new(&self.loader()));
+ DocumentLoader::new(&self.loader()),
+ None);
new_doc.appropriate_template_contents_owner_document.set(Some(&new_doc));
new_doc
})
@@ -1935,6 +1943,14 @@ impl DocumentMethods for Document {
}
}
+ // https://html.spec.whatwg.org/multipage/#dom-document-referrer
+ fn Referrer(&self) -> DOMString {
+ match self.referrer {
+ Some(ref referrer) => DOMString::from(referrer.to_string()),
+ None => DOMString::new()
+ }
+ }
+
// https://dom.spec.whatwg.org/#dom-document-documenturi
fn DocumentURI(&self) -> USVString {
self.URL()
diff --git a/components/script/dom/domimplementation.rs b/components/script/dom/domimplementation.rs
index 30974ea2f46..1e29ce324b3 100644
--- a/components/script/dom/domimplementation.rs
+++ b/components/script/dom/domimplementation.rs
@@ -129,7 +129,8 @@ impl DOMImplementationMethods for DOMImplementation {
None,
None,
DocumentSource::NotFromParser,
- loader);
+ loader,
+ None);
{
// Step 3.
diff --git a/components/script/dom/domparser.rs b/components/script/dom/domparser.rs
index 346b8f80170..e47492d87e5 100644
--- a/components/script/dom/domparser.rs
+++ b/components/script/dom/domparser.rs
@@ -68,7 +68,8 @@ impl DOMParserMethods for DOMParser {
Some(content_type),
None,
DocumentSource::FromParser,
- loader);
+ loader,
+ None);
parse_html(document.r(), s, url, ParseContext::Owner(None));
document.set_ready_state(DocumentReadyState::Complete);
Ok(document)
@@ -82,7 +83,8 @@ impl DOMParserMethods for DOMParser {
Some(content_type),
None,
DocumentSource::NotFromParser,
- loader);
+ loader,
+ None);
parse_xml(document.r(), s, url, xml::ParseContext::Owner(None));
Ok(document)
}
diff --git a/components/script/dom/node.rs b/components/script/dom/node.rs
index 811716088b6..03ec5496efa 100644
--- a/components/script/dom/node.rs
+++ b/components/script/dom/node.rs
@@ -1721,7 +1721,7 @@ impl Node {
let document = Document::new(window, None,
Some((*document.url()).clone()),
is_html_doc, None,
- None, DocumentSource::NotFromParser, loader);
+ None, DocumentSource::NotFromParser, loader, None);
Root::upcast::<Node>(document)
},
NodeTypeId::Element(..) => {
diff --git a/components/script/dom/webidls/Document.webidl b/components/script/dom/webidls/Document.webidl
index 09b82109ae8..6ea8d3e7e91 100644
--- a/components/script/dom/webidls/Document.webidl
+++ b/components/script/dom/webidls/Document.webidl
@@ -82,7 +82,7 @@ partial /*sealed*/ interface Document {
[/*PutForwards=href, */Unforgeable]
readonly attribute Location? location;
readonly attribute DOMString domain;
- // readonly attribute DOMString referrer;
+ readonly attribute DOMString referrer;
[Throws]
attribute DOMString cookie;
readonly attribute DOMString lastModified;
diff --git a/components/script/dom/xmldocument.rs b/components/script/dom/xmldocument.rs
index b291c912089..52ebce5f55c 100644
--- a/components/script/dom/xmldocument.rs
+++ b/components/script/dom/xmldocument.rs
@@ -41,7 +41,8 @@ impl XMLDocument {
content_type,
last_modified,
source,
- doc_loader),
+ doc_loader,
+ None),
}
}
diff --git a/components/script/dom/xmlhttprequest.rs b/components/script/dom/xmlhttprequest.rs
index 148a51c8c6b..4a6dba72f6f 100644
--- a/components/script/dom/xmlhttprequest.rs
+++ b/components/script/dom/xmlhttprequest.rs
@@ -1234,7 +1234,9 @@ impl XMLHttpRequest {
is_html_document,
content_type,
None,
- DocumentSource::FromParser, docloader)
+ DocumentSource::FromParser,
+ docloader,
+ None)
}
fn filter_response_headers(&self) -> Headers {
diff --git a/components/script/parse/html.rs b/components/script/parse/html.rs
index 87aa7a6b293..e1109cfc008 100644
--- a/components/script/parse/html.rs
+++ b/components/script/parse/html.rs
@@ -279,7 +279,8 @@ pub fn parse_html_fragment(context_node: &Node,
IsHTMLDocument::HTMLDocument,
None, None,
DocumentSource::FromParser,
- loader);
+ loader,
+ None);
// Step 2.
document.set_quirks_mode(context_document.quirks_mode());
diff --git a/components/script/script_thread.rs b/components/script/script_thread.rs
index 9a439f63ab9..aeed396fbb1 100644
--- a/components/script/script_thread.rs
+++ b/components/script/script_thread.rs
@@ -1711,6 +1711,11 @@ impl ScriptThread {
_ => IsHTMLDocument::HTMLDocument,
};
+ let referrer = match metadata.referrer {
+ Some(ref referrer) => Some(referrer.clone().into_string()),
+ None => None,
+ };
+
let document = Document::new(window.r(),
Some(&browsing_context),
Some(final_url.clone()),
@@ -1718,7 +1723,8 @@ impl ScriptThread {
content_type,
last_modified,
DocumentSource::FromParser,
- loader);
+ loader,
+ referrer);
if using_new_context {
browsing_context.init(&document);
} else {
diff --git a/tests/wpt/metadata/XMLHttpRequest/responsexml-document-properties.htm.ini b/tests/wpt/metadata/XMLHttpRequest/responsexml-document-properties.htm.ini
index 3ff6b5afb2b..2d5b2b753d5 100644
--- a/tests/wpt/metadata/XMLHttpRequest/responsexml-document-properties.htm.ini
+++ b/tests/wpt/metadata/XMLHttpRequest/responsexml-document-properties.htm.ini
@@ -3,9 +3,6 @@
[domain]
expected: FAIL
- [referrer]
- expected: FAIL
-
[readyState]
expected: FAIL
diff --git a/tests/wpt/metadata/html/dom/interfaces.html.ini b/tests/wpt/metadata/html/dom/interfaces.html.ini
index 4d393ec05be..19e4415913e 100644
--- a/tests/wpt/metadata/html/dom/interfaces.html.ini
+++ b/tests/wpt/metadata/html/dom/interfaces.html.ini
@@ -3,9 +3,6 @@
[Document interface: attribute domain]
expected: FAIL
- [Document interface: attribute referrer]
- expected: FAIL
-
[Document interface: attribute dir]
expected: FAIL
@@ -6987,9 +6984,6 @@
[Document interface: document.implementation.createDocument(null, "", null) must inherit property "enableStyleSheetsForSet" with the proper type (33)]
expected: FAIL
- [Document interface: document.implementation.createDocument(null, "", null) must inherit property "referrer" with the proper type (36)]
- expected: FAIL
-
[Document interface: document.implementation.createDocument(null, "", null) must inherit property "dir" with the proper type (42)]
expected: FAIL
@@ -7347,9 +7341,6 @@
[Document interface: new Document() must have own property "location"]
expected: FAIL
- [Document interface: new Document() must inherit property "referrer" with the proper type (36)]
- expected: FAIL
-
[Document interface: new Document() must inherit property "dir" with the proper type (42)]
expected: FAIL
diff --git a/tests/wpt/mozilla/tests/mozilla/referrer-policy/generic/referrer-policy-test-case.js b/tests/wpt/mozilla/tests/mozilla/referrer-policy/generic/referrer-policy-test-case.js
index bc81e3d4655..c4cf96fb04b 100644
--- a/tests/wpt/mozilla/tests/mozilla/referrer-policy/generic/referrer-policy-test-case.js
+++ b/tests/wpt/mozilla/tests/mozilla/referrer-policy/generic/referrer-policy-test-case.js
@@ -105,11 +105,10 @@ function ReferrerPolicyTestCase(scenario, testDescription, sanityChecker) {
// Check the reported URL.
test.step(function() {
- // TODO - can uncomment when Document::Referrer is implemented
- // assert_equals(result.referrer,
- // t._expectedReferrerUrl,
- // "Reported Referrer URL is '" +
- // t._scenario.referrer_url + "'.");
+ assert_equals(result.referrer,
+ t._expectedReferrerUrl,
+ "Reported Referrer URL is '" +
+ t._scenario.referrer_url + "'.");
assert_equals(result.headers.referer,
t._expectedReferrerUrl,
"Reported Referrer URL from HTTP header is '" +
diff --git a/tests/wpt/mozilla/tests/mozilla/referrer-policy/generic/template/document.html.template b/tests/wpt/mozilla/tests/mozilla/referrer-policy/generic/template/document.html.template
index 7be7fcc2abf..fa2baa63cf8 100644
--- a/tests/wpt/mozilla/tests/mozilla/referrer-policy/generic/template/document.html.template
+++ b/tests/wpt/mozilla/tests/mozilla/referrer-policy/generic/template/document.html.template
@@ -16,7 +16,7 @@
return(false);
}
- var referrer = 'referrer' in document ? document.referrer : undefined;
+ var referrer = document.referrer.length > 0 ? document.referrer : undefined;
var result = {
location: document.location.toString(),