Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(6)

Side by Side Diff: third_party/WebKit/Source/core/dom/ModuleMap.h

Issue 2555653002: [WIP Prototype] ES6 https://html.spec.whatwg.org/#fetch-a-single-module-script implementation (Closed)
Patch Set: snapshot Dec19 Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2016 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 ModuleMap_h
6 #define ModuleMap_h
7
8 #include "bindings/core/v8/ScriptModule.h"
9 #include "core/fetch/ResourceOwner.h"
10 #include "core/loader/resource/ScriptResource.h"
11 #include "platform/heap/Handle.h"
12 #include "platform/weborigin/KURL.h"
13 #include "platform/weborigin/KURLHash.h"
14 #include "wtf/HashMap.h"
15 #include "wtf/HashTableDeletedValueType.h"
16
17 namespace blink {
18
19 class ModuleLoader;
20 class ResourceFetcher;
21 class ScriptController;
22 class ModuleLoaderRegistry;
23
24 // A ModuleLoader is responsible for loading a single ScriptModule.
25 //
26 // A ModuleLoader constructs and emit FetchRequest to RequestFetcher (via
27 // ScriptResource::fetch).
28 // Then, it keeps track of the fetch progress by being a ScriptResourceClient.
29 //
30 // either a module script, null (used to represent failed fetches), or a
dominicc (has gone to gerrit) 2016/12/19 10:07:51 still some disfluency here
31 // placeholder value "fetching". Module maps are used to ensure that imported
32 // JavaScript modules are only fetched, parsed, and evaluated once per
33 // Document or worker.
34 class ModuleLoader final : public GarbageCollectedFinalized<ModuleLoader>,
35 public ResourceOwner<ScriptResource> {
36 WTF_MAKE_NONCOPYABLE(ModuleLoader);
37 USING_GARBAGE_COLLECTED_MIXIN(ModuleLoader);
38
39 enum class State {
40 Initial,
41 // FetchRequest is being processed, and ModuleLoader hasn't
42 // notifyFinished().
43 Fetching,
44 // Finished successfully or w/ error.
45 Finished,
46 };
47
48 public:
49 class Client : public GarbageCollectedMixin {
50 private:
51 friend class ModuleLoader;
52 virtual void notifyFinished(ScriptModule) = 0;
53 };
54 // Call via ModuleLoaderRegistry::fetch.
55 static ModuleLoader* fetch(const KURL&,
56 ScriptController*,
57 ResourceFetcher*,
58 ModuleLoaderRegistry*,
59 Client*);
60
61 ~ModuleLoader() = default;
62
63 bool isFetching() const { return m_state == State::Fetching; }
dominicc (has gone to gerrit) 2016/12/19 10:07:51 Why not just have a state() accessor?
kouhei (in TOK) 2016/12/19 11:19:59 I'm not sure if we want to expose all internal sta
64 bool hasFinished() const { return m_state == State::Finished; }
65
66 DECLARE_TRACE();
67
68 private:
69 explicit ModuleLoader(const KURL&,
70 ScriptController*,
71 ModuleLoaderRegistry*,
72 Client*);
73
74 void fetchInternal(ResourceFetcher*);
75
76 void advanceState(State newState);
77
78 // Implements ScriptResourceClient
79 void notifyFinished(Resource*) override;
80 String debugName() const override { return "ModuleLoader"; }
81
82 // TODO(kouhei): May be this method should live in ModuleResource? or should
83 // it be here to consolidate the spec impl code in ModuleMap.cpp?
84 static bool wasModuleLoadSuccessful(Resource*);
85
86 KURL m_url;
87 Member<ScriptController> m_scriptController;
88 State m_state = State::Initial;
89 bool m_wasLoadSuccessful = true;
dominicc (has gone to gerrit) 2016/12/19 10:07:51 Maybe it's more robust to represent this in m_stat
kouhei (in TOK) 2016/12/19 11:19:59 This flag is no longer used. Let me remove this fl
kouhei (in TOK) 2016/12/20 10:47:35 Done.
90 ScriptModule m_scriptModule;
91 Member<ModuleLoaderRegistry> m_registry;
92 Member<Client> m_client;
93 };
94
95 // ModuleLoaderRegistry keeps active ModuleLoaders alive.
96 class ModuleLoaderRegistry : public GarbageCollected<ModuleLoaderRegistry> {
97 public:
98 static ModuleLoaderRegistry* create() { return new ModuleLoaderRegistry; }
99 DECLARE_TRACE();
100
101 ModuleLoader* fetch(const KURL&,
102 ScriptController*,
103 ResourceFetcher*,
104 ModuleLoader::Client*);
105
106 private:
107 ModuleLoaderRegistry() = default;
108
109 friend class ModuleLoader;
110 void releaseFinishedLoader(ModuleLoader*);
111
112 HeapHashSet<Member<ModuleLoader>> m_activeLoaders;
113 };
114
115 class ModuleMap : public GarbageCollected<ModuleMap> {
116 WTF_MAKE_NONCOPYABLE(ModuleMap);
117 class Entry;
118 class LoaderHost;
119
120 public:
121 class Client : public GarbageCollectedMixin {
122 private:
123 friend class ModuleMap::Entry;
dominicc (has gone to gerrit) 2016/12/19 10:07:51 Inline module scripts aren't entered into the map!
kouhei (in TOK) 2016/12/19 11:20:00 Ack. Let this be Modulator::Client after ModuleMap
124 virtual void notifyFinished(ScriptModule) = 0;
125 };
126
127 static ModuleMap* create(ScriptController* controller,
128 ResourceFetcher* fetcher) {
129 return new ModuleMap(controller, fetcher);
130 }
131 DECLARE_TRACE();
132
133 // https://html.spec.whatwg.org/#fetch-a-single-module-script
134 void fetchSingle(
135 const KURL&,
136 Client*
dominicc (has gone to gerrit) 2016/12/19 10:07:51 Yay. I guess we shouldn't just use a callback beca
kouhei (in TOK) 2016/12/19 11:20:00 Callback supports Oilpan, but via Persistent, whic
137 /*, a fetch client settings object, a destination, a cryptographic nonce, a parser state, a credentials mode, a module map settings object, a referrer, an d a top-level module fetch flag*/);
138
139 private:
140 ModuleMap(ScriptController*, ResourceFetcher*);
141 ModuleMap() = delete;
142
143 using MapImpl = HeapHashMap<KURL, Member<Entry>>;
144
145 // A module map is a map of absolute URLs to map entry.
146 MapImpl m_map;
147
148 // Below should be moved to the modulator.
149 Member<ScriptController> m_scriptController;
150 Member<ResourceFetcher> m_fetcher;
151 Member<ModuleLoaderRegistry> m_loaderRegistry;
152 };
153
154 } // namespace blink
155
156 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698