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

Side by Side Diff: third_party/WebKit/Source/core/dom/ScriptModuleResolverImplTest.cpp

Issue 2801073003: [local; kouhei 1][ES6 modules] Introduce ScriptModuleResolverImpl (Closed)
Patch Set: Created 3 years, 8 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/dom/ScriptModuleResolverImpl.h"
6
7 #include "bindings/core/v8/V8BindingForTesting.h"
8 #include "core/dom/ExceptionCode.h"
9 #include "core/dom/Modulator.h"
10 #include "core/dom/ModuleScript.h"
11 #include "core/testing/DummyModulator.h"
12 #include "platform/heap/Handle.h"
13 #include "platform/testing/TestingPlatformSupport.h"
14 #include "public/platform/Platform.h"
15 #include "testing/gtest/include/gtest/gtest.h"
16 #include "v8/include/v8.h"
17
18 namespace blink {
19
20 namespace {
21
22 class ScriptModuleResolverImplTestModulator final : public DummyModulator {
23 public:
24 ScriptModuleResolverImplTestModulator() {}
25 virtual ~ScriptModuleResolverImplTestModulator() {}
26
27 DECLARE_TRACE();
28
29 int getFetchedModuleScriptCalled() const {
30 return m_getFetchedModuleScriptCalled;
31 }
32 void setModuleScript(ModuleScript* moduleScript) {
33 m_moduleScript = moduleScript;
34 }
35 const KURL& fetchedUrl() const { return m_fetchedUrl; }
36
37 private:
38 // Implements Modulator:
39 ModuleScript* getFetchedModuleScript(const KURL&) override;
40
41 int m_getFetchedModuleScriptCalled = 0;
42 KURL m_fetchedUrl;
43 Member<ModuleScript> m_moduleScript;
44 };
45
46 DEFINE_TRACE(ScriptModuleResolverImplTestModulator) {
47 visitor->trace(m_moduleScript);
48 DummyModulator::trace(visitor);
49 }
50
51 ModuleScript* ScriptModuleResolverImplTestModulator::getFetchedModuleScript(
52 const KURL& url) {
53 m_getFetchedModuleScriptCalled++;
54 m_fetchedUrl = url;
55 return m_moduleScript.get();
56 }
57
58 ModuleScript* createReferrerModuleScript(V8TestingScope& scope) {
59 ScriptModule referrerRecord = ScriptModule::compile(
60 scope.isolate(), "import './target.js'; export const a = 42;",
61 "referrer.js", SharableCrossOrigin);
62 KURL referrerUrl(ParsedURLString, "https://example.com/referrer.js");
63 ModuleScript* referrerModuleScript =
64 ModuleScript::create(referrerRecord, referrerUrl, "", ParserInserted,
65 WebURLRequest::FetchCredentialsModeOmit);
66 // TODO(kouhei): moduleScript->setInstantiateSuccess(); once
67 // https://codereview.chromium.org/2782403002/ landed.
68 return referrerModuleScript;
69 }
70
71 ModuleScript* createTargetModuleScript(V8TestingScope& scope) {
72 ScriptModule record =
73 ScriptModule::compile(scope.isolate(), "export const pi = 3.14;",
74 "target.js", SharableCrossOrigin);
75 KURL url(ParsedURLString, "https://example.com/target.js");
76 ModuleScript* moduleScript = ModuleScript::create(
77 record, url, "", ParserInserted, WebURLRequest::FetchCredentialsModeOmit);
78 // TODO(kouhei): moduleScript->setInstantiateSuccess(); once
79 // https://codereview.chromium.org/2782403002/ landed.
80 return moduleScript;
81 }
82
83 } // namespace
84
85 class ScriptModuleResolverImplTest : public testing::Test {
86 public:
87 void SetUp() override;
88
89 ScriptModuleResolverImplTestModulator* modulator() {
90 return m_modulator.get();
91 }
92
93 protected:
94 ScopedTestingPlatformSupport<TestingPlatformSupportWithMockScheduler>
95 m_platform;
96 Persistent<ScriptModuleResolverImplTestModulator> m_modulator;
97 };
98
99 void ScriptModuleResolverImplTest::SetUp() {
100 m_platform->advanceClockSeconds(1.); // For non-zero DocumentParserTimings
101 m_modulator = new ScriptModuleResolverImplTestModulator();
102 }
103
104 TEST_F(ScriptModuleResolverImplTest, registerResolveSuccess) {
105 ScriptModuleResolverImpl* resolver =
106 ScriptModuleResolverImpl::create(modulator());
107 V8TestingScope scope;
108
109 ModuleScript* referrerModuleScript = createReferrerModuleScript(scope);
110 resolver->registerModuleScript(referrerModuleScript);
111
112 ModuleScript* targetModuleScript = createTargetModuleScript(scope);
113 modulator()->setModuleScript(targetModuleScript);
114
115 ScriptModule resolved = resolver->resolve(
116 "./target.js", referrerModuleScript->record(), scope.getExceptionState());
117 EXPECT_FALSE(scope.getExceptionState().hadException());
118 EXPECT_EQ(resolved, targetModuleScript->record());
119 EXPECT_EQ(1, m_modulator->getFetchedModuleScriptCalled());
120 EXPECT_EQ(m_modulator->fetchedUrl(), targetModuleScript->baseURL())
121 << "Unexpectedly fetched URL: " << m_modulator->fetchedUrl().getString();
122 }
123
124 TEST_F(ScriptModuleResolverImplTest, resolveInvalidModuleSpecifier) {
125 ScriptModuleResolverImpl* resolver =
126 ScriptModuleResolverImpl::create(modulator());
127 V8TestingScope scope;
128
129 ModuleScript* referrerModuleScript = createReferrerModuleScript(scope);
130 resolver->registerModuleScript(referrerModuleScript);
131
132 ModuleScript* targetModuleScript = createTargetModuleScript(scope);
133 modulator()->setModuleScript(targetModuleScript);
134
135 ScriptModule resolved = resolver->resolve(
136 "invalid", referrerModuleScript->record(), scope.getExceptionState());
137 EXPECT_TRUE(scope.getExceptionState().hadException());
138 EXPECT_EQ(V8TypeError, scope.getExceptionState().code());
139 EXPECT_TRUE(resolved.isNull());
140 EXPECT_EQ(0, m_modulator->getFetchedModuleScriptCalled());
141 }
142
143 TEST_F(ScriptModuleResolverImplTest, resolveLoadFailedModule) {
144 ScriptModuleResolverImpl* resolver =
145 ScriptModuleResolverImpl::create(modulator());
146 V8TestingScope scope;
147
148 ModuleScript* referrerModuleScript = createReferrerModuleScript(scope);
149 resolver->registerModuleScript(referrerModuleScript);
150
151 ModuleScript* targetModuleScript = createTargetModuleScript(scope);
152 // Set Modulator::getFetchedModuleScript to return nullptr, which represents
153 // that the target module failed to load.
154 modulator()->setModuleScript(nullptr);
155
156 ScriptModule resolved = resolver->resolve(
157 "./target.js", referrerModuleScript->record(), scope.getExceptionState());
158 EXPECT_TRUE(scope.getExceptionState().hadException());
159 EXPECT_EQ(V8TypeError, scope.getExceptionState().code());
160 EXPECT_TRUE(resolved.isNull());
161 EXPECT_EQ(1, m_modulator->getFetchedModuleScriptCalled());
162 EXPECT_EQ(m_modulator->fetchedUrl(), targetModuleScript->baseURL())
163 << "Unexpectedly fetched URL: " << m_modulator->fetchedUrl().getString();
164 }
165
166 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698