Pin Chrome's shortcut to the Win10 Start menu on install and OS upgrade.
[chromium-blink-merge.git] / content / child / npapi / npobject_proxy.h
blobcdc5ee2f544146c21544260e6415908a53e88275
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 proxy for NPObject that sends all calls to the object to an NPObjectStub
6 // running in a different process.
8 #ifndef CONTENT_CHILD_NPAPI_NPOBJECT_PROXY_H_
9 #define CONTENT_CHILD_NPAPI_NPOBJECT_PROXY_H_
11 #include "base/memory/ref_counted.h"
12 #include "content/child/npapi/npobject_base.h"
13 #include "ipc/ipc_listener.h"
14 #include "ipc/ipc_sender.h"
15 #include "third_party/npapi/bindings/npruntime.h"
16 #include "ui/gfx/native_widget_types.h"
17 #include "url/gurl.h"
19 struct NPObject;
21 namespace content {
22 class NPChannelBase;
24 // When running a plugin in a different process from the renderer, we need to
25 // proxy calls to NPObjects across process boundaries. This happens both ways,
26 // as a plugin can get an NPObject for the window, and a page can get an
27 // NPObject for the plugin. In the process that interacts with the NPobject we
28 // give it an NPObjectProxy instead. All calls to it are sent across an IPC
29 // channel (specifically, a NPChannelBase). The NPObjectStub on the other
30 // side translates the IPC messages into calls to the actual NPObject, and
31 // returns the marshalled result.
32 class NPObjectProxy : public IPC::Listener,
33 public IPC::Sender,
34 public NPObjectBase {
35 public:
36 ~NPObjectProxy() override;
38 static NPObject* Create(NPChannelBase* channel,
39 int route_id,
40 int render_view_id,
41 const GURL& page_url,
42 NPP owner);
44 // IPC::Sender implementation:
45 bool Send(IPC::Message* msg) override;
46 int route_id() { return route_id_; }
47 NPChannelBase* channel() { return channel_.get(); }
49 // The next 9 functions are called on NPObjects from the plugin and browser.
50 static bool NPHasMethod(NPObject *obj,
51 NPIdentifier name);
52 static bool NPInvoke(NPObject *obj,
53 NPIdentifier name,
54 const NPVariant *args,
55 uint32_t arg_count,
56 NPVariant *result);
57 static bool NPInvokeDefault(NPObject *npobj,
58 const NPVariant *args,
59 uint32_t arg_count,
60 NPVariant *result);
61 static bool NPHasProperty(NPObject *obj,
62 NPIdentifier name);
63 static bool NPGetProperty(NPObject *obj,
64 NPIdentifier name,
65 NPVariant *result);
66 static bool NPSetProperty(NPObject *obj,
67 NPIdentifier name,
68 const NPVariant *value);
69 static bool NPRemoveProperty(NPObject *obj,
70 NPIdentifier name);
71 static bool NPNEnumerate(NPObject *obj,
72 NPIdentifier **value,
73 uint32_t *count);
74 static bool NPNConstruct(NPObject *npobj,
75 const NPVariant *args,
76 uint32_t arg_count,
77 NPVariant *result);
79 // The next two functions are only called on NPObjects from the browser.
80 static bool NPNEvaluate(NPP npp,
81 NPObject *obj,
82 NPString *script,
83 NPVariant *result);
85 static bool NPInvokePrivate(NPP npp,
86 NPObject *obj,
87 bool is_default,
88 NPIdentifier name,
89 const NPVariant *args,
90 uint32_t arg_count,
91 NPVariant *result);
93 static NPObjectProxy* GetProxy(NPObject* object);
94 static const NPClass* npclass() { return &npclass_proxy_; }
96 // NPObjectBase implementation.
97 NPObject* GetUnderlyingNPObject() override;
99 IPC::Listener* GetChannelListener() override;
101 private:
102 NPObjectProxy(NPChannelBase* channel,
103 int route_id,
104 int render_view_id,
105 const GURL& page_url);
107 // IPC::Listener implementation:
108 bool OnMessageReceived(const IPC::Message& msg) override;
109 void OnChannelError() override;
111 static NPObject* NPAllocate(NPP, NPClass*);
112 static void NPDeallocate(NPObject* npObj);
114 // This function is only caled on NPObjects from the plugin.
115 static void NPPInvalidate(NPObject *obj);
116 static NPClass npclass_proxy_;
118 scoped_refptr<NPChannelBase> channel_;
119 int route_id_;
120 int render_view_id_;
122 // The url of the main frame hosting the plugin.
123 GURL page_url_;
126 } // namespace content
128 #endif // CONTENT_CHILD_NPAPI_NPOBJECT_PROXY_H_