tor-browser

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

WorkerModuleLoader.h (4183B)


      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 #ifndef mozilla_loader_WorkerModuleLoader_h
      8 #define mozilla_loader_WorkerModuleLoader_h
      9 
     10 #include "js/loader/ModuleLoaderBase.h"
     11 #include "js/loader/ScriptFetchOptions.h"
     12 #include "mozilla/dom/SerializedStackHolder.h"
     13 
     14 namespace mozilla::dom::workerinternals::loader {
     15 class WorkerScriptLoader;
     16 
     17 // alias common classes
     18 using ScriptFetchOptions = JS::loader::ScriptFetchOptions;
     19 using ScriptKind = JS::loader::ScriptKind;
     20 using ScriptLoadRequest = JS::loader::ScriptLoadRequest;
     21 using ScriptLoadRequestList = JS::loader::ScriptLoadRequestList;
     22 using ModuleLoadRequest = JS::loader::ModuleLoadRequest;
     23 
     24 // WorkerModuleLoader
     25 //
     26 // The WorkerModuleLoader provides the methods that implement specification
     27 // step 5 from "To fetch a worklet/module worker script graph", specifically for
     28 // workers. In addition, this implements worker specific initialization for
     29 // Static imports and Dynamic imports.
     30 //
     31 // The steps are outlined in "To fetch the descendants of and link a module
     32 // script" and are common for all Modules. Thus we delegate to ModuleLoaderBase
     33 // for those steps.
     34 class WorkerModuleLoader : public JS::loader::ModuleLoaderBase {
     35 public:
     36  NS_DECL_ISUPPORTS_INHERITED
     37  NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(WorkerModuleLoader,
     38                                           JS::loader::ModuleLoaderBase)
     39 
     40  WorkerModuleLoader(WorkerScriptLoader* aScriptLoader,
     41                     nsIGlobalObject* aGlobalObject);
     42 
     43 private:
     44  ~WorkerModuleLoader() = default;
     45 
     46  nsIURI* GetClientReferrerURI() override;
     47 
     48  already_AddRefed<JS::loader::ScriptFetchOptions>
     49  CreateDefaultScriptFetchOptions() override;
     50 
     51  already_AddRefed<ModuleLoadRequest> CreateRequest(
     52      JSContext* aCx, nsIURI* aURI, JS::Handle<JSObject*> aModuleRequest,
     53      JS::Handle<JS::Value> aHostDefined, JS::Handle<JS::Value> aPayload,
     54      bool aIsDynamicImport, ScriptFetchOptions* aOptions,
     55      mozilla::dom::ReferrerPolicy aReferrerPolicy, nsIURI* aBaseURL,
     56      const mozilla::dom::SRIMetadata& aSriMetadata) override;
     57 
     58  bool CreateDynamicImportLoader();
     59  void SetScriptLoader(JS::loader::ScriptLoaderInterface* aLoader) {
     60    mLoader = aLoader;
     61  }
     62 
     63  WorkerScriptLoader* GetCurrentScriptLoader();
     64 
     65  WorkerScriptLoader* GetScriptLoaderFor(ModuleLoadRequest* aRequest);
     66 
     67  nsIURI* GetBaseURI() const override;
     68 
     69  bool IsDynamicImportSupported() override;
     70 
     71  bool CanStartLoad(ModuleLoadRequest* aRequest, nsresult* aRvOut) override;
     72 
     73  // StartFetch is special for worker modules, as we need to move back to the
     74  // main thread to start a new load.
     75  nsresult StartFetch(ModuleLoadRequest* aRequest) override;
     76 
     77  nsresult CompileFetchedModule(
     78      JSContext* aCx, JS::Handle<JSObject*> aGlobal,
     79      JS::CompileOptions& aOptions, ModuleLoadRequest* aRequest,
     80      JS::MutableHandle<JSObject*> aModuleScript) override;
     81 
     82  nsresult CompileJavaScriptOrWasmModule(
     83      JSContext* aCx, JS::CompileOptions& aOptions, ModuleLoadRequest* aRequest,
     84      JS::MutableHandle<JSObject*> aModuleScript);
     85 
     86  nsresult CompileJsonModule(JSContext* aCx, JS::CompileOptions& aOptions,
     87                             ModuleLoadRequest* aRequest,
     88                             JS::MutableHandle<JSObject*> aModuleScript);
     89 
     90  void OnModuleLoadComplete(ModuleLoadRequest* aRequest) override;
     91 
     92  bool IsModuleEvaluationAborted(ModuleLoadRequest* aRequest) override;
     93 
     94  bool IsModuleTypeAllowed(JS::ModuleType aModuleType) override {
     95    // https://html.spec.whatwg.org/#module-type-allowed
     96    // If moduleType is "css" and the CSSStyleSheet interface is not exposed in
     97    // settings's realm, then return false.
     98    return aModuleType == JS::ModuleType::JavaScript ||
     99           aModuleType == JS::ModuleType::JSON;
    100  }
    101 
    102  virtual bool IsForServiceWorker() const override;
    103 };
    104 
    105 }  // namespace mozilla::dom::workerinternals::loader
    106 #endif  // mozilla_loader_WorkerModuleLoader_h