diff --git a/ppapi/proxy/websocket_resource.cc b/ppapi/proxy/websocket_resource.cc index c45de909b55e6b..7439826dba18dc 100644 --- a/ppapi/proxy/websocket_resource.cc +++ b/ppapi/proxy/websocket_resource.cc @@ -423,10 +423,10 @@ void WebSocketResource::OnPluginMsgReceiveBinaryReply( return; // Append received data to queue. - scoped_refptr message_var(ArrayBufferVar::FromPPVar( - PpapiGlobals::Get()->GetVarTracker()->MakeArrayBufferPPVar( + scoped_refptr message_var( + PpapiGlobals::Get()->GetVarTracker()->MakeArrayBufferVar( message.size(), - &message.front()))); + &message.front())); received_messages_.push(message_var); if (!TrackedCallback::IsPending(receive_callback_)) diff --git a/ppapi/shared_impl/var_tracker.cc b/ppapi/shared_impl/var_tracker.cc index 8214a307aef5ba..d515cf76ae959b 100644 --- a/ppapi/shared_impl/var_tracker.cc +++ b/ppapi/shared_impl/var_tracker.cc @@ -186,13 +186,18 @@ PP_Var VarTracker::MakeArrayBufferPPVar(uint32 size_in_bytes) { PP_Var VarTracker::MakeArrayBufferPPVar(uint32 size_in_bytes, const void* data) { - DCHECK(CalledOnValidThread()); + ArrayBufferVar* array_buffer = MakeArrayBufferVar(size_in_bytes, data); + return array_buffer ? array_buffer->GetPPVar() : PP_MakeNull(); +} - scoped_refptr array_buffer(CreateArrayBuffer(size_in_bytes)); +ArrayBufferVar* VarTracker::MakeArrayBufferVar(uint32 size_in_bytes, + const void* data) { + DCHECK(CalledOnValidThread()); + ArrayBufferVar* array_buffer(CreateArrayBuffer(size_in_bytes)); if (!array_buffer) - return PP_MakeNull(); + return NULL; memcpy(array_buffer->Map(), data, size_in_bytes); - return array_buffer->GetPPVar(); + return array_buffer; } std::vector VarTracker::GetLiveVars() { diff --git a/ppapi/shared_impl/var_tracker.h b/ppapi/shared_impl/var_tracker.h index b873250f6dd468..1d0c0d681d90f5 100644 --- a/ppapi/shared_impl/var_tracker.h +++ b/ppapi/shared_impl/var_tracker.h @@ -73,6 +73,12 @@ class PPAPI_SHARED_EXPORT VarTracker // Same as above, but copy the contents of |data| in to the new array buffer. PP_Var MakeArrayBufferPPVar(uint32 size_in_bytes, const void* data); + // Create an ArrayBuffer and copy the contents of |data| in to it. The + // returned object has 0 reference count in the tracker, and like all + // RefCounted objects, has a 0 initial internal reference count. (You should + // usually immediately put this in a scoped_refptr). + ArrayBufferVar* MakeArrayBufferVar(uint32 size_in_bytes, const void* data); + // Return a vector containing all PP_Vars that are in the tracker. This is // to help implement PPB_Testing_Dev.GetLiveVars and should generally not be // used in production code. The PP_Vars are returned in no particular order, diff --git a/ppapi/tests/test_case.h b/ppapi/tests/test_case.h index b06f9418a7ee12..b63309f1cb1d4a 100644 --- a/ppapi/tests/test_case.h +++ b/ppapi/tests/test_case.h @@ -313,7 +313,7 @@ class TestCaseFactory { instance_->pp_instance()) != objects) \ error_message = MakeFailureMessage(__FILE__, __LINE__, \ "reference leak check"); \ - instance_->LogTest(#name, error_message); \ + instance_->LogTest(#name, CheckResourcesAndVars(error_message)); \ } // Helper macros for checking values in tests, and returning a location diff --git a/ppapi/tests/test_websocket.cc b/ppapi/tests/test_websocket.cc index d5dc4863fe49e2..acbad3e4de0280 100644 --- a/ppapi/tests/test_websocket.cc +++ b/ppapi/tests/test_websocket.cc @@ -464,6 +464,7 @@ std::string TestWebSocket::TestValidConnect() { PP_Var extensions = websocket_interface_->GetExtensions(ws); ASSERT_TRUE(AreEqualWithString(extensions, "")); core_interface_->ReleaseResource(ws); + ReleaseVar(extensions); PASS(); }