gecko-dev/dom/media/MediaDevices.h
Andreas Pehrson b89a421cf4 Bug 1582637 - Move internal DeviceChange events to higher order functions. r=jib,achronop
This does three major things:
1) Moves the DeviceChange events from manual callbacks/listeners to
   MediaEventSource/MediaEventListener. This is the reason this patch is so
   large, as it traverses a lot of files.
   There are four layers (from low to high):
   - CamerasChild for camera device list changes, and CubebDeviceEnumerator for
     microphone and speaker device list changes
   - MediaEngineWebRTC, which gathers these into a single listener
   - MediaManager, which owns the MediaEngineWebRTC backend
   - MediaDevices, where the events from MediaManager are exposed to js
2) Changes the fake event triggering from starting a 30-event burst on setting
   the js event listener, to a toggle, so that while the pref is on the events
   keep coming.
3) Moves the fake event generation from CamerasChild to MediaEngineWebRTC, since
   that's the lowest level where we are aware of both video and audio events.
   The fake event generation is also greatly simplified. From being a dedicated
   thread with periodic runnables, it is now a periodic timer on main thread
   that fires while fake events are enabled. MediaEventProducer gracefully
   handles thread safety.

Differential Revision: https://phabricator.services.mozilla.com/D48516

--HG--
extra : moz-landing-system : lando
2019-10-29 13:01:43 +00:00

88 lines
2.7 KiB
C++

/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef mozilla_dom_MediaDevices_h
#define mozilla_dom_MediaDevices_h
#include "MediaEventSource.h"
#include "mozilla/ErrorResult.h"
#include "nsISupportsImpl.h"
#include "mozilla/DOMEventTargetHelper.h"
#include "mozilla/dom/BindingUtils.h"
#include "nsPIDOMWindow.h"
namespace mozilla {
namespace dom {
class Promise;
struct MediaStreamConstraints;
struct DisplayMediaStreamConstraints;
struct MediaTrackSupportedConstraints;
#define MOZILLA_DOM_MEDIADEVICES_IMPLEMENTATION_IID \
{ \
0x2f784d8a, 0x7485, 0x4280, { \
0x9a, 0x36, 0x74, 0xa4, 0xd6, 0x71, 0xa6, 0xc8 \
} \
}
class MediaDevices final : public DOMEventTargetHelper {
public:
explicit MediaDevices(nsPIDOMWindowInner* aWindow)
: DOMEventTargetHelper(aWindow) {}
NS_DECL_ISUPPORTS_INHERITED
NS_DECLARE_STATIC_IID_ACCESSOR(MOZILLA_DOM_MEDIADEVICES_IMPLEMENTATION_IID)
JSObject* WrapObject(JSContext* cx,
JS::Handle<JSObject*> aGivenProto) override;
// No code needed, as MediaTrackSupportedConstraints members default to true.
void GetSupportedConstraints(MediaTrackSupportedConstraints& aResult){};
already_AddRefed<Promise> GetUserMedia(
const MediaStreamConstraints& aConstraints, CallerType aCallerType,
ErrorResult& aRv);
already_AddRefed<Promise> EnumerateDevices(CallerType aCallerType,
ErrorResult& aRv);
already_AddRefed<Promise> GetDisplayMedia(
const DisplayMediaStreamConstraints& aConstraints, CallerType aCallerType,
ErrorResult& aRv);
// Called when MediaManager encountered a change in its device lists.
void OnDeviceChange();
void SetupDeviceChangeListener();
mozilla::dom::EventHandlerNonNull* GetOndevicechange();
void SetOndevicechange(mozilla::dom::EventHandlerNonNull* aCallback);
void EventListenerAdded(nsAtom* aType) override;
using DOMEventTargetHelper::EventListenerAdded;
private:
class GumResolver;
class EnumDevResolver;
class GumRejecter;
virtual ~MediaDevices();
nsCOMPtr<nsITimer> mFuzzTimer;
// Connect/Disconnect on main thread only
MediaEventListener mDeviceChangeListener;
bool mIsDeviceChangeListenerSetUp = false;
void RecordAccessTelemetry(const UseCounter counter) const;
};
NS_DEFINE_STATIC_IID_ACCESSOR(MediaDevices,
MOZILLA_DOM_MEDIADEVICES_IMPLEMENTATION_IID)
} // namespace dom
} // namespace mozilla
#endif // mozilla_dom_MediaDevices_h