| 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..3d2596c871ff88ee4042dedfcfbf29875babe6f9
|
| --- /dev/null
|
| +++ b/third_party/WebKit/Source/core/dom/ScriptModuleResolverImplTest.cpp
|
| @@ -0,0 +1,166 @@
|
| +// 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 {
|
| +
|
| +namespace {
|
| +
|
| +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();
|
| +}
|
| +
|
| +ModuleScript* createReferrerModuleScript(V8TestingScope& scope) {
|
| + ScriptModule referrerRecord = ScriptModule::compile(
|
| + scope.isolate(), "import './target.js'; export const a = 42;",
|
| + "referrer.js", SharableCrossOrigin);
|
| + KURL referrerUrl(ParsedURLString, "https://example.com/referrer.js");
|
| + 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) {
|
| + ScriptModule record =
|
| + ScriptModule::compile(scope.isolate(), "export const pi = 3.14;",
|
| + "target.js", SharableCrossOrigin);
|
| + KURL url(ParsedURLString, "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;
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +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();
|
| +}
|
| +
|
| +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(1, m_modulator->getFetchedModuleScriptCalled());
|
| + 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(V8TypeError, scope.getExceptionState().code());
|
| + EXPECT_TRUE(resolved.isNull());
|
| + EXPECT_EQ(0, m_modulator->getFetchedModuleScriptCalled());
|
| +}
|
| +
|
| +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(V8TypeError, scope.getExceptionState().code());
|
| + EXPECT_TRUE(resolved.isNull());
|
| + EXPECT_EQ(1, m_modulator->getFetchedModuleScriptCalled());
|
| + EXPECT_EQ(m_modulator->fetchedUrl(), targetModuleScript->baseURL())
|
| + << "Unexpectedly fetched URL: " << m_modulator->fetchedUrl().getString();
|
| +}
|
| +
|
| +} // namespace blink
|
|
|