Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4)

Side by Side Diff: webkit/glue/plugins/pepper_plugin_module.h

Issue 5828003: Move the Pepper implementation from webkit/glue/plugins/pepper_* to... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 10 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2010 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 WEBKIT_GLUE_PLUGINS_PEPPER_PLUGIN_MODULE_H_
6 #define WEBKIT_GLUE_PLUGINS_PEPPER_PLUGIN_MODULE_H_
7
8 #include <map>
9 #include <set>
10
11 #include "base/basictypes.h"
12 #include "base/native_library.h"
13 #include "base/process.h"
14 #include "base/ref_counted.h"
15 #include "base/scoped_ptr.h"
16 #include "base/weak_ptr.h"
17 #include "ppapi/c/pp_module.h"
18 #include "ppapi/c/ppb.h"
19 #include "webkit/glue/plugins/pepper_plugin_delegate.h"
20
21 class FilePath;
22 class MessageLoop;
23 typedef struct NPObject NPObject;
24 struct PPB_Core;
25 typedef void* NPIdentifier;
26
27 namespace base {
28 class WaitableEvent;
29 }
30
31 namespace pp {
32 namespace proxy {
33 class HostDispatcher;
34 } // proxy
35 } // pp
36
37 namespace IPC {
38 struct ChannelHandle;
39 }
40
41 namespace pepper {
42
43 class ObjectVar;
44 class PluginDelegate;
45 class PluginInstance;
46 class PluginObject;
47
48 // Represents one plugin library loaded into one renderer. This library may
49 // have multiple instances.
50 //
51 // Note: to get from a PP_Instance to a PluginInstance*, use the
52 // ResourceTracker.
53 class PluginModule : public base::RefCounted<PluginModule>,
54 public base::SupportsWeakPtr<PluginModule> {
55 public:
56 typedef const void* (*GetInterfaceFunc)(const char*);
57 typedef int (*PPP_InitializeModuleFunc)(PP_Module, PPB_GetInterface);
58 typedef void (*PPP_ShutdownModuleFunc)();
59
60 struct EntryPoints {
61 // This structure is POD, with the constructor initializing to NULL.
62 EntryPoints();
63
64 GetInterfaceFunc get_interface;
65 PPP_InitializeModuleFunc initialize_module;
66 PPP_ShutdownModuleFunc shutdown_module; // Optional, may be NULL.
67 };
68
69 // You must call one of the Init functions to create a module of the type
70 // you desire.
71 PluginModule();
72
73 ~PluginModule();
74
75 // Initializes this module as an internal plugin with the given entrypoints.
76 // This is used for "plugins" compiled into Chrome. Returns true on success.
77 // False means that the plugin can not be used.
78 bool InitAsInternalPlugin(const EntryPoints& entry_points);
79
80 // Initializes this module using the given library path as the plugin.
81 // Returns true on success. False means that the plugin can not be used.
82 bool InitAsLibrary(const FilePath& path);
83
84 // Initializes this module for the given out of process proxy. This takes
85 // ownership of the given pointer, even in the failure case.
86 void InitAsProxied(PluginDelegate::OutOfProcessProxy* out_of_process_proxy);
87
88 static const PPB_Core* GetCore();
89
90 // Returns a pointer to the local GetInterface function for retrieving
91 // PPB interfaces.
92 static GetInterfaceFunc GetLocalGetInterfaceFunc();
93
94 // Returns the module handle. This may be used before Init() is called (the
95 // proxy needs this information to set itself up properly).
96 PP_Module pp_module() const { return pp_module_; }
97
98 void set_name(const std::string& name) { name_ = name; }
99 const std::string& name() const { return name_; }
100
101 PluginInstance* CreateInstance(PluginDelegate* delegate);
102
103 // Returns "some" plugin instance associated with this module. This is not
104 // guaranteed to be any one in particular. This is normally used to execute
105 // callbacks up to the browser layer that are not inherently per-instance,
106 // but the delegate lives only on the plugin instance so we need one of them.
107 PluginInstance* GetSomeInstance() const;
108
109 // Calls the plugin's GetInterface and returns the given interface pointer,
110 // which could be NULL.
111 const void* GetPluginInterface(const char* name) const;
112
113 // This module is associated with a set of instances. The PluginInstance
114 // object declares its association with this module in its destructor and
115 // releases us in its destructor.
116 void InstanceCreated(PluginInstance* instance);
117 void InstanceDeleted(PluginInstance* instance);
118
119 // Tracks all live ObjectVar. This is so we can map between PluginModule +
120 // NPObject and get the ObjectVar corresponding to it. This Add/Remove
121 // function should be called by the ObjectVar when it is created and
122 // destroyed.
123 void AddNPObjectVar(ObjectVar* object_var);
124 void RemoveNPObjectVar(ObjectVar* object_var);
125
126 // Looks up a previously registered ObjectVar for the given NPObject and
127 // module. Returns NULL if there is no ObjectVar corresponding to the given
128 // NPObject for the given module. See AddNPObjectVar above.
129 ObjectVar* ObjectVarForNPObject(NPObject* np_object) const;
130
131 // Tracks all live PluginObjects.
132 void AddPluginObject(PluginObject* plugin_object);
133 void RemovePluginObject(PluginObject* plugin_object);
134
135 private:
136 // Calls the InitializeModule entrypoint. The entrypoint must have been
137 // set and the plugin must not be out of process (we don't maintain
138 // entrypoints in that case).
139 bool InitializeModule();
140
141 PP_Module pp_module_;
142
143 // Manages the out of process proxy interface. The presence of this
144 // pointer indicates that the plugin is running out of process and that the
145 // entry_points_ aren't valid.
146 scoped_ptr<PluginDelegate::OutOfProcessProxy> out_of_process_proxy_;
147
148 // Holds a reference to the base::NativeLibrary handle if this PluginModule
149 // instance wraps functions loaded from a library. Can be NULL. If
150 // |library_| is non-NULL, PluginModule will attempt to unload the library
151 // during destruction.
152 base::NativeLibrary library_;
153
154 // Contains pointers to the entry points of the actual plugin implementation.
155 // These will be NULL for out-of-process plugins, which is indicated by the
156 // presence of the out_of_process_proxy_ value.
157 EntryPoints entry_points_;
158
159 // The name of the module.
160 std::string name_;
161
162 // Non-owning pointers to all instances associated with this module. When
163 // there are no more instances, this object should be deleted.
164 typedef std::set<PluginInstance*> PluginInstanceSet;
165 PluginInstanceSet instances_;
166
167 // Tracks all live ObjectVars used by this module so we can map NPObjects to
168 // the corresponding object. These are non-owning references.
169 typedef std::map<NPObject*, ObjectVar*> NPObjectToObjectVarMap;;
170 NPObjectToObjectVarMap np_object_to_object_var_;
171
172 typedef std::set<PluginObject*> PluginObjectSet;
173 PluginObjectSet live_plugin_objects_;
174
175 DISALLOW_COPY_AND_ASSIGN(PluginModule);
176 };
177
178 } // namespace pepper
179
180 #endif // WEBKIT_GLUE_PLUGINS_PEPPER_PLUGIN_MODULE_H_
OLDNEW
« no previous file with comments | « webkit/glue/plugins/pepper_plugin_instance.cc ('k') | webkit/glue/plugins/pepper_plugin_module.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698