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