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

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

Issue 2790473002: [ES6 modules] Introduce ScriptModuleResolverImpl (Closed)
Patch Set: exp 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 get_fetched_module_script_called_;
31 }
32 void SetModuleScript(ModuleScript* module_script) {
33 module_script_ = module_script;
34 }
35 const KURL& FetchedUrl() const { return fetched_url_; }
36
37 private:
38 // Implements Modulator:
39 ModuleScript* GetFetchedModuleScript(const KURL&) override;
40
41 int get_fetched_module_script_called_ = 0;
42 KURL fetched_url_;
43 Member<ModuleScript> module_script_;
44 };
45
46 DEFINE_TRACE(ScriptModuleResolverImplTestModulator) {
47 visitor->Trace(module_script_);
48 DummyModulator::Trace(visitor);
49 }
50
51 ModuleScript* ScriptModuleResolverImplTestModulator::GetFetchedModuleScript(
52 const KURL& url) {
53 get_fetched_module_script_called_++;
54 fetched_url_ = url;
55 return module_script_.Get();
56 }
57
58 ModuleScript* CreateReferrerModuleScript(V8TestingScope& scope) {
59 ScriptModule referrer_record = ScriptModule::Compile(
60 scope.GetIsolate(), "import './target.js'; export const a = 42;",
61 "referrer.js", kSharableCrossOrigin);
62 KURL referrer_url(kParsedURLString, "https://example.com/referrer.js");
63 ModuleScript* referrer_module_script =
64 ModuleScript::Create(referrer_record, referrer_url, "", kParserInserted,
65 WebURLRequest::kFetchCredentialsModeOmit);
66 // TODO(kouhei): moduleScript->setInstantiateSuccess(); once
67 // https://codereview.chromium.org/2782403002/ landed.
68 return referrer_module_script;
69 }
70
71 ModuleScript* CreateTargetModuleScript(V8TestingScope& scope) {
72 ScriptModule record =
73 ScriptModule::Compile(scope.GetIsolate(), "export const pi = 3.14;",
74 "target.js", kSharableCrossOrigin);
75 KURL url(kParsedURLString, "https://example.com/target.js");
76 ModuleScript* module_script =
77 ModuleScript::Create(record, url, "", kParserInserted,
78 WebURLRequest::kFetchCredentialsModeOmit);
79 // TODO(kouhei): moduleScript->setInstantiateSuccess(); once
80 // https://codereview.chromium.org/2782403002/ landed.
81 return module_script;
82 }
83
84 } // namespace
85
86 class ScriptModuleResolverImplTest : public testing::Test {
87 public:
88 void SetUp() override;
89
90 ScriptModuleResolverImplTestModulator* Modulator() {
91 return modulator_.Get();
92 }
93
94 protected:
95 ScopedTestingPlatformSupport<TestingPlatformSupportWithMockScheduler>
96 platform_;
97 Persistent<ScriptModuleResolverImplTestModulator> modulator_;
98 };
99
100 void ScriptModuleResolverImplTest::SetUp() {
101 platform_->AdvanceClockSeconds(1.); // For non-zero DocumentParserTimings
102 modulator_ = new ScriptModuleResolverImplTestModulator();
103 }
104
105 TEST_F(ScriptModuleResolverImplTest, registerResolveSuccess) {
106 ScriptModuleResolverImpl* resolver =
107 ScriptModuleResolverImpl::Create(Modulator());
108 V8TestingScope scope;
109
110 ModuleScript* referrer_module_script = CreateReferrerModuleScript(scope);
111 resolver->RegisterModuleScript(referrer_module_script);
112
113 ModuleScript* target_module_script = CreateTargetModuleScript(scope);
114 Modulator()->SetModuleScript(target_module_script);
115
116 ScriptModule resolved =
117 resolver->Resolve("./target.js", referrer_module_script->Record(),
118 scope.GetExceptionState());
119 EXPECT_FALSE(scope.GetExceptionState().HadException());
120 EXPECT_EQ(resolved, target_module_script->Record());
121 EXPECT_EQ(1, modulator_->GetFetchedModuleScriptCalled());
122 EXPECT_EQ(modulator_->FetchedUrl(), target_module_script->BaseURL())
123 << "Unexpectedly fetched URL: " << modulator_->FetchedUrl().GetString();
124 }
125
126 TEST_F(ScriptModuleResolverImplTest, resolveInvalidModuleSpecifier) {
127 ScriptModuleResolverImpl* resolver =
128 ScriptModuleResolverImpl::Create(Modulator());
129 V8TestingScope scope;
130
131 ModuleScript* referrer_module_script = CreateReferrerModuleScript(scope);
132 resolver->RegisterModuleScript(referrer_module_script);
133
134 ModuleScript* target_module_script = CreateTargetModuleScript(scope);
135 Modulator()->SetModuleScript(target_module_script);
136
137 ScriptModule resolved = resolver->Resolve(
138 "invalid", referrer_module_script->Record(), scope.GetExceptionState());
139 EXPECT_TRUE(scope.GetExceptionState().HadException());
140 EXPECT_EQ(kV8TypeError, scope.GetExceptionState().Code());
141 EXPECT_TRUE(resolved.IsNull());
142 EXPECT_EQ(0, modulator_->GetFetchedModuleScriptCalled());
143 }
144
145 TEST_F(ScriptModuleResolverImplTest, resolveLoadFailedModule) {
146 ScriptModuleResolverImpl* resolver =
147 ScriptModuleResolverImpl::Create(Modulator());
148 V8TestingScope scope;
149
150 ModuleScript* referrer_module_script = CreateReferrerModuleScript(scope);
151 resolver->RegisterModuleScript(referrer_module_script);
152
153 ModuleScript* target_module_script = CreateTargetModuleScript(scope);
154 // Set Modulator::getFetchedModuleScript to return nullptr, which represents
155 // that the target module failed to load.
156 Modulator()->SetModuleScript(nullptr);
157
158 ScriptModule resolved =
159 resolver->Resolve("./target.js", referrer_module_script->Record(),
160 scope.GetExceptionState());
161 EXPECT_TRUE(scope.GetExceptionState().HadException());
162 EXPECT_EQ(kV8TypeError, scope.GetExceptionState().Code());
163 EXPECT_TRUE(resolved.IsNull());
164 EXPECT_EQ(1, modulator_->GetFetchedModuleScriptCalled());
165 EXPECT_EQ(modulator_->FetchedUrl(), target_module_script->BaseURL())
166 << "Unexpectedly fetched URL: " << modulator_->FetchedUrl().GetString();
167 }
168
169 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698