MediaDrmProvisioningHelper.cpp (3294B)
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */ 3 /* This Source Code Form is subject to the terms of the Mozilla Public 4 * License, v. 2.0. If a copy of the MPL was not distributed with this 5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 6 7 #include "MediaDrmProvisioningHelper.h" 8 9 #include "nsComponentManagerUtils.h" 10 #include "nsIMediaDrmProvisioning.h" 11 12 namespace mozilla { 13 14 NS_IMPL_ISUPPORTS0(MediaDrmProvisioningHelper); 15 16 MediaDrmProvisioningHelper::MediaDrmProvisioningHelper( 17 const RemoteCDMProvisionRequestIPDL& aRequest, 18 PRemoteCDMChild::ProvisionResolver&& aResolver) 19 : mEventTarget(GetCurrentSerialEventTarget()), 20 mServerUrl(aRequest.serverUrl()), 21 mRequestData(NS_ConvertUTF8toUTF16( 22 reinterpret_cast<const char*>(aRequest.request().Elements()), 23 aRequest.request().Length())), 24 mResolver(std::move(aResolver)) {} 25 26 MediaDrmProvisioningHelper::~MediaDrmProvisioningHelper() { 27 MaybeResolve( 28 MediaResult(NS_ERROR_DOM_INVALID_STATE_ERR, 29 "Failed to resolve or reject provisioning promise"_ns)); 30 } 31 32 void MediaDrmProvisioningHelper::Provision() { 33 if (!NS_IsMainThread()) { 34 NS_DispatchToMainThread(NS_NewRunnableFunction( 35 __func__, [self = RefPtr{this}]() { self->Provision(); })); 36 return; 37 } 38 39 nsresult rv; 40 nsCOMPtr<nsIMediaDrmProvisioning> provisioning = do_CreateInstance( 41 "@mozilla.org/dom/media/eme/mediadrm/provisioning;1", &rv); 42 if (!provisioning) { 43 MaybeResolve( 44 MediaResult(NS_ERROR_DOM_INVALID_STATE_ERR, 45 "Failed to create nsIMediaDrmProvisioning object"_ns)); 46 return; 47 } 48 49 RefPtr<dom::Promise> promise; 50 rv = provisioning->Provision(mServerUrl, mRequestData, 51 getter_AddRefs(promise)); 52 if (NS_FAILED(rv)) { 53 MaybeResolve( 54 MediaResult(NS_ERROR_DOM_INVALID_STATE_ERR, 55 "nsICDMProvisioning::ProvisionAMediaDrm call failed"_ns)); 56 return; 57 } 58 59 promise->AppendNativeHandler(this); 60 } 61 62 void MediaDrmProvisioningHelper::ResolvedCallback(JSContext* aCx, 63 JS::Handle<JS::Value> aValue, 64 ErrorResult& aRv) { 65 MOZ_ASSERT(NS_IsMainThread()); 66 MOZ_ASSERT(mResolver); 67 68 dom::ArrayBufferView view; 69 if (!view.Init(aValue.toObjectOrNull())) { 70 MaybeResolve(MediaResult( 71 NS_ERROR_DOM_INVALID_STATE_ERR, 72 "Failed to initialize ArrayBufferView for provisioning response"_ns)); 73 return; 74 } 75 76 nsTArray<uint8_t> response; 77 if (!view.AppendDataTo(response)) { 78 MaybeResolve(MediaResult(NS_ERROR_DOM_INVALID_STATE_ERR, 79 "Failed to copy provision response"_ns)); 80 return; 81 } 82 83 MaybeResolve(std::move(response)); 84 } 85 86 void MediaDrmProvisioningHelper::RejectedCallback(JSContext* aCx, 87 JS::Handle<JS::Value> aValue, 88 ErrorResult& aRv) { 89 MOZ_ASSERT(NS_IsMainThread()); 90 MOZ_ASSERT(mResolver); 91 MaybeResolve(MediaResult(NS_ERROR_DOM_INVALID_STATE_ERR, 92 "Failed to fetch provisioning response"_ns)); 93 } 94 95 } // namespace mozilla