Thu, 15 Jan 2015 15:55:04 +0100
Back out 97036ab72558 which inappropriately compared turds to third parties.
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/. */
5 #ifndef DOM_CAMERA_DOMCAMERACONTROL_H
6 #define DOM_CAMERA_DOMCAMERACONTROL_H
8 #include "nsCOMPtr.h"
9 #include "nsAutoPtr.h"
10 #include "nsCycleCollectionParticipant.h"
11 #include "mozilla/dom/CameraControlBinding.h"
12 #include "ICameraControl.h"
13 #include "CameraCommon.h"
14 #include "DOMMediaStream.h"
15 #include "AudioChannelAgent.h"
16 #include "nsProxyRelease.h"
17 #include "nsHashPropertyBag.h"
18 #include "DeviceStorage.h"
19 #include "DOMCameraControlListener.h"
21 class nsDOMDeviceStorage;
22 class nsPIDOMWindow;
23 class nsIDOMBlob;
25 namespace mozilla {
27 namespace dom {
28 class CameraCapabilities;
29 class CameraPictureOptions;
30 class CameraStartRecordingOptions;
31 template<typename T> class Optional;
32 }
33 class ErrorResult;
34 class StartRecordingHelper;
36 // Main camera control.
37 class nsDOMCameraControl MOZ_FINAL : public DOMMediaStream
38 {
39 public:
40 NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(nsDOMCameraControl, DOMMediaStream)
41 NS_DECL_ISUPPORTS_INHERITED
43 // Because this header's filename doesn't match its C++ or DOM-facing
44 // classname, we can't rely on the [Func="..."] WebIDL tag to implicitly
45 // include the right header for us; instead we must explicitly include a
46 // HasSupport() method in each header. We can get rid of these with the
47 // Great Renaming proposed in bug 983177.
48 static bool HasSupport(JSContext* aCx, JSObject* aGlobal);
50 nsDOMCameraControl(uint32_t aCameraId,
51 const dom::CameraConfiguration& aInitialConfig,
52 dom::GetCameraCallback* aOnSuccess,
53 dom::CameraErrorCallback* aOnError,
54 nsPIDOMWindow* aWindow);
56 void Shutdown();
58 nsPIDOMWindow* GetParentObject() const { return mWindow; }
60 // Attributes.
61 void GetEffect(nsString& aEffect, ErrorResult& aRv);
62 void SetEffect(const nsAString& aEffect, ErrorResult& aRv);
63 void GetWhiteBalanceMode(nsString& aMode, ErrorResult& aRv);
64 void SetWhiteBalanceMode(const nsAString& aMode, ErrorResult& aRv);
65 void GetSceneMode(nsString& aMode, ErrorResult& aRv);
66 void SetSceneMode(const nsAString& aMode, ErrorResult& aRv);
67 void GetFlashMode(nsString& aMode, ErrorResult& aRv);
68 void SetFlashMode(const nsAString& aMode, ErrorResult& aRv);
69 void GetFocusMode(nsString& aMode, ErrorResult& aRv);
70 void SetFocusMode(const nsAString& aMode, ErrorResult& aRv);
71 double GetZoom(ErrorResult& aRv);
72 void SetZoom(double aZoom, ErrorResult& aRv);
73 void GetMeteringAreas(JSContext* aCx,
74 JS::MutableHandle<JS::Value> aMeteringAreas,
75 ErrorResult& aRv);
76 void SetMeteringAreas(JSContext* aCx, JS::Handle<JS::Value> aAreas, ErrorResult& aRv);
77 void GetFocusAreas(JSContext* aCx,
78 JS::MutableHandle<JS::Value> aFocusAreas,
79 ErrorResult& aRv);
80 void SetFocusAreas(JSContext* aCx, JS::Handle<JS::Value> aAreas, ErrorResult& aRv);
81 void GetPictureSize(JSContext* aCx,
82 JS::MutableHandle<JS::Value> aSize,
83 ErrorResult& aRv);
84 void SetPictureSize(JSContext* aCx, JS::Handle<JS::Value> aSize, ErrorResult& aRv);
85 void GetThumbnailSize(JSContext* aCx,
86 JS::MutableHandle<JS::Value> aSize,
87 ErrorResult& aRv);
88 void SetThumbnailSize(JSContext* aCx, JS::Handle<JS::Value> aSize, ErrorResult& aRv);
89 double GetFocalLength(ErrorResult& aRv);
90 double GetFocusDistanceNear(ErrorResult& aRv);
91 double GetFocusDistanceOptimum(ErrorResult& aRv);
92 double GetFocusDistanceFar(ErrorResult& aRv);
93 void SetExposureCompensation(const dom::Optional<double>& aCompensation, ErrorResult& aRv);
94 double GetExposureCompensation(ErrorResult& aRv);
95 int32_t SensorAngle();
96 already_AddRefed<dom::CameraCapabilities> Capabilities();
97 void GetIsoMode(nsString& aMode, ErrorResult& aRv);
98 void SetIsoMode(const nsAString& aMode, ErrorResult& aRv);
100 // Unsolicited event handlers.
101 dom::CameraShutterCallback* GetOnShutter();
102 void SetOnShutter(dom::CameraShutterCallback* aCb);
103 dom::CameraClosedCallback* GetOnClosed();
104 void SetOnClosed(dom::CameraClosedCallback* aCb);
105 dom::CameraRecorderStateChange* GetOnRecorderStateChange();
106 void SetOnRecorderStateChange(dom::CameraRecorderStateChange* aCb);
107 dom::CameraPreviewStateChange* GetOnPreviewStateChange();
108 void SetOnPreviewStateChange(dom::CameraPreviewStateChange* aCb);
109 dom::CameraAutoFocusMovingCallback* GetOnAutoFocusMoving();
110 void SetOnAutoFocusMoving(dom::CameraAutoFocusMovingCallback* aCb);
111 dom::CameraFaceDetectionCallback* GetOnFacesDetected();
112 void SetOnFacesDetected(dom::CameraFaceDetectionCallback* aCb);
114 // Methods.
115 void SetConfiguration(const dom::CameraConfiguration& aConfiguration,
116 const dom::Optional<dom::OwningNonNull<dom::CameraSetConfigurationCallback> >& aOnSuccess,
117 const dom::Optional<dom::OwningNonNull<dom::CameraErrorCallback> >& aOnError,
118 ErrorResult& aRv);
119 void AutoFocus(dom::CameraAutoFocusCallback& aOnSuccess,
120 const dom::Optional<dom::OwningNonNull<dom::CameraErrorCallback> >& aOnError,
121 ErrorResult& aRv);
122 void StartFaceDetection(ErrorResult& aRv);
123 void StopFaceDetection(ErrorResult& aRv);
124 void TakePicture(const dom::CameraPictureOptions& aOptions,
125 dom::CameraTakePictureCallback& aOnSuccess,
126 const dom::Optional<dom::OwningNonNull<dom::CameraErrorCallback> >& aOnError,
127 ErrorResult& aRv);
128 void StartRecording(const dom::CameraStartRecordingOptions& aOptions,
129 nsDOMDeviceStorage& storageArea,
130 const nsAString& filename,
131 dom::CameraStartRecordingCallback& aOnSuccess,
132 const dom::Optional<dom::OwningNonNull<dom::CameraErrorCallback> >& aOnError,
133 ErrorResult& aRv);
134 void StopRecording(ErrorResult& aRv);
135 void ResumePreview(ErrorResult& aRv);
136 void ReleaseHardware(const dom::Optional<dom::OwningNonNull<dom::CameraReleaseCallback> >& aOnSuccess,
137 const dom::Optional<dom::OwningNonNull<dom::CameraErrorCallback> >& aOnError,
138 ErrorResult& aRv);
139 void ResumeContinuousFocus(ErrorResult& aRv);
141 virtual JSObject* WrapObject(JSContext* aCx) MOZ_OVERRIDE;
143 protected:
144 virtual ~nsDOMCameraControl();
146 class DOMCameraConfiguration MOZ_FINAL : public dom::CameraConfiguration
147 {
148 public:
149 NS_INLINE_DECL_REFCOUNTING(DOMCameraConfiguration)
151 DOMCameraConfiguration();
152 DOMCameraConfiguration(const dom::CameraConfiguration& aConfiguration);
154 // Additional configuration options that aren't exposed to the DOM
155 uint32_t mMaxFocusAreas;
156 uint32_t mMaxMeteringAreas;
158 private:
159 // Private destructor, to discourage deletion outside of Release():
160 ~DOMCameraConfiguration();
161 };
163 friend class DOMCameraControlListener;
164 friend class mozilla::StartRecordingHelper;
166 void OnCreatedFileDescriptor(bool aSucceeded);
168 void OnAutoFocusComplete(bool aAutoFocusSucceeded);
169 void OnAutoFocusMoving(bool aIsMoving);
170 void OnTakePictureComplete(nsIDOMBlob* aPicture);
171 void OnFacesDetected(const nsTArray<ICameraControl::Face>& aFaces);
173 void OnHardwareStateChange(DOMCameraControlListener::HardwareState aState);
174 void OnPreviewStateChange(DOMCameraControlListener::PreviewState aState);
175 void OnRecorderStateChange(CameraControlListener::RecorderState aState, int32_t aStatus, int32_t aTrackNum);
176 void OnConfigurationChange(DOMCameraConfiguration* aConfiguration);
177 void OnShutter();
178 void OnError(CameraControlListener::CameraErrorContext aContext, const nsAString& mError);
180 bool IsWindowStillActive();
182 nsresult NotifyRecordingStatusChange(const nsString& aMsg);
184 nsRefPtr<ICameraControl> mCameraControl; // non-DOM camera control
186 // An agent used to join audio channel service.
187 nsCOMPtr<nsIAudioChannelAgent> mAudioChannelAgent;
189 nsresult Set(JSContext* aCx, uint32_t aKey, const JS::Value& aValue, uint32_t aLimit);
190 nsresult Get(JSContext* aCx, uint32_t aKey, JS::Value* aValue);
192 nsRefPtr<DOMCameraConfiguration> mCurrentConfiguration;
193 nsRefPtr<dom::CameraCapabilities> mCapabilities;
195 // solicited camera control event handlers
196 nsRefPtr<dom::GetCameraCallback> mGetCameraOnSuccessCb;
197 nsRefPtr<dom::CameraErrorCallback> mGetCameraOnErrorCb;
198 nsRefPtr<dom::CameraAutoFocusCallback> mAutoFocusOnSuccessCb;
199 nsRefPtr<dom::CameraErrorCallback> mAutoFocusOnErrorCb;
200 nsRefPtr<dom::CameraTakePictureCallback> mTakePictureOnSuccessCb;
201 nsRefPtr<dom::CameraErrorCallback> mTakePictureOnErrorCb;
202 nsRefPtr<dom::CameraStartRecordingCallback> mStartRecordingOnSuccessCb;
203 nsRefPtr<dom::CameraErrorCallback> mStartRecordingOnErrorCb;
204 nsRefPtr<dom::CameraReleaseCallback> mReleaseOnSuccessCb;
205 nsRefPtr<dom::CameraErrorCallback> mReleaseOnErrorCb;
206 nsRefPtr<dom::CameraSetConfigurationCallback> mSetConfigurationOnSuccessCb;
207 nsRefPtr<dom::CameraErrorCallback> mSetConfigurationOnErrorCb;
209 // unsolicited event handlers
210 nsRefPtr<dom::CameraShutterCallback> mOnShutterCb;
211 nsRefPtr<dom::CameraClosedCallback> mOnClosedCb;
212 nsRefPtr<dom::CameraRecorderStateChange> mOnRecorderStateChangeCb;
213 nsRefPtr<dom::CameraPreviewStateChange> mOnPreviewStateChangeCb;
214 nsRefPtr<dom::CameraAutoFocusMovingCallback> mOnAutoFocusMovingCb;
215 nsRefPtr<dom::CameraFaceDetectionCallback> mOnFacesDetectedCb;
217 // Camera event listener; we only need this weak reference so that
218 // we can remove the listener from the camera when we're done
219 // with it.
220 DOMCameraControlListener* mListener;
222 // our viewfinder stream
223 CameraPreviewMediaStream* mInput;
225 // set once when this object is created
226 nsCOMPtr<nsPIDOMWindow> mWindow;
228 dom::CameraStartRecordingOptions mOptions;
229 nsRefPtr<DeviceStorageFileDescriptor> mDSFileDescriptor;
231 private:
232 nsDOMCameraControl(const nsDOMCameraControl&) MOZ_DELETE;
233 nsDOMCameraControl& operator=(const nsDOMCameraControl&) MOZ_DELETE;
234 };
236 } // namespace mozilla
238 #endif // DOM_CAMERA_DOMCAMERACONTROL_H