// Copyright 2021 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 "pdf/post_message_receiver.h" #include #include #include "base/bind.h" #include "base/memory/scoped_refptr.h" #include "base/memory/weak_ptr.h" #include "base/notreached.h" #include "base/sequenced_task_runner.h" #include "base/values.h" #include "content/public/renderer/v8_value_converter.h" #include "gin/handle.h" #include "gin/object_template_builder.h" #include "gin/public/wrapper_info.h" #include "gin/wrappable.h" #include "v8/include/v8.h" namespace chrome_pdf { // static gin::WrapperInfo PostMessageReceiver::kWrapperInfo = {gin::kEmbedderNativeGin}; // static v8::Local PostMessageReceiver::Create( v8::Isolate* isolate, base::WeakPtr client, scoped_refptr client_task_runner) { return gin::CreateHandle( isolate, new PostMessageReceiver(isolate, std::move(client), std::move(client_task_runner))) .ToV8() .As(); } PostMessageReceiver::~PostMessageReceiver() = default; PostMessageReceiver::PostMessageReceiver( v8::Isolate* isolate, base::WeakPtr client, scoped_refptr client_task_runner) : isolate_(isolate), client_(std::move(client)), client_task_runner_(std::move(client_task_runner)) {} gin::ObjectTemplateBuilder PostMessageReceiver::GetObjectTemplateBuilder( v8::Isolate* isolate) { return gin::Wrappable::GetObjectTemplateBuilder(isolate) .SetMethod("postMessage", &PostMessageReceiver::PostMessage); } const char* PostMessageReceiver::GetTypeName() { return "ChromePdfPostMessageReceiver"; } std::unique_ptr PostMessageReceiver::ConvertMessage( v8::Local message) { if (!v8_value_converter_) v8_value_converter_ = content::V8ValueConverter::Create(); return v8_value_converter_->FromV8Value(message, isolate_->GetCurrentContext()); } void PostMessageReceiver::PostMessage(v8::Local message) { if (!client_) return; std::unique_ptr converted_message = ConvertMessage(message); if (!converted_message) { NOTREACHED() << "The PDF Viewer UI should not be sending messages that " "cannot be converted."; return; } client_task_runner_->PostTask(FROM_HERE, base::BindOnce(&Client::OnMessage, client_, std::move(*converted_message))); } } // namespace chrome_pdf