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

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

Issue 82033002: Always create FrameTreeNodes and RenderFrameHosts for every frame. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix two bugs with slow/crashed renderers; add tests Created 7 years, 1 month 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 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/command_line.h"
11 #include "base/strings/utf_string_conversions.h" 10 #include "base/strings/utf_string_conversions.h"
12 #include "base/time/time.h" 11 #include "base/time/time.h"
13 #include "content/child/appcache/appcache_dispatcher.h" 12 #include "content/child/appcache/appcache_dispatcher.h"
14 #include "content/child/plugin_messages.h" 13 #include "content/child/plugin_messages.h"
15 #include "content/child/quota_dispatcher.h" 14 #include "content/child/quota_dispatcher.h"
16 #include "content/child/request_extra_data.h" 15 #include "content/child/request_extra_data.h"
17 #include "content/child/service_worker/web_service_worker_provider_impl.h" 16 #include "content/child/service_worker/web_service_worker_provider_impl.h"
18 #include "content/common/frame_messages.h" 17 #include "content/common/frame_messages.h"
19 #include "content/common/socket_stream_handle_data.h" 18 #include "content/common/socket_stream_handle_data.h"
20 #include "content/common/swapped_out_messages.h" 19 #include "content/common/swapped_out_messages.h"
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after
215 make_scoped_ptr(client)); 214 make_scoped_ptr(client));
216 } 215 }
217 216
218 void RenderFrameImpl::didAccessInitialDocument(blink::WebFrame* frame) { 217 void RenderFrameImpl::didAccessInitialDocument(blink::WebFrame* frame) {
219 render_view_->didAccessInitialDocument(frame); 218 render_view_->didAccessInitialDocument(frame);
220 } 219 }
221 220
222 blink::WebFrame* RenderFrameImpl::createChildFrame( 221 blink::WebFrame* RenderFrameImpl::createChildFrame(
223 blink::WebFrame* parent, 222 blink::WebFrame* parent,
224 const blink::WebString& name) { 223 const blink::WebString& name) {
225 RenderFrameImpl* child_render_frame = this;
226 long long child_frame_identifier = WebFrame::generateEmbedderIdentifier(); 224 long long child_frame_identifier = WebFrame::generateEmbedderIdentifier();
227 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kSitePerProcess)) { 225 // Synchronously notify the browser of a child frame creation to get the
228 // Synchronously notify the browser of a child frame creation to get the 226 // routing_id for the RenderFrame.
229 // routing_id for the RenderFrame. 227 int routing_id = MSG_ROUTING_NONE;
230 int routing_id; 228 Send(new FrameHostMsg_CreateChildFrame(GetRoutingID(),
231 Send(new FrameHostMsg_CreateChildFrame(GetRoutingID(), 229 parent->identifier(),
232 parent->identifier(), 230 child_frame_identifier,
233 child_frame_identifier, 231 UTF16ToUTF8(name),
234 UTF16ToUTF8(name), 232 &routing_id));
235 &routing_id)); 233 if (routing_id == MSG_ROUTING_NONE)
236 child_render_frame = RenderFrameImpl::Create(render_view_, routing_id); 234 return NULL;
237 } 235 RenderFrameImpl* child_render_frame = RenderFrameImpl::Create(render_view_,
236 routing_id);
238 237
239 blink::WebFrame* web_frame = WebFrame::create(child_render_frame, 238 blink::WebFrame* web_frame = WebFrame::create(child_render_frame,
240 child_frame_identifier); 239 child_frame_identifier);
241 240
242 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kSitePerProcess)) { 241 g_child_frame_map.Get().insert(
243 g_child_frame_map.Get().insert( 242 std::make_pair(web_frame, child_render_frame));
244 std::make_pair(web_frame, child_render_frame));
245 }
246 243
247 return web_frame; 244 return web_frame;
248 } 245 }
249 246
250 void RenderFrameImpl::didDisownOpener(blink::WebFrame* frame) { 247 void RenderFrameImpl::didDisownOpener(blink::WebFrame* frame) {
251 render_view_->didDisownOpener(frame); 248 render_view_->didDisownOpener(frame);
252 } 249 }
253 250
254 void RenderFrameImpl::frameDetached(blink::WebFrame* frame) { 251 void RenderFrameImpl::frameDetached(blink::WebFrame* frame) {
255 // NOTE: This function is called on the frame that is being detached and not 252 // NOTE: This function is called on the frame that is being detached and not
256 // the parent frame. This is different from createChildFrame() which is 253 // the parent frame. This is different from createChildFrame() which is
257 // called on the parent frame. 254 // called on the parent frame.
258 CHECK(!is_detaching_); 255 CHECK(!is_detaching_);
259 256
257 bool is_subframe = !!frame->parent();
260 int64 parent_frame_id = -1; 258 int64 parent_frame_id = -1;
261 if (frame->parent()) 259 if (is_subframe)
262 parent_frame_id = frame->parent()->identifier(); 260 parent_frame_id = frame->parent()->identifier();
263 261
264 Send(new FrameHostMsg_Detach(GetRoutingID(), parent_frame_id, 262 Send(new FrameHostMsg_Detach(GetRoutingID(), parent_frame_id,
265 frame->identifier())); 263 frame->identifier()));
266 264
267 // Currently multiple WebCore::Frames can send frameDetached to a single 265 // The |is_detaching_| flag disables Send(). FrameHostMsg_Detach must be
268 // RenderFrameImpl. This is legacy behavior from when RenderViewImpl served 266 // sent before setting |is_detaching_| to true. In contrast, Observers
269 // as a shared WebFrameClient for multiple Webcore::Frame objects. It also 267 // should only be notified afterwards so they cannot call back into and
270 // prevents this class from entering the |is_detaching_| state because 268 // have IPCs fired off.
271 // even though one WebCore::Frame may have detached itself, others will 269 is_detaching_ = true;
272 // still need to use this object.
273 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kSitePerProcess)) {
274 // The |is_detaching_| flag disables Send(). FrameHostMsg_Detach must be
275 // sent before setting |is_detaching_| to true. In contrast, Observers
276 // should only be notified afterwards so they cannot call back into and
277 // have IPCs fired off.
278 is_detaching_ = true;
279 }
280 270
281 // Call back to RenderViewImpl for observers to be notified. 271 // Call back to RenderViewImpl for observers to be notified.
282 // TODO(nasko): Remove once we have RenderFrameObserver. 272 // TODO(nasko): Remove once we have RenderFrameObserver.
283 render_view_->frameDetached(frame); 273 render_view_->frameDetached(frame);
284 274
275 // We need to clean up subframes by removing them from the map and deleting
276 // the RenderFrameImpl. In contrast, the main frame is owned by its
277 // containing RenderViewHost (so that they have the same lifetime), so it does
278 // not require any cleanup here.
279 if (is_subframe) {
280 FrameMap::iterator it = g_child_frame_map.Get().find(frame);
281 DCHECK(it != g_child_frame_map.Get().end());
282 DCHECK_EQ(it->second, this);
283 g_child_frame_map.Get().erase(it);
284 }
285
286 // |frame| is invalid after here.
285 frame->close(); 287 frame->close();
286 288
287 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kSitePerProcess)) { 289 if (is_subframe) {
288 // If the frame does not have a parent, it is the main frame. The main 290 delete this;
289 // frame is owned by the containing RenderViewHost so it does not require 291 // Object is invalid after this point.
290 // any cleanup here.
291 if (frame->parent()) {
292 FrameMap::iterator it = g_child_frame_map.Get().find(frame);
293 DCHECK(it != g_child_frame_map.Get().end());
294 DCHECK_EQ(it->second, this);
295 g_child_frame_map.Get().erase(it);
296 delete this;
297 // Object is invalid after this point.
298 }
299 } 292 }
300 } 293 }
301 294
302 void RenderFrameImpl::willClose(blink::WebFrame* frame) { 295 void RenderFrameImpl::willClose(blink::WebFrame* frame) {
303 // Call back to RenderViewImpl for observers to be notified. 296 // Call back to RenderViewImpl for observers to be notified.
304 // TODO(nasko): Remove once we have RenderFrameObserver. 297 // TODO(nasko): Remove once we have RenderFrameObserver.
305 render_view_->willClose(frame); 298 render_view_->willClose(frame);
306 } 299 }
307 300
308 void RenderFrameImpl::didChangeName(blink::WebFrame* frame, 301 void RenderFrameImpl::didChangeName(blink::WebFrame* frame,
(...skipping 669 matching lines...) Expand 10 before | Expand all | Expand 10 after
978 971
979 void RenderFrameImpl::didLoseWebGLContext(blink::WebFrame* frame, 972 void RenderFrameImpl::didLoseWebGLContext(blink::WebFrame* frame,
980 int arb_robustness_status_code) { 973 int arb_robustness_status_code) {
981 render_view_->Send(new ViewHostMsg_DidLose3DContext( 974 render_view_->Send(new ViewHostMsg_DidLose3DContext(
982 GURL(frame->top()->document().securityOrigin().toString()), 975 GURL(frame->top()->document().securityOrigin().toString()),
983 THREE_D_API_TYPE_WEBGL, 976 THREE_D_API_TYPE_WEBGL,
984 arb_robustness_status_code)); 977 arb_robustness_status_code));
985 } 978 }
986 979
987 } // namespace content 980 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698