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

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

Issue 23841002: 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: notify observers regardless of flag 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/quota_dispatcher.h" 11 #include "content/child/quota_dispatcher.h"
12 #include "content/child/request_extra_data.h" 12 #include "content/child/request_extra_data.h"
13 #include "content/common/frame_messages.h"
13 #include "content/common/socket_stream_handle_data.h" 14 #include "content/common/socket_stream_handle_data.h"
14 #include "content/common/swapped_out_messages.h" 15 #include "content/common/swapped_out_messages.h"
15 #include "content/common/view_messages.h" 16 #include "content/common/view_messages.h"
16 #include "content/public/common/content_constants.h" 17 #include "content/public/common/content_constants.h"
17 #include "content/public/common/content_switches.h" 18 #include "content/public/common/content_switches.h"
18 #include "content/public/common/url_constants.h" 19 #include "content/public/common/url_constants.h"
19 #include "content/public/renderer/content_renderer_client.h" 20 #include "content/public/renderer/content_renderer_client.h"
20 #include "content/public/renderer/document_state.h" 21 #include "content/public/renderer/document_state.h"
21 #include "content/public/renderer/navigation_state.h" 22 #include "content/public/renderer/navigation_state.h"
22 #include "content/renderer/browser_plugin/browser_plugin.h" 23 #include "content/renderer/browser_plugin/browser_plugin.h"
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
65 using WebKit::WebURLResponse; 66 using WebKit::WebURLResponse;
66 using WebKit::WebUserGestureIndicator; 67 using WebKit::WebUserGestureIndicator;
67 using WebKit::WebVector; 68 using WebKit::WebVector;
68 using WebKit::WebView; 69 using WebKit::WebView;
69 using base::Time; 70 using base::Time;
70 using base::TimeDelta; 71 using base::TimeDelta;
71 using webkit_glue::WebURLResponseExtraDataImpl; 72 using webkit_glue::WebURLResponseExtraDataImpl;
72 73
73 namespace content { 74 namespace content {
74 75
76 namespace {
77
78 typedef std::map<WebKit::WebFrame*, RenderFrameImpl*> FrameMap;
79 base::LazyInstance<FrameMap> g_child_frame_map = LAZY_INSTANCE_INITIALIZER;
80
81 } // namespace
82
75 static RenderFrameImpl* (*g_create_render_frame_impl)(RenderViewImpl*, int32) = 83 static RenderFrameImpl* (*g_create_render_frame_impl)(RenderViewImpl*, int32) =
76 NULL; 84 NULL;
77 85
78 // static 86 // static
79 RenderFrameImpl* RenderFrameImpl::Create(RenderViewImpl* render_view, 87 RenderFrameImpl* RenderFrameImpl::Create(RenderViewImpl* render_view,
80 int32 routing_id) { 88 int32 routing_id) {
81 DCHECK(routing_id != MSG_ROUTING_NONE); 89 DCHECK(routing_id != MSG_ROUTING_NONE);
82 90
83 RenderFrameImpl* render_frame = NULL;
84 if (g_create_render_frame_impl) 91 if (g_create_render_frame_impl)
85 render_frame = g_create_render_frame_impl(render_view, routing_id); 92 return g_create_render_frame_impl(render_view, routing_id);
86 else 93 else
87 render_frame = new RenderFrameImpl(render_view, routing_id); 94 return new RenderFrameImpl(render_view, routing_id);
88
89 return render_frame;
90 } 95 }
91 96
92 // static 97 // static
93 void RenderFrameImpl::InstallCreateHook( 98 void RenderFrameImpl::InstallCreateHook(
94 RenderFrameImpl* (*create_render_frame_impl)(RenderViewImpl*, int32)) { 99 RenderFrameImpl* (*create_render_frame_impl)(RenderViewImpl*, int32)) {
95 CHECK(!g_create_render_frame_impl); 100 CHECK(!g_create_render_frame_impl);
96 g_create_render_frame_impl = create_render_frame_impl; 101 g_create_render_frame_impl = create_render_frame_impl;
97 } 102 }
98 103
99 // RenderFrameImpl ---------------------------------------------------------- 104 // RenderFrameImpl ----------------------------------------------------------
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
210 } 215 }
211 216
212 WebKit::WebCookieJar* RenderFrameImpl::cookieJar(WebKit::WebFrame* frame) { 217 WebKit::WebCookieJar* RenderFrameImpl::cookieJar(WebKit::WebFrame* frame) {
213 return render_view_->cookieJar(frame); 218 return render_view_->cookieJar(frame);
214 } 219 }
215 220
216 void RenderFrameImpl::didAccessInitialDocument(WebKit::WebFrame* frame) { 221 void RenderFrameImpl::didAccessInitialDocument(WebKit::WebFrame* frame) {
217 render_view_->didAccessInitialDocument(frame); 222 render_view_->didAccessInitialDocument(frame);
218 } 223 }
219 224
220 void RenderFrameImpl::didCreateFrame(WebKit::WebFrame* parent, 225 WebKit::WebFrame* RenderFrameImpl::createChildFrame(
221 WebKit::WebFrame* child) { 226 WebKit::WebFrame* parent,
222 render_view_->Send(new ViewHostMsg_FrameAttached( 227 const WebKit::WebString& name) {
223 render_view_->GetRoutingID(), parent->identifier(), child->identifier(), 228 RenderFrameImpl* child_render_frame = this;
224 UTF16ToUTF8(child->assignedName()))); 229 long long child_frame_identifier = WebFrame::generateEmbedderIdentifier();
230 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kSitePerProcess)) {
231 // Synchronously notify the browser of a child frame creation to get the
232 // routing_id for the RenderFrame.
233 int routing_id;
234 Send(new FrameHostMsg_CreateChildFrame(GetRoutingID(),
235 parent->identifier(),
236 child_frame_identifier,
237 UTF16ToUTF8(name),
238 &routing_id));
239 child_render_frame = RenderFrameImpl::Create(render_view_, routing_id);
240 }
241
242 WebKit::WebFrame* web_frame = WebFrame::create(child_render_frame,
243 child_frame_identifier);
244 g_child_frame_map.Get().insert(std::make_pair(web_frame, child_render_frame));
245
246 return web_frame;
225 } 247 }
226 248
227 void RenderFrameImpl::didDisownOpener(WebKit::WebFrame* frame) { 249 void RenderFrameImpl::didDisownOpener(WebKit::WebFrame* frame) {
228 render_view_->didDisownOpener(frame); 250 render_view_->didDisownOpener(frame);
229 } 251 }
230 252
231 void RenderFrameImpl::frameDetached(WebKit::WebFrame* frame) { 253 void RenderFrameImpl::frameDetached(WebKit::WebFrame* frame) {
232 // Currently multiple WebCore::Frames can send frameDetached to a single 254 // Currently multiple WebCore::Frames can send frameDetached to a single
233 // RenderFrameImpl. This is legacy behavior from when RenderViewImpl served 255 // RenderFrameImpl. This is legacy behavior from when RenderViewImpl served
234 // as a shared WebFrameClient for multiple Webcore::Frame objects. It also 256 // as a shared WebFrameClient for multiple Webcore::Frame objects. It also
235 // prevents this class from entering the |is_detaching_| state because 257 // prevents this class from entering the |is_detaching_| state because
236 // even though one WebCore::Frame may have detached itself, others will 258 // even though one WebCore::Frame may have detached itself, others will
237 // still need to use this object. 259 // still need to use this object.
238 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kSitePerProcess)) { 260 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kSitePerProcess)) {
239 // TODO(ajwong): Add CHECK(!is_detaching_) once we guarantee each 261 // TODO(ajwong): Add CHECK(!is_detaching_) once we guarantee each
240 // RenderFrameImpl is only used by one WebCore::Frame. 262 // RenderFrameImpl is only used by one WebCore::Frame.
241 is_detaching_ = true; 263 is_detaching_ = true;
242 } 264 }
243 265
244 int64 parent_frame_id = -1; 266 int64 parent_frame_id = -1;
245 if (frame->parent()) 267 if (frame->parent())
246 parent_frame_id = frame->parent()->identifier(); 268 parent_frame_id = frame->parent()->identifier();
247 269
248 render_view_->Send(new ViewHostMsg_FrameDetached(render_view_->GetRoutingID(), 270 render_view_->Send(new FrameHostMsg_Detach(GetRoutingID(), parent_frame_id,
249 parent_frame_id, 271 frame->identifier()));
250 frame->identifier()));
251 272
252 // Call back to RenderViewImpl for observers to be notified. 273 // Call back to RenderViewImpl for observers to be notified.
253 // TODO(nasko): Remove once we have RenderFrameObserver. 274 // TODO(nasko): Remove once we have RenderFrameObserver.
254 render_view_->frameDetached(frame); 275 render_view_->frameDetached(frame);
276
277 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kSitePerProcess)) {
278 FrameMap::iterator it = g_child_frame_map.Get().find(frame);
279 DCHECK(it != g_child_frame_map.Get().end());
280 DCHECK_EQ(it->second, this);
281 delete it->second;
282 g_child_frame_map.Get().erase(it);
283 }
284
285 frame->close();
255 } 286 }
256 287
257 void RenderFrameImpl::willClose(WebKit::WebFrame* frame) { 288 void RenderFrameImpl::willClose(WebKit::WebFrame* frame) {
258 // Call back to RenderViewImpl for observers to be notified. 289 // Call back to RenderViewImpl for observers to be notified.
259 // TODO(nasko): Remove once we have RenderFrameObserver. 290 // TODO(nasko): Remove once we have RenderFrameObserver.
260 render_view_->willClose(frame); 291 render_view_->willClose(frame);
261 } 292 }
262 293
263 void RenderFrameImpl::didChangeName(WebKit::WebFrame* frame, 294 void RenderFrameImpl::didChangeName(WebKit::WebFrame* frame,
264 const WebKit::WebString& name) { 295 const WebKit::WebString& name) {
(...skipping 595 matching lines...) Expand 10 before | Expand all | Expand 10 after
860 891
861 void RenderFrameImpl::didLoseWebGLContext(WebKit::WebFrame* frame, 892 void RenderFrameImpl::didLoseWebGLContext(WebKit::WebFrame* frame,
862 int arb_robustness_status_code) { 893 int arb_robustness_status_code) {
863 render_view_->Send(new ViewHostMsg_DidLose3DContext( 894 render_view_->Send(new ViewHostMsg_DidLose3DContext(
864 GURL(frame->top()->document().securityOrigin().toString()), 895 GURL(frame->top()->document().securityOrigin().toString()),
865 THREE_D_API_TYPE_WEBGL, 896 THREE_D_API_TYPE_WEBGL,
866 arb_robustness_status_code)); 897 arb_robustness_status_code));
867 } 898 }
868 899
869 } // namespace content 900 } // 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