1// Copyright 2013 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// A class that receives IPC messages from an NPObjectProxy and calls the real
6// NPObject.
7
8#ifndef CONTENT_CHILD_NPAPI_NPOBJECT_STUB_H_
9#define CONTENT_CHILD_NPAPI_NPOBJECT_STUB_H_
10
11#include <vector>
12
13#include "base/memory/ref_counted.h"
14#include "base/memory/weak_ptr.h"
15#include "content/child/npapi/npobject_base.h"
16#include "ipc/ipc_listener.h"
17#include "ipc/ipc_sender.h"
18#include "url/gurl.h"
19
20struct NPObject;
21
22namespace content {
23class NPChannelBase;
24struct NPIdentifier_Param;
25struct NPVariant_Param;
26
27// This wraps an NPObject and converts IPC messages from NPObjectProxy to calls
28// to the object.  The results are marshalled back.  See npobject_proxy.h for
29// more information.
30class NPObjectStub : public IPC::Listener,
31                     public IPC::Sender,
32                     public base::SupportsWeakPtr<NPObjectStub>,
33                     public NPObjectBase {
34 public:
35  NPObjectStub(NPObject* npobject,
36               NPChannelBase* channel,
37               int route_id,
38               int render_view_id,
39               const GURL& page_url);
40  virtual ~NPObjectStub();
41
42  // Schedules tear-down of this stub.  The underlying NPObject reference is
43  // released, and further invokations from the IPC channel will fail once this
44  // call has returned.  Deletion of the stub is deferred to the main loop, in
45  // case it is touched as the stack unwinds.  DeleteSoon() is safe to call
46  // more than once, until control returns to the main loop.
47  void DeleteSoon();
48
49  // IPC::Sender implementation:
50  virtual bool Send(IPC::Message* msg) OVERRIDE;
51
52  // NPObjectBase implementation.
53  virtual NPObject* GetUnderlyingNPObject() OVERRIDE;
54  virtual IPC::Listener* GetChannelListener() OVERRIDE;
55
56 private:
57  // IPC::Listener implementation:
58  virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
59  virtual void OnChannelError() OVERRIDE;
60
61  // message handlers
62  void OnRelease(IPC::Message* reply_msg);
63  void OnHasMethod(const NPIdentifier_Param& name,
64                   bool* result);
65  void OnInvoke(bool is_default,
66                const NPIdentifier_Param& method,
67                const std::vector<NPVariant_Param>& args,
68                IPC::Message* reply_msg);
69  void OnHasProperty(const NPIdentifier_Param& name,
70                     bool* result);
71  void OnGetProperty(const NPIdentifier_Param& name,
72                     NPVariant_Param* property,
73                     bool* result);
74  void OnSetProperty(const NPIdentifier_Param& name,
75                     const NPVariant_Param& property,
76                     IPC::Message* reply_msg);
77  void OnRemoveProperty(const NPIdentifier_Param& name,
78                        bool* result);
79  void OnInvalidate();
80  void OnEnumeration(std::vector<NPIdentifier_Param>* value,
81                     bool* result);
82  void OnConstruct(const std::vector<NPVariant_Param>& args,
83                   IPC::Message* reply_msg);
84  void OnEvaluate(const std::string& script, bool popups_allowed,
85                  IPC::Message* reply_msg);
86
87 private:
88  NPObject* npobject_;
89  scoped_refptr<NPChannelBase> channel_;
90  int route_id_;
91  int render_view_id_;
92
93  // The url of the main frame hosting the plugin.
94  GURL page_url_;
95};
96
97}  // namespace content
98
99#endif  // CONTENT_CHILD_NPAPI_NPOBJECT_STUB_H_
100