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

Side by Side Diff: content/browser/web_contents/web_contents_impl.cc

Issue 869533004: Fix WCO::RenderFrameCreated and WCO::RenderFrameDeleted notifications. Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixes for RenderFrameHostChanged. Created 5 years, 10 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) 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/browser/web_contents/web_contents_impl.h" 5 #include "content/browser/web_contents/web_contents_impl.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/command_line.h" 9 #include "base/command_line.h"
10 #include "base/lazy_instance.h" 10 #include "base/lazy_instance.h"
(...skipping 345 matching lines...) Expand 10 before | Expand all | Expand 10 after
356 fullscreen_widget_had_focus_at_shutdown_(false), 356 fullscreen_widget_had_focus_at_shutdown_(false),
357 is_subframe_(false), 357 is_subframe_(false),
358 force_disable_overscroll_content_(false), 358 force_disable_overscroll_content_(false),
359 last_dialog_suppressed_(false), 359 last_dialog_suppressed_(false),
360 geolocation_service_context_(new GeolocationServiceContext()), 360 geolocation_service_context_(new GeolocationServiceContext()),
361 accessibility_mode_( 361 accessibility_mode_(
362 BrowserAccessibilityStateImpl::GetInstance()->accessibility_mode()), 362 BrowserAccessibilityStateImpl::GetInstance()->accessibility_mode()),
363 audio_stream_monitor_(this), 363 audio_stream_monitor_(this),
364 virtual_keyboard_requested_(false), 364 virtual_keyboard_requested_(false),
365 loading_weak_factory_(this) { 365 loading_weak_factory_(this) {
366 LOG(ERROR) << "WC[" << this << "]::WC";
366 frame_tree_.SetFrameRemoveListener( 367 frame_tree_.SetFrameRemoveListener(
367 base::Bind(&WebContentsImpl::OnFrameRemoved, 368 base::Bind(&WebContentsImpl::OnFrameRemoved,
368 base::Unretained(this))); 369 base::Unretained(this)));
369 #if defined(ENABLE_BROWSER_CDMS) 370 #if defined(ENABLE_BROWSER_CDMS)
370 media_web_contents_observer_.reset(new MediaWebContentsObserver(this)); 371 media_web_contents_observer_.reset(new MediaWebContentsObserver(this));
371 #endif 372 #endif
372 } 373 }
373 374
374 WebContentsImpl::~WebContentsImpl() { 375 WebContentsImpl::~WebContentsImpl() {
375 is_being_destroyed_ = true; 376 is_being_destroyed_ = true;
(...skipping 25 matching lines...) Expand all
401 NOTIFICATION_WEB_CONTENTS_DESTROYED, 402 NOTIFICATION_WEB_CONTENTS_DESTROYED,
402 Source<WebContents>(this), 403 Source<WebContents>(this),
403 NotificationService::NoDetails()); 404 NotificationService::NoDetails());
404 405
405 // Destroy all frame tree nodes except for the root; this notifies observers. 406 // Destroy all frame tree nodes except for the root; this notifies observers.
406 frame_tree_.ResetForMainFrameSwap(); 407 frame_tree_.ResetForMainFrameSwap();
407 GetRenderManager()->ResetProxyHosts(); 408 GetRenderManager()->ResetProxyHosts();
408 409
409 // Manually call the observer methods for the root frame tree node. 410 // Manually call the observer methods for the root frame tree node.
410 RenderFrameHostManager* root = GetRenderManager(); 411 RenderFrameHostManager* root = GetRenderManager();
411 if (root->pending_frame_host()) {
412 FOR_EACH_OBSERVER(WebContentsObserver,
413 observers_,
414 RenderFrameDeleted(root->pending_frame_host()));
415 }
416 FOR_EACH_OBSERVER(WebContentsObserver,
417 observers_,
418 RenderFrameDeleted(root->current_frame_host()));
419
420 if (root->pending_render_view_host()) { 412 if (root->pending_render_view_host()) {
421 FOR_EACH_OBSERVER(WebContentsObserver, 413 FOR_EACH_OBSERVER(WebContentsObserver,
422 observers_, 414 observers_,
423 RenderViewDeleted(root->pending_render_view_host())); 415 RenderViewDeleted(root->pending_render_view_host()));
424 } 416 }
425 417
426 FOR_EACH_OBSERVER(WebContentsObserver, 418 FOR_EACH_OBSERVER(WebContentsObserver,
427 observers_, 419 observers_,
428 RenderViewDeleted(root->current_host())); 420 RenderViewDeleted(root->current_host()));
429 421
430 FOR_EACH_OBSERVER(WebContentsObserver, 422 FOR_EACH_OBSERVER(WebContentsObserver,
431 observers_, 423 observers_,
432 WebContentsDestroyed()); 424 WebContentsDestroyed());
433 425
434 FOR_EACH_OBSERVER(WebContentsObserver, 426 FOR_EACH_OBSERVER(WebContentsObserver,
435 observers_, 427 observers_,
436 ResetWebContents()); 428 ResetWebContents());
437 429
438 SetDelegate(NULL); 430 SetDelegate(NULL);
439 431
440 STLDeleteContainerPairSecondPointers(destruction_observers_.begin(), 432 STLDeleteContainerPairSecondPointers(destruction_observers_.begin(),
441 destruction_observers_.end()); 433 destruction_observers_.end());
434 LOG(ERROR) << "WC[" << this << "]::~WC";
442 } 435 }
443 436
444 WebContentsImpl* WebContentsImpl::CreateWithOpener( 437 WebContentsImpl* WebContentsImpl::CreateWithOpener(
445 const WebContents::CreateParams& params, 438 const WebContents::CreateParams& params,
446 WebContentsImpl* opener) { 439 WebContentsImpl* opener) {
447 TRACE_EVENT0("browser", "WebContentsImpl::CreateWithOpener"); 440 TRACE_EVENT0("browser", "WebContentsImpl::CreateWithOpener");
448 WebContentsImpl* new_contents = new WebContentsImpl( 441 WebContentsImpl* new_contents = new WebContentsImpl(
449 params.browser_context, params.opener_suppressed ? NULL : opener); 442 params.browser_context, params.opener_suppressed ? NULL : opener);
450 443
451 if (params.guest_delegate) { 444 if (params.guest_delegate) {
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
498 const IPC::Message& message) { 491 const IPC::Message& message) {
499 DCHECK(render_view_host || render_frame_host); 492 DCHECK(render_view_host || render_frame_host);
500 if (GetWebUI() && 493 if (GetWebUI() &&
501 static_cast<WebUIImpl*>(GetWebUI())->OnMessageReceived(message)) { 494 static_cast<WebUIImpl*>(GetWebUI())->OnMessageReceived(message)) {
502 return true; 495 return true;
503 } 496 }
504 497
505 ObserverListBase<WebContentsObserver>::Iterator it(observers_); 498 ObserverListBase<WebContentsObserver>::Iterator it(observers_);
506 WebContentsObserver* observer; 499 WebContentsObserver* observer;
507 if (render_frame_host) { 500 if (render_frame_host) {
508 while ((observer = it.GetNext()) != NULL) 501 if (!static_cast<RenderFrameHostImpl*>(render_frame_host)->is_swapped_out()) {
509 if (observer->OnMessageReceived(message, render_frame_host)) 502 while ((observer = it.GetNext()) != NULL)
510 return true; 503 if (observer->OnMessageReceived(message, render_frame_host))
504 return true;
505 }
511 } else { 506 } else {
512 while ((observer = it.GetNext()) != NULL) 507 while ((observer = it.GetNext()) != NULL)
513 if (observer->OnMessageReceived(message)) 508 if (observer->OnMessageReceived(message))
514 return true; 509 return true;
515 } 510 }
516 511
517 // Message handlers should be aware of which 512 // Message handlers should be aware of which
518 // RenderViewHost/RenderFrameHost sent the message, which is temporarily 513 // RenderViewHost/RenderFrameHost sent the message, which is temporarily
519 // stored in render_(view|frame)_message_source_. 514 // stored in render_(view|frame)_message_source_.
520 if (render_frame_host) 515 if (render_frame_host)
(...skipping 672 matching lines...) Expand 10 before | Expand all | Expand 10 after
1193 default: 1188 default:
1194 NOTREACHED(); 1189 NOTREACHED();
1195 } 1190 }
1196 } 1191 }
1197 1192
1198 WebContents* WebContentsImpl::GetWebContents() { 1193 WebContents* WebContentsImpl::GetWebContents() {
1199 return this; 1194 return this;
1200 } 1195 }
1201 1196
1202 void WebContentsImpl::Init(const WebContents::CreateParams& params) { 1197 void WebContentsImpl::Init(const WebContents::CreateParams& params) {
1198 LOG(ERROR) << "WC[" << this << "]::Init";
1199
1203 // This is set before initializing the render manager since 1200 // This is set before initializing the render manager since
1204 // RenderFrameHostManager::Init calls back into us via its delegate to ask if 1201 // RenderFrameHostManager::Init calls back into us via its delegate to ask if
1205 // it should be hidden. 1202 // it should be hidden.
1206 should_normally_be_visible_ = !params.initially_hidden; 1203 should_normally_be_visible_ = !params.initially_hidden;
1207 1204
1208 // Either both routing ids can be given, or neither can be. 1205 // Either both routing ids can be given, or neither can be.
1209 DCHECK((params.routing_id == MSG_ROUTING_NONE && 1206 DCHECK((params.routing_id == MSG_ROUTING_NONE &&
1210 params.main_frame_routing_id == MSG_ROUTING_NONE) || 1207 params.main_frame_routing_id == MSG_ROUTING_NONE) ||
1211 (params.routing_id != MSG_ROUTING_NONE && 1208 (params.routing_id != MSG_ROUTING_NONE &&
1212 params.main_frame_routing_id != MSG_ROUTING_NONE)); 1209 params.main_frame_routing_id != MSG_ROUTING_NONE));
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
1259 date_time_chooser_.reset(new DateTimeChooserAndroid()); 1256 date_time_chooser_.reset(new DateTimeChooserAndroid());
1260 #endif 1257 #endif
1261 1258
1262 // BrowserPluginGuest::Init needs to be called after this WebContents has 1259 // BrowserPluginGuest::Init needs to be called after this WebContents has
1263 // a RenderWidgetHostViewGuest. That is, |view_->CreateView| above. 1260 // a RenderWidgetHostViewGuest. That is, |view_->CreateView| above.
1264 if (browser_plugin_guest_) 1261 if (browser_plugin_guest_)
1265 browser_plugin_guest_->Init(); 1262 browser_plugin_guest_->Init();
1266 1263
1267 for (size_t i = 0; i < g_created_callbacks.Get().size(); i++) 1264 for (size_t i = 0; i < g_created_callbacks.Get().size(); i++)
1268 g_created_callbacks.Get().at(i).Run(this); 1265 g_created_callbacks.Get().at(i).Run(this);
1266
1267 NotifySwappedFromRenderManager(
1268 nullptr, GetRenderManager()->current_frame_host(), true);
1269 } 1269 }
1270 1270
1271 void WebContentsImpl::OnWebContentsDestroyed(WebContentsImpl* web_contents) { 1271 void WebContentsImpl::OnWebContentsDestroyed(WebContentsImpl* web_contents) {
1272 RemoveDestructionObserver(web_contents); 1272 RemoveDestructionObserver(web_contents);
1273 1273
1274 // Clear the opener if it has been closed. 1274 // Clear the opener if it has been closed.
1275 if (web_contents == opener_) { 1275 if (web_contents == opener_) {
1276 opener_ = NULL; 1276 opener_ = NULL;
1277 return; 1277 return;
1278 } 1278 }
(...skipping 2313 matching lines...) Expand 10 before | Expand all | Expand 10 after
3592 3592
3593 void WebContentsImpl::RemoveBrowserPluginEmbedder() { 3593 void WebContentsImpl::RemoveBrowserPluginEmbedder() {
3594 if (browser_plugin_embedder_) 3594 if (browser_plugin_embedder_)
3595 browser_plugin_embedder_.reset(); 3595 browser_plugin_embedder_.reset();
3596 } 3596 }
3597 3597
3598 void WebContentsImpl::RenderViewCreated(RenderViewHost* render_view_host) { 3598 void WebContentsImpl::RenderViewCreated(RenderViewHost* render_view_host) {
3599 // Don't send notifications if we are just creating a swapped-out RVH for 3599 // Don't send notifications if we are just creating a swapped-out RVH for
3600 // the opener chain. These won't be used for view-source or WebUI, so it's 3600 // the opener chain. These won't be used for view-source or WebUI, so it's
3601 // ok to return early. 3601 // ok to return early.
3602 if (!static_cast<RenderViewHostImpl*>(render_view_host)->is_active()) 3602 bool rvh_is_active =
3603 return; 3603 static_cast<RenderViewHostImpl*>(render_view_host)->is_active();
3604 3604
3605 if (delegate_) 3605 if (rvh_is_active) {
3606 view_->SetOverscrollControllerEnabled(CanOverscrollContent()); 3606 if (delegate_)
3607 view_->SetOverscrollControllerEnabled(CanOverscrollContent());
3607 3608
3608 NotificationService::current()->Notify( 3609 NotificationService::current()->Notify(
3609 NOTIFICATION_WEB_CONTENTS_RENDER_VIEW_HOST_CREATED, 3610 NOTIFICATION_WEB_CONTENTS_RENDER_VIEW_HOST_CREATED,
3610 Source<WebContents>(this), 3611 Source<WebContents>(this),
3611 Details<RenderViewHost>(render_view_host)); 3612 Details<RenderViewHost>(render_view_host));
3612 3613
3613 // When we're creating views, we're still doing initial setup, so we always 3614 // When we're creating views, we're still doing initial setup, so we always
3614 // use the pending Web UI rather than any possibly existing committed one. 3615 // use the pending Web UI rather than any possibly existing committed one.
3615 if (GetRenderManager()->pending_web_ui()) 3616 if (GetRenderManager()->pending_web_ui())
3616 GetRenderManager()->pending_web_ui()->RenderViewCreated(render_view_host); 3617 GetRenderManager()->pending_web_ui()->RenderViewCreated(render_view_host);
3617 3618
3618 NavigationEntry* entry = controller_.GetPendingEntry(); 3619 NavigationEntry* entry = controller_.GetPendingEntry();
3619 if (entry && entry->IsViewSourceMode()) { 3620 if (entry && entry->IsViewSourceMode()) {
3620 // Put the renderer in view source mode. 3621 // Put the renderer in view source mode.
3621 render_view_host->Send( 3622 render_view_host->Send(
3622 new ViewMsg_EnableViewSourceMode(render_view_host->GetRoutingID())); 3623 new ViewMsg_EnableViewSourceMode(render_view_host->GetRoutingID()));
3624 }
3625
3626 view_->RenderViewCreated(render_view_host);
3627
3628 FOR_EACH_OBSERVER(
3629 WebContentsObserver, observers_, RenderViewCreated(render_view_host));
3623 } 3630 }
3624 3631
3625 view_->RenderViewCreated(render_view_host); 3632 RenderFrameHostImpl* rfh =
3633 static_cast<RenderFrameHostImpl*>(render_view_host->GetMainFrame());
3634 rfh->SetRenderFrameCreated(true);
3626 3635
3627 FOR_EACH_OBSERVER( 3636 if (rvh_is_active)
3628 WebContentsObserver, observers_, RenderViewCreated(render_view_host)); 3637 DevToolsManager::GetInstance()->RenderViewCreated(this, render_view_host);
3629
3630 // We tell the observers now instead of when the main RenderFrameHostImpl is
3631 // constructed because otherwise it would be too early (i.e. IPCs sent to the
3632 // frame would be dropped because it's not created yet).
3633 RenderFrameHost* main_frame = render_view_host->GetMainFrame();
3634 FOR_EACH_OBSERVER(
3635 WebContentsObserver, observers_, RenderFrameCreated(main_frame));
3636 SetAccessibilityModeOnFrame(accessibility_mode_, main_frame);
3637
3638 DevToolsManager::GetInstance()->RenderViewCreated(this, render_view_host);
3639 } 3638 }
3640 3639
3641 void WebContentsImpl::RenderViewReady(RenderViewHost* rvh) { 3640 void WebContentsImpl::RenderViewReady(RenderViewHost* rvh) {
3642 if (rvh != GetRenderViewHost()) { 3641 if (rvh != GetRenderViewHost()) {
3643 // Don't notify the world, since this came from a renderer in the 3642 // Don't notify the world, since this came from a renderer in the
3644 // background. 3643 // background.
3645 return; 3644 return;
3646 } 3645 }
3647 3646
3648 notify_disconnection_ = true; 3647 notify_disconnection_ = true;
(...skipping 12 matching lines...) Expand all
3661 (!delegate_ || delegate_->ShouldFocusPageAfterCrash())) { 3660 (!delegate_ || delegate_->ShouldFocusPageAfterCrash())) {
3662 view_->Focus(); 3661 view_->Focus();
3663 } 3662 }
3664 3663
3665 FOR_EACH_OBSERVER(WebContentsObserver, observers_, RenderViewReady()); 3664 FOR_EACH_OBSERVER(WebContentsObserver, observers_, RenderViewReady());
3666 } 3665 }
3667 3666
3668 void WebContentsImpl::RenderViewTerminated(RenderViewHost* rvh, 3667 void WebContentsImpl::RenderViewTerminated(RenderViewHost* rvh,
3669 base::TerminationStatus status, 3668 base::TerminationStatus status,
3670 int error_code) { 3669 int error_code) {
3671 // TODO(nasko): This isn't ideal; the termination process should be handled by
3672 // RenderFrameDeleted(). See http://crbug.com/455943.
3673 ClearPowerSaveBlockers(rvh->GetMainFrame());
3674
3675 if (rvh != GetRenderViewHost()) { 3670 if (rvh != GetRenderViewHost()) {
3676 // The pending page's RenderViewHost is gone. 3671 // The pending page's RenderViewHost is gone.
3677 return; 3672 return;
3678 } 3673 }
3679 3674
3680 // Ensure fullscreen mode is exited in the |delegate_| since a crashed 3675 // Ensure fullscreen mode is exited in the |delegate_| since a crashed
3681 // renderer may not have made a clean exit. 3676 // renderer may not have made a clean exit.
3682 if (IsFullscreenForCurrentTab()) 3677 if (IsFullscreenForCurrentTab())
3683 ExitFullscreenMode(); 3678 ExitFullscreenMode();
3684 3679
(...skipping 791 matching lines...) Expand 10 before | Expand all | Expand 10 after
4476 node->render_manager()->ResumeResponseDeferredAtStart(); 4471 node->render_manager()->ResumeResponseDeferredAtStart();
4477 } 4472 }
4478 4473
4479 void WebContentsImpl::SetForceDisableOverscrollContent(bool force_disable) { 4474 void WebContentsImpl::SetForceDisableOverscrollContent(bool force_disable) {
4480 force_disable_overscroll_content_ = force_disable; 4475 force_disable_overscroll_content_ = force_disable;
4481 if (view_) 4476 if (view_)
4482 view_->SetOverscrollControllerEnabled(CanOverscrollContent()); 4477 view_->SetOverscrollControllerEnabled(CanOverscrollContent());
4483 } 4478 }
4484 4479
4485 } // namespace content 4480 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/renderer_host/render_view_host_impl.cc ('k') | content/browser/web_contents/web_contents_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698