Commit 000b11bd authored by Hiroki Nakagawa's avatar Hiroki Nakagawa Committed by Commit Bot

ES Modules: Set referrer for top-level module script in ModuleScriptLoader

Before this CL, referrer for top-level module script is set in
BaseFetchContext::AddAdditionalRequestHeaders() using
ExecutionContext::GetOutgoingReferrer(). This works for documents, but doesn't
for workers because this execution context is corresponding to "module map
settings object", not "fetch client settings object".

To fix this, this CL sets the referrer for top-level module script using "fetch
client settings object" in ModuleScriptLoader as the spec defines.

Change-Id: I0878b13febdae4ee2dc56c998e7f2c100e9c1ba7
Bug: 842553
Reviewed-on: https://chromium-review.googlesource.com/1102236Reviewed-by: default avatarKouhei Ueno <kouhei@chromium.org>
Commit-Queue: Hiroki Nakagawa <nhiroki@chromium.org>
Cr-Commit-Position: refs/heads/master@{#567937}
parent df6364f8
This is a testharness.js-based test.
FAIL Same-origin top-level module script loading with "no-referrer" referrer policy assert_equals: expected "" but got "http://web-platform.test:8001/workers/modules/resources/referrer-checker.py"
FAIL Same-origin top-level module script loading with "origin" referrer policy assert_equals: expected "http://web-platform.test:8001/" but got "http://web-platform.test:8001/workers/modules/resources/referrer-checker.py"
FAIL Same-origin top-level module script loading with "same-origin" referrer policy assert_equals: expected "http://web-platform.test:8001/workers/modules/resources/referrer-window.html" but got "http://web-platform.test:8001/workers/modules/resources/referrer-checker.py"
PASS Same-origin static import with "no-referrer" referrer policy.
PASS Same-origin static import with "origin" referrer policy.
PASS Same-origin static import with "same-origin" referrer policy.
PASS Cross-origin static import with "no-referrer" referrer policy.
PASS Cross-origin static import with "origin" referrer policy.
PASS Cross-origin static import with "same-origin" referrer policy.
PASS Same-origin dynamic import with "no-referrer" referrer policy.
PASS Same-origin dynamic import with "origin" referrer policy.
PASS Same-origin dynamic import with "same-origin" referrer policy.
PASS Cross-origin dynamic import with "no-referrer" referrer policy.
PASS Cross-origin dynamic import with "origin" referrer policy.
PASS Cross-origin dynamic import with "same-origin" referrer policy.
Harness: the test ran to completion.
...@@ -104,7 +104,7 @@ import_referrer_test( ...@@ -104,7 +104,7 @@ import_referrer_test(
import_referrer_test( import_referrer_test(
{ scriptURL: 'referrer-checker.py', { scriptURL: 'referrer-checker.py',
windowReferrerPolicy: 'same-origin', windowReferrerPolicy: 'same-origin',
expectedReferrer: createURLString('resources/referrer-window.html') }, expectedReferrer: createURLString('resources/new-worker-window.html') },
'Same-origin top-level module script loading with "same-origin" referrer ' + 'Same-origin top-level module script loading with "same-origin" referrer ' +
'policy'); 'policy');
......
...@@ -539,7 +539,7 @@ static void ModulePreloadIfNeeded(const LinkLoadParameters& params, ...@@ -539,7 +539,7 @@ static void ModulePreloadIfNeeded(const LinkLoadParameters& params,
params.href, destination, params.href, destination,
ScriptFetchOptions(params.nonce, integrity_metadata, params.integrity, ScriptFetchOptions(params.nonce, integrity_metadata, params.integrity,
kNotParserInserted, credentials_mode), kNotParserInserted, credentials_mode),
Referrer::NoReferrer(), params.referrer_policy, Referrer(Referrer::NoReferrer(), params.referrer_policy),
TextPosition::MinimumPosition()); TextPosition::MinimumPosition());
// Step 10. "Fetch a single module script given url, settings object, // Step 10. "Fetch a single module script given url, settings object,
......
...@@ -478,8 +478,7 @@ class ModulePreloadTestModulator final : public DummyModulator { ...@@ -478,8 +478,7 @@ class ModulePreloadTestModulator final : public DummyModulator {
EXPECT_EQ(kNotParserInserted, request.Options().ParserState()); EXPECT_EQ(kNotParserInserted, request.Options().ParserState());
EXPECT_EQ(params_->expected_credentials_mode, EXPECT_EQ(params_->expected_credentials_mode,
request.Options().CredentialsMode()); request.Options().CredentialsMode());
EXPECT_EQ(AtomicString(), request.GetReferrer()); EXPECT_EQ(Referrer::NoReferrer(), request.GetReferrer().referrer);
EXPECT_EQ(params_->referrer_policy, request.GetReferrerPolicy());
EXPECT_EQ(params_->integrity, EXPECT_EQ(params_->integrity,
request.Options().GetIntegrityAttributeValue()); request.Options().GetIntegrityAttributeValue());
} }
......
...@@ -24,37 +24,32 @@ class ModuleScriptFetchRequest final { ...@@ -24,37 +24,32 @@ class ModuleScriptFetchRequest final {
ModuleScriptFetchRequest(const KURL& url, ModuleScriptFetchRequest(const KURL& url,
WebURLRequest::RequestContext destination, WebURLRequest::RequestContext destination,
const ScriptFetchOptions& options, const ScriptFetchOptions& options,
const String& referrer, const Referrer& referrer,
ReferrerPolicy referrer_policy,
const TextPosition& referrer_position) const TextPosition& referrer_position)
: url_(url), : url_(url),
destination_(destination), destination_(destination),
options_(options), options_(options),
referrer_(referrer), referrer_(referrer),
referrer_policy_(referrer_policy),
referrer_position_(referrer_position) {} referrer_position_(referrer_position) {}
static ModuleScriptFetchRequest CreateForTest(const KURL& url) { static ModuleScriptFetchRequest CreateForTest(const KURL& url) {
return ModuleScriptFetchRequest( return ModuleScriptFetchRequest(url, WebURLRequest::kRequestContextScript,
url, WebURLRequest::kRequestContextScript, ScriptFetchOptions(), ScriptFetchOptions(), Referrer(),
Referrer::NoReferrer(), kReferrerPolicyDefault, TextPosition::MinimumPosition());
TextPosition::MinimumPosition());
} }
~ModuleScriptFetchRequest() = default; ~ModuleScriptFetchRequest() = default;
const KURL& Url() const { return url_; } const KURL& Url() const { return url_; }
WebURLRequest::RequestContext Destination() const { return destination_; } WebURLRequest::RequestContext Destination() const { return destination_; }
const ScriptFetchOptions& Options() const { return options_; } const ScriptFetchOptions& Options() const { return options_; }
const AtomicString& GetReferrer() const { return referrer_; } const Referrer& GetReferrer() const { return referrer_; }
ReferrerPolicy GetReferrerPolicy() const { return referrer_policy_; }
const TextPosition& GetReferrerPosition() const { return referrer_position_; } const TextPosition& GetReferrerPosition() const { return referrer_position_; }
private: private:
const KURL url_; const KURL url_;
const WebURLRequest::RequestContext destination_; const WebURLRequest::RequestContext destination_;
const ScriptFetchOptions options_; const ScriptFetchOptions options_;
const AtomicString referrer_; const Referrer referrer_;
const ReferrerPolicy referrer_policy_;
const TextPosition referrer_position_; const TextPosition referrer_position_;
}; };
......
...@@ -125,7 +125,7 @@ void ModuleScriptLoader::FetchInternal( ...@@ -125,7 +125,7 @@ void ModuleScriptLoader::FetchInternal(
if (level == ModuleGraphLevel::kDependentModuleFetch) { if (level == ModuleGraphLevel::kDependentModuleFetch) {
options.initiator_info.imported_module_referrer = options.initiator_info.imported_module_referrer =
module_request.GetReferrer(); module_request.GetReferrer().referrer;
options.initiator_info.position = module_request.GetReferrerPosition(); options.initiator_info.position = module_request.GetReferrerPosition();
} }
...@@ -150,12 +150,8 @@ void ModuleScriptLoader::FetchInternal( ...@@ -150,12 +150,8 @@ void ModuleScriptLoader::FetchInternal(
options_.CredentialsMode()); options_.CredentialsMode());
// Step 5. "... referrer is referrer, ..." [spec text] // Step 5. "... referrer is referrer, ..." [spec text]
if (!module_request.GetReferrer().IsNull()) { fetch_params.MutableResourceRequest().SetHTTPReferrer(
fetch_params.MutableResourceRequest().SetHTTPReferrer( module_request.GetReferrer());
SecurityPolicy::GenerateReferrer(module_request.GetReferrerPolicy(),
module_request.Url(),
module_request.GetReferrer()));
}
// Step 5. "... and client is fetch client settings object." [spec text] // Step 5. "... and client is fetch client settings object." [spec text]
// -> set by ResourceFetcher // -> set by ResourceFetcher
......
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
#include "third_party/blink/renderer/platform/bindings/v8_throw_exception.h" #include "third_party/blink/renderer/platform/bindings/v8_throw_exception.h"
#include "third_party/blink/renderer/platform/loader/fetch/resource_loading_log.h" #include "third_party/blink/renderer/platform/loader/fetch/resource_loading_log.h"
#include "third_party/blink/renderer/platform/runtime_enabled_features.h" #include "third_party/blink/renderer/platform/runtime_enabled_features.h"
#include "third_party/blink/renderer/platform/weborigin/security_policy.h"
#include "third_party/blink/renderer/platform/wtf/vector.h" #include "third_party/blink/renderer/platform/wtf/vector.h"
#include "v8/include/v8.h" #include "v8/include/v8.h"
...@@ -182,8 +183,10 @@ void ModuleTreeLinker::FetchRoot(const KURL& original_url, ...@@ -182,8 +183,10 @@ void ModuleTreeLinker::FetchRoot(const KURL& original_url,
// Step 2. Perform the internal module script graph fetching procedure given // Step 2. Perform the internal module script graph fetching procedure given
// ... with the top-level module fetch flag set. ... // ... with the top-level module fetch flag set. ...
ModuleScriptFetchRequest request( ModuleScriptFetchRequest request(
url, destination_, options, Referrer::NoReferrer(), url, destination_, options,
fetch_client_settings_object_.GetReferrerPolicy(), SecurityPolicy::GenerateReferrer(
fetch_client_settings_object_.GetReferrerPolicy(), url,
fetch_client_settings_object_.GetOutgoingReferrer()),
TextPosition::MinimumPosition()); TextPosition::MinimumPosition());
InitiateInternalModuleScriptGraphFetching( InitiateInternalModuleScriptGraphFetching(
...@@ -373,8 +376,11 @@ void ModuleTreeLinker::FetchDescendants(ModuleScript* module_script) { ...@@ -373,8 +376,11 @@ void ModuleTreeLinker::FetchDescendants(ModuleScript* module_script) {
// [FD] Step 7. ... perform the internal module script graph fetching // [FD] Step 7. ... perform the internal module script graph fetching
// procedure given ... with the top-level module fetch flag unset. ... // procedure given ... with the top-level module fetch flag unset. ...
ModuleScriptFetchRequest request( ModuleScriptFetchRequest request(
urls[i], destination_, options, module_script->BaseURL().GetString(), urls[i], destination_, options,
fetch_client_settings_object_.GetReferrerPolicy(), positions[i]); SecurityPolicy::GenerateReferrer(
fetch_client_settings_object_.GetReferrerPolicy(), urls[i],
module_script->BaseURL().GetString()),
positions[i]);
InitiateInternalModuleScriptGraphFetching( InitiateInternalModuleScriptGraphFetching(
request, ModuleGraphLevel::kDependentModuleFetch); request, ModuleGraphLevel::kDependentModuleFetch);
} }
......
...@@ -11,13 +11,15 @@ namespace blink { ...@@ -11,13 +11,15 @@ namespace blink {
FetchClientSettingsObjectSnapshot::FetchClientSettingsObjectSnapshot( FetchClientSettingsObjectSnapshot::FetchClientSettingsObjectSnapshot(
ExecutionContext& execution_context) ExecutionContext& execution_context)
: FetchClientSettingsObjectSnapshot(execution_context.GetSecurityOrigin(), : FetchClientSettingsObjectSnapshot(execution_context.GetSecurityOrigin(),
execution_context.GetReferrerPolicy()) { execution_context.GetReferrerPolicy(),
} execution_context.OutgoingReferrer()) {}
FetchClientSettingsObjectSnapshot::FetchClientSettingsObjectSnapshot( FetchClientSettingsObjectSnapshot::FetchClientSettingsObjectSnapshot(
const scoped_refptr<const SecurityOrigin> security_origin, const scoped_refptr<const SecurityOrigin> security_origin,
ReferrerPolicy referrer_policy) ReferrerPolicy referrer_policy,
const String& outgoing_referrer)
: security_origin_(std::move(security_origin)), : security_origin_(std::move(security_origin)),
referrer_policy_(referrer_policy) {} referrer_policy_(referrer_policy),
outgoing_referrer_(outgoing_referrer) {}
} // namespace blink } // namespace blink
...@@ -35,7 +35,8 @@ class CORE_EXPORT FetchClientSettingsObjectSnapshot final { ...@@ -35,7 +35,8 @@ class CORE_EXPORT FetchClientSettingsObjectSnapshot final {
explicit FetchClientSettingsObjectSnapshot(ExecutionContext&); explicit FetchClientSettingsObjectSnapshot(ExecutionContext&);
FetchClientSettingsObjectSnapshot( FetchClientSettingsObjectSnapshot(
const scoped_refptr<const SecurityOrigin> security_origin, const scoped_refptr<const SecurityOrigin> security_origin,
ReferrerPolicy referrer_policy); ReferrerPolicy referrer_policy,
const String& outgoing_referrer);
virtual ~FetchClientSettingsObjectSnapshot() = default; virtual ~FetchClientSettingsObjectSnapshot() = default;
...@@ -50,16 +51,22 @@ class CORE_EXPORT FetchClientSettingsObjectSnapshot final { ...@@ -50,16 +51,22 @@ class CORE_EXPORT FetchClientSettingsObjectSnapshot final {
// https://html.spec.whatwg.org/multipage/webappapis.html#concept-settings-object-referrer-policy // https://html.spec.whatwg.org/multipage/webappapis.html#concept-settings-object-referrer-policy
ReferrerPolicy GetReferrerPolicy() const { return referrer_policy_; } ReferrerPolicy GetReferrerPolicy() const { return referrer_policy_; }
// "referrerURL" used in the "Determine request's Referrer" algorithm:
// https://w3c.github.io/webappsec-referrer-policy/#determine-requests-referrer
const String& GetOutgoingReferrer() const { return outgoing_referrer_; }
// Makes an copy of this instance. This is typically used for cross-thread // Makes an copy of this instance. This is typically used for cross-thread
// communication in CrossThreadCopier. // communication in CrossThreadCopier.
FetchClientSettingsObjectSnapshot IsolatedCopy() const { FetchClientSettingsObjectSnapshot IsolatedCopy() const {
return FetchClientSettingsObjectSnapshot(security_origin_->IsolatedCopy(), return FetchClientSettingsObjectSnapshot(security_origin_->IsolatedCopy(),
referrer_policy_); referrer_policy_,
outgoing_referrer_.IsolatedCopy());
} }
private: private:
const scoped_refptr<const SecurityOrigin> security_origin_; const scoped_refptr<const SecurityOrigin> security_origin_;
const ReferrerPolicy referrer_policy_; const ReferrerPolicy referrer_policy_;
const String outgoing_referrer_;
}; };
template <> template <>
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment