Index: content/browser/renderer_host/render_message_filter.cc |
diff --git a/content/browser/renderer_host/render_message_filter.cc b/content/browser/renderer_host/render_message_filter.cc |
index b2eaa5bdcb16a36253683745c61af117b9e7c881..20ebd204b3cf83a046668ed3b88b59900f138fd4 100644 |
--- a/content/browser/renderer_host/render_message_filter.cc |
+++ b/content/browser/renderer_host/render_message_filter.cc |
@@ -21,6 +21,7 @@ |
#include "content/browser/dom_storage/dom_storage_context_wrapper.h" |
#include "content/browser/dom_storage/session_storage_namespace_impl.h" |
#include "content/browser/download/download_stats.h" |
+#include "content/browser/frame_host/render_frame_host_impl.h" |
#include "content/browser/gpu/browser_gpu_memory_buffer_manager.h" |
#include "content/browser/gpu/gpu_data_manager_impl.h" |
#include "content/browser/loader/resource_dispatcher_host_impl.h" |
@@ -218,6 +219,23 @@ class OpenChannelToPpapiBrokerCallback |
}; |
#endif // defined(ENABLE_PLUGINS) |
+void CreateChildFrameOnUI(int process_id, |
+ int parent_routing_id, |
+ blink::WebTreeScopeType scope, |
+ const std::string& frame_name, |
+ blink::WebSandboxFlags sandbox_flags, |
+ int new_routing_id) { |
+ DCHECK_CURRENTLY_ON(BrowserThread::UI); |
+ RenderFrameHostImpl* render_frame_host = |
+ RenderFrameHostImpl::FromID(process_id, parent_routing_id); |
+ // Handles the RenderFrameHost being deleted on the UI thread while |
+ // processing a subframe creation message. |
+ if (render_frame_host) { |
+ render_frame_host->OnCreateChildFrame(new_routing_id, scope, frame_name, |
+ sandbox_flags); |
+ } |
+} |
+ |
} // namespace |
class RenderMessageFilter::OpenChannelToNpapiPluginCallback |
@@ -366,6 +384,7 @@ bool RenderMessageFilter::OnMessageReceived(const IPC::Message& message) { |
OnGetProcessMemorySizes) |
IPC_MESSAGE_HANDLER(ViewHostMsg_GenerateRoutingID, OnGenerateRoutingID) |
IPC_MESSAGE_HANDLER(ViewHostMsg_CreateWindow, OnCreateWindow) |
+ IPC_MESSAGE_HANDLER(FrameHostMsg_CreateChildFrame, OnCreateChildFrame) |
IPC_MESSAGE_HANDLER(ViewHostMsg_CreateWidget, OnCreateWidget) |
IPC_MESSAGE_HANDLER(ViewHostMsg_CreateFullscreenWidget, |
OnCreateFullscreenWidget) |
@@ -517,6 +536,19 @@ void RenderMessageFilter::OnCreateWindow( |
cloned_namespace.get()); |
} |
+void RenderMessageFilter::OnCreateChildFrame( |
+ int parent_routing_id, |
+ blink::WebTreeScopeType scope, |
+ const std::string& frame_name, |
+ blink::WebSandboxFlags sandbox_flags, |
+ int* new_routing_id) { |
+ *new_routing_id = render_widget_helper_->GetNextRoutingID(); |
+ BrowserThread::PostTask( |
+ BrowserThread::UI, FROM_HERE, |
+ base::Bind(&CreateChildFrameOnUI, render_process_id_, parent_routing_id, |
+ scope, frame_name, sandbox_flags, *new_routing_id)); |
+} |
+ |
void RenderMessageFilter::OnCreateWidget(int opener_id, |
blink::WebPopupType popup_type, |
int* route_id, |