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 namespace { |
| 21 |
| 22 class ScriptModuleResolverImplTestModulator final : public DummyModulator { |
| 23 public: |
| 24 ScriptModuleResolverImplTestModulator() {} |
| 25 virtual ~ScriptModuleResolverImplTestModulator() {} |
| 26 |
| 27 DECLARE_TRACE(); |
| 28 |
| 29 int GetFetchedModuleScriptCalled() const { |
| 30 return get_fetched_module_script_called_; |
| 31 } |
| 32 void SetModuleScript(ModuleScript* module_script) { |
| 33 module_script_ = module_script; |
| 34 } |
| 35 const KURL& FetchedUrl() const { return fetched_url_; } |
| 36 |
| 37 private: |
| 38 // Implements Modulator: |
| 39 ModuleScript* GetFetchedModuleScript(const KURL&) override; |
| 40 |
| 41 int get_fetched_module_script_called_ = 0; |
| 42 KURL fetched_url_; |
| 43 Member<ModuleScript> module_script_; |
| 44 }; |
| 45 |
| 46 DEFINE_TRACE(ScriptModuleResolverImplTestModulator) { |
| 47 visitor->Trace(module_script_); |
| 48 DummyModulator::Trace(visitor); |
| 49 } |
| 50 |
| 51 ModuleScript* ScriptModuleResolverImplTestModulator::GetFetchedModuleScript( |
| 52 const KURL& url) { |
| 53 get_fetched_module_script_called_++; |
| 54 fetched_url_ = url; |
| 55 return module_script_.Get(); |
| 56 } |
| 57 |
| 58 ModuleScript* CreateReferrerModuleScript(V8TestingScope& scope) { |
| 59 ScriptModule referrer_record = ScriptModule::Compile( |
| 60 scope.GetIsolate(), "import './target.js'; export const a = 42;", |
| 61 "referrer.js", kSharableCrossOrigin); |
| 62 KURL referrer_url(kParsedURLString, "https://example.com/referrer.js"); |
| 63 ModuleScript* referrer_module_script = |
| 64 ModuleScript::Create(referrer_record, referrer_url, "", kParserInserted, |
| 65 WebURLRequest::kFetchCredentialsModeOmit); |
| 66 // TODO(kouhei): moduleScript->setInstantiateSuccess(); once |
| 67 // https://codereview.chromium.org/2782403002/ landed. |
| 68 return referrer_module_script; |
| 69 } |
| 70 |
| 71 ModuleScript* CreateTargetModuleScript(V8TestingScope& scope) { |
| 72 ScriptModule record = |
| 73 ScriptModule::Compile(scope.GetIsolate(), "export const pi = 3.14;", |
| 74 "target.js", kSharableCrossOrigin); |
| 75 KURL url(kParsedURLString, "https://example.com/target.js"); |
| 76 ModuleScript* module_script = |
| 77 ModuleScript::Create(record, url, "", kParserInserted, |
| 78 WebURLRequest::kFetchCredentialsModeOmit); |
| 79 // TODO(kouhei): moduleScript->setInstantiateSuccess(); once |
| 80 // https://codereview.chromium.org/2782403002/ landed. |
| 81 return module_script; |
| 82 } |
| 83 |
| 84 } // namespace |
| 85 |
| 86 class ScriptModuleResolverImplTest : public testing::Test { |
| 87 public: |
| 88 void SetUp() override; |
| 89 |
| 90 ScriptModuleResolverImplTestModulator* Modulator() { |
| 91 return modulator_.Get(); |
| 92 } |
| 93 |
| 94 protected: |
| 95 ScopedTestingPlatformSupport<TestingPlatformSupportWithMockScheduler> |
| 96 platform_; |
| 97 Persistent<ScriptModuleResolverImplTestModulator> modulator_; |
| 98 }; |
| 99 |
| 100 void ScriptModuleResolverImplTest::SetUp() { |
| 101 platform_->AdvanceClockSeconds(1.); // For non-zero DocumentParserTimings |
| 102 modulator_ = new ScriptModuleResolverImplTestModulator(); |
| 103 } |
| 104 |
| 105 TEST_F(ScriptModuleResolverImplTest, registerResolveSuccess) { |
| 106 ScriptModuleResolverImpl* resolver = |
| 107 ScriptModuleResolverImpl::Create(Modulator()); |
| 108 V8TestingScope scope; |
| 109 |
| 110 ModuleScript* referrer_module_script = CreateReferrerModuleScript(scope); |
| 111 resolver->RegisterModuleScript(referrer_module_script); |
| 112 |
| 113 ModuleScript* target_module_script = CreateTargetModuleScript(scope); |
| 114 Modulator()->SetModuleScript(target_module_script); |
| 115 |
| 116 ScriptModule resolved = |
| 117 resolver->Resolve("./target.js", referrer_module_script->Record(), |
| 118 scope.GetExceptionState()); |
| 119 EXPECT_FALSE(scope.GetExceptionState().HadException()); |
| 120 EXPECT_EQ(resolved, target_module_script->Record()); |
| 121 EXPECT_EQ(1, modulator_->GetFetchedModuleScriptCalled()); |
| 122 EXPECT_EQ(modulator_->FetchedUrl(), target_module_script->BaseURL()) |
| 123 << "Unexpectedly fetched URL: " << modulator_->FetchedUrl().GetString(); |
| 124 } |
| 125 |
| 126 TEST_F(ScriptModuleResolverImplTest, resolveInvalidModuleSpecifier) { |
| 127 ScriptModuleResolverImpl* resolver = |
| 128 ScriptModuleResolverImpl::Create(Modulator()); |
| 129 V8TestingScope scope; |
| 130 |
| 131 ModuleScript* referrer_module_script = CreateReferrerModuleScript(scope); |
| 132 resolver->RegisterModuleScript(referrer_module_script); |
| 133 |
| 134 ModuleScript* target_module_script = CreateTargetModuleScript(scope); |
| 135 Modulator()->SetModuleScript(target_module_script); |
| 136 |
| 137 ScriptModule resolved = resolver->Resolve( |
| 138 "invalid", referrer_module_script->Record(), scope.GetExceptionState()); |
| 139 EXPECT_TRUE(scope.GetExceptionState().HadException()); |
| 140 EXPECT_EQ(kV8TypeError, scope.GetExceptionState().Code()); |
| 141 EXPECT_TRUE(resolved.IsNull()); |
| 142 EXPECT_EQ(0, modulator_->GetFetchedModuleScriptCalled()); |
| 143 } |
| 144 |
| 145 TEST_F(ScriptModuleResolverImplTest, resolveLoadFailedModule) { |
| 146 ScriptModuleResolverImpl* resolver = |
| 147 ScriptModuleResolverImpl::Create(Modulator()); |
| 148 V8TestingScope scope; |
| 149 |
| 150 ModuleScript* referrer_module_script = CreateReferrerModuleScript(scope); |
| 151 resolver->RegisterModuleScript(referrer_module_script); |
| 152 |
| 153 ModuleScript* target_module_script = CreateTargetModuleScript(scope); |
| 154 // Set Modulator::getFetchedModuleScript to return nullptr, which represents |
| 155 // that the target module failed to load. |
| 156 Modulator()->SetModuleScript(nullptr); |
| 157 |
| 158 ScriptModule resolved = |
| 159 resolver->Resolve("./target.js", referrer_module_script->Record(), |
| 160 scope.GetExceptionState()); |
| 161 EXPECT_TRUE(scope.GetExceptionState().HadException()); |
| 162 EXPECT_EQ(kV8TypeError, scope.GetExceptionState().Code()); |
| 163 EXPECT_TRUE(resolved.IsNull()); |
| 164 EXPECT_EQ(1, modulator_->GetFetchedModuleScriptCalled()); |
| 165 EXPECT_EQ(modulator_->FetchedUrl(), target_module_script->BaseURL()) |
| 166 << "Unexpectedly fetched URL: " << modulator_->FetchedUrl().GetString(); |
| 167 } |
| 168 |
| 169 } // namespace blink |
OLD | NEW |