Commit 94591b92 authored by Charlie Hu's avatar Charlie Hu Committed by Commit Bot

Add origin trial check on document policy

This CL filters out features that are disabled by origin trial
when initializing document policy in SecurityContextInit and when
parsing from policy attribute on iframe element.

Bug: 993790
Change-Id: I5b6a9f9e4b19275cb483c23c8d3cefa9e74af29c
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2019925
Commit-Queue: Charlie Hu <chenleihu@google.com>
Reviewed-by: default avatarDaniel Cheng <dcheng@chromium.org>
Reviewed-by: default avatarIan Clelland <iclelland@chromium.org>
Cr-Commit-Position: refs/heads/master@{#737861}
parent af6d0254
...@@ -84,4 +84,18 @@ bool DisabledByOriginTrial(const String& feature_name, ...@@ -84,4 +84,18 @@ bool DisabledByOriginTrial(const String& feature_name,
return false; return false;
} }
bool DisabledByOriginTrial(mojom::blink::FeaturePolicyFeature feature,
FeatureContext* feature_context) {
{% for feature_name, dependencies in origin_trial_dependency_map.items() | sort %}
if (feature == mojom::FeaturePolicyFeature::k{{feature_name}}) {
return
{%- for dependency in dependencies %}
{%- if not loop.first %} &&{% endif %}
!RuntimeEnabledFeatures::{{dependency}}Enabled(feature_context)
{%- endfor %};
}
{% endfor %}
return false;
}
} // namespace blink } // namespace blink
...@@ -63,7 +63,7 @@ SecurityContextInit::SecurityContextInit(const DocumentInit& initializer) { ...@@ -63,7 +63,7 @@ SecurityContextInit::SecurityContextInit(const DocumentInit& initializer) {
InitializeFeaturePolicy(initializer); InitializeFeaturePolicy(initializer);
// Initialize document policy. // Initialize document policy.
document_policy_ = initializer.GetDocumentPolicy(); InitializeDocumentPolicy(initializer);
// Initialize the agent. Depends on security origin. // Initialize the agent. Depends on security origin.
InitializeAgent(initializer); InitializeAgent(initializer);
...@@ -260,6 +260,19 @@ void SecurityContextInit::InitializeOrigin(const DocumentInit& initializer) { ...@@ -260,6 +260,19 @@ void SecurityContextInit::InitializeOrigin(const DocumentInit& initializer) {
} }
} }
void SecurityContextInit::InitializeDocumentPolicy(
const DocumentInit& initializer) {
// Because Document-Policy http header is parsed in DocumentLoader,
// when origin trial context is not initialized yet.
// Needs to filter out features that are not in origin trial after
// we have origin trial information available.
for (const auto& entry : initializer.GetDocumentPolicy()) {
if (!DisabledByOriginTrial(entry.first, this)) {
document_policy_.insert(entry);
}
}
}
void SecurityContextInit::InitializeFeaturePolicy( void SecurityContextInit::InitializeFeaturePolicy(
const DocumentInit& initializer) { const DocumentInit& initializer) {
initialized_feature_policy_state_ = true; initialized_feature_policy_state_ = true;
...@@ -341,9 +354,7 @@ std::unique_ptr<FeaturePolicy> SecurityContextInit::CreateFeaturePolicy() ...@@ -341,9 +354,7 @@ std::unique_ptr<FeaturePolicy> SecurityContextInit::CreateFeaturePolicy()
std::unique_ptr<DocumentPolicy> SecurityContextInit::CreateDocumentPolicy() std::unique_ptr<DocumentPolicy> SecurityContextInit::CreateDocumentPolicy()
const { const {
if (!document_policy_) return DocumentPolicy::CreateWithHeaderPolicy(document_policy_);
return nullptr;
return DocumentPolicy::CreateWithHeaderPolicy(document_policy_.value());
} }
void SecurityContextInit::InitializeSecureContextMode( void SecurityContextInit::InitializeSecureContextMode(
......
...@@ -74,6 +74,7 @@ class CORE_EXPORT SecurityContextInit : public FeaturePolicyParserDelegate { ...@@ -74,6 +74,7 @@ class CORE_EXPORT SecurityContextInit : public FeaturePolicyParserDelegate {
void InitializeContentSecurityPolicy(const DocumentInit&); void InitializeContentSecurityPolicy(const DocumentInit&);
void InitializeOrigin(const DocumentInit&); void InitializeOrigin(const DocumentInit&);
void InitializeSandboxFlags(const DocumentInit&); void InitializeSandboxFlags(const DocumentInit&);
void InitializeDocumentPolicy(const DocumentInit&);
void InitializeFeaturePolicy(const DocumentInit&); void InitializeFeaturePolicy(const DocumentInit&);
void InitializeSecureContextMode(const DocumentInit&); void InitializeSecureContextMode(const DocumentInit&);
void InitializeOriginTrials(const DocumentInit&); void InitializeOriginTrials(const DocumentInit&);
...@@ -81,7 +82,7 @@ class CORE_EXPORT SecurityContextInit : public FeaturePolicyParserDelegate { ...@@ -81,7 +82,7 @@ class CORE_EXPORT SecurityContextInit : public FeaturePolicyParserDelegate {
scoped_refptr<SecurityOrigin> security_origin_; scoped_refptr<SecurityOrigin> security_origin_;
WebSandboxFlags sandbox_flags_ = WebSandboxFlags::kNone; WebSandboxFlags sandbox_flags_ = WebSandboxFlags::kNone;
base::Optional<DocumentPolicy::FeatureState> document_policy_; DocumentPolicy::FeatureState document_policy_;
bool initialized_feature_policy_state_ = false; bool initialized_feature_policy_state_ = false;
Vector<String> feature_policy_parse_messages_; Vector<String> feature_policy_parse_messages_;
ParsedFeaturePolicy feature_policy_header_; ParsedFeaturePolicy feature_policy_header_;
......
...@@ -36,6 +36,10 @@ const FeatureSet& GetAvailableDocumentPolicyFeatures(); ...@@ -36,6 +36,10 @@ const FeatureSet& GetAvailableDocumentPolicyFeatures();
// origin trial controlled, and the origin trial is not enabled). // origin trial controlled, and the origin trial is not enabled).
bool DisabledByOriginTrial(const String&, FeatureContext*); bool DisabledByOriginTrial(const String&, FeatureContext*);
// Returns true if this feature is currently disabled by an origin trial (it is
// origin trial controlled, and the origin trial is not enabled).
bool DisabledByOriginTrial(mojom::blink::FeaturePolicyFeature, FeatureContext*);
} // namespace blink } // namespace blink
#endif // THIRD_PARTY_BLINK_RENDERER_CORE_FEATURE_POLICY_FEATURE_POLICY_HELPER_H_ #endif // THIRD_PARTY_BLINK_RENDERER_CORE_FEATURE_POLICY_FEATURE_POLICY_HELPER_H_
...@@ -314,9 +314,15 @@ void HTMLFrameOwnerElement::UpdateRequiredPolicy() { ...@@ -314,9 +314,15 @@ void HTMLFrameOwnerElement::UpdateRequiredPolicy() {
ConstructRequiredPolicy(); ConstructRequiredPolicy();
const auto* frame = GetDocument().GetFrame(); const auto* frame = GetDocument().GetFrame();
DCHECK(frame); DCHECK(frame);
frame_policy_.required_document_policy = DocumentPolicy::MergeFeatureState( DocumentPolicy::FeatureState new_required_policy;
self_required_policy, for (const auto& entry : DocumentPolicy::MergeFeatureState(
frame->GetRequiredDocumentPolicy() /* parent required policy */); self_required_policy,
frame->GetRequiredDocumentPolicy() /* parent required policy */)) {
if (!DisabledByOriginTrial(entry.first, &GetDocument()))
new_required_policy.insert(entry);
}
frame_policy_.required_document_policy = std::move(new_required_policy);
if (ContentFrame()) { if (ContentFrame()) {
frame->Client()->DidChangeFramePolicy(ContentFrame(), frame_policy_); frame->Client()->DidChangeFramePolicy(ContentFrame(), frame_policy_);
} }
......
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