Chromium Code Reviews| Index: ppapi/proxy/compositor_resource.cc |
| diff --git a/ppapi/proxy/compositor_resource.cc b/ppapi/proxy/compositor_resource.cc |
| index 3ada734849839aca56078ac7e3859b6d574df1a6..9688f6054bc5d9796fbbfd86eacd16e61445b337 100644 |
| --- a/ppapi/proxy/compositor_resource.cc |
| +++ b/ppapi/proxy/compositor_resource.cc |
| @@ -6,6 +6,7 @@ |
| #include "base/logging.h" |
| #include "ppapi/proxy/ppapi_messages.h" |
| +#include "ppapi/thunk/enter.h" |
| namespace ppapi { |
| namespace proxy { |
| @@ -14,6 +15,7 @@ CompositorResource::CompositorResource(Connection connection, |
| PP_Instance instance) |
| : PluginResource(connection, instance), |
| layer_reset_(true), |
| + bound_to_instance_(false), |
| last_resource_id_(0) { |
| SendCreate(RENDERER, PpapiHostMsg_Compositor_Create()); |
| } |
| @@ -39,6 +41,9 @@ void CompositorResource::OnReplyReceived( |
| } |
| PP_Resource CompositorResource::AddLayer() { |
| + if (!bound_to_instance_) |
| + return 0; |
|
piman
2014/06/18 00:55:24
Why? It doesn't seem legit.
Peng
2014/06/18 02:35:03
Same reason.
Peng
2014/06/18 02:35:03
I explained the reason in another comment. Please
|
| + |
| scoped_refptr<CompositorLayerResource> resource(new CompositorLayerResource( |
| connection(), pp_instance(), this)); |
| layers_.push_back(resource); |
| @@ -47,6 +52,9 @@ PP_Resource CompositorResource::AddLayer() { |
| int32_t CompositorResource::CommitLayers( |
| const scoped_refptr<ppapi::TrackedCallback>& callback) { |
| + if (!bound_to_instance_) |
| + return PP_ERROR_FAILED; |
| + |
| if (IsInProgress()) |
| return PP_ERROR_INPROGRESS; |
| @@ -72,12 +80,41 @@ int32_t CompositorResource::CommitLayers( |
| } |
| int32_t CompositorResource::ResetLayers() { |
| + if (!bound_to_instance_) |
| + return PP_ERROR_FAILED; |
| + |
| if (IsInProgress()) |
| return PP_ERROR_INPROGRESS; |
| + |
| ResetLayersInternal(); |
| return PP_OK; |
| } |
| +void CompositorResource::BindToInstance(bool bound) { |
| + ProxyLock::AssertAcquiredDebugOnly(); |
| + |
| + if (bound == bound_to_instance_) |
| + return; |
| + bound_to_instance_ = bound; |
| + |
| + // Reset layers when the compositor is un bound from the instance. |
|
piman
2014/06/18 00:55:24
why?
Peng
2014/06/18 02:35:03
Same reason.
|
| + if (!bound_to_instance_) |
| + ResetLayersInternal(); |
| +} |
| + |
| +void CompositorResource::NotifyLastPluginRefWasDeleted() { |
| + ProxyLock::AssertAcquiredDebugOnly(); |
| + |
| + PluginResource::NotifyLastPluginRefWasDeleted(); |
| + if (bound_to_instance_) { |
| + ppapi::thunk::EnterInstanceNoLock enter(pp_instance()); |
| + CHECK(enter.succeeded()); |
|
piman
2014/06/18 00:55:24
no CHECK.
Peng
2014/06/18 02:35:03
Done.
|
| + enter.functions()->BindGraphics(pp_instance(), 0); |
|
piman
2014/06/18 00:55:24
Why the need to do this? The browser side can do i
Peng
2014/06/18 02:35:03
Because the plugin will not notify the host, when
|
| + // BindToInstance(0) should be called by PPB_Instance_Proxy::BindGraphics(). |
| + CHECK(!bound_to_instance_); |
|
piman
2014/06/18 00:55:24
no CHECK.
Peng
2014/06/18 02:35:03
Done.
|
| + } |
| +} |
| + |
| void CompositorResource::OnPluginMsgCommitLayersReply( |
| const ResourceMessageReplyParams& params) { |
| if (!TrackedCallback::IsPending(commit_callback_)) |