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

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

Issue 15757007: Revert 202364 "Track NPObject ownership by the originating plugi..." (Closed) Base URL: svn://svn.chromium.org/chrome/
Patch Set: 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
250 // Set the container before Initialize because the plugin may 246 // Set the container before Initialize because the plugin may
251 // synchronously call NPN_GetValue to get its container, or make calls 247 // synchronously call NPN_GetValue to get its container during its
252 // passing script objects that need to be tracked, during initialization. 248 // initialization.
253 SetContainer(container); 249 SetContainer(container);
254
255 bool ok = plugin_delegate->Initialize( 250 bool ok = plugin_delegate->Initialize(
256 plugin_url_, arg_names_, arg_values_, this, load_manually_); 251 plugin_url_, arg_names_, arg_values_, this, load_manually_);
257 if (!ok) { 252 if (!ok) {
258 LOG(ERROR) << "Couldn't initialize plug-in"; 253 LOG(ERROR) << "Couldn't initialize plug-in";
259 plugin_delegate->PluginDestroyed(); 254 plugin_delegate->PluginDestroyed();
260 255
261 WebKit::WebPlugin* replacement_plugin = 256 WebKit::WebPlugin* replacement_plugin =
262 page_delegate_->CreatePluginReplacement(file_path_); 257 page_delegate_->CreatePluginReplacement(file_path_);
263 if (!replacement_plugin || !replacement_plugin->initialize(container)) 258 if (!replacement_plugin || !replacement_plugin->initialize(container))
264 return false; 259 return false;
(...skipping 13 matching lines...) Expand all
278 base::MessageLoop::current()->DeleteSoon(FROM_HERE, this); 273 base::MessageLoop::current()->DeleteSoon(FROM_HERE, this);
279 } 274 }
280 275
281 NPObject* WebPluginImpl::scriptableObject() { 276 NPObject* WebPluginImpl::scriptableObject() {
282 if (!delegate_) 277 if (!delegate_)
283 return NULL; 278 return NULL;
284 279
285 return delegate_->GetPluginScriptableObject(); 280 return delegate_->GetPluginScriptableObject();
286 } 281 }
287 282
288 NPP WebPluginImpl::pluginNPP() {
289 return npp_;
290 }
291
292 bool WebPluginImpl::getFormValue(WebKit::WebString& value) { 283 bool WebPluginImpl::getFormValue(WebKit::WebString& value) {
293 if (!delegate_) 284 if (!delegate_)
294 return false; 285 return false;
295 base::string16 form_value; 286 base::string16 form_value;
296 if (!delegate_->GetFormValue(&form_value)) 287 if (!delegate_->GetFormValue(&form_value))
297 return false; 288 return false;
298 value = form_value; 289 value = form_value;
299 return true; 290 return true;
300 } 291 }
301 292
(...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after
486 const WebPluginParams& params, 477 const WebPluginParams& params,
487 const base::FilePath& file_path, 478 const base::FilePath& file_path,
488 const base::WeakPtr<WebPluginPageDelegate>& page_delegate) 479 const base::WeakPtr<WebPluginPageDelegate>& page_delegate)
489 : windowless_(false), 480 : windowless_(false),
490 window_(gfx::kNullPluginWindow), 481 window_(gfx::kNullPluginWindow),
491 accepts_input_events_(false), 482 accepts_input_events_(false),
492 page_delegate_(page_delegate), 483 page_delegate_(page_delegate),
493 webframe_(webframe), 484 webframe_(webframe),
494 delegate_(NULL), 485 delegate_(NULL),
495 container_(NULL), 486 container_(NULL),
496 npp_(NULL),
497 plugin_url_(params.url), 487 plugin_url_(params.url),
498 load_manually_(params.loadManually), 488 load_manually_(params.loadManually),
499 first_geometry_update_(true), 489 first_geometry_update_(true),
500 ignore_response_error_(false), 490 ignore_response_error_(false),
501 file_path_(file_path), 491 file_path_(file_path),
502 mime_type_(UTF16ToASCII(params.mimeType)), 492 mime_type_(UTF16ToASCII(params.mimeType)),
503 weak_factory_(this) { 493 weak_factory_(this) {
504 DCHECK_EQ(params.attributeNames.size(), params.attributeValues.size()); 494 DCHECK_EQ(params.attributeNames.size(), params.attributeValues.size());
505 StringToLowerASCII(&mime_type_); 495 StringToLowerASCII(&mime_type_);
506 496
(...skipping 551 matching lines...) Expand 10 before | Expand all | Expand 10 after
1058 RemoveClient(i); 1048 RemoveClient(i);
1059 return; 1049 return;
1060 } 1050 }
1061 } 1051 }
1062 } 1052 }
1063 1053
1064 void WebPluginImpl::SetContainer(WebPluginContainer* container) { 1054 void WebPluginImpl::SetContainer(WebPluginContainer* container) {
1065 if (!container) 1055 if (!container)
1066 TearDownPluginInstance(NULL); 1056 TearDownPluginInstance(NULL);
1067 container_ = container; 1057 container_ = container;
1068 if (container_)
1069 container_->allowScriptObjects();
1070 } 1058 }
1071 1059
1072 void WebPluginImpl::HandleURLRequest(const char* url, 1060 void WebPluginImpl::HandleURLRequest(const char* url,
1073 const char* method, 1061 const char* method,
1074 const char* target, 1062 const char* target,
1075 const char* buf, 1063 const char* buf,
1076 unsigned int len, 1064 unsigned int len,
1077 int notify_id, 1065 int notify_id,
1078 bool popups_allowed, 1066 bool popups_allowed,
1079 bool notify_redirects) { 1067 bool notify_redirects) {
(...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after
1338 1326
1339 // The plugin move sequences accumulated via DidMove are sent to the browser 1327 // The plugin move sequences accumulated via DidMove are sent to the browser
1340 // whenever the renderer paints. Force a paint here to ensure that changes 1328 // whenever the renderer paints. Force a paint here to ensure that changes
1341 // to the plugin window are propagated to the browser. 1329 // to the plugin window are propagated to the browser.
1342 container_->invalidate(); 1330 container_->invalidate();
1343 return true; 1331 return true;
1344 } 1332 }
1345 1333
1346 void WebPluginImpl::TearDownPluginInstance( 1334 void WebPluginImpl::TearDownPluginInstance(
1347 WebURLLoader* loader_to_ignore) { 1335 WebURLLoader* loader_to_ignore) {
1348 // JavaScript garbage collection may cause plugin script object references to 1336 // The container maintains a list of JSObjects which are related to this
1349 // be retained long after the plugin is destroyed. Some plugins won't cope 1337 // plugin. Tell the frame we're gone so that it can invalidate all of
1350 // with their objects being released after they've been destroyed, and once 1338 // those sub JSObjects.
1351 // we've actually unloaded the plugin the object's releaseobject() code may
1352 // no longer be in memory. The container tracks the plugin's objects and lets
1353 // us invalidate them, releasing the references to them held by the JavaScript
1354 // runtime.
1355 if (container_) { 1339 if (container_) {
1356 container_->clearScriptObjects(); 1340 container_->clearScriptObjects();
1357 container_->setWebLayer(NULL); 1341 container_->setWebLayer(NULL);
1358 } 1342 }
1359 1343
1360 // Call PluginDestroyed() first to prevent the plugin from calling us back
1361 // in the middle of tearing down the render tree.
1362 if (delegate_) { 1344 if (delegate_) {
1363 // The plugin may call into the browser and pass script objects even during 1345 // Call PluginDestroyed() first to prevent the plugin from calling us back
1364 // teardown, so temporarily re-enable plugin script objects. 1346 // in the middle of tearing down the render tree.
1365 DCHECK(container_);
1366 container_->allowScriptObjects();
1367
1368 delegate_->PluginDestroyed(); 1347 delegate_->PluginDestroyed();
1369 delegate_ = NULL; 1348 delegate_ = NULL;
1370
1371 // Invalidate any script objects created during teardown here, before the
1372 // plugin might actually be unloaded.
1373 container_->clearScriptObjects();
1374 } 1349 }
1375 1350
1376 // Cancel any pending requests because otherwise this deleted object will 1351 // Cancel any pending requests because otherwise this deleted object will
1377 // be called by the ResourceDispatcher. 1352 // be called by the ResourceDispatcher.
1378 std::vector<ClientInfo>::iterator client_index = clients_.begin(); 1353 std::vector<ClientInfo>::iterator client_index = clients_.begin();
1379 while (client_index != clients_.end()) { 1354 while (client_index != clients_.end()) {
1380 ClientInfo& client_info = *client_index; 1355 ClientInfo& client_info = *client_index;
1381 1356
1382 if (loader_to_ignore == client_info.loader) { 1357 if (loader_to_ignore == client_info.loader) {
1383 client_index++; 1358 client_index++;
(...skipping 23 matching lines...) Expand all
1407 webframe_->setReferrerForRequest(*request, plugin_url_); 1382 webframe_->setReferrerForRequest(*request, plugin_url_);
1408 break; 1383 break;
1409 1384
1410 default: 1385 default:
1411 break; 1386 break;
1412 } 1387 }
1413 } 1388 }
1414 1389
1415 } // namespace npapi 1390 } // namespace npapi
1416 } // namespace webkit 1391 } // namespace webkit
OLDNEW
« no previous file with comments | « trunk/src/webkit/plugins/npapi/webplugin_impl.h ('k') | trunk/src/webkit/plugins/ppapi/message_channel.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698