| 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 |