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:

committed by
Chromium LUCI CQ

parent
9ff7e3515b
commit
0bda13ca78
@ -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
pdf/DEPS
1
pdf/DEPS
@ -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_;
|
||||
|
Reference in New Issue
Block a user