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

Side by Side Diff: content/plugin/plugin_channel_base.h

Issue 7037027: Fixes Issues #5751 & #22631: NPObject identity (Closed)
Patch Set: fixes bogus change Created 9 years, 7 months 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
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef CONTENT_PLUGIN_PLUGIN_CHANNEL_BASE_H_ 5 #ifndef CONTENT_PLUGIN_PLUGIN_CHANNEL_BASE_H_
6 #define CONTENT_PLUGIN_PLUGIN_CHANNEL_BASE_H_ 6 #define CONTENT_PLUGIN_PLUGIN_CHANNEL_BASE_H_
7 #pragma once 7 #pragma once
8 8
9 #include <string> 9 #include <string>
10 10
11 #include "base/basictypes.h" 11 #include "base/basictypes.h"
12 #include "base/hash_tables.h" 12 #include "base/hash_tables.h"
13 #include "base/memory/ref_counted.h" 13 #include "base/memory/ref_counted.h"
14 #include "base/memory/scoped_ptr.h" 14 #include "base/memory/scoped_ptr.h"
15 #include "content/common/message_router.h" 15 #include "content/common/message_router.h"
16 #include "content/plugin/npobject_base.h" 16 #include "content/plugin/npobject_base.h"
17 #include "ipc/ipc_channel_handle.h" 17 #include "ipc/ipc_channel_handle.h"
18 #include "ipc/ipc_sync_channel.h" 18 #include "ipc/ipc_sync_channel.h"
19 #include "ui/gfx/native_widget_types.h" 19 #include "ui/gfx/native_widget_types.h"
20 20
21 namespace base { 21 namespace base {
22 class MessageLoopProxy; 22 class MessageLoopProxy;
23 } 23 }
24 24
25 #if defined(COMPILER_GCC)
26 namespace __gnu_cxx {
27
28 template<>
29 struct hash<NPObject*> {
30 std::size_t operator()(NPObject* const& ptr) const {
31 return hash<size_t>()(reinterpret_cast<size_t>(ptr));
32 }
33 };
34
35 } // namespace __gnu_cxx
36 #elif defined(COMPILER_MSVC)
37 namespace stdext {
38
39 template<>
40 inline size_t hash_value(NPObject* const& ptr) {
41 return hash_value(reinterpret_cast<size_t>(ptr));
42 }
43
44 } // namespace stdext
45 #endif // COMPILER
46
25 // Encapsulates an IPC channel between a renderer and a plugin process. 47 // Encapsulates an IPC channel between a renderer and a plugin process.
26 class PluginChannelBase : public IPC::Channel::Listener, 48 class PluginChannelBase : public IPC::Channel::Listener,
27 public IPC::Message::Sender, 49 public IPC::Message::Sender,
28 public base::RefCountedThreadSafe<PluginChannelBase> { 50 public base::RefCountedThreadSafe<PluginChannelBase> {
29 public: 51 public:
30 52
31 // WebPlugin[Delegate] call these on construction and destruction to setup 53 // WebPlugin[Delegate] call these on construction and destruction to setup
32 // the routing and manage lifetime of this object. This is also called by 54 // the routing and manage lifetime of this object. This is also called by
33 // NPObjectProxy and NPObjectStub. However the latter don't control the 55 // NPObjectProxy and NPObjectStub. However the latter don't control the
34 // lifetime of this object (by passing true for npobject) because we don't 56 // lifetime of this object (by passing true for npobject) because we don't
35 // want a leak of an NPObject in a plugin to keep the channel around longer 57 // want a leak of an NPObject in a plugin to keep the channel around longer
36 // than necessary. 58 // than necessary.
37 void AddRoute(int route_id, IPC::Channel::Listener* listener, 59 void AddRoute(int route_id, IPC::Channel::Listener* listener,
38 NPObjectBase* npobject); 60 NPObjectBase* npobject);
39 void RemoveRoute(int route_id); 61 void RemoveRoute(int route_id);
40 62
63
64 void AddMappingForProxy(int route_id, NPObject* object);
jam 2011/05/20 23:22:22 nit: we have several proxy/stub types. can you ca
Kelly Norton 2011/05/23 15:02:56 Done.
65 void RemoveMappingForProxy(int route_id);
66
67 void AddMappingForStub(int route_id, NPObject* object);
68 void RemoveMappingForStub(int route_id, NPObject* object);
69
70 NPObject* GetExistingProxy(int route_id);
71 int GetExistingRouteForStub(NPObject* npobject);
72
73
41 // IPC::Message::Sender implementation: 74 // IPC::Message::Sender implementation:
42 virtual bool Send(IPC::Message* msg); 75 virtual bool Send(IPC::Message* msg);
43 76
44 int peer_pid() { return peer_pid_; } 77 int peer_pid() { return peer_pid_; }
45 IPC::ChannelHandle channel_handle() const { return channel_handle_; } 78 IPC::ChannelHandle channel_handle() const { return channel_handle_; }
46 79
47 // Returns the number of open plugin channels in this process. 80 // Returns the number of open plugin channels in this process.
48 static int Count(); 81 static int Count();
49 82
50 // Returns a new route id. 83 // Returns a new route id.
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
115 int peer_pid_; 148 int peer_pid_;
116 149
117 // true when in the middle of a RemoveRoute call 150 // true when in the middle of a RemoveRoute call
118 bool in_remove_route_; 151 bool in_remove_route_;
119 152
120 // Keep track of all the registered NPObjects proxies/stubs so that when the 153 // Keep track of all the registered NPObjects proxies/stubs so that when the
121 // channel is closed we can inform them. 154 // channel is closed we can inform them.
122 typedef base::hash_map<int, NPObjectBase*> ListenerMap; 155 typedef base::hash_map<int, NPObjectBase*> ListenerMap;
123 ListenerMap npobject_listeners_; 156 ListenerMap npobject_listeners_;
124 157
158 typedef base::hash_map<int, NPObject*> ProxyMap;
159 ProxyMap proxy_map_;
160
161 typedef base::hash_map<NPObject*, int> StubMap;
162 StubMap stub_map_;
163
125 // Used to implement message routing functionality to WebPlugin[Delegate] 164 // Used to implement message routing functionality to WebPlugin[Delegate]
126 // objects 165 // objects
127 MessageRouter router_; 166 MessageRouter router_;
128 167
129 // A channel is invalid if it is disconnected as a result of a channel 168 // A channel is invalid if it is disconnected as a result of a channel
130 // error. This flag is used to indicate the same. 169 // error. This flag is used to indicate the same.
131 bool channel_valid_; 170 bool channel_valid_;
132 171
133 // Track whether we're dispatching a message with the unblock flag; works like 172 // Track whether we're dispatching a message with the unblock flag; works like
134 // a refcount, 0 when we're not. 173 // a refcount, 0 when we're not.
135 int in_unblock_dispatch_; 174 int in_unblock_dispatch_;
136 175
137 // If true, sync messages will only be marked as unblocking if the channel is 176 // If true, sync messages will only be marked as unblocking if the channel is
138 // in the middle of dispatching an unblocking message. 177 // in the middle of dispatching an unblocking message.
139 // The plugin process wants to avoid setting the unblock flag on its sync 178 // The plugin process wants to avoid setting the unblock flag on its sync
140 // messages unless necessary, since it can potentially introduce reentrancy 179 // messages unless necessary, since it can potentially introduce reentrancy
141 // into WebKit in ways that it doesn't expect (i.e. causing layout during 180 // into WebKit in ways that it doesn't expect (i.e. causing layout during
142 // paint). However to avoid deadlock, we must ensure that any message that's 181 // paint). However to avoid deadlock, we must ensure that any message that's
143 // sent as a result of a sync call from the renderer must unblock the 182 // sent as a result of a sync call from the renderer must unblock the
144 // renderer. We additionally have to do this for async messages from the 183 // renderer. We additionally have to do this for async messages from the
145 // renderer that have the unblock flag set, since they could be followed by a 184 // renderer that have the unblock flag set, since they could be followed by a
146 // sync message that won't get dispatched until the call to the renderer is 185 // sync message that won't get dispatched until the call to the renderer is
147 // complete. 186 // complete.
148 bool send_unblocking_only_during_unblock_dispatch_; 187 bool send_unblocking_only_during_unblock_dispatch_;
149 188
150 DISALLOW_COPY_AND_ASSIGN(PluginChannelBase); 189 DISALLOW_COPY_AND_ASSIGN(PluginChannelBase);
151 }; 190 };
152 191
153 #endif // CONTENT_PLUGIN_PLUGIN_CHANNEL_BASE_H_ 192 #endif // CONTENT_PLUGIN_PLUGIN_CHANNEL_BASE_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698