Index: content/renderer/pepper/message_channel.h |
diff --git a/content/renderer/pepper/message_channel.h b/content/renderer/pepper/message_channel.h |
index 8c744a044191c5003dc6cc29102803523b9a1f9d..e038fdc76048615898ec8f74178150b4b542f83f 100644 |
--- a/content/renderer/pepper/message_channel.h |
+++ b/content/renderer/pepper/message_channel.h |
@@ -9,20 +9,29 @@ |
#include <list> |
#include <map> |
+#include "base/basictypes.h" |
#include "base/memory/weak_ptr.h" |
+#include "gin/handle.h" |
+#include "gin/interceptor.h" |
+#include "gin/wrappable.h" |
#include "ppapi/shared_impl/resource.h" |
#include "third_party/WebKit/public/web/WebSerializedScriptValue.h" |
-#include "third_party/npapi/bindings/npruntime.h" |
+#include "v8/include/v8.h" |
struct PP_Var; |
+namespace gin { |
+class Arguments; |
+} // namespace gin |
+ |
namespace ppapi { |
class ScopedPPVar; |
-} |
+} // namespace ppapi |
namespace content { |
class PepperPluginInstanceImpl; |
+class PluginObject; |
// MessageChannel implements bidirectional postMessage functionality, allowing |
// calls from JavaScript to plugins and vice-versa. See |
@@ -37,63 +46,86 @@ class PepperPluginInstanceImpl; |
// - 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 { |
+class MessageChannel : public gin::Wrappable<MessageChannel>, |
+ public gin::NamedPropertyInterceptor, |
+ public gin::IndexedPropertyInterceptor { |
public: |
- // MessageChannelNPObject is a simple struct that adds a pointer back to a |
- // MessageChannel instance. This way, we can use an NPObject to allow |
- // JavaScript interactions without forcing MessageChannel to inherit from |
- // NPObject. |
- struct MessageChannelNPObject : public NPObject { |
- MessageChannelNPObject(); |
- ~MessageChannelNPObject(); |
- |
- base::WeakPtr<MessageChannel> message_channel; |
- }; |
- |
- explicit MessageChannel(PepperPluginInstanceImpl* instance); |
- ~MessageChannel(); |
+ static gin::WrapperInfo kWrapperInfo; |
+ |
+ static void Create(PepperPluginInstanceImpl* instance, |
+ v8::Persistent<v8::Object>* result); |
+ |
+ virtual ~MessageChannel(); |
+ |
+ // gin::NamedPropertyInterceptor |
+ virtual v8::Local<v8::Value> GetNamedProperty( |
+ v8::Isolate* isolate, |
+ const std::string& property) OVERRIDE; |
+ virtual void SetNamedProperty(v8::Isolate* isolate, |
+ const std::string& property, |
+ v8::Local<v8::Value> value) OVERRIDE; |
+ virtual std::vector<std::string> EnumerateNamedProperties( |
+ v8::Isolate* isolate) OVERRIDE; |
+ |
+ // gin::IndexedPropertyInterceptor |
+ virtual v8::Local<v8::Value> GetIndexedProperty(v8::Isolate* isolate, |
+ uint32_t index) OVERRIDE; |
+ virtual void SetIndexedProperty(v8::Isolate* isolate, |
+ uint32_t index, |
+ v8::Local<v8::Value> value) OVERRIDE; |
+ virtual std::vector<uint32_t> EnumerateIndexedProperties( |
+ v8::Isolate* isolate) OVERRIDE; |
// Post a message to the onmessage handler for this channel's instance |
// asynchronously. |
void PostMessageToJavaScript(PP_Var message_data); |
- // Post a message to the plugin's HandleMessage function for this channel's |
- // instance. |
- void PostMessageToNative(const NPVariant* message_data); |
- // Post a message to the plugin's HandleBlocking Message function for this |
- // channel's instance synchronously, and return a result. |
- void PostBlockingMessageToNative(const NPVariant* message_data, |
- NPVariant* np_result); |
+ // Messages are queued initially. After the PepperPluginInstanceImpl is ready |
+ // to send and handle messages, users of MessageChannel should call |
+ // Start(). |
+ void Start(); |
- // Return the NPObject* to which we should forward any calls which aren't |
- // related to postMessage. Note that this can be NULL; it only gets set if |
+ // Set the V8Object to which we should forward any calls which aren't |
+ // related to postMessage. Note that this can be empty; it only gets set if |
// there is a scriptable 'InstanceObject' associated with this channel's |
// instance. |
- NPObject* passthrough_object() { return passthrough_object_; } |
- void SetPassthroughObject(NPObject* passthrough); |
- |
- NPObject* np_object() { return np_object_; } |
+ void SetPassthroughObject(v8::Handle<v8::Object> passthrough); |
PepperPluginInstanceImpl* instance() { return instance_; } |
- // Messages are queued initially. After the PepperPluginInstanceImpl is ready |
- // to send and handle messages, users of MessageChannel should call |
- // Start(). |
- void Start(); |
- |
- bool GetReadOnlyProperty(NPIdentifier key, NPVariant* value) const; |
void SetReadOnlyProperty(PP_Var key, PP_Var value); |
private: |
- // Struct for storing the result of a NPVariant being converted to a PP_Var. |
+ // Struct for storing the result of a v8 object being converted to a PP_Var. |
struct VarConversionResult; |
- void EnqueuePluginMessage(const NPVariant* variant); |
+ explicit MessageChannel(PepperPluginInstanceImpl* instance); |
+ |
+ // gin::Wrappable |
+ virtual gin::ObjectTemplateBuilder GetObjectTemplateBuilder( |
+ v8::Isolate* isolate) OVERRIDE; |
+ |
+ // Post a message to the plugin's HandleMessage function for this channel's |
+ // instance. |
+ void PostMessageToNative(gin::Arguments* args); |
+ // Post a message to the plugin's HandleBlocking Message function for this |
+ // channel's instance synchronously, and return a result. |
+ void PostBlockingMessageToNative(gin::Arguments* args); |
+ |
+ PluginObject* GetPluginObject(v8::Isolate* isolate); |
+ |
+ void EnqueuePluginMessage(v8::Handle<v8::Value> v8_value); |
void FromV8ValueComplete(VarConversionResult* result_holder, |
const ppapi::ScopedPPVar& result_var, |
bool success); |
void DrainCompletedPluginMessages(); |
+ void DrainEarlyMessageQueue(); |
+ |
+ // Post a message to the onmessage handler for this channel's instance |
+ // synchronously. This is used by PostMessageToJavaScript. |
+ void PostMessageToJavaScriptImpl( |
+ const blink::WebSerializedScriptValue& message_data); |
PepperPluginInstanceImpl* instance_; |
@@ -102,20 +134,7 @@ class MessageChannel { |
// postMessage. This is necessary to support backwards-compatibility, and |
// also trusted plugins for which we will continue to support synchronous |
// scripting. |
- NPObject* passthrough_object_; |
- |
- // The NPObject we use to expose postMessage to JavaScript. |
- MessageChannelNPObject* np_object_; |
- |
- // Post a message to the onmessage handler for this channel's instance |
- // synchronously. This is used by PostMessageToJavaScript. |
- void PostMessageToJavaScriptImpl( |
- const blink::WebSerializedScriptValue& message_data); |
- // Post a message to the PPP_Instance HandleMessage function for this |
- // channel's instance. This is used by PostMessageToNative. |
- void PostMessageToNativeImpl(PP_Var message_data); |
- |
- void DrainEarlyMessageQueue(); |
+ v8::Persistent<v8::Object> passthrough_object_; |
std::deque<blink::WebSerializedScriptValue> early_message_queue_; |
enum EarlyMessageQueueState { |
@@ -134,7 +153,8 @@ class MessageChannel { |
// probably also work, but is less clearly specified). |
std::list<VarConversionResult> plugin_message_queue_; |
- std::map<NPIdentifier, ppapi::ScopedPPVar> internal_properties_; |
+ std::map<std::string, ppapi::ScopedPPVar> internal_named_properties_; |
+ std::map<uint32_t, ppapi::ScopedPPVar> internal_indexed_properties_; |
// This is used to ensure pending tasks will not fire after this object is |
// destroyed. |
@@ -146,3 +166,4 @@ class MessageChannel { |
} // namespace content |
#endif // CONTENT_RENDERER_PEPPER_MESSAGE_CHANNEL_H_ |
+ |