| 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 |