ModuleLoader.h (3425B)
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_dom_ModuleLoader_h 8 #define mozilla_dom_ModuleLoader_h 9 10 #include "ScriptLoader.h" 11 #include "js/loader/ModuleLoaderBase.h" 12 #include "mozilla/dom/ScriptLoadRequestType.h" 13 14 class nsIURI; 15 16 namespace JS { 17 18 class CompileOptions; 19 20 namespace loader { 21 22 class ModuleLoadRequest; 23 24 } // namespace loader 25 } // namespace JS 26 27 namespace mozilla::dom { 28 29 class ScriptLoader; 30 class ScriptLoadContext; 31 class SRIMetadata; 32 33 ////////////////////////////////////////////////////////////// 34 // DOM Module loader implementation 35 ////////////////////////////////////////////////////////////// 36 37 class ModuleLoader final : public JS::loader::ModuleLoaderBase { 38 private: 39 virtual ~ModuleLoader(); 40 41 public: 42 enum Kind { Normal, WebExtension }; 43 44 ModuleLoader(ScriptLoader* aLoader, nsIGlobalObject* aGlobalObject, 45 Kind aKind); 46 47 Kind GetKind() const { return mKind; } 48 49 ScriptLoader* GetScriptLoader(); 50 51 bool CanStartLoad(ModuleLoadRequest* aRequest, nsresult* aRvOut) override; 52 53 nsresult StartFetch(ModuleLoadRequest* aRequest) override; 54 55 void OnModuleLoadComplete(ModuleLoadRequest* aRequest) override; 56 57 nsresult CompileFetchedModule( 58 JSContext* aCx, JS::Handle<JSObject*> aGlobal, 59 JS::CompileOptions& aOptions, ModuleLoadRequest* aRequest, 60 JS::MutableHandle<JSObject*> aModuleScript) override; 61 62 // Create a top-level module load request. 63 already_AddRefed<ModuleLoadRequest> CreateTopLevel( 64 nsIURI* aURI, nsIScriptElement* aElement, ReferrerPolicy aReferrerPolicy, 65 ScriptFetchOptions* aFetchOptions, const SRIMetadata& aIntegrity, 66 nsIURI* aReferrer, ScriptLoadContext* aContext, 67 ScriptLoadRequestType aRequestType); 68 69 nsIURI* GetClientReferrerURI() override; 70 71 already_AddRefed<ScriptFetchOptions> CreateDefaultScriptFetchOptions() 72 override; 73 74 already_AddRefed<ModuleLoadRequest> CreateRequest( 75 JSContext* aCx, nsIURI* aURI, JS::Handle<JSObject*> aModuleRequest, 76 JS::Handle<JS::Value> aHostDefined, JS::Handle<JS::Value> aPayload, 77 bool aIsDynamicImport, ScriptFetchOptions* aOptions, 78 ReferrerPolicy aReferrerPolicy, nsIURI* aBaseURL, 79 const SRIMetadata& aSriMetadata) override; 80 81 static ModuleLoader* From(ModuleLoaderBase* aLoader) { 82 return static_cast<ModuleLoader*>(aLoader); 83 } 84 85 void AsyncExecuteInlineModule(ModuleLoadRequest* aRequest); 86 void ExecuteInlineModule(ModuleLoadRequest* aRequest); 87 88 private: 89 nsresult CompileJavaScriptOrWasmModule( 90 JSContext* aCx, JS::CompileOptions& aOptions, ModuleLoadRequest* aRequest, 91 JS::MutableHandle<JSObject*> aModuleOut); 92 nsresult CompileJsonModule(JSContext* aCx, JS::CompileOptions& aOptions, 93 ModuleLoadRequest* aRequest, 94 JS::MutableHandle<JSObject*> aModuleOut); 95 nsresult CompileCssModule(JSContext* aCx, JS::CompileOptions& aOptions, 96 ModuleLoadRequest* aRequest, 97 JS::MutableHandle<JSObject*> aModuleOut); 98 99 private: 100 const Kind mKind; 101 }; 102 103 } // namespace mozilla::dom 104 105 #endif // mozilla_dom_ModuleLoader_h