| Index: third_party/WebKit/Source/core/loader/modulescript/ModuleTreeLinkerTest.cpp
|
| diff --git a/third_party/WebKit/Source/core/loader/modulescript/ModuleTreeLinkerTest.cpp b/third_party/WebKit/Source/core/loader/modulescript/ModuleTreeLinkerTest.cpp
|
| index 80d66873e4f614dbaab0858657cfb354eea134d0..f86822954f9d2bbad6fb2c455cfae0707745fc75 100644
|
| --- a/third_party/WebKit/Source/core/loader/modulescript/ModuleTreeLinkerTest.cpp
|
| +++ b/third_party/WebKit/Source/core/loader/modulescript/ModuleTreeLinkerTest.cpp
|
| @@ -49,6 +49,8 @@ class TestModuleTreeClient final
|
| Member<ModuleScript> module_script_;
|
| };
|
|
|
| +} // namespace
|
| +
|
| class ModuleTreeLinkerTestModulator final : public DummyModulator {
|
| public:
|
| ModuleTreeLinkerTestModulator(RefPtr<ScriptState> script_state)
|
| @@ -62,7 +64,8 @@ class ModuleTreeLinkerTestModulator final : public DummyModulator {
|
| // Resolve last |Modulator::FetchSingle()| call.
|
| ModuleScript* ResolveSingleModuleScriptFetch(
|
| const KURL& url,
|
| - const Vector<String>& dependency_module_requests) {
|
| + const Vector<String>& dependency_module_requests,
|
| + ModuleInstantiationState state) {
|
| ScriptState::Scope scope(script_state_.Get());
|
|
|
| StringBuilder source_text;
|
| @@ -85,7 +88,15 @@ class ModuleTreeLinkerTestModulator final : public DummyModulator {
|
| auto result_map = module_map_.insert(url, module_script);
|
| EXPECT_TRUE(result_map.is_new_entry);
|
|
|
| + if (state == ModuleInstantiationState::kErrored) {
|
| + v8::Local<v8::Value> error = V8ThrowException::CreateError(
|
| + script_state_->GetIsolate(), "Instantiation failure.");
|
| + module_script->SetInstantiationErrorAndClearRecord(
|
| + ScriptValue(script_state_.Get(), error));
|
| + }
|
| +
|
| EXPECT_EQ(url, pending_request_url_);
|
| + EXPECT_EQ(state, module_script->InstantiationState());
|
| EXPECT_TRUE(pending_client_);
|
| pending_client_->NotifyModuleLoadFinished(module_script);
|
| pending_client_.Clear();
|
| @@ -176,8 +187,19 @@ class ModuleTreeLinkerTestModulator final : public DummyModulator {
|
| return ScriptValue();
|
| }
|
|
|
| + ScriptValue GetInstantiationError(
|
| + const ModuleScript* module_script) override {
|
| + ScriptState::Scope scope(script_state_.Get());
|
| + return ScriptValue(script_state_.Get(),
|
| + module_script->CreateInstantiationErrorInternal(
|
| + script_state_->GetIsolate()));
|
| + }
|
| +
|
| Vector<String> ModuleRequestsFromScriptModule(
|
| ScriptModule script_module) override {
|
| + if (script_module.IsNull())
|
| + return Vector<String>();
|
| +
|
| const auto& it = dependency_module_requests_map_.find(script_module);
|
| if (it == dependency_module_requests_map_.end())
|
| return Vector<String>();
|
| @@ -202,8 +224,6 @@ DEFINE_TRACE(ModuleTreeLinkerTestModulator) {
|
| DummyModulator::Trace(visitor);
|
| }
|
|
|
| -} // namespace
|
| -
|
| class ModuleTreeLinkerTest : public ::testing::Test {
|
| DISALLOW_COPY_AND_ASSIGN(ModuleTreeLinkerTest);
|
|
|
| @@ -240,7 +260,8 @@ TEST_F(ModuleTreeLinkerTest, FetchTreeNoDeps) {
|
| << "ModuleTreeLinker should always finish asynchronously.";
|
| EXPECT_FALSE(client->GetModuleScript());
|
|
|
| - GetModulator()->ResolveSingleModuleScriptFetch(url, {});
|
| + GetModulator()->ResolveSingleModuleScriptFetch(
|
| + url, {}, ModuleInstantiationState::kUninstantiated);
|
| EXPECT_TRUE(client->WasNotifyFinished());
|
| ASSERT_TRUE(client->GetModuleScript());
|
| EXPECT_EQ(client->GetModuleScript()->InstantiationState(),
|
| @@ -264,13 +285,43 @@ TEST_F(ModuleTreeLinkerTest, FetchTreeInstantiationFailure) {
|
| << "ModuleTreeLinker should always finish asynchronously.";
|
| EXPECT_FALSE(client->GetModuleScript());
|
|
|
| - GetModulator()->ResolveSingleModuleScriptFetch(url, {});
|
| + GetModulator()->ResolveSingleModuleScriptFetch(
|
| + url, {}, ModuleInstantiationState::kUninstantiated);
|
| +
|
| + // Modulator::InstantiateModule() fails here, as
|
| + // we SetInstantiateShouldFail(true) earlier.
|
| +
|
| EXPECT_TRUE(client->WasNotifyFinished());
|
| ASSERT_TRUE(client->GetModuleScript());
|
| EXPECT_EQ(client->GetModuleScript()->InstantiationState(),
|
| ModuleInstantiationState::kErrored);
|
| }
|
|
|
| +TEST_F(ModuleTreeLinkerTest, FetchTreePreviousInstantiationFailure) {
|
| + ModuleTreeLinkerRegistry* registry = ModuleTreeLinkerRegistry::Create();
|
| +
|
| + KURL url(kParsedURLString, "http://example.com/root.js");
|
| + ModuleScriptFetchRequest module_request(
|
| + url, String(), kParserInserted, WebURLRequest::kFetchCredentialsModeOmit);
|
| + TestModuleTreeClient* client = new TestModuleTreeClient;
|
| + registry->Fetch(module_request, AncestorList(),
|
| + ModuleGraphLevel::kTopLevelModuleFetch, GetModulator(),
|
| + client);
|
| +
|
| + EXPECT_FALSE(client->WasNotifyFinished())
|
| + << "ModuleTreeLinker should always finish asynchronously.";
|
| + EXPECT_FALSE(client->GetModuleScript());
|
| +
|
| + // This emulates "previous instantiation failure", where
|
| + // Modulator::FetchSingle resolves w/ "errored" module script.
|
| + GetModulator()->ResolveSingleModuleScriptFetch(
|
| + url, {}, ModuleInstantiationState::kErrored);
|
| + EXPECT_TRUE(client->WasNotifyFinished());
|
| + ASSERT_TRUE(client->GetModuleScript());
|
| + EXPECT_EQ(ModuleInstantiationState::kErrored,
|
| + client->GetModuleScript()->InstantiationState());
|
| +}
|
| +
|
| TEST_F(ModuleTreeLinkerTest, FetchTreeWithSingleDependency) {
|
| ModuleTreeLinkerRegistry* registry = ModuleTreeLinkerRegistry::Create();
|
|
|
| @@ -286,7 +337,8 @@ TEST_F(ModuleTreeLinkerTest, FetchTreeWithSingleDependency) {
|
| << "ModuleTreeLinker should always finish asynchronously.";
|
| EXPECT_FALSE(client->GetModuleScript());
|
|
|
| - GetModulator()->ResolveSingleModuleScriptFetch(url, {"./dep1.js"});
|
| + GetModulator()->ResolveSingleModuleScriptFetch(
|
| + url, {"./dep1.js"}, ModuleInstantiationState::kUninstantiated);
|
| EXPECT_FALSE(client->WasNotifyFinished());
|
|
|
| KURL url_dep1(kParsedURLString, "http://example.com/dep1.js");
|
| @@ -320,7 +372,8 @@ TEST_F(ModuleTreeLinkerTest, FetchTreeWith3Deps) {
|
| EXPECT_FALSE(client->GetModuleScript());
|
|
|
| GetModulator()->ResolveSingleModuleScriptFetch(
|
| - url, {"./dep1.js", "./dep2.js", "./dep3.js"});
|
| + url, {"./dep1.js", "./dep2.js", "./dep3.js"},
|
| + ModuleInstantiationState::kUninstantiated);
|
| EXPECT_FALSE(client->WasNotifyFinished());
|
|
|
| Vector<KURL> url_deps;
|
| @@ -370,7 +423,8 @@ TEST_F(ModuleTreeLinkerTest, FetchTreeWith3Deps1Fail) {
|
| EXPECT_FALSE(client->GetModuleScript());
|
|
|
| GetModulator()->ResolveSingleModuleScriptFetch(
|
| - url, {"./dep1.js", "./dep2.js", "./dep3.js"});
|
| + url, {"./dep1.js", "./dep2.js", "./dep3.js"},
|
| + ModuleInstantiationState::kUninstantiated);
|
| EXPECT_FALSE(client->WasNotifyFinished());
|
|
|
| Vector<KURL> url_deps;
|
| @@ -429,7 +483,8 @@ TEST_F(ModuleTreeLinkerTest, FetchDependencyTree) {
|
| << "ModuleTreeLinker should always finish asynchronously.";
|
| EXPECT_FALSE(client->GetModuleScript());
|
|
|
| - GetModulator()->ResolveSingleModuleScriptFetch(url, {"./depth2.js"});
|
| + GetModulator()->ResolveSingleModuleScriptFetch(
|
| + url, {"./depth2.js"}, ModuleInstantiationState::kUninstantiated);
|
|
|
| KURL url_dep2(kParsedURLString, "http://example.com/depth2.js");
|
| auto ancestor_list = GetModulator()->GetAncestorListForTreeFetch(url_dep2);
|
|
|