Index: webkit/plugins/ppapi/message_channel.cc |
diff --git a/webkit/plugins/ppapi/message_channel.cc b/webkit/plugins/ppapi/message_channel.cc |
index f13911495eefa7155718377475590780d410b174..3ef05970bb42430a430dbc440639e0578a20d140 100644 |
--- a/webkit/plugins/ppapi/message_channel.cc |
+++ b/webkit/plugins/ppapi/message_channel.cc |
@@ -1,4 +1,4 @@ |
-// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
+// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
@@ -46,9 +46,14 @@ const char kPostMessage[] = "postMessage"; |
// Helper function to get the MessageChannel that is associated with an |
// NPObject*. |
-MessageChannel& ToMessageChannel(NPObject* object) { |
- return *(static_cast<MessageChannel::MessageChannelNPObject*>(object)-> |
- message_channel); |
+MessageChannel* ToMessageChannel(NPObject* object) { |
+ return static_cast<MessageChannel::MessageChannelNPObject*>(object)-> |
+ message_channel; |
+} |
+ |
+NPObject* ToPassThroughObject(NPObject* object) { |
+ MessageChannel* channel = ToMessageChannel(object); |
+ return channel ? channel->passthrough_object() : NULL; |
} |
// Helper function to determine if a given identifier is equal to kPostMessage. |
@@ -173,7 +178,7 @@ bool MessageChannelHasMethod(NPObject* np_obj, NPIdentifier name) { |
return true; |
// Other method names we will pass to the passthrough object, if we have one. |
- NPObject* passthrough = ToMessageChannel(np_obj).passthrough_object(); |
+ NPObject* passthrough = ToPassThroughObject(np_obj); |
if (passthrough) |
return WebBindings::hasMethod(NULL, passthrough, name); |
return false; |
@@ -187,14 +192,18 @@ bool MessageChannelInvoke(NPObject* np_obj, NPIdentifier name, |
// We only handle a function called postMessage. |
if (IdentifierIsPostMessage(name) && (arg_count == 1)) { |
- MessageChannel& message_channel(ToMessageChannel(np_obj)); |
- PP_Var argument(NPVariantToPPVar(message_channel.instance(), &args[0])); |
- message_channel.PostMessageToNative(argument); |
- PpapiGlobals::Get()->GetVarTracker()->ReleaseVar(argument); |
- return true; |
+ MessageChannel* message_channel = ToMessageChannel(np_obj); |
+ if (message_channel) { |
+ PP_Var argument(NPVariantToPPVar(message_channel->instance(), &args[0])); |
+ message_channel->PostMessageToNative(argument); |
+ PpapiGlobals::Get()->GetVarTracker()->ReleaseVar(argument); |
+ return true; |
+ } else { |
+ return false; |
+ } |
} |
// Other method calls we will pass to the passthrough object, if we have one. |
- NPObject* passthrough = ToMessageChannel(np_obj).passthrough_object(); |
+ NPObject* passthrough = ToPassThroughObject(np_obj); |
if (passthrough) { |
return WebBindings::invoke(NULL, passthrough, name, args, arg_count, |
result); |
@@ -210,7 +219,7 @@ bool MessageChannelInvokeDefault(NPObject* np_obj, |
return false; |
// Invoke on the passthrough object, if we have one. |
- NPObject* passthrough = ToMessageChannel(np_obj).passthrough_object(); |
+ NPObject* passthrough = ToPassThroughObject(np_obj); |
if (passthrough) { |
return WebBindings::invokeDefault(NULL, passthrough, args, arg_count, |
result); |
@@ -223,7 +232,7 @@ bool MessageChannelHasProperty(NPObject* np_obj, NPIdentifier name) { |
return false; |
// Invoke on the passthrough object, if we have one. |
- NPObject* passthrough = ToMessageChannel(np_obj).passthrough_object(); |
+ NPObject* passthrough = ToPassThroughObject(np_obj); |
if (passthrough) |
return WebBindings::hasProperty(NULL, passthrough, name); |
return false; |
@@ -239,7 +248,7 @@ bool MessageChannelGetProperty(NPObject* np_obj, NPIdentifier name, |
return false; |
// Invoke on the passthrough object, if we have one. |
- NPObject* passthrough = ToMessageChannel(np_obj).passthrough_object(); |
+ NPObject* passthrough = ToPassThroughObject(np_obj); |
if (passthrough) |
return WebBindings::getProperty(NULL, passthrough, name, result); |
return false; |
@@ -255,7 +264,7 @@ bool MessageChannelSetProperty(NPObject* np_obj, NPIdentifier name, |
return false; |
// Invoke on the passthrough object, if we have one. |
- NPObject* passthrough = ToMessageChannel(np_obj).passthrough_object(); |
+ NPObject* passthrough = ToPassThroughObject(np_obj); |
if (passthrough) |
return WebBindings::setProperty(NULL, passthrough, name, variant); |
return false; |
@@ -268,7 +277,7 @@ bool MessageChannelEnumerate(NPObject *np_obj, NPIdentifier **value, |
// Invoke on the passthrough object, if we have one, to enumerate its |
// properties. |
- NPObject* passthrough = ToMessageChannel(np_obj).passthrough_object(); |
+ NPObject* passthrough = ToPassThroughObject(np_obj); |
if (passthrough) { |
bool success = WebBindings::enumerate(NULL, passthrough, value, count); |
if (success) { |
@@ -312,8 +321,7 @@ NPClass message_channel_class = { |
} // namespace |
// MessageChannel -------------------------------------------------------------- |
-MessageChannel::MessageChannelNPObject::MessageChannelNPObject() |
- : message_channel(NULL) { |
+MessageChannel::MessageChannelNPObject::MessageChannelNPObject() { |
} |
MessageChannel::MessageChannelNPObject::~MessageChannelNPObject() {} |
@@ -328,7 +336,7 @@ MessageChannel::MessageChannel(PluginInstance* instance) |
NPObject* obj = WebBindings::createObject(NULL, &message_channel_class); |
DCHECK(obj); |
np_object_ = static_cast<MessageChannel::MessageChannelNPObject*>(obj); |
- np_object_->message_channel = this; |
+ np_object_->message_channel = weak_ptr_factory_.GetWeakPtr(); |
} |
void MessageChannel::PostMessageToJavaScript(PP_Var message_data) { |