OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |