OLD | NEW |
| (Empty) |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include "webkit/plugins/ppapi/ppb_broker_impl.h" | |
6 | |
7 #include "base/logging.h" | |
8 #include "ppapi/shared_impl/platform_file.h" | |
9 #include "third_party/WebKit/public/web/WebDocument.h" | |
10 #include "third_party/WebKit/public/web/WebElement.h" | |
11 #include "third_party/WebKit/public/web/WebPluginContainer.h" | |
12 #include "webkit/plugins/ppapi/common.h" | |
13 #include "webkit/plugins/ppapi/plugin_module.h" | |
14 #include "webkit/plugins/ppapi/ppapi_plugin_instance_impl.h" | |
15 #include "webkit/plugins/ppapi/resource_helper.h" | |
16 | |
17 using ppapi::PlatformFileToInt; | |
18 using ppapi::thunk::PPB_Broker_API; | |
19 using ppapi::TrackedCallback; | |
20 | |
21 namespace webkit { | |
22 namespace ppapi { | |
23 | |
24 // PPB_Broker_Impl ------------------------------------------------------ | |
25 | |
26 PPB_Broker_Impl::PPB_Broker_Impl(PP_Instance instance) | |
27 : Resource(::ppapi::OBJECT_IS_IMPL, instance), | |
28 broker_(NULL), | |
29 connect_callback_(), | |
30 pipe_handle_(PlatformFileToInt(base::kInvalidPlatformFileValue)) { | |
31 } | |
32 | |
33 PPB_Broker_Impl::~PPB_Broker_Impl() { | |
34 if (broker_) { | |
35 broker_->Disconnect(this); | |
36 broker_ = NULL; | |
37 } | |
38 | |
39 // The plugin owns the handle. | |
40 pipe_handle_ = PlatformFileToInt(base::kInvalidPlatformFileValue); | |
41 } | |
42 | |
43 PPB_Broker_API* PPB_Broker_Impl::AsPPB_Broker_API() { | |
44 return this; | |
45 } | |
46 | |
47 int32_t PPB_Broker_Impl::Connect( | |
48 scoped_refptr<TrackedCallback> connect_callback) { | |
49 // TODO(ddorwin): Return PP_ERROR_FAILED if plugin is in-process. | |
50 | |
51 if (broker_) { | |
52 // May only be called once. | |
53 return PP_ERROR_FAILED; | |
54 } | |
55 | |
56 PluginInstanceImpl* plugin_instance = ResourceHelper::GetPluginInstance(this); | |
57 if (!plugin_instance) | |
58 return PP_ERROR_FAILED; | |
59 | |
60 // The callback must be populated now in case we are connected to the broker | |
61 // and BrokerConnected is called before ConnectToBroker returns. | |
62 // Because it must be created now, it must be aborted and cleared if | |
63 // ConnectToBroker fails. | |
64 connect_callback_ = connect_callback; | |
65 | |
66 broker_ = plugin_instance->delegate()->ConnectToBroker(this); | |
67 if (!broker_) { | |
68 connect_callback_->Abort(); | |
69 return PP_ERROR_FAILED; | |
70 } | |
71 | |
72 return PP_OK_COMPLETIONPENDING; | |
73 } | |
74 | |
75 int32_t PPB_Broker_Impl::GetHandle(int32_t* handle) { | |
76 if (pipe_handle_ == PlatformFileToInt(base::kInvalidPlatformFileValue)) | |
77 return PP_ERROR_FAILED; // Handle not set yet. | |
78 *handle = pipe_handle_; | |
79 return PP_OK; | |
80 } | |
81 | |
82 GURL PPB_Broker_Impl::GetDocumentUrl() { | |
83 PluginInstanceImpl* plugin_instance = ResourceHelper::GetPluginInstance(this); | |
84 return plugin_instance->container()->element().document().url(); | |
85 } | |
86 | |
87 // Transfers ownership of the handle to the plugin. | |
88 void PPB_Broker_Impl::BrokerConnected(int32_t handle, int32_t result) { | |
89 DCHECK(pipe_handle_ == | |
90 PlatformFileToInt(base::kInvalidPlatformFileValue)); | |
91 DCHECK(result == PP_OK || | |
92 handle == PlatformFileToInt(base::kInvalidPlatformFileValue)); | |
93 | |
94 pipe_handle_ = handle; | |
95 | |
96 // Synchronous calls are not supported. | |
97 DCHECK(TrackedCallback::IsPending(connect_callback_)); | |
98 | |
99 connect_callback_->Run(result); | |
100 } | |
101 | |
102 } // namespace ppapi | |
103 } // namespace webkit | |
OLD | NEW |