tor-browser

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

Worklet.cpp (4206B)


      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 "Worklet.h"
      8 
      9 #include "WorkletThread.h"
     10 #include "mozilla/dom/WorkletFetchHandler.h"
     11 #include "mozilla/dom/WorkletImpl.h"
     12 #include "xpcprivate.h"
     13 
     14 using JS::loader::ResolveError;
     15 using JS::loader::ResolveErrorInfo;
     16 
     17 namespace mozilla::dom {
     18 // ---------------------------------------------------------------------------
     19 // Worklet
     20 
     21 NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE_CLASS(Worklet)
     22 
     23 NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(Worklet)
     24  NS_IMPL_CYCLE_COLLECTION_UNLINK(mWindow)
     25  NS_IMPL_CYCLE_COLLECTION_UNLINK(mOwnedObject)
     26  NS_IMPL_CYCLE_COLLECTION_UNLINK(mImportHandlers)
     27  tmp->mImpl->NotifyWorkletFinished();
     28  NS_IMPL_CYCLE_COLLECTION_UNLINK_PRESERVED_WRAPPER
     29 NS_IMPL_CYCLE_COLLECTION_UNLINK_END
     30 
     31 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(Worklet)
     32  NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mWindow)
     33  NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mOwnedObject)
     34  NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mImportHandlers)
     35 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
     36 
     37 NS_IMPL_CYCLE_COLLECTING_ADDREF(Worklet)
     38 NS_IMPL_CYCLE_COLLECTING_RELEASE(Worklet)
     39 
     40 NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(Worklet)
     41  NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
     42  NS_INTERFACE_MAP_ENTRY(nsISupports)
     43 NS_INTERFACE_MAP_END
     44 
     45 Worklet::Worklet(nsPIDOMWindowInner* aWindow, RefPtr<WorkletImpl> aImpl,
     46                 nsISupports* aOwnedObject)
     47    : mWindow(aWindow), mOwnedObject(aOwnedObject), mImpl(std::move(aImpl)) {
     48  MOZ_ASSERT(aWindow);
     49  MOZ_ASSERT(mImpl);
     50  MOZ_ASSERT(NS_IsMainThread());
     51 }
     52 
     53 Worklet::~Worklet() { mImpl->NotifyWorkletFinished(); }
     54 
     55 JSObject* Worklet::WrapObject(JSContext* aCx,
     56                              JS::Handle<JSObject*> aGivenProto) {
     57  return mImpl->WrapWorklet(aCx, this, aGivenProto);
     58 }
     59 
     60 static bool LoadLocalizedStrings(nsTArray<nsString>& aStrings) {
     61  // All enumes in ResolveError.
     62  ResolveError errors[] = {ResolveError::Failure,
     63                           ResolveError::FailureMayBeBare,
     64                           ResolveError::BlockedByNullEntry,
     65                           ResolveError::BlockedByAfterPrefix,
     66                           ResolveError::BlockedByBacktrackingPrefix,
     67                           ResolveError::InvalidBareSpecifier};
     68 
     69  static_assert(
     70      std::size(errors) == static_cast<size_t>(ResolveError::Length),
     71      "The array 'errors' has missing entries in the enum class ResolveError.");
     72 
     73  for (auto i : errors) {
     74    nsAutoString message;
     75    nsresult rv = nsContentUtils::GetLocalizedString(
     76        nsContentUtils::eDOM_PROPERTIES, ResolveErrorInfo::GetString(i),
     77        message);
     78    if (NS_WARN_IF(NS_FAILED(rv))) {
     79      if (NS_WARN_IF(!aStrings.AppendElement(EmptyString(), fallible))) {
     80        return false;
     81      }
     82    } else {
     83      if (NS_WARN_IF(!aStrings.AppendElement(message, fallible))) {
     84        return false;
     85      }
     86    }
     87  }
     88 
     89  return true;
     90 }
     91 
     92 already_AddRefed<Promise> Worklet::AddModule(JSContext* aCx,
     93                                             const nsAString& aModuleURL,
     94                                             const WorkletOptions& aOptions,
     95                                             CallerType aCallerType,
     96                                             ErrorResult& aRv) {
     97  MOZ_ASSERT(NS_IsMainThread());
     98  if (mLocalizedStrings.IsEmpty()) {
     99    bool result = LoadLocalizedStrings(mLocalizedStrings);
    100    if (!result) {
    101      return nullptr;
    102    }
    103  }
    104 
    105  return WorkletFetchHandler::AddModule(this, aCx, aModuleURL, aOptions, aRv);
    106 }
    107 
    108 WorkletFetchHandler* Worklet::GetImportFetchHandler(const nsACString& aURI) {
    109  MOZ_ASSERT(NS_IsMainThread());
    110  return mImportHandlers.GetWeak(aURI);
    111 }
    112 
    113 void Worklet::AddImportFetchHandler(const nsACString& aURI,
    114                                    WorkletFetchHandler* aHandler) {
    115  MOZ_ASSERT(aHandler);
    116  MOZ_ASSERT(!mImportHandlers.GetWeak(aURI));
    117  MOZ_ASSERT(NS_IsMainThread());
    118 
    119  mImportHandlers.InsertOrUpdate(aURI, RefPtr{aHandler});
    120 }
    121 
    122 }  // namespace mozilla::dom