1 /* This Source Code Form is subject to the terms of the Mozilla Public
2  * License, v. 2.0. If a copy of the MPL was not distributed with this file,
3  * You can obtain one at http://mozilla.org/MPL/2.0/. */
4 
5 #include "GetUserMediaRequest.h"
6 
7 #include "base/basictypes.h"
8 #include "MediaManager.h"
9 #include "mozilla/dom/MediaDevicesBinding.h"
10 #include "mozilla/dom/MediaStreamBinding.h"
11 #include "mozilla/dom/GetUserMediaRequestBinding.h"
12 #include "nsIMediaDevice.h"
13 #include "nsIScriptGlobalObject.h"
14 #include "nsPIDOMWindow.h"
15 
16 namespace mozilla::dom {
17 
GetUserMediaRequest(nsPIDOMWindowInner * aInnerWindow,const nsAString & aCallID,RefPtr<LocalMediaDeviceSetRefCnt> aMediaDeviceSet,const MediaStreamConstraints & aConstraints,bool aIsSecure,bool aIsHandlingUserInput)18 GetUserMediaRequest::GetUserMediaRequest(
19     nsPIDOMWindowInner* aInnerWindow, const nsAString& aCallID,
20     RefPtr<LocalMediaDeviceSetRefCnt> aMediaDeviceSet,
21     const MediaStreamConstraints& aConstraints, bool aIsSecure,
22     bool aIsHandlingUserInput)
23     : mInnerWindowID(aInnerWindow->WindowID()),
24       mOuterWindowID(aInnerWindow->GetOuterWindow()->WindowID()),
25       mCallID(aCallID),
26       mMediaDeviceSet(std::move(aMediaDeviceSet)),
27       mConstraints(new MediaStreamConstraints(aConstraints)),
28       mType(GetUserMediaRequestType::Getusermedia),
29       mIsSecure(aIsSecure),
30       mIsHandlingUserInput(aIsHandlingUserInput) {}
31 
GetUserMediaRequest(nsPIDOMWindowInner * aInnerWindow,const nsAString & aCallID,RefPtr<LocalMediaDeviceSetRefCnt> aMediaDeviceSet,const AudioOutputOptions & aAudioOutputOptions,bool aIsSecure,bool aIsHandlingUserInput)32 GetUserMediaRequest::GetUserMediaRequest(
33     nsPIDOMWindowInner* aInnerWindow, const nsAString& aCallID,
34     RefPtr<LocalMediaDeviceSetRefCnt> aMediaDeviceSet,
35     const AudioOutputOptions& aAudioOutputOptions, bool aIsSecure,
36     bool aIsHandlingUserInput)
37     : mInnerWindowID(aInnerWindow->WindowID()),
38       mOuterWindowID(aInnerWindow->GetOuterWindow()->WindowID()),
39       mCallID(aCallID),
40       mMediaDeviceSet(std::move(aMediaDeviceSet)),
41       mAudioOutputOptions(new AudioOutputOptions(aAudioOutputOptions)),
42       mType(GetUserMediaRequestType::Selectaudiooutput),
43       mIsSecure(aIsSecure),
44       mIsHandlingUserInput(aIsHandlingUserInput) {}
45 
GetUserMediaRequest(nsPIDOMWindowInner * aInnerWindow,const nsAString & aRawId,const nsAString & aMediaSource,bool aIsHandlingUserInput)46 GetUserMediaRequest::GetUserMediaRequest(nsPIDOMWindowInner* aInnerWindow,
47                                          const nsAString& aRawId,
48                                          const nsAString& aMediaSource,
49                                          bool aIsHandlingUserInput)
50     : mInnerWindowID(0),
51       mOuterWindowID(0),
52       mRawID(aRawId),
53       mMediaSource(aMediaSource),
54       mType(GetUserMediaRequestType::Recording_device_stopped),
55       mIsSecure(false),
56       mIsHandlingUserInput(aIsHandlingUserInput) {
57   if (aInnerWindow && aInnerWindow->GetOuterWindow()) {
58     mOuterWindowID = aInnerWindow->GetOuterWindow()->WindowID();
59   }
60 }
61 
62 GetUserMediaRequest::~GetUserMediaRequest() = default;
63 
64 NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE_0(GetUserMediaRequest)
NS_IMPL_CYCLE_COLLECTING_ADDREF(GetUserMediaRequest)65 NS_IMPL_CYCLE_COLLECTING_ADDREF(GetUserMediaRequest)
66 NS_IMPL_CYCLE_COLLECTING_RELEASE(GetUserMediaRequest)
67 NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(GetUserMediaRequest)
68   NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
69   NS_INTERFACE_MAP_ENTRY(nsISupports)
70 NS_INTERFACE_MAP_END
71 
72 JSObject* GetUserMediaRequest::WrapObject(JSContext* aCx,
73                                           JS::Handle<JSObject*> aGivenProto) {
74   return GetUserMediaRequest_Binding::Wrap(aCx, this, aGivenProto);
75 }
76 
GetParentObject()77 nsISupports* GetUserMediaRequest::GetParentObject() { return nullptr; }
78 
Type()79 GetUserMediaRequestType GetUserMediaRequest::Type() { return mType; }
80 
GetCallID(nsString & retval)81 void GetUserMediaRequest::GetCallID(nsString& retval) { retval = mCallID; }
82 
GetRawID(nsString & retval)83 void GetUserMediaRequest::GetRawID(nsString& retval) { retval = mRawID; }
84 
GetMediaSource(nsString & retval)85 void GetUserMediaRequest::GetMediaSource(nsString& retval) {
86   retval = mMediaSource;
87 }
88 
WindowID()89 uint64_t GetUserMediaRequest::WindowID() { return mOuterWindowID; }
90 
InnerWindowID()91 uint64_t GetUserMediaRequest::InnerWindowID() { return mInnerWindowID; }
92 
IsSecure()93 bool GetUserMediaRequest::IsSecure() { return mIsSecure; }
94 
IsHandlingUserInput() const95 bool GetUserMediaRequest::IsHandlingUserInput() const {
96   return mIsHandlingUserInput;
97 }
98 
GetDevices(nsTArray<RefPtr<nsIMediaDevice>> & retval) const99 void GetUserMediaRequest::GetDevices(
100     nsTArray<RefPtr<nsIMediaDevice>>& retval) const {
101   MOZ_ASSERT(retval.Length() == 0);
102   if (!mMediaDeviceSet) {
103     return;
104   }
105   for (const auto& device : *mMediaDeviceSet) {
106     retval.AppendElement(device);
107   }
108 }
109 
GetConstraints(MediaStreamConstraints & result)110 void GetUserMediaRequest::GetConstraints(MediaStreamConstraints& result) {
111   MOZ_ASSERT(result.mAudio.IsBoolean() && !result.mAudio.GetAsBoolean() &&
112                  result.mVideo.IsBoolean() && !result.mVideo.GetAsBoolean(),
113              "result should be default initialized");
114   if (mConstraints) {
115     result = *mConstraints;
116   }
117 }
118 
GetAudioOutputOptions(AudioOutputOptions & result)119 void GetUserMediaRequest::GetAudioOutputOptions(AudioOutputOptions& result) {
120   MOZ_ASSERT(result.mDeviceId.IsEmpty(),
121              "result should be default initialized");
122   if (mAudioOutputOptions) {
123     result = *mAudioOutputOptions;
124   }
125 }
126 
127 }  // namespace mozilla::dom
128