tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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