Chromium Code Reviews| 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 |