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",
|
":ppapi_migration",
|
||||||
"//base",
|
"//base",
|
||||||
"//cc/paint",
|
"//cc/paint",
|
||||||
|
"//content/public/renderer",
|
||||||
"//gin",
|
"//gin",
|
||||||
"//ppapi/cpp:objects", # TODO(crbug.com/1114263): PDFEngine::Client only.
|
"//ppapi/cpp:objects", # TODO(crbug.com/1114263): PDFEngine::Client only.
|
||||||
"//third_party/blink/public:blink_headers",
|
"//third_party/blink/public:blink_headers",
|
||||||
|
1
pdf/DEPS
1
pdf/DEPS
@ -1,5 +1,6 @@
|
|||||||
include_rules = [
|
include_rules = [
|
||||||
"+cc/paint",
|
"+cc/paint",
|
||||||
|
"+content/public/renderer/v8_value_converter.h",
|
||||||
"+gin/handle.h",
|
"+gin/handle.h",
|
||||||
"+gin/public",
|
"+gin/public",
|
||||||
"+gin/object_template_builder.h",
|
"+gin/object_template_builder.h",
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
|
|
||||||
#include "pdf/post_message_receiver.h"
|
#include "pdf/post_message_receiver.h"
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
|
||||||
#include "base/bind.h"
|
#include "base/bind.h"
|
||||||
@ -12,6 +13,7 @@
|
|||||||
#include "base/notreached.h"
|
#include "base/notreached.h"
|
||||||
#include "base/sequenced_task_runner.h"
|
#include "base/sequenced_task_runner.h"
|
||||||
#include "base/values.h"
|
#include "base/values.h"
|
||||||
|
#include "content/public/renderer/v8_value_converter.h"
|
||||||
#include "gin/handle.h"
|
#include "gin/handle.h"
|
||||||
#include "gin/object_template_builder.h"
|
#include "gin/object_template_builder.h"
|
||||||
#include "gin/public/wrapper_info.h"
|
#include "gin/public/wrapper_info.h"
|
||||||
@ -29,7 +31,7 @@ v8::Local<v8::Object> PostMessageReceiver::Create(
|
|||||||
base::WeakPtr<Client> client,
|
base::WeakPtr<Client> client,
|
||||||
scoped_refptr<base::SequencedTaskRunner> client_task_runner) {
|
scoped_refptr<base::SequencedTaskRunner> client_task_runner) {
|
||||||
return gin::CreateHandle(
|
return gin::CreateHandle(
|
||||||
isolate, new PostMessageReceiver(std::move(client),
|
isolate, new PostMessageReceiver(isolate, std::move(client),
|
||||||
std::move(client_task_runner)))
|
std::move(client_task_runner)))
|
||||||
.ToV8()
|
.ToV8()
|
||||||
.As<v8::Object>();
|
.As<v8::Object>();
|
||||||
@ -38,9 +40,11 @@ v8::Local<v8::Object> PostMessageReceiver::Create(
|
|||||||
PostMessageReceiver::~PostMessageReceiver() = default;
|
PostMessageReceiver::~PostMessageReceiver() = default;
|
||||||
|
|
||||||
PostMessageReceiver::PostMessageReceiver(
|
PostMessageReceiver::PostMessageReceiver(
|
||||||
|
v8::Isolate* isolate,
|
||||||
base::WeakPtr<Client> client,
|
base::WeakPtr<Client> client,
|
||||||
scoped_refptr<base::SequencedTaskRunner> client_task_runner)
|
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)) {}
|
client_task_runner_(std::move(client_task_runner)) {}
|
||||||
|
|
||||||
gin::ObjectTemplateBuilder PostMessageReceiver::GetObjectTemplateBuilder(
|
gin::ObjectTemplateBuilder PostMessageReceiver::GetObjectTemplateBuilder(
|
||||||
@ -53,14 +57,29 @@ const char* PostMessageReceiver::GetTypeName() {
|
|||||||
return "ChromePdfPostMessageReceiver";
|
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) {
|
void PostMessageReceiver::PostMessage(v8::Local<v8::Value> message) {
|
||||||
if (!client_)
|
if (!client_)
|
||||||
return;
|
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(
|
client_task_runner_->PostTask(FROM_HERE,
|
||||||
FROM_HERE, base::BindOnce(&Client::OnMessage, client_, base::Value()));
|
base::BindOnce(&Client::OnMessage, client_,
|
||||||
|
std::move(*converted_message)));
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace chrome_pdf
|
} // namespace chrome_pdf
|
||||||
|
@ -5,6 +5,8 @@
|
|||||||
#ifndef PDF_POST_MESSAGE_RECEIVER_H_
|
#ifndef PDF_POST_MESSAGE_RECEIVER_H_
|
||||||
#define PDF_POST_MESSAGE_RECEIVER_H_
|
#define PDF_POST_MESSAGE_RECEIVER_H_
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
#include "base/memory/scoped_refptr.h"
|
#include "base/memory/scoped_refptr.h"
|
||||||
#include "base/memory/weak_ptr.h"
|
#include "base/memory/weak_ptr.h"
|
||||||
#include "gin/public/wrapper_info.h"
|
#include "gin/public/wrapper_info.h"
|
||||||
@ -16,6 +18,10 @@ class SequencedTaskRunner;
|
|||||||
class Value;
|
class Value;
|
||||||
} // namespace base
|
} // namespace base
|
||||||
|
|
||||||
|
namespace content {
|
||||||
|
class V8ValueConverter;
|
||||||
|
} // namespace content
|
||||||
|
|
||||||
namespace gin {
|
namespace gin {
|
||||||
class ObjectTemplateBuilder;
|
class ObjectTemplateBuilder;
|
||||||
} // namespace gin
|
} // namespace gin
|
||||||
@ -57,6 +63,7 @@ class PostMessageReceiver final : public gin::Wrappable<PostMessageReceiver> {
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
PostMessageReceiver(
|
PostMessageReceiver(
|
||||||
|
v8::Isolate* isolate,
|
||||||
base::WeakPtr<Client> client,
|
base::WeakPtr<Client> client,
|
||||||
scoped_refptr<base::SequencedTaskRunner> client_task_runner);
|
scoped_refptr<base::SequencedTaskRunner> client_task_runner);
|
||||||
|
|
||||||
@ -65,9 +72,16 @@ class PostMessageReceiver final : public gin::Wrappable<PostMessageReceiver> {
|
|||||||
v8::Isolate* isolate) override;
|
v8::Isolate* isolate) override;
|
||||||
const char* GetTypeName() 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.
|
// Implements the `postMessage()` method called by the embedder.
|
||||||
void PostMessage(v8::Local<v8::Value> message);
|
void PostMessage(v8::Local<v8::Value> message);
|
||||||
|
|
||||||
|
std::unique_ptr<content::V8ValueConverter> v8_value_converter_;
|
||||||
|
|
||||||
|
v8::Isolate* isolate_;
|
||||||
|
|
||||||
base::WeakPtr<Client> client_;
|
base::WeakPtr<Client> client_;
|
||||||
|
|
||||||
scoped_refptr<base::SequencedTaskRunner> client_task_runner_;
|
scoped_refptr<base::SequencedTaskRunner> client_task_runner_;
|
||||||
|
Reference in New Issue
Block a user