Use injected clock in DesktopCaptureOptions

This will allow for desktop capturers to use an injected clock rather
than the global clock methods.

Bug: webrtc:42223992
Change-Id: I99ef447da8b3ce1dd9623a942064d1926a6a6964
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/464502
Reviewed-by: Danil Chapovalov <danilchap@webrtc.org>
Commit-Queue: Evan Shrubsole <eshr@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#47489}
diff --git a/modules/desktop_capture/BUILD.gn b/modules/desktop_capture/BUILD.gn
index 6b15ad7..ac1b886 100644
--- a/modules/desktop_capture/BUILD.gn
+++ b/modules/desktop_capture/BUILD.gn
@@ -286,9 +286,12 @@
   visibility = [ "*" ]
   defines = []
   deps = [
+    "../../api/environment",
     "../../media:video_common",
     "../../rtc_base/containers:flat_map",
     "../../rtc_base/containers:flat_set",
+    "../../system_wrappers",
+    "//third_party/abseil-cpp/absl/base:nullability",
     "//third_party/abseil-cpp/absl/memory",
     "//third_party/abseil-cpp/absl/strings",
     "//third_party/abseil-cpp/absl/strings:string_view",
@@ -667,6 +670,7 @@
       "../../api:refcountedbase",
       "../../api:scoped_refptr",
       "../../api:sequence_checker",
+      "../../api/environment",
       "../../rtc_base:checks",
       "../../rtc_base:event_tracer",
       "../../rtc_base:logging",
@@ -676,7 +680,9 @@
       "../../rtc_base/synchronization:mutex",
       "../../rtc_base/system:rtc_export",
       "../../sdk:helpers_objc",
+      "../../system_wrappers",
       "//third_party/abseil-cpp/absl/base:core_headers",
+      "//third_party/abseil-cpp/absl/base:nullability",
       "//third_party/abseil-cpp/absl/strings:str_format",
     ]
     frameworks = [
diff --git a/modules/desktop_capture/desktop_capture_options.cc b/modules/desktop_capture/desktop_capture_options.cc
index 97070d0..e5e3017 100644
--- a/modules/desktop_capture/desktop_capture_options.cc
+++ b/modules/desktop_capture/desktop_capture_options.cc
@@ -24,21 +24,9 @@
 
 namespace webrtc {
 
-DesktopCaptureOptions::DesktopCaptureOptions() {}
-DesktopCaptureOptions::DesktopCaptureOptions(
-    const DesktopCaptureOptions& options) = default;
-DesktopCaptureOptions::DesktopCaptureOptions(DesktopCaptureOptions&& options) =
-    default;
-DesktopCaptureOptions::~DesktopCaptureOptions() {}
+namespace {
 
-DesktopCaptureOptions& DesktopCaptureOptions::operator=(
-    const DesktopCaptureOptions& options) = default;
-DesktopCaptureOptions& DesktopCaptureOptions::operator=(
-    DesktopCaptureOptions&& options) = default;
-
-// static
-DesktopCaptureOptions DesktopCaptureOptions::CreateDefault() {
-  DesktopCaptureOptions result;
+void ApplyDefaultSettings(DesktopCaptureOptions& result) {
 #if defined(WEBRTC_USE_X11)
   result.set_x_display(SharedXDisplay::CreateDefault());
 #endif
@@ -56,6 +44,36 @@
       make_ref_counted<FullScreenWindowDetector>(
           CreateFullScreenWinApplicationHandler));
 #endif
+}
+
+}  // namespace
+
+DesktopCaptureOptions::DesktopCaptureOptions() {}
+DesktopCaptureOptions::DesktopCaptureOptions(const Environment& env)
+    : env_(env) {}
+DesktopCaptureOptions::DesktopCaptureOptions(
+    const DesktopCaptureOptions& options) = default;
+DesktopCaptureOptions::DesktopCaptureOptions(DesktopCaptureOptions&& options) =
+    default;
+DesktopCaptureOptions::~DesktopCaptureOptions() {}
+
+DesktopCaptureOptions& DesktopCaptureOptions::operator=(
+    const DesktopCaptureOptions& options) = default;
+DesktopCaptureOptions& DesktopCaptureOptions::operator=(
+    DesktopCaptureOptions&& options) = default;
+
+// static
+DesktopCaptureOptions DesktopCaptureOptions::CreateDefault() {
+  DesktopCaptureOptions result;
+  ApplyDefaultSettings(result);
+  return result;
+}
+
+// static
+DesktopCaptureOptions DesktopCaptureOptions::CreateDefault(
+    const Environment& env) {
+  DesktopCaptureOptions result(env);
+  ApplyDefaultSettings(result);
   return result;
 }
 
diff --git a/modules/desktop_capture/desktop_capture_options.h b/modules/desktop_capture/desktop_capture_options.h
index 9cba039..010e5e1 100644
--- a/modules/desktop_capture/desktop_capture_options.h
+++ b/modules/desktop_capture/desktop_capture_options.h
@@ -12,6 +12,7 @@
 
 #include <cstdint>
 
+#include "api/environment/environment.h"
 #include "api/scoped_refptr.h"
 #include "rtc_base/system/rtc_export.h"
 
@@ -32,6 +33,7 @@
 #endif
 
 #include "modules/desktop_capture/full_screen_window_detector.h"
+#include "system_wrappers/include/clock.h"
 
 namespace webrtc {
 
@@ -43,8 +45,10 @@
   // also initializes X window connection. x_display() will be set to null if
   // X11 connection failed (e.g. DISPLAY isn't set).
   static DesktopCaptureOptions CreateDefault();
+  static DesktopCaptureOptions CreateDefault(const Environment& env);
 
   DesktopCaptureOptions();
+  explicit DesktopCaptureOptions(const Environment& env);
   DesktopCaptureOptions(const DesktopCaptureOptions& options);
   DesktopCaptureOptions(DesktopCaptureOptions&& options);
   ~DesktopCaptureOptions();
@@ -52,6 +56,10 @@
   DesktopCaptureOptions& operator=(const DesktopCaptureOptions& options);
   DesktopCaptureOptions& operator=(DesktopCaptureOptions&& options);
 
+  Clock& clock() const {
+    return env_.has_value() ? env_->clock() : *Clock::GetRealTimeClock();
+  }
+
 #if defined(WEBRTC_USE_X11)
   const scoped_refptr<SharedXDisplay>& x_display() const { return x_display_; }
   void set_x_display(scoped_refptr<SharedXDisplay> x_display) {
@@ -313,6 +321,7 @@
   bool disable_effects_ = true;
   bool detect_updated_region_ = false;
   bool prefer_cursor_embedded_ = false;
+  std::optional<Environment> env_;
 #if defined(WEBRTC_USE_PIPEWIRE)
   bool allow_pipewire_ = false;
   bool pipewire_use_damage_region_ = true;
diff --git a/modules/desktop_capture/linux/x11/mouse_cursor_monitor_x11.h b/modules/desktop_capture/linux/x11/mouse_cursor_monitor_x11.h
index 855d5c6..4167e08 100644
--- a/modules/desktop_capture/linux/x11/mouse_cursor_monitor_x11.h
+++ b/modules/desktop_capture/linux/x11/mouse_cursor_monitor_x11.h
@@ -13,6 +13,10 @@
 
 #include <X11/X.h>
 
+// X11 creates a CurrentTime macro, which causes compilation errors when
+// including webrtc::Clock.
+#undef CurrentTime
+
 #include <memory>
 
 #include "api/scoped_refptr.h"
diff --git a/modules/desktop_capture/linux/x11/screen_capturer_x11.h b/modules/desktop_capture/linux/x11/screen_capturer_x11.h
index 4379094..bd423ea 100644
--- a/modules/desktop_capture/linux/x11/screen_capturer_x11.h
+++ b/modules/desktop_capture/linux/x11/screen_capturer_x11.h
@@ -17,6 +17,10 @@
 #include <X11/extensions/Xfixes.h>
 #include <X11/extensions/Xrandr.h>
 
+// X11 creates a CurrentTime macro, which causes compilation errors when
+// including webrtc::Clock.
+#undef CurrentTime
+
 #include <memory>
 
 #include "modules/desktop_capture/desktop_capture_options.h"
diff --git a/modules/desktop_capture/linux/x11/window_capturer_x11.h b/modules/desktop_capture/linux/x11/window_capturer_x11.h
index 2605c54..67d001f 100644
--- a/modules/desktop_capture/linux/x11/window_capturer_x11.h
+++ b/modules/desktop_capture/linux/x11/window_capturer_x11.h
@@ -14,6 +14,10 @@
 #include <X11/X.h>
 #include <X11/Xlib.h>
 
+// X11 creates a CurrentTime macro, which causes compilation errors when
+// including webrtc::Clock.
+#undef CurrentTime
+
 #include <memory>
 #include <string>