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

Side by Side Diff: chrome/plugin/npobject_stub.cc

Issue 155238: Add the page url to plugin crashes to aid debugging. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 11 years, 5 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 | Annotate | Revision Log
« no previous file with comments | « chrome/plugin/npobject_stub.h ('k') | chrome/plugin/npobject_util.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2006-2008 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 #include "chrome/plugin/npobject_stub.h" 5 #include "chrome/plugin/npobject_stub.h"
6 6
7 #include "chrome/common/child_process_logging.h"
7 #include "chrome/common/plugin_messages.h" 8 #include "chrome/common/plugin_messages.h"
8 #include "chrome/plugin/npobject_util.h" 9 #include "chrome/plugin/npobject_util.h"
9 #include "chrome/plugin/plugin_channel_base.h" 10 #include "chrome/plugin/plugin_channel_base.h"
10 #include "chrome/renderer/webplugin_delegate_proxy.h" 11 #include "chrome/renderer/webplugin_delegate_proxy.h"
11 #include "third_party/npapi/bindings/npapi.h" 12 #include "third_party/npapi/bindings/npapi.h"
12 #include "third_party/npapi/bindings/npruntime.h" 13 #include "third_party/npapi/bindings/npruntime.h"
13 14
14 NPObjectStub::NPObjectStub( 15 NPObjectStub::NPObjectStub(
15 NPObject* npobject, 16 NPObject* npobject,
16 PluginChannelBase* channel, 17 PluginChannelBase* channel,
17 int route_id, 18 int route_id,
18 base::WaitableEvent* modal_dialog_event) 19 base::WaitableEvent* modal_dialog_event,
20 const GURL& page_url)
19 : npobject_(npobject), 21 : npobject_(npobject),
20 channel_(channel), 22 channel_(channel),
21 route_id_(route_id), 23 route_id_(route_id),
22 valid_(true), 24 valid_(true),
23 web_plugin_delegate_proxy_(NULL), 25 web_plugin_delegate_proxy_(NULL),
24 modal_dialog_event_(modal_dialog_event) { 26 modal_dialog_event_(modal_dialog_event),
27 page_url_(page_url) {
25 channel_->AddRoute(route_id, this, true); 28 channel_->AddRoute(route_id, this, true);
26 29
27 // We retain the object just as PluginHost does if everything was in-process. 30 // We retain the object just as PluginHost does if everything was in-process.
28 NPN_RetainObject(npobject_); 31 NPN_RetainObject(npobject_);
29 } 32 }
30 33
31 NPObjectStub::~NPObjectStub() { 34 NPObjectStub::~NPObjectStub() {
32 if (web_plugin_delegate_proxy_) 35 if (web_plugin_delegate_proxy_)
33 web_plugin_delegate_proxy_->DropWindowScriptObject(); 36 web_plugin_delegate_proxy_->DropWindowScriptObject();
34 37
35 channel_->RemoveRoute(route_id_); 38 channel_->RemoveRoute(route_id_);
36 if (npobject_ && valid_) 39 if (npobject_ && valid_)
37 NPN_ReleaseObject(npobject_); 40 NPN_ReleaseObject(npobject_);
38 } 41 }
39 42
40 bool NPObjectStub::Send(IPC::Message* msg) { 43 bool NPObjectStub::Send(IPC::Message* msg) {
41 return channel_->Send(msg); 44 return channel_->Send(msg);
42 } 45 }
43 46
44 void NPObjectStub::OnMessageReceived(const IPC::Message& msg) { 47 void NPObjectStub::OnMessageReceived(const IPC::Message& msg) {
48 child_process_logging::ScopedActiveURLSetter url_setter(page_url_);
49
45 if (!valid_) { 50 if (!valid_) {
46 if (msg.is_sync()) { 51 if (msg.is_sync()) {
47 // The object could be garbage because the frame has gone away, so 52 // The object could be garbage because the frame has gone away, so
48 // just send an error reply to the caller. 53 // just send an error reply to the caller.
49 IPC::Message* reply = IPC::SyncMessage::GenerateReply(&msg); 54 IPC::Message* reply = IPC::SyncMessage::GenerateReply(&msg);
50 reply->set_reply_error(); 55 reply->set_reply_error();
51 Send(reply); 56 Send(reply);
52 } 57 }
53 58
54 return; 59 return;
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
110 bool return_value = false; 115 bool return_value = false;
111 NPVariant_Param result_param; 116 NPVariant_Param result_param;
112 NPVariant result_var; 117 NPVariant result_var;
113 118
114 VOID_TO_NPVARIANT(result_var); 119 VOID_TO_NPVARIANT(result_var);
115 120
116 int arg_count = static_cast<int>(args.size()); 121 int arg_count = static_cast<int>(args.size());
117 NPVariant* args_var = new NPVariant[arg_count]; 122 NPVariant* args_var = new NPVariant[arg_count];
118 for (int i = 0; i < arg_count; ++i) { 123 for (int i = 0; i < arg_count; ++i) {
119 CreateNPVariant( 124 CreateNPVariant(
120 args[i], local_channel, &(args_var[i]), modal_dialog_event_); 125 args[i], local_channel, &(args_var[i]), modal_dialog_event_,
126 page_url_);
121 } 127 }
122 128
123 if (is_default) { 129 if (is_default) {
124 if (IsPluginProcess()) { 130 if (IsPluginProcess()) {
125 if (npobject_->_class->invokeDefault) { 131 if (npobject_->_class->invokeDefault) {
126 return_value = npobject_->_class->invokeDefault( 132 return_value = npobject_->_class->invokeDefault(
127 npobject_, args_var, arg_count, &result_var); 133 npobject_, args_var, arg_count, &result_var);
128 } else { 134 } else {
129 return_value = false; 135 return_value = false;
130 } 136 }
(...skipping 15 matching lines...) Expand all
146 0, npobject_, id, args_var, arg_count, &result_var); 152 0, npobject_, id, args_var, arg_count, &result_var);
147 } 153 }
148 } 154 }
149 155
150 for (int i = 0; i < arg_count; ++i) 156 for (int i = 0; i < arg_count; ++i)
151 NPN_ReleaseVariantValue(&(args_var[i])); 157 NPN_ReleaseVariantValue(&(args_var[i]));
152 158
153 delete[] args_var; 159 delete[] args_var;
154 160
155 CreateNPVariantParam( 161 CreateNPVariantParam(
156 result_var, local_channel, &result_param, true, modal_dialog_event_); 162 result_var, local_channel, &result_param, true, modal_dialog_event_,
163 page_url_);
157 NPObjectMsg_Invoke::WriteReplyParams(reply_msg, result_param, return_value); 164 NPObjectMsg_Invoke::WriteReplyParams(reply_msg, result_param, return_value);
158 local_channel->Send(reply_msg); 165 local_channel->Send(reply_msg);
159 } 166 }
160 167
161 void NPObjectStub::OnHasProperty(const NPIdentifier_Param& name, 168 void NPObjectStub::OnHasProperty(const NPIdentifier_Param& name,
162 bool* result) { 169 bool* result) {
163 NPIdentifier id = CreateNPIdentifier(name); 170 NPIdentifier id = CreateNPIdentifier(name);
164 if (IsPluginProcess()) { 171 if (IsPluginProcess()) {
165 if (npobject_->_class->hasProperty) { 172 if (npobject_->_class->hasProperty) {
166 *result = npobject_->_class->hasProperty(npobject_, id); 173 *result = npobject_->_class->hasProperty(npobject_, id);
(...skipping 16 matching lines...) Expand all
183 if (npobject_->_class->getProperty) { 190 if (npobject_->_class->getProperty) {
184 *result = npobject_->_class->getProperty(npobject_, id, &result_var); 191 *result = npobject_->_class->getProperty(npobject_, id, &result_var);
185 } else { 192 } else {
186 *result = false; 193 *result = false;
187 } 194 }
188 } else { 195 } else {
189 *result = NPN_GetProperty(0, npobject_, id, &result_var); 196 *result = NPN_GetProperty(0, npobject_, id, &result_var);
190 } 197 }
191 198
192 CreateNPVariantParam( 199 CreateNPVariantParam(
193 result_var, channel_, property, true, modal_dialog_event_); 200 result_var, channel_, property, true, modal_dialog_event_, page_url_);
194 } 201 }
195 202
196 void NPObjectStub::OnSetProperty(const NPIdentifier_Param& name, 203 void NPObjectStub::OnSetProperty(const NPIdentifier_Param& name,
197 const NPVariant_Param& property, 204 const NPVariant_Param& property,
198 bool* result) { 205 bool* result) {
199 NPVariant result_var; 206 NPVariant result_var;
200 VOID_TO_NPVARIANT(result_var); 207 VOID_TO_NPVARIANT(result_var);
201 NPIdentifier id = CreateNPIdentifier(name); 208 NPIdentifier id = CreateNPIdentifier(name);
202 NPVariant property_var; 209 NPVariant property_var;
203 CreateNPVariant(property, channel_, &property_var, modal_dialog_event_); 210 CreateNPVariant(
211 property, channel_, &property_var, modal_dialog_event_, page_url_);
204 212
205 if (IsPluginProcess()) { 213 if (IsPluginProcess()) {
206 if (npobject_->_class->setProperty) { 214 if (npobject_->_class->setProperty) {
207 *result = npobject_->_class->setProperty(npobject_, id, &property_var); 215 *result = npobject_->_class->setProperty(npobject_, id, &property_var);
208 } else { 216 } else {
209 *result = false; 217 *result = false;
210 } 218 }
211 } else { 219 } else {
212 *result = NPN_SetProperty(0, npobject_, id, &property_var); 220 *result = NPN_SetProperty(0, npobject_, id, &property_var);
213 } 221 }
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
274 bool return_value = false; 282 bool return_value = false;
275 NPVariant_Param result_param; 283 NPVariant_Param result_param;
276 NPVariant result_var; 284 NPVariant result_var;
277 285
278 VOID_TO_NPVARIANT(result_var); 286 VOID_TO_NPVARIANT(result_var);
279 287
280 int arg_count = static_cast<int>(args.size()); 288 int arg_count = static_cast<int>(args.size());
281 NPVariant* args_var = new NPVariant[arg_count]; 289 NPVariant* args_var = new NPVariant[arg_count];
282 for (int i = 0; i < arg_count; ++i) { 290 for (int i = 0; i < arg_count; ++i) {
283 CreateNPVariant( 291 CreateNPVariant(
284 args[i], local_channel, &(args_var[i]), modal_dialog_event_); 292 args[i], local_channel, &(args_var[i]), modal_dialog_event_, page_url_);
285 } 293 }
286 294
287 if (IsPluginProcess()) { 295 if (IsPluginProcess()) {
288 if (npobject_->_class->construct) { 296 if (npobject_->_class->construct) {
289 return_value = npobject_->_class->construct( 297 return_value = npobject_->_class->construct(
290 npobject_, args_var, arg_count, &result_var); 298 npobject_, args_var, arg_count, &result_var);
291 } else { 299 } else {
292 return_value = false; 300 return_value = false;
293 } 301 }
294 } else { 302 } else {
295 return_value = NPN_Construct( 303 return_value = NPN_Construct(
296 0, npobject_, args_var, arg_count, &result_var); 304 0, npobject_, args_var, arg_count, &result_var);
297 } 305 }
298 306
299 for (int i = 0; i < arg_count; ++i) 307 for (int i = 0; i < arg_count; ++i)
300 NPN_ReleaseVariantValue(&(args_var[i])); 308 NPN_ReleaseVariantValue(&(args_var[i]));
301 309
302 delete[] args_var; 310 delete[] args_var;
303 311
304 CreateNPVariantParam( 312 CreateNPVariantParam(
305 result_var, local_channel, &result_param, true, modal_dialog_event_); 313 result_var, local_channel, &result_param, true, modal_dialog_event_,
314 page_url_);
306 NPObjectMsg_Invoke::WriteReplyParams(reply_msg, result_param, return_value); 315 NPObjectMsg_Invoke::WriteReplyParams(reply_msg, result_param, return_value);
307 local_channel->Send(reply_msg); 316 local_channel->Send(reply_msg);
308 } 317 }
309 318
310 void NPObjectStub::OnEvaluate(const std::string& script, 319 void NPObjectStub::OnEvaluate(const std::string& script,
311 bool popups_allowed, 320 bool popups_allowed,
312 IPC::Message* reply_msg) { 321 IPC::Message* reply_msg) {
313 if (IsPluginProcess()) { 322 if (IsPluginProcess()) {
314 NOTREACHED() << "Should only be called on NPObjects in the renderer"; 323 NOTREACHED() << "Should only be called on NPObjects in the renderer";
315 return; 324 return;
316 } 325 }
317 326
318 // Grab a reference to the underlying channel, as the NPObjectStub 327 // Grab a reference to the underlying channel, as the NPObjectStub
319 // instance can be destroyed in the context of NPN_Evaluate. This 328 // instance can be destroyed in the context of NPN_Evaluate. This
320 // can happen if the containing plugin instance is destroyed in 329 // can happen if the containing plugin instance is destroyed in
321 // NPN_Evaluate. 330 // NPN_Evaluate.
322 scoped_refptr<PluginChannelBase> local_channel = channel_; 331 scoped_refptr<PluginChannelBase> local_channel = channel_;
323 332
324 NPVariant result_var; 333 NPVariant result_var;
325 NPString script_string; 334 NPString script_string;
326 script_string.UTF8Characters = script.c_str(); 335 script_string.UTF8Characters = script.c_str();
327 script_string.UTF8Length = static_cast<unsigned int>(script.length()); 336 script_string.UTF8Length = static_cast<unsigned int>(script.length());
328 337
329 bool return_value = NPN_EvaluateHelper(0, popups_allowed, npobject_, 338 bool return_value = NPN_EvaluateHelper(0, popups_allowed, npobject_,
330 &script_string, &result_var); 339 &script_string, &result_var);
331 340
332 NPVariant_Param result_param; 341 NPVariant_Param result_param;
333 CreateNPVariantParam( 342 CreateNPVariantParam(
334 result_var, local_channel, &result_param, true, modal_dialog_event_); 343 result_var, local_channel, &result_param, true, modal_dialog_event_,
344 page_url_);
335 NPObjectMsg_Evaluate::WriteReplyParams(reply_msg, result_param, return_value); 345 NPObjectMsg_Evaluate::WriteReplyParams(reply_msg, result_param, return_value);
336 local_channel->Send(reply_msg); 346 local_channel->Send(reply_msg);
337 } 347 }
338 348
339 void NPObjectStub::OnSetException(const std::string& message) { 349 void NPObjectStub::OnSetException(const std::string& message) {
340 if (IsPluginProcess()) { 350 if (IsPluginProcess()) {
341 NOTREACHED() << "Should only be called on NPObjects in the renderer"; 351 NOTREACHED() << "Should only be called on NPObjects in the renderer";
342 return; 352 return;
343 } 353 }
344 354
345 NPN_SetException(npobject_, message.c_str()); 355 NPN_SetException(npobject_, message.c_str());
346 } 356 }
OLDNEW
« no previous file with comments | « chrome/plugin/npobject_stub.h ('k') | chrome/plugin/npobject_util.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698