1 // Copyright 2017 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_LOADER_MODULESCRIPT_MODULE_SCRIPT_LOADER_H_ 6 #define THIRD_PARTY_BLINK_RENDERER_CORE_LOADER_MODULESCRIPT_MODULE_SCRIPT_LOADER_H_ 7 8 #include "base/macros.h" 9 #include "third_party/blink/public/platform/web_url_request.h" 10 #include "third_party/blink/renderer/core/core_export.h" 11 #include "third_party/blink/renderer/core/loader/modulescript/module_script_creation_params.h" 12 #include "third_party/blink/renderer/core/loader/modulescript/module_script_fetch_request.h" 13 #include "third_party/blink/renderer/core/loader/modulescript/module_script_fetcher.h" 14 #include "third_party/blink/renderer/platform/heap/handle.h" 15 #include "third_party/blink/renderer/platform/weborigin/kurl.h" 16 17 namespace blink { 18 19 class Modulator; 20 class ModuleScript; 21 class ModuleScriptLoaderClient; 22 class ModuleScriptLoaderRegistry; 23 class ResourceFetcher; 24 enum class ModuleGraphLevel; 25 26 // ModuleScriptLoader is responsible for loading a new single ModuleScript. 27 // 28 // ModuleScriptLoader constructs FetchParameters and asks ModuleScriptFetcher 29 // to fetch a script with the parameters. Then, it returns its client a compiled 30 // ModuleScript. 31 // 32 // ModuleScriptLoader(s) should only be used via Modulator and its ModuleMap. 33 class CORE_EXPORT ModuleScriptLoader final 34 : public GarbageCollected<ModuleScriptLoader>, 35 public ModuleScriptFetcher::Client { 36 enum class State { 37 kInitial, 38 // FetchParameters is being processed, and ModuleScriptLoader hasn't 39 // notifyFinished(). 40 kFetching, 41 // Finished successfully or w/ error. 42 kFinished, 43 }; 44 45 public: 46 ModuleScriptLoader(Modulator*, 47 const ScriptFetchOptions&, 48 ModuleScriptLoaderRegistry*, 49 ModuleScriptLoaderClient*); 50 ~ModuleScriptLoader(); 51 52 static void Fetch(const ModuleScriptFetchRequest&, 53 ResourceFetcher* fetch_client_settings_object_fetcher, 54 ModuleGraphLevel, 55 Modulator* module_map_settings_object, 56 ModuleScriptCustomFetchType, 57 ModuleScriptLoaderRegistry*, 58 ModuleScriptLoaderClient*); 59 60 // Implements ModuleScriptFetcher::Client. 61 void NotifyFetchFinished( 62 const base::Optional<ModuleScriptCreationParams>&, 63 const HeapVector<Member<ConsoleMessage>>& error_messages) override; 64 IsInitialState()65 bool IsInitialState() const { return state_ == State::kInitial; } HasFinished()66 bool HasFinished() const { return state_ == State::kFinished; } 67 68 void Trace(Visitor*) const override; 69 70 friend class WorkletModuleResponsesMapTest; 71 72 private: 73 void FetchInternal(const ModuleScriptFetchRequest&, 74 ResourceFetcher* fetch_client_settings_object_fetcher, 75 ModuleGraphLevel, 76 ModuleScriptCustomFetchType); 77 78 void AdvanceState(State new_state); 79 80 using PassKey = util::PassKey<ModuleScriptLoader>; 81 // PassKey should be private and cannot be accessed from outside, but allow 82 // accessing only from friend classes for testing. CreatePassKeyForTests()83 static util::PassKey<ModuleScriptLoader> CreatePassKeyForTests() { 84 return PassKey(); 85 } 86 87 #if DCHECK_IS_ON() 88 static const char* StateToString(State); 89 #endif 90 91 Member<Modulator> modulator_; 92 State state_ = State::kInitial; 93 const ScriptFetchOptions options_; 94 Member<ModuleScript> module_script_; 95 Member<ModuleScriptLoaderRegistry> registry_; 96 Member<ModuleScriptLoaderClient> client_; 97 Member<ModuleScriptFetcher> module_fetcher_; 98 #if DCHECK_IS_ON() 99 KURL url_; 100 #endif 101 102 DISALLOW_COPY_AND_ASSIGN(ModuleScriptLoader); 103 }; 104 105 } // namespace blink 106 107 #endif 108