| OLD | NEW |
| 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 "content/renderer/npapi/webplugin_impl.h" | 5 #include "content/renderer/npapi/webplugin_impl.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
| 9 #include "base/debug/crash_logging.h" | 9 #include "base/debug/crash_logging.h" |
| 10 #include "base/location.h" | 10 #include "base/location.h" |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 91 | 91 |
| 92 bool WebPluginImpl::initialize(WebPluginContainer* container) { | 92 bool WebPluginImpl::initialize(WebPluginContainer* container) { |
| 93 if (!render_view_.get()) { | 93 if (!render_view_.get()) { |
| 94 LOG(ERROR) << "No RenderView"; | 94 LOG(ERROR) << "No RenderView"; |
| 95 return false; | 95 return false; |
| 96 } | 96 } |
| 97 | 97 |
| 98 WebPluginDelegateProxy* plugin_delegate = new WebPluginDelegateProxy( | 98 WebPluginDelegateProxy* plugin_delegate = new WebPluginDelegateProxy( |
| 99 this, mime_type_, render_view_, render_frame_); | 99 this, mime_type_, render_view_, render_frame_); |
| 100 | 100 |
| 101 // Store the plugin's unique identifier, used by the container to track its | |
| 102 // script objects. | |
| 103 npp_ = plugin_delegate->GetPluginNPP(); | |
| 104 | |
| 105 // Set the container before Initialize because the plugin may | 101 // Set the container before Initialize because the plugin may |
| 106 // synchronously call NPN_GetValue to get its container, or make calls | 102 // synchronously call NPN_GetValue to get its container, or make calls |
| 107 // passing script objects that need to be tracked, during initialization. | 103 // passing script objects that need to be tracked, during initialization. |
| 108 SetContainer(container); | 104 SetContainer(container); |
| 109 | 105 |
| 110 bool ok = plugin_delegate->Initialize( | 106 bool ok = plugin_delegate->Initialize( |
| 111 plugin_url_, arg_names_, arg_values_, load_manually_); | 107 plugin_url_, arg_names_, arg_values_, load_manually_); |
| 112 if (!ok) { | 108 if (!ok) { |
| 113 plugin_delegate->PluginDestroyed(); | 109 plugin_delegate->PluginDestroyed(); |
| 114 | 110 |
| (...skipping 25 matching lines...) Expand all Loading... |
| 140 delegate_ = plugin_delegate; | 136 delegate_ = plugin_delegate; |
| 141 | 137 |
| 142 return true; | 138 return true; |
| 143 } | 139 } |
| 144 | 140 |
| 145 void WebPluginImpl::destroy() { | 141 void WebPluginImpl::destroy() { |
| 146 SetContainer(NULL); | 142 SetContainer(NULL); |
| 147 base::MessageLoop::current()->DeleteSoon(FROM_HERE, this); | 143 base::MessageLoop::current()->DeleteSoon(FROM_HERE, this); |
| 148 } | 144 } |
| 149 | 145 |
| 150 NPObject* WebPluginImpl::scriptableObject() { | |
| 151 if (!delegate_) | |
| 152 return NULL; | |
| 153 | |
| 154 return delegate_->GetPluginScriptableObject(); | |
| 155 } | |
| 156 | |
| 157 NPP WebPluginImpl::pluginNPP() { | |
| 158 return npp_; | |
| 159 } | |
| 160 | |
| 161 bool WebPluginImpl::getFormValue(blink::WebString& value) { | 146 bool WebPluginImpl::getFormValue(blink::WebString& value) { |
| 162 if (!delegate_) | 147 if (!delegate_) |
| 163 return false; | 148 return false; |
| 164 base::string16 form_value; | 149 base::string16 form_value; |
| 165 if (!delegate_->GetFormValue(&form_value)) | 150 if (!delegate_->GetFormValue(&form_value)) |
| 166 return false; | 151 return false; |
| 167 value = form_value; | 152 value = form_value; |
| 168 return true; | 153 return true; |
| 169 } | 154 } |
| 170 | 155 |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 268 WebFrame* webframe, | 253 WebFrame* webframe, |
| 269 const WebPluginParams& params, | 254 const WebPluginParams& params, |
| 270 const base::FilePath& file_path, | 255 const base::FilePath& file_path, |
| 271 const base::WeakPtr<RenderViewImpl>& render_view, | 256 const base::WeakPtr<RenderViewImpl>& render_view, |
| 272 RenderFrameImpl* render_frame) | 257 RenderFrameImpl* render_frame) |
| 273 : render_frame_(render_frame), | 258 : render_frame_(render_frame), |
| 274 render_view_(render_view), | 259 render_view_(render_view), |
| 275 webframe_(webframe), | 260 webframe_(webframe), |
| 276 delegate_(NULL), | 261 delegate_(NULL), |
| 277 container_(NULL), | 262 container_(NULL), |
| 278 npp_(NULL), | |
| 279 plugin_url_(params.url), | 263 plugin_url_(params.url), |
| 280 load_manually_(params.loadManually), | 264 load_manually_(params.loadManually), |
| 281 first_geometry_update_(true), | 265 first_geometry_update_(true), |
| 282 ignore_response_error_(false), | 266 ignore_response_error_(false), |
| 283 file_path_(file_path), | 267 file_path_(file_path), |
| 284 mime_type_(base::ToLowerASCII(base::UTF16ToASCII( | 268 mime_type_(base::ToLowerASCII(base::UTF16ToASCII( |
| 285 base::StringPiece16(params.mimeType)))) { | 269 base::StringPiece16(params.mimeType)))) { |
| 286 DCHECK_EQ(params.attributeNames.size(), params.attributeValues.size()); | 270 DCHECK_EQ(params.attributeNames.size(), params.attributeValues.size()); |
| 287 | 271 |
| 288 for (size_t i = 0; i < params.attributeNames.size(); ++i) { | 272 for (size_t i = 0; i < params.attributeNames.size(); ++i) { |
| (...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 429 // to recover at this point. Break out. | 413 // to recover at this point. Break out. |
| 430 NOTREACHED(); | 414 NOTREACHED(); |
| 431 return ROUTED; | 415 return ROUTED; |
| 432 } | 416 } |
| 433 } | 417 } |
| 434 | 418 |
| 435 container_->loadFrameRequest(request, target_str); | 419 container_->loadFrameRequest(request, target_str); |
| 436 return ROUTED; | 420 return ROUTED; |
| 437 } | 421 } |
| 438 | 422 |
| 439 NPObject* WebPluginImpl::GetWindowScriptNPObject() { | |
| 440 if (!webframe_) { | |
| 441 NOTREACHED(); | |
| 442 return NULL; | |
| 443 } | |
| 444 return webframe_->windowObject(); | |
| 445 } | |
| 446 | |
| 447 NPObject* WebPluginImpl::GetPluginElement() { | |
| 448 return container_->scriptableObjectForElement(); | |
| 449 } | |
| 450 | |
| 451 bool WebPluginImpl::FindProxyForUrl(const GURL& url, std::string* proxy_list) { | 423 bool WebPluginImpl::FindProxyForUrl(const GURL& url, std::string* proxy_list) { |
| 452 // Proxy resolving doesn't work in single-process mode. | 424 // Proxy resolving doesn't work in single-process mode. |
| 453 return false; | 425 return false; |
| 454 } | 426 } |
| 455 | 427 |
| 456 void WebPluginImpl::SetCookie(const GURL& url, | 428 void WebPluginImpl::SetCookie(const GURL& url, |
| 457 const GURL& first_party_for_cookies, | 429 const GURL& first_party_for_cookies, |
| 458 const std::string& cookie) { | 430 const std::string& cookie) { |
| 459 if (!render_view_.get()) | 431 if (!render_view_.get()) |
| 460 return; | 432 return; |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 542 | 514 |
| 543 void WebPluginImpl::InvalidateRect(const gfx::Rect& rect) { | 515 void WebPluginImpl::InvalidateRect(const gfx::Rect& rect) { |
| 544 if (container_) | 516 if (container_) |
| 545 container_->invalidateRect(rect); | 517 container_->invalidateRect(rect); |
| 546 } | 518 } |
| 547 | 519 |
| 548 void WebPluginImpl::SetContainer(WebPluginContainer* container) { | 520 void WebPluginImpl::SetContainer(WebPluginContainer* container) { |
| 549 if (!container) | 521 if (!container) |
| 550 TearDownPluginInstance(NULL); | 522 TearDownPluginInstance(NULL); |
| 551 container_ = container; | 523 container_ = container; |
| 552 if (container_) | |
| 553 container_->allowScriptObjects(); | |
| 554 } | 524 } |
| 555 | 525 |
| 556 unsigned long WebPluginImpl::GetNextResourceId() { | 526 unsigned long WebPluginImpl::GetNextResourceId() { |
| 557 if (!webframe_) | 527 if (!webframe_) |
| 558 return 0; | 528 return 0; |
| 559 WebView* view = webframe_->view(); | 529 WebView* view = webframe_->view(); |
| 560 if (!view) | 530 if (!view) |
| 561 return 0; | 531 return 0; |
| 562 return view->createUniqueIdentifierForRequest(); | 532 return view->createUniqueIdentifierForRequest(); |
| 563 } | 533 } |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 601 | 571 |
| 602 // Destroy the current plugin instance. | 572 // Destroy the current plugin instance. |
| 603 TearDownPluginInstance(loader); | 573 TearDownPluginInstance(loader); |
| 604 | 574 |
| 605 container_ = container_widget; | 575 container_ = container_widget; |
| 606 webframe_ = webframe; | 576 webframe_ = webframe; |
| 607 | 577 |
| 608 WebPluginDelegateProxy* plugin_delegate = new WebPluginDelegateProxy( | 578 WebPluginDelegateProxy* plugin_delegate = new WebPluginDelegateProxy( |
| 609 this, mime_type_, render_view_, render_frame_); | 579 this, mime_type_, render_view_, render_frame_); |
| 610 | 580 |
| 611 // Store the plugin's unique identifier, used by the container to track its | |
| 612 // script objects, and enable script objects (since Initialize may use them | |
| 613 // even if it fails). | |
| 614 npp_ = plugin_delegate->GetPluginNPP(); | |
| 615 container_->allowScriptObjects(); | |
| 616 | |
| 617 bool ok = plugin_delegate && plugin_delegate->Initialize( | 581 bool ok = plugin_delegate && plugin_delegate->Initialize( |
| 618 plugin_url_, arg_names_, arg_values_, load_manually_); | 582 plugin_url_, arg_names_, arg_values_, load_manually_); |
| 619 | 583 |
| 620 if (!ok) { | 584 if (!ok) { |
| 621 container_->clearScriptObjects(); | |
| 622 container_ = NULL; | 585 container_ = NULL; |
| 623 // TODO(iyengar) Should we delete the current plugin instance here? | 586 // TODO(iyengar) Should we delete the current plugin instance here? |
| 624 return false; | 587 return false; |
| 625 } | 588 } |
| 626 | 589 |
| 627 delegate_ = plugin_delegate; | 590 delegate_ = plugin_delegate; |
| 628 | 591 |
| 629 // Force a geometry update to occur to ensure that the plugin becomes | 592 // Force a geometry update to occur to ensure that the plugin becomes |
| 630 // visible. | 593 // visible. |
| 631 container_->reportGeometry(); | 594 container_->reportGeometry(); |
| 632 | 595 |
| 633 // The plugin move sequences accumulated via DidMove are sent to the browser | 596 // The plugin move sequences accumulated via DidMove are sent to the browser |
| 634 // whenever the renderer paints. Force a paint here to ensure that changes | 597 // whenever the renderer paints. Force a paint here to ensure that changes |
| 635 // to the plugin window are propagated to the browser. | 598 // to the plugin window are propagated to the browser. |
| 636 container_->invalidate(); | 599 container_->invalidate(); |
| 637 return true; | 600 return true; |
| 638 } | 601 } |
| 639 | 602 |
| 640 void WebPluginImpl::TearDownPluginInstance( | 603 void WebPluginImpl::TearDownPluginInstance( |
| 641 WebURLLoader* loader_to_ignore) { | 604 WebURLLoader* loader_to_ignore) { |
| 642 // JavaScript garbage collection may cause plugin script object references to | 605 // JavaScript garbage collection may cause plugin script object references to |
| 643 // be retained long after the plugin is destroyed. Some plugins won't cope | 606 // be retained long after the plugin is destroyed. Some plugins won't cope |
| 644 // with their objects being released after they've been destroyed, and once | 607 // with their objects being released after they've been destroyed, and once |
| 645 // we've actually unloaded the plugin the object's releaseobject() code may | 608 // we've actually unloaded the plugin the object's releaseobject() code may |
| 646 // no longer be in memory. The container tracks the plugin's objects and lets | 609 // no longer be in memory. The container tracks the plugin's objects and lets |
| 647 // us invalidate them, releasing the references to them held by the JavaScript | 610 // us invalidate them, releasing the references to them held by the JavaScript |
| 648 // runtime. | 611 // runtime. |
| 649 if (container_) { | 612 if (container_) { |
| 650 container_->clearScriptObjects(); | |
| 651 container_->setWebLayer(NULL); | 613 container_->setWebLayer(NULL); |
| 652 } | 614 } |
| 653 | 615 |
| 654 // Call PluginDestroyed() first to prevent the plugin from calling us back | 616 // Call PluginDestroyed() first to prevent the plugin from calling us back |
| 655 // in the middle of tearing down the render tree. | 617 // in the middle of tearing down the render tree. |
| 656 if (delegate_) { | 618 if (delegate_) { |
| 657 // The plugin may call into the browser and pass script objects even during | 619 // The plugin may call into the browser and pass script objects even during |
| 658 // teardown, so temporarily re-enable plugin script objects. | 620 // teardown, so temporarily re-enable plugin script objects. |
| 659 DCHECK(container_); | 621 DCHECK(container_); |
| 660 container_->allowScriptObjects(); | |
| 661 | 622 |
| 662 delegate_->PluginDestroyed(); | 623 delegate_->PluginDestroyed(); |
| 663 delegate_ = NULL; | 624 delegate_ = NULL; |
| 664 | |
| 665 // Invalidate any script objects created during teardown here, before the | |
| 666 // plugin might actually be unloaded. | |
| 667 container_->clearScriptObjects(); | |
| 668 } | 625 } |
| 669 | 626 |
| 670 // This needs to be called now and not in the destructor since the | 627 // This needs to be called now and not in the destructor since the |
| 671 // webframe_ might not be valid anymore. | 628 // webframe_ might not be valid anymore. |
| 672 webframe_ = NULL; | 629 webframe_ = NULL; |
| 673 } | 630 } |
| 674 | 631 |
| 675 void WebPluginImpl::SetReferrer(blink::WebURLRequest* request, | 632 void WebPluginImpl::SetReferrer(blink::WebURLRequest* request, |
| 676 ReferrerValue referrer_flag) { | 633 ReferrerValue referrer_flag) { |
| 677 switch (referrer_flag) { | 634 switch (referrer_flag) { |
| 678 case DOCUMENT_URL: | 635 case DOCUMENT_URL: |
| 679 webframe_->setReferrerForRequest(*request, GURL()); | 636 webframe_->setReferrerForRequest(*request, GURL()); |
| 680 break; | 637 break; |
| 681 | 638 |
| 682 case PLUGIN_SRC: | 639 case PLUGIN_SRC: |
| 683 webframe_->setReferrerForRequest(*request, plugin_url_); | 640 webframe_->setReferrerForRequest(*request, plugin_url_); |
| 684 break; | 641 break; |
| 685 | 642 |
| 686 default: | 643 default: |
| 687 break; | 644 break; |
| 688 } | 645 } |
| 689 } | 646 } |
| 690 | 647 |
| 691 } // namespace content | 648 } // namespace content |
| OLD | NEW |