[go: nahoru, domu]

MSE-in-Workers: Part 1: Add experimental visibility of API in workers

Adds runtime experimental exposure of JS MediaSource constructor on
workers context.

This change does not include the actual constructor's implementation (later
changes will add functionality behind this new feature flag).

To differentiate from pre-existing JS MediaSource construction on the Window
(blink main) thread, this change also adds a MediaSourceStable feature for use
in the IDL for the constructor.

This change also includes recording UMA for each execution context's
thread type (window, dedicated worker, shared worker) that constructs
a MediaSource instance.

Anticipating the eventual need for recording a UseCounter in later
changes to differentiate MSE objectUrl construction on main thread
versus worker contexts, this change also includes the definition of that
UseCounter. See the prototype combined full change
(https://chromium-review.googlesource.com/c/chromium/src/+/1405697/) for
expected usage of this new UseCounter from url_media_source.cc.

Intent-to-implement:
https://groups.google.com/a/chromium.org/forum/#!msg/blink-dev/CNRywDqgKjY/F0nnA4tTAwAJ

BUG=878133

Change-Id: I793a9d4f3a609352df773a96e3befd4d1bd66f5b
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1674413
Commit-Queue: Matthew Wolenetz <wolenetz@chromium.org>
Auto-Submit: Matthew Wolenetz <wolenetz@chromium.org>
Reviewed-by: Stephen Chenney <schenney@chromium.org>
Reviewed-by: Dan Sanders <sandersd@chromium.org>
Cr-Commit-Position: refs/heads/master@{#672647}
diff --git a/third_party/blink/public/mojom/web_feature/web_feature.mojom b/third_party/blink/public/mojom/web_feature/web_feature.mojom
index 223f596..237086d 100644
--- a/third_party/blink/public/mojom/web_feature/web_feature.mojom
+++ b/third_party/blink/public/mojom/web_feature/web_feature.mojom
@@ -2325,6 +2325,7 @@
   kLazyLoadImageMissingDimensionsForLazy = 2936,
   kPeriodicBackgroundSyncGetTags = 2937,
   kPeriodicBackgroundSyncUnregister = 2938,
+  kCreateObjectURLMediaSourceFromWorker = 2939,
 
   // Add new features immediately above this line. Don't change assigned
   // numbers of any item, and don't reuse removed slots.
diff --git a/third_party/blink/renderer/modules/mediasource/media_source.cc b/third_party/blink/renderer/modules/mediasource/media_source.cc
index 7300809d..5489bc8 100644
--- a/third_party/blink/renderer/modules/mediasource/media_source.cc
+++ b/third_party/blink/renderer/modules/mediasource/media_source.cc
@@ -47,6 +47,7 @@
 #include "third_party/blink/renderer/platform/bindings/exception_messages.h"
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
 #include "third_party/blink/renderer/platform/heap/heap.h"
+#include "third_party/blink/renderer/platform/histogram.h"
 #include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h"
 #include "third_party/blink/renderer/platform/instrumentation/use_counter.h"
 #include "third_party/blink/renderer/platform/network/mime/content_type.h"
@@ -58,6 +59,17 @@
 
 namespace blink {
 
+namespace {
+// These values are written to logs. New enum values can be added, but existing
+// ones must never be renumbered or deleted and reused.
+enum class MseExecutionContext {
+  kWindow = 0,
+  kDedicatedWorker = 1,
+  kSharedWorker = 2,
+  kMax = kSharedWorker
+};
+}  // namespace
+
 static bool ThrowExceptionIfClosed(bool is_open,
                                    ExceptionState& exception_state) {
   if (!is_open) {
@@ -123,6 +135,29 @@
       live_seekable_range_(MakeGarbageCollected<TimeRanges>()),
       added_to_registry_counter_(0) {
   DVLOG(1) << __func__ << " this=" << this;
+
+  DCHECK(RuntimeEnabledFeatures::MediaSourceInWorkersEnabled() ||
+         IsMainThread());
+
+  MseExecutionContext type = MseExecutionContext::kWindow;
+  if (!IsMainThread()) {
+    if (context->IsDedicatedWorkerGlobalScope())
+      type = MseExecutionContext::kDedicatedWorker;
+    else if (context->IsSharedWorkerGlobalScope())
+      type = MseExecutionContext::kSharedWorker;
+    else
+      CHECK(false) << "Invalid execution context for MSE usage";
+  }
+  DEFINE_THREAD_SAFE_STATIC_LOCAL(
+      EnumerationHistogram, mse_execution_context_histogram,
+      ("Media.MSE.ExecutionContext",
+       static_cast<int>(MseExecutionContext::kMax) + 1));
+  mse_execution_context_histogram.Count(static_cast<int>(type));
+
+  // TODO(wolenetz): Actually enable experimental usage of MediaSource from
+  // dedicated and shared worker contexts. See https://crbug.com/878133.
+  CHECK(type == MseExecutionContext::kWindow)
+      << "MSE is not yet supported from workers";
 }
 
 MediaSource::~MediaSource() {
diff --git a/third_party/blink/renderer/modules/mediasource/media_source.idl b/third_party/blink/renderer/modules/mediasource/media_source.idl
index b081da91..76a2b9b7 100644
--- a/third_party/blink/renderer/modules/mediasource/media_source.idl
+++ b/third_party/blink/renderer/modules/mediasource/media_source.idl
@@ -38,7 +38,8 @@
 [
     ActiveScriptWrappable,
     Constructor,
-    ConstructorCallWith=ExecutionContext
+    ConstructorCallWith=ExecutionContext,
+    Exposed(Window MediaSourceStable, DedicatedWorker MediaSourceInWorkers, SharedWorker MediaSourceInWorkers)
 ] interface MediaSource : EventTarget {
     // All the source buffers created by this object.
     readonly attribute SourceBufferList sourceBuffers;
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5
index 92fd4925..db5d772a 100644
--- a/third_party/blink/renderer/platform/runtime_enabled_features.json5
+++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -915,10 +915,22 @@
       status: "experimental",
     },
     {
+      name: "MediaSourceInWorkers",
+      status: "experimental",
+    },
+    {
       name: "MediaSourceNewAbortAndDuration",
       status: "experimental",
     },
     {
+      // This is used in cases of mixed specification of stable and
+      // experimental MediaSource features, such as in the IDL for an interface
+      // constructor where exposure of the constructor in Window vs other
+      // contexts can vary in stable vs experimental.
+      name: "MediaSourceStable",
+      status: "stable",
+    },
+    {
       name: "MergeBlockingNonBlockingPools",
     },
     // Support for META tag for setting color-scheme used for opting into dark
diff --git a/third_party/blink/web_tests/webexposed/global-interface-listing-dedicated-worker-expected.txt b/third_party/blink/web_tests/webexposed/global-interface-listing-dedicated-worker-expected.txt
index 4d2cf149..21bdea7 100644
--- a/third_party/blink/web_tests/webexposed/global-interface-listing-dedicated-worker-expected.txt
+++ b/third_party/blink/web_tests/webexposed/global-interface-listing-dedicated-worker-expected.txt
@@ -696,6 +696,26 @@
 [Worker]     method constructor
 [Worker]     method decodingInfo
 [Worker]     method encodingInfo
+[Worker] interface MediaSource : EventTarget
+[Worker]     static method isTypeSupported
+[Worker]     attribute @@toStringTag
+[Worker]     getter activeSourceBuffers
+[Worker]     getter duration
+[Worker]     getter onsourceclose
+[Worker]     getter onsourceended
+[Worker]     getter onsourceopen
+[Worker]     getter readyState
+[Worker]     getter sourceBuffers
+[Worker]     method addSourceBuffer
+[Worker]     method clearLiveSeekableRange
+[Worker]     method constructor
+[Worker]     method endOfStream
+[Worker]     method removeSourceBuffer
+[Worker]     method setLiveSeekableRange
+[Worker]     setter duration
+[Worker]     setter onsourceclose
+[Worker]     setter onsourceended
+[Worker]     setter onsourceopen
 [Worker] interface MessageChannel
 [Worker]     attribute @@toStringTag
 [Worker]     getter port1
diff --git a/third_party/blink/web_tests/webexposed/global-interface-listing-shared-worker-expected.txt b/third_party/blink/web_tests/webexposed/global-interface-listing-shared-worker-expected.txt
index 798756f..54c127c 100644
--- a/third_party/blink/web_tests/webexposed/global-interface-listing-shared-worker-expected.txt
+++ b/third_party/blink/web_tests/webexposed/global-interface-listing-shared-worker-expected.txt
@@ -678,6 +678,26 @@
 [Worker]     method constructor
 [Worker]     method decodingInfo
 [Worker]     method encodingInfo
+[Worker] interface MediaSource : EventTarget
+[Worker]     static method isTypeSupported
+[Worker]     attribute @@toStringTag
+[Worker]     getter activeSourceBuffers
+[Worker]     getter duration
+[Worker]     getter onsourceclose
+[Worker]     getter onsourceended
+[Worker]     getter onsourceopen
+[Worker]     getter readyState
+[Worker]     getter sourceBuffers
+[Worker]     method addSourceBuffer
+[Worker]     method clearLiveSeekableRange
+[Worker]     method constructor
+[Worker]     method endOfStream
+[Worker]     method removeSourceBuffer
+[Worker]     method setLiveSeekableRange
+[Worker]     setter duration
+[Worker]     setter onsourceclose
+[Worker]     setter onsourceended
+[Worker]     setter onsourceopen
 [Worker] interface MessageChannel
 [Worker]     attribute @@toStringTag
 [Worker]     getter port1
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index f0a12c5..d3f14d5 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -23774,6 +23774,7 @@
   <int value="2936" label="LazyLoadImageMissingDimensionsForLazy"/>
   <int value="2937" label="PeriodicBackgroundSyncGetTags"/>
   <int value="2938" label="PeriodicBackgroundSyncUnregister"/>
+  <int value="2939" label="CreateObjectURLMediaSourceFromWorker"/>
 </enum>
 
 <enum name="FeaturePolicyAllowlistType">
@@ -38406,6 +38407,12 @@
   <int value="7" label="Generic"/>
 </enum>
 
+<enum name="MediaSourceExecutionContext">
+  <int value="0" label="Window"/>
+  <int value="1" label="Dedicated Worker"/>
+  <int value="2" label="Shared Worker"/>
+</enum>
+
 <enum name="MediaStatus">
   <int value="-30002" label="AMEDIA_IMGREADER_MAX_IMAGES_ACQUIRED"/>
   <int value="-30001" label="AMEDIA_IMGREADER_NO_BUFFER_AVAILABLE"/>
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml
index 3ca48d0..1f630059 100644
--- a/tools/metrics/histograms/histograms.xml
+++ b/tools/metrics/histograms/histograms.xml
@@ -56781,6 +56781,16 @@
   </summary>
 </histogram>
 
+<histogram name="Media.MSE.ExecutionContext" enum="MediaSourceExecutionContext"
+    expires_after="M81">
+  <owner>wolenetz@chromium.org</owner>
+  <owner>media-dev@chromium.org</owner>
+  <summary>
+    For each MediaSource instance, records the type of thread that created the
+    instance.
+  </summary>
+</histogram>
+
 <histogram name="Media.MSE.LateAudioFrames"
     units="late frames per million frames" expires_after="2016-10-03">
   <obsolete>