Chromium Code Reviews| Index: third_party/WebKit/Source/core/dom/ScriptModuleResolverImplTest.cpp | 
| diff --git a/third_party/WebKit/Source/core/dom/ScriptModuleResolverImplTest.cpp b/third_party/WebKit/Source/core/dom/ScriptModuleResolverImplTest.cpp | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..cf3c942b1b38cd5816b6425ab8ce4f850792a547 | 
| --- /dev/null | 
| +++ b/third_party/WebKit/Source/core/dom/ScriptModuleResolverImplTest.cpp | 
| @@ -0,0 +1,161 @@ | 
| +// Copyright 2017 The Chromium Authors. All rights reserved. | 
| +// Use of this source code is governed by a BSD-style license that can be | 
| +// found in the LICENSE file. | 
| + | 
| +#include "core/dom/ScriptModuleResolverImpl.h" | 
| + | 
| +#include "bindings/core/v8/V8BindingForTesting.h" | 
| +#include "core/dom/ExceptionCode.h" | 
| +#include "core/dom/Modulator.h" | 
| +#include "core/dom/ModuleScript.h" | 
| +#include "core/testing/DummyModulator.h" | 
| +#include "platform/heap/Handle.h" | 
| +#include "platform/testing/TestingPlatformSupport.h" | 
| +#include "public/platform/Platform.h" | 
| +#include "testing/gtest/include/gtest/gtest.h" | 
| +#include "v8/include/v8.h" | 
| + | 
| +namespace blink { | 
| + | 
| +class ScriptModuleResolverImplTestModulator final : public DummyModulator { | 
| + public: | 
| + ScriptModuleResolverImplTestModulator() {} | 
| + virtual ~ScriptModuleResolverImplTestModulator() {} | 
| + | 
| + DECLARE_TRACE(); | 
| + | 
| + int getFetchedModuleScriptCalled() const { | 
| + return m_getFetchedModuleScriptCalled; | 
| + } | 
| + void setModuleScript(ModuleScript* moduleScript) { | 
| + m_moduleScript = moduleScript; | 
| + } | 
| + const KURL& fetchedUrl() const { return m_fetchedUrl; } | 
| + | 
| + private: | 
| + // Implements Modulator: | 
| + ModuleScript* getFetchedModuleScript(const KURL&) override; | 
| + | 
| + int m_getFetchedModuleScriptCalled = 0; | 
| + KURL m_fetchedUrl; | 
| + Member<ModuleScript> m_moduleScript; | 
| +}; | 
| + | 
| +DEFINE_TRACE(ScriptModuleResolverImplTestModulator) { | 
| + visitor->trace(m_moduleScript); | 
| + DummyModulator::trace(visitor); | 
| +} | 
| + | 
| +ModuleScript* ScriptModuleResolverImplTestModulator::getFetchedModuleScript( | 
| + const KURL& url) { | 
| + m_getFetchedModuleScriptCalled++; | 
| + m_fetchedUrl = url; | 
| + return m_moduleScript.get(); | 
| +} | 
| + | 
| +class ScriptModuleResolverImplTest : public testing::Test { | 
| + public: | 
| + void SetUp() override; | 
| + | 
| + ScriptModuleResolverImplTestModulator* modulator() { | 
| + return m_modulator.get(); | 
| + } | 
| + | 
| + protected: | 
| + ScopedTestingPlatformSupport<TestingPlatformSupportWithMockScheduler> | 
| + m_platform; | 
| + Persistent<ScriptModuleResolverImplTestModulator> m_modulator; | 
| +}; | 
| + | 
| +void ScriptModuleResolverImplTest::SetUp() { | 
| + m_platform->advanceClockSeconds(1.); // For non-zero DocumentParserTimings | 
| + m_modulator = new ScriptModuleResolverImplTestModulator(); | 
| +} | 
| + | 
| +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.
 
 | 
| + ScriptModule referrerRecord = ScriptModule::compile( | 
| + scope.isolate(), "import './target.js'; export const a = 42;", | 
| + "referrer.js"); | 
| + 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.
 
 | 
| + ModuleScript* referrerModuleScript = | 
| + ModuleScript::create(referrerRecord, referrerUrl, "", ParserInserted, | 
| + WebURLRequest::FetchCredentialsModeOmit); | 
| + // TODO(kouhei): moduleScript->setInstantiateSuccess(); once | 
| + // https://codereview.chromium.org/2782403002/ landed. | 
| + return referrerModuleScript; | 
| +} | 
| + | 
| +ModuleScript* createTargetModuleScript(V8TestingScope& scope) { | 
| 
 
yhirano
2017/04/06 05:30:21
ditto
 
kouhei (in TOK)
2017/04/06 05:34:18
Done.
 
 | 
| + ScriptModule record = ScriptModule::compile( | 
| + scope.isolate(), "export const pi = 3.14;", "target.js"); | 
| + KURL url(KURL(), "https://example.com/target.js"); | 
| + ModuleScript* moduleScript = ModuleScript::create( | 
| + record, url, "", ParserInserted, WebURLRequest::FetchCredentialsModeOmit); | 
| + // TODO(kouhei): moduleScript->setInstantiateSuccess(); once | 
| + // https://codereview.chromium.org/2782403002/ landed. | 
| + return moduleScript; | 
| +} | 
| + | 
| +TEST_F(ScriptModuleResolverImplTest, registerResolveSuccess) { | 
| + ScriptModuleResolverImpl* resolver = | 
| + ScriptModuleResolverImpl::create(modulator()); | 
| + V8TestingScope scope; | 
| + | 
| + ModuleScript* referrerModuleScript = createReferrerModuleScript(scope); | 
| + resolver->registerModuleScript(referrerModuleScript); | 
| + | 
| + ModuleScript* targetModuleScript = createTargetModuleScript(scope); | 
| + modulator()->setModuleScript(targetModuleScript); | 
| + | 
| + ScriptModule resolved = resolver->resolve( | 
| + "./target.js", referrerModuleScript->record(), scope.getExceptionState()); | 
| + EXPECT_FALSE(scope.getExceptionState().hadException()); | 
| + EXPECT_EQ(resolved, targetModuleScript->record()); | 
| + EXPECT_EQ(m_modulator->getFetchedModuleScriptCalled(), 1); | 
| + EXPECT_EQ(m_modulator->fetchedUrl(), targetModuleScript->baseURL()) | 
| + << "Unexpectedly fetched URL: " << m_modulator->fetchedUrl().getString(); | 
| +} | 
| + | 
| +TEST_F(ScriptModuleResolverImplTest, resolveInvalidModuleSpecifier) { | 
| + ScriptModuleResolverImpl* resolver = | 
| + ScriptModuleResolverImpl::create(modulator()); | 
| + V8TestingScope scope; | 
| + | 
| + ModuleScript* referrerModuleScript = createReferrerModuleScript(scope); | 
| + resolver->registerModuleScript(referrerModuleScript); | 
| + | 
| + ModuleScript* targetModuleScript = createTargetModuleScript(scope); | 
| + modulator()->setModuleScript(targetModuleScript); | 
| + | 
| + ScriptModule resolved = resolver->resolve( | 
| + "invalid", referrerModuleScript->record(), scope.getExceptionState()); | 
| + EXPECT_TRUE(scope.getExceptionState().hadException()); | 
| + EXPECT_EQ(scope.getExceptionState().code(), V8TypeError); | 
| + EXPECT_TRUE(resolved.isNull()); | 
| + 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.
 
 | 
| +} | 
| + | 
| +TEST_F(ScriptModuleResolverImplTest, resolveLoadFailedModule) { | 
| + ScriptModuleResolverImpl* resolver = | 
| + ScriptModuleResolverImpl::create(modulator()); | 
| + V8TestingScope scope; | 
| + | 
| + ModuleScript* referrerModuleScript = createReferrerModuleScript(scope); | 
| + resolver->registerModuleScript(referrerModuleScript); | 
| + | 
| + ModuleScript* targetModuleScript = createTargetModuleScript(scope); | 
| + // Set Modulator::getFetchedModuleScript to return nullptr, which represents | 
| + // that the target module failed to load. | 
| + modulator()->setModuleScript(nullptr); | 
| + | 
| + ScriptModule resolved = resolver->resolve( | 
| + "./target.js", referrerModuleScript->record(), scope.getExceptionState()); | 
| + EXPECT_TRUE(scope.getExceptionState().hadException()); | 
| + EXPECT_EQ(scope.getExceptionState().code(), V8TypeError); | 
| + EXPECT_TRUE(resolved.isNull()); | 
| + EXPECT_EQ(m_modulator->getFetchedModuleScriptCalled(), 1); | 
| + EXPECT_EQ(m_modulator->fetchedUrl(), targetModuleScript->baseURL()) | 
| + << "Unexpectedly fetched URL: " << m_modulator->fetchedUrl().getString(); | 
| +} | 
| + | 
| +} // namespace blink |