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

Side by Side Diff: ppapi/proxy/serialized_var.h

Issue 9655019: Fix a crash related to PPAPI scripting. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix constructor init list order. Created 8 years, 9 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 #ifndef PPAPI_PROXY_SERIALIZED_VAR_H_ 5 #ifndef PPAPI_PROXY_SERIALIZED_VAR_H_
6 #define PPAPI_PROXY_SERIALIZED_VAR_H_ 6 #define PPAPI_PROXY_SERIALIZED_VAR_H_
7 7
8 #include <string> 8 #include <string>
9 #include <vector> 9 #include <vector>
10 10
11 #include "base/basictypes.h" 11 #include "base/basictypes.h"
12 #include "base/memory/ref_counted.h" 12 #include "base/memory/ref_counted.h"
13 #include "base/memory/scoped_ptr.h" 13 #include "base/memory/scoped_ptr.h"
14 #include "ppapi/c/pp_var.h" 14 #include "ppapi/c/pp_var.h"
15 #include "ppapi/proxy/ppapi_proxy_export.h" 15 #include "ppapi/proxy/ppapi_proxy_export.h"
16 #include "ppapi/proxy/var_serialization_rules.h"
16 17
17 class PickleIterator; 18 class PickleIterator;
18 19
19 namespace IPC { 20 namespace IPC {
20 class Message; 21 class Message;
21 } 22 }
22 23
23 namespace ppapi { 24 namespace ppapi {
24 namespace proxy { 25 namespace proxy {
25 26
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
103 PP_Var GetVar() const; 104 PP_Var GetVar() const;
104 void SetVar(PP_Var var); 105 void SetVar(PP_Var var);
105 106
106 // For the SerializedVarTestConstructor, this writes the Var value as if 107 // For the SerializedVarTestConstructor, this writes the Var value as if
107 // it was just received off the wire, without any serialization rules. 108 // it was just received off the wire, without any serialization rules.
108 void ForceSetVarValueForTest(PP_Var value); 109 void ForceSetVarValueForTest(PP_Var value);
109 110
110 void WriteToMessage(IPC::Message* m) const; 111 void WriteToMessage(IPC::Message* m) const;
111 bool ReadFromMessage(const IPC::Message* m, PickleIterator* iter); 112 bool ReadFromMessage(const IPC::Message* m, PickleIterator* iter);
112 113
113 // Sets the cleanup mode. See the CleanupMode enum below. These functions 114 // Sets the cleanup mode. See the CleanupMode enum below.
114 // are not just a simple setter in order to require that the appropriate 115 void SetCleanupModeToEndSendPassRef();
115 // data is set along with the corresponding mode.
116 void SetCleanupModeToEndSendPassRef(Dispatcher* dispatcher);
117 void SetCleanupModeToEndReceiveCallerOwned(); 116 void SetCleanupModeToEndReceiveCallerOwned();
118 117
119 private: 118 private:
120 enum CleanupMode { 119 enum CleanupMode {
121 // The serialized var won't do anything special in the destructor 120 // The serialized var won't do anything special in the destructor
122 // (default). 121 // (default).
123 CLEANUP_NONE, 122 CLEANUP_NONE,
124 123
125 // The serialized var will call EndSendPassRef in the destructor. 124 // The serialized var will call EndSendPassRef in the destructor.
126 END_SEND_PASS_REF, 125 END_SEND_PASS_REF,
127 126
128 // The serialized var will call EndReceiveCallerOwned in the destructor. 127 // The serialized var will call EndReceiveCallerOwned in the destructor.
129 END_RECEIVE_CALLER_OWNED 128 END_RECEIVE_CALLER_OWNED
130 }; 129 };
131 130
132 // Rules for serializing and deserializing vars for this process type. 131 // Rules for serializing and deserializing vars for this process type.
133 // This may be NULL, but must be set before trying to serialize to IPC when 132 // This may be NULL, but must be set before trying to serialize to IPC when
134 // sending, or before converting back to a PP_Var when receiving. 133 // sending, or before converting back to a PP_Var when receiving.
135 VarSerializationRules* serialization_rules_; 134 scoped_refptr<VarSerializationRules> serialization_rules_;
136 135
137 // If this is set to VARTYPE_STRING and the 'value.id' is 0, then the 136 // If this is set to VARTYPE_STRING and the 'value.id' is 0, then the
138 // string_from_ipc_ holds the string. This means that the caller hasn't 137 // string_from_ipc_ holds the string. This means that the caller hasn't
139 // called Deserialize with a valid Dispatcher yet, which is how we can 138 // called Deserialize with a valid Dispatcher yet, which is how we can
140 // convert the serialized string value to a PP_Var string ID. 139 // convert the serialized string value to a PP_Var string ID.
141 // 140 //
142 // This var may not be complete until the serialization rules are set when 141 // This var may not be complete until the serialization rules are set when
143 // reading from IPC since we'll need that to convert the string_value to 142 // reading from IPC since we'll need that to convert the string_value to
144 // a string ID. Before this, the as_id will be 0 for VARTYPE_STRING. 143 // a string ID. Before this, the as_id will be 0 for VARTYPE_STRING.
145 PP_Var var_; 144 PP_Var var_;
146 145
147 CleanupMode cleanup_mode_; 146 CleanupMode cleanup_mode_;
148 147
149 // The dispatcher saved for the call to EndSendPassRef for the cleanup.
150 // This is only valid when cleanup_mode == END_SEND_PASS_REF.
151 Dispatcher* dispatcher_for_end_send_pass_ref_;
152
153 #ifndef NDEBUG 148 #ifndef NDEBUG
154 // When being sent or received over IPC, we should only be serialized or 149 // When being sent or received over IPC, we should only be serialized or
155 // deserialized once. These flags help us assert this is true. 150 // deserialized once. These flags help us assert this is true.
156 mutable bool has_been_serialized_; 151 mutable bool has_been_serialized_;
157 mutable bool has_been_deserialized_; 152 mutable bool has_been_deserialized_;
158 #endif 153 #endif
159 154
160 DISALLOW_COPY_AND_ASSIGN(Inner); 155 DISALLOW_COPY_AND_ASSIGN(Inner);
161 }; 156 };
162 157
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
199 // Example for API: 194 // Example for API:
200 // PP_Var MyFunction() 195 // PP_Var MyFunction()
201 // IPC message: 196 // IPC message:
202 // IPC_SYNC_MESSAGE_ROUTED0_1(MyFunction, SerializedVar); 197 // IPC_SYNC_MESSAGE_ROUTED0_1(MyFunction, SerializedVar);
203 // Message handler would be: 198 // Message handler would be:
204 // PP_Var MyFunctionProxy() { 199 // PP_Var MyFunctionProxy() {
205 // ReceiveSerializedVarReturnValue result; 200 // ReceiveSerializedVarReturnValue result;
206 // Send(new MyFunctionMsg(&result)); 201 // Send(new MyFunctionMsg(&result));
207 // return result.Return(dispatcher()); 202 // return result.Return(dispatcher());
208 // } 203 // }
204 //
205 // TODO(yzshen): Move the dispatcher parameter to the constructor and store a
206 // VarSerializationRules reference instead, in case the dispatcher is destroyed
207 // while waiting for reply to the sync message.
209 class PPAPI_PROXY_EXPORT ReceiveSerializedVarReturnValue 208 class PPAPI_PROXY_EXPORT ReceiveSerializedVarReturnValue
210 : public SerializedVar { 209 : public SerializedVar {
211 public: 210 public:
212 // Note that we can't set the dispatcher in the constructor because the 211 // Note that we can't set the dispatcher in the constructor because the
213 // data will be overridden when the return value is set. This constructor is 212 // data will be overridden when the return value is set. This constructor is
214 // normally used in the pattern above (operator= will be implicitly invoked 213 // normally used in the pattern above (operator= will be implicitly invoked
215 // when the sync message writes the output values). 214 // when the sync message writes the output values).
216 ReceiveSerializedVarReturnValue(); 215 ReceiveSerializedVarReturnValue();
217 216
218 // This constructor can be used when deserializing manually. This is useful 217 // This constructor can be used when deserializing manually. This is useful
(...skipping 20 matching lines...) Expand all
239 class PPAPI_PROXY_EXPORT ReceiveSerializedException : public SerializedVar { 238 class PPAPI_PROXY_EXPORT ReceiveSerializedException : public SerializedVar {
240 public: 239 public:
241 ReceiveSerializedException(Dispatcher* dispatcher, PP_Var* exception); 240 ReceiveSerializedException(Dispatcher* dispatcher, PP_Var* exception);
242 ~ReceiveSerializedException(); 241 ~ReceiveSerializedException();
243 242
244 // Returns true if the exception passed in the constructor is set. Check 243 // Returns true if the exception passed in the constructor is set. Check
245 // this before actually issuing the IPC. 244 // this before actually issuing the IPC.
246 bool IsThrown() const; 245 bool IsThrown() const;
247 246
248 private: 247 private:
249 Dispatcher* dispatcher_;
250
251 // The input/output exception we're wrapping. May be NULL. 248 // The input/output exception we're wrapping. May be NULL.
252 PP_Var* exception_; 249 PP_Var* exception_;
253 250
254 DISALLOW_IMPLICIT_CONSTRUCTORS(ReceiveSerializedException); 251 DISALLOW_IMPLICIT_CONSTRUCTORS(ReceiveSerializedException);
255 }; 252 };
256 253
257 // Helper class for when we're returning a vector of Vars. When it goes out 254 // Helper class for when we're returning a vector of Vars. When it goes out
258 // of scope it will automatically convert the vector filled by the IPC layer 255 // of scope it will automatically convert the vector filled by the IPC layer
259 // into the array specified by the constructor params. 256 // into the array specified by the constructor params.
260 // 257 //
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
303 // We rely on the implicit constructor here since the IPC layer will call 300 // We rely on the implicit constructor here since the IPC layer will call
304 // us with a SerializedVar. Pass this object by value, the copy constructor 301 // us with a SerializedVar. Pass this object by value, the copy constructor
305 // will pass along the pointer (as cheap as passing a pointer arg). 302 // will pass along the pointer (as cheap as passing a pointer arg).
306 SerializedVarReceiveInput(const SerializedVar& serialized); 303 SerializedVarReceiveInput(const SerializedVar& serialized);
307 ~SerializedVarReceiveInput(); 304 ~SerializedVarReceiveInput();
308 305
309 PP_Var Get(Dispatcher* dispatcher); 306 PP_Var Get(Dispatcher* dispatcher);
310 307
311 private: 308 private:
312 const SerializedVar& serialized_; 309 const SerializedVar& serialized_;
313
314 // Since the SerializedVar is const, we can't set its dispatcher (which is
315 // OK since we don't need to). But since we need it for our own uses, we
316 // track it here. Will be NULL before Get() is called.
317 Dispatcher* dispatcher_;
318 PP_Var var_;
319 }; 310 };
320 311
321 // For receiving an input vector of vars from the remote side. 312 // For receiving an input vector of vars from the remote side.
322 // 313 //
323 // Example: 314 // Example:
324 // OnMsgMyFunction(SerializedVarVectorReceiveInput vector) { 315 // OnMsgMyFunction(SerializedVarVectorReceiveInput vector) {
325 // uint32_t size; 316 // uint32_t size;
326 // PP_Var* array = vector.Get(dispatcher, &size); 317 // PP_Var* array = vector.Get(dispatcher, &size);
327 // MyFunction(size, array); 318 // MyFunction(size, array);
328 // } 319 // }
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
444 // The "incomplete" var is the one sent over the wire. Strings and object 435 // The "incomplete" var is the one sent over the wire. Strings and object
445 // IDs have not yet been converted, so this is the thing that tests will 436 // IDs have not yet been converted, so this is the thing that tests will
446 // actually want to check. 437 // actually want to check.
447 PP_Var GetVar() const { return inner_->GetVar(); } 438 PP_Var GetVar() const { return inner_->GetVar(); }
448 }; 439 };
449 440
450 } // namespace proxy 441 } // namespace proxy
451 } // namespace ppapi 442 } // namespace ppapi
452 443
453 #endif // PPAPI_PROXY_SERIALIZED_VAR_H_ 444 #endif // PPAPI_PROXY_SERIALIZED_VAR_H_
454
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698