OLD | NEW |
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 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 "chrome/browser/renderer_host/render_widget_helper.h" | 5 #include "chrome/browser/renderer_host/render_widget_helper.h" |
6 | 6 |
7 #include "base/eintr_wrapper.h" | 7 #include "base/eintr_wrapper.h" |
8 #include "base/thread.h" | 8 #include "base/thread.h" |
9 #include "chrome/browser/browser_process.h" | 9 #include "chrome/browser/chrome_thread.h" |
10 #include "chrome/browser/renderer_host/render_process_host.h" | 10 #include "chrome/browser/renderer_host/render_process_host.h" |
11 #include "chrome/browser/renderer_host/render_view_host.h" | 11 #include "chrome/browser/renderer_host/render_view_host.h" |
12 #include "chrome/browser/renderer_host/resource_dispatcher_host.h" | 12 #include "chrome/browser/renderer_host/resource_dispatcher_host.h" |
13 #include "chrome/common/render_messages.h" | 13 #include "chrome/common/render_messages.h" |
14 | 14 |
15 // A Task used with InvokeLater that we hold a pointer to in pending_paints_. | 15 // A Task used with InvokeLater that we hold a pointer to in pending_paints_. |
16 // Instances are deleted by MessageLoop after it calls their Run method. | 16 // Instances are deleted by MessageLoop after it calls their Run method. |
17 class RenderWidgetHelper::PaintMsgProxy : public Task { | 17 class RenderWidgetHelper::PaintMsgProxy : public Task { |
18 public: | 18 public: |
19 PaintMsgProxy(RenderWidgetHelper* h, const IPC::Message& m) | 19 PaintMsgProxy(RenderWidgetHelper* h, const IPC::Message& m) |
(...skipping 18 matching lines...) Expand all Loading... |
38 | 38 |
39 scoped_refptr<RenderWidgetHelper> helper; | 39 scoped_refptr<RenderWidgetHelper> helper; |
40 IPC::Message message; | 40 IPC::Message message; |
41 bool cancelled; // If true, then the message will not be dispatched. | 41 bool cancelled; // If true, then the message will not be dispatched. |
42 | 42 |
43 DISALLOW_COPY_AND_ASSIGN(PaintMsgProxy); | 43 DISALLOW_COPY_AND_ASSIGN(PaintMsgProxy); |
44 }; | 44 }; |
45 | 45 |
46 RenderWidgetHelper::RenderWidgetHelper() | 46 RenderWidgetHelper::RenderWidgetHelper() |
47 : render_process_id_(-1), | 47 : render_process_id_(-1), |
48 ui_loop_(MessageLoop::current()), | |
49 #if defined(OS_WIN) | 48 #if defined(OS_WIN) |
50 event_(CreateEvent(NULL, FALSE /* auto-reset */, FALSE, NULL)), | 49 event_(CreateEvent(NULL, FALSE /* auto-reset */, FALSE, NULL)), |
51 #elif defined(OS_POSIX) | 50 #elif defined(OS_POSIX) |
52 event_(false /* auto-reset */, false), | 51 event_(false /* auto-reset */, false), |
53 #endif | 52 #endif |
54 resource_dispatcher_host_(NULL) { | 53 resource_dispatcher_host_(NULL) { |
55 } | 54 } |
56 | 55 |
57 RenderWidgetHelper::~RenderWidgetHelper() { | 56 RenderWidgetHelper::~RenderWidgetHelper() { |
58 // The elements of pending_paints_ each hold an owning reference back to this | 57 // The elements of pending_paints_ each hold an owning reference back to this |
(...skipping 10 matching lines...) Expand all Loading... |
69 ResourceDispatcherHost* resource_dispatcher_host) { | 68 ResourceDispatcherHost* resource_dispatcher_host) { |
70 render_process_id_ = render_process_id; | 69 render_process_id_ = render_process_id; |
71 resource_dispatcher_host_ = resource_dispatcher_host; | 70 resource_dispatcher_host_ = resource_dispatcher_host; |
72 } | 71 } |
73 | 72 |
74 int RenderWidgetHelper::GetNextRoutingID() { | 73 int RenderWidgetHelper::GetNextRoutingID() { |
75 return next_routing_id_.GetNext() + 1; | 74 return next_routing_id_.GetNext() + 1; |
76 } | 75 } |
77 | 76 |
78 void RenderWidgetHelper::CancelResourceRequests(int render_widget_id) { | 77 void RenderWidgetHelper::CancelResourceRequests(int render_widget_id) { |
79 if (g_browser_process->io_thread() && render_process_id_ != -1) { | 78 if (render_process_id_ == -1) |
80 g_browser_process->io_thread()->message_loop()->PostTask(FROM_HERE, | 79 return; |
81 NewRunnableMethod(this, | 80 |
82 &RenderWidgetHelper::OnCancelResourceRequests, | 81 ChromeThread::PostTask( |
83 render_widget_id)); | 82 ChromeThread::IO, FROM_HERE, |
84 } | 83 NewRunnableMethod(this, |
| 84 &RenderWidgetHelper::OnCancelResourceRequests, |
| 85 render_widget_id)); |
85 } | 86 } |
86 | 87 |
87 void RenderWidgetHelper::CrossSiteClosePageACK( | 88 void RenderWidgetHelper::CrossSiteClosePageACK( |
88 const ViewMsg_ClosePage_Params& params) { | 89 const ViewMsg_ClosePage_Params& params) { |
89 if (g_browser_process->io_thread()) { | 90 ChromeThread::PostTask( |
90 g_browser_process->io_thread()->message_loop()->PostTask(FROM_HERE, | 91 ChromeThread::IO, FROM_HERE, |
91 NewRunnableMethod(this, | 92 NewRunnableMethod(this, |
92 &RenderWidgetHelper::OnCrossSiteClosePageACK, | 93 &RenderWidgetHelper::OnCrossSiteClosePageACK, |
93 params)); | 94 params)); |
94 } | |
95 } | 95 } |
96 | 96 |
97 bool RenderWidgetHelper::WaitForPaintMsg(int render_widget_id, | 97 bool RenderWidgetHelper::WaitForPaintMsg(int render_widget_id, |
98 const base::TimeDelta& max_delay, | 98 const base::TimeDelta& max_delay, |
99 IPC::Message* msg) { | 99 IPC::Message* msg) { |
100 base::TimeTicks time_start = base::TimeTicks::Now(); | 100 base::TimeTicks time_start = base::TimeTicks::Now(); |
101 | 101 |
102 for (;;) { | 102 for (;;) { |
103 PaintMsgProxy* proxy = NULL; | 103 PaintMsgProxy* proxy = NULL; |
104 { | 104 { |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
154 | 154 |
155 result.first->second = (proxy = new PaintMsgProxy(this, msg)); | 155 result.first->second = (proxy = new PaintMsgProxy(this, msg)); |
156 } | 156 } |
157 | 157 |
158 // Notify anyone waiting on the UI thread that there is a new entry in the | 158 // Notify anyone waiting on the UI thread that there is a new entry in the |
159 // proxy map. If they don't find the entry they are looking for, then they | 159 // proxy map. If they don't find the entry they are looking for, then they |
160 // will just continue waiting. | 160 // will just continue waiting. |
161 event_.Signal(); | 161 event_.Signal(); |
162 | 162 |
163 // The proxy will be deleted when it is run as a task. | 163 // The proxy will be deleted when it is run as a task. |
164 ui_loop_->PostTask(FROM_HERE, proxy); | 164 ChromeThread::PostTask(ChromeThread::UI, FROM_HERE, proxy); |
165 } | 165 } |
166 | 166 |
167 void RenderWidgetHelper::OnDiscardPaintMsg(PaintMsgProxy* proxy) { | 167 void RenderWidgetHelper::OnDiscardPaintMsg(PaintMsgProxy* proxy) { |
168 const IPC::Message& msg = proxy->message; | 168 const IPC::Message& msg = proxy->message; |
169 | 169 |
170 // Remove the proxy from the map now that we are going to handle it normally. | 170 // Remove the proxy from the map now that we are going to handle it normally. |
171 { | 171 { |
172 AutoLock lock(pending_paints_lock_); | 172 AutoLock lock(pending_paints_lock_); |
173 | 173 |
174 PaintMsgProxyMap::iterator it = pending_paints_.find(msg.routing_id()); | 174 PaintMsgProxyMap::iterator it = pending_paints_.find(msg.routing_id()); |
(...skipping 27 matching lines...) Expand all Loading... |
202 void RenderWidgetHelper::CreateNewWindow(int opener_id, | 202 void RenderWidgetHelper::CreateNewWindow(int opener_id, |
203 bool user_gesture, | 203 bool user_gesture, |
204 base::ProcessHandle render_process, | 204 base::ProcessHandle render_process, |
205 int* route_id) { | 205 int* route_id) { |
206 *route_id = GetNextRoutingID(); | 206 *route_id = GetNextRoutingID(); |
207 // Block resource requests until the view is created, since the HWND might be | 207 // Block resource requests until the view is created, since the HWND might be |
208 // needed if a response ends up creating a plugin. | 208 // needed if a response ends up creating a plugin. |
209 resource_dispatcher_host_->BlockRequestsForRoute( | 209 resource_dispatcher_host_->BlockRequestsForRoute( |
210 render_process_id_, *route_id); | 210 render_process_id_, *route_id); |
211 | 211 |
212 ui_loop_->PostTask(FROM_HERE, NewRunnableMethod( | 212 ChromeThread::PostTask( |
213 this, &RenderWidgetHelper::OnCreateWindowOnUI, opener_id, *route_id)); | 213 ChromeThread::UI, FROM_HERE, |
| 214 NewRunnableMethod( |
| 215 this, &RenderWidgetHelper::OnCreateWindowOnUI, opener_id, *route_id)); |
214 } | 216 } |
215 | 217 |
216 void RenderWidgetHelper::OnCreateWindowOnUI(int opener_id, int route_id) { | 218 void RenderWidgetHelper::OnCreateWindowOnUI(int opener_id, int route_id) { |
217 RenderViewHost* host = RenderViewHost::FromID(render_process_id_, opener_id); | 219 RenderViewHost* host = RenderViewHost::FromID(render_process_id_, opener_id); |
218 if (host) | 220 if (host) |
219 host->CreateNewWindow(route_id); | 221 host->CreateNewWindow(route_id); |
220 | 222 |
221 g_browser_process->io_thread()->message_loop()->PostTask(FROM_HERE, | 223 ChromeThread::PostTask( |
| 224 ChromeThread::IO, FROM_HERE, |
222 NewRunnableMethod(this, &RenderWidgetHelper::OnCreateWindowOnIO, | 225 NewRunnableMethod(this, &RenderWidgetHelper::OnCreateWindowOnIO, |
223 route_id)); | 226 route_id)); |
224 } | 227 } |
225 | 228 |
226 void RenderWidgetHelper::OnCreateWindowOnIO(int route_id) { | 229 void RenderWidgetHelper::OnCreateWindowOnIO(int route_id) { |
227 resource_dispatcher_host_->ResumeBlockedRequestsForRoute( | 230 resource_dispatcher_host_->ResumeBlockedRequestsForRoute( |
228 render_process_id_, route_id); | 231 render_process_id_, route_id); |
229 } | 232 } |
230 | 233 |
231 void RenderWidgetHelper::CreateNewWidget(int opener_id, | 234 void RenderWidgetHelper::CreateNewWidget(int opener_id, |
232 bool activatable, | 235 bool activatable, |
233 int* route_id) { | 236 int* route_id) { |
234 *route_id = GetNextRoutingID(); | 237 *route_id = GetNextRoutingID(); |
235 ui_loop_->PostTask(FROM_HERE, NewRunnableMethod( | 238 ChromeThread::PostTask( |
236 this, &RenderWidgetHelper::OnCreateWidgetOnUI, opener_id, *route_id, | 239 ChromeThread::UI, FROM_HERE, |
237 activatable)); | 240 NewRunnableMethod( |
| 241 this, &RenderWidgetHelper::OnCreateWidgetOnUI, opener_id, *route_id, |
| 242 activatable)); |
238 } | 243 } |
239 | 244 |
240 void RenderWidgetHelper::OnCreateWidgetOnUI( | 245 void RenderWidgetHelper::OnCreateWidgetOnUI( |
241 int opener_id, int route_id, bool activatable) { | 246 int opener_id, int route_id, bool activatable) { |
242 RenderViewHost* host = RenderViewHost::FromID(render_process_id_, opener_id); | 247 RenderViewHost* host = RenderViewHost::FromID(render_process_id_, opener_id); |
243 if (host) | 248 if (host) |
244 host->CreateNewWidget(route_id, activatable); | 249 host->CreateNewWidget(route_id, activatable); |
245 } | 250 } |
246 | 251 |
247 #if defined(OS_MACOSX) | 252 #if defined(OS_MACOSX) |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
290 | 295 |
291 void RenderWidgetHelper::ClearAllocatedDIBs() { | 296 void RenderWidgetHelper::ClearAllocatedDIBs() { |
292 for (std::map<TransportDIB::Id, int>::iterator | 297 for (std::map<TransportDIB::Id, int>::iterator |
293 i = allocated_dibs_.begin(); i != allocated_dibs_.end(); ++i) { | 298 i = allocated_dibs_.begin(); i != allocated_dibs_.end(); ++i) { |
294 HANDLE_EINTR(close(i->second)); | 299 HANDLE_EINTR(close(i->second)); |
295 } | 300 } |
296 | 301 |
297 allocated_dibs_.clear(); | 302 allocated_dibs_.clear(); |
298 } | 303 } |
299 #endif | 304 #endif |
OLD | NEW |