diff options
-rw-r--r-- | components/net/about_loader.rs | 1 | ||||
-rw-r--r-- | components/net/blob_loader.rs | 1 | ||||
-rw-r--r-- | components/net/http_loader.rs | 1 | ||||
-rw-r--r-- | components/net_traits/lib.rs | 4 | ||||
-rw-r--r-- | components/script/dom/document.rs | 26 | ||||
-rw-r--r-- | components/script/dom/domimplementation.rs | 3 | ||||
-rw-r--r-- | components/script/dom/domparser.rs | 6 | ||||
-rw-r--r-- | components/script/dom/node.rs | 2 | ||||
-rw-r--r-- | components/script/dom/webidls/Document.webidl | 2 | ||||
-rw-r--r-- | components/script/dom/xmldocument.rs | 3 | ||||
-rw-r--r-- | components/script/dom/xmlhttprequest.rs | 4 | ||||
-rw-r--r-- | components/script/parse/html.rs | 3 | ||||
-rw-r--r-- | components/script/script_thread.rs | 8 | ||||
-rw-r--r-- | tests/wpt/metadata/XMLHttpRequest/responsexml-document-properties.htm.ini | 3 | ||||
-rw-r--r-- | tests/wpt/metadata/html/dom/interfaces.html.ini | 9 | ||||
-rw-r--r-- | tests/wpt/mozilla/tests/mozilla/referrer-policy/generic/referrer-policy-test-case.js | 9 | ||||
-rw-r--r-- | tests/wpt/mozilla/tests/mozilla/referrer-policy/generic/template/document.html.template | 2 |
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(), |