| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 "ppapi/proxy/serialized_var.h" | 5 #include "ppapi/proxy/serialized_var.h" |
| 6 | 6 |
| 7 #include "base/logging.h" | 7 #include "base/logging.h" |
| 8 #include "ipc/ipc_message_utils.h" | 8 #include "ipc/ipc_message_utils.h" |
| 9 #include "ppapi/proxy/dispatcher.h" | 9 #include "ppapi/proxy/dispatcher.h" |
| 10 #include "ppapi/proxy/interface_proxy.h" | 10 #include "ppapi/proxy/interface_proxy.h" |
| 11 #include "ppapi/proxy/ppapi_param_traits.h" | 11 #include "ppapi/proxy/ppapi_param_traits.h" |
| 12 #include "ppapi/proxy/var_serialization_rules.h" | 12 #include "ppapi/proxy/var_serialization_rules.h" |
| 13 | 13 |
| 14 namespace ppapi { | 14 namespace ppapi { |
| 15 namespace proxy { | 15 namespace proxy { |
| 16 | 16 |
| 17 // SerializedVar::Inner -------------------------------------------------------- | 17 // SerializedVar::Inner -------------------------------------------------------- |
| 18 | 18 |
| 19 SerializedVar::Inner::Inner() | 19 SerializedVar::Inner::Inner() |
| 20 : serialization_rules_(NULL), | 20 : serialization_rules_(NULL), |
| 21 var_(PP_MakeUndefined()), | 21 var_(PP_MakeUndefined()), |
| 22 tracker_string_ptr_(NULL), |
| 22 cleanup_mode_(CLEANUP_NONE), | 23 cleanup_mode_(CLEANUP_NONE), |
| 23 dispatcher_for_end_send_pass_ref_(NULL) { | 24 dispatcher_for_end_send_pass_ref_(NULL) { |
| 24 #ifndef NDEBUG | 25 #ifndef NDEBUG |
| 25 has_been_serialized_ = false; | 26 has_been_serialized_ = false; |
| 26 has_been_deserialized_ = false; | 27 has_been_deserialized_ = false; |
| 27 #endif | 28 #endif |
| 28 } | 29 } |
| 29 | 30 |
| 30 SerializedVar::Inner::Inner(VarSerializationRules* serialization_rules) | 31 SerializedVar::Inner::Inner(VarSerializationRules* serialization_rules) |
| 31 : serialization_rules_(serialization_rules), | 32 : serialization_rules_(serialization_rules), |
| 32 var_(PP_MakeUndefined()), | 33 var_(PP_MakeUndefined()), |
| 34 tracker_string_ptr_(NULL), |
| 33 cleanup_mode_(CLEANUP_NONE), | 35 cleanup_mode_(CLEANUP_NONE), |
| 34 dispatcher_for_end_send_pass_ref_(NULL) { | 36 dispatcher_for_end_send_pass_ref_(NULL) { |
| 35 #ifndef NDEBUG | 37 #ifndef NDEBUG |
| 36 has_been_serialized_ = false; | |
| 37 has_been_deserialized_ = false; | |
| 38 #endif | |
| 39 } | |
| 40 | |
| 41 SerializedVar::Inner::Inner(VarSerializationRules* serialization_rules, | |
| 42 const PP_Var& var) | |
| 43 : serialization_rules_(serialization_rules), | |
| 44 var_(var), | |
| 45 cleanup_mode_(CLEANUP_NONE), | |
| 46 dispatcher_for_end_send_pass_ref_(NULL) { | |
| 47 #ifndef NDEBUG | |
| 48 has_been_serialized_ = false; | 38 has_been_serialized_ = false; |
| 49 has_been_deserialized_ = false; | 39 has_been_deserialized_ = false; |
| 50 #endif | 40 #endif |
| 51 } | 41 } |
| 52 | 42 |
| 53 SerializedVar::Inner::~Inner() { | 43 SerializedVar::Inner::~Inner() { |
| 54 switch (cleanup_mode_) { | 44 switch (cleanup_mode_) { |
| 55 case END_SEND_PASS_REF: | 45 case END_SEND_PASS_REF: |
| 56 DCHECK(dispatcher_for_end_send_pass_ref_); | 46 DCHECK(dispatcher_for_end_send_pass_ref_); |
| 57 serialization_rules_->EndSendPassRef(var_, | 47 serialization_rules_->EndSendPassRef(var_, |
| (...skipping 21 matching lines...) Expand all Loading... |
| 79 return var_; | 69 return var_; |
| 80 } | 70 } |
| 81 | 71 |
| 82 void SerializedVar::Inner::SetVar(PP_Var var) { | 72 void SerializedVar::Inner::SetVar(PP_Var var) { |
| 83 // Sanity check, when updating the var we should have received a | 73 // Sanity check, when updating the var we should have received a |
| 84 // serialization rules pointer already. | 74 // serialization rules pointer already. |
| 85 DCHECK(serialization_rules_); | 75 DCHECK(serialization_rules_); |
| 86 var_ = var; | 76 var_ = var; |
| 87 } | 77 } |
| 88 | 78 |
| 89 const std::string& SerializedVar::Inner::GetString() const { | 79 scoped_ptr<std::string> SerializedVar::Inner::GetStringDestructive() { |
| 90 DCHECK(serialization_rules_); | 80 DCHECK(serialization_rules_); |
| 91 return string_value_; | 81 return string_from_ipc_.Pass(); |
| 92 } | 82 } |
| 93 | 83 |
| 94 std::string* SerializedVar::Inner::GetStringPtr() { | 84 const std::string** SerializedVar::Inner::GetStringPtrPtr() { |
| 95 DCHECK(serialization_rules_); | 85 DCHECK(serialization_rules_); |
| 96 return &string_value_; | 86 // The caller will set our string pointer, and we promise not to change it. |
| 87 // This path is taken for the "Send" side of SerializedVars, and we will only |
| 88 // read the string in those cases, so it's safe for us to point directly to a |
| 89 // string in the VarTracker. |
| 90 return &tracker_string_ptr_; |
| 97 } | 91 } |
| 98 | 92 |
| 99 void SerializedVar::Inner::ForceSetVarValueForTest(PP_Var value) { | 93 void SerializedVar::Inner::ForceSetVarValueForTest(PP_Var value) { |
| 100 var_ = value; | 94 var_ = value; |
| 101 } | 95 } |
| 102 | 96 |
| 103 void SerializedVar::Inner::ForceSetStringValueForTest(const std::string& str) { | 97 void SerializedVar::Inner::ForceSetStringValueForTest(const std::string& str) { |
| 104 string_value_ = str; | 98 // We don't need to change tracker_string_ptr_, as that is only used for |
| 99 // serializing, and we're emulating a SerializedVar that was received from |
| 100 // IPC. |
| 101 string_from_ipc_.reset(new std::string(str)); |
| 105 } | 102 } |
| 106 | 103 |
| 107 void SerializedVar::Inner::WriteToMessage(IPC::Message* m) const { | 104 void SerializedVar::Inner::WriteToMessage(IPC::Message* m) const { |
| 108 // When writing to the IPC messages, a serization rules handler should | 105 // When writing to the IPC messages, a serization rules handler should |
| 109 // always have been set. | 106 // always have been set. |
| 110 // | 107 // |
| 111 // When sending a message, it should be difficult to trigger this if you're | 108 // When sending a message, it should be difficult to trigger this if you're |
| 112 // using the SerializedVarSendInput class and giving a non-NULL dispatcher. | 109 // using the SerializedVarSendInput class and giving a non-NULL dispatcher. |
| 113 // Make sure you're using the proper "Send" helper class. | 110 // Make sure you're using the proper "Send" helper class. |
| 114 // | 111 // |
| 115 // It should be more common to see this when handling an incoming message | 112 // It should be more common to see this when handling an incoming message |
| 116 // that returns a var. This means the message handler didn't write to the | 113 // that returns a var. This means the message handler didn't write to the |
| 117 // output parameter, or possibly you used the wrong helper class | 114 // output parameter, or possibly you used the wrong helper class |
| 118 // (normally SerializedVarReturnValue). | 115 // (normally SerializedVarReturnValue). |
| 119 DCHECK(serialization_rules_); | 116 DCHECK(serialization_rules_); |
| 120 | 117 |
| 121 #ifndef NDEBUG | 118 #ifndef NDEBUG |
| 122 // We should only be serializing something once. | 119 // We should only be serializing something once. |
| 123 DCHECK(!has_been_serialized_); | 120 DCHECK(!has_been_serialized_); |
| 124 has_been_serialized_ = true; | 121 has_been_serialized_ = true; |
| 125 #endif | 122 #endif |
| 126 | 123 |
| 127 // If the var is not a string type, we should not have ended up with any | 124 // If the var is not a string type, we should not have ended up with any |
| 128 // string data. | 125 // string data. |
| 129 DCHECK(var_.type == PP_VARTYPE_STRING || string_value_.empty()); | 126 DCHECK(var_.type == PP_VARTYPE_STRING || !tracker_string_ptr_); |
| 130 | 127 |
| 131 m->WriteInt(static_cast<int>(var_.type)); | 128 m->WriteInt(static_cast<int>(var_.type)); |
| 132 switch (var_.type) { | 129 switch (var_.type) { |
| 133 case PP_VARTYPE_UNDEFINED: | 130 case PP_VARTYPE_UNDEFINED: |
| 134 case PP_VARTYPE_NULL: | 131 case PP_VARTYPE_NULL: |
| 135 // These don't need any data associated with them other than the type we | 132 // These don't need any data associated with them other than the type we |
| 136 // just serialized. | 133 // just serialized. |
| 137 break; | 134 break; |
| 138 case PP_VARTYPE_BOOL: | 135 case PP_VARTYPE_BOOL: |
| 139 m->WriteBool(PP_ToBool(var_.value.as_bool)); | 136 m->WriteBool(PP_ToBool(var_.value.as_bool)); |
| 140 break; | 137 break; |
| 141 case PP_VARTYPE_INT32: | 138 case PP_VARTYPE_INT32: |
| 142 m->WriteInt(var_.value.as_int); | 139 m->WriteInt(var_.value.as_int); |
| 143 break; | 140 break; |
| 144 case PP_VARTYPE_DOUBLE: | 141 case PP_VARTYPE_DOUBLE: |
| 145 IPC::ParamTraits<double>::Write(m, var_.value.as_double); | 142 IPC::ParamTraits<double>::Write(m, var_.value.as_double); |
| 146 break; | 143 break; |
| 147 case PP_VARTYPE_STRING: | 144 case PP_VARTYPE_STRING: |
| 148 // TODO(brettw) in the case of an invalid string ID, it would be nice | 145 // TODO(brettw) in the case of an invalid string ID, it would be nice |
| 149 // to send something to the other side such that a 0 ID would be | 146 // to send something to the other side such that a 0 ID would be |
| 150 // generated there. Then the function implementing the interface can | 147 // generated there. Then the function implementing the interface can |
| 151 // handle the invalid string as if it was in process rather than seeing | 148 // handle the invalid string as if it was in process rather than seeing |
| 152 // what looks like a valid empty string. | 149 // what looks like a valid empty string. |
| 153 m->WriteString(string_value_); | 150 m->WriteString(tracker_string_ptr_ ? *tracker_string_ptr_ |
| 151 : std::string()); |
| 154 break; | 152 break; |
| 155 case PP_VARTYPE_ARRAY_BUFFER: | 153 case PP_VARTYPE_ARRAY_BUFFER: |
| 156 // TODO(dmichael): Proxy ArrayBuffer. | 154 // TODO(dmichael): Proxy ArrayBuffer. |
| 157 NOTIMPLEMENTED(); | 155 NOTIMPLEMENTED(); |
| 158 break; | 156 break; |
| 159 case PP_VARTYPE_OBJECT: | 157 case PP_VARTYPE_OBJECT: |
| 160 m->WriteInt64(var_.value.as_id); | 158 m->WriteInt64(var_.value.as_id); |
| 161 break; | 159 break; |
| 162 case PP_VARTYPE_ARRAY: | 160 case PP_VARTYPE_ARRAY: |
| 163 case PP_VARTYPE_DICTIONARY: | 161 case PP_VARTYPE_DICTIONARY: |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 200 var_.value.as_bool = PP_FromBool(bool_value); | 198 var_.value.as_bool = PP_FromBool(bool_value); |
| 201 break; | 199 break; |
| 202 } | 200 } |
| 203 case PP_VARTYPE_INT32: | 201 case PP_VARTYPE_INT32: |
| 204 success = m->ReadInt(iter, &var_.value.as_int); | 202 success = m->ReadInt(iter, &var_.value.as_int); |
| 205 break; | 203 break; |
| 206 case PP_VARTYPE_DOUBLE: | 204 case PP_VARTYPE_DOUBLE: |
| 207 success = IPC::ParamTraits<double>::Read(m, iter, &var_.value.as_double); | 205 success = IPC::ParamTraits<double>::Read(m, iter, &var_.value.as_double); |
| 208 break; | 206 break; |
| 209 case PP_VARTYPE_STRING: | 207 case PP_VARTYPE_STRING: |
| 210 success = m->ReadString(iter, &string_value_); | 208 DCHECK(!tracker_string_ptr_ && !string_from_ipc_.get()); |
| 209 string_from_ipc_.reset(new std::string); |
| 210 success = m->ReadString(iter, string_from_ipc_.get()); |
| 211 var_.value.as_id = 0; | 211 var_.value.as_id = 0; |
| 212 break; | 212 break; |
| 213 case PP_VARTYPE_OBJECT: | 213 case PP_VARTYPE_OBJECT: |
| 214 success = m->ReadInt64(iter, &var_.value.as_id); | 214 success = m->ReadInt64(iter, &var_.value.as_id); |
| 215 break; | 215 break; |
| 216 case PP_VARTYPE_ARRAY: | 216 case PP_VARTYPE_ARRAY: |
| 217 case PP_VARTYPE_DICTIONARY: | 217 case PP_VARTYPE_DICTIONARY: |
| 218 // TODO(brettw) when these types are supported, implement this. | 218 // TODO(brettw) when these types are supported, implement this. |
| 219 NOTIMPLEMENTED(); | 219 NOTIMPLEMENTED(); |
| 220 break; | 220 break; |
| (...skipping 24 matching lines...) Expand all Loading... |
| 245 | 245 |
| 246 // SerializedVar --------------------------------------------------------------- | 246 // SerializedVar --------------------------------------------------------------- |
| 247 | 247 |
| 248 SerializedVar::SerializedVar() : inner_(new Inner) { | 248 SerializedVar::SerializedVar() : inner_(new Inner) { |
| 249 } | 249 } |
| 250 | 250 |
| 251 SerializedVar::SerializedVar(VarSerializationRules* serialization_rules) | 251 SerializedVar::SerializedVar(VarSerializationRules* serialization_rules) |
| 252 : inner_(new Inner(serialization_rules)) { | 252 : inner_(new Inner(serialization_rules)) { |
| 253 } | 253 } |
| 254 | 254 |
| 255 SerializedVar::SerializedVar(VarSerializationRules* serialization_rules, | |
| 256 const PP_Var& var) | |
| 257 : inner_(new Inner(serialization_rules, var)) { | |
| 258 } | |
| 259 | |
| 260 SerializedVar::~SerializedVar() { | 255 SerializedVar::~SerializedVar() { |
| 261 } | 256 } |
| 262 | 257 |
| 263 // SerializedVarSendInput ------------------------------------------------------ | 258 // SerializedVarSendInput ------------------------------------------------------ |
| 264 | 259 |
| 265 SerializedVarSendInput::SerializedVarSendInput(Dispatcher* dispatcher, | 260 SerializedVarSendInput::SerializedVarSendInput(Dispatcher* dispatcher, |
| 266 const PP_Var& var) | 261 const PP_Var& var) |
| 267 : SerializedVar(dispatcher->serialization_rules()) { | 262 : SerializedVar(dispatcher->serialization_rules()) { |
| 268 inner_->SetVar(dispatcher->serialization_rules()->SendCallerOwned( | 263 inner_->SetVar(dispatcher->serialization_rules()->SendCallerOwned( |
| 269 var, inner_->GetStringPtr())); | 264 var, inner_->GetStringPtrPtr())); |
| 270 } | 265 } |
| 271 | 266 |
| 272 // static | 267 // static |
| 273 void SerializedVarSendInput::ConvertVector(Dispatcher* dispatcher, | 268 void SerializedVarSendInput::ConvertVector(Dispatcher* dispatcher, |
| 274 const PP_Var* input, | 269 const PP_Var* input, |
| 275 size_t input_count, | 270 size_t input_count, |
| 276 std::vector<SerializedVar>* output) { | 271 std::vector<SerializedVar>* output) { |
| 277 output->resize(input_count); | 272 output->reserve(input_count); |
| 278 for (size_t i = 0; i < input_count; i++) { | 273 for (size_t i = 0; i < input_count; i++) |
| 279 SerializedVar& cur = (*output)[i]; | 274 output->push_back(SerializedVarSendInput(dispatcher, input[i])); |
| 280 cur = SerializedVar(dispatcher->serialization_rules()); | |
| 281 cur.inner_->SetVar(dispatcher->serialization_rules()->SendCallerOwned( | |
| 282 input[i], cur.inner_->GetStringPtr())); | |
| 283 } | |
| 284 } | 275 } |
| 285 | 276 |
| 286 // ReceiveSerializedVarReturnValue --------------------------------------------- | 277 // ReceiveSerializedVarReturnValue --------------------------------------------- |
| 287 | 278 |
| 288 ReceiveSerializedVarReturnValue::ReceiveSerializedVarReturnValue() { | 279 ReceiveSerializedVarReturnValue::ReceiveSerializedVarReturnValue() { |
| 289 } | 280 } |
| 290 | 281 |
| 291 ReceiveSerializedVarReturnValue::ReceiveSerializedVarReturnValue( | 282 ReceiveSerializedVarReturnValue::ReceiveSerializedVarReturnValue( |
| 292 const SerializedVar& serialized) | 283 const SerializedVar& serialized) |
| 293 : SerializedVar(serialized) { | 284 : SerializedVar(serialized) { |
| 294 } | 285 } |
| 295 | 286 |
| 296 PP_Var ReceiveSerializedVarReturnValue::Return(Dispatcher* dispatcher) { | 287 PP_Var ReceiveSerializedVarReturnValue::Return(Dispatcher* dispatcher) { |
| 297 inner_->set_serialization_rules(dispatcher->serialization_rules()); | 288 inner_->set_serialization_rules(dispatcher->serialization_rules()); |
| 298 inner_->SetVar(inner_->serialization_rules()->ReceivePassRef( | 289 inner_->SetVar(inner_->serialization_rules()->ReceivePassRef( |
| 299 inner_->GetIncompleteVar(), inner_->GetString(), dispatcher)); | 290 inner_->GetIncompleteVar(), inner_->GetStringDestructive(), dispatcher)); |
| 300 return inner_->GetVar(); | 291 return inner_->GetVar(); |
| 301 } | 292 } |
| 302 | 293 |
| 303 // ReceiveSerializedException -------------------------------------------------- | 294 // ReceiveSerializedException -------------------------------------------------- |
| 304 | 295 |
| 305 ReceiveSerializedException::ReceiveSerializedException(Dispatcher* dispatcher, | 296 ReceiveSerializedException::ReceiveSerializedException(Dispatcher* dispatcher, |
| 306 PP_Var* exception) | 297 PP_Var* exception) |
| 307 : SerializedVar(dispatcher->serialization_rules()), | 298 : SerializedVar(dispatcher->serialization_rules()), |
| 308 dispatcher_(dispatcher), | 299 dispatcher_(dispatcher), |
| 309 exception_(exception) { | 300 exception_(exception) { |
| 310 } | 301 } |
| 311 | 302 |
| 312 ReceiveSerializedException::~ReceiveSerializedException() { | 303 ReceiveSerializedException::~ReceiveSerializedException() { |
| 313 if (exception_) { | 304 if (exception_) { |
| 314 // When an output exception is specified, it will take ownership of the | 305 // When an output exception is specified, it will take ownership of the |
| 315 // reference. | 306 // reference. |
| 316 inner_->SetVar(inner_->serialization_rules()->ReceivePassRef( | 307 inner_->SetVar( |
| 317 inner_->GetIncompleteVar(), inner_->GetString(), dispatcher_)); | 308 inner_->serialization_rules()->ReceivePassRef( |
| 309 inner_->GetIncompleteVar(), |
| 310 inner_->GetStringDestructive(), |
| 311 dispatcher_)); |
| 318 *exception_ = inner_->GetVar(); | 312 *exception_ = inner_->GetVar(); |
| 319 } else { | 313 } else { |
| 320 // When no output exception is specified, the browser thinks we have a ref | 314 // When no output exception is specified, the browser thinks we have a ref |
| 321 // to an object that we don't want (this will happen only in the plugin | 315 // to an object that we don't want (this will happen only in the plugin |
| 322 // since the browser will always specify an out exception for the plugin to | 316 // since the browser will always specify an out exception for the plugin to |
| 323 // write into). | 317 // write into). |
| 324 // | 318 // |
| 325 // Strings don't need this handling since we can just avoid creating a | 319 // Strings don't need this handling since we can just avoid creating a |
| 326 // Var from the std::string in the first place. | 320 // Var from the std::string in the first place. |
| 327 if (inner_->GetVar().type == PP_VARTYPE_OBJECT) | 321 if (inner_->GetVar().type == PP_VARTYPE_OBJECT) |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 381 serialized_.inner_->set_serialization_rules( | 375 serialized_.inner_->set_serialization_rules( |
| 382 dispatcher->serialization_rules()); | 376 dispatcher->serialization_rules()); |
| 383 | 377 |
| 384 // Ensure that when the serialized var goes out of scope it cleans up the | 378 // Ensure that when the serialized var goes out of scope it cleans up the |
| 385 // stuff we're making in BeginReceiveCallerOwned. | 379 // stuff we're making in BeginReceiveCallerOwned. |
| 386 serialized_.inner_->SetCleanupModeToEndReceiveCallerOwned(); | 380 serialized_.inner_->SetCleanupModeToEndReceiveCallerOwned(); |
| 387 | 381 |
| 388 serialized_.inner_->SetVar( | 382 serialized_.inner_->SetVar( |
| 389 serialized_.inner_->serialization_rules()->BeginReceiveCallerOwned( | 383 serialized_.inner_->serialization_rules()->BeginReceiveCallerOwned( |
| 390 serialized_.inner_->GetIncompleteVar(), | 384 serialized_.inner_->GetIncompleteVar(), |
| 391 serialized_.inner_->GetStringPtr(), | 385 serialized_.inner_->GetStringDestructive(), |
| 392 dispatcher)); | 386 dispatcher)); |
| 393 return serialized_.inner_->GetVar(); | 387 return serialized_.inner_->GetVar(); |
| 394 } | 388 } |
| 395 | 389 |
| 396 // SerializedVarVectorReceiveInput --------------------------------------------- | 390 // SerializedVarVectorReceiveInput --------------------------------------------- |
| 397 | 391 |
| 398 SerializedVarVectorReceiveInput::SerializedVarVectorReceiveInput( | 392 SerializedVarVectorReceiveInput::SerializedVarVectorReceiveInput( |
| 399 const std::vector<SerializedVar>& serialized) | 393 const std::vector<SerializedVar>& serialized) |
| 400 : serialized_(serialized) { | 394 : serialized_(serialized) { |
| 401 } | 395 } |
| (...skipping 10 matching lines...) Expand all Loading... |
| 412 deserialized_.resize(serialized_.size()); | 406 deserialized_.resize(serialized_.size()); |
| 413 for (size_t i = 0; i < serialized_.size(); i++) { | 407 for (size_t i = 0; i < serialized_.size(); i++) { |
| 414 // The vectors must be able to clean themselves up after this call is | 408 // The vectors must be able to clean themselves up after this call is |
| 415 // torn down. | 409 // torn down. |
| 416 serialized_[i].inner_->set_serialization_rules( | 410 serialized_[i].inner_->set_serialization_rules( |
| 417 dispatcher->serialization_rules()); | 411 dispatcher->serialization_rules()); |
| 418 | 412 |
| 419 serialized_[i].inner_->SetVar( | 413 serialized_[i].inner_->SetVar( |
| 420 serialized_[i].inner_->serialization_rules()->BeginReceiveCallerOwned( | 414 serialized_[i].inner_->serialization_rules()->BeginReceiveCallerOwned( |
| 421 serialized_[i].inner_->GetIncompleteVar(), | 415 serialized_[i].inner_->GetIncompleteVar(), |
| 422 serialized_[i].inner_->GetStringPtr(), | 416 serialized_[i].inner_->GetStringDestructive(), |
| 423 dispatcher)); | 417 dispatcher)); |
| 424 deserialized_[i] = serialized_[i].inner_->GetVar(); | 418 deserialized_[i] = serialized_[i].inner_->GetVar(); |
| 425 } | 419 } |
| 426 | 420 |
| 427 *array_size = static_cast<uint32_t>(serialized_.size()); | 421 *array_size = static_cast<uint32_t>(serialized_.size()); |
| 428 return deserialized_.empty() ? NULL : &deserialized_[0]; | 422 return deserialized_.empty() ? NULL : &deserialized_[0]; |
| 429 } | 423 } |
| 430 | 424 |
| 431 // SerializedVarReturnValue ---------------------------------------------------- | 425 // SerializedVarReturnValue ---------------------------------------------------- |
| 432 | 426 |
| 433 SerializedVarReturnValue::SerializedVarReturnValue(SerializedVar* serialized) | 427 SerializedVarReturnValue::SerializedVarReturnValue(SerializedVar* serialized) |
| 434 : serialized_(serialized) { | 428 : serialized_(serialized) { |
| 435 } | 429 } |
| 436 | 430 |
| 437 void SerializedVarReturnValue::Return(Dispatcher* dispatcher, | 431 void SerializedVarReturnValue::Return(Dispatcher* dispatcher, |
| 438 const PP_Var& var) { | 432 const PP_Var& var) { |
| 439 serialized_->inner_->set_serialization_rules( | 433 serialized_->inner_->set_serialization_rules( |
| 440 dispatcher->serialization_rules()); | 434 dispatcher->serialization_rules()); |
| 441 | 435 |
| 442 // Var must clean up after our BeginSendPassRef call. | 436 // Var must clean up after our BeginSendPassRef call. |
| 443 serialized_->inner_->SetCleanupModeToEndSendPassRef(dispatcher); | 437 serialized_->inner_->SetCleanupModeToEndSendPassRef(dispatcher); |
| 444 | 438 |
| 445 serialized_->inner_->SetVar( | 439 serialized_->inner_->SetVar( |
| 446 dispatcher->serialization_rules()->BeginSendPassRef( | 440 dispatcher->serialization_rules()->BeginSendPassRef( |
| 447 var, | 441 var, |
| 448 serialized_->inner_->GetStringPtr())); | 442 serialized_->inner_->GetStringPtrPtr())); |
| 449 } | 443 } |
| 450 | 444 |
| 451 // static | 445 // static |
| 452 SerializedVar SerializedVarReturnValue::Convert(Dispatcher* dispatcher, | 446 SerializedVar SerializedVarReturnValue::Convert(Dispatcher* dispatcher, |
| 453 const PP_Var& var) { | 447 const PP_Var& var) { |
| 454 // Mimic what happens in the normal case. | 448 // Mimic what happens in the normal case. |
| 455 SerializedVar result; | 449 SerializedVar result; |
| 456 SerializedVarReturnValue retvalue(&result); | 450 SerializedVarReturnValue retvalue(&result); |
| 457 retvalue.Return(dispatcher, var); | 451 retvalue.Return(dispatcher, var); |
| 458 return result; | 452 return result; |
| 459 } | 453 } |
| 460 | 454 |
| 461 // SerializedVarOutParam ------------------------------------------------------- | 455 // SerializedVarOutParam ------------------------------------------------------- |
| 462 | 456 |
| 463 SerializedVarOutParam::SerializedVarOutParam(SerializedVar* serialized) | 457 SerializedVarOutParam::SerializedVarOutParam(SerializedVar* serialized) |
| 464 : serialized_(serialized), | 458 : serialized_(serialized), |
| 465 writable_var_(PP_MakeUndefined()), | 459 writable_var_(PP_MakeUndefined()), |
| 466 dispatcher_(NULL) { | 460 dispatcher_(NULL) { |
| 467 } | 461 } |
| 468 | 462 |
| 469 SerializedVarOutParam::~SerializedVarOutParam() { | 463 SerializedVarOutParam::~SerializedVarOutParam() { |
| 470 if (serialized_->inner_->serialization_rules()) { | 464 if (serialized_->inner_->serialization_rules()) { |
| 471 // When unset, OutParam wasn't called. We'll just leave the var untouched | 465 // When unset, OutParam wasn't called. We'll just leave the var untouched |
| 472 // in that case. | 466 // in that case. |
| 473 serialized_->inner_->SetVar( | 467 serialized_->inner_->SetVar( |
| 474 serialized_->inner_->serialization_rules()->BeginSendPassRef( | 468 serialized_->inner_->serialization_rules()->BeginSendPassRef( |
| 475 writable_var_, serialized_->inner_->GetStringPtr())); | 469 writable_var_, serialized_->inner_->GetStringPtrPtr())); |
| 476 | 470 |
| 477 // Normally the current object will be created on the stack to wrap a | 471 // Normally the current object will be created on the stack to wrap a |
| 478 // SerializedVar and won't have a scope around the actual IPC send. So we | 472 // SerializedVar and won't have a scope around the actual IPC send. So we |
| 479 // need to tell the SerializedVar to do the begin/end send pass ref calls. | 473 // need to tell the SerializedVar to do the begin/end send pass ref calls. |
| 480 serialized_->inner_->SetCleanupModeToEndSendPassRef(dispatcher_); | 474 serialized_->inner_->SetCleanupModeToEndSendPassRef(dispatcher_); |
| 481 } | 475 } |
| 482 } | 476 } |
| 483 | 477 |
| 484 PP_Var* SerializedVarOutParam::OutParam(Dispatcher* dispatcher) { | 478 PP_Var* SerializedVarOutParam::OutParam(Dispatcher* dispatcher) { |
| 485 dispatcher_ = dispatcher; | 479 dispatcher_ = dispatcher; |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 539 inner_->ForceSetStringValueForTest(str); | 533 inner_->ForceSetStringValueForTest(str); |
| 540 } | 534 } |
| 541 | 535 |
| 542 SerializedVarTestReader::SerializedVarTestReader(const SerializedVar& var) | 536 SerializedVarTestReader::SerializedVarTestReader(const SerializedVar& var) |
| 543 : SerializedVar(var) { | 537 : SerializedVar(var) { |
| 544 } | 538 } |
| 545 | 539 |
| 546 } // namespace proxy | 540 } // namespace proxy |
| 547 } // namespace ppapi | 541 } // namespace ppapi |
| 548 | 542 |
| OLD | NEW |