blob: 2cb328250fda6dfdfe6624e5d5775d49193315e5 [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 "third_party/blink/renderer/core/mojo/mojo.h"
#include <string>
#include "mojo/public/cpp/system/message_pipe.h"
#include "services/service_manager/public/cpp/interface_provider.h"
#include "third_party/blink/public/platform/interface_provider.h"
#include "third_party/blink/public/platform/platform.h"
#include "third_party/blink/renderer/core/dom/document.h"
#include "third_party/blink/renderer/core/frame/local_frame.h"
#include "third_party/blink/renderer/core/frame/local_frame_client.h"
#include "third_party/blink/renderer/core/mojo/mojo_create_data_pipe_options.h"
#include "third_party/blink/renderer/core/mojo/mojo_create_data_pipe_result.h"
#include "third_party/blink/renderer/core/mojo/mojo_create_message_pipe_result.h"
#include "third_party/blink/renderer/core/mojo/mojo_create_shared_buffer_result.h"
#include "third_party/blink/renderer/core/mojo/mojo_handle.h"
#include "third_party/blink/renderer/core/workers/worker_global_scope.h"
#include "third_party/blink/renderer/core/workers/worker_thread.h"
#include "third_party/blink/renderer/platform/bindings/script_state.h"
#include "third_party/blink/renderer/platform/wtf/text/string_utf8_adaptor.h"
namespace blink {
// static
MojoCreateMessagePipeResult* Mojo::createMessagePipe() {
MojoCreateMessagePipeResult* result_dict =
MojoCreateMessagePipeResult::Create();
MojoCreateMessagePipeOptions options = {0};
options.struct_size = sizeof(::MojoCreateMessagePipeOptions);
options.flags = MOJO_CREATE_MESSAGE_PIPE_FLAG_NONE;
mojo::ScopedMessagePipeHandle handle0, handle1;
MojoResult result = mojo::CreateMessagePipe(&options, &handle0, &handle1);
result_dict->setResult(result);
if (result == MOJO_RESULT_OK) {
result_dict->setHandle0(
MojoHandle::Create(mojo::ScopedHandle::From(std::move(handle0))));
result_dict->setHandle1(
MojoHandle::Create(mojo::ScopedHandle::From(std::move(handle1))));
}
return result_dict;
}
// static
MojoCreateDataPipeResult* Mojo::createDataPipe(
const MojoCreateDataPipeOptions* options_dict) {
MojoCreateDataPipeResult* result_dict = MojoCreateDataPipeResult::Create();
if (!options_dict->hasElementNumBytes() ||
!options_dict->hasCapacityNumBytes()) {
result_dict->setResult(MOJO_RESULT_INVALID_ARGUMENT);
return result_dict;
}
::MojoCreateDataPipeOptions options = {0};
options.struct_size = sizeof(options);
options.flags = MOJO_CREATE_DATA_PIPE_FLAG_NONE;
options.element_num_bytes = options_dict->elementNumBytes();
options.capacity_num_bytes = options_dict->capacityNumBytes();
mojo::ScopedDataPipeProducerHandle producer;
mojo::ScopedDataPipeConsumerHandle consumer;
MojoResult result = mojo::CreateDataPipe(&options, &producer, &consumer);
result_dict->setResult(result);
if (result == MOJO_RESULT_OK) {
result_dict->setProducer(
MojoHandle::Create(mojo::ScopedHandle::From(std::move(producer))));
result_dict->setConsumer(
MojoHandle::Create(mojo::ScopedHandle::From(std::move(consumer))));
}
return result_dict;
}
// static
MojoCreateSharedBufferResult* Mojo::createSharedBuffer(unsigned num_bytes) {
MojoCreateSharedBufferResult* result_dict =
MojoCreateSharedBufferResult::Create();
MojoCreateSharedBufferOptions* options = nullptr;
mojo::Handle handle;
MojoResult result =
MojoCreateSharedBuffer(num_bytes, options, handle.mutable_value());
result_dict->setResult(result);
if (result == MOJO_RESULT_OK) {
result_dict->setHandle(MojoHandle::Create(mojo::MakeScopedHandle(handle)));
}
return result_dict;
}
// static
void Mojo::bindInterface(ScriptState* script_state,
const String& interface_name,
MojoHandle* request_handle,
const String& scope) {
std::string name =
StringUTF8Adaptor(interface_name).AsStringPiece().as_string();
auto handle =
mojo::ScopedMessagePipeHandle::From(request_handle->TakeHandle());
if (scope == "process") {
Platform::Current()->GetInterfaceProvider()->GetInterface(
name.c_str(), std::move(handle));
return;
}
if (auto* interface_provider =
ExecutionContext::From(script_state)->GetInterfaceProvider()) {
interface_provider->GetInterfaceByName(name, std::move(handle));
}
}
} // namespace blink