/* [implicit_jscontext] void getCamera ([optional] in jsval aOptions, in nsICameraGetCameraCallback onSuccess, [optional] in nsICameraErrorCallback onError); */ NS_IMETHODIMP nsDOMCameraManager::GetCamera(const JS::Value& aOptions, nsICameraGetCameraCallback* onSuccess, nsICameraErrorCallback* onError, JSContext* cx) { NS_ENSURE_TRUE(onSuccess, NS_ERROR_INVALID_ARG); PRUint32 cameraId = 0; // back (or forward-facing) camera by default CameraSelector selector; nsresult rv = selector.Init(cx, &aOptions); NS_ENSURE_SUCCESS(rv, rv); if (selector.camera.EqualsASCII("front")) { cameraId = 1; } // reuse the same camera thread to conserve resources if (!mCameraThread) { rv = NS_NewThread(getter_AddRefs(mCameraThread)); NS_ENSURE_SUCCESS(rv, rv); } DOM_CAMERA_LOGI("%s:%d\n", __func__, __LINE__); nsCOMPtr<nsIRunnable> getCameraTask = new GetCameraTask(cameraId, onSuccess, onError, mCameraThread); mCameraThread->Dispatch(getCameraTask, NS_DISPATCH_NORMAL); return NS_OK; }
/* [implicit_jscontext] void getCamera ([optional] in jsval aOptions, in nsICameraGetCameraCallback onSuccess, [optional] in nsICameraErrorCallback onError); */ NS_IMETHODIMP nsDOMCameraManager::GetCamera(const JS::Value& aOptions, nsICameraGetCameraCallback* onSuccess, nsICameraErrorCallback* onError, JSContext* cx) { NS_ENSURE_TRUE(onSuccess, NS_ERROR_INVALID_ARG); uint32_t cameraId = 0; // back (or forward-facing) camera by default CameraSelector selector; nsresult rv = selector.Init(cx, &aOptions); NS_ENSURE_SUCCESS(rv, rv); if (selector.camera.EqualsASCII("front")) { cameraId = 1; } // reuse the same camera thread to conserve resources if (!mCameraThread) { rv = NS_NewThread(getter_AddRefs(mCameraThread)); NS_ENSURE_SUCCESS(rv, rv); } DOM_CAMERA_LOGT("%s:%d\n", __func__, __LINE__); // Creating this object will trigger the onSuccess handler nsCOMPtr<nsDOMCameraControl> cameraControl = new nsDOMCameraControl(cameraId, mCameraThread, onSuccess, onError, mWindowId); Register(cameraControl); return NS_OK; }