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

Side by Side Diff: third_party/WebKit/Source/core/loader/modulescript/ModuleScriptLoaderTest.cpp

Issue 2697073002: [ES6 modules] Introduce ModuleScriptLoader (Closed)
Patch Set: yhirano Created 3 years, 9 months 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 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 #include "core/loader/modulescript/ModuleScriptLoader.h"
6
7 #include "core/dom/Document.h"
8 #include "core/dom/Modulator.h"
9 #include "core/dom/ModuleScript.h"
10 #include "core/loader/modulescript/ModuleScriptFetchRequest.h"
11 #include "core/loader/modulescript/ModuleScriptLoaderClient.h"
12 #include "core/loader/modulescript/ModuleScriptLoaderRegistry.h"
13 #include "core/testing/DummyModulator.h"
14 #include "core/testing/DummyPageHolder.h"
15 #include "platform/heap/Handle.h"
16 #include "platform/loader/fetch/ResourceFetcher.h"
17 #include "platform/loader/testing/FetchTestingPlatformSupport.h"
18 #include "platform/loader/testing/MockFetchContext.h"
19 #include "platform/testing/URLTestHelpers.h"
20 #include "platform/testing/UnitTestHelpers.h"
21 #include "public/platform/Platform.h"
22 #include "public/platform/WebURLLoaderMockFactory.h"
23 #include "testing/gtest/include/gtest/gtest.h"
24
25 namespace blink {
26
27 namespace {
28
29 class TestModuleScriptLoaderClient final
30 : public GarbageCollectedFinalized<TestModuleScriptLoaderClient>,
31 public ModuleScriptLoaderClient {
32 USING_GARBAGE_COLLECTED_MIXIN(TestModuleScriptLoaderClient);
33
34 public:
35 TestModuleScriptLoaderClient() = default;
36 ~TestModuleScriptLoaderClient() override {}
37
38 DEFINE_INLINE_TRACE() { visitor->trace(m_moduleScript); }
39
40 void notifyNewSingleModuleFinished(ModuleScript* moduleScript) override {
41 m_wasNotifyFinished = true;
42 m_moduleScript = moduleScript;
43 }
44
45 bool wasNotifyFinished() const { return m_wasNotifyFinished; }
46 ModuleScript* moduleScript() { return m_moduleScript; }
47
48 private:
49 bool m_wasNotifyFinished = false;
50 Member<ModuleScript> m_moduleScript;
51 };
52
53 class ModuleScriptLoaderTestModulator final : public DummyModulator {
54 public:
55 ModuleScriptLoaderTestModulator(RefPtr<ScriptState> scriptState,
56 RefPtr<SecurityOrigin> securityOrigin)
57 : m_scriptState(std::move(scriptState)),
58 m_securityOrigin(std::move(securityOrigin)) {}
59
60 ~ModuleScriptLoaderTestModulator() override {}
61
62 SecurityOrigin* securityOrigin() override { return m_securityOrigin.get(); }
63
64 ScriptModule compileModule(const String& script,
65 const String& urlStr) override {
66 ScriptState::Scope scope(m_scriptState.get());
67 return ScriptModule::compile(m_scriptState->isolate(),
68 "export default 'foo';", "");
69 }
70
71 DECLARE_TRACE();
72
73 private:
74 RefPtr<ScriptState> m_scriptState;
75 RefPtr<SecurityOrigin> m_securityOrigin;
76 };
77
78 DEFINE_TRACE(ModuleScriptLoaderTestModulator) {
79 DummyModulator::trace(visitor);
80 }
81
82 } // namespace
83
84 class ModuleScriptLoaderTest : public ::testing::Test {
85 DISALLOW_COPY_AND_ASSIGN(ModuleScriptLoaderTest);
86
87 public:
88 ModuleScriptLoaderTest() = default;
89 void SetUp() override;
90
91 LocalFrame& frame() { return m_dummyPageHolder->frame(); }
92 Document& document() { return m_dummyPageHolder->document(); }
93 ResourceFetcher* fetcher() { return m_fetcher.get(); }
94 Modulator* modulator() { return m_modulator.get(); }
95
96 protected:
97 ScopedTestingPlatformSupport<FetchTestingPlatformSupport> m_platform;
98 std::unique_ptr<DummyPageHolder> m_dummyPageHolder;
99 Persistent<ResourceFetcher> m_fetcher;
100 Persistent<Modulator> m_modulator;
101 };
102
103 void ModuleScriptLoaderTest::SetUp() {
104 m_platform->advanceClockSeconds(1.); // For non-zero DocumentParserTimings
105 m_dummyPageHolder = DummyPageHolder::create(IntSize(500, 500));
106 document().setURL(KURL(KURL(), "https://example.test"));
107 m_fetcher = ResourceFetcher::create(
108 MockFetchContext::create(MockFetchContext::kShouldLoadNewResource));
109 m_modulator = new ModuleScriptLoaderTestModulator(
110 ScriptState::forMainWorld(&frame()), document().getSecurityOrigin());
111 }
112
113 TEST_F(ModuleScriptLoaderTest, fetchDataURL) {
114 ModuleScriptLoaderRegistry* registry = ModuleScriptLoaderRegistry::create();
115 KURL url(KURL(), "data:text/javascript,export default 'grapes';");
116 ModuleScriptFetchRequest moduleRequest(
117 url, String(), ParserInserted, WebURLRequest::FetchCredentialsModeOmit);
118 TestModuleScriptLoaderClient* client = new TestModuleScriptLoaderClient;
119 registry->fetch(moduleRequest, ModuleGraphLevel::TopLevelModuleFetch,
120 modulator(), fetcher(), client);
121
122 EXPECT_TRUE(client->wasNotifyFinished())
123 << "ModuleScriptLoader should finish synchronously.";
124 EXPECT_TRUE(client->moduleScript());
125 EXPECT_EQ(client->moduleScript()->instantiationState(),
126 ModuleInstantiationState::Uninstantiated);
127 }
128
129 TEST_F(ModuleScriptLoaderTest, fetchInvalidURL) {
130 ModuleScriptLoaderRegistry* registry = ModuleScriptLoaderRegistry::create();
131 KURL url;
132 EXPECT_FALSE(url.isValid());
133 ModuleScriptFetchRequest moduleRequest(
134 url, String(), ParserInserted, WebURLRequest::FetchCredentialsModeOmit);
135 TestModuleScriptLoaderClient* client = new TestModuleScriptLoaderClient;
136 registry->fetch(moduleRequest, ModuleGraphLevel::TopLevelModuleFetch,
137 modulator(), fetcher(), client);
138
139 EXPECT_TRUE(client->wasNotifyFinished())
140 << "ModuleScriptLoader should finish synchronously.";
141 EXPECT_FALSE(client->moduleScript());
142 }
143
144 TEST_F(ModuleScriptLoaderTest, fetchURL) {
145 KURL url(ParsedURLString, "http://127.0.0.1:8000/module.js");
146 URLTestHelpers::registerMockedURLLoad(
147 url, testing::platformTestDataPath("module.js"), "text/javascript");
148
149 ModuleScriptLoaderRegistry* registry = ModuleScriptLoaderRegistry::create();
150 ModuleScriptFetchRequest moduleRequest(
151 url, String(), ParserInserted, WebURLRequest::FetchCredentialsModeOmit);
152 TestModuleScriptLoaderClient* client = new TestModuleScriptLoaderClient;
153 registry->fetch(moduleRequest, ModuleGraphLevel::TopLevelModuleFetch,
154 modulator(), fetcher(), client);
155
156 EXPECT_FALSE(client->wasNotifyFinished())
157 << "ModuleScriptLoader unexpectedly finished synchronously.";
158 m_platform->getURLLoaderMockFactory()->serveAsynchronousRequests();
159 m_platform->runUntilIdle();
kinuko 2017/03/17 04:18:26 drive-by nit, you don't need this (serveAsyncReq i
kouhei (in TOK) 2017/03/23 00:34:01 Done.
160
161 EXPECT_TRUE(client->wasNotifyFinished());
162 EXPECT_FALSE(client->moduleScript());
163 }
164
165 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698