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#ifndef PPAPI_PROXY_PPB_INSTANCE_PROXY_H_
6#define PPAPI_PROXY_PPB_INSTANCE_PROXY_H_
7
8#include <string>
9#include <vector>
10
11#include "ppapi/c/pp_instance.h"
12#include "ppapi/c/pp_resource.h"
13#include "ppapi/c/pp_var.h"
14#include "ppapi/proxy/interface_proxy.h"
15#include "ppapi/proxy/proxy_completion_callback_factory.h"
16#include "ppapi/shared_impl/host_resource.h"
17#include "ppapi/shared_impl/ppb_instance_shared.h"
18#include "ppapi/shared_impl/singleton_resource_id.h"
19#include "ppapi/thunk/ppb_instance_api.h"
20#include "ppapi/utility/completion_callback_factory.h"
21
22// Windows headers interfere with this file.
23#ifdef PostMessage
24#undef PostMessage
25#endif
26
27struct PP_DecryptedBlockInfo;
28struct PP_DecryptedFrameInfo;
29
30namespace ppapi {
31namespace proxy {
32
33class SerializedVarReceiveInput;
34class SerializedVarOutParam;
35class SerializedVarReturnValue;
36
37class PPB_Instance_Proxy : public InterfaceProxy,
38                           public PPB_Instance_Shared {
39 public:
40  PPB_Instance_Proxy(Dispatcher* dispatcher);
41  virtual ~PPB_Instance_Proxy();
42
43  // InterfaceProxy implementation.
44  virtual bool OnMessageReceived(const IPC::Message& msg);
45
46  // PPB_Instance_API implementation.
47  virtual PP_Bool BindGraphics(PP_Instance instance,
48                               PP_Resource device) OVERRIDE;
49  virtual PP_Bool IsFullFrame(PP_Instance instance) OVERRIDE;
50  virtual const ViewData* GetViewData(PP_Instance instance) OVERRIDE;
51  virtual PP_Bool FlashIsFullscreen(PP_Instance instance) OVERRIDE;
52  virtual PP_Var GetWindowObject(PP_Instance instance) OVERRIDE;
53  virtual PP_Var GetOwnerElementObject(PP_Instance instance) OVERRIDE;
54  virtual PP_Var ExecuteScript(PP_Instance instance,
55                               PP_Var script,
56                               PP_Var* exception) OVERRIDE;
57  virtual uint32_t GetAudioHardwareOutputSampleRate(PP_Instance instance)
58      OVERRIDE;
59  virtual uint32_t GetAudioHardwareOutputBufferSize(PP_Instance instance)
60      OVERRIDE;
61  virtual PP_Var GetDefaultCharSet(PP_Instance instance) OVERRIDE;
62  virtual void SetPluginToHandleFindRequests(PP_Instance instance) OVERRIDE;
63  virtual void NumberOfFindResultsChanged(PP_Instance instance,
64                                          int32_t total,
65                                          PP_Bool final_result) OVERRIDE;
66  virtual void SelectedFindResultChanged(PP_Instance instance,
67                                         int32_t index) OVERRIDE;
68  virtual void SetTickmarks(PP_Instance instance,
69                            const PP_Rect* tickmarks,
70                            uint32_t count) OVERRIDE;
71  virtual PP_Bool IsFullscreen(PP_Instance instance) OVERRIDE;
72  virtual PP_Bool SetFullscreen(PP_Instance instance,
73                                PP_Bool fullscreen) OVERRIDE;
74  virtual PP_Bool GetScreenSize(PP_Instance instance,
75                                PP_Size* size) OVERRIDE;
76  virtual Resource* GetSingletonResource(PP_Instance instance,
77                                         SingletonResourceID id) OVERRIDE;
78  virtual int32_t RequestInputEvents(PP_Instance instance,
79                                     uint32_t event_classes) OVERRIDE;
80  virtual int32_t RequestFilteringInputEvents(PP_Instance instance,
81                                              uint32_t event_classes) OVERRIDE;
82  virtual void StartTrackingLatency(PP_Instance instance) OVERRIDE;
83  virtual void ClearInputEventRequest(PP_Instance instance,
84                                      uint32_t event_classes) OVERRIDE;
85  virtual void ZoomChanged(PP_Instance instance, double factor) OVERRIDE;
86  virtual void ZoomLimitsChanged(PP_Instance instance,
87                                 double minimum_factor,
88                                 double maximium_factor) OVERRIDE;
89  virtual void PostMessage(PP_Instance instance, PP_Var message) OVERRIDE;
90  virtual int32_t RegisterMessageHandler(PP_Instance instance,
91                                         void* user_data,
92                                         const PPP_MessageHandler_0_2* handler,
93                                         PP_Resource message_loop) OVERRIDE;
94  virtual int32_t RegisterMessageHandler_1_1_Deprecated(
95      PP_Instance instance,
96      void* user_data,
97      const PPP_MessageHandler_0_1_Deprecated* handler,
98      PP_Resource message_loop) OVERRIDE;
99  virtual void UnregisterMessageHandler(PP_Instance instance) OVERRIDE;
100  virtual PP_Bool SetCursor(PP_Instance instance,
101                            PP_MouseCursor_Type type,
102                            PP_Resource image,
103                            const PP_Point* hot_spot) OVERRIDE;
104  virtual int32_t LockMouse(PP_Instance instance,
105                            scoped_refptr<TrackedCallback> callback) OVERRIDE;
106  virtual void UnlockMouse(PP_Instance instance) OVERRIDE;
107  virtual void SetTextInputType(PP_Instance instance,
108                                PP_TextInput_Type type) OVERRIDE;
109  virtual void UpdateCaretPosition(PP_Instance instance,
110                                   const PP_Rect& caret,
111                                   const PP_Rect& bounding_box) OVERRIDE;
112  virtual void CancelCompositionText(PP_Instance instance) OVERRIDE;
113  virtual void SelectionChanged(PP_Instance instance) OVERRIDE;
114  virtual void UpdateSurroundingText(PP_Instance instance,
115                                     const char* text,
116                                     uint32_t caret,
117                                     uint32_t anchor) OVERRIDE;
118  virtual PP_Var GetDocumentURL(PP_Instance instance,
119                                PP_URLComponents_Dev* components) OVERRIDE;
120#if !defined(OS_NACL)
121  virtual PP_Var ResolveRelativeToDocument(
122      PP_Instance instance,
123      PP_Var relative,
124      PP_URLComponents_Dev* components) OVERRIDE;
125  virtual PP_Bool DocumentCanRequest(PP_Instance instance, PP_Var url) OVERRIDE;
126  virtual PP_Bool DocumentCanAccessDocument(PP_Instance instance,
127                                            PP_Instance target) OVERRIDE;
128  virtual PP_Var GetPluginInstanceURL(
129      PP_Instance instance,
130      PP_URLComponents_Dev* components) OVERRIDE;
131  virtual PP_Var GetPluginReferrerURL(
132      PP_Instance instance,
133      PP_URLComponents_Dev* components) OVERRIDE;
134  virtual void PromiseResolved(PP_Instance instance,
135                               uint32 promise_id) OVERRIDE;
136  virtual void PromiseResolvedWithSession(PP_Instance instance,
137                                          uint32 promise_id,
138                                          PP_Var web_session_id_var) OVERRIDE;
139  virtual void PromiseResolvedWithKeyIds(PP_Instance instance,
140                                         uint32 promise_id,
141                                         PP_Var key_ids_var) OVERRIDE;
142  virtual void PromiseRejected(PP_Instance instance,
143                               uint32 promise_id,
144                               PP_CdmExceptionCode exception_code,
145                               uint32 system_code,
146                               PP_Var error_description_var) OVERRIDE;
147  virtual void SessionMessage(PP_Instance instance,
148                              PP_Var web_session_id_var,
149                              PP_Var message_var,
150                              PP_Var destination_url_var) OVERRIDE;
151  virtual void SessionKeysChange(PP_Instance instance,
152                                 PP_Var web_session_id_var,
153                                 PP_Bool has_additional_usable_key) OVERRIDE;
154  virtual void SessionExpirationChange(PP_Instance instance,
155                                       PP_Var web_session_id_var,
156                                       PP_Time new_expiry_time) OVERRIDE;
157  virtual void SessionReady(PP_Instance instance,
158                            PP_Var web_session_id_var) OVERRIDE;
159  virtual void SessionClosed(PP_Instance instance,
160                             PP_Var web_session_id_var) OVERRIDE;
161  virtual void SessionError(PP_Instance instance,
162                            PP_Var web_session_id_var,
163                            PP_CdmExceptionCode exception_code,
164                            uint32 system_code,
165                            PP_Var error_description_var) OVERRIDE;
166  virtual void DeliverBlock(PP_Instance instance,
167                            PP_Resource decrypted_block,
168                            const PP_DecryptedBlockInfo* block_info) OVERRIDE;
169  virtual void DecoderInitializeDone(PP_Instance instance,
170                                     PP_DecryptorStreamType decoder_type,
171                                     uint32_t request_id,
172                                     PP_Bool success) OVERRIDE;
173  virtual void DecoderDeinitializeDone(PP_Instance instance,
174                                       PP_DecryptorStreamType decoder_type,
175                                       uint32_t request_id) OVERRIDE;
176  virtual void DecoderResetDone(PP_Instance instance,
177                                PP_DecryptorStreamType decoder_type,
178                                uint32_t request_id) OVERRIDE;
179  virtual void DeliverFrame(PP_Instance instance,
180                            PP_Resource decrypted_frame,
181                            const PP_DecryptedFrameInfo* frame_info) OVERRIDE;
182  virtual void DeliverSamples(
183      PP_Instance instance,
184      PP_Resource audio_frames,
185      const PP_DecryptedSampleInfo* sample_info) OVERRIDE;
186#endif  // !defined(OS_NACL)
187
188  static const ApiID kApiID = API_ID_PPB_INSTANCE;
189
190 private:
191  // Plugin -> Host message handlers.
192  void OnHostMsgGetWindowObject(PP_Instance instance,
193                                SerializedVarReturnValue result);
194  void OnHostMsgGetOwnerElementObject(PP_Instance instance,
195                                      SerializedVarReturnValue result);
196  void OnHostMsgBindGraphics(PP_Instance instance,
197                             PP_Resource device);
198  void OnHostMsgIsFullFrame(PP_Instance instance, PP_Bool* result);
199  void OnHostMsgExecuteScript(PP_Instance instance,
200                              SerializedVarReceiveInput script,
201                              SerializedVarOutParam out_exception,
202                              SerializedVarReturnValue result);
203  void OnHostMsgGetAudioHardwareOutputSampleRate(PP_Instance instance,
204                                                 uint32_t *result);
205  void OnHostMsgGetAudioHardwareOutputBufferSize(PP_Instance instance,
206                                                 uint32_t *result);
207  void OnHostMsgGetDefaultCharSet(PP_Instance instance,
208                                  SerializedVarReturnValue result);
209  void OnHostMsgSetPluginToHandleFindRequests(PP_Instance instance);
210  void OnHostMsgNumberOfFindResultsChanged(PP_Instance instance,
211                                           int32_t total,
212                                           PP_Bool final_result);
213  void OnHostMsgSelectFindResultChanged(PP_Instance instance,
214                                        int32_t index);
215  void OnHostMsgSetTickmarks(PP_Instance instance,
216                             const std::vector<PP_Rect>& tickmarks);
217  void OnHostMsgSetFullscreen(PP_Instance instance,
218                              PP_Bool fullscreen,
219                              PP_Bool* result);
220  void OnHostMsgGetScreenSize(PP_Instance instance,
221                              PP_Bool* result,
222                              PP_Size* size);
223  void OnHostMsgRequestInputEvents(PP_Instance instance,
224                                   bool is_filtering,
225                                   uint32_t event_classes);
226  void OnHostMsgStartTrackingLatency(PP_Instance instance);
227  void OnHostMsgClearInputEvents(PP_Instance instance,
228                                 uint32_t event_classes);
229  void OnHostMsgPostMessage(PP_Instance instance,
230                            SerializedVarReceiveInput message);
231  void OnHostMsgLockMouse(PP_Instance instance);
232  void OnHostMsgUnlockMouse(PP_Instance instance);
233  void OnHostMsgSetCursor(PP_Instance instance,
234                          int32_t type,
235                          const ppapi::HostResource& custom_image,
236                          const PP_Point& hot_spot);
237  void OnHostMsgSetTextInputType(PP_Instance instance, PP_TextInput_Type type);
238  void OnHostMsgUpdateCaretPosition(PP_Instance instance,
239                                    const PP_Rect& caret,
240                                    const PP_Rect& bounding_box);
241  void OnHostMsgCancelCompositionText(PP_Instance instance);
242  void OnHostMsgUpdateSurroundingText(
243      PP_Instance instance,
244      const std::string& text,
245      uint32_t caret,
246      uint32_t anchor);
247  void OnHostMsgGetDocumentURL(PP_Instance instance,
248                               PP_URLComponents_Dev* components,
249                               SerializedVarReturnValue result);
250
251#if !defined(OS_NACL)
252  void OnHostMsgResolveRelativeToDocument(PP_Instance instance,
253                                          SerializedVarReceiveInput relative,
254                                          SerializedVarReturnValue result);
255  void OnHostMsgDocumentCanRequest(PP_Instance instance,
256                                   SerializedVarReceiveInput url,
257                                   PP_Bool* result);
258  void OnHostMsgDocumentCanAccessDocument(PP_Instance active,
259                                          PP_Instance target,
260                                          PP_Bool* result);
261  void OnHostMsgGetPluginInstanceURL(PP_Instance instance,
262                                     SerializedVarReturnValue result);
263  void OnHostMsgGetPluginReferrerURL(PP_Instance instance,
264                                     SerializedVarReturnValue result);
265
266  virtual void OnHostMsgPromiseResolved(PP_Instance instance,
267                                        uint32_t promise_id);
268  virtual void OnHostMsgPromiseResolvedWithSession(
269      PP_Instance instance,
270      uint32_t promise_id,
271      SerializedVarReceiveInput web_session_id);
272  virtual void OnHostMsgPromiseResolvedWithKeyIds(
273      PP_Instance instance,
274      uint32 promise_id,
275      const std::vector<std::vector<uint8_t> >& key_ids);
276  virtual void OnHostMsgPromiseRejected(
277      PP_Instance instance,
278      uint32_t promise_id,
279      PP_CdmExceptionCode exception_code,
280      uint32_t system_code,
281      SerializedVarReceiveInput error_description);
282  virtual void OnHostMsgSessionMessage(
283      PP_Instance instance,
284      SerializedVarReceiveInput web_session_id,
285      SerializedVarReceiveInput message,
286      SerializedVarReceiveInput destination_url);
287  virtual void OnHostMsgSessionKeysChange(PP_Instance instance,
288                                          const std::string& web_session_id,
289                                          PP_Bool has_additional_usable_key);
290  virtual void OnHostMsgSessionExpirationChange(
291      PP_Instance instance,
292      const std::string& web_session_id,
293      PP_Time new_expiry_time);
294  virtual void OnHostMsgSessionReady(PP_Instance instance,
295                                     SerializedVarReceiveInput web_session_id);
296  virtual void OnHostMsgSessionClosed(PP_Instance instance,
297                                      SerializedVarReceiveInput web_session_id);
298  virtual void OnHostMsgSessionError(
299      PP_Instance instance,
300      SerializedVarReceiveInput web_session_id,
301      PP_CdmExceptionCode exception_code,
302      uint32_t system_code,
303      SerializedVarReceiveInput error_description);
304  virtual void OnHostMsgDecoderInitializeDone(
305      PP_Instance instance,
306      PP_DecryptorStreamType decoder_type,
307      uint32_t request_id,
308      PP_Bool success);
309  virtual void OnHostMsgDecoderDeinitializeDone(
310      PP_Instance instance,
311      PP_DecryptorStreamType decoder_type,
312      uint32_t request_id);
313  virtual void OnHostMsgDecoderResetDone(PP_Instance instance,
314                                         PP_DecryptorStreamType decoder_type,
315                                         uint32_t request_id);
316  virtual void OnHostMsgDeliverBlock(PP_Instance instance,
317                                     PP_Resource decrypted_block,
318                                     const std::string& serialized_block_info);
319  virtual void OnHostMsgDeliverFrame(PP_Instance instance,
320                                     PP_Resource decrypted_frame,
321                                     const std::string& serialized_block_info);
322  virtual void OnHostMsgDeliverSamples(
323      PP_Instance instance,
324      PP_Resource audio_frames,
325      const std::string& serialized_sample_info);
326#endif  // !defined(OS_NACL)
327
328  // Host -> Plugin message handlers.
329  void OnPluginMsgMouseLockComplete(PP_Instance instance, int32_t result);
330
331  void MouseLockCompleteInHost(int32_t result, PP_Instance instance);
332
333  // Other helpers.
334  void CancelAnyPendingRequestSurroundingText(PP_Instance instance);
335
336  ProxyCompletionCallbackFactory<PPB_Instance_Proxy> callback_factory_;
337};
338
339}  // namespace proxy
340}  // namespace ppapi
341
342#endif  // PPAPI_PROXY_PPB_INSTANCE_PROXY_H_
343