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 CONTENT_PLUGIN_WEBPLUGIN_DELEGATE_STUB_H_
6#define CONTENT_PLUGIN_WEBPLUGIN_DELEGATE_STUB_H_
7
8#include <string>
9#include <vector>
10
11#include "base/memory/ref_counted.h"
12#include "content/child/npapi/npobject_stub.h"
13#include "ipc/ipc_listener.h"
14#include "ipc/ipc_sender.h"
15#include "third_party/npapi/bindings/npapi.h"
16#include "ui/gfx/native_widget_types.h"
17#include "ui/gfx/rect.h"
18#include "url/gurl.h"
19
20struct PluginMsg_Init_Params;
21struct PluginMsg_DidReceiveResponseParams;
22struct PluginMsg_FetchURL_Params;
23struct PluginMsg_UpdateGeometry_Param;
24
25namespace blink {
26class WebInputEvent;
27}
28
29namespace content {
30class PluginChannel;
31class WebCursor;
32class WebPluginDelegateImpl;
33class WebPluginProxy;
34
35// Converts the IPC messages from WebPluginDelegateProxy into calls to the
36// actual WebPluginDelegateImpl object.
37class WebPluginDelegateStub : public IPC::Listener,
38                              public IPC::Sender,
39                              public base::RefCounted<WebPluginDelegateStub> {
40 public:
41  WebPluginDelegateStub(const std::string& mime_type, int instance_id,
42                        PluginChannel* channel);
43
44  // IPC::Listener implementation:
45  virtual bool OnMessageReceived(const IPC::Message& msg) OVERRIDE;
46
47  // IPC::Sender implementation:
48  virtual bool Send(IPC::Message* msg) OVERRIDE;
49
50  int instance_id() { return instance_id_; }
51  WebPluginDelegateImpl* delegate() { return delegate_; }
52  WebPluginProxy* webplugin() { return webplugin_; }
53
54 private:
55  friend class base::RefCounted<WebPluginDelegateStub>;
56
57  virtual ~WebPluginDelegateStub();
58
59  // Message handlers for the WebPluginDelegate calls that are proxied from the
60  // renderer over the IPC channel.
61  void OnInit(const PluginMsg_Init_Params& params,
62              bool* transparent,
63              bool* result);
64  void OnWillSendRequest(int id, const GURL& url, int http_status_code);
65  void OnDidReceiveResponse(const PluginMsg_DidReceiveResponseParams& params);
66  void OnDidReceiveData(int id, const std::vector<char>& buffer,
67                        int data_offset);
68  void OnDidFinishLoading(int id);
69  void OnDidFail(int id);
70  void OnDidFinishLoadWithReason(const GURL& url, int reason, int notify_id);
71  void OnSetFocus(bool focused);
72  void OnHandleInputEvent(const blink::WebInputEvent* event,
73                          bool* handled, WebCursor* cursor);
74  void OnPaint(const gfx::Rect& damaged_rect);
75  void OnDidPaint();
76  void OnUpdateGeometry(const PluginMsg_UpdateGeometry_Param& param);
77  void OnGetPluginScriptableObject(int* route_id);
78  void OnSendJavaScriptStream(const GURL& url,
79                              const std::string& result,
80                              bool success,
81                              int notify_id);
82  void OnGetFormValue(base::string16* value, bool* success);
83
84  void OnSetContentAreaFocus(bool has_focus);
85#if defined(OS_WIN) && !defined(USE_AURA)
86  void OnImeCompositionUpdated(const base::string16& text,
87                               const std::vector<int>& clauses,
88                               const std::vector<int>& target,
89                               int cursor_position);
90  void OnImeCompositionCompleted(const base::string16& text);
91#endif
92#if defined(OS_MACOSX)
93  void OnSetWindowFocus(bool has_focus);
94  void OnContainerHidden();
95  void OnContainerShown(gfx::Rect window_frame, gfx::Rect view_frame,
96                        bool has_focus);
97  void OnWindowFrameChanged(const gfx::Rect& window_frame,
98                            const gfx::Rect& view_frame);
99  void OnImeCompositionCompleted(const base::string16& text);
100#endif
101
102  void OnDidReceiveManualResponse(
103      const GURL& url,
104      const PluginMsg_DidReceiveResponseParams& params);
105  void OnDidReceiveManualData(const std::vector<char>& buffer);
106  void OnDidFinishManualLoading();
107  void OnDidManualLoadFail();
108  void OnHandleURLRequestReply(unsigned long resource_id,
109                               const GURL& url,
110                               int notify_id);
111  void OnHTTPRangeRequestReply(unsigned long resource_id, int range_request_id);
112  void OnFetchURL(const PluginMsg_FetchURL_Params& params);
113
114  std::string mime_type_;
115  int instance_id_;
116
117  scoped_refptr<PluginChannel> channel_;
118
119  base::WeakPtr<NPObjectStub> plugin_scriptable_object_;
120  WebPluginDelegateImpl* delegate_;
121  WebPluginProxy* webplugin_;
122  bool in_destructor_;
123
124  // The url of the main frame hosting the plugin.
125  GURL page_url_;
126
127  DISALLOW_IMPLICIT_CONSTRUCTORS(WebPluginDelegateStub);
128};
129
130}  // namespace content
131
132#endif  // CONTENT_PLUGIN_WEBPLUGIN_DELEGATE_STUB_H_
133