Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1145)

Unified Diff: content/renderer/pepper/message_channel.h

Issue 589213003: PPAPI: Never re-enter JavaScript for PostMessage. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Make MessageChannel observer clean up more reliably, guarantee HungPluginFilter stays alive long en… Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « content/renderer/pepper/host_dispatcher_wrapper.cc ('k') | content/renderer/pepper/message_channel.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/renderer/pepper/message_channel.h
diff --git a/content/renderer/pepper/message_channel.h b/content/renderer/pepper/message_channel.h
index 3caef263db382f38427a5356c4dfb17d31e8c466..9bd75dff8f2be89b0f85e5c53d8530972d007281 100644
--- a/content/renderer/pepper/message_channel.h
+++ b/content/renderer/pepper/message_channel.h
@@ -14,6 +14,7 @@
#include "gin/handle.h"
#include "gin/interceptor.h"
#include "gin/wrappable.h"
+#include "ppapi/proxy/host_dispatcher.h"
#include "ppapi/shared_impl/resource.h"
#include "third_party/WebKit/public/web/WebSerializedScriptValue.h"
#include "v8/include/v8.h"
@@ -46,8 +47,10 @@ class PluginObject;
// - The message target won't be limited to instance, and should support
// either plugin-provided or JS objects.
// TODO(dmichael): Add support for separate MessagePorts.
-class MessageChannel : public gin::Wrappable<MessageChannel>,
- public gin::NamedPropertyInterceptor {
+class MessageChannel :
+ public gin::Wrappable<MessageChannel>,
+ public gin::NamedPropertyInterceptor,
+ public ppapi::proxy::HostDispatcher::SyncMessageStatusObserver {
public:
static gin::WrapperInfo kWrapperInfo;
@@ -102,6 +105,10 @@ class MessageChannel : public gin::Wrappable<MessageChannel>,
virtual gin::ObjectTemplateBuilder GetObjectTemplateBuilder(
v8::Isolate* isolate) OVERRIDE;
+ // ppapi::proxy::HostDispatcher::SyncMessageStatusObserver
+ virtual void BeginBlockOnSyncMessage() OVERRIDE;
+ virtual void EndBlockOnSyncMessage() OVERRIDE;
+
// Post a message to the plugin's HandleMessage function for this channel's
// instance.
void PostMessageToNative(gin::Arguments* args);
@@ -122,8 +129,18 @@ class MessageChannel : public gin::Wrappable<MessageChannel>,
const ppapi::ScopedPPVar& result_var,
bool success);
+ // Drain the queue of messages that are going to the plugin. All "completed"
+ // messages at the head of the queue will be sent; any messages awaiting
+ // conversion as well as messages after that in the queue will not be sent.
void DrainCompletedPluginMessages();
- void DrainEarlyMessageQueue();
+ // Drain the queue of messages that are going to JavaScript.
+ void DrainJSMessageQueue();
+ // PostTask to call DrainJSMessageQueue() soon. Use this when you want to
+ // send the messages, but can't immediately (e.g., because the instance is
+ // not ready or JavaScript is on the stack).
+ void DrainJSMessageQueueSoon();
+
+ void UnregisterSyncMessageStatusObserver();
PepperPluginInstanceImpl* instance_;
@@ -134,12 +151,21 @@ class MessageChannel : public gin::Wrappable<MessageChannel>,
// scripting.
v8::Persistent<v8::Object> passthrough_object_;
- std::deque<blink::WebSerializedScriptValue> early_message_queue_;
- enum EarlyMessageQueueState {
- QUEUE_MESSAGES, // Queue JS messages.
- SEND_DIRECTLY, // Post JS messages directly.
+ enum MessageQueueState {
+ WAITING_TO_START, // Waiting for Start() to be called. Queue messages.
+ QUEUE_MESSAGES, // Queue messages temporarily.
+ SEND_DIRECTLY, // Post messages directly.
};
- EarlyMessageQueueState early_message_queue_state_;
+
+ // This queue stores values being posted to JavaScript.
+ std::deque<blink::WebSerializedScriptValue> js_message_queue_;
+ MessageQueueState js_message_queue_state_;
+ // When the renderer is sending a blocking message to the plugin, we will
+ // queue Plugin->JS messages temporarily to avoid re-entering JavaScript. This
+ // counts how many blocking renderer->plugin messages are on the stack so that
+ // we only begin sending messages to JavaScript again when the depth reaches
+ // zero.
+ int blocking_message_depth_;
// This queue stores vars that are being sent to the plugin. Because
// conversion can happen asynchronously for object types, the queue stores
@@ -150,9 +176,14 @@ class MessageChannel : public gin::Wrappable<MessageChannel>,
// calls to push_back or pop_front; hence why we're using list. (deque would
// probably also work, but is less clearly specified).
std::list<VarConversionResult> plugin_message_queue_;
+ MessageQueueState plugin_message_queue_state_;
std::map<std::string, ppapi::ScopedPPVar> internal_named_properties_;
+ // A callback to invoke at shutdown to ensure we unregister ourselves as
+ // Observers for sync messages.
+ base::Closure unregister_observer_callback_;
+
// This is used to ensure pending tasks will not fire after this object is
// destroyed.
base::WeakPtrFactory<MessageChannel> weak_ptr_factory_;
« no previous file with comments | « content/renderer/pepper/host_dispatcher_wrapper.cc ('k') | content/renderer/pepper/message_channel.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698