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/plugin_var_serialization_rules.h" | 5 #include "ppapi/proxy/plugin_var_serialization_rules.h" |
6 | 6 |
| 7 #include "base/logging.h" |
7 #include "ppapi/proxy/plugin_dispatcher.h" | 8 #include "ppapi/proxy/plugin_dispatcher.h" |
8 #include "ppapi/proxy/plugin_var_tracker.h" | 9 #include "ppapi/proxy/plugin_var_tracker.h" |
9 | 10 |
10 namespace pp { | 11 namespace pp { |
11 namespace proxy { | 12 namespace proxy { |
12 | 13 |
13 PluginVarSerializationRules::PluginVarSerializationRules() | 14 PluginVarSerializationRules::PluginVarSerializationRules() |
14 : var_tracker_(PluginVarTracker::GetInstance()) { | 15 : var_tracker_(PluginVarTracker::GetInstance()) { |
15 } | 16 } |
16 | 17 |
(...skipping 18 matching lines...) Expand all Loading... |
35 const std::string* str_val, | 36 const std::string* str_val, |
36 Dispatcher* dispatcher) { | 37 Dispatcher* dispatcher) { |
37 if (var.type == PP_VARTYPE_STRING) { | 38 if (var.type == PP_VARTYPE_STRING) { |
38 // Convert the string to the context of the current process. | 39 // Convert the string to the context of the current process. |
39 PP_Var ret; | 40 PP_Var ret; |
40 ret.type = PP_VARTYPE_STRING; | 41 ret.type = PP_VARTYPE_STRING; |
41 ret.value.as_id = var_tracker_->MakeString(*str_val); | 42 ret.value.as_id = var_tracker_->MakeString(*str_val); |
42 return ret; | 43 return ret; |
43 } | 44 } |
44 | 45 |
45 if (var.type == PP_VARTYPE_OBJECT) | 46 if (var.type == PP_VARTYPE_OBJECT) { |
46 return var_tracker_->TrackObjectWithNoReference(var, dispatcher); | 47 DCHECK(dispatcher->IsPlugin()); |
| 48 return var_tracker_->TrackObjectWithNoReference( |
| 49 var, static_cast<PluginDispatcher*>(dispatcher)); |
| 50 } |
47 | 51 |
48 return var; | 52 return var; |
49 } | 53 } |
50 | 54 |
51 void PluginVarSerializationRules::EndReceiveCallerOwned(const PP_Var& var) { | 55 void PluginVarSerializationRules::EndReceiveCallerOwned(const PP_Var& var) { |
52 if (var.type == PP_VARTYPE_STRING) { | 56 if (var.type == PP_VARTYPE_STRING) { |
53 // Destroy the string BeginReceiveCallerOwned created above. | 57 // Destroy the string BeginReceiveCallerOwned created above. |
54 var_tracker_->Release(var); | 58 var_tracker_->Release(var); |
55 } else if (var.type == PP_VARTYPE_OBJECT) { | 59 } else if (var.type == PP_VARTYPE_OBJECT) { |
56 var_tracker_->StopTrackingObjectWithNoReference(var); | 60 var_tracker_->StopTrackingObjectWithNoReference(var); |
(...skipping 21 matching lines...) Expand all Loading... |
78 // Browser calls EndSendPassRef 4 1 1 1 | 82 // Browser calls EndSendPassRef 4 1 1 1 |
79 // | 83 // |
80 // In example 1 before the send, the plugin has 3 refs which are represented | 84 // In example 1 before the send, the plugin has 3 refs which are represented |
81 // as one ref in the browser (since the plugin only tells the browser when | 85 // as one ref in the browser (since the plugin only tells the browser when |
82 // it's refcount goes from 1 -> 0). The initial state is that the browser | 86 // it's refcount goes from 1 -> 0). The initial state is that the browser |
83 // plugin code started to return a value, which means it gets another ref | 87 // plugin code started to return a value, which means it gets another ref |
84 // on behalf of the caller. This needs to be transferred to the plugin and | 88 // on behalf of the caller. This needs to be transferred to the plugin and |
85 // folded in to its set of refs it maintains (with one ref representing all | 89 // folded in to its set of refs it maintains (with one ref representing all |
86 // fo them in the browser). | 90 // fo them in the browser). |
87 if (var.type == PP_VARTYPE_OBJECT) { | 91 if (var.type == PP_VARTYPE_OBJECT) { |
88 return var_tracker_->ReceiveObjectPassRef(var, dispatcher); | 92 DCHECK(dispatcher->IsPlugin()); |
| 93 return var_tracker_->ReceiveObjectPassRef( |
| 94 var, static_cast<PluginDispatcher*>(dispatcher)); |
89 } | 95 } |
90 | 96 |
91 // Other types are unchanged. | 97 // Other types are unchanged. |
92 return var; | 98 return var; |
93 } | 99 } |
94 | 100 |
95 PP_Var PluginVarSerializationRules::BeginSendPassRef(const PP_Var& var, | 101 PP_Var PluginVarSerializationRules::BeginSendPassRef(const PP_Var& var, |
96 std::string* str_val) { | 102 std::string* str_val) { |
97 // Overview of sending an object with "pass ref" from the plugin to the | 103 // Overview of sending an object with "pass ref" from the plugin to the |
98 // browser: | 104 // browser: |
(...skipping 18 matching lines...) Expand all Loading... |
117 *str_val = var_tracker_->GetString(var); | 123 *str_val = var_tracker_->GetString(var); |
118 return var; | 124 return var; |
119 } | 125 } |
120 | 126 |
121 void PluginVarSerializationRules::EndSendPassRef(const PP_Var& var, | 127 void PluginVarSerializationRules::EndSendPassRef(const PP_Var& var, |
122 Dispatcher* dispatcher) { | 128 Dispatcher* dispatcher) { |
123 // See BeginSendPassRef for an example of why we release our ref here. | 129 // See BeginSendPassRef for an example of why we release our ref here. |
124 // The var we have in our inner class has been converted to a host object | 130 // The var we have in our inner class has been converted to a host object |
125 // by BeginSendPassRef. This means it's not a normal var valid in the plugin, | 131 // by BeginSendPassRef. This means it's not a normal var valid in the plugin, |
126 // so we need to use the special ReleaseHostObject. | 132 // so we need to use the special ReleaseHostObject. |
127 if (var.type == PP_VARTYPE_OBJECT) | 133 if (var.type == PP_VARTYPE_OBJECT) { |
128 var_tracker_->ReleaseHostObject(dispatcher, var); | 134 var_tracker_->ReleaseHostObject( |
| 135 static_cast<PluginDispatcher*>(dispatcher), var); |
| 136 } |
129 } | 137 } |
130 | 138 |
131 void PluginVarSerializationRules::ReleaseObjectRef(const PP_Var& var) { | 139 void PluginVarSerializationRules::ReleaseObjectRef(const PP_Var& var) { |
132 var_tracker_->Release(var); | 140 var_tracker_->Release(var); |
133 } | 141 } |
134 | 142 |
135 } // namespace proxy | 143 } // namespace proxy |
136 } // namespace pp | 144 } // namespace pp |
OLD | NEW |