OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/browser/renderer_host/render_widget_helper.h" | 5 #include "content/browser/renderer_host/render_widget_helper.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/bind_helpers.h" | 8 #include "base/bind_helpers.h" |
9 #include "base/lazy_instance.h" | 9 #include "base/lazy_instance.h" |
10 #include "base/posix/eintr_wrapper.h" | 10 #include "base/posix/eintr_wrapper.h" |
11 #include "base/threading/thread.h" | 11 #include "base/threading/thread.h" |
12 #include "base/threading/thread_restrictions.h" | 12 #include "base/threading/thread_restrictions.h" |
13 #include "content/browser/dom_storage/session_storage_namespace_impl.h" | |
14 #include "content/browser/frame_host/render_frame_host_impl.h" | |
15 #include "content/browser/loader/resource_dispatcher_host_impl.h" | 13 #include "content/browser/loader/resource_dispatcher_host_impl.h" |
16 #include "content/browser/renderer_host/render_process_host_impl.h" | |
17 #include "content/browser/renderer_host/render_view_host_impl.h" | 14 #include "content/browser/renderer_host/render_view_host_impl.h" |
18 #include "content/common/view_messages.h" | 15 #include "content/common/view_messages.h" |
19 | 16 |
20 namespace content { | 17 namespace content { |
21 namespace { | 18 namespace { |
22 | 19 |
23 typedef std::map<int, RenderWidgetHelper*> WidgetHelperMap; | 20 typedef std::map<int, RenderWidgetHelper*> WidgetHelperMap; |
24 base::LazyInstance<WidgetHelperMap>::DestructorAtExit g_widget_helpers = | 21 base::LazyInstance<WidgetHelperMap>::DestructorAtExit g_widget_helpers = |
25 LAZY_INSTANCE_INITIALIZER; | 22 LAZY_INSTANCE_INITIALIZER; |
26 | 23 |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
81 base::Bind(&RenderWidgetHelper::OnResumeDeferredNavigation, | 78 base::Bind(&RenderWidgetHelper::OnResumeDeferredNavigation, |
82 this, | 79 this, |
83 request_id)); | 80 request_id)); |
84 } | 81 } |
85 | 82 |
86 void RenderWidgetHelper::OnResumeDeferredNavigation( | 83 void RenderWidgetHelper::OnResumeDeferredNavigation( |
87 const GlobalRequestID& request_id) { | 84 const GlobalRequestID& request_id) { |
88 resource_dispatcher_host_->ResumeDeferredNavigation(request_id); | 85 resource_dispatcher_host_->ResumeDeferredNavigation(request_id); |
89 } | 86 } |
90 | 87 |
91 void RenderWidgetHelper::CreateNewWindow( | |
92 mojom::CreateNewWindowParamsPtr params, | |
93 bool no_javascript_access, | |
94 int32_t* render_view_route_id, | |
95 int32_t* main_frame_route_id, | |
96 int32_t* main_frame_widget_route_id, | |
97 SessionStorageNamespace* session_storage_namespace) { | |
98 if (params->opener_suppressed || no_javascript_access) { | |
99 // If the opener is supppressed or script access is disallowed, we should | |
100 // open the window in a new BrowsingInstance, and thus a new process. That | |
101 // means the current renderer process will not be able to route messages to | |
102 // it. Because of this, we will immediately show and navigate the window | |
103 // in OnCreateNewWindowOnUI, using the params provided here. | |
104 *render_view_route_id = MSG_ROUTING_NONE; | |
105 *main_frame_route_id = MSG_ROUTING_NONE; | |
106 *main_frame_widget_route_id = MSG_ROUTING_NONE; | |
107 } else { | |
108 *render_view_route_id = GetNextRoutingID(); | |
109 *main_frame_route_id = GetNextRoutingID(); | |
110 // TODO(avi): When RenderViewHostImpl has-a RenderWidgetHostImpl, this | |
111 // should be updated to give the widget a distinct routing ID. | |
112 // https://crbug.com/545684 | |
113 *main_frame_widget_route_id = *render_view_route_id; | |
114 // Block resource requests until the frame is created, since the HWND might | |
115 // be needed if a response ends up creating a plugin. We'll only have a | |
116 // single frame at this point. These requests will be resumed either in | |
117 // WebContentsImpl::CreateNewWindow or RenderFrameHost::Init. | |
118 resource_dispatcher_host_->BlockRequestsForRoute( | |
119 GlobalFrameRoutingId(render_process_id_, *main_frame_route_id)); | |
120 } | |
121 | |
122 BrowserThread::PostTask( | |
123 BrowserThread::UI, FROM_HERE, | |
124 base::Bind(&RenderWidgetHelper::OnCreateNewWindowOnUI, this, | |
125 base::Passed(¶ms), *render_view_route_id, | |
126 *main_frame_route_id, *main_frame_widget_route_id, | |
127 base::RetainedRef(session_storage_namespace))); | |
128 } | |
129 | |
130 void RenderWidgetHelper::OnCreateNewWindowOnUI( | |
131 mojom::CreateNewWindowParamsPtr params, | |
132 int32_t render_view_route_id, | |
133 int32_t main_frame_route_id, | |
134 int32_t main_frame_widget_route_id, | |
135 SessionStorageNamespace* session_storage_namespace) { | |
136 RenderFrameHostImpl* opener = RenderFrameHostImpl::FromID( | |
137 render_process_id_, params->opener_render_frame_id); | |
138 if (opener && opener->IsRenderFrameLive()) { | |
139 opener->OnCreateNewWindow(render_view_route_id, main_frame_route_id, | |
140 main_frame_widget_route_id, *params, | |
141 session_storage_namespace); | |
142 } | |
143 | |
144 // If we did not create a WebContents to host the renderer-created | |
145 // RenderFrame/RenderView/RenderWidget objects, destroy them. | |
146 RenderProcessHost* rph = RenderProcessHost::FromID(render_process_id_); | |
147 if (main_frame_route_id != MSG_ROUTING_NONE && rph != nullptr) { | |
148 bool succeeded = | |
149 RenderWidgetHost::FromID(render_process_id_, | |
150 main_frame_widget_route_id) != nullptr; | |
151 if (!succeeded) { | |
152 DCHECK(!RenderFrameHost::FromID(render_process_id_, main_frame_route_id)); | |
153 DCHECK(!RenderViewHost::FromID(render_process_id_, render_view_route_id)); | |
154 | |
155 rph->Send(new ViewMsg_Close(render_view_route_id)); | |
156 } else { | |
157 // If a RWH was created, there should also be an RFH and RVH. | |
158 DCHECK(RenderFrameHost::FromID(render_process_id_, main_frame_route_id)); | |
159 DCHECK(RenderViewHost::FromID(render_process_id_, render_view_route_id)); | |
160 } | |
161 } | |
162 } | |
163 | |
164 void RenderWidgetHelper::CreateNewWidget(int opener_id, | 88 void RenderWidgetHelper::CreateNewWidget(int opener_id, |
165 blink::WebPopupType popup_type, | 89 blink::WebPopupType popup_type, |
166 int* route_id) { | 90 int* route_id) { |
167 *route_id = GetNextRoutingID(); | 91 *route_id = GetNextRoutingID(); |
168 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, | 92 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
169 base::Bind(&RenderWidgetHelper::OnCreateWidgetOnUI, | 93 base::Bind(&RenderWidgetHelper::OnCreateWidgetOnUI, |
170 this, opener_id, *route_id, popup_type)); | 94 this, opener_id, *route_id, popup_type)); |
171 } | 95 } |
172 | 96 |
173 void RenderWidgetHelper::CreateNewFullscreenWidget(int opener_id, | 97 void RenderWidgetHelper::CreateNewFullscreenWidget(int opener_id, |
(...skipping 16 matching lines...) Expand all Loading... |
190 | 114 |
191 void RenderWidgetHelper::OnCreateFullscreenWidgetOnUI(int32_t opener_id, | 115 void RenderWidgetHelper::OnCreateFullscreenWidgetOnUI(int32_t opener_id, |
192 int32_t route_id) { | 116 int32_t route_id) { |
193 RenderViewHostImpl* host = RenderViewHostImpl::FromID( | 117 RenderViewHostImpl* host = RenderViewHostImpl::FromID( |
194 render_process_id_, opener_id); | 118 render_process_id_, opener_id); |
195 if (host) | 119 if (host) |
196 host->CreateNewFullscreenWidget(route_id); | 120 host->CreateNewFullscreenWidget(route_id); |
197 } | 121 } |
198 | 122 |
199 } // namespace content | 123 } // namespace content |
OLD | NEW |