Commit 3f197642 authored by Ehsan Karamad's avatar Ehsan Karamad Committed by Commit Bot

Introduce feature policy: document-stream-insertion

This CL introduces a new experimental feature
'document-stream-insertion' whose purpose is to limit the usage of
specific (anti-pattern) javascript API for "dynamic markup insertion".

The list of javascript methods to be blocked by this feature are:
document.{write, writeln, open, close}.
The set of disabled APIs is a subset of "dynamic-markup-insertion" from
HTML spec:

https://dev.w3.org/html5/spec-LC/apis-in-html-documents.html#dynamic-markup-insertion
https://html.spec.whatwg.org/multipage/dynamic-markup-insertion.html#dynamic-markup-insertion

Bug: 841605
Change-Id: I9cc31fab36e2cea70cdce575e3868ce1d0cfecfa
Reviewed-on: https://chromium-review.googlesource.com/1053349Reviewed-by: default avatarEhsan Karamad <ekaramad@chromium.org>
Reviewed-by: default avatarAlex Moshchuk <alexmos@chromium.org>
Reviewed-by: default avatarOjan Vafai <ojan@chromium.org>
Reviewed-by: default avatarIan Clelland <iclelland@chromium.org>
Reviewed-by: default avatarKen Buchanan <kenrb@chromium.org>
Commit-Queue: Ehsan Karamad <ekaramad@chromium.org>
Cr-Commit-Position: refs/heads/master@{#558847}
parent 39bd6b8f
...@@ -30,7 +30,7 @@ class RenderFrameHostFeaturePolicyTest ...@@ -30,7 +30,7 @@ class RenderFrameHostFeaturePolicyTest
static constexpr const char* kOrigin4 = "https://test.com"; static constexpr const char* kOrigin4 = "https://test.com";
static const blink::mojom::FeaturePolicyFeature kDefaultEnabledFeature = static const blink::mojom::FeaturePolicyFeature kDefaultEnabledFeature =
blink::mojom::FeaturePolicyFeature::kDocumentWrite; blink::mojom::FeaturePolicyFeature::kDocumentStreamInsertion;
static const blink::mojom::FeaturePolicyFeature kDefaultSelfFeature = static const blink::mojom::FeaturePolicyFeature kDefaultSelfFeature =
blink::mojom::FeaturePolicyFeature::kGeolocation; blink::mojom::FeaturePolicyFeature::kGeolocation;
......
...@@ -251,61 +251,62 @@ void FeaturePolicy::AddContainerPolicy( ...@@ -251,61 +251,62 @@ void FeaturePolicy::AddContainerPolicy(
// See third_party/blink/public/common/feature_policy/feature_policy.h for // See third_party/blink/public/common/feature_policy/feature_policy.h for
// status of each feature (in spec, implemented, etc). // status of each feature (in spec, implemented, etc).
const FeaturePolicy::FeatureList& FeaturePolicy::GetDefaultFeatureList() { const FeaturePolicy::FeatureList& FeaturePolicy::GetDefaultFeatureList() {
CR_DEFINE_STATIC_LOCAL(FeatureList, default_feature_list, CR_DEFINE_STATIC_LOCAL(
({{mojom::FeaturePolicyFeature::kAutoplay, FeatureList, default_feature_list,
FeaturePolicy::FeatureDefault::EnableForSelf}, ({{mojom::FeaturePolicyFeature::kAutoplay,
{mojom::FeaturePolicyFeature::kCamera, FeaturePolicy::FeatureDefault::EnableForSelf},
FeaturePolicy::FeatureDefault::EnableForSelf}, {mojom::FeaturePolicyFeature::kCamera,
{mojom::FeaturePolicyFeature::kEncryptedMedia, FeaturePolicy::FeatureDefault::EnableForSelf},
FeaturePolicy::FeatureDefault::EnableForSelf}, {mojom::FeaturePolicyFeature::kEncryptedMedia,
{mojom::FeaturePolicyFeature::kFullscreen, FeaturePolicy::FeatureDefault::EnableForSelf},
FeaturePolicy::FeatureDefault::EnableForSelf}, {mojom::FeaturePolicyFeature::kFullscreen,
{mojom::FeaturePolicyFeature::kGeolocation, FeaturePolicy::FeatureDefault::EnableForSelf},
FeaturePolicy::FeatureDefault::EnableForSelf}, {mojom::FeaturePolicyFeature::kGeolocation,
{mojom::FeaturePolicyFeature::kMicrophone, FeaturePolicy::FeatureDefault::EnableForSelf},
FeaturePolicy::FeatureDefault::EnableForSelf}, {mojom::FeaturePolicyFeature::kMicrophone,
{mojom::FeaturePolicyFeature::kMidiFeature, FeaturePolicy::FeatureDefault::EnableForSelf},
FeaturePolicy::FeatureDefault::EnableForSelf}, {mojom::FeaturePolicyFeature::kMidiFeature,
{mojom::FeaturePolicyFeature::kPayment, FeaturePolicy::FeatureDefault::EnableForSelf},
FeaturePolicy::FeatureDefault::EnableForSelf}, {mojom::FeaturePolicyFeature::kPayment,
{mojom::FeaturePolicyFeature::kSpeaker, FeaturePolicy::FeatureDefault::EnableForSelf},
FeaturePolicy::FeatureDefault::EnableForSelf}, {mojom::FeaturePolicyFeature::kSpeaker,
{mojom::FeaturePolicyFeature::kDocumentCookie, FeaturePolicy::FeatureDefault::EnableForSelf},
FeaturePolicy::FeatureDefault::EnableForAll}, {mojom::FeaturePolicyFeature::kDocumentCookie,
{mojom::FeaturePolicyFeature::kDocumentDomain, FeaturePolicy::FeatureDefault::EnableForAll},
FeaturePolicy::FeatureDefault::EnableForAll}, {mojom::FeaturePolicyFeature::kDocumentDomain,
{mojom::FeaturePolicyFeature::kDocumentWrite, FeaturePolicy::FeatureDefault::EnableForAll},
FeaturePolicy::FeatureDefault::EnableForAll}, {mojom::FeaturePolicyFeature::kSyncScript,
{mojom::FeaturePolicyFeature::kSyncScript, FeaturePolicy::FeatureDefault::EnableForAll},
FeaturePolicy::FeatureDefault::EnableForAll}, {mojom::FeaturePolicyFeature::kSyncXHR,
{mojom::FeaturePolicyFeature::kSyncXHR, FeaturePolicy::FeatureDefault::EnableForAll},
FeaturePolicy::FeatureDefault::EnableForAll}, {mojom::FeaturePolicyFeature::kUsb,
{mojom::FeaturePolicyFeature::kUsb, FeaturePolicy::FeatureDefault::EnableForSelf},
FeaturePolicy::FeatureDefault::EnableForSelf}, {mojom::FeaturePolicyFeature::kAccessibilityEvents,
{mojom::FeaturePolicyFeature::kAccessibilityEvents, FeaturePolicy::FeatureDefault::EnableForSelf},
FeaturePolicy::FeatureDefault::EnableForSelf}, {mojom::FeaturePolicyFeature::kWebVr,
{mojom::FeaturePolicyFeature::kWebVr, FeaturePolicy::FeatureDefault::EnableForSelf},
FeaturePolicy::FeatureDefault::EnableForSelf}, {mojom::FeaturePolicyFeature::kAccelerometer,
{mojom::FeaturePolicyFeature::kAccelerometer, FeaturePolicy::FeatureDefault::EnableForSelf},
FeaturePolicy::FeatureDefault::EnableForSelf}, {mojom::FeaturePolicyFeature::kAmbientLightSensor,
{mojom::FeaturePolicyFeature::kAmbientLightSensor, FeaturePolicy::FeatureDefault::EnableForSelf},
FeaturePolicy::FeatureDefault::EnableForSelf}, {mojom::FeaturePolicyFeature::kGyroscope,
{mojom::FeaturePolicyFeature::kGyroscope, FeaturePolicy::FeatureDefault::EnableForSelf},
FeaturePolicy::FeatureDefault::EnableForSelf}, {mojom::FeaturePolicyFeature::kMagnetometer,
{mojom::FeaturePolicyFeature::kMagnetometer, FeaturePolicy::FeatureDefault::EnableForSelf},
FeaturePolicy::FeatureDefault::EnableForSelf}, {mojom::FeaturePolicyFeature::kImageCompression,
{mojom::FeaturePolicyFeature::kImageCompression, FeaturePolicy::FeatureDefault::EnableForAll},
FeaturePolicy::FeatureDefault::EnableForAll}, {mojom::FeaturePolicyFeature::kLegacyImageFormats,
{mojom::FeaturePolicyFeature::kLegacyImageFormats, FeaturePolicy::FeatureDefault::EnableForAll},
FeaturePolicy::FeatureDefault::EnableForAll}, {mojom::FeaturePolicyFeature::kUnsizedMedia,
{mojom::FeaturePolicyFeature::kUnsizedMedia, FeaturePolicy::FeatureDefault::EnableForAll},
FeaturePolicy::FeatureDefault::EnableForAll}, {mojom::FeaturePolicyFeature::kAnimations,
{mojom::FeaturePolicyFeature::kAnimations, FeaturePolicy::FeatureDefault::EnableForAll},
FeaturePolicy::FeatureDefault::EnableForAll}, {mojom::FeaturePolicyFeature::kPictureInPicture,
{mojom::FeaturePolicyFeature::kPictureInPicture, FeaturePolicy::FeatureDefault::EnableForAll},
FeaturePolicy::FeatureDefault::EnableForAll}, {mojom::FeaturePolicyFeature::kVerticalScroll,
{mojom::FeaturePolicyFeature::kVerticalScroll, FeaturePolicy::FeatureDefault::EnableForAll},
FeaturePolicy::FeatureDefault::EnableForAll}})); {mojom::FeaturePolicyFeature::kDocumentStreamInsertion,
FeaturePolicy::FeatureDefault::EnableForAll}}));
return default_feature_list; return default_feature_list;
} }
......
...@@ -58,8 +58,6 @@ enum FeaturePolicyFeature { ...@@ -58,8 +58,6 @@ enum FeaturePolicyFeature {
kDocumentCookie, kDocumentCookie,
// Contols access to document.domain attribute. // Contols access to document.domain attribute.
kDocumentDomain, kDocumentDomain,
// Controls access to document.write and document.writeln methods.
kDocumentWrite,
// Controls whether synchronous script elements will run. // Controls whether synchronous script elements will run.
kSyncScript, kSyncScript,
// Controls use of synchronous XMLHTTPRequest API. // Controls use of synchronous XMLHTTPRequest API.
...@@ -90,6 +88,10 @@ enum FeaturePolicyFeature { ...@@ -90,6 +88,10 @@ enum FeaturePolicyFeature {
kPictureInPicture, kPictureInPicture,
// Controls the ability to block and interfere with vertical scrolling. // Controls the ability to block and interfere with vertical scrolling.
kVerticalScroll, kVerticalScroll,
// Controls the ability of the document to use several dynamic markup API
// which interfere with document's input stream (document.write(),
// document.close(), etc.).
kDocumentStreamInsertion,
}; };
// This struct holds feature policy whitelist data that needs to be replicated // This struct holds feature policy whitelist data that needs to be replicated
......
...@@ -152,6 +152,7 @@ bool IsSupportedInFeaturePolicy(mojom::FeaturePolicyFeature feature) { ...@@ -152,6 +152,7 @@ bool IsSupportedInFeaturePolicy(mojom::FeaturePolicyFeature feature) {
case mojom::FeaturePolicyFeature::kVerticalScroll: case mojom::FeaturePolicyFeature::kVerticalScroll:
case mojom::FeaturePolicyFeature::kLegacyImageFormats: case mojom::FeaturePolicyFeature::kLegacyImageFormats:
case mojom::FeaturePolicyFeature::kImageCompression: case mojom::FeaturePolicyFeature::kImageCompression:
case mojom::FeaturePolicyFeature::kDocumentStreamInsertion:
return RuntimeEnabledFeatures::ExperimentalProductivityFeaturesEnabled(); return RuntimeEnabledFeatures::ExperimentalProductivityFeaturesEnabled();
default: default:
return false; return false;
...@@ -193,6 +194,9 @@ const FeatureNameMap& GetDefaultFeatureNameMap() { ...@@ -193,6 +194,9 @@ const FeatureNameMap& GetDefaultFeatureNameMap() {
default_feature_name_map.Set("picture-in-picture", default_feature_name_map.Set("picture-in-picture",
mojom::FeaturePolicyFeature::kPictureInPicture); mojom::FeaturePolicyFeature::kPictureInPicture);
if (RuntimeEnabledFeatures::ExperimentalProductivityFeaturesEnabled()) { if (RuntimeEnabledFeatures::ExperimentalProductivityFeaturesEnabled()) {
default_feature_name_map.Set(
"document-stream-insertion",
mojom::FeaturePolicyFeature::kDocumentStreamInsertion);
default_feature_name_map.Set( default_feature_name_map.Set(
"image-compression", mojom::FeaturePolicyFeature::kImageCompression); "image-compression", mojom::FeaturePolicyFeature::kImageCompression);
default_feature_name_map.Set( default_feature_name_map.Set(
...@@ -212,8 +216,6 @@ const FeatureNameMap& GetDefaultFeatureNameMap() { ...@@ -212,8 +216,6 @@ const FeatureNameMap& GetDefaultFeatureNameMap() {
"cookie", mojom::FeaturePolicyFeature::kDocumentCookie); "cookie", mojom::FeaturePolicyFeature::kDocumentCookie);
default_feature_name_map.Set( default_feature_name_map.Set(
"domain", mojom::FeaturePolicyFeature::kDocumentDomain); "domain", mojom::FeaturePolicyFeature::kDocumentDomain);
default_feature_name_map.Set("docwrite",
mojom::FeaturePolicyFeature::kDocumentWrite);
} }
if (RuntimeEnabledFeatures::FeaturePolicyAutoplayFeatureEnabled()) { if (RuntimeEnabledFeatures::FeaturePolicyAutoplayFeatureEnabled()) {
default_feature_name_map.Set("autoplay", default_feature_name_map.Set("autoplay",
......
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