0

Convert received V8 values before forwarding to the PDF plugin

Implement PostMessageReceiver::PostMessage() to convert a v8::Value
received from the embedding content to a base::Value prior to forwarding
it to the PDF plugin.

Bug: 1109796
Change-Id: Ibf6697d693db656897f791e2cbd082fcc413cce1
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2601241
Commit-Queue: Daniel Hosseinian <dhoss@chromium.org>
Reviewed-by: Jochen Eisinger <jochen@chromium.org>
Reviewed-by: K. Moon <kmoon@chromium.org>
Cr-Commit-Position: refs/heads/master@{#848685}
This commit is contained in:
Daniel Hosseinian
2021-01-29 20:39:20 +00:00
committed by Chromium LUCI CQ
parent 9ff7e3515b
commit 0bda13ca78
4 changed files with 40 additions and 5 deletions

@ -283,6 +283,7 @@ if (enable_pdf) {
":ppapi_migration",
"//base",
"//cc/paint",
"//content/public/renderer",
"//gin",
"//ppapi/cpp:objects", # TODO(crbug.com/1114263): PDFEngine::Client only.
"//third_party/blink/public:blink_headers",

@ -1,5 +1,6 @@
include_rules = [
"+cc/paint",
"+content/public/renderer/v8_value_converter.h",
"+gin/handle.h",
"+gin/public",
"+gin/object_template_builder.h",

@ -4,6 +4,7 @@
#include "pdf/post_message_receiver.h"
#include <memory>
#include <utility>
#include "base/bind.h"
@ -12,6 +13,7 @@
#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"
@ -29,7 +31,7 @@ v8::Local<v8::Object> PostMessageReceiver::Create(
base::WeakPtr<Client> client,
scoped_refptr<base::SequencedTaskRunner> client_task_runner) {
return gin::CreateHandle(
isolate, new PostMessageReceiver(std::move(client),
isolate, new PostMessageReceiver(isolate, std::move(client),
std::move(client_task_runner)))
.ToV8()
.As<v8::Object>();
@ -38,9 +40,11 @@ v8::Local<v8::Object> PostMessageReceiver::Create(
PostMessageReceiver::~PostMessageReceiver() = default;
PostMessageReceiver::PostMessageReceiver(
v8::Isolate* isolate,
base::WeakPtr<Client> client,
scoped_refptr<base::SequencedTaskRunner> client_task_runner)
: client_(std::move(client)),
: isolate_(isolate),
client_(std::move(client)),
client_task_runner_(std::move(client_task_runner)) {}
gin::ObjectTemplateBuilder PostMessageReceiver::GetObjectTemplateBuilder(
@ -53,14 +57,29 @@ const char* PostMessageReceiver::GetTypeName() {
return "ChromePdfPostMessageReceiver";
}
std::unique_ptr<base::Value> PostMessageReceiver::ConvertMessage(
v8::Local<v8::Value> message) {
if (!v8_value_converter_)
v8_value_converter_ = content::V8ValueConverter::Create();
return v8_value_converter_->FromV8Value(message,
isolate_->GetCurrentContext());
}
void PostMessageReceiver::PostMessage(v8::Local<v8::Value> message) {
if (!client_)
return;
NOTIMPLEMENTED_LOG_ONCE();
std::unique_ptr<base::Value> 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_, base::Value()));
client_task_runner_->PostTask(FROM_HERE,
base::BindOnce(&Client::OnMessage, client_,
std::move(*converted_message)));
}
} // namespace chrome_pdf

@ -5,6 +5,8 @@
#ifndef PDF_POST_MESSAGE_RECEIVER_H_
#define PDF_POST_MESSAGE_RECEIVER_H_
#include <memory>
#include "base/memory/scoped_refptr.h"
#include "base/memory/weak_ptr.h"
#include "gin/public/wrapper_info.h"
@ -16,6 +18,10 @@ class SequencedTaskRunner;
class Value;
} // namespace base
namespace content {
class V8ValueConverter;
} // namespace content
namespace gin {
class ObjectTemplateBuilder;
} // namespace gin
@ -57,6 +63,7 @@ class PostMessageReceiver final : public gin::Wrappable<PostMessageReceiver> {
private:
PostMessageReceiver(
v8::Isolate* isolate,
base::WeakPtr<Client> client,
scoped_refptr<base::SequencedTaskRunner> client_task_runner);
@ -65,9 +72,16 @@ class PostMessageReceiver final : public gin::Wrappable<PostMessageReceiver> {
v8::Isolate* isolate) override;
const char* GetTypeName() override;
// Converts `message` so it can be consumed by `client_`.
std::unique_ptr<base::Value> ConvertMessage(v8::Local<v8::Value> message);
// Implements the `postMessage()` method called by the embedder.
void PostMessage(v8::Local<v8::Value> message);
std::unique_ptr<content::V8ValueConverter> v8_value_converter_;
v8::Isolate* isolate_;
base::WeakPtr<Client> client_;
scoped_refptr<base::SequencedTaskRunner> client_task_runner_;