mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-22 09:45:41 +00:00
b89a421cf4
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
88 lines
2.7 KiB
C++
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
|