Index: third_party/WebKit/Source/core/dom/ModuleMap.cpp |
diff --git a/third_party/WebKit/Source/core/dom/ModuleMap.cpp b/third_party/WebKit/Source/core/dom/ModuleMap.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..8bd17f64f30b695b60c68d05728707f8a9a1ba60 |
--- /dev/null |
+++ b/third_party/WebKit/Source/core/dom/ModuleMap.cpp |
@@ -0,0 +1,83 @@ |
+// Copyright 2016 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "core/dom/ModuleMap.h" |
+#include "core/fetch/ResourceFetcher.h" |
+#include "core/loader/resource/ScriptResource.h" |
+ |
+namespace blink { |
+ |
+ModuleMap::ModuleMap(ResourceFetcher* fetcher) |
+ : m_fetcher(fetcher) |
+{ |
+ DCHECK(m_fetcher); |
+} |
+ |
+void ModuleMap::fetch(const KURL& url) { |
+ printf("ModuleMap::fetch(%s)\n", url.getString().utf8().data()); |
+ |
+ MapImpl::AddResult result = m_map.set(url, Entry()); |
+ Entry& entry = result.storedValue->value; |
+ if (!result.isNewEntry) { |
+ printf("not new entry\n"); |
+ // FIXME: If moduleMap[url] is "fetching", wait (in parallel) until that |
+ // entry's value changes, then proceed to the next step. |
+ if (entry.isFetching()) { |
+ // return promise? |
+ } |
+ // FIXME: If moduleMap[url] exists, asynchronously complete this algorithm |
+ // with moduleMap[url], and abort these steps. |
+ return; |
+ } |
+ |
+ // Step 4. Set moduleMap[url] to "fetching". => Initial entry state is |
+ // fetching |
+ |
+ // Step 5. Let request be a new request whose url is url, destination is |
+ // destination, type is "script", mode is "cors", credentials mode is |
+ // credentials mode, cryptographic nonce metadata is cryptographic nonce, |
+ // parser metadata is parser state, referrer is referrer, and client is fetch |
+ // client settings object. |
+ FetchRequest request(ResourceRequest(url), "module"); |
+ // request.setDefer(FetchRequest::LazyLoad); //? always async -> defer? |
+ Member<ScriptResource> resource = ScriptResource::fetch(request, m_fetcher.get()); |
+ resource->script(); |
+ |
+ // Step 6. If the caller specified custom steps to perform the fetch, perform |
+ // them on request, setting the is top-level flag if the top-level module |
+ // fetch flag is set. Return from this algorithm, and when the custom perform |
+ // the fetch steps complete with response response, run the remaining steps. |
+ // Otherwise, fetch request. Return from this algorithm, and run the remaining |
+ // steps as part of the fetch's process response for the response response. |
+ // Note: response is always CORS-same-origin. |
+ |
+ // TODO(kouhei): yokuwakaran |
+ |
+ // Step 7. If any of the following conditions are met, set moduleMap[url] to |
+ // null, asynchronously complete this algorithm with null, and abort these |
+ // steps: |
+ // - response's type is "error" |
+ // - response's status is not an ok status |
+ // The result of extracting a MIME type from response's header list (ignoring |
+ // parameters) is not a JavaScript MIME type |
+ // Note: For historical reasons, fetching a classic script does not include |
+ // MIME type checking. In contrast, module scripts will fail to load if they |
+ // are not of a correct MIME type. |
+ |
+ // Step 8. Let source text be the result of UTF-8 decoding response's body. |
+ |
+ // Step 9. Let module script be the result of creating a module script given |
+ // source text, module map settings object, response's url, cryptographic |
+ // nonce, parser state, and credentials mode. |
+ |
+ // Step 10. Set moduleMap[url] to module script, and asynchronously complete |
+ // this algorithm with module script. |
+} |
+ |
+DEFINE_TRACE(ModuleMap) { |
+ visitor->trace(m_map); |
+ visitor->trace(m_fetcher); |
+} |
+ |
+} // namespace blink |