Autoplay: add document user activation flag in chrome://flags

This is plumbing the flag to Blink. The feature is not fully implemented
but can be tested. The missing parts are:
- Media Engagement Index;
- Iframe delecation;
- Sticky bit across navigations.

BUG=715049

Review-Url: https://codereview.chromium.org/2921273002
Cr-Commit-Position: refs/heads/master@{#477238}
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index a3f2521..1e03569 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -757,6 +757,9 @@
      switches::kAutoplayPolicy,
      switches::autoplay::kUserGestureRequiredForCrossOriginPolicy},
 #endif
+    {flag_descriptions::kAutoplayPolicyDocumentUserActivation,
+     switches::kAutoplayPolicy,
+     switches::autoplay::kDocumentUserActivationRequiredPolicy},
 };
 
 const FeatureEntry::Choice kForceEffectiveConnectionTypeChoices[] = {
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index db5fad8..54de7a89 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -3104,6 +3104,9 @@
 const char kAutoplayPolicyUserGestureRequiredForCrossOrigin[] =
     "User gesture is required for cross-origin iframes.";
 
+const char kAutoplayPolicyDocumentUserActivation[] =
+    "Document user activation is required.";
+
 const char kOmniboxDisplayTitleForCurrentUrlName[] =
     "Include title for the current URL in the omnibox";
 
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index 5ccc0d6..91d0c3f4 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -52,6 +52,7 @@
 extern const char kAutoplayPolicyUserGestureRequiredForCrossOrigin[];
 extern const char kAutoplayPolicyNoUserGestureRequired[];
 extern const char kAutoplayPolicyUserGestureRequired[];
+extern const char kAutoplayPolicyDocumentUserActivation[];
 
 extern const char kBackgroundVideoTrackOptimizationName[];
 extern const char kBackgroundVideoTrackOptimizationDescription[];
diff --git a/content/browser/renderer_host/render_view_host_impl.cc b/content/browser/renderer_host/render_view_host_impl.cc
index ee956813..2a5d922 100644
--- a/content/browser/renderer_host/render_view_host_impl.cc
+++ b/content/browser/renderer_host/render_view_host_impl.cc
@@ -466,6 +466,11 @@
   } else if (autoplay_policy ==
              switches::autoplay::kUserGestureRequiredForCrossOriginPolicy) {
     prefs.autoplay_policy = AutoplayPolicy::kUserGestureRequiredForCrossOrigin;
+  } else if (autoplay_policy ==
+             switches::autoplay::kDocumentUserActivationRequiredPolicy) {
+    prefs.autoplay_policy = AutoplayPolicy::kDocumentUserActivationRequired;
+  } else {
+    NOTREACHED();
   }
 
   const std::string touch_enabled_switch =
diff --git a/content/public/common/common_param_traits_macros.h b/content/public/common/common_param_traits_macros.h
index 25b9c8c8..befe55e 100644
--- a/content/public/common/common_param_traits_macros.h
+++ b/content/public/common/common_param_traits_macros.h
@@ -81,7 +81,7 @@
 IPC_ENUM_TRAITS_MIN_MAX_VALUE(
     content::AutoplayPolicy,
     content::AutoplayPolicy::kNoUserGestureRequired,
-    content::AutoplayPolicy::kUserGestureRequiredForCrossOrigin)
+    content::AutoplayPolicy::kDocumentUserActivationRequired)
 
 IPC_STRUCT_TRAITS_BEGIN(blink::WebPoint)
   IPC_STRUCT_TRAITS_MEMBER(x)
diff --git a/content/public/common/web_preferences.h b/content/public/common/web_preferences.h
index 80816ae..901b50ea 100644
--- a/content/public/common/web_preferences.h
+++ b/content/public/common/web_preferences.h
@@ -72,6 +72,7 @@
   kNoUserGestureRequired,
   kUserGestureRequired,
   kUserGestureRequiredForCrossOrigin,
+  kDocumentUserActivationRequired,
 };
 
 // The ISO 15924 script code for undetermined script aka Common. It's the
diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc
index b0d3c28..9967866 100644
--- a/content/renderer/render_view_impl.cc
+++ b/content/renderer/render_view_impl.cc
@@ -1035,6 +1035,10 @@
       settings->SetAutoplayPolicy(
           WebSettings::AutoplayPolicy::kUserGestureRequiredForCrossOrigin);
       break;
+    case AutoplayPolicy::kDocumentUserActivationRequired:
+      settings->SetAutoplayPolicy(
+          WebSettings::AutoplayPolicy::kDocumentUserActivationRequired);
+      break;
   }
 
   settings->SetViewportEnabled(prefs.viewport_enabled);
diff --git a/media/base/media_switches.cc b/media/base/media_switches.cc
index aad4a7e..af8c995 100644
--- a/media/base/media_switches.cc
+++ b/media/base/media_switches.cc
@@ -164,6 +164,10 @@
 
 namespace autoplay {
 
+// Autoplay policy that requires a document user activation.
+const char kDocumentUserActivationRequiredPolicy[] =
+    "document-user-activation-required";
+
 // Autoplay policy that does not require any user gesture.
 const char kNoUserGestureRequiredPolicy[] = "no-user-gesture-required";
 
diff --git a/media/base/media_switches.h b/media/base/media_switches.h
index b33e9529..abbeb5a8 100644
--- a/media/base/media_switches.h
+++ b/media/base/media_switches.h
@@ -92,6 +92,7 @@
 
 namespace autoplay {
 
+MEDIA_EXPORT extern const char kDocumentUserActivationRequiredPolicy[];
 MEDIA_EXPORT extern const char kNoUserGestureRequiredPolicy[];
 MEDIA_EXPORT extern const char kUserGestureRequiredPolicy[];
 MEDIA_EXPORT extern const char kUserGestureRequiredForCrossOriginPolicy[];