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

Side by Side Diff: webkit/plugins/ppapi/message_channel.cc

Issue 16140011: Don't send PP_Vars/V8 values with cycles across PostMessage (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 6 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "webkit/plugins/ppapi/message_channel.h" 5 #include "webkit/plugins/ppapi/message_channel.h"
6 6
7 #include <cstdlib> 7 #include <cstdlib>
8 #include <string> 8 #include <string>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 27 matching lines...) Expand all
38 using WebKit::WebPluginContainer; 38 using WebKit::WebPluginContainer;
39 using WebKit::WebSerializedScriptValue; 39 using WebKit::WebSerializedScriptValue;
40 40
41 namespace webkit { 41 namespace webkit {
42 42
43 namespace ppapi { 43 namespace ppapi {
44 44
45 namespace { 45 namespace {
46 46
47 const char kPostMessage[] = "postMessage"; 47 const char kPostMessage[] = "postMessage";
48 const char kV8ToVarConversionError[] = "Failed to convert a PostMessage "
49 "argument from a JavaScript value to a PP_Var. It may have cycles or be of "
50 "an unsupported type.";
51 const char kVarToV8ConversionError[] = "Failed to convert a PostMessage "
52 "argument from a PP_Var to a Javascript value. It may have cycles or be of "
53 "an unsupported type.";
48 54
49 // Helper function to get the MessageChannel that is associated with an 55 // Helper function to get the MessageChannel that is associated with an
50 // NPObject*. 56 // NPObject*.
51 MessageChannel* ToMessageChannel(NPObject* object) { 57 MessageChannel* ToMessageChannel(NPObject* object) {
52 return static_cast<MessageChannel::MessageChannelNPObject*>(object)-> 58 return static_cast<MessageChannel::MessageChannelNPObject*>(object)->
53 message_channel.get(); 59 message_channel.get();
54 } 60 }
55 61
56 NPObject* ToPassThroughObject(NPObject* object) { 62 NPObject* ToPassThroughObject(NPObject* object) {
57 MessageChannel* channel = ToMessageChannel(object); 63 MessageChannel* channel = ToMessageChannel(object);
(...skipping 20 matching lines...) Expand all
78 *result = PP_MakeInt32(NPVARIANT_TO_INT32(*variant)); 84 *result = PP_MakeInt32(NPVARIANT_TO_INT32(*variant));
79 return true; 85 return true;
80 case NPVariantType_Double: 86 case NPVariantType_Double:
81 *result = PP_MakeDouble(NPVARIANT_TO_DOUBLE(*variant)); 87 *result = PP_MakeDouble(NPVARIANT_TO_DOUBLE(*variant));
82 return true; 88 return true;
83 case NPVariantType_String: 89 case NPVariantType_String:
84 *result = StringVar::StringToPPVar( 90 *result = StringVar::StringToPPVar(
85 NPVARIANT_TO_STRING(*variant).UTF8Characters, 91 NPVARIANT_TO_STRING(*variant).UTF8Characters,
86 NPVARIANT_TO_STRING(*variant).UTF8Length); 92 NPVARIANT_TO_STRING(*variant).UTF8Length);
87 return true; 93 return true;
88 case NPVariantType_Object: 94 case NPVariantType_Object: {
89 V8VarConverter converter;
90 // Calling WebBindings::toV8Value creates a wrapper around NPVariant so it 95 // Calling WebBindings::toV8Value creates a wrapper around NPVariant so it
91 // shouldn't result in a deep copy. 96 // shouldn't result in a deep copy.
92 return converter.FromV8Value(WebBindings::toV8Value(variant), 97 v8::Handle<v8::Value> v8_value = WebBindings::toV8Value(variant);
93 v8::Context::GetCurrent(), result); 98 if (!V8VarConverter::FromV8Value(v8_value, v8::Context::GetCurrent(),
99 result)) {
100 return false;
101 }
102 return true;
103 }
94 } 104 }
95 return false; 105 return false;
96 } 106 }
97 107
98 // Copy a PP_Var in to a PP_Var that is appropriate for sending via postMessage. 108 // Copy a PP_Var in to a PP_Var that is appropriate for sending via postMessage.
99 // This currently just copies the value. For a string Var, the result is a 109 // This currently just copies the value. For a string Var, the result is a
100 // PP_Var with the a copy of |var|'s string contents and a reference count of 1. 110 // PP_Var with the a copy of |var|'s string contents and a reference count of 1.
101 PP_Var CopyPPVar(const PP_Var& var) { 111 PP_Var CopyPPVar(const PP_Var& var) {
102 switch (var.type) { 112 switch (var.type) {
103 case PP_VARTYPE_UNDEFINED: 113 case PP_VARTYPE_UNDEFINED:
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
175 NPVariant* result) { 185 NPVariant* result) {
176 if (!np_obj) 186 if (!np_obj)
177 return false; 187 return false;
178 188
179 // We only handle a function called postMessage. 189 // We only handle a function called postMessage.
180 if (IdentifierIsPostMessage(name) && (arg_count == 1)) { 190 if (IdentifierIsPostMessage(name) && (arg_count == 1)) {
181 MessageChannel* message_channel = ToMessageChannel(np_obj); 191 MessageChannel* message_channel = ToMessageChannel(np_obj);
182 if (message_channel) { 192 if (message_channel) {
183 PP_Var argument = PP_MakeUndefined(); 193 PP_Var argument = PP_MakeUndefined();
184 if (!NPVariantToPPVar(&args[0], &argument)) { 194 if (!NPVariantToPPVar(&args[0], &argument)) {
185 NOTREACHED(); 195 PpapiGlobals::Get()->LogWithSource(
196 message_channel->instance()->pp_instance(),
197 PP_LOGLEVEL_ERROR, std::string(), kV8ToVarConversionError);
186 return false; 198 return false;
187 } 199 }
188 message_channel->PostMessageToNative(argument); 200 message_channel->PostMessageToNative(argument);
189 PpapiGlobals::Get()->GetVarTracker()->ReleaseVar(argument); 201 PpapiGlobals::Get()->GetVarTracker()->ReleaseVar(argument);
190 return true; 202 return true;
191 } else { 203 } else {
192 return false; 204 return false;
193 } 205 }
194 } 206 }
195 // Other method calls we will pass to the passthrough object, if we have one. 207 // Other method calls we will pass to the passthrough object, if we have one.
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
339 WebPluginContainer* container = instance_->container(); 351 WebPluginContainer* container = instance_->container();
340 // It's possible that container() is NULL if the plugin has been removed from 352 // It's possible that container() is NULL if the plugin has been removed from
341 // the DOM (but the PluginInstance is not destroyed yet). 353 // the DOM (but the PluginInstance is not destroyed yet).
342 if (!container) 354 if (!container)
343 return; 355 return;
344 356
345 v8::Local<v8::Context> context = 357 v8::Local<v8::Context> context =
346 container->element().document().frame()->mainWorldScriptContext(); 358 container->element().document().frame()->mainWorldScriptContext();
347 v8::Context::Scope context_scope(context); 359 v8::Context::Scope context_scope(context);
348 360
349 v8::Local<v8::Value> v8_val; 361 v8::Handle<v8::Value> v8_val;
350 V8VarConverter converter; 362 if (!V8VarConverter::ToV8Value(message_data, context, &v8_val)) {
351 if (!converter.ToV8Value(message_data, context, &v8_val)) { 363 PpapiGlobals::Get()->LogWithSource(instance_->pp_instance(),
352 NOTREACHED(); 364 PP_LOGLEVEL_ERROR, std::string(), kVarToV8ConversionError);
353 return; 365 return;
354 } 366 }
355 367
356 // This is for backward compatibility. It usually makes sense for us to return 368 // This is for backward compatibility. It usually makes sense for us to return
357 // a string object rather than a string primitive because it allows multiple 369 // a string object rather than a string primitive because it allows multiple
358 // references to the same string (as with PP_Var strings). However, prior to 370 // references to the same string (as with PP_Var strings). However, prior to
359 // implementing dictionary and array, vars we would return a string primitive 371 // implementing dictionary and array, vars we would return a string primitive
360 // here. Changing it to an object now will break existing code that uses 372 // here. Changing it to an object now will break existing code that uses
361 // strict comparisons for strings returned from PostMessage. e.g. x === "123" 373 // strict comparisons for strings returned from PostMessage. e.g. x === "123"
362 // will no longer return true. So if the only value to return is a string 374 // will no longer return true. So if the only value to return is a string
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after
496 // invokes: 508 // invokes:
497 // SetPassthroughObject(passthrough_object()); 509 // SetPassthroughObject(passthrough_object());
498 if (passthrough_object_) 510 if (passthrough_object_)
499 WebBindings::releaseObject(passthrough_object_); 511 WebBindings::releaseObject(passthrough_object_);
500 512
501 passthrough_object_ = passthrough; 513 passthrough_object_ = passthrough;
502 } 514 }
503 515
504 } // namespace ppapi 516 } // namespace ppapi
505 } // namespace webkit 517 } // namespace webkit
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698