From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: deepak1556 <hop2deep@gmail.com>
Date: Thu, 18 Oct 2018 17:07:01 -0700
Subject: desktop_media_list.patch

* Adds a new observer method to DesktopMediaListObserver for
  desktop capture api.
* Backports https://chromium-review.googlesource.com/c/chromium/src/+/1199806
  that fixes crash with screen capturer, can be removed in 71.0.3539.0

diff --git a/chrome/browser/media/webrtc/desktop_media_list.h b/chrome/browser/media/webrtc/desktop_media_list.h
index 8e02a8a95eb07516162eacdf5b361231d3a02975..3497b85428a52c6019cfb5d30229071f99ecfb20 100644
--- a/chrome/browser/media/webrtc/desktop_media_list.h
+++ b/chrome/browser/media/webrtc/desktop_media_list.h
@@ -32,6 +32,9 @@ class DesktopMediaList {
 
   virtual ~DesktopMediaList() {}
 
+  // Allows listening to notifications generated by the model.
+  virtual void AddObserver(DesktopMediaListObserver* observer) = 0;
+
   // Sets time interval between updates. By default list of sources and their
   // thumbnail are updated once per second. If called after StartUpdating() then
   // it will take effect only after the next update.
@@ -51,10 +54,11 @@ class DesktopMediaList {
   // enumerated. After the initial enumeration the model will be refreshed based
   // on the update period, and notifications generated only for changes in the
   // model.
-  virtual void StartUpdating(DesktopMediaListObserver* observer) = 0;
+  virtual void StartUpdating() = 0;
 
   virtual int GetSourceCount() const = 0;
   virtual const Source& GetSource(int index) const = 0;
+  virtual const std::vector<Source>& GetSources() const = 0;
 
   virtual content::DesktopMediaID::Type GetMediaListType() const = 0;
 };
diff --git a/chrome/browser/media/webrtc/desktop_media_list_base.cc b/chrome/browser/media/webrtc/desktop_media_list_base.cc
index a68d5d774489fe95968046001b8540d74f36dc97..ca1077801ae18862618964a9675a4101b9c3a393 100644
--- a/chrome/browser/media/webrtc/desktop_media_list_base.cc
+++ b/chrome/browser/media/webrtc/desktop_media_list_base.cc
@@ -21,6 +21,11 @@ DesktopMediaListBase::DesktopMediaListBase(base::TimeDelta update_period)
 
 DesktopMediaListBase::~DesktopMediaListBase() {}
 
+void DesktopMediaListBase::AddObserver(DesktopMediaListObserver* observer) {
+  DCHECK(!observer_);
+  observer_ = observer;
+}
+
 void DesktopMediaListBase::SetUpdatePeriod(base::TimeDelta period) {
   DCHECK(!observer_);
   update_period_ = period;
@@ -34,10 +39,7 @@ void DesktopMediaListBase::SetViewDialogWindowId(DesktopMediaID dialog_id) {
   view_dialog_id_ = dialog_id;
 }
 
-void DesktopMediaListBase::StartUpdating(DesktopMediaListObserver* observer) {
-  DCHECK(!observer_);
-
-  observer_ = observer;
+void DesktopMediaListBase::StartUpdating() {
   Refresh();
 }
 
@@ -52,6 +54,11 @@ const DesktopMediaList::Source& DesktopMediaListBase::GetSource(
   return sources_[index];
 }
 
+const std::vector<DesktopMediaList::Source>& DesktopMediaListBase::GetSources()
+    const {
+  return sources_;
+}
+
 DesktopMediaID::Type DesktopMediaListBase::GetMediaListType() const {
   return type_;
 }
@@ -63,6 +70,12 @@ DesktopMediaListBase::SourceDescription::SourceDescription(
 
 void DesktopMediaListBase::UpdateSourcesList(
     const std::vector<SourceDescription>& new_sources) {
+  // Notify observer when there was no new source captured.
+  if (new_sources.empty()) {
+    observer_->OnSourceUnchanged(this);
+    return;
+  }
+
   typedef std::set<DesktopMediaID> SourceSet;
   SourceSet new_source_set;
   for (size_t i = 0; i < new_sources.size(); ++i) {
@@ -135,6 +148,8 @@ void DesktopMediaListBase::UpdateSourceThumbnail(DesktopMediaID id,
 }
 
 void DesktopMediaListBase::ScheduleNextRefresh() {
+  if (!observer_->ShouldScheduleNextRefresh(this))
+    return;
   base::PostDelayedTaskWithTraits(FROM_HERE, {BrowserThread::UI},
                                   base::BindOnce(&DesktopMediaListBase::Refresh,
                                                  weak_factory_.GetWeakPtr()),
diff --git a/chrome/browser/media/webrtc/desktop_media_list_base.h b/chrome/browser/media/webrtc/desktop_media_list_base.h
index 746df1210aa92af5c9d4703112b4bd6c09b94fdf..461e0edf8509569d05c86f466c02b5035183d0df 100644
--- a/chrome/browser/media/webrtc/desktop_media_list_base.h
+++ b/chrome/browser/media/webrtc/desktop_media_list_base.h
@@ -24,12 +24,14 @@ class DesktopMediaListBase : public DesktopMediaList {
   ~DesktopMediaListBase() override;
 
   // DesktopMediaList interface.
+  void AddObserver(DesktopMediaListObserver* observer) override;
   void SetUpdatePeriod(base::TimeDelta period) override;
   void SetThumbnailSize(const gfx::Size& thumbnail_size) override;
   void SetViewDialogWindowId(content::DesktopMediaID dialog_id) override;
-  void StartUpdating(DesktopMediaListObserver* observer) override;
+  void StartUpdating() override;
   int GetSourceCount() const override;
   const Source& GetSource(int index) const override;
+  const std::vector<Source>& GetSources() const override;
   content::DesktopMediaID::Type GetMediaListType() const override;
 
   static uint32_t GetImageHash(const gfx::Image& image);
diff --git a/chrome/browser/media/webrtc/desktop_media_list_observer.h b/chrome/browser/media/webrtc/desktop_media_list_observer.h
index 47401abc984e6fe26c7f4c5399aa565c687060b0..ca6a527ffac877c27aac94337ec5a7b546e09768 100644
--- a/chrome/browser/media/webrtc/desktop_media_list_observer.h
+++ b/chrome/browser/media/webrtc/desktop_media_list_observer.h
@@ -18,6 +18,10 @@ class DesktopMediaListObserver {
                              int new_index) = 0;
   virtual void OnSourceNameChanged(DesktopMediaList* list, int index) = 0;
   virtual void OnSourceThumbnailChanged(DesktopMediaList* list, int index) = 0;
+  virtual void OnSourceUnchanged(DesktopMediaList* list) = 0;
+  // Return value indicates whether the observer should continue listening
+  // for capture updates.
+  virtual bool ShouldScheduleNextRefresh(DesktopMediaList* list) = 0;
 
  protected:
   virtual ~DesktopMediaListObserver() {}
diff --git a/chrome/browser/media/webrtc/native_desktop_media_list.cc b/chrome/browser/media/webrtc/native_desktop_media_list.cc
index b060eb31d194e44c6c89e2cbf990323802c1aa5f..514325c3d6cb11b69b0d43e72d851c49f0ef6824 100644
--- a/chrome/browser/media/webrtc/native_desktop_media_list.cc
+++ b/chrome/browser/media/webrtc/native_desktop_media_list.cc
@@ -7,14 +7,15 @@
 #include "base/bind.h"
 #include "base/hash/hash.h"
 #include "base/single_thread_task_runner.h"
+#include "base/strings/string_number_conversions.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/task/post_task.h"
 #include "base/threading/thread_restrictions.h"
 #include "build/build_config.h"
 #include "chrome/browser/media/webrtc/desktop_media_list_observer.h"
-#include "chrome/grit/generated_resources.h"
 #include "content/public/browser/browser_task_traits.h"
 #include "content/public/browser/browser_thread.h"
+#include "electron/grit/electron_resources.h"
 #include "media/base/video_util.h"
 #include "third_party/libyuv/include/libyuv/scale_argb.h"
 #include "third_party/skia/include/core/SkBitmap.h"
