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