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 |