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

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

Issue 25503004: Create a new RenderFrameHost per child frame when --site-per-process is enabled. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase on ToT. Created 7 years, 2 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
« no previous file with comments | « content/renderer/render_frame_impl.h ('k') | content/renderer/render_view_impl.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 "base/command_line.h" 7 #include "base/command_line.h"
8 #include "base/strings/utf_string_conversions.h" 8 #include "base/strings/utf_string_conversions.h"
9 #include "base/time/time.h" 9 #include "base/time/time.h"
10 #include "content/child/appcache/appcache_dispatcher.h" 10 #include "content/child/appcache/appcache_dispatcher.h"
11 #include "content/child/plugin_messages.h" 11 #include "content/child/plugin_messages.h"
12 #include "content/child/quota_dispatcher.h" 12 #include "content/child/quota_dispatcher.h"
13 #include "content/child/request_extra_data.h" 13 #include "content/child/request_extra_data.h"
14 #include "content/common/frame_messages.h"
14 #include "content/common/socket_stream_handle_data.h" 15 #include "content/common/socket_stream_handle_data.h"
15 #include "content/common/swapped_out_messages.h" 16 #include "content/common/swapped_out_messages.h"
16 #include "content/common/view_messages.h" 17 #include "content/common/view_messages.h"
17 #include "content/public/common/content_constants.h" 18 #include "content/public/common/content_constants.h"
18 #include "content/public/common/content_switches.h" 19 #include "content/public/common/content_switches.h"
19 #include "content/public/common/url_constants.h" 20 #include "content/public/common/url_constants.h"
20 #include "content/public/renderer/content_renderer_client.h" 21 #include "content/public/renderer/content_renderer_client.h"
21 #include "content/public/renderer/document_state.h" 22 #include "content/public/renderer/document_state.h"
22 #include "content/public/renderer/navigation_state.h" 23 #include "content/public/renderer/navigation_state.h"
23 #include "content/renderer/browser_plugin/browser_plugin.h" 24 #include "content/renderer/browser_plugin/browser_plugin.h"
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
67 using WebKit::WebURLResponse; 68 using WebKit::WebURLResponse;
68 using WebKit::WebUserGestureIndicator; 69 using WebKit::WebUserGestureIndicator;
69 using WebKit::WebVector; 70 using WebKit::WebVector;
70 using WebKit::WebView; 71 using WebKit::WebView;
71 using base::Time; 72 using base::Time;
72 using base::TimeDelta; 73 using base::TimeDelta;
73 using webkit_glue::WebURLResponseExtraDataImpl; 74 using webkit_glue::WebURLResponseExtraDataImpl;
74 75
75 namespace content { 76 namespace content {
76 77
78 namespace {
79
80 typedef std::map<WebKit::WebFrame*, RenderFrameImpl*> FrameMap;
81 base::LazyInstance<FrameMap> g_child_frame_map = LAZY_INSTANCE_INITIALIZER;
82
83 } // namespace
84
77 static RenderFrameImpl* (*g_create_render_frame_impl)(RenderViewImpl*, int32) = 85 static RenderFrameImpl* (*g_create_render_frame_impl)(RenderViewImpl*, int32) =
78 NULL; 86 NULL;
79 87
80 // static 88 // static
81 RenderFrameImpl* RenderFrameImpl::Create(RenderViewImpl* render_view, 89 RenderFrameImpl* RenderFrameImpl::Create(RenderViewImpl* render_view,
82 int32 routing_id) { 90 int32 routing_id) {
83 DCHECK(routing_id != MSG_ROUTING_NONE); 91 DCHECK(routing_id != MSG_ROUTING_NONE);
84 92
85 RenderFrameImpl* render_frame = NULL;
86 if (g_create_render_frame_impl) 93 if (g_create_render_frame_impl)
87 render_frame = g_create_render_frame_impl(render_view, routing_id); 94 return g_create_render_frame_impl(render_view, routing_id);
88 else 95 else
89 render_frame = new RenderFrameImpl(render_view, routing_id); 96 return new RenderFrameImpl(render_view, routing_id);
90
91 return render_frame;
92 } 97 }
93 98
94 // static 99 // static
95 void RenderFrameImpl::InstallCreateHook( 100 void RenderFrameImpl::InstallCreateHook(
96 RenderFrameImpl* (*create_render_frame_impl)(RenderViewImpl*, int32)) { 101 RenderFrameImpl* (*create_render_frame_impl)(RenderViewImpl*, int32)) {
97 CHECK(!g_create_render_frame_impl); 102 CHECK(!g_create_render_frame_impl);
98 g_create_render_frame_impl = create_render_frame_impl; 103 g_create_render_frame_impl = create_render_frame_impl;
99 } 104 }
100 105
101 // RenderFrameImpl ---------------------------------------------------------- 106 // RenderFrameImpl ----------------------------------------------------------
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
212 } 217 }
213 218
214 WebKit::WebCookieJar* RenderFrameImpl::cookieJar(WebKit::WebFrame* frame) { 219 WebKit::WebCookieJar* RenderFrameImpl::cookieJar(WebKit::WebFrame* frame) {
215 return render_view_->cookieJar(frame); 220 return render_view_->cookieJar(frame);
216 } 221 }
217 222
218 void RenderFrameImpl::didAccessInitialDocument(WebKit::WebFrame* frame) { 223 void RenderFrameImpl::didAccessInitialDocument(WebKit::WebFrame* frame) {
219 render_view_->didAccessInitialDocument(frame); 224 render_view_->didAccessInitialDocument(frame);
220 } 225 }
221 226
222 void RenderFrameImpl::didCreateFrame(WebKit::WebFrame* parent, 227 WebKit::WebFrame* RenderFrameImpl::createChildFrame(
223 WebKit::WebFrame* child) { 228 WebKit::WebFrame* parent,
224 render_view_->Send(new ViewHostMsg_FrameAttached( 229 const WebKit::WebString& name) {
225 render_view_->GetRoutingID(), parent->identifier(), child->identifier(), 230 RenderFrameImpl* child_render_frame = this;
226 UTF16ToUTF8(child->assignedName()))); 231 long long child_frame_identifier = WebFrame::generateEmbedderIdentifier();
232 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kSitePerProcess)) {
233 // Synchronously notify the browser of a child frame creation to get the
234 // routing_id for the RenderFrame.
235 int routing_id;
236 Send(new FrameHostMsg_CreateChildFrame(GetRoutingID(),
237 parent->identifier(),
238 child_frame_identifier,
239 UTF16ToUTF8(name),
240 &routing_id));
241 child_render_frame = RenderFrameImpl::Create(render_view_, routing_id);
242 }
243
244 WebKit::WebFrame* web_frame = WebFrame::create(child_render_frame,
245 child_frame_identifier);
246
247 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kSitePerProcess)) {
248 g_child_frame_map.Get().insert(
249 std::make_pair(web_frame, child_render_frame));
250 }
251
252 return web_frame;
227 } 253 }
228 254
229 void RenderFrameImpl::didDisownOpener(WebKit::WebFrame* frame) { 255 void RenderFrameImpl::didDisownOpener(WebKit::WebFrame* frame) {
230 render_view_->didDisownOpener(frame); 256 render_view_->didDisownOpener(frame);
231 } 257 }
232 258
233 void RenderFrameImpl::frameDetached(WebKit::WebFrame* frame) { 259 void RenderFrameImpl::frameDetached(WebKit::WebFrame* frame) {
234 // Currently multiple WebCore::Frames can send frameDetached to a single 260 // Currently multiple WebCore::Frames can send frameDetached to a single
235 // RenderFrameImpl. This is legacy behavior from when RenderViewImpl served 261 // RenderFrameImpl. This is legacy behavior from when RenderViewImpl served
236 // as a shared WebFrameClient for multiple Webcore::Frame objects. It also 262 // as a shared WebFrameClient for multiple Webcore::Frame objects. It also
237 // prevents this class from entering the |is_detaching_| state because 263 // prevents this class from entering the |is_detaching_| state because
238 // even though one WebCore::Frame may have detached itself, others will 264 // even though one WebCore::Frame may have detached itself, others will
239 // still need to use this object. 265 // still need to use this object.
240 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kSitePerProcess)) { 266 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kSitePerProcess)) {
241 // TODO(ajwong): Add CHECK(!is_detaching_) once we guarantee each 267 // TODO(ajwong): Add CHECK(!is_detaching_) once we guarantee each
242 // RenderFrameImpl is only used by one WebCore::Frame. 268 // RenderFrameImpl is only used by one WebCore::Frame.
243 is_detaching_ = true; 269 is_detaching_ = true;
244 } 270 }
245 271
246 int64 parent_frame_id = -1; 272 int64 parent_frame_id = -1;
247 if (frame->parent()) 273 if (frame->parent())
248 parent_frame_id = frame->parent()->identifier(); 274 parent_frame_id = frame->parent()->identifier();
249 275
250 render_view_->Send(new ViewHostMsg_FrameDetached(render_view_->GetRoutingID(), 276 render_view_->Send(new FrameHostMsg_Detach(GetRoutingID(), parent_frame_id,
251 parent_frame_id, 277 frame->identifier()));
252 frame->identifier()));
253 278
254 // Call back to RenderViewImpl for observers to be notified. 279 // Call back to RenderViewImpl for observers to be notified.
255 // TODO(nasko): Remove once we have RenderFrameObserver. 280 // TODO(nasko): Remove once we have RenderFrameObserver.
256 render_view_->frameDetached(frame); 281 render_view_->frameDetached(frame);
282
283 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kSitePerProcess)) {
284 FrameMap::iterator it = g_child_frame_map.Get().find(frame);
285 DCHECK(it != g_child_frame_map.Get().end());
286 DCHECK_EQ(it->second, this);
287 delete it->second;
288 g_child_frame_map.Get().erase(it);
289 }
290
291 frame->close();
257 } 292 }
258 293
259 void RenderFrameImpl::willClose(WebKit::WebFrame* frame) { 294 void RenderFrameImpl::willClose(WebKit::WebFrame* frame) {
260 // Call back to RenderViewImpl for observers to be notified. 295 // Call back to RenderViewImpl for observers to be notified.
261 // TODO(nasko): Remove once we have RenderFrameObserver. 296 // TODO(nasko): Remove once we have RenderFrameObserver.
262 render_view_->willClose(frame); 297 render_view_->willClose(frame);
263 } 298 }
264 299
265 void RenderFrameImpl::didChangeName(WebKit::WebFrame* frame, 300 void RenderFrameImpl::didChangeName(WebKit::WebFrame* frame,
266 const WebKit::WebString& name) { 301 const WebKit::WebString& name) {
(...skipping 602 matching lines...) Expand 10 before | Expand all | Expand 10 after
869 904
870 void RenderFrameImpl::didLoseWebGLContext(WebKit::WebFrame* frame, 905 void RenderFrameImpl::didLoseWebGLContext(WebKit::WebFrame* frame,
871 int arb_robustness_status_code) { 906 int arb_robustness_status_code) {
872 render_view_->Send(new ViewHostMsg_DidLose3DContext( 907 render_view_->Send(new ViewHostMsg_DidLose3DContext(
873 GURL(frame->top()->document().securityOrigin().toString()), 908 GURL(frame->top()->document().securityOrigin().toString()),
874 THREE_D_API_TYPE_WEBGL, 909 THREE_D_API_TYPE_WEBGL,
875 arb_robustness_status_code)); 910 arb_robustness_status_code));
876 } 911 }
877 912
878 } // namespace content 913 } // namespace content
OLDNEW
« no previous file with comments | « content/renderer/render_frame_impl.h ('k') | content/renderer/render_view_impl.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698