diff options
Diffstat (limited to 'content/renderer/pepper/message_channel.h')
-rw-r--r-- | content/renderer/pepper/message_channel.h | 43 |
1 files changed, 35 insertions, 8 deletions
diff --git a/content/renderer/pepper/message_channel.h b/content/renderer/pepper/message_channel.h index 3caef26..daf2e53 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,6 +176,7 @@ 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_; |