| 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..a04d97f519f82f9b5040c8cae89bf4d6f7a19730
|
| --- /dev/null
|
| +++ b/third_party/WebKit/Source/core/dom/ScriptModuleResolverImplTest.cpp
|
| @@ -0,0 +1,169 @@
|
| +// 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 get_fetched_module_script_called_;
|
| + }
|
| + void SetModuleScript(ModuleScript* module_script) {
|
| + module_script_ = module_script;
|
| + }
|
| + const KURL& FetchedUrl() const { return fetched_url_; }
|
| +
|
| + private:
|
| + // Implements Modulator:
|
| + ModuleScript* GetFetchedModuleScript(const KURL&) override;
|
| +
|
| + int get_fetched_module_script_called_ = 0;
|
| + KURL fetched_url_;
|
| + Member<ModuleScript> module_script_;
|
| +};
|
| +
|
| +DEFINE_TRACE(ScriptModuleResolverImplTestModulator) {
|
| + visitor->Trace(module_script_);
|
| + DummyModulator::Trace(visitor);
|
| +}
|
| +
|
| +ModuleScript* ScriptModuleResolverImplTestModulator::GetFetchedModuleScript(
|
| + const KURL& url) {
|
| + get_fetched_module_script_called_++;
|
| + fetched_url_ = url;
|
| + return module_script_.Get();
|
| +}
|
| +
|
| +ModuleScript* CreateReferrerModuleScript(V8TestingScope& scope) {
|
| + ScriptModule referrer_record = ScriptModule::Compile(
|
| + scope.GetIsolate(), "import './target.js'; export const a = 42;",
|
| + "referrer.js", kSharableCrossOrigin);
|
| + KURL referrer_url(kParsedURLString, "https://example.com/referrer.js");
|
| + ModuleScript* referrer_module_script =
|
| + ModuleScript::Create(referrer_record, referrer_url, "", kParserInserted,
|
| + WebURLRequest::kFetchCredentialsModeOmit);
|
| + // TODO(kouhei): moduleScript->setInstantiateSuccess(); once
|
| + // https://codereview.chromium.org/2782403002/ landed.
|
| + return referrer_module_script;
|
| +}
|
| +
|
| +ModuleScript* CreateTargetModuleScript(V8TestingScope& scope) {
|
| + ScriptModule record =
|
| + ScriptModule::Compile(scope.GetIsolate(), "export const pi = 3.14;",
|
| + "target.js", kSharableCrossOrigin);
|
| + KURL url(kParsedURLString, "https://example.com/target.js");
|
| + ModuleScript* module_script =
|
| + ModuleScript::Create(record, url, "", kParserInserted,
|
| + WebURLRequest::kFetchCredentialsModeOmit);
|
| + // TODO(kouhei): moduleScript->setInstantiateSuccess(); once
|
| + // https://codereview.chromium.org/2782403002/ landed.
|
| + return module_script;
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +class ScriptModuleResolverImplTest : public testing::Test {
|
| + public:
|
| + void SetUp() override;
|
| +
|
| + ScriptModuleResolverImplTestModulator* Modulator() {
|
| + return modulator_.Get();
|
| + }
|
| +
|
| + protected:
|
| + ScopedTestingPlatformSupport<TestingPlatformSupportWithMockScheduler>
|
| + platform_;
|
| + Persistent<ScriptModuleResolverImplTestModulator> modulator_;
|
| +};
|
| +
|
| +void ScriptModuleResolverImplTest::SetUp() {
|
| + platform_->AdvanceClockSeconds(1.); // For non-zero DocumentParserTimings
|
| + modulator_ = new ScriptModuleResolverImplTestModulator();
|
| +}
|
| +
|
| +TEST_F(ScriptModuleResolverImplTest, registerResolveSuccess) {
|
| + ScriptModuleResolverImpl* resolver =
|
| + ScriptModuleResolverImpl::Create(Modulator());
|
| + V8TestingScope scope;
|
| +
|
| + ModuleScript* referrer_module_script = CreateReferrerModuleScript(scope);
|
| + resolver->RegisterModuleScript(referrer_module_script);
|
| +
|
| + ModuleScript* target_module_script = CreateTargetModuleScript(scope);
|
| + Modulator()->SetModuleScript(target_module_script);
|
| +
|
| + ScriptModule resolved =
|
| + resolver->Resolve("./target.js", referrer_module_script->Record(),
|
| + scope.GetExceptionState());
|
| + EXPECT_FALSE(scope.GetExceptionState().HadException());
|
| + EXPECT_EQ(resolved, target_module_script->Record());
|
| + EXPECT_EQ(1, modulator_->GetFetchedModuleScriptCalled());
|
| + EXPECT_EQ(modulator_->FetchedUrl(), target_module_script->BaseURL())
|
| + << "Unexpectedly fetched URL: " << modulator_->FetchedUrl().GetString();
|
| +}
|
| +
|
| +TEST_F(ScriptModuleResolverImplTest, resolveInvalidModuleSpecifier) {
|
| + ScriptModuleResolverImpl* resolver =
|
| + ScriptModuleResolverImpl::Create(Modulator());
|
| + V8TestingScope scope;
|
| +
|
| + ModuleScript* referrer_module_script = CreateReferrerModuleScript(scope);
|
| + resolver->RegisterModuleScript(referrer_module_script);
|
| +
|
| + ModuleScript* target_module_script = CreateTargetModuleScript(scope);
|
| + Modulator()->SetModuleScript(target_module_script);
|
| +
|
| + ScriptModule resolved = resolver->Resolve(
|
| + "invalid", referrer_module_script->Record(), scope.GetExceptionState());
|
| + EXPECT_TRUE(scope.GetExceptionState().HadException());
|
| + EXPECT_EQ(kV8TypeError, scope.GetExceptionState().Code());
|
| + EXPECT_TRUE(resolved.IsNull());
|
| + EXPECT_EQ(0, modulator_->GetFetchedModuleScriptCalled());
|
| +}
|
| +
|
| +TEST_F(ScriptModuleResolverImplTest, resolveLoadFailedModule) {
|
| + ScriptModuleResolverImpl* resolver =
|
| + ScriptModuleResolverImpl::Create(Modulator());
|
| + V8TestingScope scope;
|
| +
|
| + ModuleScript* referrer_module_script = CreateReferrerModuleScript(scope);
|
| + resolver->RegisterModuleScript(referrer_module_script);
|
| +
|
| + ModuleScript* target_module_script = 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", referrer_module_script->Record(),
|
| + scope.GetExceptionState());
|
| + EXPECT_TRUE(scope.GetExceptionState().HadException());
|
| + EXPECT_EQ(kV8TypeError, scope.GetExceptionState().Code());
|
| + EXPECT_TRUE(resolved.IsNull());
|
| + EXPECT_EQ(1, modulator_->GetFetchedModuleScriptCalled());
|
| + EXPECT_EQ(modulator_->FetchedUrl(), target_module_script->BaseURL())
|
| + << "Unexpectedly fetched URL: " << modulator_->FetchedUrl().GetString();
|
| +}
|
| +
|
| +} // namespace blink
|
|
|