Index: third_party/WebKit/Source/core/loader/modulescript/ModuleScriptLoaderTest.cpp |
diff --git a/third_party/WebKit/Source/core/loader/modulescript/ModuleScriptLoaderTest.cpp b/third_party/WebKit/Source/core/loader/modulescript/ModuleScriptLoaderTest.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..42910debcd6d043a72869b6758aa3e0b3b3a28a0 |
--- /dev/null |
+++ b/third_party/WebKit/Source/core/loader/modulescript/ModuleScriptLoaderTest.cpp |
@@ -0,0 +1,164 @@ |
+// 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/loader/modulescript/ModuleScriptLoader.h" |
+ |
+#include "core/dom/Document.h" |
+#include "core/dom/Modulator.h" |
+#include "core/dom/ModuleScript.h" |
+#include "core/loader/modulescript/ModuleScriptFetchRequest.h" |
+#include "core/loader/modulescript/ModuleScriptLoaderClient.h" |
+#include "core/loader/modulescript/ModuleScriptLoaderRegistry.h" |
+#include "core/testing/DummyModulator.h" |
+#include "core/testing/DummyPageHolder.h" |
+#include "platform/heap/Handle.h" |
+#include "platform/loader/fetch/ResourceFetcher.h" |
+#include "platform/loader/testing/FetchTestingPlatformSupport.h" |
+#include "platform/loader/testing/MockFetchContext.h" |
+#include "platform/testing/URLTestHelpers.h" |
+#include "platform/testing/UnitTestHelpers.h" |
+#include "public/platform/Platform.h" |
+#include "public/platform/WebURLLoaderMockFactory.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+ |
+namespace blink { |
+ |
+namespace { |
+ |
+class TestModuleScriptLoaderClient final |
+ : public GarbageCollectedFinalized<TestModuleScriptLoaderClient>, |
+ public ModuleScriptLoaderClient { |
+ USING_GARBAGE_COLLECTED_MIXIN(TestModuleScriptLoaderClient); |
+ |
+ public: |
+ TestModuleScriptLoaderClient() = default; |
+ ~TestModuleScriptLoaderClient() override {} |
+ |
+ DEFINE_INLINE_TRACE() { visitor->trace(m_moduleScript); } |
+ |
+ void notifyNewSingleModuleFinished(ModuleScript* moduleScript) override { |
+ m_wasNotifyFinished = true; |
+ m_moduleScript = moduleScript; |
+ } |
+ |
+ bool wasNotifyFinished() const { return m_wasNotifyFinished; } |
+ ModuleScript* moduleScript() { return m_moduleScript; } |
+ |
+ private: |
+ bool m_wasNotifyFinished = false; |
+ Member<ModuleScript> m_moduleScript; |
+}; |
+ |
+class ModuleScriptLoaderTestModulator final : public DummyModulator { |
+ public: |
+ ModuleScriptLoaderTestModulator(RefPtr<ScriptState> scriptState, |
+ RefPtr<SecurityOrigin> securityOrigin) |
+ : m_scriptState(std::move(scriptState)), |
+ m_securityOrigin(std::move(securityOrigin)) {} |
+ |
+ ~ModuleScriptLoaderTestModulator() override {} |
+ |
+ SecurityOrigin* securityOrigin() override { return m_securityOrigin.get(); } |
+ |
+ ScriptModule compileModule(const String& script, |
+ const String& urlStr) override { |
+ ScriptState::Scope scope(m_scriptState.get()); |
+ return ScriptModule::compile(m_scriptState->isolate(), |
+ "export default 'foo';", ""); |
+ } |
+ |
+ DECLARE_TRACE(); |
+ |
+ private: |
+ RefPtr<ScriptState> m_scriptState; |
+ RefPtr<SecurityOrigin> m_securityOrigin; |
+}; |
+ |
+DEFINE_TRACE(ModuleScriptLoaderTestModulator) { |
+ DummyModulator::trace(visitor); |
+} |
+ |
+} // namespace |
+ |
+class ModuleScriptLoaderTest : public ::testing::Test { |
+ DISALLOW_COPY_AND_ASSIGN(ModuleScriptLoaderTest); |
+ |
+ public: |
+ ModuleScriptLoaderTest() = default; |
+ void SetUp() override; |
+ |
+ LocalFrame& frame() { return m_dummyPageHolder->frame(); } |
+ Document& document() { return m_dummyPageHolder->document(); } |
+ ResourceFetcher* fetcher() { return m_fetcher.get(); } |
+ Modulator* modulator() { return m_modulator.get(); } |
+ |
+ protected: |
+ ScopedTestingPlatformSupport<FetchTestingPlatformSupport> m_platform; |
+ std::unique_ptr<DummyPageHolder> m_dummyPageHolder; |
+ Persistent<ResourceFetcher> m_fetcher; |
+ Persistent<Modulator> m_modulator; |
+}; |
+ |
+void ModuleScriptLoaderTest::SetUp() { |
+ m_platform->advanceClockSeconds(1.); // For non-zero DocumentParserTimings |
+ m_dummyPageHolder = DummyPageHolder::create(IntSize(500, 500)); |
+ document().setURL(KURL(KURL(), "https://example.test")); |
+ m_fetcher = ResourceFetcher::create( |
+ MockFetchContext::create(MockFetchContext::kShouldLoadNewResource)); |
+ m_modulator = new ModuleScriptLoaderTestModulator( |
+ ScriptState::forMainWorld(&frame()), document().getSecurityOrigin()); |
+} |
+ |
+TEST_F(ModuleScriptLoaderTest, fetchDataURL) { |
+ ModuleScriptLoaderRegistry* registry = ModuleScriptLoaderRegistry::create(); |
+ KURL url(KURL(), "data:text/javascript,export default 'grapes';"); |
+ ModuleScriptFetchRequest moduleRequest( |
+ url, String(), ParserInserted, WebURLRequest::FetchCredentialsModeOmit); |
+ TestModuleScriptLoaderClient* client = new TestModuleScriptLoaderClient; |
+ registry->fetch(moduleRequest, ModuleGraphLevel::TopLevelModuleFetch, |
+ modulator(), fetcher(), client); |
+ |
+ EXPECT_TRUE(client->wasNotifyFinished()) |
+ << "ModuleScriptLoader should finish synchronously."; |
+ ASSERT_TRUE(client->moduleScript()); |
+ EXPECT_EQ(client->moduleScript()->instantiationState(), |
+ ModuleInstantiationState::Uninstantiated); |
+} |
+ |
+TEST_F(ModuleScriptLoaderTest, fetchInvalidURL) { |
+ ModuleScriptLoaderRegistry* registry = ModuleScriptLoaderRegistry::create(); |
+ KURL url; |
+ EXPECT_FALSE(url.isValid()); |
+ ModuleScriptFetchRequest moduleRequest( |
+ url, String(), ParserInserted, WebURLRequest::FetchCredentialsModeOmit); |
+ TestModuleScriptLoaderClient* client = new TestModuleScriptLoaderClient; |
+ registry->fetch(moduleRequest, ModuleGraphLevel::TopLevelModuleFetch, |
+ modulator(), fetcher(), client); |
+ |
+ EXPECT_TRUE(client->wasNotifyFinished()) |
+ << "ModuleScriptLoader should finish synchronously."; |
+ EXPECT_FALSE(client->moduleScript()); |
+} |
+ |
+TEST_F(ModuleScriptLoaderTest, fetchURL) { |
+ KURL url(ParsedURLString, "http://127.0.0.1:8000/module.js"); |
+ URLTestHelpers::registerMockedURLLoad( |
+ url, testing::webTestDataPath("module.js"), "text/javascript"); |
+ |
+ ModuleScriptLoaderRegistry* registry = ModuleScriptLoaderRegistry::create(); |
+ ModuleScriptFetchRequest moduleRequest( |
+ url, String(), ParserInserted, WebURLRequest::FetchCredentialsModeOmit); |
+ TestModuleScriptLoaderClient* client = new TestModuleScriptLoaderClient; |
+ registry->fetch(moduleRequest, ModuleGraphLevel::TopLevelModuleFetch, |
+ modulator(), fetcher(), client); |
+ |
+ EXPECT_FALSE(client->wasNotifyFinished()) |
+ << "ModuleScriptLoader unexpectedly finished synchronously."; |
+ m_platform->getURLLoaderMockFactory()->serveAsynchronousRequests(); |
+ |
+ EXPECT_TRUE(client->wasNotifyFinished()); |
+ EXPECT_FALSE(client->moduleScript()); |
+} |
+ |
+} // namespace blink |