2014-09-20 06:20:41 +00:00
|
|
|
/* 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/. */
|
|
|
|
|
2015-03-03 14:51:05 +00:00
|
|
|
#ifndef mozilla_dom_MediaDevices_h
|
|
|
|
#define mozilla_dom_MediaDevices_h
|
2014-09-20 06:20:41 +00:00
|
|
|
|
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
|
|
|
#include "MediaEventSource.h"
|
2014-09-20 06:20:41 +00:00
|
|
|
#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;
|
2018-12-28 03:12:57 +00:00
|
|
|
struct DisplayMediaStreamConstraints;
|
2015-07-02 18:21:49 +00:00
|
|
|
struct MediaTrackSupportedConstraints;
|
2014-09-20 06:20:41 +00:00
|
|
|
|
|
|
|
#define MOZILLA_DOM_MEDIADEVICES_IMPLEMENTATION_IID \
|
2018-11-19 13:25:37 +00:00
|
|
|
{ \
|
2014-09-20 06:20:41 +00:00
|
|
|
0x2f784d8a, 0x7485, 0x4280, { \
|
|
|
|
0x9a, 0x36, 0x74, 0xa4, 0xd6, 0x71, 0xa6, 0xc8 \
|
|
|
|
} \
|
|
|
|
}
|
2018-11-19 13:25:37 +00:00
|
|
|
|
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
|
|
|
class MediaDevices final : public DOMEventTargetHelper {
|
2014-09-20 06:20:41 +00:00
|
|
|
public:
|
2016-01-30 17:05:36 +00:00
|
|
|
explicit MediaDevices(nsPIDOMWindowInner* aWindow)
|
2014-12-10 22:49:09 +00:00
|
|
|
: DOMEventTargetHelper(aWindow) {}
|
2014-09-20 06:20:41 +00:00
|
|
|
|
|
|
|
NS_DECL_ISUPPORTS_INHERITED
|
|
|
|
NS_DECLARE_STATIC_IID_ACCESSOR(MOZILLA_DOM_MEDIADEVICES_IMPLEMENTATION_IID)
|
|
|
|
|
2015-03-21 16:28:04 +00:00
|
|
|
JSObject* WrapObject(JSContext* cx,
|
|
|
|
JS::Handle<JSObject*> aGivenProto) override;
|
2014-09-20 06:20:41 +00:00
|
|
|
|
2015-07-02 18:21:49 +00:00
|
|
|
// No code needed, as MediaTrackSupportedConstraints members default to true.
|
|
|
|
void GetSupportedConstraints(MediaTrackSupportedConstraints& aResult){};
|
|
|
|
|
2014-09-20 06:20:41 +00:00
|
|
|
already_AddRefed<Promise> GetUserMedia(
|
2017-02-01 20:43:38 +00:00
|
|
|
const MediaStreamConstraints& aConstraints, CallerType aCallerType,
|
|
|
|
ErrorResult& aRv);
|
2014-09-20 06:20:41 +00:00
|
|
|
|
2017-09-18 01:52:06 +00:00
|
|
|
already_AddRefed<Promise> EnumerateDevices(CallerType aCallerType,
|
|
|
|
ErrorResult& aRv);
|
2015-03-03 14:51:05 +00:00
|
|
|
|
2018-12-28 03:12:57 +00:00
|
|
|
already_AddRefed<Promise> GetDisplayMedia(
|
|
|
|
const DisplayMediaStreamConstraints& aConstraints, CallerType aCallerType,
|
|
|
|
ErrorResult& aRv);
|
|
|
|
|
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
|
|
|
// Called when MediaManager encountered a change in its device lists.
|
|
|
|
void OnDeviceChange();
|
2016-08-11 17:04:49 +00:00
|
|
|
|
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
|
|
|
void SetupDeviceChangeListener();
|
2016-08-11 17:04:49 +00:00
|
|
|
|
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
|
|
|
mozilla::dom::EventHandlerNonNull* GetOndevicechange();
|
2016-08-11 17:04:49 +00:00
|
|
|
void SetOndevicechange(mozilla::dom::EventHandlerNonNull* aCallback);
|
|
|
|
|
2018-04-05 17:42:42 +00:00
|
|
|
void EventListenerAdded(nsAtom* aType) override;
|
|
|
|
using DOMEventTargetHelper::EventListenerAdded;
|
2016-08-11 17:04:49 +00:00
|
|
|
|
2014-09-20 06:20:41 +00:00
|
|
|
private:
|
|
|
|
class GumResolver;
|
2015-03-03 14:51:05 +00:00
|
|
|
class EnumDevResolver;
|
2014-09-20 06:20:41 +00:00
|
|
|
class GumRejecter;
|
|
|
|
|
2016-11-21 06:59:51 +00:00
|
|
|
virtual ~MediaDevices();
|
2017-01-26 16:08:06 +00:00
|
|
|
nsCOMPtr<nsITimer> mFuzzTimer;
|
2019-05-03 23:50:22 +00:00
|
|
|
|
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
|
|
|
// Connect/Disconnect on main thread only
|
|
|
|
MediaEventListener mDeviceChangeListener;
|
|
|
|
bool mIsDeviceChangeListenerSetUp = false;
|
|
|
|
|
2019-05-03 23:50:22 +00:00
|
|
|
void RecordAccessTelemetry(const UseCounter counter) const;
|
2014-09-20 06:20:41 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
NS_DEFINE_STATIC_IID_ACCESSOR(MediaDevices,
|
|
|
|
MOZILLA_DOM_MEDIADEVICES_IMPLEMENTATION_IID)
|
|
|
|
|
|
|
|
} // namespace dom
|
|
|
|
} // namespace mozilla
|
|
|
|
|
2015-03-03 14:51:05 +00:00
|
|
|
#endif // mozilla_dom_MediaDevices_h
|