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

Side by Side Diff: content/renderer/render_frame_impl.cc

Issue 1409693009: Fix leaking of RenderFrames. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixing another round of nits. Created 5 years 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 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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/render_frame_impl.h" 5 #include "content/renderer/render_frame_impl.h"
6 6
7 #include <map> 7 #include <map>
8 #include <string> 8 #include <string>
9 9
10 #include "base/auto_reset.h" 10 #include "base/auto_reset.h"
(...skipping 681 matching lines...) Expand 10 before | Expand all | Expand 10 after
692 if (previous_sibling_proxy) 692 if (previous_sibling_proxy)
693 previous_sibling_web_frame = previous_sibling_proxy->web_frame(); 693 previous_sibling_web_frame = previous_sibling_proxy->web_frame();
694 694
695 // Create the RenderFrame and WebLocalFrame, linking the two. 695 // Create the RenderFrame and WebLocalFrame, linking the two.
696 render_frame = 696 render_frame =
697 RenderFrameImpl::Create(parent_proxy->render_view(), routing_id); 697 RenderFrameImpl::Create(parent_proxy->render_view(), routing_id);
698 web_frame = parent_web_frame->createLocalChild( 698 web_frame = parent_web_frame->createLocalChild(
699 replicated_state.scope, WebString::fromUTF8(replicated_state.name), 699 replicated_state.scope, WebString::fromUTF8(replicated_state.name),
700 replicated_state.sandbox_flags, render_frame, 700 replicated_state.sandbox_flags, render_frame,
701 previous_sibling_web_frame, frame_owner_properties); 701 previous_sibling_web_frame, frame_owner_properties);
702
703 // The RenderFrame is created and inserted into the frame tree in the above
704 // call to createLocalChild.
705 render_frame->in_frame_tree_ = true;
702 } else { 706 } else {
703 RenderFrameProxy* proxy = 707 RenderFrameProxy* proxy =
704 RenderFrameProxy::FromRoutingID(proxy_routing_id); 708 RenderFrameProxy::FromRoutingID(proxy_routing_id);
705 CHECK(proxy); 709 CHECK(proxy);
706 render_frame = RenderFrameImpl::Create(proxy->render_view(), routing_id); 710 render_frame = RenderFrameImpl::Create(proxy->render_view(), routing_id);
707 render_frame->proxy_routing_id_ = proxy_routing_id; 711 render_frame->proxy_routing_id_ = proxy_routing_id;
708 web_frame = blink::WebLocalFrame::createProvisional( 712 web_frame = blink::WebLocalFrame::createProvisional(
709 render_frame, proxy->web_frame(), replicated_state.sandbox_flags, 713 render_frame, proxy->web_frame(), replicated_state.sandbox_flags,
710 frame_owner_properties); 714 frame_owner_properties);
711 } 715 }
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
790 return opener_frame->GetWebFrame(); 794 return opener_frame->GetWebFrame();
791 } 795 }
792 796
793 return nullptr; 797 return nullptr;
794 } 798 }
795 799
796 // RenderFrameImpl ---------------------------------------------------------- 800 // RenderFrameImpl ----------------------------------------------------------
797 RenderFrameImpl::RenderFrameImpl(const CreateParams& params) 801 RenderFrameImpl::RenderFrameImpl(const CreateParams& params)
798 : frame_(NULL), 802 : frame_(NULL),
799 is_main_frame_(true), 803 is_main_frame_(true),
804 in_browser_initiated_detach_(false),
805 in_frame_tree_(false),
800 render_view_(params.render_view->AsWeakPtr()), 806 render_view_(params.render_view->AsWeakPtr()),
801 routing_id_(params.routing_id), 807 routing_id_(params.routing_id),
802 is_swapped_out_(false), 808 is_swapped_out_(false),
803 render_frame_proxy_(NULL), 809 render_frame_proxy_(NULL),
804 is_detaching_(false), 810 is_detaching_(false),
805 proxy_routing_id_(MSG_ROUTING_NONE), 811 proxy_routing_id_(MSG_ROUTING_NONE),
806 #if defined(ENABLE_PLUGINS) 812 #if defined(ENABLE_PLUGINS)
807 plugin_power_saver_helper_(nullptr), 813 plugin_power_saver_helper_(nullptr),
808 #endif 814 #endif
809 cookie_jar_(this), 815 cookie_jar_(this),
(...skipping 383 matching lines...) Expand 10 before | Expand all | Expand 10 after
1193 while ((observer = it.GetNext()) != NULL) { 1199 while ((observer = it.GetNext()) != NULL) {
1194 if (observer->OnMessageReceived(msg)) 1200 if (observer->OnMessageReceived(msg))
1195 return true; 1201 return true;
1196 } 1202 }
1197 1203
1198 bool handled = true; 1204 bool handled = true;
1199 IPC_BEGIN_MESSAGE_MAP(RenderFrameImpl, msg) 1205 IPC_BEGIN_MESSAGE_MAP(RenderFrameImpl, msg)
1200 IPC_MESSAGE_HANDLER(FrameMsg_Navigate, OnNavigate) 1206 IPC_MESSAGE_HANDLER(FrameMsg_Navigate, OnNavigate)
1201 IPC_MESSAGE_HANDLER(FrameMsg_BeforeUnload, OnBeforeUnload) 1207 IPC_MESSAGE_HANDLER(FrameMsg_BeforeUnload, OnBeforeUnload)
1202 IPC_MESSAGE_HANDLER(FrameMsg_SwapOut, OnSwapOut) 1208 IPC_MESSAGE_HANDLER(FrameMsg_SwapOut, OnSwapOut)
1209 IPC_MESSAGE_HANDLER(FrameMsg_Delete, OnDeleteFrame)
1203 IPC_MESSAGE_HANDLER(FrameMsg_Stop, OnStop) 1210 IPC_MESSAGE_HANDLER(FrameMsg_Stop, OnStop)
1204 IPC_MESSAGE_HANDLER(FrameMsg_ContextMenuClosed, OnContextMenuClosed) 1211 IPC_MESSAGE_HANDLER(FrameMsg_ContextMenuClosed, OnContextMenuClosed)
1205 IPC_MESSAGE_HANDLER(FrameMsg_CustomContextMenuAction, 1212 IPC_MESSAGE_HANDLER(FrameMsg_CustomContextMenuAction,
1206 OnCustomContextMenuAction) 1213 OnCustomContextMenuAction)
1207 IPC_MESSAGE_HANDLER(InputMsg_Undo, OnUndo) 1214 IPC_MESSAGE_HANDLER(InputMsg_Undo, OnUndo)
1208 IPC_MESSAGE_HANDLER(InputMsg_Redo, OnRedo) 1215 IPC_MESSAGE_HANDLER(InputMsg_Redo, OnRedo)
1209 IPC_MESSAGE_HANDLER(InputMsg_Cut, OnCut) 1216 IPC_MESSAGE_HANDLER(InputMsg_Cut, OnCut)
1210 IPC_MESSAGE_HANDLER(InputMsg_Copy, OnCopy) 1217 IPC_MESSAGE_HANDLER(InputMsg_Copy, OnCopy)
1211 IPC_MESSAGE_HANDLER(InputMsg_Paste, OnPaste) 1218 IPC_MESSAGE_HANDLER(InputMsg_Paste, OnPaste)
1212 IPC_MESSAGE_HANDLER(InputMsg_PasteAndMatchStyle, OnPasteAndMatchStyle) 1219 IPC_MESSAGE_HANDLER(InputMsg_PasteAndMatchStyle, OnPasteAndMatchStyle)
(...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after
1434 proxy->SetReplicatedState(replicated_frame_state); 1441 proxy->SetReplicatedState(replicated_frame_state);
1435 1442
1436 // Safe to exit if no one else is using the process. 1443 // Safe to exit if no one else is using the process.
1437 // TODO(nasko): Remove the dependency on RenderViewImpl here and ref count 1444 // TODO(nasko): Remove the dependency on RenderViewImpl here and ref count
1438 // the process based on the lifetime of this RenderFrameImpl object. 1445 // the process based on the lifetime of this RenderFrameImpl object.
1439 if (is_main_frame) { 1446 if (is_main_frame) {
1440 render_view->WasSwappedOut(); 1447 render_view->WasSwappedOut();
1441 } 1448 }
1442 } 1449 }
1443 1450
1451 void RenderFrameImpl::OnDeleteFrame() {
1452 // TODO(nasko): If this message is received right after a commit has
1453 // swapped a RenderFrameProxy with RenderFrame, the proxy need to be
Charlie Reis 2015/12/14 22:12:52 nit: with this nit: needs
nasko 2015/12/14 22:27:59 Done.
1454 // recreated instead of the frame being deleted.
Charlie Reis 2015/12/14 22:12:52 Don't we need to delete the frame as well as recre
nasko 2015/12/14 22:27:59 Done.
1455 // See https://crbug.com/569683 for details.
1456 in_browser_initiated_detach_ = true;
1457
1458 // This will result in a call to RendeFrameImpl::frameDetached, which
1459 // deletes the object. Do not access |this| after detach.
1460 frame_->detach();
1461 }
1462
1444 void RenderFrameImpl::OnContextMenuClosed( 1463 void RenderFrameImpl::OnContextMenuClosed(
1445 const CustomContextMenuContext& custom_context) { 1464 const CustomContextMenuContext& custom_context) {
1446 if (custom_context.request_id) { 1465 if (custom_context.request_id) {
1447 // External request, should be in our map. 1466 // External request, should be in our map.
1448 ContextMenuClient* client = 1467 ContextMenuClient* client =
1449 pending_context_menus_.Lookup(custom_context.request_id); 1468 pending_context_menus_.Lookup(custom_context.request_id);
1450 if (client) { 1469 if (client) {
1451 client->OnMenuClosed(custom_context.request_id); 1470 client->OnMenuClosed(custom_context.request_id);
1452 pending_context_menus_.Remove(custom_context.request_id); 1471 pending_context_menus_.Remove(custom_context.request_id);
1453 } 1472 }
(...skipping 977 matching lines...) Expand 10 before | Expand all | Expand 10 after
2431 2450
2432 // Create the RenderFrame and WebLocalFrame, linking the two. 2451 // Create the RenderFrame and WebLocalFrame, linking the two.
2433 RenderFrameImpl* child_render_frame = RenderFrameImpl::Create( 2452 RenderFrameImpl* child_render_frame = RenderFrameImpl::Create(
2434 render_view_.get(), child_routing_id); 2453 render_view_.get(), child_routing_id);
2435 blink::WebLocalFrame* web_frame = 2454 blink::WebLocalFrame* web_frame =
2436 WebLocalFrame::create(scope, child_render_frame); 2455 WebLocalFrame::create(scope, child_render_frame);
2437 child_render_frame->SetWebFrame(web_frame); 2456 child_render_frame->SetWebFrame(web_frame);
2438 2457
2439 // Add the frame to the frame tree and initialize it. 2458 // Add the frame to the frame tree and initialize it.
2440 parent->appendChild(web_frame); 2459 parent->appendChild(web_frame);
2460 child_render_frame->in_frame_tree_ = true;
2441 child_render_frame->Initialize(); 2461 child_render_frame->Initialize();
2442 2462
2443 return web_frame; 2463 return web_frame;
2444 } 2464 }
2445 2465
2446 void RenderFrameImpl::didChangeOpener(blink::WebFrame* opener) { 2466 void RenderFrameImpl::didChangeOpener(blink::WebFrame* opener) {
2447 // Only active frames are able to disown their opener. 2467 // Only active frames are able to disown their opener.
2448 if (!opener && is_swapped_out_) 2468 if (!opener && is_swapped_out_)
2449 return; 2469 return;
2450 2470
(...skipping 11 matching lines...) Expand all
2462 // the parent frame. This is different from createChildFrame() which is 2482 // the parent frame. This is different from createChildFrame() which is
2463 // called on the parent frame. 2483 // called on the parent frame.
2464 CHECK(!is_detaching_); 2484 CHECK(!is_detaching_);
2465 DCHECK(!frame_ || frame_ == frame); 2485 DCHECK(!frame_ || frame_ == frame);
2466 2486
2467 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, FrameDetached()); 2487 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, FrameDetached());
2468 FOR_EACH_OBSERVER(RenderViewObserver, render_view_->observers(), 2488 FOR_EACH_OBSERVER(RenderViewObserver, render_view_->observers(),
2469 FrameDetached(frame)); 2489 FrameDetached(frame));
2470 2490
2471 // We only notify the browser process when the frame is being detached for 2491 // We only notify the browser process when the frame is being detached for
2472 // removal. If the frame is being detached for swap, we don't need to do this 2492 // removal and it was initiated from the renderer process.
2473 // since we are not modifiying the frame tree. 2493 if (!in_browser_initiated_detach_ && type == DetachType::Remove)
2474 if (type == DetachType::Remove)
2475 Send(new FrameHostMsg_Detach(routing_id_)); 2494 Send(new FrameHostMsg_Detach(routing_id_));
2476 2495
2477 // The |is_detaching_| flag disables Send(). FrameHostMsg_Detach must be 2496 // The |is_detaching_| flag disables Send(). FrameHostMsg_Detach must be
2478 // sent before setting |is_detaching_| to true. 2497 // sent before setting |is_detaching_| to true.
2479 is_detaching_ = true; 2498 is_detaching_ = true;
2480 2499
2481 // Clean up the associated RenderWidget for the frame, if there is one. 2500 // Clean up the associated RenderWidget for the frame, if there is one.
2482 if (render_widget_) { 2501 if (render_widget_) {
2483 render_widget_->UnregisterRenderFrame(this); 2502 render_widget_->UnregisterRenderFrame(this);
2484 render_widget_->CloseForFrame(); 2503 render_widget_->CloseForFrame();
2485 } 2504 }
2486 2505
2487 // We need to clean up subframes by removing them from the map and deleting 2506 // We need to clean up subframes by removing them from the map and deleting
2488 // the RenderFrameImpl. In contrast, the main frame is owned by its 2507 // the RenderFrameImpl. In contrast, the main frame is owned by its
2489 // containing RenderViewHost (so that they have the same lifetime), so only 2508 // containing RenderViewHost (so that they have the same lifetime), so only
2490 // removal from the map is needed and no deletion. 2509 // removal from the map is needed and no deletion.
2491 FrameMap::iterator it = g_frame_map.Get().find(frame); 2510 FrameMap::iterator it = g_frame_map.Get().find(frame);
2492 CHECK(it != g_frame_map.Get().end()); 2511 CHECK(it != g_frame_map.Get().end());
2493 CHECK_EQ(it->second, this); 2512 CHECK_EQ(it->second, this);
2494 g_frame_map.Get().erase(it); 2513 g_frame_map.Get().erase(it);
2495 2514
2496 // Only remove the frame from the renderer's frame tree if the frame is 2515 // Only remove the frame from the renderer's frame tree if the frame is
2497 // being detached for removal. In the case of a swap, the frame needs to 2516 // being detached for removal and is already inserted in the frame tree.
2498 // remain in the tree so WebFrame::swap() can replace it with the new frame. 2517 // In the case of a swap, the frame needs to remain in the tree so
2499 if (!is_main_frame_ && type == DetachType::Remove) 2518 // WebFrame::swap() can replace it with the new frame.
2519 if (!is_main_frame_ && in_frame_tree_ &&
2520 type == DetachType::Remove) {
2500 frame->parent()->removeChild(frame); 2521 frame->parent()->removeChild(frame);
2522 }
2501 2523
2502 // |frame| is invalid after here. Be sure to clear frame_ as well, since this 2524 // |frame| is invalid after here. Be sure to clear frame_ as well, since this
2503 // object may not be deleted immediately and other methods may try to access 2525 // object may not be deleted immediately and other methods may try to access
2504 // it. 2526 // it.
2505 frame->close(); 2527 frame->close();
2506 frame_ = nullptr; 2528 frame_ = nullptr;
2507 2529
2508 delete this; 2530 delete this;
2509 // Object is invalid after this point. 2531 // Object is invalid after this point.
2510 } 2532 }
(...skipping 408 matching lines...) Expand 10 before | Expand all | Expand 10 after
2919 WebURLResponseExtraDataImpl* extra_data = GetExtraDataFromResponse( 2941 WebURLResponseExtraDataImpl* extra_data = GetExtraDataFromResponse(
2920 frame->dataSource()->response()); 2942 frame->dataSource()->response());
2921 is_using_lofi_ = extra_data && extra_data->is_using_lofi(); 2943 is_using_lofi_ = extra_data && extra_data->is_using_lofi();
2922 2944
2923 if (proxy_routing_id_ != MSG_ROUTING_NONE) { 2945 if (proxy_routing_id_ != MSG_ROUTING_NONE) {
2924 RenderFrameProxy* proxy = 2946 RenderFrameProxy* proxy =
2925 RenderFrameProxy::FromRoutingID(proxy_routing_id_); 2947 RenderFrameProxy::FromRoutingID(proxy_routing_id_);
2926 CHECK(proxy); 2948 CHECK(proxy);
2927 proxy->web_frame()->swap(frame_); 2949 proxy->web_frame()->swap(frame_);
2928 proxy_routing_id_ = MSG_ROUTING_NONE; 2950 proxy_routing_id_ = MSG_ROUTING_NONE;
2951 in_frame_tree_ = true;
2929 2952
2930 // If this is the main frame going from a remote frame to a local frame, 2953 // If this is the main frame going from a remote frame to a local frame,
2931 // it needs to set RenderViewImpl's pointer for the main frame to itself 2954 // it needs to set RenderViewImpl's pointer for the main frame to itself
2932 // and ensure RenderWidget is no longer in swapped out mode. 2955 // and ensure RenderWidget is no longer in swapped out mode.
2933 if (is_main_frame_) { 2956 if (is_main_frame_) {
2934 CHECK(!render_view_->main_render_frame_); 2957 CHECK(!render_view_->main_render_frame_);
2935 render_view_->main_render_frame_ = this; 2958 render_view_->main_render_frame_ = this;
2936 if (render_view_->is_swapped_out()) 2959 if (render_view_->is_swapped_out())
2937 render_view_->SetSwappedOut(false); 2960 render_view_->SetSwappedOut(false);
2938 } 2961 }
(...skipping 2577 matching lines...) Expand 10 before | Expand all | Expand 10 after
5516 media::ConvertToSwitchOutputDeviceCB(web_callbacks); 5539 media::ConvertToSwitchOutputDeviceCB(web_callbacks);
5517 scoped_refptr<media::AudioOutputDevice> device = 5540 scoped_refptr<media::AudioOutputDevice> device =
5518 AudioDeviceFactory::NewOutputDevice(routing_id_, 0, sink_id.utf8(), 5541 AudioDeviceFactory::NewOutputDevice(routing_id_, 0, sink_id.utf8(),
5519 security_origin); 5542 security_origin);
5520 media::OutputDeviceStatus status = device->GetDeviceStatus(); 5543 media::OutputDeviceStatus status = device->GetDeviceStatus();
5521 device->Stop(); 5544 device->Stop();
5522 callback.Run(status); 5545 callback.Run(status);
5523 } 5546 }
5524 5547
5525 } // namespace content 5548 } // namespace content
OLDNEW
« content/browser/frame_host/render_frame_host_impl.cc ('K') | « content/renderer/render_frame_impl.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698