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 "ipc/ipc_test_sink.h" | 5 #include "ipc/ipc_test_sink.h" |
6 #include "ppapi/proxy/plugin_var_tracker.h" | 6 #include "ppapi/proxy/plugin_var_tracker.h" |
7 #include "ppapi/proxy/ppapi_messages.h" | 7 #include "ppapi/proxy/ppapi_messages.h" |
8 #include "ppapi/proxy/ppapi_proxy_test.h" | 8 #include "ppapi/proxy/ppapi_proxy_test.h" |
9 | 9 |
10 namespace pp { | 10 namespace pp { |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
62 EXPECT_EQ(str, result); | 62 EXPECT_EQ(str, result); |
63 result = var_tracker().GetString(MakeString(str_id2)); | 63 result = var_tracker().GetString(MakeString(str_id2)); |
64 EXPECT_EQ(str, result); | 64 EXPECT_EQ(str, result); |
65 } | 65 } |
66 | 66 |
67 TEST_F(PluginVarTrackerTest, GetHostObject) { | 67 TEST_F(PluginVarTrackerTest, GetHostObject) { |
68 PP_Var host_object = MakeObject(12345); | 68 PP_Var host_object = MakeObject(12345); |
69 | 69 |
70 // Round-trip through the tracker to make sure the host object comes out the | 70 // Round-trip through the tracker to make sure the host object comes out the |
71 // other end. | 71 // other end. |
72 PP_Var plugin_object = var_tracker().ReceiveObjectPassRef(host_object, | 72 PP_Var plugin_object = var_tracker().ReceiveObjectPassRef( |
73 &sink()); | 73 host_object, plugin_dispatcher()); |
74 PP_Var host_object2 = var_tracker().GetHostObject(plugin_object); | 74 PP_Var host_object2 = var_tracker().GetHostObject(plugin_object); |
75 EXPECT_EQ(PP_VARTYPE_OBJECT, host_object2.type); | 75 EXPECT_EQ(PP_VARTYPE_OBJECT, host_object2.type); |
76 EXPECT_EQ(host_object.value.as_id, host_object2.value.as_id); | 76 EXPECT_EQ(host_object.value.as_id, host_object2.value.as_id); |
77 | 77 |
78 var_tracker().Release(plugin_object); | 78 var_tracker().Release(plugin_object); |
79 } | 79 } |
80 | 80 |
81 TEST_F(PluginVarTrackerTest, ReceiveObjectPassRef) { | 81 TEST_F(PluginVarTrackerTest, ReceiveObjectPassRef) { |
82 PP_Var host_object = MakeObject(12345); | 82 PP_Var host_object = MakeObject(12345); |
83 | 83 |
84 // Receive the object, we should have one ref and no messages. | 84 // Receive the object, we should have one ref and no messages. |
85 PP_Var plugin_object = var_tracker().ReceiveObjectPassRef(host_object, | 85 PP_Var plugin_object = var_tracker().ReceiveObjectPassRef( |
86 &sink()); | 86 host_object, plugin_dispatcher()); |
87 EXPECT_EQ(0u, sink().message_count()); | 87 EXPECT_EQ(0u, sink().message_count()); |
88 EXPECT_EQ(1, var_tracker().GetRefCountForObject(plugin_object)); | 88 EXPECT_EQ(1, var_tracker().GetRefCountForObject(plugin_object)); |
89 EXPECT_EQ(0, | 89 EXPECT_EQ(0, |
90 var_tracker().GetTrackedWithNoReferenceCountForObject(plugin_object)); | 90 var_tracker().GetTrackedWithNoReferenceCountForObject(plugin_object)); |
91 | 91 |
92 // Receive the same object again, we should get the same plugin ID out. | 92 // Receive the same object again, we should get the same plugin ID out. |
93 PP_Var plugin_object2 = var_tracker().ReceiveObjectPassRef(host_object, | 93 PP_Var plugin_object2 = var_tracker().ReceiveObjectPassRef( |
94 &sink()); | 94 host_object, plugin_dispatcher()); |
95 EXPECT_EQ(plugin_object.value.as_id, plugin_object2.value.as_id); | 95 EXPECT_EQ(plugin_object.value.as_id, plugin_object2.value.as_id); |
96 EXPECT_EQ(2, var_tracker().GetRefCountForObject(plugin_object)); | 96 EXPECT_EQ(2, var_tracker().GetRefCountForObject(plugin_object)); |
97 EXPECT_EQ(0, | 97 EXPECT_EQ(0, |
98 var_tracker().GetTrackedWithNoReferenceCountForObject(plugin_object)); | 98 var_tracker().GetTrackedWithNoReferenceCountForObject(plugin_object)); |
99 | 99 |
100 // It should have sent one message to decerment the refcount in the host. | 100 // It should have sent one message to decerment the refcount in the host. |
101 // This is because it only maintains one host refcount for all references | 101 // This is because it only maintains one host refcount for all references |
102 // in the plugin, but the host just sent the second one. | 102 // in the plugin, but the host just sent the second one. |
103 EXPECT_EQ(host_object.value.as_id, GetObjectIDForUniqueReleaseObject()); | 103 EXPECT_EQ(host_object.value.as_id, GetObjectIDForUniqueReleaseObject()); |
104 sink().ClearMessages(); | 104 sink().ClearMessages(); |
105 | 105 |
106 // Release the object, one ref at a time. The second release should free | 106 // Release the object, one ref at a time. The second release should free |
107 // the tracking data and send a release message to the browser. | 107 // the tracking data and send a release message to the browser. |
108 var_tracker().Release(plugin_object); | 108 var_tracker().Release(plugin_object); |
109 EXPECT_EQ(1, var_tracker().GetRefCountForObject(plugin_object)); | 109 EXPECT_EQ(1, var_tracker().GetRefCountForObject(plugin_object)); |
110 var_tracker().Release(plugin_object); | 110 var_tracker().Release(plugin_object); |
111 EXPECT_EQ(-1, var_tracker().GetRefCountForObject(plugin_object)); | 111 EXPECT_EQ(-1, var_tracker().GetRefCountForObject(plugin_object)); |
112 EXPECT_EQ(host_object.value.as_id, GetObjectIDForUniqueReleaseObject()); | 112 EXPECT_EQ(host_object.value.as_id, GetObjectIDForUniqueReleaseObject()); |
113 } | 113 } |
114 | 114 |
115 // Tests freeing objects that have both refcounts and "tracked with no ref". | 115 // Tests freeing objects that have both refcounts and "tracked with no ref". |
116 TEST_F(PluginVarTrackerTest, FreeTrackedAndReferencedObject) { | 116 TEST_F(PluginVarTrackerTest, FreeTrackedAndReferencedObject) { |
117 PP_Var host_object = MakeObject(12345); | 117 PP_Var host_object = MakeObject(12345); |
118 | 118 |
119 // Phase one: First receive via a "pass ref", then a tracked with no ref. | 119 // Phase one: First receive via a "pass ref", then a tracked with no ref. |
120 PP_Var plugin_var = var_tracker().ReceiveObjectPassRef(host_object, &sink()); | 120 PP_Var plugin_var = var_tracker().ReceiveObjectPassRef( |
121 PP_Var plugin_var2 = | 121 host_object, plugin_dispatcher()); |
122 var_tracker().TrackObjectWithNoReference(host_object, &sink()); | 122 PP_Var plugin_var2 = var_tracker().TrackObjectWithNoReference( |
| 123 host_object, plugin_dispatcher()); |
123 EXPECT_EQ(plugin_var.value.as_id, plugin_var2.value.as_id); | 124 EXPECT_EQ(plugin_var.value.as_id, plugin_var2.value.as_id); |
124 EXPECT_EQ(1, var_tracker().GetRefCountForObject(plugin_var)); | 125 EXPECT_EQ(1, var_tracker().GetRefCountForObject(plugin_var)); |
125 EXPECT_EQ(1, | 126 EXPECT_EQ(1, |
126 var_tracker().GetTrackedWithNoReferenceCountForObject(plugin_var)); | 127 var_tracker().GetTrackedWithNoReferenceCountForObject(plugin_var)); |
127 | 128 |
128 // Free via the refcount, this should release the object to the browser but | 129 // Free via the refcount, this should release the object to the browser but |
129 // maintain the tracked object. | 130 // maintain the tracked object. |
130 var_tracker().Release(plugin_var); | 131 var_tracker().Release(plugin_var); |
131 EXPECT_EQ(0, var_tracker().GetRefCountForObject(plugin_var)); | 132 EXPECT_EQ(0, var_tracker().GetRefCountForObject(plugin_var)); |
132 EXPECT_EQ(1u, sink().message_count()); | 133 EXPECT_EQ(1u, sink().message_count()); |
133 EXPECT_EQ(host_object.value.as_id, GetObjectIDForUniqueReleaseObject()); | 134 EXPECT_EQ(host_object.value.as_id, GetObjectIDForUniqueReleaseObject()); |
134 | 135 |
135 // Now free via the tracked object, this should free it. | 136 // Now free via the tracked object, this should free it. |
136 var_tracker().StopTrackingObjectWithNoReference(plugin_var); | 137 var_tracker().StopTrackingObjectWithNoReference(plugin_var); |
137 EXPECT_EQ(-1, var_tracker().GetRefCountForObject(plugin_var)); | 138 EXPECT_EQ(-1, var_tracker().GetRefCountForObject(plugin_var)); |
138 | 139 |
139 // Phase two: Receive via a tracked, then get an addref. | 140 // Phase two: Receive via a tracked, then get an addref. |
140 sink().ClearMessages(); | 141 sink().ClearMessages(); |
141 plugin_var = var_tracker().TrackObjectWithNoReference(host_object, &sink()); | 142 plugin_var = var_tracker().TrackObjectWithNoReference( |
142 plugin_var2 = var_tracker().ReceiveObjectPassRef(host_object, &sink()); | 143 host_object, plugin_dispatcher()); |
| 144 plugin_var2 = var_tracker().ReceiveObjectPassRef( |
| 145 host_object, plugin_dispatcher()); |
143 EXPECT_EQ(plugin_var.value.as_id, plugin_var2.value.as_id); | 146 EXPECT_EQ(plugin_var.value.as_id, plugin_var2.value.as_id); |
144 EXPECT_EQ(1, var_tracker().GetRefCountForObject(plugin_var)); | 147 EXPECT_EQ(1, var_tracker().GetRefCountForObject(plugin_var)); |
145 EXPECT_EQ(1, | 148 EXPECT_EQ(1, |
146 var_tracker().GetTrackedWithNoReferenceCountForObject(plugin_var)); | 149 var_tracker().GetTrackedWithNoReferenceCountForObject(plugin_var)); |
147 | 150 |
148 // Free via the tracked object, this should have no effect. | 151 // Free via the tracked object, this should have no effect. |
149 var_tracker().StopTrackingObjectWithNoReference(plugin_var); | 152 var_tracker().StopTrackingObjectWithNoReference(plugin_var); |
150 EXPECT_EQ(0, | 153 EXPECT_EQ(0, |
151 var_tracker().GetTrackedWithNoReferenceCountForObject(plugin_var)); | 154 var_tracker().GetTrackedWithNoReferenceCountForObject(plugin_var)); |
152 EXPECT_EQ(0u, sink().message_count()); | 155 EXPECT_EQ(0u, sink().message_count()); |
153 | 156 |
154 // Now free via the refcount, this should delete it. | 157 // Now free via the refcount, this should delete it. |
155 var_tracker().Release(plugin_var); | 158 var_tracker().Release(plugin_var); |
156 EXPECT_EQ(-1, var_tracker().GetRefCountForObject(plugin_var)); | 159 EXPECT_EQ(-1, var_tracker().GetRefCountForObject(plugin_var)); |
157 EXPECT_EQ(host_object.value.as_id, GetObjectIDForUniqueReleaseObject()); | 160 EXPECT_EQ(host_object.value.as_id, GetObjectIDForUniqueReleaseObject()); |
158 } | 161 } |
159 | 162 |
160 TEST_F(PluginVarTrackerTest, RecursiveTrackWithNoRef) { | 163 TEST_F(PluginVarTrackerTest, RecursiveTrackWithNoRef) { |
161 PP_Var host_object = MakeObject(12345); | 164 PP_Var host_object = MakeObject(12345); |
162 | 165 |
163 // Receive a tracked object twice. | 166 // Receive a tracked object twice. |
164 PP_Var plugin_var = var_tracker().TrackObjectWithNoReference( | 167 PP_Var plugin_var = var_tracker().TrackObjectWithNoReference( |
165 host_object, &sink()); | 168 host_object, plugin_dispatcher()); |
166 EXPECT_EQ(1, | 169 EXPECT_EQ(1, |
167 var_tracker().GetTrackedWithNoReferenceCountForObject(plugin_var)); | 170 var_tracker().GetTrackedWithNoReferenceCountForObject(plugin_var)); |
168 PP_Var plugin_var2 = var_tracker().TrackObjectWithNoReference(host_object, | 171 PP_Var plugin_var2 = var_tracker().TrackObjectWithNoReference( |
169 &sink()); | 172 host_object, plugin_dispatcher()); |
170 EXPECT_EQ(plugin_var.value.as_id, plugin_var2.value.as_id); | 173 EXPECT_EQ(plugin_var.value.as_id, plugin_var2.value.as_id); |
171 EXPECT_EQ(0, var_tracker().GetRefCountForObject(plugin_var)); | 174 EXPECT_EQ(0, var_tracker().GetRefCountForObject(plugin_var)); |
172 EXPECT_EQ(2, | 175 EXPECT_EQ(2, |
173 var_tracker().GetTrackedWithNoReferenceCountForObject(plugin_var)); | 176 var_tracker().GetTrackedWithNoReferenceCountForObject(plugin_var)); |
174 | 177 |
175 // Now release those tracked items, the reference should be freed. | 178 // Now release those tracked items, the reference should be freed. |
176 var_tracker().StopTrackingObjectWithNoReference(plugin_var); | 179 var_tracker().StopTrackingObjectWithNoReference(plugin_var); |
177 EXPECT_EQ(1, | 180 EXPECT_EQ(1, |
178 var_tracker().GetTrackedWithNoReferenceCountForObject(plugin_var)); | 181 var_tracker().GetTrackedWithNoReferenceCountForObject(plugin_var)); |
179 var_tracker().StopTrackingObjectWithNoReference(plugin_var); | 182 var_tracker().StopTrackingObjectWithNoReference(plugin_var); |
180 EXPECT_EQ(-1, | 183 EXPECT_EQ(-1, |
181 var_tracker().GetTrackedWithNoReferenceCountForObject(plugin_var)); | 184 var_tracker().GetTrackedWithNoReferenceCountForObject(plugin_var)); |
182 } | 185 } |
183 | 186 |
184 } // namespace proxy | 187 } // namespace proxy |
185 } // namespace pp | 188 } // namespace pp |
OLD | NEW |