blob: 40a4047a377024082fad451d2e55026d047f561b [file] [log] [blame]
// 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 "extensions/renderer/native_extension_bindings_system_test_base.h"
#include "base/run_loop.h"
#include "content/public/test/mock_render_thread.h"
#include "extensions/common/extension_messages.h"
#include "extensions/common/manifest.h"
#include "extensions/common/permissions/permissions_data.h"
#include "extensions/renderer/module_system.h"
#include "extensions/renderer/native_extension_bindings_system.h"
#include "extensions/renderer/script_context.h"
#include "extensions/renderer/script_context_set.h"
#include "extensions/renderer/test_extensions_renderer_client.h"
#include "extensions/renderer/test_v8_extension_configuration.h"
namespace extensions {
TestIPCMessageSender::TestIPCMessageSender() {}
TestIPCMessageSender::~TestIPCMessageSender() {}
void TestIPCMessageSender::SendRequestIPC(
ScriptContext* context,
std::unique_ptr<ExtensionHostMsg_Request_Params> params,
binding::RequestThread thread) {
last_params_ = std::move(params);
}
NativeExtensionBindingsSystemUnittest::NativeExtensionBindingsSystemUnittest() {
}
NativeExtensionBindingsSystemUnittest::
~NativeExtensionBindingsSystemUnittest() {}
v8::ExtensionConfiguration*
NativeExtensionBindingsSystemUnittest::GetV8ExtensionConfiguration() {
return TestV8ExtensionConfiguration::GetConfiguration();
}
void NativeExtensionBindingsSystemUnittest::SetUp() {
render_thread_ = std::make_unique<content::MockRenderThread>();
script_context_set_ = std::make_unique<ScriptContextSet>(&extension_ids_);
std::unique_ptr<TestIPCMessageSender> message_sender;
if (UseStrictIPCMessageSender()) {
message_sender =
std::make_unique<testing::StrictMock<TestIPCMessageSender>>();
} else {
message_sender = std::make_unique<TestIPCMessageSender>();
}
ipc_message_sender_ = message_sender.get();
bindings_system_ = std::make_unique<NativeExtensionBindingsSystem>(
std::move(message_sender));
APIBindingTest::SetUp();
}
void NativeExtensionBindingsSystemUnittest::TearDown() {
// Dispose all contexts now so we call WillReleaseScriptContext() on the
// bindings system.
DisposeAllContexts();
// ScriptContexts are deleted asynchronously by the ScriptContextSet, so we
// need spin here to ensure we don't leak. See also
// ScriptContextSet::Remove().
base::RunLoop().RunUntilIdle();
ASSERT_TRUE(raw_script_contexts_.empty());
script_context_set_.reset();
bindings_system_.reset();
render_thread_.reset();
APIBindingTest::TearDown();
}
ScriptContext* NativeExtensionBindingsSystemUnittest::CreateScriptContext(
v8::Local<v8::Context> v8_context,
const Extension* extension,
Feature::Context context_type) {
auto script_context = std::make_unique<ScriptContext>(
v8_context, nullptr, extension, context_type, extension, context_type);
script_context->SetModuleSystem(
std::make_unique<ModuleSystem>(script_context.get(), source_map()));
ScriptContext* raw_script_context = script_context.get();
raw_script_contexts_.push_back(raw_script_context);
script_context_set_->AddForTesting(std::move(script_context));
bindings_system_->DidCreateScriptContext(raw_script_context);
return raw_script_context;
}
void NativeExtensionBindingsSystemUnittest::OnWillDisposeContext(
v8::Local<v8::Context> context) {
auto iter =
std::find_if(raw_script_contexts_.begin(), raw_script_contexts_.end(),
[context](ScriptContext* script_context) {
return script_context->v8_context() == context;
});
if (iter == raw_script_contexts_.end()) {
ASSERT_TRUE(allow_unregistered_contexts_);
return;
}
bindings_system_->WillReleaseScriptContext(*iter);
script_context_set_->Remove(*iter);
raw_script_contexts_.erase(iter);
}
std::unique_ptr<TestJSRunner::Scope>
NativeExtensionBindingsSystemUnittest::CreateTestJSRunner() {
// The NativeExtensionBindingsSystem handles setting the JSRunner for each
// context, so we don't need to fake one.
return nullptr;
}
void NativeExtensionBindingsSystemUnittest::RegisterExtension(
scoped_refptr<const Extension> extension) {
extension_ids_.insert(extension->id());
RendererExtensionRegistry::Get()->Insert(extension);
}
bool NativeExtensionBindingsSystemUnittest::UseStrictIPCMessageSender() {
return false;
}
} // namespace extensions