diff -r 000000000000 -r 6474c204b198 dom/camera/DOMCameraManager.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dom/camera/DOMCameraManager.h Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,108 @@ +/* -*- Mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; tab-width: 40 -*- */ +/* vim: set ts=2 et sw=2 tw=40: */ +/* 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 DOM_CAMERA_DOMCAMERAMANAGER_H +#define DOM_CAMERA_DOMCAMERAMANAGER_H + +#include "mozilla/dom/BindingDeclarations.h" +#include "nsCOMPtr.h" +#include "nsAutoPtr.h" +#include "nsIObserver.h" +#include "nsHashKeys.h" +#include "nsWrapperCache.h" +#include "nsWeakReference.h" +#include "nsClassHashtable.h" +#include "nsCycleCollectionParticipant.h" +#include "mozilla/Attributes.h" + +class nsPIDOMWindow; + +namespace mozilla { + class ErrorResult; + class nsDOMCameraControl; + namespace dom { + class CameraConfiguration; + class GetCameraCallback; + class CameraErrorCallback; + } +} + +typedef nsTArray > CameraControls; +typedef nsClassHashtable WindowTable; +typedef mozilla::dom::Optional> + OptionalNonNullCameraErrorCallback; + +class nsDOMCameraManager MOZ_FINAL + : public nsIObserver + , public nsSupportsWeakReference + , public nsWrapperCache +{ +public: + NS_DECL_CYCLE_COLLECTING_ISUPPORTS + NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS_AMBIGUOUS(nsDOMCameraManager, + nsIObserver) + NS_DECL_NSIOBSERVER + + // Because this header's filename doesn't match its C++ or DOM-facing + // classname, we can't rely on the [Func="..."] WebIDL tag to implicitly + // include the right header for us; instead we must explicitly include a + // HasSupport() method in each header. We can get rid of these with the + // Great Renaming proposed in bug 983177. + static bool HasSupport(JSContext* aCx, JSObject* aGlobal); + + static bool CheckPermission(nsPIDOMWindow* aWindow); + static already_AddRefed + CreateInstance(nsPIDOMWindow* aWindow); + static bool IsWindowStillActive(uint64_t aWindowId); + + void Register(mozilla::nsDOMCameraControl* aDOMCameraControl); + void OnNavigation(uint64_t aWindowId); + + void PermissionAllowed(uint32_t aCameraId, + const mozilla::dom::CameraConfiguration& aOptions, + mozilla::dom::GetCameraCallback* aOnSuccess, + mozilla::dom::CameraErrorCallback* aOnError); + + void PermissionCancelled(uint32_t aCameraId, + const mozilla::dom::CameraConfiguration& aOptions, + mozilla::dom::GetCameraCallback* aOnSuccess, + mozilla::dom::CameraErrorCallback* aOnError); + + // WebIDL + void GetCamera(const nsAString& aCamera, + const mozilla::dom::CameraConfiguration& aOptions, + mozilla::dom::GetCameraCallback& aOnSuccess, + const OptionalNonNullCameraErrorCallback& aOnError, + mozilla::ErrorResult& aRv); + void GetListOfCameras(nsTArray& aList, mozilla::ErrorResult& aRv); + + nsPIDOMWindow* GetParentObject() const { return mWindow; } + virtual JSObject* WrapObject(JSContext* aCx) + MOZ_OVERRIDE; + +protected: + void XpComShutdown(); + void Shutdown(uint64_t aWindowId); + ~nsDOMCameraManager(); + +private: + nsDOMCameraManager() MOZ_DELETE; + nsDOMCameraManager(nsPIDOMWindow* aWindow); + nsDOMCameraManager(const nsDOMCameraManager&) MOZ_DELETE; + nsDOMCameraManager& operator=(const nsDOMCameraManager&) MOZ_DELETE; + +protected: + uint64_t mWindowId; + uint32_t mPermission; + nsCOMPtr mWindow; + /** + * 'sActiveWindows' is only ever accessed while in the Main Thread, + * so it is not otherwise protected. + */ + static ::WindowTable* sActiveWindows; +}; + +#endif // DOM_CAMERA_DOMCAMERAMANAGER_H