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

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

Issue 2697073002: [ES6 modules] Introduce ModuleScriptLoader (Closed)
Patch Set: rebased 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;
yhirano 2017/02/28 11:30:11 Can you tell me why this is needed?
kouhei (in TOK) 2017/03/06 02:10:09 To use WebURLLoaderMockFactoryImpl
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 unexpectedly finished asynchronously.";
124 m_platform->runUntilIdle();
yhirano 2017/02/28 11:30:11 Why do we need this runUntilIdle?
kouhei (in TOK) 2017/03/06 02:10:09 Done.
125
126 EXPECT_TRUE(client->wasNotifyFinished());
127 EXPECT_TRUE(client->moduleScript());
128 EXPECT_EQ(client->moduleScript()->instantiationState(),
129 ModuleInstantiationState::Uninstantiated);
130 }
131
132 TEST_F(ModuleScriptLoaderTest, fetchInvalidURL) {
133 ModuleScriptLoaderRegistry* registry = ModuleScriptLoaderRegistry::create();
134 KURL url;
135 EXPECT_FALSE(url.isValid());
136 ModuleScriptFetchRequest moduleRequest(
137 url, String(), ParserInserted, WebURLRequest::FetchCredentialsModeOmit);
138 TestModuleScriptLoaderClient* client = new TestModuleScriptLoaderClient;
139 registry->fetch(moduleRequest, ModuleGraphLevel::TopLevelModuleFetch,
140 modulator(), fetcher(), client);
141
142 EXPECT_TRUE(client->wasNotifyFinished())
143 << "ModuleScriptLoader unexpectedly finished asynchronously.";
144 m_platform->runUntilIdle();
yhirano 2017/02/28 11:30:11 ditto
kouhei (in TOK) 2017/03/06 02:10:09 Done.
145
146 EXPECT_TRUE(client->wasNotifyFinished());
147 EXPECT_FALSE(client->moduleScript());
148 }
149
150 TEST_F(ModuleScriptLoaderTest, fetchURL) {
151 KURL url(ParsedURLString, "http://127.0.0.1:8000/module.js");
152 URLTestHelpers::registerMockedURLLoad(
153 url, testing::platformTestDataPath("module.js"), "text/javascript");
154
155 ModuleScriptLoaderRegistry* registry = ModuleScriptLoaderRegistry::create();
156 ModuleScriptFetchRequest moduleRequest(
157 url, String(), ParserInserted, WebURLRequest::FetchCredentialsModeOmit);
158 TestModuleScriptLoaderClient* client = new TestModuleScriptLoaderClient;
159 registry->fetch(moduleRequest, ModuleGraphLevel::TopLevelModuleFetch,
160 modulator(), fetcher(), client);
161
162 EXPECT_FALSE(client->wasNotifyFinished())
163 << "ModuleScriptLoader unexpectedly finished synchronously.";
164 m_platform->getURLLoaderMockFactory()->serveAsynchronousRequests();
165 m_platform->runUntilIdle();
166
167 EXPECT_TRUE(client->wasNotifyFinished());
168 EXPECT_FALSE(client->moduleScript());
169 }
170
171 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698