OLD | NEW |
---|---|
(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 | |
OLD | NEW |