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

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

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

Powered by Google App Engine
This is Rietveld 408576698