flutter_flutter/engine/core/app/AbstractModule.cpp
Adam Barth 5192329f25 Script-based imports should basically work
This CL adds the beginning of a new module loading system that matches the
conceptual module in the spec. I've writed it up to the import API on
AbstractModule. In a future CL, I'll replace the old module loading system with
this one.

R=eseidel@chromium.org

Review URL: https://codereview.chromium.org/720903002
2014-11-12 13:29:14 -08:00

48 lines
1.5 KiB
C++

// Copyright 2014 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 "config.h"
#include "core/app/AbstractModule.h"
#include "core/app/Module.h"
namespace blink {
AbstractModule::AbstractModule(ExecutionContext* context,
PassRefPtr<Document> document,
const String& url)
: ContextLifecycleObserver(context),
document_(document),
url_(url) {
document_->setModule(this);
}
AbstractModule::~AbstractModule() {
document_->setModule(nullptr);
}
ExecutionContext* AbstractModule::executionContext() const {
return ContextLifecycleObserver::executionContext();
}
ScriptPromise AbstractModule::import(ScriptState* script_state,
const String& url_string) {
KURL url = document()->completeURL(url_string);
RefPtr<ScriptPromiseResolver> resolver =
ScriptPromiseResolver::create(script_state);
OwnPtr<ModuleLoader> loader =
adoptPtr(new ModuleLoader(this, GetApplication(), url));
loaders_.set(loader.release(), resolver);
return resolver->promise();
}
void AbstractModule::OnModuleLoadComplete(ModuleLoader* loader,
Module* module) {
RefPtr<ScriptPromiseResolver> resolver = loaders_.take(loader);
ScriptState::Scope scope(resolver->scriptState());
resolver->resolve(module->exports().v8Value());
}
} // namespace blink