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

Side by Side Diff: webkit/plugins/npapi/webplugin_impl.cc

Issue 15007012: Track NPObject ownership by the originating plugins' NPP identifier. [2/3] (Chrome) (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Add missing includes. Created 7 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "webkit/plugins/npapi/webplugin_impl.h" 5 #include "webkit/plugins/npapi/webplugin_impl.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/debug/crash_logging.h" 8 #include "base/debug/crash_logging.h"
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/memory/linked_ptr.h" 10 #include "base/memory/linked_ptr.h"
(...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after
236 if (!page_delegate_) { 236 if (!page_delegate_) {
237 LOG(ERROR) << "No page delegate"; 237 LOG(ERROR) << "No page delegate";
238 return false; 238 return false;
239 } 239 }
240 240
241 WebPluginDelegate* plugin_delegate = page_delegate_->CreatePluginDelegate( 241 WebPluginDelegate* plugin_delegate = page_delegate_->CreatePluginDelegate(
242 file_path_, mime_type_); 242 file_path_, mime_type_);
243 if (!plugin_delegate) 243 if (!plugin_delegate)
244 return false; 244 return false;
245 245
246 // Store the plugin's unique identifier, used by the container to track its
247 // script objects.
248 npp_ = plugin_delegate->GetPluginNPP();
249
246 // Set the container before Initialize because the plugin may 250 // Set the container before Initialize because the plugin may
247 // synchronously call NPN_GetValue to get its container during its 251 // synchronously call NPN_GetValue to get its container, or make calls
248 // initialization. 252 // passing script objects that need to be tracked, during initialization.
249 SetContainer(container); 253 SetContainer(container);
254
250 bool ok = plugin_delegate->Initialize( 255 bool ok = plugin_delegate->Initialize(
251 plugin_url_, arg_names_, arg_values_, this, load_manually_); 256 plugin_url_, arg_names_, arg_values_, this, load_manually_);
252 if (!ok) { 257 if (!ok) {
253 LOG(ERROR) << "Couldn't initialize plug-in"; 258 LOG(ERROR) << "Couldn't initialize plug-in";
254 plugin_delegate->PluginDestroyed(); 259 plugin_delegate->PluginDestroyed();
255 260
256 WebKit::WebPlugin* replacement_plugin = 261 WebKit::WebPlugin* replacement_plugin =
257 page_delegate_->CreatePluginReplacement(file_path_); 262 page_delegate_->CreatePluginReplacement(file_path_);
258 if (!replacement_plugin || !replacement_plugin->initialize(container)) 263 if (!replacement_plugin || !replacement_plugin->initialize(container))
259 return false; 264 return false;
(...skipping 13 matching lines...) Expand all
273 base::MessageLoop::current()->DeleteSoon(FROM_HERE, this); 278 base::MessageLoop::current()->DeleteSoon(FROM_HERE, this);
274 } 279 }
275 280
276 NPObject* WebPluginImpl::scriptableObject() { 281 NPObject* WebPluginImpl::scriptableObject() {
277 if (!delegate_) 282 if (!delegate_)
278 return NULL; 283 return NULL;
279 284
280 return delegate_->GetPluginScriptableObject(); 285 return delegate_->GetPluginScriptableObject();
281 } 286 }
282 287
288 NPP WebPluginImpl::pluginNPP() {
289 CHECK(npp_);
290 // if (!delegate_)
291 // return NULL;
292
293 return npp_; // delegate_->GetPluginNPP();
jamesr 2013/05/15 22:32:15 hmm? what's up with the commented-out code here?
Wez 2013/05/15 23:14:16 Sorry, looks like this patch-set is stale. :(
294 }
295
283 bool WebPluginImpl::getFormValue(WebKit::WebString& value) { 296 bool WebPluginImpl::getFormValue(WebKit::WebString& value) {
284 if (!delegate_) 297 if (!delegate_)
285 return false; 298 return false;
286 base::string16 form_value; 299 base::string16 form_value;
287 if (!delegate_->GetFormValue(&form_value)) 300 if (!delegate_->GetFormValue(&form_value))
288 return false; 301 return false;
289 value = form_value; 302 value = form_value;
290 return true; 303 return true;
291 } 304 }
292 305
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after
468 const WebPluginParams& params, 481 const WebPluginParams& params,
469 const base::FilePath& file_path, 482 const base::FilePath& file_path,
470 const base::WeakPtr<WebPluginPageDelegate>& page_delegate) 483 const base::WeakPtr<WebPluginPageDelegate>& page_delegate)
471 : windowless_(false), 484 : windowless_(false),
472 window_(gfx::kNullPluginWindow), 485 window_(gfx::kNullPluginWindow),
473 accepts_input_events_(false), 486 accepts_input_events_(false),
474 page_delegate_(page_delegate), 487 page_delegate_(page_delegate),
475 webframe_(webframe), 488 webframe_(webframe),
476 delegate_(NULL), 489 delegate_(NULL),
477 container_(NULL), 490 container_(NULL),
491 npp_(NULL),
478 plugin_url_(params.url), 492 plugin_url_(params.url),
479 load_manually_(params.loadManually), 493 load_manually_(params.loadManually),
480 first_geometry_update_(true), 494 first_geometry_update_(true),
481 ignore_response_error_(false), 495 ignore_response_error_(false),
482 file_path_(file_path), 496 file_path_(file_path),
483 mime_type_(UTF16ToASCII(params.mimeType)), 497 mime_type_(UTF16ToASCII(params.mimeType)),
484 weak_factory_(this) { 498 weak_factory_(this) {
485 DCHECK_EQ(params.attributeNames.size(), params.attributeValues.size()); 499 DCHECK_EQ(params.attributeNames.size(), params.attributeValues.size());
486 StringToLowerASCII(&mime_type_); 500 StringToLowerASCII(&mime_type_);
487 501
(...skipping 551 matching lines...) Expand 10 before | Expand all | Expand 10 after
1039 RemoveClient(i); 1053 RemoveClient(i);
1040 return; 1054 return;
1041 } 1055 }
1042 } 1056 }
1043 } 1057 }
1044 1058
1045 void WebPluginImpl::SetContainer(WebPluginContainer* container) { 1059 void WebPluginImpl::SetContainer(WebPluginContainer* container) {
1046 if (!container) 1060 if (!container)
1047 TearDownPluginInstance(NULL); 1061 TearDownPluginInstance(NULL);
1048 container_ = container; 1062 container_ = container;
1063 if (container_)
1064 container_->allowScriptObjects();
1049 } 1065 }
1050 1066
1051 void WebPluginImpl::HandleURLRequest(const char* url, 1067 void WebPluginImpl::HandleURLRequest(const char* url,
1052 const char* method, 1068 const char* method,
1053 const char* target, 1069 const char* target,
1054 const char* buf, 1070 const char* buf,
1055 unsigned int len, 1071 unsigned int len,
1056 int notify_id, 1072 int notify_id,
1057 bool popups_allowed, 1073 bool popups_allowed,
1058 bool notify_redirects) { 1074 bool notify_redirects) {
(...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after
1317 1333
1318 // The plugin move sequences accumulated via DidMove are sent to the browser 1334 // The plugin move sequences accumulated via DidMove are sent to the browser
1319 // whenever the renderer paints. Force a paint here to ensure that changes 1335 // whenever the renderer paints. Force a paint here to ensure that changes
1320 // to the plugin window are propagated to the browser. 1336 // to the plugin window are propagated to the browser.
1321 container_->invalidate(); 1337 container_->invalidate();
1322 return true; 1338 return true;
1323 } 1339 }
1324 1340
1325 void WebPluginImpl::TearDownPluginInstance( 1341 void WebPluginImpl::TearDownPluginInstance(
1326 WebURLLoader* loader_to_ignore) { 1342 WebURLLoader* loader_to_ignore) {
1327 // The container maintains a list of JSObjects which are related to this 1343 // JavaScript garbage collection may cause plugin script object references to
1328 // plugin. Tell the frame we're gone so that it can invalidate all of 1344 // be retained long after the plugin is destroyed. Some plugins won't cope
1329 // those sub JSObjects. 1345 // with their objects being released after they've been destroyed, and once
1346 // we've actually unloaded the plugin the object's releaseobject() code may
1347 // no longer be in memory. The container tracks the plugin's objects and lets
1348 // us invalidate them, releasing the references to them held by the JavaScript
1349 // runtime.
1330 if (container_) { 1350 if (container_) {
1331 container_->clearScriptObjects(); 1351 container_->clearScriptObjects();
1332 container_->setWebLayer(NULL); 1352 container_->setWebLayer(NULL);
1333 } 1353 }
1334 1354
1355 // Call PluginDestroyed() first to prevent the plugin from calling us back
1356 // in the middle of tearing down the render tree.
1335 if (delegate_) { 1357 if (delegate_) {
1336 // Call PluginDestroyed() first to prevent the plugin from calling us back 1358 // The plugin may call into the browser and pass script objects even during
1337 // in the middle of tearing down the render tree. 1359 // teardown, so temporarily re-enable plugin script objects.
1360 DCHECK(container_);
1361 container_->allowScriptObjects();
1362
1338 delegate_->PluginDestroyed(); 1363 delegate_->PluginDestroyed();
1339 delegate_ = NULL; 1364 delegate_ = NULL;
1365
1366 // Invalidate any script objects created during teardown here, before the
1367 // plugin might actually be unloaded.
1368 container_->clearScriptObjects();
1340 } 1369 }
1341 1370
1342 // Cancel any pending requests because otherwise this deleted object will 1371 // Cancel any pending requests because otherwise this deleted object will
1343 // be called by the ResourceDispatcher. 1372 // be called by the ResourceDispatcher.
1344 std::vector<ClientInfo>::iterator client_index = clients_.begin(); 1373 std::vector<ClientInfo>::iterator client_index = clients_.begin();
1345 while (client_index != clients_.end()) { 1374 while (client_index != clients_.end()) {
1346 ClientInfo& client_info = *client_index; 1375 ClientInfo& client_info = *client_index;
1347 1376
1348 if (loader_to_ignore == client_info.loader) { 1377 if (loader_to_ignore == client_info.loader) {
1349 client_index++; 1378 client_index++;
(...skipping 23 matching lines...) Expand all
1373 webframe_->setReferrerForRequest(*request, plugin_url_); 1402 webframe_->setReferrerForRequest(*request, plugin_url_);
1374 break; 1403 break;
1375 1404
1376 default: 1405 default:
1377 break; 1406 break;
1378 } 1407 }
1379 } 1408 }
1380 1409
1381 } // namespace npapi 1410 } // namespace npapi
1382 } // namespace webkit 1411 } // namespace webkit
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698