summaryrefslogtreecommitdiffstats
path: root/ppapi
diff options
context:
space:
mode:
authorbrettw@chromium.org <brettw@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-01-27 20:40:39 +0000
committerbrettw@chromium.org <brettw@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-01-27 20:40:39 +0000
commitf24448db9f893c5dde10ed1ae4cead436e18f64f (patch)
treec224a27ed5949a761ed2f62b75cedae0fa2014e2 /ppapi
parente9319bf33e2b7e6bdd2fa005b212f2fcf0896883 (diff)
downloadchromium_src-f24448db9f893c5dde10ed1ae4cead436e18f64f.zip
chromium_src-f24448db9f893c5dde10ed1ae4cead436e18f64f.tar.gz
chromium_src-f24448db9f893c5dde10ed1ae4cead436e18f64f.tar.bz2
Refactor PPAPI proxy resource handling to maintain which host they came from,
and to map back to that host when calling functions on them. Adds a mapping between resources generated by the hosts to a new list inside the plugin so there can't be overlaps. This means there are now two meanings for a PP_Resource, one in the plugin process and one in the host process. This is potentially very confusing. I introduced a new object called a HostResource that always represents a "host" PP_Resource to try to prevent errors. In the plugin side of the proxy, it only deals with PP_Resources valid in the plugin, and SerializedResources valid in the host. It also encapsulates the associated instance, which simplifies some code. Each PluginResource object maintains its SerializedResource which the proxy uses to send to the host for requests. This requires getting the PluginResource object in more proxy calls. This fixes a bug in var sending introduced in my previous patch. The var releasing from EndSendPassRef used the host var rather than the plugin var. I had to add more plumbing to get the dispatcher at this location and convert to a plugin var. I removed the separate file for ImageData and put it in ppb_image_data_proxy like for the other resource types. TEST=some unit tests included BUG=none Review URL: http://codereview.chromium.org/6334016 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@72879 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ppapi')
-rw-r--r--ppapi/c/dev/ppb_cursor_control_dev.h4
-rw-r--r--ppapi/ppapi_shared_proxy.gypi3
-rw-r--r--ppapi/ppapi_tests.gypi9
-rw-r--r--ppapi/proxy/dispatcher.cc9
-rw-r--r--ppapi/proxy/dispatcher.h15
-rw-r--r--ppapi/proxy/host_resource.h60
-rw-r--r--ppapi/proxy/host_var_serialization_rules.cc5
-rw-r--r--ppapi/proxy/host_var_serialization_rules.h2
-rw-r--r--ppapi/proxy/image_data.cc97
-rw-r--r--ppapi/proxy/image_data.h49
-rw-r--r--ppapi/proxy/mock_resource.cc22
-rw-r--r--ppapi/proxy/mock_resource.h29
-rw-r--r--ppapi/proxy/plugin_resource.cc3
-rw-r--r--ppapi/proxy/plugin_resource.h18
-rw-r--r--ppapi/proxy/plugin_resource_tracker.cc73
-rw-r--r--ppapi/proxy/plugin_resource_tracker.h55
-rw-r--r--ppapi/proxy/plugin_resource_tracker_unittest.cc75
-rw-r--r--ppapi/proxy/plugin_var_serialization_rules.cc8
-rw-r--r--ppapi/proxy/plugin_var_serialization_rules.h2
-rw-r--r--ppapi/proxy/plugin_var_tracker.cc29
-rw-r--r--ppapi/proxy/plugin_var_tracker.h11
-rw-r--r--ppapi/proxy/plugin_var_tracker_unittest.cc117
-rw-r--r--ppapi/proxy/ppapi_messages_internal.h120
-rw-r--r--ppapi/proxy/ppapi_param_traits.cc148
-rw-r--r--ppapi/proxy/ppapi_param_traits.h36
-rw-r--r--ppapi/proxy/ppapi_proxy_test.cc59
-rw-r--r--ppapi/proxy/ppapi_proxy_test.h46
-rw-r--r--ppapi/proxy/ppb_audio_config_proxy.cc26
-rw-r--r--ppapi/proxy/ppb_audio_config_proxy.h4
-rw-r--r--ppapi/proxy/ppb_audio_proxy.cc96
-rw-r--r--ppapi/proxy/ppb_audio_proxy.h22
-rw-r--r--ppapi/proxy/ppb_buffer_proxy.cc27
-rw-r--r--ppapi/proxy/ppb_buffer_proxy.h4
-rw-r--r--ppapi/proxy/ppb_core_proxy.cc8
-rw-r--r--ppapi/proxy/ppb_core_proxy.h5
-rw-r--r--ppapi/proxy/ppb_cursor_control_proxy.cc25
-rw-r--r--ppapi/proxy/ppb_cursor_control_proxy.h5
-rw-r--r--ppapi/proxy/ppb_flash_proxy.cc20
-rw-r--r--ppapi/proxy/ppb_font_proxy.cc66
-rw-r--r--ppapi/proxy/ppb_font_proxy.h11
-rw-r--r--ppapi/proxy/ppb_graphics_2d_proxy.cc114
-rw-r--r--ppapi/proxy/ppb_graphics_2d_proxy.h23
-rw-r--r--ppapi/proxy/ppb_image_data_proxy.cc146
-rw-r--r--ppapi/proxy/ppb_image_data_proxy.h10
-rw-r--r--ppapi/proxy/ppb_instance_proxy.cc17
-rw-r--r--ppapi/proxy/ppb_instance_proxy.h5
-rw-r--r--ppapi/proxy/ppb_pdf_proxy.cc34
-rw-r--r--ppapi/proxy/ppb_pdf_proxy.h7
-rw-r--r--ppapi/proxy/ppb_testing_proxy.cc32
-rw-r--r--ppapi/proxy/ppb_testing_proxy.h5
-rw-r--r--ppapi/proxy/ppb_url_loader_proxy.cc256
-rw-r--r--ppapi/proxy/ppb_url_loader_proxy.h36
-rw-r--r--ppapi/proxy/ppb_url_request_info_proxy.cc85
-rw-r--r--ppapi/proxy/ppb_url_request_info_proxy.h13
-rw-r--r--ppapi/proxy/ppb_url_response_info_proxy.cc35
-rw-r--r--ppapi/proxy/ppb_url_response_info_proxy.h20
-rw-r--r--ppapi/proxy/ppp_instance_proxy.cc11
-rw-r--r--ppapi/proxy/ppp_instance_proxy.h3
-rw-r--r--ppapi/proxy/serialized_structs.cc1
-rw-r--r--ppapi/proxy/serialized_structs.h28
-rw-r--r--ppapi/proxy/serialized_var.cc54
-rw-r--r--ppapi/proxy/serialized_var.h64
-rw-r--r--ppapi/proxy/serialized_var_unittest.cc74
-rw-r--r--ppapi/proxy/var_serialization_rules.h5
64 files changed, 1670 insertions, 831 deletions
diff --git a/ppapi/c/dev/ppb_cursor_control_dev.h b/ppapi/c/dev/ppb_cursor_control_dev.h
index 104f6c5..8a51ac5 100644
--- a/ppapi/c/dev/ppb_cursor_control_dev.h
+++ b/ppapi/c/dev/ppb_cursor_control_dev.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2010 The Chromium Authors. All rights reserved.
+/* Copyright (c) 2011 The Chromium Authors. All rights reserved.
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
@@ -14,7 +14,7 @@
#define PPB_CURSOR_CONTROL_DEV_INTERFACE "PPB_CursorControl(Dev);0.3"
struct PPB_CursorControl_Dev {
- // Set a cursor. If "type" is PP_CURSOR_TYPE_CUSTOM, then "custom_image"
+ // Set a cursor. If "type" is PP_CURSORTYPE_CUSTOM, then "custom_image"
// must be an ImageData resource containing the cursor and "hot_spot" must
// contain the offset within that image that refers to the cursor's position.
PP_Bool (*SetCursor)(PP_Instance instance,
diff --git a/ppapi/ppapi_shared_proxy.gypi b/ppapi/ppapi_shared_proxy.gypi
index 8e62ae3..819f1ce 100644
--- a/ppapi/ppapi_shared_proxy.gypi
+++ b/ppapi/ppapi_shared_proxy.gypi
@@ -50,10 +50,9 @@
'proxy/dispatcher.h',
'proxy/host_dispatcher.cc',
'proxy/host_dispatcher.h',
+ 'proxy/host_resource.h',
'proxy/host_var_serialization_rules.cc',
'proxy/host_var_serialization_rules.h',
- 'proxy/image_data.cc',
- 'proxy/image_data.h',
'proxy/interface_proxy.cc',
'proxy/interface_proxy.h',
'proxy/plugin_dispatcher.cc',
diff --git a/ppapi/ppapi_tests.gypi b/ppapi/ppapi_tests.gypi
index dcb8578..9734827 100644
--- a/ppapi/ppapi_tests.gypi
+++ b/ppapi/ppapi_tests.gypi
@@ -267,8 +267,15 @@
'sources': [
'proxy/run_all_unittests.cc',
+ 'proxy/mock_resource.cc',
+ 'proxy/mock_resource.h',
+ 'proxy/plugin_resource_tracker_unittest.cc',
'proxy/plugin_var_tracker_unittest.cc',
+ 'proxy/ppapi_proxy_test.cc',
+ 'proxy/ppapi_proxy_test.h',
+ 'proxy/serialized_var_unittest.cc',
+ 'proxy/serialized_var_unittest.h',
],
- },
+ },
],
}
diff --git a/ppapi/proxy/dispatcher.cc b/ppapi/proxy/dispatcher.cc
index 0ae8e2e..f852c49 100644
--- a/ppapi/proxy/dispatcher.cc
+++ b/ppapi/proxy/dispatcher.cc
@@ -12,6 +12,7 @@
#include "base/logging.h"
#include "ipc/ipc_message.h"
#include "ipc/ipc_sync_channel.h"
+#include "ipc/ipc_test_sink.h"
#include "ppapi/c/dev/ppb_buffer_dev.h"
#include "ppapi/c/dev/ppb_char_set_dev.h"
#include "ppapi/c/dev/ppb_cursor_control_dev.h"
@@ -65,6 +66,7 @@ Dispatcher::Dispatcher(base::ProcessHandle remote_process_handle,
GetInterfaceFunc local_get_interface)
: pp_module_(0),
remote_process_handle_(remote_process_handle),
+ test_sink_(NULL),
disallow_trusted_interfaces_(false), // TODO(brettw) make this settable.
local_get_interface_(local_get_interface),
declared_supported_remote_interfaces_(false),
@@ -87,6 +89,11 @@ bool Dispatcher::InitWithChannel(MessageLoop* ipc_message_loop,
return true;
}
+void Dispatcher::InitWithTestSink(IPC::TestSink* test_sink) {
+ DCHECK(!test_sink_);
+ test_sink_ = test_sink;
+}
+
bool Dispatcher::OnMessageReceived(const IPC::Message& msg) {
// Control messages.
if (msg.routing_id() == MSG_ROUTING_CONTROL) {
@@ -157,6 +164,8 @@ const void* Dispatcher::GetProxiedInterface(const std::string& interface) {
}
bool Dispatcher::Send(IPC::Message* msg) {
+ if (test_sink_)
+ return test_sink_->Send(msg);
return channel_->Send(msg);
}
diff --git a/ppapi/proxy/dispatcher.h b/ppapi/proxy/dispatcher.h
index 8ef243b..1aac12d 100644
--- a/ppapi/proxy/dispatcher.h
+++ b/ppapi/proxy/dispatcher.h
@@ -29,6 +29,7 @@ class WaitableEvent;
namespace IPC {
class SyncChannel;
+class TestSink;
}
namespace pp {
@@ -60,11 +61,17 @@ class Dispatcher : public IPC::Channel::Listener,
~Dispatcher();
+ // You must call this function before anything else. Returns true on success.
bool InitWithChannel(MessageLoop* ipc_message_loop,
const IPC::ChannelHandle& channel_handle,
bool is_client,
base::WaitableEvent* shutdown_event);
+ // Alternative to InitWithChannel() for unit tests that want to send all
+ // messages sent via this dispatcher to the given test sink. The test sink
+ // must outlive this class.
+ void InitWithTestSink(IPC::TestSink* test_sink);
+
// Returns true if the dispatcher is on the plugin side, or false if it's the
// browser side.
virtual bool IsPlugin() const = 0;
@@ -104,6 +111,7 @@ class Dispatcher : public IPC::Channel::Listener,
// IPC::Channel::Listener implementation.
virtual bool OnMessageReceived(const IPC::Message& msg);
+ // Will be NULL in some unit tests.
IPC::SyncChannel* channel() const {
return channel_.get();
}
@@ -164,6 +172,13 @@ class Dispatcher : public IPC::Channel::Listener,
PP_Module pp_module_;
base::ProcessHandle remote_process_handle_; // See getter above.
+
+ // When we're unit testing, this will indicate the sink for the messages to
+ // be deposited so they can be inspected by the test. When non-NULL, this
+ // indicates that the channel should not be used.
+ IPC::TestSink* test_sink_;
+
+ // Will be null for some tests when there is a test_sink_.
scoped_ptr<IPC::SyncChannel> channel_;
bool disallow_trusted_interfaces_;
diff --git a/ppapi/proxy/host_resource.h b/ppapi/proxy/host_resource.h
new file mode 100644
index 0000000..badd2fd
--- /dev/null
+++ b/ppapi/proxy/host_resource.h
@@ -0,0 +1,60 @@
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef PPAPI_PROXY_HOST_RESOURCE_H_
+#define PPAPI_PROXY_HOST_RESOURCE_H_
+
+#include "ppapi/c/pp_instance.h"
+#include "ppapi/c/pp_resource.h"
+
+namespace pp {
+namespace proxy {
+
+// Represents a PP_Resource sent over the wire. This just wraps a PP_Resource.
+// The point is to prevent mistakes where the wrong resource value is sent.
+// Resource values are remapped in the plugin so that it can talk to multiple
+// hosts. If all values were PP_Resource, it would be easy to forget to do
+// this tranformation.
+//
+// All HostResources respresent IDs valid in the host.
+class HostResource {
+ public:
+ HostResource() : instance_(0), host_resource_(0) {
+ }
+
+ bool is_null() const {
+ return !host_resource_;
+ }
+
+ // Sets and retrieves the internal PP_Resource which is valid for the host
+ // (a.k.a. renderer, as opposed to the plugin) process.
+ //
+ // DO NOT CALL THESE FUNCTIONS IN THE PLUGIN SIDE OF THE PROXY. The values
+ // will be invalid. See the class comment above.
+ void SetHostResource(PP_Instance instance, PP_Resource resource) {
+ instance_ = instance;
+ host_resource_ = resource;
+ }
+ PP_Resource host_resource() const {
+ return host_resource_;
+ }
+
+ PP_Instance instance() const { return instance_; }
+
+ // This object is used in maps so we need to provide this sorting operator.
+ bool operator<(const HostResource& other) const {
+ if (instance_ != other.instance_)
+ return instance_ < other.instance_;
+ return host_resource_ < other.host_resource_;
+ }
+
+ private:
+ PP_Instance instance_;
+ PP_Resource host_resource_;
+};
+
+} // namespace proxy
+} // namespace pp
+
+#endif // PPAPI_PROXY_HOST_RESOURCE_H_
diff --git a/ppapi/proxy/host_var_serialization_rules.cc b/ppapi/proxy/host_var_serialization_rules.cc
index f6f00f7..2a1d0ee 100644
--- a/ppapi/proxy/host_var_serialization_rules.cc
+++ b/ppapi/proxy/host_var_serialization_rules.cc
@@ -62,7 +62,7 @@ PP_Var HostVarSerializationRules::ReceivePassRef(const PP_Var& var,
}
PP_Var HostVarSerializationRules::BeginSendPassRef(const PP_Var& var,
- std::string* str_val) {
+ std::string* str_val) {
// See PluginVarSerialization::ReceivePassRef for an example. We don't need
// to do anything here other than convert the string.
if (var.type == PP_VARTYPE_STRING)
@@ -70,7 +70,8 @@ PP_Var HostVarSerializationRules::BeginSendPassRef(const PP_Var& var,
return var;
}
-void HostVarSerializationRules::EndSendPassRef(const PP_Var& var) {
+void HostVarSerializationRules::EndSendPassRef(const PP_Var& /* var */,
+ Dispatcher* /* dispatcher */) {
// See PluginVarSerialization::ReceivePassRef for an example. We don't need
// to do anything here.
}
diff --git a/ppapi/proxy/host_var_serialization_rules.h b/ppapi/proxy/host_var_serialization_rules.h
index 2455c81..4fd39be 100644
--- a/ppapi/proxy/host_var_serialization_rules.h
+++ b/ppapi/proxy/host_var_serialization_rules.h
@@ -33,7 +33,7 @@ class HostVarSerializationRules : public VarSerializationRules {
const std::string& str_val,
Dispatcher* dispatcher);
virtual PP_Var BeginSendPassRef(const PP_Var& var, std::string* str_val);
- virtual void EndSendPassRef(const PP_Var& var);
+ virtual void EndSendPassRef(const PP_Var& var, Dispatcher* dispatcher);
virtual void ReleaseObjectRef(const PP_Var& var);
private:
diff --git a/ppapi/proxy/image_data.cc b/ppapi/proxy/image_data.cc
deleted file mode 100644
index 8042c38..0000000
--- a/ppapi/proxy/image_data.cc
+++ /dev/null
@@ -1,97 +0,0 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ppapi/proxy/image_data.h"
-
-#if defined(OS_LINUX)
-#include <sys/shm.h>
-#endif
-
-#if defined(OS_MACOSX)
-#include <sys/stat.h>
-#include <sys/mman.h>
-#endif
-
-namespace pp {
-namespace proxy {
-
-ImageData::ImageData(PP_Instance instance,
- const PP_ImageDataDesc& desc,
- ImageHandle handle)
- : PluginResource(instance),
- desc_(desc),
- handle_(handle),
- mapped_data_(NULL) {
-}
-
-ImageData::~ImageData() {
- Unmap();
-}
-
-ImageData* ImageData::AsImageData() {
- return this;
-}
-
-void* ImageData::Map() {
-#if defined(OS_WIN)
- NOTIMPLEMENTED();
- return NULL;
-#elif defined(OS_MACOSX)
- struct stat st;
- if (fstat(handle_.fd, &st) != 0)
- return NULL;
- void* memory = mmap(NULL, st.st_size, PROT_READ | PROT_WRITE,
- MAP_SHARED, handle_.fd, 0);
- if (memory == MAP_FAILED)
- return NULL;
- mapped_data_ = memory;
- return mapped_data_;
-#else
- int shmkey = handle_;
- void* address = shmat(shmkey, NULL, 0);
- // Mark for deletion in case we crash so the kernel will clean it up.
- shmctl(shmkey, IPC_RMID, 0);
- if (address == (void*)-1)
- return NULL;
- mapped_data_ = address;
- return address;
-#endif
-}
-
-void ImageData::Unmap() {
-#if defined(OS_WIN)
- NOTIMPLEMENTED();
-#elif defined(OS_MACOSX)
- if (mapped_data_) {
- struct stat st;
- if (fstat(handle_.fd, &st) == 0)
- munmap(mapped_data_, st.st_size);
- }
-#else
- if (mapped_data_)
- shmdt(mapped_data_);
-#endif
- mapped_data_ = NULL;
-}
-
-#if defined(OS_WIN)
-const ImageHandle ImageData::NullHandle = NULL;
-#elif defined(OS_MACOSX)
-const ImageHandle ImageData::NullHandle = ImageHandle();
-#else
-const ImageHandle ImageData::NullHandle = 0;
-#endif
-
-ImageHandle ImageData::HandleFromInt(int32_t i) {
-#if defined(OS_WIN)
- return reinterpret_cast<ImageHandle>(i);
-#elif defined(OS_MACOSX)
- return ImageHandle(i, false);
-#else
- return static_cast<ImageHandle>(i);
-#endif
-}
-
-} // namespace proxy
-} // namespace pp
diff --git a/ppapi/proxy/image_data.h b/ppapi/proxy/image_data.h
deleted file mode 100644
index 539a475..0000000
--- a/ppapi/proxy/image_data.h
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PPAPI_PROXY_IMAGE_DATA_H_
-#define PPAPI_PROXY_IMAGE_DATA_H_
-
-#include "base/shared_memory.h"
-#include "ppapi/c/pp_instance.h"
-#include "ppapi/c/ppb_image_data.h"
-#include "ppapi/proxy/plugin_resource.h"
-#include "ppapi/proxy/serialized_structs.h"
-#include "ppapi/shared_impl/image_data_impl.h"
-
-namespace pp {
-namespace proxy {
-
-class ImageData : public PluginResource,
- public pp::shared_impl::ImageDataImpl {
- public:
- ImageData(PP_Instance instance,
- const PP_ImageDataDesc& desc,
- ImageHandle handle);
- virtual ~ImageData();
-
- // Resource overrides.
- virtual ImageData* AsImageData();
-
- void* Map();
- void Unmap();
-
- const PP_ImageDataDesc& desc() const { return desc_; }
-
- static const ImageHandle NullHandle;
- static ImageHandle HandleFromInt(int32_t i);
-
- private:
- PP_ImageDataDesc desc_;
- ImageHandle handle_;
-
- void* mapped_data_;
-
- DISALLOW_COPY_AND_ASSIGN(ImageData);
-};
-
-} // namespace proxy
-} // namespace pp
-
-#endif // PPAPI_PROXY_IMAGE_DATA_H_
diff --git a/ppapi/proxy/mock_resource.cc b/ppapi/proxy/mock_resource.cc
new file mode 100644
index 0000000..21e5381
--- /dev/null
+++ b/ppapi/proxy/mock_resource.cc
@@ -0,0 +1,22 @@
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ppapi/proxy/mock_resource.h"
+
+namespace pp {
+namespace proxy {
+
+MockResource::MockResource(const HostResource& resource)
+ : PluginResource(resource) {
+}
+
+MockResource::~MockResource() {
+}
+
+MockResource* MockResource::AsMockResource() {
+ return this;
+}
+
+} // namespace proxy
+} // namespace pp
diff --git a/ppapi/proxy/mock_resource.h b/ppapi/proxy/mock_resource.h
new file mode 100644
index 0000000..7e38be1
--- /dev/null
+++ b/ppapi/proxy/mock_resource.h
@@ -0,0 +1,29 @@
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef PPAPI_PROXY_MOCK_RESOURCE_H_
+#define PPAPI_PROXY_MOCK_RESOURCE_H_
+
+#include "ppapi/c/pp_instance.h"
+#include "ppapi/proxy/plugin_resource.h"
+
+namespace pp {
+namespace proxy {
+
+class MockResource : public PluginResource {
+ public:
+ MockResource(const HostResource& resource);
+ virtual ~MockResource();
+
+ // Resource overrides.
+ virtual MockResource* AsMockResource();
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(MockResource);
+};
+
+} // namespace proxy
+} // namespace pp
+
+#endif // PPAPI_PROXY_MOCK_RESOURCE_H_
diff --git a/ppapi/proxy/plugin_resource.cc b/ppapi/proxy/plugin_resource.cc
index 809ea40..83dadc6 100644
--- a/ppapi/proxy/plugin_resource.cc
+++ b/ppapi/proxy/plugin_resource.cc
@@ -7,7 +7,8 @@
namespace pp {
namespace proxy {
-PluginResource::PluginResource(PP_Instance instance) : instance_(instance) {
+PluginResource::PluginResource(const HostResource& resource)
+ : host_resource_(resource) {
}
PluginResource::~PluginResource() {
diff --git a/ppapi/proxy/plugin_resource.h b/ppapi/proxy/plugin_resource.h
index 8eee931..9fda1b5 100644
--- a/ppapi/proxy/plugin_resource.h
+++ b/ppapi/proxy/plugin_resource.h
@@ -7,6 +7,7 @@
#include "base/basictypes.h"
#include "ppapi/c/pp_instance.h"
+#include "ppapi/proxy/host_resource.h"
#include "ppapi/proxy/plugin_dispatcher.h"
#include "ppapi/proxy/plugin_resource_tracker.h"
@@ -18,6 +19,7 @@
F(Font) \
F(Graphics2D) \
F(ImageData) \
+ F(MockResource) \
F(PrivateFontFile) \
F(URLLoader) \
F(URLRequestInfo)\
@@ -33,7 +35,7 @@ FOR_ALL_PLUGIN_RESOURCES(DECLARE_RESOURCE_CLASS)
class PluginResource {
public:
- PluginResource(PP_Instance instance);
+ PluginResource(const HostResource& resource);
virtual ~PluginResource();
// Returns NULL if the resource is invalid or is a different type.
@@ -45,7 +47,12 @@ class PluginResource {
template <typename T> T* Cast() { return NULL; }
- PP_Instance instance() const { return instance_; }
+ PP_Instance instance() const { return host_resource_.instance(); }
+
+ // Returns the host resource ID for sending to the host process.
+ const HostResource& host_resource() const {
+ return host_resource_;
+ }
private:
// Type-specific getters for individual resource types. These will return
@@ -56,8 +63,11 @@ class PluginResource {
FOR_ALL_PLUGIN_RESOURCES(DEFINE_TYPE_GETTER)
#undef DEFINE_TYPE_GETTER
- // Instance this resource is associated with.
- PP_Instance instance_;
+ // The resource ID in the host that this object corresponds to. Inside the
+ // plugin we'll remap the resource IDs so we can have many host processes
+ // each independently generating resources (which may conflict) but the IDs
+ // in the plugin will all be unique.
+ HostResource host_resource_;
DISALLOW_COPY_AND_ASSIGN(PluginResource);
};
diff --git a/ppapi/proxy/plugin_resource_tracker.cc b/ppapi/proxy/plugin_resource_tracker.cc
index f81a5f3..162f3f8 100644
--- a/ppapi/proxy/plugin_resource_tracker.cc
+++ b/ppapi/proxy/plugin_resource_tracker.cc
@@ -14,6 +14,13 @@
namespace pp {
namespace proxy {
+namespace {
+
+// When non-NULL, this object overrides the ResourceTrackerSingleton.
+PluginResourceTracker* g_resource_tracker_override = NULL;
+
+} // namespace
+
PluginResourceTracker::ResourceInfo::ResourceInfo() : ref_count(0) {
}
@@ -39,14 +46,24 @@ PluginResourceTracker::ResourceInfo::operator=(
return *this;
}
-PluginResourceTracker::PluginResourceTracker() {
+// Start counting resources at a high number to avoid collisions with vars (to
+// help debugging).
+PluginResourceTracker::PluginResourceTracker()
+ : last_resource_id_(0x00100000) {
}
PluginResourceTracker::~PluginResourceTracker() {
}
// static
+void PluginResourceTracker::SetInstanceForTest(PluginResourceTracker* tracker) {
+ g_resource_tracker_override = tracker;
+}
+
+// static
PluginResourceTracker* PluginResourceTracker::GetInstance() {
+ if (g_resource_tracker_override)
+ return g_resource_tracker_override;
return Singleton<PluginResourceTracker>::get();
}
@@ -58,37 +75,41 @@ PluginResource* PluginResourceTracker::GetResourceObject(
return found->second.resource.get();
}
-void PluginResourceTracker::AddResource(PP_Resource pp_resource,
- linked_ptr<PluginResource> object) {
- DCHECK(resource_map_.find(pp_resource) == resource_map_.end());
- resource_map_[pp_resource] = ResourceInfo(1, object);
+PP_Resource PluginResourceTracker::AddResource(
+ linked_ptr<PluginResource> object) {
+ if (object->host_resource().is_null()) {
+ // Prevent adding null resources or GetResourceObject(0) will return a
+ // valid pointer!
+ NOTREACHED();
+ return 0;
+ }
+
+ PP_Resource plugin_resource = ++last_resource_id_;
+ DCHECK(resource_map_.find(plugin_resource) == resource_map_.end());
+ resource_map_[plugin_resource] = ResourceInfo(1, object);
+ host_resource_map_[object->host_resource()] = plugin_resource;
+ return plugin_resource;
}
void PluginResourceTracker::AddRefResource(PP_Resource resource) {
- resource_map_[resource].ref_count++;
+ ResourceMap::iterator found = resource_map_.find(resource);
+ if (found == resource_map_.end()) {
+ NOTREACHED();
+ return;
+ }
+ found->second.ref_count++;
}
void PluginResourceTracker::ReleaseResource(PP_Resource resource) {
ReleasePluginResourceRef(resource, true);
}
-bool PluginResourceTracker::PreparePreviouslyTrackedResource(
- PP_Resource resource) {
- ResourceMap::iterator found = resource_map_.find(resource);
- if (found == resource_map_.end())
- return false; // We've not seen this resource before.
-
- // We have already seen this resource and the caller wants the plugin to
- // have one more ref to the object (this function is called when retuning
- // a resource).
- //
- // This is like the PluginVarTracker::ReceiveObjectPassRef. We do an AddRef
- // in the plugin for the additional ref, and then a Release in the renderer
- // because the code in the renderer addrefed on behalf of the caller.
- found->second.ref_count++;
-
- SendReleaseResourceToHost(resource, found->second.resource.get());
- return true;
+PP_Resource PluginResourceTracker::PluginResourceForHostResource(
+ const HostResource& resource) const {
+ HostResourceMap::const_iterator found = host_resource_map_.find(resource);
+ if (found == host_resource_map_.end())
+ return 0;
+ return found->second;
}
void PluginResourceTracker::ReleasePluginResourceRef(
@@ -99,8 +120,10 @@ void PluginResourceTracker::ReleasePluginResourceRef(
return;
found->second.ref_count--;
if (found->second.ref_count == 0) {
+ PluginResource* plugin_resource = found->second.resource.get();
if (notify_browser_on_release)
- SendReleaseResourceToHost(resource, found->second.resource.get());
+ SendReleaseResourceToHost(resource, plugin_resource);
+ host_resource_map_.erase(plugin_resource->host_resource());
resource_map_.erase(found);
}
}
@@ -112,7 +135,7 @@ void PluginResourceTracker::SendReleaseResourceToHost(
PluginDispatcher::GetForInstance(resource->instance());
if (dispatcher) {
dispatcher->Send(new PpapiHostMsg_PPBCore_ReleaseResource(
- INTERFACE_ID_PPB_CORE, resource_id));
+ INTERFACE_ID_PPB_CORE, resource->host_resource()));
} else {
NOTREACHED();
}
diff --git a/ppapi/proxy/plugin_resource_tracker.h b/ppapi/proxy/plugin_resource_tracker.h
index ba6ddb3..ee7ad96 100644
--- a/ppapi/proxy/plugin_resource_tracker.h
+++ b/ppapi/proxy/plugin_resource_tracker.h
@@ -6,12 +6,15 @@
#define PPAPI_PROXY_PLUGIN_RESOURCE_TRACKER_H_
#include <map>
+#include <utility>
#include "base/linked_ptr.h"
#include "ppapi/c/pp_completion_callback.h"
+#include "ppapi/c/pp_instance.h"
#include "ppapi/c/pp_stdint.h"
#include "ppapi/c/pp_resource.h"
#include "ppapi/c/pp_var.h"
+#include "ppapi/proxy/host_resource.h"
template<typename T> struct DefaultSingletonTraits;
@@ -23,6 +26,11 @@ class PluginResource;
class PluginResourceTracker {
public:
+ // Called by tests that want to specify a specific ResourceTracker. This
+ // allows them to use a unique one each time and avoids singletons sticking
+ // around across tests.
+ static void SetInstanceForTest(PluginResourceTracker* tracker);
+
// Returns the global singleton resource tracker for the plugin.
static PluginResourceTracker* GetInstance();
@@ -30,38 +38,24 @@ class PluginResourceTracker {
// there isn't one.
PluginResource* GetResourceObject(PP_Resource pp_resource);
- void AddResource(PP_Resource pp_resource, linked_ptr<PluginResource> object);
+ // Adds the given resource object to the tracked list, and returns the
+ // plugin-local PP_Resource ID that identifies the resource. Note that this
+ // PP_Resource is not valid to send to the host, use
+ // PluginResource.host_resource() to get that.
+ PP_Resource AddResource(linked_ptr<PluginResource> object);
void AddRefResource(PP_Resource resource);
void ReleaseResource(PP_Resource resource);
- // Checks if the resource just returned from the renderer is already
- // tracked by the plugin side and adjusts the refcounts if so.
- //
- // When the browser returns a PP_Resource, it could be a new one, in which
- // case the proxy wants to create a corresponding object and call
- // AddResource() on it. However, if the resouce is already known, then the
- // refcount needs to be adjusted in both the plugin and the renderer side
- // and no such object needs to be created.
- //
- // Returns true if the resource was previously known. The refcount will be
- // fixed up such that it's ready to use by the plugin. A proxy can then
- // just return the resource without doing any more work.
- //
- // Typical usage:
- //
- // PP_Resource result;
- // dispatcher->Send(new MyMessage(..., &result));
- // if (PluginResourceTracker::GetInstance()->
- // PreparePreviouslyTrackedResource(result))
- // return result;
- // ... create resource object ...
- // PluginResourceTracker::GetInstance()->AddResource(result, object);
- // return result;
- bool PreparePreviouslyTrackedResource(PP_Resource resource);
+ // Given a host resource, maps it to an existing plugin resource ID if it
+ // exists, or returns 0 on failure.
+ PP_Resource PluginResourceForHostResource(
+ const HostResource& resource) const;
private:
friend struct DefaultSingletonTraits<PluginResourceTracker>;
+ friend class PluginResourceTrackerTest;
+ friend class PluginProxyTest;
PluginResourceTracker();
~PluginResourceTracker();
@@ -86,8 +80,19 @@ class PluginResourceTracker {
void SendReleaseResourceToHost(PP_Resource resource_id,
PluginResource* resource);
+ // Map of plugin resource IDs to the information tracking that resource.
typedef std::map<PP_Resource, ResourceInfo> ResourceMap;
ResourceMap resource_map_;
+
+ // Map of host instance/resource pairs to a plugin resource ID.
+ typedef std::map<HostResource, PP_Resource> HostResourceMap;
+ HostResourceMap host_resource_map_;
+
+ // Tracks the last ID we've sent out as a plugin resource so we don't send
+ // duplicates.
+ PP_Resource last_resource_id_;
+
+ DISALLOW_COPY_AND_ASSIGN(PluginResourceTracker);
};
} // namespace proxy
diff --git a/ppapi/proxy/plugin_resource_tracker_unittest.cc b/ppapi/proxy/plugin_resource_tracker_unittest.cc
new file mode 100644
index 0000000..4145a13
--- /dev/null
+++ b/ppapi/proxy/plugin_resource_tracker_unittest.cc
@@ -0,0 +1,75 @@
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/process.h"
+#include "base/scoped_ptr.h"
+#include "ppapi/proxy/mock_resource.h"
+#include "ppapi/proxy/plugin_dispatcher.h"
+#include "ppapi/proxy/plugin_resource_tracker.h"
+#include "ppapi/proxy/ppapi_messages.h"
+#include "ppapi/proxy/ppapi_proxy_test.h"
+
+namespace pp {
+namespace proxy {
+
+namespace {
+
+// Object so we know when a resource has been released.
+class TrackedMockResource : public MockResource {
+ public:
+ TrackedMockResource(const HostResource& serialized)
+ : MockResource(serialized) {
+ tracked_alive_count++;
+ }
+ ~TrackedMockResource() {
+ tracked_alive_count--;
+ }
+
+ static int tracked_alive_count;
+};
+
+int TrackedMockResource::tracked_alive_count = 0;
+
+} // namespace
+
+class PluginResourceTrackerTest : public PluginProxyTest {
+ public:
+ PluginResourceTrackerTest() {}
+ ~PluginResourceTrackerTest() {}
+
+ PluginResourceTracker& tracker() { return tracker_; }
+
+ private:
+ PluginResourceTracker tracker_;
+};
+
+TEST_F(PluginResourceTrackerTest, PluginResourceForHostResource) {
+ PP_Instance instance = 0x1234;
+ PP_Resource host_resource = 0x5678;
+
+ HostResource serialized;
+ serialized.SetHostResource(instance, host_resource);
+
+ // When we haven't added an object, the return value should be 0.
+ EXPECT_EQ(0, tracker().PluginResourceForHostResource(serialized));
+
+ EXPECT_EQ(0, TrackedMockResource::tracked_alive_count);
+ TrackedMockResource* object = new TrackedMockResource(serialized);
+ EXPECT_EQ(1, TrackedMockResource::tracked_alive_count);
+ PP_Resource plugin_resource =
+ tracker().AddResource(linked_ptr<PluginResource>(object));
+
+ // Now that the object has been added, the return value should be the plugin
+ // resource ID we already got.
+ EXPECT_EQ(plugin_resource,
+ tracker().PluginResourceForHostResource(serialized));
+
+ // Releasing the resource should have freed it.
+ tracker().ReleaseResource(plugin_resource);
+ EXPECT_EQ(0, TrackedMockResource::tracked_alive_count);
+ EXPECT_EQ(0, tracker().PluginResourceForHostResource(serialized));
+}
+
+} // namespace proxy
+} // namespace pp
diff --git a/ppapi/proxy/plugin_var_serialization_rules.cc b/ppapi/proxy/plugin_var_serialization_rules.cc
index 7828587..a56e5b4 100644
--- a/ppapi/proxy/plugin_var_serialization_rules.cc
+++ b/ppapi/proxy/plugin_var_serialization_rules.cc
@@ -118,10 +118,14 @@ PP_Var PluginVarSerializationRules::BeginSendPassRef(const PP_Var& var,
return var;
}
-void PluginVarSerializationRules::EndSendPassRef(const PP_Var& var) {
+void PluginVarSerializationRules::EndSendPassRef(const PP_Var& var,
+ Dispatcher* dispatcher) {
// See BeginSendPassRef for an example of why we release our ref here.
+ // The var we have in our inner class has been converted to a host object
+ // by BeginSendPassRef. This means it's not a normal var valid in the plugin,
+ // so we need to use the special ReleaseHostObject.
if (var.type == PP_VARTYPE_OBJECT)
- var_tracker_->Release(var);
+ var_tracker_->ReleaseHostObject(dispatcher, var);
}
void PluginVarSerializationRules::ReleaseObjectRef(const PP_Var& var) {
diff --git a/ppapi/proxy/plugin_var_serialization_rules.h b/ppapi/proxy/plugin_var_serialization_rules.h
index 36e58e7..e073602 100644
--- a/ppapi/proxy/plugin_var_serialization_rules.h
+++ b/ppapi/proxy/plugin_var_serialization_rules.h
@@ -31,7 +31,7 @@ class PluginVarSerializationRules : public VarSerializationRules {
const std::string& str_val,
Dispatcher* dispatcher);
virtual PP_Var BeginSendPassRef(const PP_Var& var, std::string* str_val);
- virtual void EndSendPassRef(const PP_Var& var);
+ virtual void EndSendPassRef(const PP_Var& var, Dispatcher* dispatcher);
virtual void ReleaseObjectRef(const PP_Var& var);
private:
diff --git a/ppapi/proxy/plugin_var_tracker.cc b/ppapi/proxy/plugin_var_tracker.cc
index 42370be..c079716 100644
--- a/ppapi/proxy/plugin_var_tracker.cc
+++ b/ppapi/proxy/plugin_var_tracker.cc
@@ -15,6 +15,9 @@ namespace proxy {
namespace {
+// When non-NULL, this object overrides the VarTrackerSingleton.
+PluginVarTracker* var_tracker_override = NULL;
+
class RefCountedString : public base::RefCounted<RefCountedString> {
public:
RefCountedString() {
@@ -64,7 +67,15 @@ PluginVarTracker::PluginVarTracker() : last_plugin_object_id_(0) {
PluginVarTracker::~PluginVarTracker() {
}
+// static
+void PluginVarTracker::SetInstanceForTest(PluginVarTracker* tracker) {
+ var_tracker_override = tracker;
+}
+
+// static
PluginVarTracker* PluginVarTracker::GetInstance() {
+ if (var_tracker_override)
+ return var_tracker_override;
return Singleton<PluginVarTracker>::get();
}
@@ -221,6 +232,24 @@ PP_Var PluginVarTracker::GetHostObject(const PP_Var& plugin_object) const {
return ret;
}
+void PluginVarTracker::ReleaseHostObject(Sender* sender,
+ const PP_Var& host_object) {
+ // Convert the host object to a normal var valid in the plugin.
+ DCHECK(host_object.type == PP_VARTYPE_OBJECT);
+ HostVarToPluginVarMap::iterator found = host_var_to_plugin_var_.find(
+ HostVar(sender, host_object.value.as_id));
+ if (found == host_var_to_plugin_var_.end()) {
+ NOTREACHED();
+ return;
+ }
+
+ // Now just release the object like normal.
+ PP_Var plugin_object;
+ plugin_object.type = PP_VARTYPE_OBJECT;
+ plugin_object.value.as_id = found->second;
+ Release(plugin_object);
+}
+
int PluginVarTracker::GetRefCountForObject(const PP_Var& plugin_object) {
PluginVarInfoMap::iterator found = plugin_var_info_.find(
plugin_object.value.as_id);
diff --git a/ppapi/proxy/plugin_var_tracker.h b/ppapi/proxy/plugin_var_tracker.h
index 02e83d5..21cd4594 100644
--- a/ppapi/proxy/plugin_var_tracker.h
+++ b/ppapi/proxy/plugin_var_tracker.h
@@ -44,6 +44,11 @@ class PluginVarTracker {
// Dispatcher in this class, which makes it easy to unit test.
typedef IPC::Channel::Sender Sender;
+ // Called by tests that want to specify a specific VarTracker. This allows
+ // them to use a unique one each time and avoids singletons sticking around
+ // across tests.
+ static void SetInstanceForTest(PluginVarTracker* tracker);
+
// Returns the global var tracker for the plugin object.
static PluginVarTracker* GetInstance();
@@ -75,6 +80,10 @@ class PluginVarTracker {
// should be a VARTYPE_OBJECT
PP_Var GetHostObject(const PP_Var& plugin_object) const;
+ // Like Release() but the var is identified by its host object ID (as
+ // returned by GetHostObject).
+ void ReleaseHostObject(Sender* sender, const PP_Var& host_object);
+
// Retrieves the internal reference counts for testing. Returns 0 if we
// know about the object but the corresponding value is 0, or -1 if the
// given object ID isn't in our map.
@@ -83,7 +92,7 @@ class PluginVarTracker {
private:
friend struct DefaultSingletonTraits<PluginVarTracker>;
- friend class PluginVarTrackerTest;
+ friend class PluginProxyTest;
// Represents a var as received from the host.
struct HostVar {
diff --git a/ppapi/proxy/plugin_var_tracker_unittest.cc b/ppapi/proxy/plugin_var_tracker_unittest.cc
index 52f7168..25663f9 100644
--- a/ppapi/proxy/plugin_var_tracker_unittest.cc
+++ b/ppapi/proxy/plugin_var_tracker_unittest.cc
@@ -5,7 +5,7 @@
#include "ipc/ipc_test_sink.h"
#include "ppapi/proxy/plugin_var_tracker.h"
#include "ppapi/proxy/ppapi_messages.h"
-#include "testing/gtest/include/gtest/gtest.h"
+#include "ppapi/proxy/ppapi_proxy_test.h"
namespace pp {
namespace proxy {
@@ -29,7 +29,7 @@ PP_Var MakeString(PluginVarTracker::VarID string_id) {
} // namespace
-class PluginVarTrackerTest : public testing::Test {
+class PluginVarTrackerTest : public PluginProxyTest {
public:
PluginVarTrackerTest() {}
@@ -37,7 +37,7 @@ class PluginVarTrackerTest : public testing::Test {
// Asserts that there is a unique "release object" IPC message in the test
// sink. This will return the var ID from the message or -1 if none found.
PluginVarTracker::VarID GetObjectIDForUniqueReleaseObject() {
- const IPC::Message* release_msg = sink_.GetUniqueMessageMatching(
+ const IPC::Message* release_msg = sink().GetUniqueMessageMatching(
PpapiHostMsg_PPBVar_ReleaseObject::ID);
if (!release_msg)
return -1;
@@ -46,25 +46,21 @@ class PluginVarTrackerTest : public testing::Test {
PpapiHostMsg_PPBVar_ReleaseObject::Read(release_msg, &id);
return id.a;
}
-
- PluginVarTracker tracker_;
-
- IPC::TestSink sink_;
};
TEST_F(PluginVarTrackerTest, Strings) {
std::string str("Hello");
- PluginVarTracker::VarID str_id1 = tracker_.MakeString(str);
+ PluginVarTracker::VarID str_id1 = var_tracker().MakeString(str);
EXPECT_NE(0, str_id1);
- PluginVarTracker::VarID str_id2 = tracker_.MakeString(
+ PluginVarTracker::VarID str_id2 = var_tracker().MakeString(
str.c_str(), static_cast<uint32_t>(str.size()));
EXPECT_NE(0, str_id2);
// Make sure the strings come out the other end.
- std::string result = tracker_.GetString(MakeString(str_id1));
+ std::string result = var_tracker().GetString(MakeString(str_id1));
EXPECT_EQ(str, result);
- result = tracker_.GetString(MakeString(str_id2));
+ result = var_tracker().GetString(MakeString(str_id2));
EXPECT_EQ(str, result);
}
@@ -73,43 +69,46 @@ TEST_F(PluginVarTrackerTest, GetHostObject) {
// Round-trip through the tracker to make sure the host object comes out the
// other end.
- PP_Var plugin_object = tracker_.ReceiveObjectPassRef(host_object, &sink_);
- PP_Var host_object2 = tracker_.GetHostObject(plugin_object);
+ PP_Var plugin_object = var_tracker().ReceiveObjectPassRef(host_object,
+ &sink());
+ PP_Var host_object2 = var_tracker().GetHostObject(plugin_object);
EXPECT_EQ(PP_VARTYPE_OBJECT, host_object2.type);
EXPECT_EQ(host_object.value.as_id, host_object2.value.as_id);
- tracker_.Release(plugin_object);
+ var_tracker().Release(plugin_object);
}
TEST_F(PluginVarTrackerTest, ReceiveObjectPassRef) {
PP_Var host_object = MakeObject(12345);
// Receive the object, we should have one ref and no messages.
- PP_Var plugin_object = tracker_.ReceiveObjectPassRef(host_object, &sink_);
- EXPECT_EQ(0u, sink_.message_count());
- EXPECT_EQ(1, tracker_.GetRefCountForObject(plugin_object));
+ PP_Var plugin_object = var_tracker().ReceiveObjectPassRef(host_object,
+ &sink());
+ EXPECT_EQ(0u, sink().message_count());
+ EXPECT_EQ(1, var_tracker().GetRefCountForObject(plugin_object));
EXPECT_EQ(0,
- tracker_.GetTrackedWithNoReferenceCountForObject(plugin_object));
+ var_tracker().GetTrackedWithNoReferenceCountForObject(plugin_object));
// Receive the same object again, we should get the same plugin ID out.
- PP_Var plugin_object2 = tracker_.ReceiveObjectPassRef(host_object, &sink_);
+ PP_Var plugin_object2 = var_tracker().ReceiveObjectPassRef(host_object,
+ &sink());
EXPECT_EQ(plugin_object.value.as_id, plugin_object2.value.as_id);
- EXPECT_EQ(2, tracker_.GetRefCountForObject(plugin_object));
+ EXPECT_EQ(2, var_tracker().GetRefCountForObject(plugin_object));
EXPECT_EQ(0,
- tracker_.GetTrackedWithNoReferenceCountForObject(plugin_object));
+ var_tracker().GetTrackedWithNoReferenceCountForObject(plugin_object));
// It should have sent one message to decerment the refcount in the host.
// This is because it only maintains one host refcount for all references
// in the plugin, but the host just sent the second one.
EXPECT_EQ(host_object.value.as_id, GetObjectIDForUniqueReleaseObject());
- sink_.ClearMessages();
+ sink().ClearMessages();
// Release the object, one ref at a time. The second release should free
// the tracking data and send a release message to the browser.
- tracker_.Release(plugin_object);
- EXPECT_EQ(1, tracker_.GetRefCountForObject(plugin_object));
- tracker_.Release(plugin_object);
- EXPECT_EQ(-1, tracker_.GetRefCountForObject(plugin_object));
+ var_tracker().Release(plugin_object);
+ EXPECT_EQ(1, var_tracker().GetRefCountForObject(plugin_object));
+ var_tracker().Release(plugin_object);
+ EXPECT_EQ(-1, var_tracker().GetRefCountForObject(plugin_object));
EXPECT_EQ(host_object.value.as_id, GetObjectIDForUniqueReleaseObject());
}
@@ -118,39 +117,43 @@ TEST_F(PluginVarTrackerTest, FreeTrackedAndReferencedObject) {
PP_Var host_object = MakeObject(12345);
// Phase one: First receive via a "pass ref", then a tracked with no ref.
- PP_Var plugin_var = tracker_.ReceiveObjectPassRef(host_object, &sink_);
- PP_Var plugin_var2 = tracker_.TrackObjectWithNoReference(host_object, &sink_);
+ PP_Var plugin_var = var_tracker().ReceiveObjectPassRef(host_object, &sink());
+ PP_Var plugin_var2 =
+ var_tracker().TrackObjectWithNoReference(host_object, &sink());
EXPECT_EQ(plugin_var.value.as_id, plugin_var2.value.as_id);
- EXPECT_EQ(1, tracker_.GetRefCountForObject(plugin_var));
- EXPECT_EQ(1, tracker_.GetTrackedWithNoReferenceCountForObject(plugin_var));
+ EXPECT_EQ(1, var_tracker().GetRefCountForObject(plugin_var));
+ EXPECT_EQ(1,
+ var_tracker().GetTrackedWithNoReferenceCountForObject(plugin_var));
// Free via the refcount, this should release the object to the browser but
// maintain the tracked object.
- tracker_.Release(plugin_var);
- EXPECT_EQ(0, tracker_.GetRefCountForObject(plugin_var));
- EXPECT_EQ(1u, sink_.message_count());
+ var_tracker().Release(plugin_var);
+ EXPECT_EQ(0, var_tracker().GetRefCountForObject(plugin_var));
+ EXPECT_EQ(1u, sink().message_count());
EXPECT_EQ(host_object.value.as_id, GetObjectIDForUniqueReleaseObject());
// Now free via the tracked object, this should free it.
- tracker_.StopTrackingObjectWithNoReference(plugin_var);
- EXPECT_EQ(-1, tracker_.GetRefCountForObject(plugin_var));
+ var_tracker().StopTrackingObjectWithNoReference(plugin_var);
+ EXPECT_EQ(-1, var_tracker().GetRefCountForObject(plugin_var));
// Phase two: Receive via a tracked, then get an addref.
- sink_.ClearMessages();
- plugin_var = tracker_.TrackObjectWithNoReference(host_object, &sink_);
- plugin_var2 = tracker_.ReceiveObjectPassRef(host_object, &sink_);
+ sink().ClearMessages();
+ plugin_var = var_tracker().TrackObjectWithNoReference(host_object, &sink());
+ plugin_var2 = var_tracker().ReceiveObjectPassRef(host_object, &sink());
EXPECT_EQ(plugin_var.value.as_id, plugin_var2.value.as_id);
- EXPECT_EQ(1, tracker_.GetRefCountForObject(plugin_var));
- EXPECT_EQ(1, tracker_.GetTrackedWithNoReferenceCountForObject(plugin_var));
+ EXPECT_EQ(1, var_tracker().GetRefCountForObject(plugin_var));
+ EXPECT_EQ(1,
+ var_tracker().GetTrackedWithNoReferenceCountForObject(plugin_var));
// Free via the tracked object, this should have no effect.
- tracker_.StopTrackingObjectWithNoReference(plugin_var);
- EXPECT_EQ(0, tracker_.GetTrackedWithNoReferenceCountForObject(plugin_var));
- EXPECT_EQ(0u, sink_.message_count());
+ var_tracker().StopTrackingObjectWithNoReference(plugin_var);
+ EXPECT_EQ(0,
+ var_tracker().GetTrackedWithNoReferenceCountForObject(plugin_var));
+ EXPECT_EQ(0u, sink().message_count());
// Now free via the refcount, this should delete it.
- tracker_.Release(plugin_var);
- EXPECT_EQ(-1, tracker_.GetRefCountForObject(plugin_var));
+ var_tracker().Release(plugin_var);
+ EXPECT_EQ(-1, var_tracker().GetRefCountForObject(plugin_var));
EXPECT_EQ(host_object.value.as_id, GetObjectIDForUniqueReleaseObject());
}
@@ -158,18 +161,24 @@ TEST_F(PluginVarTrackerTest, RecursiveTrackWithNoRef) {
PP_Var host_object = MakeObject(12345);
// Receive a tracked object twice.
- PP_Var plugin_var = tracker_.TrackObjectWithNoReference(host_object, &sink_);
- EXPECT_EQ(1, tracker_.GetTrackedWithNoReferenceCountForObject(plugin_var));
- PP_Var plugin_var2 = tracker_.TrackObjectWithNoReference(host_object, &sink_);
+ PP_Var plugin_var = var_tracker().TrackObjectWithNoReference(
+ host_object, &sink());
+ EXPECT_EQ(1,
+ var_tracker().GetTrackedWithNoReferenceCountForObject(plugin_var));
+ PP_Var plugin_var2 = var_tracker().TrackObjectWithNoReference(host_object,
+ &sink());
EXPECT_EQ(plugin_var.value.as_id, plugin_var2.value.as_id);
- EXPECT_EQ(0, tracker_.GetRefCountForObject(plugin_var));
- EXPECT_EQ(2, tracker_.GetTrackedWithNoReferenceCountForObject(plugin_var));
+ EXPECT_EQ(0, var_tracker().GetRefCountForObject(plugin_var));
+ EXPECT_EQ(2,
+ var_tracker().GetTrackedWithNoReferenceCountForObject(plugin_var));
// Now release those tracked items, the reference should be freed.
- tracker_.StopTrackingObjectWithNoReference(plugin_var);
- EXPECT_EQ(1, tracker_.GetTrackedWithNoReferenceCountForObject(plugin_var));
- tracker_.StopTrackingObjectWithNoReference(plugin_var);
- EXPECT_EQ(-1, tracker_.GetTrackedWithNoReferenceCountForObject(plugin_var));
+ var_tracker().StopTrackingObjectWithNoReference(plugin_var);
+ EXPECT_EQ(1,
+ var_tracker().GetTrackedWithNoReferenceCountForObject(plugin_var));
+ var_tracker().StopTrackingObjectWithNoReference(plugin_var);
+ EXPECT_EQ(-1,
+ var_tracker().GetTrackedWithNoReferenceCountForObject(plugin_var));
}
} // namespace proxy
diff --git a/ppapi/proxy/ppapi_messages_internal.h b/ppapi/proxy/ppapi_messages_internal.h
index 84a54fd..e949ad1 100644
--- a/ppapi/proxy/ppapi_messages_internal.h
+++ b/ppapi/proxy/ppapi_messages_internal.h
@@ -45,16 +45,12 @@ IPC_MESSAGE_CONTROL2(PpapiMsg_ExecuteCallback,
//
// The handler of this message should always close all of the handles passed
// in, since some could be valid even in the error case.
-IPC_MESSAGE_ROUTED5(PpapiMsg_PPBAudio_NotifyAudioStreamCreated,
- PP_Resource /* audio_id */,
- int32_t /* result_code (will be != PP_OK on failure) */,
- IPC::PlatformFileForTransit /* socket_handle */,
- base::SharedMemoryHandle /* handle */,
- int32_t /* length */)
+IPC_MESSAGE_ROUTED1(PpapiMsg_PPBAudio_NotifyAudioStreamCreated,
+ pp::proxy::PPBAudio_NotifyAudioStreamCreated_Params);
// PPB_Graphics2D.
IPC_MESSAGE_ROUTED2(PpapiMsg_PPBGraphics2D_FlushACK,
- PP_Resource /* graphics_2d */,
+ pp::proxy::HostResource /* graphics_2d */,
int32_t /* pp_error */)
// PPP_Class.
@@ -130,7 +126,7 @@ IPC_SYNC_MESSAGE_ROUTED2_1(PpapiMsg_PPPInstance_HandleInputEvent,
PP_Bool /* result */)
IPC_SYNC_MESSAGE_ROUTED2_1(PpapiMsg_PPPInstance_HandleDocumentLoad,
PP_Instance /* instance */,
- PP_Resource /* url_loader */,
+ pp::proxy::HostResource /* url_loader */,
PP_Bool /* result */)
IPC_SYNC_MESSAGE_ROUTED1_1(PpapiMsg_PPPInstance_GetInstanceObject,
PP_Instance /* instance */,
@@ -139,14 +135,10 @@ IPC_SYNC_MESSAGE_ROUTED1_1(PpapiMsg_PPPInstance_GetInstanceObject,
// PPB_URLLoader
// (Messages from browser to plugin to notify it of changes in state.)
-IPC_MESSAGE_ROUTED5(PpapiMsg_PPBURLLoader_UpdateProgress,
- PP_Resource /* resource */,
- int64 /* bytes_sent */,
- int64 /* total_bytes_to_be_sent */,
- int64 /* bytes_received */,
- int64 /* total_bytes_to_be_received */)
+IPC_MESSAGE_ROUTED1(PpapiMsg_PPBURLLoader_UpdateProgress,
+ pp::proxy::PPBURLLoader_UpdateProgress_Params /* params */)
IPC_MESSAGE_ROUTED3(PpapiMsg_PPBURLLoader_ReadResponseBody_Ack,
- PP_Resource /* loader */,
+ pp::proxy::HostResource /* loader */,
int32 /* result */,
std::string /* data */)
@@ -159,10 +151,10 @@ IPC_MESSAGE_CONTROL1(PpapiHostMsg_PluginLoaded,
// PPB_Audio.
IPC_SYNC_MESSAGE_ROUTED2_1(PpapiHostMsg_PPBAudio_Create,
PP_Instance /* instance_id */,
- PP_Resource /* config_id */,
- PP_Resource /* result */)
+ pp::proxy::HostResource /* config_id */,
+ pp::proxy::HostResource /* result */)
IPC_MESSAGE_ROUTED2(PpapiHostMsg_PPBAudio_StartOrStop,
- PP_Resource /* audio_id */,
+ pp::proxy::HostResource /* audio_id */,
bool /* play */)
// PPB_AudioConfig.
@@ -170,7 +162,7 @@ IPC_SYNC_MESSAGE_ROUTED3_1(PpapiHostMsg_PPBAudioConfig_Create,
PP_Instance /* instance */,
int32_t /* sample_rate */,
uint32_t /* sample_frame_count */,
- PP_Resource /* result */)
+ pp::proxy::HostResource /* result */)
IPC_SYNC_MESSAGE_ROUTED2_1(
PpapiHostMsg_PPBAudioConfig_RecommendSampleFrameCount,
int32_t /* sample_rate */,
@@ -181,12 +173,14 @@ IPC_SYNC_MESSAGE_ROUTED2_1(
IPC_SYNC_MESSAGE_ROUTED2_2(PpapiHostMsg_PPBBuffer_Create,
PP_Instance /* instance */,
uint32_t /* size */,
- PP_Resource /* result_resource */,
+ pp::proxy::HostResource /* result_resource */,
int32_t /* result_shm_handle */)
// PPB_Core.
-IPC_MESSAGE_ROUTED1(PpapiHostMsg_PPBCore_AddRefResource, PP_Resource)
-IPC_MESSAGE_ROUTED1(PpapiHostMsg_PPBCore_ReleaseResource, PP_Resource)
+IPC_MESSAGE_ROUTED1(PpapiHostMsg_PPBCore_AddRefResource,
+ pp::proxy::HostResource)
+IPC_MESSAGE_ROUTED1(PpapiHostMsg_PPBCore_ReleaseResource,
+ pp::proxy::HostResource)
// PPB_CharSet.
IPC_SYNC_MESSAGE_ROUTED4_2(PpapiHostMsg_PPBCharSet_UTF16ToCharSet,
@@ -211,7 +205,7 @@ IPC_SYNC_MESSAGE_ROUTED1_1(PpapiHostMsg_PPBCharSet_GetDefaultCharSet,
IPC_SYNC_MESSAGE_ROUTED4_1(PpapiHostMsg_PPBCursorControl_SetCursor,
PP_Instance /* instance */,
int32_t /* type */,
- PP_Resource /* custom_image */,
+ pp::proxy::HostResource /* custom_image */,
PP_Point /* hot_spot */,
PP_Bool /* result */)
IPC_SYNC_MESSAGE_ROUTED1_1(PpapiHostMsg_PPBCursorControl_LockCursor,
@@ -282,7 +276,7 @@ IPC_SYNC_MESSAGE_ROUTED2_3(
PpapiHostMsg_PPBFont_Create,
PP_Instance /* instance */,
pp::proxy::SerializedFontDescription /* in_description */,
- PP_Resource /* result */,
+ pp::proxy::HostResource /* result */,
pp::proxy::SerializedFontDescription /* out_description */,
std::string /* out_metrics */)
IPC_SYNC_MESSAGE_ROUTED2_1(PpapiHostMsg_PPBFont_DrawTextAt,
@@ -290,20 +284,20 @@ IPC_SYNC_MESSAGE_ROUTED2_1(PpapiHostMsg_PPBFont_DrawTextAt,
pp::proxy::PPBFont_DrawTextAt_Params /* params */,
PP_Bool /* result */)
IPC_SYNC_MESSAGE_ROUTED4_1(PpapiHostMsg_PPBFont_MeasureText,
- PP_Resource /* font */,
+ pp::proxy::HostResource /* font */,
pp::proxy::SerializedVar /* text */,
PP_Bool /* text_is_rtl */,
PP_Bool /* override_direction */,
int32_t /* result */)
IPC_SYNC_MESSAGE_ROUTED5_1(PpapiHostMsg_PPBFont_CharacterOffsetForPixel,
- PP_Resource /* font */,
+ pp::proxy::HostResource /* font */,
pp::proxy::SerializedVar /* text */,
PP_Bool /* text_is_rtl */,
PP_Bool /* override_direction */,
int32_t /* pixel_pos */,
uint32_t /* result */)
IPC_SYNC_MESSAGE_ROUTED5_1(PpapiHostMsg_PPBFont_PixelOffsetForCharacter,
- PP_Resource /* font */,
+ pp::proxy::HostResource /* font */,
pp::proxy::SerializedVar /* text */,
PP_Bool /* text_is_rtl */,
PP_Bool /* override_direction */,
@@ -324,23 +318,23 @@ IPC_SYNC_MESSAGE_ROUTED3_1(PpapiHostMsg_PPBGraphics2D_Create,
PP_Instance /* instance */,
PP_Size /* size */,
PP_Bool /* is_always_opaque */,
- PP_Resource /* result */)
+ pp::proxy::HostResource /* result */)
IPC_MESSAGE_ROUTED5(PpapiHostMsg_PPBGraphics2D_PaintImageData,
- PP_Resource /* graphics_2d */,
- PP_Resource /* image_data */,
+ pp::proxy::HostResource /* graphics_2d */,
+ pp::proxy::HostResource /* image_data */,
PP_Point /* top_left */,
bool /* src_rect_specified */,
PP_Rect /* src_rect */)
IPC_MESSAGE_ROUTED4(PpapiHostMsg_PPBGraphics2D_Scroll,
- PP_Resource /* graphics_2d */,
+ pp::proxy::HostResource /* graphics_2d */,
bool /* clip_specified */,
PP_Rect /* clip */,
PP_Point /* amount */)
IPC_MESSAGE_ROUTED2(PpapiHostMsg_PPBGraphics2D_ReplaceContents,
- PP_Resource /* graphics_2d */,
- PP_Resource /* image_data */)
+ pp::proxy::HostResource /* graphics_2d */,
+ pp::proxy::HostResource /* image_data */)
IPC_MESSAGE_ROUTED1(PpapiHostMsg_PPBGraphics2D_Flush,
- PP_Resource /* graphics_2d */)
+ pp::proxy::HostResource /* graphics_2d */)
// PPB_ImageData.
IPC_SYNC_MESSAGE_ROUTED4_3(PpapiHostMsg_PPBImageData_Create,
@@ -348,7 +342,7 @@ IPC_SYNC_MESSAGE_ROUTED4_3(PpapiHostMsg_PPBImageData_Create,
int32 /* format */,
PP_Size /* size */,
PP_Bool /* init_to_zero */,
- PP_Resource /* result_resource */,
+ pp::proxy::HostResource /* result_resource */,
std::string /* image_data_desc */,
pp::proxy::ImageHandle /* result */)
@@ -361,7 +355,7 @@ IPC_SYNC_MESSAGE_ROUTED1_1(PpapiHostMsg_PPBInstance_GetOwnerElementObject,
pp::proxy::SerializedVar /* result */)
IPC_SYNC_MESSAGE_ROUTED2_1(PpapiHostMsg_PPBInstance_BindGraphics,
PP_Instance /* instance */,
- PP_Resource /* device */,
+ pp::proxy::HostResource /* device */,
PP_Bool /* result */)
IPC_SYNC_MESSAGE_ROUTED1_1(PpapiHostMsg_PPBInstance_IsFullFrame,
PP_Instance /* instance */,
@@ -377,19 +371,20 @@ IPC_SYNC_MESSAGE_ROUTED3_1(
PP_Instance /* instance */,
pp::proxy::SerializedFontDescription /* description */,
int32_t /* charset */,
- PP_Resource /* result */)
+ pp::proxy::HostResource /* result */)
IPC_SYNC_MESSAGE_ROUTED2_1(
PpapiHostMsg_PPBPDF_GetFontTableForPrivateFontFile,
- PP_Resource /* font_file */,
+ pp::proxy::HostResource /* font_file */,
uint32_t /* table */,
std::string /* result */)
// PPB_Testing.
-IPC_SYNC_MESSAGE_ROUTED3_1(PpapiHostMsg_PPBTesting_ReadImageData,
- PP_Resource /* device_context_2d */,
- PP_Resource /* image */,
- PP_Point /* top_left */,
- PP_Bool /* result */)
+IPC_SYNC_MESSAGE_ROUTED3_1(
+ PpapiHostMsg_PPBTesting_ReadImageData,
+ pp::proxy::HostResource /* device_context_2d */,
+ pp::proxy::HostResource /* image */,
+ PP_Point /* top_left */,
+ PP_Bool /* result */)
IPC_SYNC_MESSAGE_ROUTED0_1(PpapiHostMsg_PPBTesting_RunMessageLoop,
bool /* dummy since there's no 0_0 variant */)
IPC_MESSAGE_ROUTED0(PpapiHostMsg_PPBTesting_QuitMessageLoop)
@@ -400,56 +395,57 @@ IPC_SYNC_MESSAGE_ROUTED1_1(PpapiHostMsg_PPBTesting_GetLiveObjectsForInstance,
// PPB_URLLoader.
IPC_SYNC_MESSAGE_ROUTED1_1(PpapiHostMsg_PPBURLLoader_Create,
PP_Instance /* instance */,
- PP_Resource /* result */)
+ pp::proxy::HostResource /* result */)
IPC_MESSAGE_ROUTED3(PpapiHostMsg_PPBURLLoader_Open,
- PP_Resource /* loader */,
- PP_Resource /*request_info */,
+ pp::proxy::HostResource /* loader */,
+ pp::proxy::HostResource /*request_info */,
uint32_t /* serialized_callback */)
IPC_MESSAGE_ROUTED2(PpapiHostMsg_PPBURLLoader_FollowRedirect,
- PP_Resource /* loader */,
+ pp::proxy::HostResource /* loader */,
uint32_t /* serialized_callback */)
-IPC_SYNC_MESSAGE_ROUTED1_1(PpapiHostMsg_PPBURLLoader_GetResponseInfo,
- PP_Resource /* loader */,
- PP_Resource /* response_info_out */)
+IPC_SYNC_MESSAGE_ROUTED1_1(
+ PpapiHostMsg_PPBURLLoader_GetResponseInfo,
+ pp::proxy::HostResource /* loader */,
+ pp::proxy::HostResource /* response_info_out */)
IPC_MESSAGE_ROUTED2(PpapiHostMsg_PPBURLLoader_ReadResponseBody,
- PP_Resource /* loader */,
+ pp::proxy::HostResource /* loader */,
int32_t /* bytes_to_read */)
IPC_MESSAGE_ROUTED2(PpapiHostMsg_PPBURLLoader_FinishStreamingToFile,
- PP_Resource /* loader */,
+ pp::proxy::HostResource /* loader */,
uint32_t /* serialized_callback */)
IPC_MESSAGE_ROUTED1(PpapiHostMsg_PPBURLLoader_Close,
- PP_Resource /* loader */)
+ pp::proxy::HostResource /* loader */)
// PPB_URLLoaderTrusted.
IPC_MESSAGE_ROUTED1(PpapiHostMsg_PPBURLLoaderTrusted_GrantUniversalAccess,
- PP_Resource /* loader */)
+ pp::proxy::HostResource /* loader */)
// PPB_URLRequestInfo.
IPC_SYNC_MESSAGE_ROUTED1_1(PpapiHostMsg_PPBURLRequestInfo_Create,
PP_Instance /* instance */,
- PP_Resource /* result */)
+ pp::proxy::HostResource /* result */)
IPC_MESSAGE_ROUTED3(PpapiHostMsg_PPBURLRequestInfo_SetProperty,
- PP_Resource /* request */,
+ pp::proxy::HostResource /* request */,
int32_t /* property */,
pp::proxy::SerializedVar /* value */)
IPC_MESSAGE_ROUTED2(PpapiHostMsg_PPBURLRequestInfo_AppendDataToBody,
- PP_Resource /* request */,
+ pp::proxy::HostResource /* request */,
std::string /* data */)
IPC_MESSAGE_ROUTED5(PpapiHostMsg_PPBURLRequestInfo_AppendFileToBody,
- PP_Resource /* request */,
- PP_Resource /* file_ref */,
+ pp::proxy::HostResource /* request */,
+ pp::proxy::HostResource /* file_ref */,
int64_t /* start_offset */,
int64_t /* number_of_bytes */,
double /* expected_last_modified_time */)
// PPB_URLResponseInfo.
IPC_SYNC_MESSAGE_ROUTED2_1(PpapiHostMsg_PPBURLResponseInfo_GetProperty,
- PP_Resource /* response */,
+ pp::proxy::HostResource /* response */,
int32_t /* property */,
pp::proxy::SerializedVar /* result */)
IPC_SYNC_MESSAGE_ROUTED1_1(PpapiHostMsg_PPBURLResponseInfo_GetBodyAsFileRef,
- PP_Resource /* response */,
- PP_Resource /* file_ref_result */)
+ pp::proxy::HostResource /* response */,
+ pp::proxy::HostResource /* file_ref_result */)
// PPB_Var.
IPC_MESSAGE_ROUTED1(PpapiHostMsg_PPBVar_AddRefObject,
diff --git a/ppapi/proxy/ppapi_param_traits.cc b/ppapi/proxy/ppapi_param_traits.cc
index dbbc643..e38e9bf1 100644
--- a/ppapi/proxy/ppapi_param_traits.cc
+++ b/ppapi/proxy/ppapi_param_traits.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -8,6 +8,7 @@
#include "ppapi/c/dev/pp_file_info_dev.h"
#include "ppapi/c/pp_resource.h"
+#include "ppapi/proxy/host_resource.h"
#include "ppapi/proxy/interface_proxy.h"
#include "ppapi/proxy/ppapi_messages.h"
#include "ppapi/proxy/serialized_var.h"
@@ -180,6 +181,36 @@ bool ParamTraits<PP_Size>::Read(const Message* m, void** iter, param_type* r) {
void ParamTraits<PP_Size>::Log(const param_type& p, std::string* l) {
}
+// PPBAudio_NotifyAudioStreamCreated_Params ------------------------------------
+
+// static
+void ParamTraits<pp::proxy::PPBAudio_NotifyAudioStreamCreated_Params>::Write(
+ Message* m,
+ const param_type& p) {
+ ParamTraits<pp::proxy::HostResource>::Write(m, p.audio_id);
+ ParamTraits<int32_t>::Write(m, p.result_code);
+ ParamTraits<PlatformFileForTransit>::Write(m, p.socket_handle);
+ ParamTraits<int32_t>::Write(m, p.length);
+}
+
+// static
+bool ParamTraits<pp::proxy::PPBAudio_NotifyAudioStreamCreated_Params>::Read(
+ const Message* m,
+ void** iter,
+ param_type* r) {
+ return
+ ParamTraits<pp::proxy::HostResource>::Read(m, iter, &r->audio_id) &&
+ ParamTraits<int32_t>::Read(m, iter, &r->result_code) &&
+ ParamTraits<PlatformFileForTransit>::Read(m, iter, &r->socket_handle) &&
+ ParamTraits<int32_t>::Read(m, iter, &r->length);
+}
+
+// static
+void ParamTraits<pp::proxy::PPBAudio_NotifyAudioStreamCreated_Params>::Log(
+ const param_type& p,
+ std::string* l) {
+}
+
// PPBFlash_DrawGlyphs_Params --------------------------------------------------
// static
@@ -187,7 +218,7 @@ void ParamTraits<pp::proxy::PPBFlash_DrawGlyphs_Params>::Write(
Message* m,
const param_type& p) {
ParamTraits<PP_Instance>::Write(m, p.instance);
- ParamTraits<PP_Resource>::Write(m, p.pp_image_data);
+ ParamTraits<pp::proxy::HostResource>::Write(m, p.image_data);
ParamTraits<pp::proxy::SerializedFontDescription>::Write(m, p.font_desc);
ParamTraits<uint32_t>::Write(m, p.color);
ParamTraits<PP_Point>::Write(m, p.position);
@@ -212,7 +243,8 @@ bool ParamTraits<pp::proxy::PPBFlash_DrawGlyphs_Params>::Read(
param_type* r) {
return
ParamTraits<PP_Instance>::Read(m, iter, &r->instance) &&
- ParamTraits<PP_Resource>::Read(m, iter, &r->pp_image_data) &&
+ ParamTraits<pp::proxy::HostResource>::Read(m, iter,
+ &r->image_data) &&
ParamTraits<pp::proxy::SerializedFontDescription>::Read(m, iter,
&r->font_desc) &&
ParamTraits<uint32_t>::Read(m, iter, &r->color) &&
@@ -244,8 +276,8 @@ void ParamTraits<pp::proxy::PPBFlash_DrawGlyphs_Params>::Log(
void ParamTraits<pp::proxy::PPBFont_DrawTextAt_Params>::Write(
Message* m,
const param_type& p) {
- ParamTraits<PP_Resource>::Write(m, p.font);
- ParamTraits<PP_Resource>::Write(m, p.image_data);
+ ParamTraits<pp::proxy::HostResource>::Write(m, p.font);
+ ParamTraits<pp::proxy::HostResource>::Write(m, p.image_data);
ParamTraits<PP_Bool>::Write(m, p.text_is_rtl);
ParamTraits<PP_Bool>::Write(m, p.override_direction);
ParamTraits<PP_Point>::Write(m, p.position);
@@ -261,8 +293,9 @@ bool ParamTraits<pp::proxy::PPBFont_DrawTextAt_Params>::Read(
void** iter,
param_type* r) {
return
- ParamTraits<PP_Resource>::Read(m, iter, &r->font) &&
- ParamTraits<PP_Resource>::Read(m, iter, &r->image_data) &&
+ ParamTraits<pp::proxy::HostResource>::Read(m, iter, &r->font) &&
+ ParamTraits<pp::proxy::HostResource>::Read(m, iter,
+ &r->image_data) &&
ParamTraits<PP_Bool>::Read(m, iter, &r->text_is_rtl) &&
ParamTraits<PP_Bool>::Read(m, iter, &r->override_direction) &&
ParamTraits<PP_Point>::Read(m, iter, &r->position) &&
@@ -278,6 +311,40 @@ void ParamTraits<pp::proxy::PPBFont_DrawTextAt_Params>::Log(
std::string* l) {
}
+// PPBURLLoader_UpdateProgress_Params ------------------------------------------
+
+// static
+void ParamTraits<pp::proxy::PPBURLLoader_UpdateProgress_Params>::Write(
+ Message* m,
+ const param_type& p) {
+ ParamTraits<PP_Instance>::Write(m, p.instance);
+ ParamTraits<pp::proxy::HostResource>::Write(m, p.resource);
+ ParamTraits<int64_t>::Write(m, p.bytes_sent);
+ ParamTraits<int64_t>::Write(m, p.total_bytes_to_be_sent);
+ ParamTraits<int64_t>::Write(m, p.bytes_received);
+ ParamTraits<int64_t>::Write(m, p.total_bytes_to_be_received);
+}
+
+// static
+bool ParamTraits<pp::proxy::PPBURLLoader_UpdateProgress_Params>::Read(
+ const Message* m,
+ void** iter,
+ param_type* r) {
+ return
+ ParamTraits<PP_Instance>::Read(m, iter, &r->instance) &&
+ ParamTraits<pp::proxy::HostResource>::Read(m, iter, &r->resource) &&
+ ParamTraits<int64_t>::Read(m, iter, &r->bytes_sent) &&
+ ParamTraits<int64_t>::Read(m, iter, &r->total_bytes_to_be_sent) &&
+ ParamTraits<int64_t>::Read(m, iter, &r->bytes_received) &&
+ ParamTraits<int64_t>::Read(m, iter, &r->total_bytes_to_be_received);
+}
+
+// static
+void ParamTraits<pp::proxy::PPBURLLoader_UpdateProgress_Params>::Log(
+ const param_type& p,
+ std::string* l) {
+}
+
// SerializedDirEntry ----------------------------------------------------------
// static
@@ -300,26 +367,6 @@ void ParamTraits<pp::proxy::SerializedDirEntry>::Log(const param_type& p,
std::string* l) {
}
-// SerializedVar ---------------------------------------------------------------
-
-// static
-void ParamTraits<pp::proxy::SerializedVar>::Write(Message* m,
- const param_type& p) {
- p.WriteToMessage(m);
-}
-
-// static
-bool ParamTraits<pp::proxy::SerializedVar>::Read(const Message* m,
- void** iter,
- param_type* r) {
- return r->ReadFromMessage(m, iter);
-}
-
-// static
-void ParamTraits<pp::proxy::SerializedVar>::Log(const param_type& p,
- std::string* l) {
-}
-
// pp::proxy::SerializedFontDescription ----------------------------------------
// static
@@ -358,6 +405,53 @@ void ParamTraits<pp::proxy::SerializedFontDescription>::Log(
std::string* l) {
}
+// HostResource ----------------------------------------------------------
+
+// static
+void ParamTraits<pp::proxy::HostResource>::Write(Message* m,
+ const param_type& p) {
+ ParamTraits<PP_Instance>::Write(m, p.instance());
+ ParamTraits<PP_Resource>::Write(m, p.host_resource());
+}
+
+// static
+bool ParamTraits<pp::proxy::HostResource>::Read(const Message* m,
+ void** iter,
+ param_type* r) {
+ PP_Instance instance;
+ PP_Resource resource;
+ if (!ParamTraits<PP_Instance>::Read(m, iter, &instance) ||
+ !ParamTraits<PP_Resource>::Read(m, iter, &resource))
+ return false;
+ r->SetHostResource(instance, resource);
+ return true;
+}
+
+// static
+void ParamTraits<pp::proxy::HostResource>::Log(const param_type& p,
+ std::string* l) {
+}
+
+// SerializedVar ---------------------------------------------------------------
+
+// static
+void ParamTraits<pp::proxy::SerializedVar>::Write(Message* m,
+ const param_type& p) {
+ p.WriteToMessage(m);
+}
+
+// static
+bool ParamTraits<pp::proxy::SerializedVar>::Read(const Message* m,
+ void** iter,
+ param_type* r) {
+ return r->ReadFromMessage(m, iter);
+}
+
+// static
+void ParamTraits<pp::proxy::SerializedVar>::Log(const param_type& p,
+ std::string* l) {
+}
+
// std::vector<SerializedVar> --------------------------------------------------
void ParamTraits< std::vector<pp::proxy::SerializedVar> >::Write(
diff --git a/ppapi/proxy/ppapi_param_traits.h b/ppapi/proxy/ppapi_param_traits.h
index fea2594d..3a7358d 100644
--- a/ppapi/proxy/ppapi_param_traits.h
+++ b/ppapi/proxy/ppapi_param_traits.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -11,20 +11,24 @@
#include "ppapi/c/pp_input_event.h"
#include "ppapi/c/pp_rect.h"
#include "ppapi/c/pp_var.h"
-#include "ppapi/proxy/serialized_var.h" // TODO(brettw) eraseme.
struct PP_FileInfo_Dev;
struct PP_ObjectProperty;
namespace pp {
namespace proxy {
+
+struct PPBAudio_NotifyAudioStreamCreated_Params;
struct PPBFlash_DrawGlyphs_Params;
struct PPBFont_DrawTextAt_Params;
+struct PPBURLLoader_UpdateProgress_Params;
struct SerializedDirEntry;
struct SerializedFontDescription;
+class HostResource;
class SerializedVar;
-}
-}
+
+} // namespace proxy
+} // namespace pp
namespace IPC {
@@ -84,6 +88,14 @@ struct ParamTraits<PP_Size> {
static void Log(const param_type& p, std::string* l);
};
+template<> struct ParamTraits<
+ pp::proxy::PPBAudio_NotifyAudioStreamCreated_Params> {
+ typedef pp::proxy::PPBAudio_NotifyAudioStreamCreated_Params param_type;
+ static void Write(Message* m, const param_type& p);
+ static bool Read(const Message* m, void** iter, param_type* r);
+ static void Log(const param_type& p, std::string* l);
+};
+
template<>
struct ParamTraits<pp::proxy::PPBFlash_DrawGlyphs_Params> {
typedef pp::proxy::PPBFlash_DrawGlyphs_Params param_type;
@@ -101,6 +113,14 @@ struct ParamTraits<pp::proxy::PPBFont_DrawTextAt_Params> {
};
template<>
+struct ParamTraits<pp::proxy::PPBURLLoader_UpdateProgress_Params> {
+ typedef pp::proxy::PPBURLLoader_UpdateProgress_Params param_type;
+ static void Write(Message* m, const param_type& p);
+ static bool Read(const Message* m, void** iter, param_type* r);
+ static void Log(const param_type& p, std::string* l);
+};
+
+template<>
struct ParamTraits<pp::proxy::SerializedDirEntry> {
typedef pp::proxy::SerializedDirEntry param_type;
static void Write(Message* m, const param_type& p);
@@ -117,6 +137,14 @@ struct ParamTraits<pp::proxy::SerializedFontDescription> {
};
template<>
+struct ParamTraits<pp::proxy::HostResource> {
+ typedef pp::proxy::HostResource param_type;
+ static void Write(Message* m, const param_type& p);
+ static bool Read(const Message* m, void** iter, param_type* r);
+ static void Log(const param_type& p, std::string* l);
+};
+
+template<>
struct ParamTraits<pp::proxy::SerializedVar> {
typedef pp::proxy::SerializedVar param_type;
static void Write(Message* m, const param_type& p);
diff --git a/ppapi/proxy/ppapi_proxy_test.cc b/ppapi/proxy/ppapi_proxy_test.cc
new file mode 100644
index 0000000..240860c
--- /dev/null
+++ b/ppapi/proxy/ppapi_proxy_test.cc
@@ -0,0 +1,59 @@
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ppapi/proxy/ppapi_proxy_test.h"
+
+#include "ppapi/c/pp_errors.h"
+
+namespace pp {
+namespace proxy {
+
+namespace {
+
+const void* MockGetInterface(const char*) {
+ return NULL;
+}
+
+int32_t MockInitModule(PP_Module, Dispatcher::GetInterfaceFunc) {
+ return PP_OK;
+}
+
+void MockShutdownModuleFunc() {
+}
+
+} // namespace
+
+PluginProxyTest::PluginProxyTest() {
+}
+
+PluginProxyTest::~PluginProxyTest() {
+}
+
+void PluginProxyTest::SetUp() {
+ // These must be first since the dispatcher set-up uses them.
+ PluginResourceTracker::SetInstanceForTest(&resource_tracker_);
+ PluginVarTracker::SetInstanceForTest(&var_tracker_);
+
+ pp_instance_ = 0x1234;
+ plugin_dispatcher_.reset(new PluginDispatcher(
+ base::Process::Current().handle(),
+ &MockGetInterface,
+ &MockInitModule,
+ &MockShutdownModuleFunc));
+ plugin_dispatcher_->InitWithTestSink(&sink_);
+ // When the plugin dispatcher is per-instance, this is the line to use:
+ // PluginDispatcher::SetForInstance(pp_instance_, plugin_dispatcher_.get());
+ PluginDispatcher::SetGlobal(plugin_dispatcher_.get());
+}
+
+void PluginProxyTest::TearDown() {
+ PluginDispatcher::SetGlobal(NULL);
+ plugin_dispatcher_.reset();
+
+ PluginVarTracker::SetInstanceForTest(NULL);
+ PluginResourceTracker::SetInstanceForTest(NULL);
+}
+
+} // namespace proxy
+} // namespace pp
diff --git a/ppapi/proxy/ppapi_proxy_test.h b/ppapi/proxy/ppapi_proxy_test.h
new file mode 100644
index 0000000..a811080
--- /dev/null
+++ b/ppapi/proxy/ppapi_proxy_test.h
@@ -0,0 +1,46 @@
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/scoped_ptr.h"
+#include "ipc/ipc_test_sink.h"
+#include "ppapi/c/pp_instance.h"
+#include "ppapi/proxy/plugin_dispatcher.h"
+#include "ppapi/proxy/plugin_resource_tracker.h"
+#include "ppapi/proxy/plugin_var_tracker.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace pp {
+namespace proxy {
+
+// Test harness for the plugin side of the proxy.
+class PluginProxyTest : public testing::Test {
+ public:
+ PluginProxyTest();
+ ~PluginProxyTest();
+
+ virtual void SetUp();
+ virtual void TearDown();
+
+ // The instance ID associated with the plugin dispatcher.
+ PP_Instance pp_instance() const { return pp_instance_; }
+
+ PluginDispatcher* plugin_dispatcher() { return plugin_dispatcher_.get(); }
+
+ PluginResourceTracker& resource_tracker() { return resource_tracker_; }
+ PluginVarTracker& var_tracker() { return var_tracker_; }
+
+ IPC::TestSink& sink() { return sink_; }
+
+ private:
+ PluginResourceTracker resource_tracker_;
+ PluginVarTracker var_tracker_;
+
+ PP_Instance pp_instance_;
+ scoped_ptr<PluginDispatcher> plugin_dispatcher_;
+
+ IPC::TestSink sink_;
+};
+
+} // namespace proxy
+} // namespace pp
diff --git a/ppapi/proxy/ppb_audio_config_proxy.cc b/ppapi/proxy/ppb_audio_config_proxy.cc
index 8bf62c3..d437694 100644
--- a/ppapi/proxy/ppb_audio_config_proxy.cc
+++ b/ppapi/proxy/ppb_audio_config_proxy.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -14,10 +14,10 @@ namespace proxy {
class AudioConfig : public PluginResource {
public:
- AudioConfig(PP_Instance instance,
+ AudioConfig(const HostResource& resource,
PP_AudioSampleRate sample_rate,
uint32_t sample_frame_count)
- : PluginResource(instance),
+ : PluginResource(resource),
sample_rate_(sample_rate),
sample_frame_count_(sample_frame_count) {
}
@@ -41,19 +41,18 @@ namespace {
PP_Resource CreateStereo16bit(PP_Instance instance,
PP_AudioSampleRate sample_rate,
uint32_t sample_frame_count) {
- PP_Resource result = 0;
+ HostResource resource;
PluginDispatcher::GetForInstance(instance)->Send(
new PpapiHostMsg_PPBAudioConfig_Create(
INTERFACE_ID_PPB_AUDIO_CONFIG, instance,
static_cast<int32_t>(sample_rate), sample_frame_count,
- &result));
- if (!result)
+ &resource));
+ if (!resource.is_null())
return 0;
linked_ptr<AudioConfig> object(
- new AudioConfig(instance, sample_rate, sample_frame_count));
- PluginResourceTracker::GetInstance()->AddResource(result, object);
- return result;
+ new AudioConfig(resource, sample_rate, sample_frame_count));
+ return PluginResourceTracker::GetInstance()->AddResource(object);
}
uint32_t RecommendSampleFrameCount(PP_AudioSampleRate sample_rate,
@@ -129,10 +128,11 @@ bool PPB_AudioConfig_Proxy::OnMessageReceived(const IPC::Message& msg) {
void PPB_AudioConfig_Proxy::OnMsgCreateStereo16Bit(PP_Instance instance,
int32_t sample_rate,
uint32_t sample_frame_count,
- PP_Resource* result) {
- *result = ppb_audio_config_target()->CreateStereo16Bit(
- instance, static_cast<PP_AudioSampleRate>(sample_rate),
- sample_frame_count);
+ HostResource* result) {
+ result->SetHostResource(instance,
+ ppb_audio_config_target()->CreateStereo16Bit(
+ instance, static_cast<PP_AudioSampleRate>(sample_rate),
+ sample_frame_count));
}
void PPB_AudioConfig_Proxy::OnMsgRecommendSampleFrameCount(
diff --git a/ppapi/proxy/ppb_audio_config_proxy.h b/ppapi/proxy/ppb_audio_config_proxy.h
index c5ef56d..6492ae1 100644
--- a/ppapi/proxy/ppb_audio_config_proxy.h
+++ b/ppapi/proxy/ppb_audio_config_proxy.h
@@ -15,6 +15,8 @@ struct PPB_AudioConfig;
namespace pp {
namespace proxy {
+class HostResource;
+
class PPB_AudioConfig_Proxy : public InterfaceProxy {
public:
PPB_AudioConfig_Proxy(Dispatcher* dispatcher, const void* target_interface);
@@ -34,7 +36,7 @@ class PPB_AudioConfig_Proxy : public InterfaceProxy {
void OnMsgCreateStereo16Bit(PP_Instance instance,
int32_t sample_rate,
uint32_t sample_frame_count,
- PP_Resource* result);
+ HostResource* result);
void OnMsgRecommendSampleFrameCount(int32_t sample_rate,
uint32_t requested,
uint32_t* result);
diff --git a/ppapi/proxy/ppb_audio_proxy.cc b/ppapi/proxy/ppb_audio_proxy.cc
index 837637a..c1095cf 100644
--- a/ppapi/proxy/ppb_audio_proxy.cc
+++ b/ppapi/proxy/ppb_audio_proxy.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -19,11 +19,11 @@ namespace proxy {
class Audio : public PluginResource, public pp::shared_impl::AudioImpl {
public:
- Audio(PP_Instance instance,
+ Audio(const HostResource& audio_id,
PP_Resource config_id,
PPB_Audio_Callback callback,
void* user_data)
- : PluginResource(instance),
+ : PluginResource(audio_id),
config_(config_id) {
SetCallback(callback, user_data);
PluginResourceTracker::GetInstance()->AddRefResource(config_);
@@ -43,7 +43,7 @@ class Audio : public PluginResource, public pp::shared_impl::AudioImpl {
SetStartPlaybackState();
PluginDispatcher::GetForInstance(instance())->Send(
new PpapiHostMsg_PPBAudio_StartOrStop(
- INTERFACE_ID_PPB_AUDIO, resource, true));
+ INTERFACE_ID_PPB_AUDIO, host_resource(), true));
}
void StopPlayback(PP_Resource resource) {
@@ -51,7 +51,7 @@ class Audio : public PluginResource, public pp::shared_impl::AudioImpl {
return;
PluginDispatcher::GetForInstance(instance())->Send(
new PpapiHostMsg_PPBAudio_StartOrStop(
- INTERFACE_ID_PPB_AUDIO, resource, false));
+ INTERFACE_ID_PPB_AUDIO, host_resource(), false));
SetStopPlaybackState();
}
@@ -67,16 +67,19 @@ PP_Resource Create(PP_Instance instance_id,
PP_Resource config_id,
PPB_Audio_Callback callback,
void* user_data) {
- PP_Resource result;
+ PluginResource* config = PluginResourceTracker::GetInstance()->
+ GetResourceObject(config_id);
+ if (!config)
+ return 0;
+
+ HostResource result;
PluginDispatcher::Get()->Send(new PpapiHostMsg_PPBAudio_Create(
- INTERFACE_ID_PPB_AUDIO, instance_id, config_id, &result));
- if (!result)
+ INTERFACE_ID_PPB_AUDIO, instance_id, config->host_resource(), &result));
+ if (result.is_null())
return 0;
- linked_ptr<Audio> object(new Audio(instance_id, config_id,
- callback, user_data));
- PluginResourceTracker::GetInstance()->AddResource(result, object);
- return result;
+ linked_ptr<Audio> object(new Audio(result, config_id, callback, user_data));
+ return PluginResourceTracker::GetInstance()->AddResource(object);
}
PP_Bool IsAudio(PP_Resource resource) {
@@ -150,57 +153,61 @@ bool PPB_Audio_Proxy::OnMessageReceived(const IPC::Message& msg) {
}
void PPB_Audio_Proxy::OnMsgCreate(PP_Instance instance_id,
- PP_Resource config_id,
- PP_Resource* result) {
+ const HostResource& config_id,
+ HostResource* result) {
const PPB_AudioTrusted* audio_trusted =
reinterpret_cast<const PPB_AudioTrusted*>(
dispatcher()->GetLocalInterface(PPB_AUDIO_TRUSTED_INTERFACE));
- if (!audio_trusted) {
- *result = 0;
+ if (!audio_trusted)
return;
- }
- *result = audio_trusted->CreateTrusted(instance_id);
- if (!result)
+ result->SetHostResource(instance_id,
+ audio_trusted->CreateTrusted(instance_id));
+ if (result->is_null())
return;
CompletionCallback callback = callback_factory_.NewCallback(
&PPB_Audio_Proxy::AudioChannelConnected, *result);
- int32_t open_error = audio_trusted->Open(*result, config_id,
+ int32_t open_error = audio_trusted->Open(result->host_resource(),
+ config_id.host_resource(),
callback.pp_completion_callback());
if (open_error != PP_ERROR_WOULDBLOCK)
callback.Run(open_error);
}
-void PPB_Audio_Proxy::OnMsgStartOrStop(PP_Resource audio_id, bool play) {
+void PPB_Audio_Proxy::OnMsgStartOrStop(const HostResource& audio_id,
+ bool play) {
if (play)
- ppb_audio_target()->StartPlayback(audio_id);
+ ppb_audio_target()->StartPlayback(audio_id.host_resource());
else
- ppb_audio_target()->StopPlayback(audio_id);
+ ppb_audio_target()->StopPlayback(audio_id.host_resource());
}
+// Processed in the plugin (message from host).
void PPB_Audio_Proxy::OnMsgNotifyAudioStreamCreated(
- PP_Resource audio_id,
- int32_t result_code,
- IPC::PlatformFileForTransit socket_handle,
- base::SharedMemoryHandle handle,
- uint32_t length) {
- Audio* object = PluginResource::GetAs<Audio>(audio_id);
- if (!object || result_code != PP_OK) {
+ const PPBAudio_NotifyAudioStreamCreated_Params& params) {
+ PP_Resource plugin_resource =
+ PluginResourceTracker::GetInstance()->PluginResourceForHostResource(
+ params.audio_id);
+ Audio* object = plugin_resource ?
+ PluginResource::GetAs<Audio>(plugin_resource) : NULL;
+ if (!object || params.result_code != PP_OK) {
// The caller may still have given us these handles in the failure case.
// The easiest way to clean these up is to just put them in the objects
// and then close them. This failure case is not performance critical.
base::SyncSocket temp_socket(
- IPC::PlatformFileForTransitToPlatformFile(socket_handle));
- base::SharedMemory temp_mem(handle, false);
+ IPC::PlatformFileForTransitToPlatformFile(params.socket_handle));
+ base::SharedMemory temp_mem(params.handle, false);
return;
}
object->SetStreamInfo(
- handle, length, IPC::PlatformFileForTransitToPlatformFile(socket_handle));
+ params.handle, params.length,
+ IPC::PlatformFileForTransitToPlatformFile(params.socket_handle));
}
-void PPB_Audio_Proxy::AudioChannelConnected(int32_t result,
- PP_Resource resource) {
+void PPB_Audio_Proxy::AudioChannelConnected(
+ int32_t result,
+ const HostResource& resource) {
IPC::PlatformFileForTransit socket_handle =
IPC::InvalidPlatformFileForTransit();
#if defined(OS_WIN)
@@ -224,13 +231,18 @@ void PPB_Audio_Proxy::AudioChannelConnected(int32_t result,
// inconvenient to clean up. Our IPC code will automatically handle this for
// us, as long as the remote side always closes the handles it receives
// (in OnMsgNotifyAudioStreamCreated), even in the failure case.
+ PPBAudio_NotifyAudioStreamCreated_Params params;
+ params.audio_id = resource;
+ params.result_code = result;
+ params.socket_handle = socket_handle;
+ params.handle = shared_memory;
+ params.length = shared_memory_length;
dispatcher()->Send(new PpapiMsg_PPBAudio_NotifyAudioStreamCreated(
- INTERFACE_ID_PPB_AUDIO, resource, result_code, socket_handle,
- shared_memory, shared_memory_length));
+ INTERFACE_ID_PPB_AUDIO, params));
}
int32_t PPB_Audio_Proxy::GetAudioConnectedHandles(
- PP_Resource resource,
+ const HostResource& resource,
IPC::PlatformFileForTransit* foreign_socket_handle,
base::SharedMemoryHandle* foreign_shared_memory_handle,
uint32_t* shared_memory_length) {
@@ -243,7 +255,8 @@ int32_t PPB_Audio_Proxy::GetAudioConnectedHandles(
// Get the socket handle for signaling.
int32_t socket_handle;
- int32_t result = audio_trusted->GetSyncSocket(resource, &socket_handle);
+ int32_t result = audio_trusted->GetSyncSocket(resource.host_resource(),
+ &socket_handle);
if (result != PP_OK)
return result;
@@ -265,8 +278,9 @@ int32_t PPB_Audio_Proxy::GetAudioConnectedHandles(
// Get the shared memory for the buffer.
// TODO(brettw) remove the reinterpret cast when the interface is updated.
int shared_memory_handle;
- result = audio_trusted->GetSharedMemory(resource, &shared_memory_handle,
- shared_memory_length);
+ result = audio_trusted->GetSharedMemory(resource.host_resource(),
+ &shared_memory_handle,
+ shared_memory_length);
if (result != PP_OK)
return result;
diff --git a/ppapi/proxy/ppb_audio_proxy.h b/ppapi/proxy/ppb_audio_proxy.h
index c77e3d6..7ac27f5 100644
--- a/ppapi/proxy/ppb_audio_proxy.h
+++ b/ppapi/proxy/ppb_audio_proxy.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -21,6 +21,9 @@ struct PPB_Audio;
namespace pp {
namespace proxy {
+struct PPBAudio_NotifyAudioStreamCreated_Params;
+class HostResource;
+
class PPB_Audio_Proxy : public InterfaceProxy {
public:
PPB_Audio_Proxy(Dispatcher* dispatcher, const void* target_interface);
@@ -38,19 +41,16 @@ class PPB_Audio_Proxy : public InterfaceProxy {
private:
// Plugin->renderer message handlers.
void OnMsgCreate(PP_Instance instance_id,
- PP_Resource config_id,
- PP_Resource* result);
- void OnMsgStartOrStop(PP_Resource audio_id, bool play);
+ const HostResource& config_id,
+ HostResource* result);
+ void OnMsgStartOrStop(const HostResource& audio_id, bool play);
// Renderer->plugin message handlers.
void OnMsgNotifyAudioStreamCreated(
- PP_Resource audio_id,
- int32_t result_code,
- IPC::PlatformFileForTransit socket_handle,
- base::SharedMemoryHandle shared_memory_handle,
- uint32_t shared_memory_length);
+ const PPBAudio_NotifyAudioStreamCreated_Params& params);
- void AudioChannelConnected(int32_t result, PP_Resource resource);
+ void AudioChannelConnected(int32_t result,
+ const HostResource& resource);
// In the renderer, this is called in response to a stream created message.
// It will retrieve the shared memory and socket handles and place them into
@@ -61,7 +61,7 @@ class PPB_Audio_Proxy : public InterfaceProxy {
// arguments may be written to, and others may be untouched, depending on
// where the error occurred.
int32_t GetAudioConnectedHandles(
- PP_Resource resource,
+ const HostResource& resource,
IPC::PlatformFileForTransit* foreign_socket_handle,
base::SharedMemoryHandle* foreign_shared_memory_handle,
uint32_t* shared_memory_length);
diff --git a/ppapi/proxy/ppb_buffer_proxy.cc b/ppapi/proxy/ppb_buffer_proxy.cc
index d224572..5125855 100644
--- a/ppapi/proxy/ppb_buffer_proxy.cc
+++ b/ppapi/proxy/ppb_buffer_proxy.cc
@@ -20,7 +20,9 @@ namespace proxy {
class Buffer : public PluginResource {
public:
- Buffer(PP_Instance instance, int memory_handle, uint32_t size);
+ Buffer(const HostResource& resource,
+ int memory_handle,
+ uint32_t size);
virtual ~Buffer();
// Resource overrides.
@@ -40,8 +42,10 @@ class Buffer : public PluginResource {
DISALLOW_COPY_AND_ASSIGN(Buffer);
};
-Buffer::Buffer(PP_Instance instance, int memory_handle, uint32_t size)
- : PluginResource(instance),
+Buffer::Buffer(const HostResource& resource,
+ int memory_handle,
+ uint32_t size)
+ : PluginResource(resource),
memory_handle_(memory_handle),
size_(size),
mapped_data_(NULL) {
@@ -63,19 +67,18 @@ void Buffer::Unmap() {
namespace {
PP_Resource Create(PP_Instance instance, uint32_t size) {
- PP_Resource result = 0;
+ HostResource result;
int32_t shm_handle = -1;
PluginDispatcher::GetForInstance(instance)->Send(
new PpapiHostMsg_PPBBuffer_Create(
INTERFACE_ID_PPB_BUFFER, instance, size,
&result, &shm_handle));
- if (!result)
+ if (result.is_null())
return 0;
- linked_ptr<Buffer> object(new Buffer(instance, static_cast<int>(shm_handle),
- size));
- PluginResourceTracker::GetInstance()->AddResource(result, object);
- return result;
+ linked_ptr<Buffer> object(new Buffer(result,
+ static_cast<int>(shm_handle), size));
+ return PluginResourceTracker::GetInstance()->AddResource(object);
}
PP_Bool IsBuffer(PP_Resource resource) {
@@ -144,9 +147,11 @@ bool PPB_Buffer_Proxy::OnMessageReceived(const IPC::Message& msg) {
void PPB_Buffer_Proxy::OnMsgCreate(PP_Instance instance,
uint32_t size,
- PP_Resource* result_resource,
+ HostResource* result_resource,
int* result_shm_handle) {
- *result_resource = ppb_buffer_target()->Create(instance, size);
+ result_resource->SetHostResource(
+ instance,
+ ppb_buffer_target()->Create(instance, size));
// TODO(brettw) set the shm handle from a trusted interface.
*result_shm_handle = 0;
}
diff --git a/ppapi/proxy/ppb_buffer_proxy.h b/ppapi/proxy/ppb_buffer_proxy.h
index bec74f7..bc979a3 100644
--- a/ppapi/proxy/ppb_buffer_proxy.h
+++ b/ppapi/proxy/ppb_buffer_proxy.h
@@ -13,6 +13,8 @@ struct PPB_Buffer_Dev;
namespace pp {
namespace proxy {
+class HostResource;
+
class PPB_Buffer_Proxy : public InterfaceProxy {
public:
PPB_Buffer_Proxy(Dispatcher* dispatcher, const void* target_interface);
@@ -31,7 +33,7 @@ class PPB_Buffer_Proxy : public InterfaceProxy {
// Message handlers.
void OnMsgCreate(PP_Instance instance,
uint32_t size,
- PP_Resource* result_resource,
+ HostResource* result_resource,
int* result_shm_handle);
};
diff --git a/ppapi/proxy/ppb_core_proxy.cc b/ppapi/proxy/ppb_core_proxy.cc
index b4afcb6..a9486c8 100644
--- a/ppapi/proxy/ppb_core_proxy.cc
+++ b/ppapi/proxy/ppb_core_proxy.cc
@@ -110,12 +110,12 @@ bool PPB_Core_Proxy::OnMessageReceived(const IPC::Message& msg) {
return handled;
}
-void PPB_Core_Proxy::OnMsgAddRefResource(PP_Resource resource) {
- ppb_core_target()->AddRefResource(resource);
+void PPB_Core_Proxy::OnMsgAddRefResource(HostResource resource) {
+ ppb_core_target()->AddRefResource(resource.host_resource());
}
-void PPB_Core_Proxy::OnMsgReleaseResource(PP_Resource resource) {
- ppb_core_target()->ReleaseResource(resource);
+void PPB_Core_Proxy::OnMsgReleaseResource(HostResource resource) {
+ ppb_core_target()->ReleaseResource(resource.host_resource());
}
} // namespace proxy
diff --git a/ppapi/proxy/ppb_core_proxy.h b/ppapi/proxy/ppb_core_proxy.h
index ece12dc..0f8c58a 100644
--- a/ppapi/proxy/ppb_core_proxy.h
+++ b/ppapi/proxy/ppb_core_proxy.h
@@ -8,6 +8,7 @@
#include "ppapi/c/pp_completion_callback.h"
#include "ppapi/c/pp_resource.h"
#include "ppapi/c/pp_var.h"
+#include "ppapi/proxy/host_resource.h"
#include "ppapi/proxy/interface_proxy.h"
struct PPB_Core;
@@ -31,8 +32,8 @@ class PPB_Core_Proxy : public InterfaceProxy {
private:
// Message handlers.
- void OnMsgAddRefResource(PP_Resource resource);
- void OnMsgReleaseResource(PP_Resource resource);
+ void OnMsgAddRefResource(HostResource resource);
+ void OnMsgReleaseResource(HostResource resource);
};
} // namespace proxy
diff --git a/ppapi/proxy/ppb_cursor_control_proxy.cc b/ppapi/proxy/ppb_cursor_control_proxy.cc
index 75c3c3a..f1a89a2 100644
--- a/ppapi/proxy/ppb_cursor_control_proxy.cc
+++ b/ppapi/proxy/ppb_cursor_control_proxy.cc
@@ -1,11 +1,14 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ppapi/proxy/ppb_cursor_control_proxy.h"
+#include "ppapi/c/dev/pp_cursor_type_dev.h"
#include "ppapi/c/dev/ppb_cursor_control_dev.h"
#include "ppapi/proxy/plugin_dispatcher.h"
+#include "ppapi/proxy/plugin_resource.h"
+#include "ppapi/proxy/plugin_resource_tracker.h"
#include "ppapi/proxy/ppapi_messages.h"
namespace pp {
@@ -21,11 +24,24 @@ PP_Bool SetCursor(PP_Instance instance_id,
if (!dispatcher)
return PP_FALSE;
+ // It's legal for the image ID to be null if the type is not custom.
+ HostResource cursor_image_resource;
+ if (type == PP_CURSORTYPE_CUSTOM) {
+ PluginResource* cursor_image = PluginResourceTracker::GetInstance()->
+ GetResourceObject(custom_image_id);
+ if (!cursor_image || cursor_image->instance() != instance_id)
+ return PP_FALSE;
+ cursor_image_resource = cursor_image->host_resource();
+ } else {
+ if (custom_image_id)
+ return PP_FALSE; // Image specified for a predefined type.
+ }
+
PP_Bool result = PP_FALSE;
PP_Point empty_point = { 0, 0 };
dispatcher->Send(new PpapiHostMsg_PPBCursorControl_SetCursor(
INTERFACE_ID_PPB_CURSORCONTROL,
- instance_id, static_cast<int32_t>(type), custom_image_id,
+ instance_id, static_cast<int32_t>(type), cursor_image_resource,
hot_spot ? *hot_spot : empty_point, &result));
return result;
}
@@ -121,11 +137,12 @@ bool PPB_CursorControl_Proxy::OnMessageReceived(const IPC::Message& msg) {
void PPB_CursorControl_Proxy::OnMsgSetCursor(PP_Instance instance,
int32_t type,
- PP_Resource custom_image,
+ HostResource custom_image,
const PP_Point& hot_spot,
PP_Bool* result) {
*result = ppb_cursor_control_target()->SetCursor(
- instance, static_cast<PP_CursorType_Dev>(type), custom_image, &hot_spot);
+ instance, static_cast<PP_CursorType_Dev>(type),
+ custom_image.host_resource(), &hot_spot);
}
void PPB_CursorControl_Proxy::OnMsgLockCursor(PP_Instance instance,
diff --git a/ppapi/proxy/ppb_cursor_control_proxy.h b/ppapi/proxy/ppb_cursor_control_proxy.h
index 033e6c1..00f82ac 100644
--- a/ppapi/proxy/ppb_cursor_control_proxy.h
+++ b/ppapi/proxy/ppb_cursor_control_proxy.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -10,6 +10,7 @@
#include "ppapi/c/pp_instance.h"
#include "ppapi/c/pp_point.h"
#include "ppapi/c/pp_resource.h"
+#include "ppapi/proxy/host_resource.h"
#include "ppapi/proxy/interface_proxy.h"
struct PPB_CursorControl_Dev;
@@ -35,7 +36,7 @@ class PPB_CursorControl_Proxy : public InterfaceProxy {
// Message handlers.
void OnMsgSetCursor(PP_Instance instance,
int32_t type,
- PP_Resource custom_image,
+ HostResource custom_image,
const PP_Point& hot_spot,
PP_Bool* result);
void OnMsgLockCursor(PP_Instance instance,
diff --git a/ppapi/proxy/ppb_flash_proxy.cc b/ppapi/proxy/ppb_flash_proxy.cc
index 014cea3..6ff1cb5 100644
--- a/ppapi/proxy/ppb_flash_proxy.cc
+++ b/ppapi/proxy/ppb_flash_proxy.cc
@@ -67,13 +67,22 @@ PP_Bool DrawGlyphs(PP_Instance instance,
uint32_t glyph_count,
const uint16_t glyph_indices[],
const PP_Point glyph_advances[]) {
- PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(instance);
+ PluginResource* image_data = PluginResourceTracker::GetInstance()->
+ GetResourceObject(pp_image_data);
+ if (!image_data)
+ return PP_FALSE;
+ // The instance parameter isn't strictly necessary but we check that it
+ // matches anyway.
+ if (image_data->instance() != instance)
+ return PP_FALSE;
+
+ PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(
+ image_data->instance());
if (!dispatcher)
return PP_FALSE;
PPBFlash_DrawGlyphs_Params params;
- params.instance = instance,
- params.pp_image_data = pp_image_data;
+ params.image_data = image_data->host_resource();
params.font_desc.SetFromPPFontDescription(dispatcher, *font_desc, true);
params.color = color;
params.position = position;
@@ -305,8 +314,9 @@ void PPB_Flash_Proxy::OnMsgDrawGlyphs(
return;
*result = ppb_flash_target()->DrawGlyphs(
- params.instance, params.pp_image_data, &font_desc, params.color,
- params.position, params.clip,
+ 0, // Unused instance param.
+ params.image_data.host_resource(), &font_desc,
+ params.color, params.position, params.clip,
const_cast<float(*)[3]>(params.transformation),
static_cast<uint32_t>(params.glyph_indices.size()),
const_cast<uint16_t*>(&params.glyph_indices[0]),
diff --git a/ppapi/proxy/ppb_font_proxy.cc b/ppapi/proxy/ppb_font_proxy.cc
index 5c9dfb9..1bbfcf0 100644
--- a/ppapi/proxy/ppb_font_proxy.cc
+++ b/ppapi/proxy/ppb_font_proxy.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -14,7 +14,7 @@ namespace proxy {
class Font : public PluginResource {
public:
- Font(PP_Instance instance);
+ Font(const HostResource& resource);
virtual ~Font();
// PluginResource overrides.
@@ -31,7 +31,7 @@ class Font : public PluginResource {
DISALLOW_COPY_AND_ASSIGN(Font);
};
-Font::Font(PP_Instance instance) : PluginResource(instance) {
+Font::Font(const HostResource& resource) : PluginResource(resource) {
memset(&desc_, 0, sizeof(PP_FontDescription_Dev));
desc_.face.type = PP_VARTYPE_UNDEFINED;
memset(&metrics_, 0, sizeof(PP_FontMetrics_Dev));
@@ -52,17 +52,17 @@ PP_Resource Create(PP_Instance instance,
SerializedFontDescription in_description;
in_description.SetFromPPFontDescription(dispatcher, *description, true);
- PP_Resource result;
+ HostResource result;
SerializedFontDescription out_description;
std::string out_metrics;
dispatcher->Send(new PpapiHostMsg_PPBFont_Create(
INTERFACE_ID_PPB_FONT,
instance, in_description, &result, &out_description, &out_metrics));
- if (!result)
+ if (result.is_null())
return 0; // Failure creating font.
- linked_ptr<Font> object(new Font(instance));
+ linked_ptr<Font> object(new Font(result));
out_description.SetToPPFontDescription(dispatcher, object->desc_ptr(), true);
// Convert the metrics, this is just serialized as a string of bytes.
@@ -70,8 +70,7 @@ PP_Resource Create(PP_Instance instance,
return 0;
memcpy(&object->metrics(), out_metrics.data(), sizeof(PP_FontMetrics_Dev));
- PluginResourceTracker::GetInstance()->AddResource(result, object);
- return result;
+ return PluginResourceTracker::GetInstance()->AddResource(object);
}
PP_Bool IsFont(PP_Resource resource) {
@@ -102,13 +101,19 @@ PP_Bool DrawTextAt(PP_Resource font_id,
uint32_t color,
const PP_Rect* clip,
PP_Bool image_data_is_opaque) {
- Font* object = PluginResource::GetAs<Font>(font_id);
- if (!object)
+ Font* font_object = PluginResource::GetAs<Font>(font_id);
+ if (!font_object)
+ return PP_FALSE;
+ PluginResource* image_object = PluginResourceTracker::GetInstance()->
+ GetResourceObject(image_data);
+ if (!image_object)
+ return PP_FALSE;
+ if (font_object->instance() != image_object->instance())
return PP_FALSE;
PPBFont_DrawTextAt_Params params;
- params.font = font_id;
- params.image_data = image_data;
+ params.font = font_object->host_resource();
+ params.image_data = image_object->host_resource();
params.text_is_rtl = text->rtl;
params.override_direction = text->override_direction;
params.position = *position;
@@ -122,7 +127,8 @@ PP_Bool DrawTextAt(PP_Resource font_id,
}
params.image_data_is_opaque = image_data_is_opaque;
- Dispatcher* dispatcher = PluginDispatcher::GetForInstance(object->instance());
+ Dispatcher* dispatcher = PluginDispatcher::GetForInstance(
+ image_object->instance());
PP_Bool result = PP_FALSE;
if (dispatcher) {
dispatcher->Send(new PpapiHostMsg_PPBFont_DrawTextAt(
@@ -141,7 +147,7 @@ int32_t MeasureText(PP_Resource font_id, const PP_TextRun_Dev* text) {
Dispatcher* dispatcher = PluginDispatcher::GetForInstance(object->instance());
int32_t result = 0;
dispatcher->Send(new PpapiHostMsg_PPBFont_MeasureText(
- INTERFACE_ID_PPB_FONT, font_id,
+ INTERFACE_ID_PPB_FONT, object->host_resource(),
SerializedVarSendInput(dispatcher, text->text),
text->rtl, text->override_direction, &result));
return result;
@@ -157,7 +163,7 @@ uint32_t CharacterOffsetForPixel(PP_Resource font_id,
Dispatcher* dispatcher = PluginDispatcher::GetForInstance(object->instance());
uint32_t result = 0;
dispatcher->Send(new PpapiHostMsg_PPBFont_CharacterOffsetForPixel(
- INTERFACE_ID_PPB_FONT, font_id,
+ INTERFACE_ID_PPB_FONT, object->host_resource(),
SerializedVarSendInput(dispatcher, text->text),
text->rtl, text->override_direction, pixel_position, &result));
return result;
@@ -173,7 +179,7 @@ int32_t PixelOffsetForCharacter(PP_Resource font_id,
Dispatcher* dispatcher = PluginDispatcher::GetForInstance(object->instance());
int32_t result = 0;
dispatcher->Send(new PpapiHostMsg_PPBFont_PixelOffsetForCharacter(
- INTERFACE_ID_PPB_FONT, font_id,
+ INTERFACE_ID_PPB_FONT, object->host_resource(),
SerializedVarSendInput(dispatcher, text->text),
text->rtl, text->override_direction, char_offset, &result));
return result;
@@ -228,7 +234,7 @@ bool PPB_Font_Proxy::OnMessageReceived(const IPC::Message& msg) {
void PPB_Font_Proxy::OnMsgCreate(
PP_Instance instance,
const SerializedFontDescription& in_description,
- PP_Resource* result,
+ HostResource* result,
SerializedFontDescription* out_description,
std::string* out_metrics) {
// Convert the face name in the input description.
@@ -241,11 +247,13 @@ void PPB_Font_Proxy::OnMsgCreate(
memset(&out_pp_desc, 0, sizeof(PP_FontDescription_Dev));
out_pp_desc.face = PP_MakeUndefined();
- *result = ppb_font_target()->Create(instance, &in_pp_desc);
- if (*result) {
+ result->SetHostResource(instance,
+ ppb_font_target()->Create(instance, &in_pp_desc));
+ if (result->is_null()) {
// Get the metrics and resulting description to return to the browser.
PP_FontMetrics_Dev metrics;
- if (ppb_font_target()->Describe(*result, &out_pp_desc, &metrics)) {
+ if (ppb_font_target()->Describe(result->host_resource(), &out_pp_desc,
+ &metrics)) {
out_metrics->assign(reinterpret_cast<const char*>(&metrics),
sizeof(PP_FontMetrics_Dev));
}
@@ -264,12 +272,12 @@ void PPB_Font_Proxy::OnMsgDrawTextAt(SerializedVarReceiveInput text,
run.rtl = params.text_is_rtl;
run.override_direction = params.override_direction;
- *result = ppb_font_target()->DrawTextAt(params.font, params.image_data,
- &run, &params.position, params.color,
+ *result = ppb_font_target()->DrawTextAt(params.font.host_resource(),
+ params.image_data.host_resource(), &run, &params.position, params.color,
params.clip_is_null ? NULL : &params.clip, params.image_data_is_opaque);
}
-void PPB_Font_Proxy::OnMsgMeasureText(PP_Resource font,
+void PPB_Font_Proxy::OnMsgMeasureText(HostResource font,
SerializedVarReceiveInput text,
PP_Bool text_is_rtl,
PP_Bool override_direction,
@@ -279,11 +287,11 @@ void PPB_Font_Proxy::OnMsgMeasureText(PP_Resource font,
run.rtl = text_is_rtl;
run.override_direction = override_direction;
- *result = ppb_font_target()->MeasureText(font, &run);
+ *result = ppb_font_target()->MeasureText(font.host_resource(), &run);
}
void PPB_Font_Proxy::OnMsgCharacterOffsetForPixel(
- PP_Resource font,
+ HostResource font,
SerializedVarReceiveInput text,
PP_Bool text_is_rtl,
PP_Bool override_direction,
@@ -294,11 +302,12 @@ void PPB_Font_Proxy::OnMsgCharacterOffsetForPixel(
run.rtl = text_is_rtl;
run.override_direction = override_direction;
- *result = ppb_font_target()->CharacterOffsetForPixel(font, &run, pixel_pos);
+ *result = ppb_font_target()->CharacterOffsetForPixel(font.host_resource(),
+ &run, pixel_pos);
}
void PPB_Font_Proxy::OnMsgPixelOffsetForCharacter(
- PP_Resource font,
+ HostResource font,
SerializedVarReceiveInput text,
PP_Bool text_is_rtl,
PP_Bool override_direction,
@@ -309,7 +318,8 @@ void PPB_Font_Proxy::OnMsgPixelOffsetForCharacter(
run.rtl = text_is_rtl;
run.override_direction = override_direction;
- *result = ppb_font_target()->PixelOffsetForCharacter(font, &run, char_offset);
+ *result = ppb_font_target()->PixelOffsetForCharacter(font.host_resource(),
+ &run, char_offset);
}
} // namespace proxy
diff --git a/ppapi/proxy/ppb_font_proxy.h b/ppapi/proxy/ppb_font_proxy.h
index 322af80..1afe36f 100644
--- a/ppapi/proxy/ppb_font_proxy.h
+++ b/ppapi/proxy/ppb_font_proxy.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -8,6 +8,7 @@
#include "base/basictypes.h"
#include "ppapi/c/pp_instance.h"
#include "ppapi/c/pp_resource.h"
+#include "ppapi/proxy/host_resource.h"
#include "ppapi/proxy/interface_proxy.h"
struct PPB_Font_Dev;
@@ -37,24 +38,24 @@ class PPB_Font_Proxy : public InterfaceProxy {
// Message handlers.
void OnMsgCreate(PP_Instance instance,
const SerializedFontDescription& in_description,
- PP_Resource* result,
+ HostResource* result,
SerializedFontDescription* out_description,
std::string* out_metrics);
void OnMsgDrawTextAt(SerializedVarReceiveInput text,
const PPBFont_DrawTextAt_Params& params,
PP_Bool* result);
- void OnMsgMeasureText(PP_Resource font,
+ void OnMsgMeasureText(HostResource font,
SerializedVarReceiveInput text,
PP_Bool text_is_rtl,
PP_Bool override_direction,
int32_t* result);
- void OnMsgCharacterOffsetForPixel(PP_Resource font,
+ void OnMsgCharacterOffsetForPixel(HostResource font,
SerializedVarReceiveInput text,
PP_Bool text_is_rtl,
PP_Bool override_direction,
int32_t pixel_pos,
uint32_t* result);
- void OnMsgPixelOffsetForCharacter(PP_Resource font,
+ void OnMsgPixelOffsetForCharacter(HostResource font,
SerializedVarReceiveInput text,
PP_Bool text_is_rtl,
PP_Bool override_direction,
diff --git a/ppapi/proxy/ppb_graphics_2d_proxy.cc b/ppapi/proxy/ppb_graphics_2d_proxy.cc
index 143ec44..be98e1d 100644
--- a/ppapi/proxy/ppb_graphics_2d_proxy.cc
+++ b/ppapi/proxy/ppb_graphics_2d_proxy.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -21,14 +21,16 @@ namespace proxy {
class Graphics2D : public PluginResource {
public:
- Graphics2D(PP_Instance instance,
+ Graphics2D(const HostResource& host_resource,
const PP_Size& size,
PP_Bool is_always_opaque)
- : PluginResource(instance),
+ : PluginResource(host_resource),
size_(size),
is_always_opaque_(is_always_opaque),
current_flush_callback_(PP_BlockUntilComplete()) {
}
+ virtual ~Graphics2D() {
+ }
// Resource overrides.
virtual Graphics2D* AsGraphics2D() { return this; }
@@ -65,16 +67,15 @@ PP_Resource Create(PP_Instance instance,
if (!dispatcher)
return PP_ERROR_BADARGUMENT;
- PP_Resource result = 0;
+ HostResource result;
dispatcher->Send(new PpapiHostMsg_PPBGraphics2D_Create(
INTERFACE_ID_PPB_GRAPHICS_2D, instance, *size, is_always_opaque,
&result));
- if (result) {
- linked_ptr<Graphics2D> graphics_2d(new Graphics2D(instance, *size,
- is_always_opaque));
- PluginResourceTracker::GetInstance()->AddResource(result, graphics_2d);
- }
- return result;
+ if (result.is_null())
+ return 0;
+ linked_ptr<Graphics2D> graphics_2d(new Graphics2D(result, *size,
+ is_always_opaque));
+ return PluginResourceTracker::GetInstance()->AddResource(graphics_2d);
}
PP_Bool IsGraphics2D(PP_Resource resource) {
@@ -102,19 +103,27 @@ void PaintImageData(PP_Resource graphics_2d,
PP_Resource image_data,
const PP_Point* top_left,
const PP_Rect* src_rect) {
- Graphics2D* object = PluginResource::GetAs<Graphics2D>(graphics_2d);
- if (!object)
+ Graphics2D* graphics_object = PluginResource::GetAs<Graphics2D>(graphics_2d);
+ if (!graphics_object)
+ return;
+ PluginResource* image_object = PluginResourceTracker::GetInstance()->
+ GetResourceObject(image_data);
+ if (!image_object)
return;
+ if (graphics_object->instance() != image_object->instance())
+ return;
+
PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(
- object->instance());
+ graphics_object->instance());
if (!dispatcher)
return;
PP_Rect dummy;
memset(&dummy, 0, sizeof(PP_Rect));
dispatcher->Send(new PpapiHostMsg_PPBGraphics2D_PaintImageData(
- INTERFACE_ID_PPB_GRAPHICS_2D, graphics_2d, image_data, *top_left,
- !!src_rect, src_rect ? *src_rect : dummy));
+ INTERFACE_ID_PPB_GRAPHICS_2D, graphics_object->host_resource(),
+ image_object->host_resource(), *top_left, !!src_rect,
+ src_rect ? *src_rect : dummy));
}
void Scroll(PP_Resource graphics_2d,
@@ -131,21 +140,29 @@ void Scroll(PP_Resource graphics_2d,
PP_Rect dummy;
memset(&dummy, 0, sizeof(PP_Rect));
dispatcher->Send(new PpapiHostMsg_PPBGraphics2D_Scroll(
- INTERFACE_ID_PPB_GRAPHICS_2D, graphics_2d, !!clip_rect,
- clip_rect ? *clip_rect : dummy, *amount));
+ INTERFACE_ID_PPB_GRAPHICS_2D, object->host_resource(),
+ !!clip_rect, clip_rect ? *clip_rect : dummy, *amount));
}
void ReplaceContents(PP_Resource graphics_2d, PP_Resource image_data) {
- Graphics2D* object = PluginResource::GetAs<Graphics2D>(graphics_2d);
- if (!object)
+ Graphics2D* graphics_object = PluginResource::GetAs<Graphics2D>(graphics_2d);
+ if (!graphics_object)
+ return;
+ PluginResource* image_object = PluginResourceTracker::GetInstance()->
+ GetResourceObject(image_data);
+ if (!image_object)
return;
+ if (graphics_object->instance() != image_object->instance())
+ return;
+
PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(
- object->instance());
+ graphics_object->instance());
if (!dispatcher)
return;
dispatcher->Send(new PpapiHostMsg_PPBGraphics2D_ReplaceContents(
- INTERFACE_ID_PPB_GRAPHICS_2D, graphics_2d, image_data));
+ INTERFACE_ID_PPB_GRAPHICS_2D, graphics_object->host_resource(),
+ image_object->host_resource()));
}
int32_t Flush(PP_Resource graphics_2d,
@@ -168,7 +185,7 @@ int32_t Flush(PP_Resource graphics_2d,
object->set_current_flush_callback(callback);
dispatcher->Send(new PpapiHostMsg_PPBGraphics2D_Flush(
- INTERFACE_ID_PPB_GRAPHICS_2D, graphics_2d));
+ INTERFACE_ID_PPB_GRAPHICS_2D, object->host_resource()));
return PP_ERROR_WOULDBLOCK;
}
@@ -226,40 +243,42 @@ bool PPB_Graphics2D_Proxy::OnMessageReceived(const IPC::Message& msg) {
void PPB_Graphics2D_Proxy::OnMsgCreate(PP_Instance instance,
const PP_Size& size,
PP_Bool is_always_opaque,
- PP_Resource* result) {
- *result = ppb_graphics_2d_target()->Create(
- instance, &size, is_always_opaque);
+ HostResource* result) {
+ result->SetHostResource(instance, ppb_graphics_2d_target()->Create(
+ instance, &size, is_always_opaque));
}
-void PPB_Graphics2D_Proxy::OnMsgPaintImageData(PP_Resource graphics_2d,
- PP_Resource image_data,
- const PP_Point& top_left,
- bool src_rect_specified,
- const PP_Rect& src_rect) {
+void PPB_Graphics2D_Proxy::OnMsgPaintImageData(
+ const HostResource& graphics_2d,
+ const HostResource& image_data,
+ const PP_Point& top_left,
+ bool src_rect_specified,
+ const PP_Rect& src_rect) {
ppb_graphics_2d_target()->PaintImageData(
- graphics_2d, image_data, &top_left,
+ graphics_2d.host_resource(), image_data.host_resource(), &top_left,
src_rect_specified ? &src_rect : NULL);
}
-void PPB_Graphics2D_Proxy::OnMsgScroll(PP_Resource graphics_2d,
+void PPB_Graphics2D_Proxy::OnMsgScroll(const HostResource& graphics_2d,
bool clip_specified,
const PP_Rect& clip,
const PP_Point& amount) {
- ppb_graphics_2d_target()->Scroll(
- graphics_2d,
- clip_specified ? &clip : NULL, &amount);
+ ppb_graphics_2d_target()->Scroll(graphics_2d.host_resource(),
+ clip_specified ? &clip : NULL, &amount);
}
-void PPB_Graphics2D_Proxy::OnMsgReplaceContents(PP_Resource graphics_2d,
- PP_Resource image_data) {
- ppb_graphics_2d_target()->ReplaceContents(graphics_2d, image_data);
+void PPB_Graphics2D_Proxy::OnMsgReplaceContents(
+ const HostResource& graphics_2d,
+ const HostResource& image_data) {
+ ppb_graphics_2d_target()->ReplaceContents(graphics_2d.host_resource(),
+ image_data.host_resource());
}
-void PPB_Graphics2D_Proxy::OnMsgFlush(PP_Resource graphics_2d) {
+void PPB_Graphics2D_Proxy::OnMsgFlush(const HostResource& graphics_2d) {
CompletionCallback callback = callback_factory_.NewCallback(
&PPB_Graphics2D_Proxy::SendFlushACKToPlugin, graphics_2d);
int32_t result = ppb_graphics_2d_target()->Flush(
- graphics_2d, callback.pp_completion_callback());
+ graphics_2d.host_resource(), callback.pp_completion_callback());
if (result != PP_ERROR_WOULDBLOCK) {
// There was some error, so we won't get a flush callback. We need to now
// issue the ACK to the plugin hears about the error. This will also clean
@@ -268,9 +287,15 @@ void PPB_Graphics2D_Proxy::OnMsgFlush(PP_Resource graphics_2d) {
}
}
-void PPB_Graphics2D_Proxy::OnMsgFlushACK(PP_Resource resource,
+void PPB_Graphics2D_Proxy::OnMsgFlushACK(const HostResource& host_resource,
int32_t pp_error) {
- Graphics2D* object = PluginResource::GetAs<Graphics2D>(resource);
+ PP_Resource plugin_resource =
+ PluginResourceTracker::GetInstance()->PluginResourceForHostResource(
+ host_resource);
+ if (!plugin_resource)
+ return;
+
+ Graphics2D* object = PluginResource::GetAs<Graphics2D>(plugin_resource);
if (!object) {
// The plugin has released the graphics 2D object so don't issue the
// callback.
@@ -284,8 +309,9 @@ void PPB_Graphics2D_Proxy::OnMsgFlushACK(PP_Resource resource,
PP_RunCompletionCallback(&callback, pp_error);
}
-void PPB_Graphics2D_Proxy::SendFlushACKToPlugin(int32_t result,
- PP_Resource graphics_2d) {
+void PPB_Graphics2D_Proxy::SendFlushACKToPlugin(
+ int32_t result,
+ const HostResource& graphics_2d) {
dispatcher()->Send(new PpapiMsg_PPBGraphics2D_FlushACK(
INTERFACE_ID_PPB_GRAPHICS_2D, graphics_2d, result));
}
diff --git a/ppapi/proxy/ppb_graphics_2d_proxy.h b/ppapi/proxy/ppb_graphics_2d_proxy.h
index 96d3277..0e9400f 100644
--- a/ppapi/proxy/ppb_graphics_2d_proxy.h
+++ b/ppapi/proxy/ppb_graphics_2d_proxy.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -13,6 +13,7 @@
#include "ppapi/c/pp_size.h"
#include "ppapi/c/pp_var.h"
#include "ppapi/cpp/completion_callback.h"
+#include "ppapi/proxy/host_resource.h"
#include "ppapi/proxy/interface_proxy.h"
#include "ppapi/proxy/proxy_non_thread_safe_ref_count.h"
@@ -42,25 +43,27 @@ class PPB_Graphics2D_Proxy : public InterfaceProxy {
void OnMsgCreate(PP_Module module,
const PP_Size& size,
PP_Bool is_always_opaque,
- PP_Resource* result);
- void OnMsgPaintImageData(PP_Resource graphics_2d,
- PP_Resource image_data,
+ HostResource* result);
+ void OnMsgPaintImageData(const HostResource& graphics_2d,
+ const HostResource& image_data,
const PP_Point& top_left,
bool src_rect_specified,
const PP_Rect& src_rect);
- void OnMsgScroll(PP_Resource graphics_2d,
+ void OnMsgScroll(const HostResource& graphics_2d,
bool clip_specified,
const PP_Rect& clip,
const PP_Point& amount);
- void OnMsgReplaceContents(PP_Resource graphics_2d,
- PP_Resource image_data);
- void OnMsgFlush(PP_Resource graphics_2d);
+ void OnMsgReplaceContents(const HostResource& graphics_2d,
+ const HostResource& image_data);
+ void OnMsgFlush(const HostResource& graphics_2d);
// Renderer->plugin message handlers.
- void OnMsgFlushACK(PP_Resource graphics_2d, int32_t pp_error);
+ void OnMsgFlushACK(const HostResource& graphics_2d,
+ int32_t pp_error);
// Called in the renderer to send the given flush ACK to the plugin.
- void SendFlushACKToPlugin(int32_t result, PP_Resource graphics_2d);
+ void SendFlushACKToPlugin(int32_t result,
+ const HostResource& graphics_2d);
CompletionCallbackFactory<PPB_Graphics2D_Proxy,
ProxyNonThreadSafeRefCount> callback_factory_;
diff --git a/ppapi/proxy/ppb_image_data_proxy.cc b/ppapi/proxy/ppb_image_data_proxy.cc
index 386add9..18b4614 100644
--- a/ppapi/proxy/ppb_image_data_proxy.cc
+++ b/ppapi/proxy/ppb_image_data_proxy.cc
@@ -14,14 +14,128 @@
#include "ppapi/c/pp_errors.h"
#include "ppapi/c/pp_resource.h"
#include "ppapi/c/trusted/ppb_image_data_trusted.h"
-#include "ppapi/proxy/image_data.h"
+#include "ppapi/proxy/host_resource.h"
#include "ppapi/proxy/plugin_dispatcher.h"
+#include "ppapi/proxy/plugin_resource.h"
#include "ppapi/proxy/plugin_resource_tracker.h"
#include "ppapi/proxy/ppapi_messages.h"
+#include "ppapi/shared_impl/image_data_impl.h"
+
+#if defined(OS_LINUX)
+#include <sys/shm.h>
+#elif defined(OS_MACOSX)
+#include <sys/stat.h>
+#include <sys/mman.h>
+#endif
namespace pp {
namespace proxy {
+class ImageData : public PluginResource,
+ public pp::shared_impl::ImageDataImpl {
+ public:
+ ImageData(const HostResource& resource,
+ const PP_ImageDataDesc& desc,
+ ImageHandle handle);
+ virtual ~ImageData();
+
+ // Resource overrides.
+ virtual ImageData* AsImageData();
+
+ void* Map();
+ void Unmap();
+
+ const PP_ImageDataDesc& desc() const { return desc_; }
+
+ static const ImageHandle NullHandle;
+ static ImageHandle HandleFromInt(int32_t i);
+
+ private:
+ PP_ImageDataDesc desc_;
+ ImageHandle handle_;
+
+ void* mapped_data_;
+
+ DISALLOW_COPY_AND_ASSIGN(ImageData);
+};
+
+ImageData::ImageData(const HostResource& resource,
+ const PP_ImageDataDesc& desc,
+ ImageHandle handle)
+ : PluginResource(resource),
+ desc_(desc),
+ handle_(handle),
+ mapped_data_(NULL) {
+}
+
+ImageData::~ImageData() {
+ Unmap();
+}
+
+ImageData* ImageData::AsImageData() {
+ return this;
+}
+
+void* ImageData::Map() {
+#if defined(OS_WIN)
+ NOTIMPLEMENTED();
+ return NULL;
+#elif defined(OS_MACOSX)
+ struct stat st;
+ if (fstat(handle_.fd, &st) != 0)
+ return NULL;
+ void* memory = mmap(NULL, st.st_size, PROT_READ | PROT_WRITE,
+ MAP_SHARED, handle_.fd, 0);
+ if (memory == MAP_FAILED)
+ return NULL;
+ mapped_data_ = memory;
+ return mapped_data_;
+#else
+ int shmkey = handle_;
+ void* address = shmat(shmkey, NULL, 0);
+ // Mark for deletion in case we crash so the kernel will clean it up.
+ shmctl(shmkey, IPC_RMID, 0);
+ if (address == (void*)-1)
+ return NULL;
+ mapped_data_ = address;
+ return address;
+#endif
+}
+
+void ImageData::Unmap() {
+#if defined(OS_WIN)
+ NOTIMPLEMENTED();
+#elif defined(OS_MACOSX)
+ if (mapped_data_) {
+ struct stat st;
+ if (fstat(handle_.fd, &st) == 0)
+ munmap(mapped_data_, st.st_size);
+ }
+#else
+ if (mapped_data_)
+ shmdt(mapped_data_);
+#endif
+ mapped_data_ = NULL;
+}
+
+#if defined(OS_WIN)
+const ImageHandle ImageData::NullHandle = NULL;
+#elif defined(OS_MACOSX)
+const ImageHandle ImageData::NullHandle = ImageHandle();
+#else
+const ImageHandle ImageData::NullHandle = 0;
+#endif
+
+ImageHandle ImageData::HandleFromInt(int32_t i) {
+#if defined(OS_WIN)
+ return reinterpret_cast<ImageHandle>(i);
+#elif defined(OS_MACOSX)
+ return ImageHandle(i, false);
+#else
+ return static_cast<ImageHandle>(i);
+#endif
+}
+
namespace {
PP_ImageDataFormat GetNativeImageDataFormat() {
@@ -40,22 +154,22 @@ PP_Resource Create(PP_Instance instance,
if (!dispatcher)
return PP_ERROR_BADARGUMENT;
- PP_Resource result = 0;
+ HostResource result;
std::string image_data_desc;
ImageHandle image_handle = ImageData::NullHandle;
dispatcher->Send(new PpapiHostMsg_PPBImageData_Create(
INTERFACE_ID_PPB_IMAGE_DATA, instance, format, *size, init_to_zero,
&result, &image_data_desc, &image_handle));
- if (result && image_data_desc.size() == sizeof(PP_ImageDataDesc)) {
- // We serialize the PP_ImageDataDesc just by copying to a string.
- PP_ImageDataDesc desc;
- memcpy(&desc, image_data_desc.data(), sizeof(PP_ImageDataDesc));
+ if (result.is_null() || image_data_desc.size() != sizeof(PP_ImageDataDesc))
+ return 0;
- linked_ptr<ImageData> object(new ImageData(instance, desc, image_handle));
- PluginResourceTracker::GetInstance()->AddResource(result, object);
- }
- return result;
+ // We serialize the PP_ImageDataDesc just by copying to a string.
+ PP_ImageDataDesc desc;
+ memcpy(&desc, image_data_desc.data(), sizeof(PP_ImageDataDesc));
+
+ linked_ptr<ImageData> object(new ImageData(result, desc, image_handle));
+ return PluginResourceTracker::GetInstance()->AddResource(object);
}
PP_Bool IsImageData(PP_Resource resource) {
@@ -126,16 +240,16 @@ void PPB_ImageData_Proxy::OnMsgCreate(PP_Instance instance,
int32_t format,
const PP_Size& size,
PP_Bool init_to_zero,
- PP_Resource* result,
+ HostResource* result,
std::string* image_data_desc,
ImageHandle* result_image_handle) {
- *result = ppb_image_data_target()->Create(
+ PP_Resource resource = ppb_image_data_target()->Create(
instance, static_cast<PP_ImageDataFormat>(format), &size, init_to_zero);
*result_image_handle = ImageData::NullHandle;
- if (*result) {
+ if (resource) {
// The ImageDesc is just serialized as a string.
PP_ImageDataDesc desc;
- if (ppb_image_data_target()->Describe(*result, &desc)) {
+ if (ppb_image_data_target()->Describe(resource, &desc)) {
image_data_desc->resize(sizeof(PP_ImageDataDesc));
memcpy(&(*image_data_desc)[0], &desc, sizeof(PP_ImageDataDesc));
}
@@ -147,9 +261,11 @@ void PPB_ImageData_Proxy::OnMsgCreate(PP_Instance instance,
uint32_t byte_count = 0;
if (trusted) {
int32_t handle;
- if (trusted->GetSharedMemory(*result, &handle, &byte_count) == PP_OK)
+ if (trusted->GetSharedMemory(resource, &handle, &byte_count) == PP_OK)
*result_image_handle = ImageData::HandleFromInt(handle);
}
+
+ result->SetHostResource(instance, resource);
}
}
diff --git a/ppapi/proxy/ppb_image_data_proxy.h b/ppapi/proxy/ppb_image_data_proxy.h
index 5a0d076..62f83fd 100644
--- a/ppapi/proxy/ppb_image_data_proxy.h
+++ b/ppapi/proxy/ppb_image_data_proxy.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -7,19 +7,21 @@
#include "ppapi/c/pp_bool.h"
#include "ppapi/c/pp_completion_callback.h"
+#include "ppapi/c/pp_instance.h"
#include "ppapi/c/pp_module.h"
#include "ppapi/c/pp_resource.h"
#include "ppapi/c/pp_size.h"
#include "ppapi/c/pp_var.h"
#include "ppapi/proxy/interface_proxy.h"
-#include "ppapi/proxy/image_data.h"
-
+#include "ppapi/proxy/serialized_structs.h"
struct PPB_ImageData;
namespace pp {
namespace proxy {
+class HostResource;
+
class PPB_ImageData_Proxy : public InterfaceProxy {
public:
PPB_ImageData_Proxy(Dispatcher* dispatcher, const void* target_interface);
@@ -42,7 +44,7 @@ class PPB_ImageData_Proxy : public InterfaceProxy {
int32_t format,
const PP_Size& size,
PP_Bool init_to_zero,
- PP_Resource* result,
+ HostResource* result,
std::string* image_data_desc,
ImageHandle* result_image_handle);
};
diff --git a/ppapi/proxy/ppb_instance_proxy.cc b/ppapi/proxy/ppb_instance_proxy.cc
index 8962292..d17e17b 100644
--- a/ppapi/proxy/ppb_instance_proxy.cc
+++ b/ppapi/proxy/ppb_instance_proxy.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -7,6 +7,8 @@
#include "ppapi/c/pp_var.h"
#include "ppapi/c/ppb_instance.h"
#include "ppapi/proxy/plugin_dispatcher.h"
+#include "ppapi/proxy/plugin_resource.h"
+#include "ppapi/proxy/plugin_resource_tracker.h"
#include "ppapi/proxy/ppapi_messages.h"
#include "ppapi/proxy/serialized_var.h"
@@ -42,9 +44,15 @@ PP_Bool BindGraphics(PP_Instance instance, PP_Resource device) {
if (!dispatcher)
return PP_FALSE;
+ PluginResource* object =
+ PluginResourceTracker::GetInstance()->GetResourceObject(device);
+ if (!object || object->instance() != instance)
+ return PP_FALSE;
+
PP_Bool result = PP_FALSE;
dispatcher->Send(new PpapiHostMsg_PPBInstance_BindGraphics(
- INTERFACE_ID_PPB_INSTANCE, instance, device, &result));
+ INTERFACE_ID_PPB_INSTANCE, instance, object->host_resource(),
+ &result));
return result;
}
@@ -134,9 +142,10 @@ void PPB_Instance_Proxy::OnMsgGetOwnerElementObject(
}
void PPB_Instance_Proxy::OnMsgBindGraphics(PP_Instance instance,
- PP_Resource device,
+ HostResource device,
PP_Bool* result) {
- *result = ppb_instance_target()->BindGraphics(instance, device);
+ *result = ppb_instance_target()->BindGraphics(instance,
+ device.host_resource());
}
void PPB_Instance_Proxy::OnMsgIsFullFrame(PP_Instance instance,
diff --git a/ppapi/proxy/ppb_instance_proxy.h b/ppapi/proxy/ppb_instance_proxy.h
index b01e9b0..4a73d5c 100644
--- a/ppapi/proxy/ppb_instance_proxy.h
+++ b/ppapi/proxy/ppb_instance_proxy.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -8,6 +8,7 @@
#include "ppapi/c/pp_instance.h"
#include "ppapi/c/pp_resource.h"
#include "ppapi/c/pp_var.h"
+#include "ppapi/proxy/host_resource.h"
#include "ppapi/proxy/interface_proxy.h"
struct PPB_Instance;
@@ -40,7 +41,7 @@ class PPB_Instance_Proxy : public InterfaceProxy {
void OnMsgGetOwnerElementObject(PP_Instance instance,
SerializedVarReturnValue result);
void OnMsgBindGraphics(PP_Instance instance,
- PP_Resource device,
+ HostResource device,
PP_Bool* result);
void OnMsgIsFullFrame(PP_Instance instance, PP_Bool* result);
void OnMsgExecuteScript(PP_Instance instance,
diff --git a/ppapi/proxy/ppb_pdf_proxy.cc b/ppapi/proxy/ppb_pdf_proxy.cc
index 7ad8326..e3c656f 100644
--- a/ppapi/proxy/ppb_pdf_proxy.cc
+++ b/ppapi/proxy/ppb_pdf_proxy.cc
@@ -22,7 +22,8 @@ namespace proxy {
class PrivateFontFile : public PluginResource {
public:
- PrivateFontFile(PP_Instance instance) : PluginResource(instance) {}
+ PrivateFontFile(const HostResource& resource) : PluginResource(resource) {
+ }
virtual ~PrivateFontFile() {}
// Resource overrides.
@@ -68,15 +69,14 @@ PP_Resource GetFontFileWithFallback(
SerializedFontDescription desc;
desc.SetFromPPFontDescription(dispatcher, *description, true);
- PP_Resource result = 0;
+ HostResource result;
dispatcher->Send(new PpapiHostMsg_PPBPDF_GetFontFileWithFallback(
INTERFACE_ID_PPB_PDF, instance, desc, charset, &result));
- if (!result)
+ if (result.is_null())
return 0;
- linked_ptr<PrivateFontFile> object(new PrivateFontFile(instance));
- PluginResourceTracker::GetInstance()->AddResource(result, object);
- return result;
+ linked_ptr<PrivateFontFile> object(new PrivateFontFile(result));
+ return PluginResourceTracker::GetInstance()->AddResource(object);
}
bool GetFontTableForPrivateFontFile(PP_Resource font_file,
@@ -95,7 +95,7 @@ bool GetFontTableForPrivateFontFile(PP_Resource font_file,
if (!contents) {
std::string deserialized;
dispatcher->Send(new PpapiHostMsg_PPBPDF_GetFontTableForPrivateFontFile(
- INTERFACE_ID_PPB_PDF, font_file, table, &deserialized));
+ INTERFACE_ID_PPB_PDF, object->host_resource(), table, &deserialized));
if (deserialized.empty())
return false;
contents = object->AddFontTable(table, deserialized);
@@ -149,26 +149,28 @@ void PPB_PDF_Proxy::OnMsgGetFontFileWithFallback(
PP_Instance instance,
const SerializedFontDescription& in_desc,
int32_t charset,
- PP_Resource* result) {
+ HostResource* result) {
PP_FontDescription_Dev desc;
in_desc.SetToPPFontDescription(dispatcher(), &desc, false);
- *result = ppb_pdf_target()->GetFontFileWithFallback(instance, &desc,
- static_cast<PP_PrivateFontCharset>(charset));
+ result->SetHostResource(instance,
+ ppb_pdf_target()->GetFontFileWithFallback(
+ instance, &desc, static_cast<PP_PrivateFontCharset>(charset)));
}
-void PPB_PDF_Proxy::OnMsgGetFontTableForPrivateFontFile(PP_Resource font_file,
- uint32_t table,
- std::string* result) {
+void PPB_PDF_Proxy::OnMsgGetFontTableForPrivateFontFile(
+ const HostResource& font_file,
+ uint32_t table,
+ std::string* result) {
// TODO(brettw): It would be nice not to copy here. At least on Linux,
// we can map the font file into shared memory and read it that way.
uint32_t table_length = 0;
if (!ppb_pdf_target()->GetFontTableForPrivateFontFile(
- font_file, table, NULL, &table_length))
+ font_file.host_resource(), table, NULL, &table_length))
return;
result->resize(table_length);
- ppb_pdf_target()->GetFontTableForPrivateFontFile(font_file, table,
- const_cast<char*>(result->c_str()), &table_length);
+ ppb_pdf_target()->GetFontTableForPrivateFontFile(font_file.host_resource(),
+ table, const_cast<char*>(result->c_str()), &table_length);
}
} // namespace proxy
diff --git a/ppapi/proxy/ppb_pdf_proxy.h b/ppapi/proxy/ppb_pdf_proxy.h
index 071a493..c0da291 100644
--- a/ppapi/proxy/ppb_pdf_proxy.h
+++ b/ppapi/proxy/ppb_pdf_proxy.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -6,6 +6,7 @@
#define PPAPI_PPB_PDF_PROXY_H_
#include "ppapi/c/pp_module.h"
+#include "ppapi/proxy/host_resource.h"
#include "ppapi/proxy/interface_proxy.h"
struct PPB_PDF;
@@ -34,8 +35,8 @@ class PPB_PDF_Proxy : public InterfaceProxy {
void OnMsgGetFontFileWithFallback(PP_Module module,
const SerializedFontDescription& desc,
int32_t charset,
- PP_Resource* result);
- void OnMsgGetFontTableForPrivateFontFile(PP_Resource font_file,
+ HostResource* result);
+ void OnMsgGetFontTableForPrivateFontFile(const HostResource& font_file,
uint32_t table,
std::string* result);
};
diff --git a/ppapi/proxy/ppb_testing_proxy.cc b/ppapi/proxy/ppb_testing_proxy.cc
index fc9b9b6..b65bae7 100644
--- a/ppapi/proxy/ppb_testing_proxy.cc
+++ b/ppapi/proxy/ppb_testing_proxy.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -6,8 +6,9 @@
#include "base/message_loop.h"
#include "ppapi/c/dev/ppb_testing_dev.h"
-#include "ppapi/proxy/image_data.h"
#include "ppapi/proxy/plugin_dispatcher.h"
+#include "ppapi/proxy/plugin_resource.h"
+#include "ppapi/proxy/plugin_resource_tracker.h"
#include "ppapi/proxy/ppapi_messages.h"
namespace pp {
@@ -15,12 +16,19 @@ namespace proxy {
namespace {
-PP_Bool ReadImageData(PP_Resource device_context_2d,
+PP_Bool ReadImageData(PP_Resource graphics_2d,
PP_Resource image,
const PP_Point* top_left) {
- ImageData* image_object = PluginResource::GetAs<ImageData>(image);
+ PluginResource* image_object = PluginResourceTracker::GetInstance()->
+ GetResourceObject(image);
if (!image_object)
return PP_FALSE;
+ PluginResource* graphics_2d_object =
+ PluginResourceTracker::GetInstance()->GetResourceObject(graphics_2d);
+ if (!graphics_2d_object ||
+ image_object->instance() != graphics_2d_object->instance())
+ return PP_FALSE;
+
PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(
image_object->instance());
if (!dispatcher)
@@ -28,7 +36,8 @@ PP_Bool ReadImageData(PP_Resource device_context_2d,
PP_Bool result = PP_FALSE;
dispatcher->Send(new PpapiHostMsg_PPBTesting_ReadImageData(
- INTERFACE_ID_PPB_TESTING, device_context_2d, image, *top_left, &result));
+ INTERFACE_ID_PPB_TESTING, graphics_2d_object->host_resource(),
+ image_object->host_resource(), *top_left, &result));
return result;
}
@@ -95,12 +104,13 @@ bool PPB_Testing_Proxy::OnMessageReceived(const IPC::Message& msg) {
return handled;
}
-void PPB_Testing_Proxy::OnMsgReadImageData(PP_Resource device_context_2d,
- PP_Resource image,
- const PP_Point& top_left,
- PP_Bool* result) {
+void PPB_Testing_Proxy::OnMsgReadImageData(
+ const HostResource& device_context_2d,
+ const HostResource& image,
+ const PP_Point& top_left,
+ PP_Bool* result) {
*result = ppb_testing_target()->ReadImageData(
- device_context_2d, image, &top_left);
+ device_context_2d.host_resource(), image.host_resource(), &top_left);
}
void PPB_Testing_Proxy::OnMsgRunMessageLoop(bool* dummy) {
@@ -113,7 +123,7 @@ void PPB_Testing_Proxy::OnMsgQuitMessageLoop() {
}
void PPB_Testing_Proxy::OnMsgGetLiveObjectsForInstance(PP_Instance instance,
- uint32_t* result) {
+ uint32_t* result) {
*result = ppb_testing_target()->GetLiveObjectsForInstance(instance);
}
diff --git a/ppapi/proxy/ppb_testing_proxy.h b/ppapi/proxy/ppb_testing_proxy.h
index a878329..9133a2d 100644
--- a/ppapi/proxy/ppb_testing_proxy.h
+++ b/ppapi/proxy/ppb_testing_proxy.h
@@ -8,6 +8,7 @@
#include "base/basictypes.h"
#include "ppapi/c/pp_instance.h"
#include "ppapi/c/pp_resource.h"
+#include "ppapi/proxy/host_resource.h"
#include "ppapi/proxy/interface_proxy.h"
struct PP_Point;
@@ -32,8 +33,8 @@ class PPB_Testing_Proxy : public InterfaceProxy {
private:
// Message handlers.
- void OnMsgReadImageData(PP_Resource device_context_2d,
- PP_Resource image,
+ void OnMsgReadImageData(const HostResource& device_context_2d,
+ const HostResource& image,
const PP_Point& top_left,
PP_Bool* result);
void OnMsgRunMessageLoop(bool* dummy);
diff --git a/ppapi/proxy/ppb_url_loader_proxy.cc b/ppapi/proxy/ppb_url_loader_proxy.cc
index 24e327e..e2786b6 100644
--- a/ppapi/proxy/ppb_url_loader_proxy.cc
+++ b/ppapi/proxy/ppb_url_loader_proxy.cc
@@ -16,6 +16,7 @@
#include "ppapi/proxy/host_dispatcher.h"
#include "ppapi/proxy/plugin_dispatcher.h"
#include "ppapi/proxy/plugin_resource.h"
+#include "ppapi/proxy/plugin_resource_tracker.h"
#include "ppapi/proxy/ppapi_messages.h"
#include "ppapi/proxy/ppb_url_response_info_proxy.h"
@@ -28,12 +29,14 @@ namespace proxy {
class URLLoader : public PluginResource {
public:
- URLLoader(PP_Instance instance);
+ URLLoader(const HostResource& resource);
virtual ~URLLoader();
// Resource overrides.
virtual URLLoader* AsURLLoader() { return this; }
+ PP_Resource GetResponseInfo();
+
// Initialized to -1. Will be set to nonnegative values by the UpdateProgress
// message when the values are known.
int64_t bytes_sent_;
@@ -46,32 +49,63 @@ class URLLoader : public PluginResource {
PP_CompletionCallback current_read_callback_;
char* current_read_buffer_;
+ // Cached copy of the response info. When nonzero, we're holding a reference
+ // to this resource.
+ PP_Resource response_info_;
+
private:
DISALLOW_COPY_AND_ASSIGN(URLLoader);
};
-URLLoader::URLLoader(PP_Instance instance)
- : PluginResource(instance),
+URLLoader::URLLoader(const HostResource& resource)
+ : PluginResource(resource),
bytes_sent_(-1),
total_bytes_to_be_sent_(-1),
bytes_received_(-1),
total_bytes_to_be_received_(-1),
current_read_callback_(PP_MakeCompletionCallback(NULL, NULL)),
- current_read_buffer_(NULL) {
+ current_read_buffer_(NULL),
+ response_info_(0) {
}
URLLoader::~URLLoader() {
+ if (response_info_)
+ PluginResourceTracker::GetInstance()->ReleaseResource(response_info_);
+}
+
+PP_Resource URLLoader::GetResponseInfo() {
+ if (!response_info_) {
+ PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(instance());
+ if (!dispatcher)
+ return 0;
+
+ HostResource response_id;
+ dispatcher->Send(new PpapiHostMsg_PPBURLLoader_GetResponseInfo(
+ INTERFACE_ID_PPB_URL_LOADER, host_resource(), &response_id));
+ if (response_id.is_null())
+ return 0;
+
+ response_info_ = PPB_URLResponseInfo_Proxy::CreateResponseForResource(
+ response_id);
+ }
+
+ // The caller expects to get a ref, and we want to keep holding ours.
+ PluginResourceTracker::GetInstance()->AddRefResource(response_info_);
+ return response_info_;
}
namespace {
-// Converts the given loader ID to the dispatcher associated with it, or NULL
-// if it couldn't be found.
-PluginDispatcher* DispatcherFromURLLoader(PP_Resource loader_id) {
- URLLoader* object = PluginResource::GetAs<URLLoader>(loader_id);
- if (!object)
- return NULL;
- return PluginDispatcher::GetForInstance(object->instance());
+// Converts the given loader ID to the dispatcher associated with it and the
+// loader object. Returns true if the object was found.
+bool RoutingDataFromURLLoader(PP_Resource loader_id,
+ URLLoader** loader_object,
+ PluginDispatcher** dispatcher) {
+ *loader_object = PluginResource::GetAs<URLLoader>(loader_id);
+ if (!*loader_object)
+ return false;
+ *dispatcher = PluginDispatcher::GetForInstance((*loader_object)->instance());
+ return !!*dispatcher;
}
// Plugin PPB_URLLoader implmentation ------------------------------------------
@@ -81,12 +115,12 @@ PP_Resource Create(PP_Instance instance_id) {
if (!dispatcher)
return 0;
- PP_Resource result = 0;
+ HostResource result;
dispatcher->Send(new PpapiHostMsg_PPBURLLoader_Create(
INTERFACE_ID_PPB_URL_LOADER, instance_id, &result));
- if (result)
- PPB_URLLoader_Proxy::TrackPluginResource(instance_id, result);
- return result;
+ if (result.is_null())
+ return 0;
+ return PPB_URLLoader_Proxy::TrackPluginResource(result);
}
PP_Bool IsURLLoader(PP_Resource resource) {
@@ -97,24 +131,31 @@ PP_Bool IsURLLoader(PP_Resource resource) {
int32_t Open(PP_Resource loader_id,
PP_Resource request_id,
PP_CompletionCallback callback) {
- PluginDispatcher* dispatcher = DispatcherFromURLLoader(loader_id);
- if (!dispatcher)
+ URLLoader* loader_object;
+ PluginDispatcher* dispatcher;
+ if (!RoutingDataFromURLLoader(loader_id, &loader_object, &dispatcher))
+ return PP_ERROR_BADRESOURCE;
+ PluginResource* request_object =
+ PluginResourceTracker::GetInstance()->GetResourceObject(request_id);
+ if (!request_object)
return PP_ERROR_BADRESOURCE;
dispatcher->Send(new PpapiHostMsg_PPBURLLoader_Open(
- INTERFACE_ID_PPB_URL_LOADER, loader_id, request_id,
+ INTERFACE_ID_PPB_URL_LOADER, loader_object->host_resource(),
+ request_object->host_resource(),
dispatcher->callback_tracker().SendCallback(callback)));
return PP_ERROR_WOULDBLOCK;
}
int32_t FollowRedirect(PP_Resource loader_id,
PP_CompletionCallback callback) {
- PluginDispatcher* dispatcher = DispatcherFromURLLoader(loader_id);
- if (!dispatcher)
+ URLLoader* loader_object;
+ PluginDispatcher* dispatcher;
+ if (!RoutingDataFromURLLoader(loader_id, &loader_object, &dispatcher))
return PP_ERROR_BADRESOURCE;
dispatcher->Send(new PpapiHostMsg_PPBURLLoader_FollowRedirect(
- INTERFACE_ID_PPB_URL_LOADER, loader_id,
+ INTERFACE_ID_PPB_URL_LOADER, loader_object->host_resource(),
dispatcher->callback_tracker().SendCallback(callback)));
return PP_ERROR_WOULDBLOCK;
}
@@ -151,46 +192,21 @@ PP_Resource GetResponseInfo(PP_Resource loader_id) {
URLLoader* object = PluginResource::GetAs<URLLoader>(loader_id);
if (!object)
return 0;
-
- // If we find that plugins are frequently requesting the response info, we
- // can improve performance by caching the PP_Resource in the URLLoader
- // object. This way we only have to do IPC for the first request. However,
- // it seems that most plugins will only call this once so there's no use
- // optimizing this case.
-
- PP_Resource result;
- PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(
- object->instance());
- if (!dispatcher)
- return PP_ERROR_BADRESOURCE;
-
- dispatcher->Send(new PpapiHostMsg_PPBURLLoader_GetResponseInfo(
- INTERFACE_ID_PPB_URL_LOADER, loader_id, &result));
- if (PluginResourceTracker::GetInstance()->
- PreparePreviouslyTrackedResource(result))
- return result;
-
- // Tell the response info to create a tracking object and add it to the
- // resource tracker.
- PPB_URLResponseInfo_Proxy::TrackPluginResource(object->instance(), result);
- return result;
+ return object->GetResponseInfo();
}
int32_t ReadResponseBody(PP_Resource loader_id,
char* buffer,
int32_t bytes_to_read,
PP_CompletionCallback callback) {
- URLLoader* object = PluginResource::GetAs<URLLoader>(loader_id);
- if (!object)
- return PP_ERROR_BADRESOURCE;
- PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(
- object->instance());
- if (!dispatcher)
+ URLLoader* loader_object;
+ PluginDispatcher* dispatcher;
+ if (!RoutingDataFromURLLoader(loader_id, &loader_object, &dispatcher))
return PP_ERROR_BADRESOURCE;
if (!buffer)
return PP_ERROR_BADARGUMENT; // Must specify an output buffer.
- if (object->current_read_callback_.func)
+ if (loader_object->current_read_callback_.func)
return PP_ERROR_INPROGRESS; // Can only have one request pending.
// Currently we don't support sync calls to read. We'll need to revisit
@@ -198,33 +214,36 @@ int32_t ReadResponseBody(PP_Resource loader_id,
if (!callback.func)
return PP_ERROR_BADARGUMENT;
- object->current_read_callback_ = callback;
- object->current_read_buffer_ = buffer;
+ loader_object->current_read_callback_ = callback;
+ loader_object->current_read_buffer_ = buffer;
dispatcher->Send(new PpapiHostMsg_PPBURLLoader_ReadResponseBody(
- INTERFACE_ID_PPB_URL_LOADER, loader_id, bytes_to_read));
+ INTERFACE_ID_PPB_URL_LOADER,
+ loader_object->host_resource(), bytes_to_read));
return PP_ERROR_WOULDBLOCK;
}
int32_t FinishStreamingToFile(PP_Resource loader_id,
PP_CompletionCallback callback) {
- PluginDispatcher* dispatcher = DispatcherFromURLLoader(loader_id);
- if (!dispatcher)
+ URLLoader* loader_object;
+ PluginDispatcher* dispatcher;
+ if (!RoutingDataFromURLLoader(loader_id, &loader_object, &dispatcher))
return PP_ERROR_BADRESOURCE;
dispatcher->Send(new PpapiHostMsg_PPBURLLoader_FinishStreamingToFile(
- INTERFACE_ID_PPB_URL_LOADER, loader_id,
+ INTERFACE_ID_PPB_URL_LOADER, loader_object->host_resource(),
dispatcher->callback_tracker().SendCallback(callback)));
return PP_ERROR_WOULDBLOCK;
}
void Close(PP_Resource loader_id) {
- PluginDispatcher* dispatcher = DispatcherFromURLLoader(loader_id);
- if (!dispatcher)
+ URLLoader* loader_object;
+ PluginDispatcher* dispatcher;
+ if (!RoutingDataFromURLLoader(loader_id, &loader_object, &dispatcher))
return;
dispatcher->Send(new PpapiHostMsg_PPBURLLoader_Close(
- INTERFACE_ID_PPB_URL_LOADER, loader_id));
+ INTERFACE_ID_PPB_URL_LOADER, loader_object->host_resource()));
}
const PPB_URLLoader ppb_urlloader = {
@@ -242,10 +261,15 @@ const PPB_URLLoader ppb_urlloader = {
// Plugin URLLoaderTrusted implementation --------------------------------------
-void GrantUniversalAccess(PP_Resource loader) {
- PluginDispatcher::Get()->Send(
+void GrantUniversalAccess(PP_Resource loader_id) {
+ URLLoader* loader_object;
+ PluginDispatcher* dispatcher;
+ if (!RoutingDataFromURLLoader(loader_id, &loader_object, &dispatcher))
+ return;
+
+ dispatcher->Send(
new PpapiHostMsg_PPBURLLoaderTrusted_GrantUniversalAccess(
- INTERFACE_ID_PPB_URL_LOADER_TRUSTED, loader));
+ INTERFACE_ID_PPB_URL_LOADER_TRUSTED, loader_object->host_resource()));
}
const PPB_URLLoaderTrusted ppb_urlloader_trusted = {
@@ -258,7 +282,7 @@ const PPB_URLLoaderTrusted ppb_urlloader_trusted = {
// PPB_URLLoader_Proxy ---------------------------------------------------------
struct PPB_URLLoader_Proxy::ReadCallbackInfo {
- PP_Resource pp_resource;
+ HostResource resource;
std::string read_buffer;
};
@@ -272,11 +296,10 @@ PPB_URLLoader_Proxy::~PPB_URLLoader_Proxy() {
}
// static
-void PPB_URLLoader_Proxy::TrackPluginResource(PP_Instance instance,
- PP_Resource url_loader_resource) {
- linked_ptr<URLLoader> object(new URLLoader(instance));
- PluginResourceTracker::GetInstance()->AddResource(url_loader_resource,
- object);
+PP_Resource PPB_URLLoader_Proxy::TrackPluginResource(
+ const HostResource& url_loader_resource) {
+ linked_ptr<URLLoader> object(new URLLoader(url_loader_resource));
+ return PluginResourceTracker::GetInstance()->AddResource(object);
}
const void* PPB_URLLoader_Proxy::GetSourceInterface() const {
@@ -316,37 +339,38 @@ bool PPB_URLLoader_Proxy::OnMessageReceived(const IPC::Message& msg) {
}
void PPB_URLLoader_Proxy::OnMsgCreate(PP_Instance instance,
- PP_Resource* result) {
- *result = ppb_url_loader_target()->Create(instance);
+ HostResource* result) {
+ result->SetHostResource(instance, ppb_url_loader_target()->Create(instance));
}
-void PPB_URLLoader_Proxy::OnMsgOpen(PP_Resource loader,
- PP_Resource request_info,
+void PPB_URLLoader_Proxy::OnMsgOpen(const HostResource& loader,
+ const HostResource& request_info,
uint32_t serialized_callback) {
PP_CompletionCallback callback = ReceiveCallback(serialized_callback);
int32_t result = ppb_url_loader_target()->Open(
- loader, request_info, callback);
+ loader.host_resource(), request_info.host_resource(), callback);
if (result != PP_ERROR_WOULDBLOCK)
PP_RunCompletionCallback(&callback, result);
}
void PPB_URLLoader_Proxy::OnMsgFollowRedirect(
- PP_Resource loader,
+ const HostResource& loader,
uint32_t serialized_callback) {
PP_CompletionCallback callback = ReceiveCallback(serialized_callback);
int32_t result = ppb_url_loader_target()->FollowRedirect(
- loader, callback);
+ loader.host_resource(), callback);
if (result != PP_ERROR_WOULDBLOCK)
PP_RunCompletionCallback(&callback, result);
}
-void PPB_URLLoader_Proxy::OnMsgGetResponseInfo(PP_Resource loader,
- PP_Resource* result) {
- *result = ppb_url_loader_target()->GetResponseInfo(loader);
+void PPB_URLLoader_Proxy::OnMsgGetResponseInfo(const HostResource& loader,
+ HostResource* result) {
+ result->SetHostResource(loader.instance(),
+ ppb_url_loader_target()->GetResponseInfo(loader.host_resource()));
}
void PPB_URLLoader_Proxy::OnMsgReadResponseBody(
- PP_Resource loader,
+ const HostResource& loader,
int32_t bytes_to_read) {
// The plugin could be sending us malicious messages, don't accept negative
// sizes.
@@ -361,15 +385,16 @@ void PPB_URLLoader_Proxy::OnMsgReadResponseBody(
// destroyed. Depending on the cleanup ordering, we may not need the weak
// pointer here.)
ReadCallbackInfo* info = new ReadCallbackInfo;
- info->pp_resource = loader;
+ info->resource = loader;
+ // TODO(brettw) have a way to check for out-of-memory.
info->read_buffer.resize(bytes_to_read);
CompletionCallback callback = callback_factory_.NewCallback(
&PPB_URLLoader_Proxy::OnReadCallback, info);
int32_t result = ppb_url_loader_target()->ReadResponseBody(
- loader, const_cast<char*>(info->read_buffer.c_str()), bytes_to_read,
- callback.pp_completion_callback());
+ loader.host_resource(), const_cast<char*>(info->read_buffer.c_str()),
+ bytes_to_read, callback.pp_completion_callback());
if (result != PP_ERROR_WOULDBLOCK) {
// Send error (or perhaps success for synchronous reads) back to plugin.
// The callback function is already set up to do this and also delete the
@@ -379,45 +404,50 @@ void PPB_URLLoader_Proxy::OnMsgReadResponseBody(
}
void PPB_URLLoader_Proxy::OnMsgFinishStreamingToFile(
- PP_Resource loader,
+ const HostResource& loader,
uint32_t serialized_callback) {
PP_CompletionCallback callback = ReceiveCallback(serialized_callback);
int32_t result = ppb_url_loader_target()->FinishStreamingToFile(
- loader, callback);
+ loader.host_resource(), callback);
if (result != PP_ERROR_WOULDBLOCK)
PP_RunCompletionCallback(&callback, result);
}
-void PPB_URLLoader_Proxy::OnMsgClose(PP_Resource loader) {
- ppb_url_loader_target()->Close(loader);
+void PPB_URLLoader_Proxy::OnMsgClose(const HostResource& loader) {
+ ppb_url_loader_target()->Close(loader.host_resource());
}
+// Called in the Plugin.
void PPB_URLLoader_Proxy::OnMsgUpdateProgress(
- PP_Resource resource,
- int64_t bytes_sent,
- int64_t total_bytes_to_be_sent,
- int64_t bytes_received,
- int64_t total_bytes_to_be_received) {
- URLLoader* object = PluginResource::GetAs<URLLoader>(resource);
- if (!object) {
- NOTREACHED();
+ const PPBURLLoader_UpdateProgress_Params& params) {
+ PP_Resource plugin_resource =
+ PluginResourceTracker::GetInstance()->PluginResourceForHostResource(
+ params.resource);
+ if (!plugin_resource)
+ return;
+ URLLoader* object = PluginResource::GetAs<URLLoader>(plugin_resource);
+ if (!object)
return;
- }
-
- object->bytes_sent_ = bytes_sent;
- object->total_bytes_to_be_sent_ = total_bytes_to_be_sent;
- object->bytes_received_ = bytes_received;
- object->total_bytes_to_be_received_ = total_bytes_to_be_received;
-}
-void PPB_URLLoader_Proxy::OnMsgReadResponseBodyAck(PP_Resource pp_resource,
- int32 result,
- const std::string& data) {
- URLLoader* object = PluginResource::GetAs<URLLoader>(pp_resource);
- if (!object) {
- NOTREACHED();
+ object->bytes_sent_ = params.bytes_sent;
+ object->total_bytes_to_be_sent_ = params.total_bytes_to_be_sent;
+ object->bytes_received_ = params.bytes_received;
+ object->total_bytes_to_be_received_ = params.total_bytes_to_be_received;
+}
+
+// Called in the Plugin.
+void PPB_URLLoader_Proxy::OnMsgReadResponseBodyAck(
+ const HostResource& host_resource,
+ int32 result,
+ const std::string& data) {
+ PP_Resource plugin_resource =
+ PluginResourceTracker::GetInstance()->PluginResourceForHostResource(
+ host_resource);
+ if (!plugin_resource)
+ return;
+ URLLoader* object = PluginResource::GetAs<URLLoader>(plugin_resource);
+ if (!object)
return;
- }
if (!object->current_read_callback_.func || !object->current_read_buffer_) {
NOTREACHED();
@@ -444,8 +474,7 @@ void PPB_URLLoader_Proxy::OnReadCallback(int32_t result,
info->read_buffer.resize(bytes_read);
dispatcher()->Send(new PpapiMsg_PPBURLLoader_ReadResponseBody_Ack(
- INTERFACE_ID_PPB_URL_LOADER, info->pp_resource,
- result, info->read_buffer));
+ INTERFACE_ID_PPB_URL_LOADER, info->resource, result, info->read_buffer));
delete info;
}
@@ -480,8 +509,9 @@ bool PPB_URLLoaderTrusted_Proxy::OnMessageReceived(const IPC::Message& msg) {
return handled;
}
-void PPB_URLLoaderTrusted_Proxy::OnMsgGrantUniversalAccess(PP_Resource loader) {
- ppb_url_loader_trusted_target()->GrantUniversalAccess(loader);
+void PPB_URLLoaderTrusted_Proxy::OnMsgGrantUniversalAccess(
+ const HostResource& loader) {
+ ppb_url_loader_trusted_target()->GrantUniversalAccess(loader.host_resource());
}
} // namespace proxy
diff --git a/ppapi/proxy/ppb_url_loader_proxy.h b/ppapi/proxy/ppb_url_loader_proxy.h
index c05926a..49f49ea 100644
--- a/ppapi/proxy/ppb_url_loader_proxy.h
+++ b/ppapi/proxy/ppb_url_loader_proxy.h
@@ -12,6 +12,7 @@
#include "ppapi/c/pp_size.h"
#include "ppapi/c/pp_var.h"
#include "ppapi/cpp/completion_callback.h"
+#include "ppapi/proxy/host_resource.h"
#include "ppapi/proxy/interface_proxy.h"
#include "ppapi/proxy/proxy_non_thread_safe_ref_count.h"
@@ -21,6 +22,8 @@ struct PPB_URLLoaderTrusted;
namespace pp {
namespace proxy {
+struct PPBURLLoader_UpdateProgress_Params;
+
class PPB_URLLoader_Proxy : public InterfaceProxy {
public:
PPB_URLLoader_Proxy(Dispatcher* dispatcher, const void* target_interface);
@@ -30,8 +33,8 @@ class PPB_URLLoader_Proxy : public InterfaceProxy {
// they are also provided to PPP_Instance.OnMsgHandleDocumentLoad. This
// function allows the proxy for DocumentLoad to create the correct plugin
// proxied info for the given browser-supplied URLLoader resource ID.
- static void TrackPluginResource(PP_Instance instance,
- PP_Resource url_loader_resource);
+ static PP_Resource TrackPluginResource(
+ const HostResource& url_loader_resource);
const PPB_URLLoader* ppb_url_loader_target() const {
return reinterpret_cast<const PPB_URLLoader*>(target_interface());
@@ -48,27 +51,24 @@ class PPB_URLLoader_Proxy : public InterfaceProxy {
// Plugin->renderer message handlers.
void OnMsgCreate(PP_Instance instance,
- PP_Resource* result);
- void OnMsgOpen(PP_Resource loader,
- PP_Resource request_info,
+ HostResource* result);
+ void OnMsgOpen(const HostResource& loader,
+ const HostResource& request_info,
uint32_t serialized_callback);
- void OnMsgFollowRedirect(PP_Resource loader,
+ void OnMsgFollowRedirect(const HostResource& loader,
uint32_t serialized_callback);
- void OnMsgGetResponseInfo(PP_Resource loader,
- PP_Resource* result);
- void OnMsgReadResponseBody(PP_Resource loader,
+ void OnMsgGetResponseInfo(const HostResource& loader,
+ HostResource* result);
+ void OnMsgReadResponseBody(const HostResource& loader,
int32_t bytes_to_read);
- void OnMsgFinishStreamingToFile(PP_Resource loader,
+ void OnMsgFinishStreamingToFile(const HostResource& loader,
uint32_t serialized_callback);
- void OnMsgClose(PP_Resource loader);
+ void OnMsgClose(const HostResource& loader);
// Renderer->plugin message handlers.
- void OnMsgUpdateProgress(PP_Resource resource,
- int64_t bytes_sent,
- int64_t total_bytes_to_be_sent,
- int64_t bytes_received,
- int64_t total_bytes_to_be_received);
- void OnMsgReadResponseBodyAck(PP_Resource pp_resource,
+ void OnMsgUpdateProgress(
+ const PPBURLLoader_UpdateProgress_Params& params);
+ void OnMsgReadResponseBodyAck(const HostResource& pp_resource,
int32_t result,
const std::string& data);
@@ -97,7 +97,7 @@ class PPB_URLLoaderTrusted_Proxy : public InterfaceProxy {
private:
// Plugin->renderer message handlers.
- void OnMsgGrantUniversalAccess(PP_Resource loader);
+ void OnMsgGrantUniversalAccess(const HostResource& loader);
};
} // namespace proxy
diff --git a/ppapi/proxy/ppb_url_request_info_proxy.cc b/ppapi/proxy/ppb_url_request_info_proxy.cc
index 9c98cfe..ecd7c3d 100644
--- a/ppapi/proxy/ppb_url_request_info_proxy.cc
+++ b/ppapi/proxy/ppb_url_request_info_proxy.cc
@@ -14,8 +14,10 @@ namespace proxy {
class URLRequestInfo : public PluginResource {
public:
- URLRequestInfo(PP_Instance instance) : PluginResource(instance) {}
- virtual ~URLRequestInfo() {}
+ URLRequestInfo(const HostResource& resource) : PluginResource(resource) {
+ }
+ virtual ~URLRequestInfo() {
+ }
// Resource overrides.
virtual URLRequestInfo* AsURLRequestInfo() { return this; }
@@ -26,13 +28,16 @@ class URLRequestInfo : public PluginResource {
namespace {
-// Returns the dispatcher associated with the given URLRequestInfo, or NULL if
-// none exists.
-PluginDispatcher* DispatcherFromURLRequestInfo(PP_Resource resource) {
- URLRequestInfo* object = PluginResource::GetAs<URLRequestInfo>(resource);
- if (!object)
- return NULL;
- return PluginDispatcher::GetForInstance(object->instance());
+// Computes the dispatcher and request object for the given plugin resource,
+// returning true on success.
+bool DispatcherFromURLRequestInfo(PP_Resource resource,
+ PluginDispatcher** dispatcher,
+ URLRequestInfo** request_info) {
+ *request_info = PluginResource::GetAs<URLRequestInfo>(resource);
+ if (!*request_info)
+ return false;
+ *dispatcher = PluginDispatcher::GetForInstance((*request_info)->instance());
+ return !!*dispatcher;
}
PP_Resource Create(PP_Instance instance) {
@@ -40,14 +45,14 @@ PP_Resource Create(PP_Instance instance) {
if (!dispatcher)
return 0;
- PP_Resource result;
+ HostResource result;
dispatcher->Send(new PpapiHostMsg_PPBURLRequestInfo_Create(
INTERFACE_ID_PPB_URL_REQUEST_INFO, instance, &result));
- if (result) {
- linked_ptr<URLRequestInfo> object(new URLRequestInfo(instance));
- PluginResourceTracker::GetInstance()->AddResource(result, object);
- }
- return result;
+ if (result.is_null())
+ return 0;
+
+ linked_ptr<URLRequestInfo> object(new URLRequestInfo(result));
+ return PluginResourceTracker::GetInstance()->AddResource(object);
}
PP_Bool IsURLRequestInfo(PP_Resource resource) {
@@ -58,12 +63,13 @@ PP_Bool IsURLRequestInfo(PP_Resource resource) {
PP_Bool SetProperty(PP_Resource request_id,
PP_URLRequestProperty property,
PP_Var var) {
- PluginDispatcher* dispatcher = DispatcherFromURLRequestInfo(request_id);
- if (!dispatcher)
+ PluginDispatcher* dispatcher;
+ URLRequestInfo* request_info;
+ if (!DispatcherFromURLRequestInfo(request_id, &dispatcher, &request_info))
return PP_FALSE;
dispatcher->Send(new PpapiHostMsg_PPBURLRequestInfo_SetProperty(
- INTERFACE_ID_PPB_URL_REQUEST_INFO, request_id,
+ INTERFACE_ID_PPB_URL_REQUEST_INFO, request_info->host_resource(),
static_cast<int32_t>(property),
SerializedVarSendInput(dispatcher, var)));
@@ -74,12 +80,14 @@ PP_Bool SetProperty(PP_Resource request_id,
PP_Bool AppendDataToBody(PP_Resource request_id,
const char* data, uint32_t len) {
- PluginDispatcher* dispatcher = DispatcherFromURLRequestInfo(request_id);
- if (!dispatcher)
+ PluginDispatcher* dispatcher;
+ URLRequestInfo* request_info;
+ if (!DispatcherFromURLRequestInfo(request_id, &dispatcher, &request_info))
return PP_FALSE;
dispatcher->Send(new PpapiHostMsg_PPBURLRequestInfo_AppendDataToBody(
- INTERFACE_ID_PPB_URL_REQUEST_INFO, request_id, std::string(data, len)));
+ INTERFACE_ID_PPB_URL_REQUEST_INFO, request_info->host_resource(),
+ std::string(data, len)));
// TODO(brettw) do some validation. We should be able to tell on the plugin
// side whether the request will succeed or fail in the renderer.
@@ -91,12 +99,18 @@ PP_Bool AppendFileToBody(PP_Resource request_id,
int64_t start_offset,
int64_t number_of_bytes,
PP_Time expected_last_modified_time) {
- PluginDispatcher* dispatcher = DispatcherFromURLRequestInfo(request_id);
- if (!dispatcher)
+ PluginDispatcher* dispatcher;
+ URLRequestInfo* request_info;
+ if (!DispatcherFromURLRequestInfo(request_id, &dispatcher, &request_info))
+ return PP_FALSE;
+ PluginResource* file_ref_object =
+ PluginResourceTracker::GetInstance()->GetResourceObject(file_ref_id);
+ if (!file_ref_object)
return PP_FALSE;
dispatcher->Send(new PpapiHostMsg_PPBURLRequestInfo_AppendFileToBody(
- INTERFACE_ID_PPB_URL_REQUEST_INFO, request_id, file_ref_id,
+ INTERFACE_ID_PPB_URL_REQUEST_INFO, request_info->host_resource(),
+ file_ref_object->host_resource(),
start_offset, number_of_bytes, expected_last_modified_time));
// TODO(brettw) do some validation. We should be able to tell on the plugin
@@ -149,35 +163,36 @@ bool PPB_URLRequestInfo_Proxy::OnMessageReceived(const IPC::Message& msg) {
void PPB_URLRequestInfo_Proxy::OnMsgCreate(
PP_Instance instance,
- PP_Resource* result) {
- *result = ppb_url_request_info_target()->Create(instance);
+ HostResource* result) {
+ result->SetHostResource(instance,
+ ppb_url_request_info_target()->Create(instance));
}
void PPB_URLRequestInfo_Proxy::OnMsgSetProperty(
- PP_Resource request,
+ HostResource request,
int32_t property,
SerializedVarReceiveInput value) {
- ppb_url_request_info_target()->SetProperty(request,
+ ppb_url_request_info_target()->SetProperty(request.host_resource(),
static_cast<PP_URLRequestProperty>(property),
value.Get(dispatcher()));
}
void PPB_URLRequestInfo_Proxy::OnMsgAppendDataToBody(
- PP_Resource request,
+ HostResource request,
const std::string& data) {
- ppb_url_request_info_target()->AppendDataToBody(request, data.c_str(),
- data.size());
+ ppb_url_request_info_target()->AppendDataToBody(request.host_resource(),
+ data.c_str(), data.size());
}
void PPB_URLRequestInfo_Proxy::OnMsgAppendFileToBody(
- PP_Resource request,
- PP_Resource file_ref,
+ HostResource request,
+ HostResource file_ref,
int64_t start_offset,
int64_t number_of_bytes,
double expected_last_modified_time) {
ppb_url_request_info_target()->AppendFileToBody(
- request, file_ref, start_offset, number_of_bytes,
- expected_last_modified_time);
+ request.host_resource(), file_ref.host_resource(),
+ start_offset, number_of_bytes, expected_last_modified_time);
}
} // namespace proxy
diff --git a/ppapi/proxy/ppb_url_request_info_proxy.h b/ppapi/proxy/ppb_url_request_info_proxy.h
index e317615..bfd4dba 100644
--- a/ppapi/proxy/ppb_url_request_info_proxy.h
+++ b/ppapi/proxy/ppb_url_request_info_proxy.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -8,6 +8,7 @@
#include "base/basictypes.h"
#include "ppapi/c/pp_instance.h"
#include "ppapi/c/pp_resource.h"
+#include "ppapi/proxy/host_resource.h"
#include "ppapi/proxy/interface_proxy.h"
struct PPB_URLRequestInfo;
@@ -34,14 +35,14 @@ class PPB_URLRequestInfo_Proxy : public InterfaceProxy {
private:
// Message handlers.
- void OnMsgCreate(PP_Instance instance, PP_Resource* result);
- void OnMsgSetProperty(PP_Resource request,
+ void OnMsgCreate(PP_Instance instance, HostResource* result);
+ void OnMsgSetProperty(HostResource request,
int32_t property,
SerializedVarReceiveInput value);
- void OnMsgAppendDataToBody(PP_Resource request,
+ void OnMsgAppendDataToBody(HostResource request,
const std::string& data);
- void OnMsgAppendFileToBody(PP_Resource request,
- PP_Resource file_ref,
+ void OnMsgAppendFileToBody(HostResource request,
+ HostResource file_ref,
int64_t start_offset,
int64_t number_of_bytes,
double expected_last_modified_time);
diff --git a/ppapi/proxy/ppb_url_response_info_proxy.cc b/ppapi/proxy/ppb_url_response_info_proxy.cc
index d9ddc20..9de374d 100644
--- a/ppapi/proxy/ppb_url_response_info_proxy.cc
+++ b/ppapi/proxy/ppb_url_response_info_proxy.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -15,7 +15,9 @@ namespace proxy {
class URLResponseInfo : public PluginResource {
public:
- URLResponseInfo(PP_Instance instance) : PluginResource(instance) {}
+ URLResponseInfo(const HostResource& resource)
+ : PluginResource(resource) {
+ }
virtual ~URLResponseInfo() {}
// Resource overrides.
@@ -43,19 +45,19 @@ PP_Var GetProperty(PP_Resource response, PP_URLResponseProperty property) {
ReceiveSerializedVarReturnValue result;
dispatcher->Send(new PpapiHostMsg_PPBURLResponseInfo_GetProperty(
- INTERFACE_ID_PPB_URL_RESPONSE_INFO, response, property, &result));
+ INTERFACE_ID_PPB_URL_RESPONSE_INFO, object->host_resource(), property,
+ &result));
return result.Return(dispatcher);
}
PP_Resource GetBodyAsFileRef(PP_Resource response) {
- PP_Resource result = 0;
/*
dispatcher->Send(new PpapiHostMsg_PPBURLResponseInfo_GetBodyAsFileRef(
INTERFACE_ID_PPB_URL_RESPONSE_INFO, response, &result));
// TODO(brettw) when we have FileRef proxied, make an object from that
// ref so we can track it properly and then uncomment this.
*/
- return result;
+ return 0;
}
const PPB_URLResponseInfo ppb_urlresponseinfo = {
@@ -76,12 +78,10 @@ PPB_URLResponseInfo_Proxy::~PPB_URLResponseInfo_Proxy() {
}
// static
-void PPB_URLResponseInfo_Proxy::TrackPluginResource(
- PP_Instance instance,
- PP_Resource response_resource) {
- linked_ptr<URLResponseInfo> object(new URLResponseInfo(instance));
- PluginResourceTracker::GetInstance()->AddResource(
- response_resource, object);
+PP_Resource PPB_URLResponseInfo_Proxy::CreateResponseForResource(
+ const HostResource& resource) {
+ linked_ptr<URLResponseInfo> object(new URLResponseInfo(resource));
+ return PluginResourceTracker::GetInstance()->AddResource(object);
}
const void* PPB_URLResponseInfo_Proxy::GetSourceInterface() const {
@@ -106,17 +106,20 @@ bool PPB_URLResponseInfo_Proxy::OnMessageReceived(const IPC::Message& msg) {
}
void PPB_URLResponseInfo_Proxy::OnMsgGetProperty(
- PP_Resource response,
+ HostResource response,
int32_t property,
SerializedVarReturnValue result) {
result.Return(dispatcher(), ppb_url_response_info_target()->GetProperty(
- response, static_cast<PP_URLResponseProperty>(property)));
+ response.host_resource(), static_cast<PP_URLResponseProperty>(property)));
}
void PPB_URLResponseInfo_Proxy::OnMsgGetBodyAsFileRef(
- PP_Resource response,
- PP_Resource* file_ref_result) {
- *file_ref_result = ppb_url_response_info_target()->GetBodyAsFileRef(response);
+ HostResource response,
+ HostResource* file_ref_result) {
+ file_ref_result->SetHostResource(
+ response.instance(),
+ ppb_url_response_info_target()->GetBodyAsFileRef(
+ response.host_resource()));
}
} // namespace proxy
diff --git a/ppapi/proxy/ppb_url_response_info_proxy.h b/ppapi/proxy/ppb_url_response_info_proxy.h
index 079f3b7..0e1307f 100644
--- a/ppapi/proxy/ppb_url_response_info_proxy.h
+++ b/ppapi/proxy/ppb_url_response_info_proxy.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -9,6 +9,7 @@
#include "ppapi/c/pp_instance.h"
#include "ppapi/c/pp_module.h"
#include "ppapi/c/pp_resource.h"
+#include "ppapi/proxy/host_resource.h"
#include "ppapi/proxy/interface_proxy.h"
struct PPB_URLResponseInfo;
@@ -24,11 +25,12 @@ class PPB_URLResponseInfo_Proxy : public InterfaceProxy {
const void* target_interface);
virtual ~PPB_URLResponseInfo_Proxy();
- // URLResponseInfo objects are actually returned by the URLLoader class.
- // This function allows the URLLoader proxy to start the tracking of
- // a response info object in the plugin.
- static void TrackPluginResource(PP_Instance instance,
- PP_Resource response_resource);
+ // URLResponseInfo objects are actually created and returned by the
+ // URLLoader. This function allows the URLLoader to convert a new
+ // HostResource representing a response info to a properly tracked
+ // URLReponseInfo PluginResource. Returns the plugin resource ID for the
+ // new resource.
+ static PP_Resource CreateResponseForResource(const HostResource& resource);
const PPB_URLResponseInfo* ppb_url_response_info_target() const {
return static_cast<const PPB_URLResponseInfo*>(target_interface());
@@ -41,11 +43,11 @@ class PPB_URLResponseInfo_Proxy : public InterfaceProxy {
private:
// Message handlers.
- void OnMsgGetProperty(PP_Resource response,
+ void OnMsgGetProperty(HostResource response,
int32_t property,
SerializedVarReturnValue result);
- void OnMsgGetBodyAsFileRef(PP_Resource response,
- PP_Resource* file_ref_result);
+ void OnMsgGetBodyAsFileRef(HostResource response,
+ HostResource* file_ref_result);
DISALLOW_COPY_AND_ASSIGN(PPB_URLResponseInfo_Proxy);
};
diff --git a/ppapi/proxy/ppp_instance_proxy.cc b/ppapi/proxy/ppp_instance_proxy.cc
index 3614c36..b2103a3 100644
--- a/ppapi/proxy/ppp_instance_proxy.cc
+++ b/ppapi/proxy/ppp_instance_proxy.cc
@@ -66,9 +66,11 @@ PP_Bool HandleInputEvent(PP_Instance instance,
PP_Bool HandleDocumentLoad(PP_Instance instance,
PP_Resource url_loader) {
PP_Bool result = PP_FALSE;
+ HostResource serialized_loader;
+ serialized_loader.SetHostResource(instance, url_loader);
HostDispatcher::GetForInstance(instance)->Send(
new PpapiMsg_PPPInstance_HandleDocumentLoad(INTERFACE_ID_PPP_INSTANCE,
- instance, url_loader,
+ instance, serialized_loader,
&result));
return result;
}
@@ -180,11 +182,12 @@ void PPP_Instance_Proxy::OnMsgHandleInputEvent(PP_Instance instance,
}
void PPP_Instance_Proxy::OnMsgHandleDocumentLoad(PP_Instance instance,
- PP_Resource url_loader,
+ const HostResource& url_loader,
PP_Bool* result) {
- PPB_URLLoader_Proxy::TrackPluginResource(instance, url_loader);
+ PP_Resource plugin_loader =
+ PPB_URLLoader_Proxy::TrackPluginResource(url_loader);
*result = ppp_instance_target()->HandleDocumentLoad(
- instance, url_loader);
+ instance, plugin_loader);
}
void PPP_Instance_Proxy::OnMsgGetInstanceObject(
diff --git a/ppapi/proxy/ppp_instance_proxy.h b/ppapi/proxy/ppp_instance_proxy.h
index 5d02fc8..8d68b79 100644
--- a/ppapi/proxy/ppp_instance_proxy.h
+++ b/ppapi/proxy/ppp_instance_proxy.h
@@ -11,6 +11,7 @@
#include "ppapi/c/pp_instance.h"
#include "ppapi/c/pp_resource.h"
#include "ppapi/c/pp_var.h"
+#include "ppapi/proxy/host_resource.h"
#include "ppapi/proxy/interface_proxy.h"
struct PP_InputEvent;
@@ -51,7 +52,7 @@ class PPP_Instance_Proxy : public InterfaceProxy {
const PP_InputEvent& event,
PP_Bool* result);
void OnMsgHandleDocumentLoad(PP_Instance instance,
- PP_Resource url_loader,
+ const HostResource& url_loader,
PP_Bool* result);
void OnMsgGetInstanceObject(PP_Instance instance,
SerializedVarReturnValue result);
diff --git a/ppapi/proxy/serialized_structs.cc b/ppapi/proxy/serialized_structs.cc
index f744db9..576e31a 100644
--- a/ppapi/proxy/serialized_structs.cc
+++ b/ppapi/proxy/serialized_structs.cc
@@ -64,7 +64,6 @@ void SerializedFontDescription::SetToPPFontDescription(
PPBFlash_DrawGlyphs_Params::PPBFlash_DrawGlyphs_Params()
: instance(0),
- pp_image_data(0),
font_desc(),
color(0) {
}
diff --git a/ppapi/proxy/serialized_structs.h b/ppapi/proxy/serialized_structs.h
index 496fd3a..8b40042 100644
--- a/ppapi/proxy/serialized_structs.h
+++ b/ppapi/proxy/serialized_structs.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -10,11 +10,12 @@
#include "base/shared_memory.h"
#include "build/build_config.h"
+#include "ipc/ipc_platform_file.h"
#include "ppapi/c/pp_bool.h"
#include "ppapi/c/pp_instance.h"
#include "ppapi/c/pp_point.h"
#include "ppapi/c/pp_rect.h"
-#include "ppapi/c/pp_resource.h"
+#include "ppapi/proxy/host_resource.h"
#include "ppapi/proxy/serialized_var.h"
struct PP_FontDescription_Dev;
@@ -74,8 +75,8 @@ struct SerializedDirEntry {
// is a var, it's much more convenient to use the normal way of passing a
// PP_Var.
struct PPBFont_DrawTextAt_Params {
- PP_Resource font;
- PP_Resource image_data;
+ HostResource font;
+ HostResource image_data;
PP_Bool text_is_rtl;
PP_Bool override_direction;
PP_Point position;
@@ -90,7 +91,7 @@ struct PPBFlash_DrawGlyphs_Params {
~PPBFlash_DrawGlyphs_Params();
PP_Instance instance;
- PP_Resource pp_image_data;
+ HostResource image_data;
SerializedFontDescription font_desc;
uint32_t color;
PP_Point position;
@@ -100,6 +101,23 @@ struct PPBFlash_DrawGlyphs_Params {
std::vector<PP_Point> glyph_advances;
};
+struct PPBAudio_NotifyAudioStreamCreated_Params {
+ pp::proxy::HostResource audio_id;
+ int32_t result_code; // Will be != PP_OK on failure
+ IPC::PlatformFileForTransit socket_handle;
+ base::SharedMemoryHandle handle;
+ int32_t length;
+};
+
+struct PPBURLLoader_UpdateProgress_Params {
+ PP_Instance instance;
+ pp::proxy::HostResource resource;
+ int64_t bytes_sent;
+ int64_t total_bytes_to_be_sent;
+ int64_t bytes_received;
+ int64_t total_bytes_to_be_received;
+};
+
#if defined(OS_WIN)
typedef HANDLE ImageHandle;
#elif defined(OS_MACOSX)
diff --git a/ppapi/proxy/serialized_var.cc b/ppapi/proxy/serialized_var.cc
index 5987ceb..a4888a0 100644
--- a/ppapi/proxy/serialized_var.cc
+++ b/ppapi/proxy/serialized_var.cc
@@ -19,7 +19,8 @@ namespace proxy {
SerializedVar::Inner::Inner()
: serialization_rules_(NULL),
var_(PP_MakeUndefined()),
- cleanup_mode_(CLEANUP_NONE) {
+ cleanup_mode_(CLEANUP_NONE),
+ dispatcher_for_end_send_pass_ref_(NULL) {
#ifndef NDEBUG
has_been_serialized_ = false;
has_been_deserialized_ = false;
@@ -29,7 +30,8 @@ SerializedVar::Inner::Inner()
SerializedVar::Inner::Inner(VarSerializationRules* serialization_rules)
: serialization_rules_(serialization_rules),
var_(PP_MakeUndefined()),
- cleanup_mode_(CLEANUP_NONE) {
+ cleanup_mode_(CLEANUP_NONE),
+ dispatcher_for_end_send_pass_ref_(NULL) {
#ifndef NDEBUG
has_been_serialized_ = false;
has_been_deserialized_ = false;
@@ -40,7 +42,8 @@ SerializedVar::Inner::Inner(VarSerializationRules* serialization_rules,
const PP_Var& var)
: serialization_rules_(serialization_rules),
var_(var),
- cleanup_mode_(CLEANUP_NONE) {
+ cleanup_mode_(CLEANUP_NONE),
+ dispatcher_for_end_send_pass_ref_(NULL) {
#ifndef NDEBUG
has_been_serialized_ = false;
has_been_deserialized_ = false;
@@ -50,7 +53,9 @@ SerializedVar::Inner::Inner(VarSerializationRules* serialization_rules,
SerializedVar::Inner::~Inner() {
switch (cleanup_mode_) {
case END_SEND_PASS_REF:
- serialization_rules_->EndSendPassRef(var_);
+ DCHECK(dispatcher_for_end_send_pass_ref_);
+ serialization_rules_->EndSendPassRef(var_,
+ dispatcher_for_end_send_pass_ref_);
break;
case END_RECEIVE_CALLER_OWNED:
serialization_rules_->EndReceiveCallerOwned(var_);
@@ -204,6 +209,18 @@ bool SerializedVar::Inner::ReadFromMessage(const IPC::Message* m, void** iter) {
return success;
}
+void SerializedVar::Inner::SetCleanupModeToEndSendPassRef(
+ Dispatcher* dispatcher) {
+ DCHECK(dispatcher);
+ DCHECK(!dispatcher_for_end_send_pass_ref_);
+ dispatcher_for_end_send_pass_ref_ = dispatcher;
+ cleanup_mode_ = END_SEND_PASS_REF;
+}
+
+void SerializedVar::Inner::SetCleanupModeToEndReceiveCallerOwned() {
+ cleanup_mode_ = END_RECEIVE_CALLER_OWNED;
+}
+
// SerializedVar ---------------------------------------------------------------
SerializedVar::SerializedVar() : inner_(new Inner) {
@@ -339,7 +356,7 @@ PP_Var SerializedVarReceiveInput::Get(Dispatcher* dispatcher) {
// Ensure that when the serialized var goes out of scope it cleans up the
// stuff we're making in BeginReceiveCallerOwned.
- serialized_.inner_->set_cleanup_mode(SerializedVar::END_RECEIVE_CALLER_OWNED);
+ serialized_.inner_->SetCleanupModeToEndReceiveCallerOwned();
serialized_.inner_->SetVar(
serialized_.inner_->serialization_rules()->BeginReceiveCallerOwned(
@@ -396,7 +413,7 @@ void SerializedVarReturnValue::Return(Dispatcher* dispatcher,
dispatcher->serialization_rules());
// Var must clean up after our BeginSendPassRef call.
- serialized_->inner_->set_cleanup_mode(SerializedVar::END_SEND_PASS_REF);
+ serialized_->inner_->SetCleanupModeToEndSendPassRef(dispatcher);
serialized_->inner_->SetVar(
dispatcher->serialization_rules()->BeginSendPassRef(
@@ -408,7 +425,8 @@ void SerializedVarReturnValue::Return(Dispatcher* dispatcher,
SerializedVarOutParam::SerializedVarOutParam(SerializedVar* serialized)
: serialized_(serialized),
- writable_var_(PP_MakeUndefined()) {
+ writable_var_(PP_MakeUndefined()),
+ dispatcher_(NULL) {
}
SerializedVarOutParam::~SerializedVarOutParam() {
@@ -422,11 +440,12 @@ SerializedVarOutParam::~SerializedVarOutParam() {
// Normally the current object will be created on the stack to wrap a
// SerializedVar and won't have a scope around the actual IPC send. So we
// need to tell the SerializedVar to do the begin/end send pass ref calls.
- serialized_->inner_->set_cleanup_mode(SerializedVar::END_SEND_PASS_REF);
+ serialized_->inner_->SetCleanupModeToEndSendPassRef(dispatcher_);
}
}
PP_Var* SerializedVarOutParam::OutParam(Dispatcher* dispatcher) {
+ dispatcher_ = dispatcher;
serialized_->inner_->set_serialization_rules(
dispatcher->serialization_rules());
return &writable_var_;
@@ -468,6 +487,25 @@ PP_Var** SerializedVarVectorOutParam::ArrayOutParam(Dispatcher* dispatcher) {
return &array_;
}
+SerializedVarTestConstructor::SerializedVarTestConstructor(
+ const PP_Var& pod_var) {
+ DCHECK(pod_var.type != PP_VARTYPE_STRING);
+ inner_->SetVar(pod_var);
+}
+
+SerializedVarTestConstructor::SerializedVarTestConstructor(
+ const std::string& str) {
+ PP_Var string_var;
+ string_var.type = PP_VARTYPE_STRING;
+ string_var.value.as_id = 0;
+ inner_->SetVar(string_var);
+ *inner_->GetStringPtr() = str;
+}
+
+SerializedVarTestReader::SerializedVarTestReader(const SerializedVar& var)
+ : SerializedVar(var) {
+}
+
} // namespace proxy
} // namespace pp
diff --git a/ppapi/proxy/serialized_var.h b/ppapi/proxy/serialized_var.h
index cf2d4d4..75ef494 100644
--- a/ppapi/proxy/serialized_var.h
+++ b/ppapi/proxy/serialized_var.h
@@ -39,7 +39,7 @@ class VarSerializationRules;
// different combinations of reference counting for sending and receiving
// objects and for dealing with strings
//
-// This makes SerializedVar complicate and easy to mess up. To make it
+// This makes SerializedVar complicated and easy to mess up. To make it
// reasonable to use all functions are protected and there are a use-specific
// classes that encapsulate exactly one type of use in a way that typically
// won't compile if you do the wrong thing.
@@ -63,17 +63,6 @@ class VarSerializationRules;
// behavior and will enforce that you don't do stupid things.
class SerializedVar {
public:
- enum CleanupMode {
- // The serialized var won't do anything special in the destructor (default).
- CLEANUP_NONE,
-
- // The serialized var will call EndSendPassRef in the destructor.
- END_SEND_PASS_REF,
-
- // The serialized var will call EndReceiveCallerOwned in the destructor.
- END_RECEIVE_CALLER_OWNED
- };
-
SerializedVar();
~SerializedVar();
@@ -90,6 +79,7 @@ class SerializedVar {
friend class SerializedVarReturnValue;
friend class SerializedVarOutParam;
friend class SerializedVarSendInput;
+ friend class SerializedVarTestConstructor;
friend class SerializedVarVectorReceiveInput;
class Inner : public base::RefCounted<Inner> {
@@ -106,8 +96,6 @@ class SerializedVar {
serialization_rules_ = serialization_rules;
}
- void set_cleanup_mode(CleanupMode cm) { cleanup_mode_ = cm; }
-
// See outer class's declarations above.
PP_Var GetVar() const;
PP_Var GetIncompleteVar() const;
@@ -118,7 +106,25 @@ class SerializedVar {
void WriteToMessage(IPC::Message* m) const;
bool ReadFromMessage(const IPC::Message* m, void** iter);
+ // Sets the cleanup mode. See the CleanupMode enum below. These functions
+ // are not just a simple setter in order to require that the appropriate
+ // data is set along with the corresponding mode.
+ void SetCleanupModeToEndSendPassRef(Dispatcher* dispatcher);
+ void SetCleanupModeToEndReceiveCallerOwned();
+
private:
+ enum CleanupMode {
+ // The serialized var won't do anything special in the destructor
+ // (default).
+ CLEANUP_NONE,
+
+ // The serialized var will call EndSendPassRef in the destructor.
+ END_SEND_PASS_REF,
+
+ // The serialized var will call EndReceiveCallerOwned in the destructor.
+ END_RECEIVE_CALLER_OWNED
+ };
+
// Rules for serializing and deserializing vars for this process type.
// This may be NULL, but must be set before trying to serialize to IPC when
// sending, or before converting back to a PP_Var when receiving.
@@ -140,6 +146,10 @@ class SerializedVar {
CleanupMode cleanup_mode_;
+ // The dispatcher saved for the call to EndSendPassRef for the cleanup.
+ // This is only valid when cleanup_mode == END_SEND_PASS_REF.
+ Dispatcher* dispatcher_for_end_send_pass_ref_;
+
#ifndef NDEBUG
// When being sent or received over IPC, we should only be serialized or
// deserialized once. These flags help us assert this is true.
@@ -378,6 +388,8 @@ class SerializedVarOutParam {
// This is the value actually written by the code and returned by OutParam.
// We'll write this into serialized_ in our destructor.
PP_Var writable_var_;
+
+ Dispatcher* dispatcher_;
};
// For returning an array of PP_Vars to the other side and transferring
@@ -399,6 +411,30 @@ class SerializedVarVectorOutParam {
PP_Var* array_;
};
+// For tests that just want to construct a SerializedVar for giving it to one
+// of the other classes.
+class SerializedVarTestConstructor : public SerializedVar {
+ public:
+ // For POD-types and objects.
+ explicit SerializedVarTestConstructor(const PP_Var& pod_var);
+
+ // For strings.
+ explicit SerializedVarTestConstructor(const std::string& str);
+};
+
+// For tests that want to read what's in a SerializedVar.
+class SerializedVarTestReader : public SerializedVar {
+ public:
+ explicit SerializedVarTestReader(const SerializedVar& var);
+
+ // The "incomplete" var is the one sent over the wire. Strings and object
+ // IDs have not yet been converted, so this is the thing that tests will
+ // actually want to check.
+ PP_Var GetIncompleteVar() const { return inner_->GetIncompleteVar(); }
+
+ const std::string& GetString() const { return inner_->GetString(); }
+};
+
} // namespace proxy
} // namespace pp
diff --git a/ppapi/proxy/serialized_var_unittest.cc b/ppapi/proxy/serialized_var_unittest.cc
new file mode 100644
index 0000000..3cc4e61
--- /dev/null
+++ b/ppapi/proxy/serialized_var_unittest.cc
@@ -0,0 +1,74 @@
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ppapi/proxy/ppapi_proxy_test.h"
+
+#include "ppapi/proxy/serialized_var.h"
+
+namespace pp {
+namespace proxy {
+
+namespace {
+
+PP_Var MakeStringVar(int64_t string_id) {
+ PP_Var ret;
+ ret.type = PP_VARTYPE_STRING;
+ ret.value.as_id = string_id;
+ return ret;
+}
+
+PP_Var MakeObjectVar(int64_t object_id) {
+ PP_Var ret;
+ ret.type = PP_VARTYPE_OBJECT;
+ ret.value.as_id = object_id;
+ return ret;
+}
+
+class SerializedVarTest : public PluginProxyTest {
+ public:
+ SerializedVarTest() {}
+};
+
+} // namespace
+
+// Tests output arguments.
+TEST_F(SerializedVarTest, PluginSerializedVarOutParam) {
+ PP_Var host_object = MakeObjectVar(0x31337);
+
+ // Start tracking this object in the plugin.
+ PP_Var plugin_object = var_tracker().ReceiveObjectPassRef(
+ host_object, plugin_dispatcher());
+ EXPECT_EQ(1, var_tracker().GetRefCountForObject(plugin_object));
+
+ {
+ SerializedVar sv;
+ {
+ // The "OutParam" does its work in its destructor, it will write the
+ // information to the SerializedVar we passed in the constructor.
+ SerializedVarOutParam out_param(&sv);
+ *out_param.OutParam(plugin_dispatcher()) = plugin_object;
+ }
+
+ // The object should have transformed the plugin object back to the host
+ // object ID. Nothing in the var tracker should have changed yet, and no
+ // messages should have been sent.
+ SerializedVarTestReader reader(sv);
+ EXPECT_EQ(host_object.value.as_id, reader.GetIncompleteVar().value.as_id);
+ EXPECT_EQ(1, var_tracker().GetRefCountForObject(plugin_object));
+ EXPECT_EQ(0u, sink().message_count());
+ }
+
+ // The out param should have done an "end send pass ref" on the plugin
+ // var serialization rules, which should have in turn released the reference
+ // in the var tracker. Since we only had one reference, this should have sent
+ // a release to the browser.
+ EXPECT_EQ(-1, var_tracker().GetRefCountForObject(plugin_object));
+ EXPECT_EQ(1u, sink().message_count());
+
+ // We don't bother validating that message since it's nontrivial and the
+ // PluginVarTracker test has cases that cover that this message is correct.
+}
+
+} // namespace proxy
+} // namespace pp
diff --git a/ppapi/proxy/var_serialization_rules.h b/ppapi/proxy/var_serialization_rules.h
index f18b6f0..38698ae 100644
--- a/ppapi/proxy/var_serialization_rules.h
+++ b/ppapi/proxy/var_serialization_rules.h
@@ -73,10 +73,11 @@ class VarSerializationRules {
// Prepares a var to be sent to the remote side. One local reference will
// be passed to the remote side. Call Begin* before doing the send and End*
// after doing the send. See SendCallerOwned for a description of the string.
+ //
// The return value from BeginSendPassRef will be the var valid for the host
- // process.
+ // process. This same value must be passed to EndSendPassRef.
virtual PP_Var BeginSendPassRef(const PP_Var& var, std::string* str_val) = 0;
- virtual void EndSendPassRef(const PP_Var& var) = 0;
+ virtual void EndSendPassRef(const PP_Var& var, Dispatcher* dispatcher) = 0;
// ---------------------------------------------------------------------------