| 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/thread.h" | 7 #include "base/thread.h" |
| 8 #include "chrome/browser/browser_process.h" | 8 #include "chrome/browser/browser_process.h" |
| 9 #include "chrome/browser/renderer_host/render_process_host.h" | 9 #include "chrome/browser/renderer_host/render_process_host.h" |
| 10 #include "chrome/browser/renderer_host/resource_dispatcher_host.h" | 10 #include "chrome/browser/renderer_host/resource_dispatcher_host.h" |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 49 #elif defined(OS_POSIX) | 49 #elif defined(OS_POSIX) |
| 50 event_(false /* auto-reset */, false), | 50 event_(false /* auto-reset */, false), |
| 51 #endif | 51 #endif |
| 52 block_popups_(false) { | 52 block_popups_(false) { |
| 53 } | 53 } |
| 54 | 54 |
| 55 RenderWidgetHelper::~RenderWidgetHelper() { | 55 RenderWidgetHelper::~RenderWidgetHelper() { |
| 56 // The elements of pending_paints_ each hold an owning reference back to this | 56 // The elements of pending_paints_ each hold an owning reference back to this |
| 57 // object, so we should not be destroyed unless pending_paints_ is empty! | 57 // object, so we should not be destroyed unless pending_paints_ is empty! |
| 58 DCHECK(pending_paints_.empty()); | 58 DCHECK(pending_paints_.empty()); |
| 59 |
| 60 #if defined(OS_MACOSX) |
| 61 ClearAllocatedDIBs(); |
| 62 #endif |
| 59 } | 63 } |
| 60 | 64 |
| 61 int RenderWidgetHelper::GetNextRoutingID() { | 65 int RenderWidgetHelper::GetNextRoutingID() { |
| 62 return next_routing_id_.GetNext() + 1; | 66 return next_routing_id_.GetNext() + 1; |
| 63 } | 67 } |
| 64 | 68 |
| 65 void RenderWidgetHelper::CancelResourceRequests(int render_widget_id) { | 69 void RenderWidgetHelper::CancelResourceRequests(int render_widget_id) { |
| 66 if (g_browser_process->io_thread()) { | 70 if (g_browser_process->io_thread()) { |
| 67 g_browser_process->io_thread()->message_loop()->PostTask(FROM_HERE, | 71 g_browser_process->io_thread()->message_loop()->PostTask(FROM_HERE, |
| 68 NewRunnableMethod(this, | 72 NewRunnableMethod(this, |
| (...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 237 ui_loop_->PostTask(FROM_HERE, NewRunnableMethod( | 241 ui_loop_->PostTask(FROM_HERE, NewRunnableMethod( |
| 238 this, &RenderWidgetHelper::OnSimulateReceivedMessage, msg)); | 242 this, &RenderWidgetHelper::OnSimulateReceivedMessage, msg)); |
| 239 } | 243 } |
| 240 | 244 |
| 241 void RenderWidgetHelper::OnSimulateReceivedMessage( | 245 void RenderWidgetHelper::OnSimulateReceivedMessage( |
| 242 const IPC::Message& message) { | 246 const IPC::Message& message) { |
| 243 RenderProcessHost* host = RenderProcessHost::FromID(render_process_id_); | 247 RenderProcessHost* host = RenderProcessHost::FromID(render_process_id_); |
| 244 if (host) | 248 if (host) |
| 245 host->OnMessageReceived(message); | 249 host->OnMessageReceived(message); |
| 246 } | 250 } |
| 251 |
| 252 #if defined(OS_MACOSX) |
| 253 TransportDIB* RenderWidgetHelper::MapTransportDIB(TransportDIB::Id dib_id) { |
| 254 AutoLock locked(allocated_dibs_lock_); |
| 255 |
| 256 const std::map<TransportDIB::Id, int>::iterator |
| 257 i = allocated_dibs_.find(dib_id); |
| 258 if (i == allocated_dibs_.end()) |
| 259 return NULL; |
| 260 |
| 261 base::FileDescriptor fd(dup(i->second), true); |
| 262 return TransportDIB::Map(fd); |
| 263 } |
| 264 |
| 265 void RenderWidgetHelper::AllocTransportDIB( |
| 266 size_t size, IPC::Maybe<TransportDIB::Handle>* result) { |
| 267 base::SharedMemory* shared_memory = new base::SharedMemory(); |
| 268 if (!shared_memory->Create(L"", false /* read write */, |
| 269 false /* do not open existing */, size)) { |
| 270 result->valid = false; |
| 271 delete shared_memory; |
| 272 return; |
| 273 } |
| 274 |
| 275 result->valid = true; |
| 276 shared_memory->GiveToProcess(0 /* pid, not needed */, &result->value); |
| 277 |
| 278 // Keep a copy of the file descriptor around |
| 279 AutoLock locked(allocated_dibs_lock_); |
| 280 allocated_dibs_[shared_memory->id()] = dup(result->value.fd); |
| 281 } |
| 282 |
| 283 void RenderWidgetHelper::FreeTransportDIB(TransportDIB::Id dib_id) { |
| 284 AutoLock locked(allocated_dibs_lock_); |
| 285 |
| 286 const std::map<TransportDIB::Id, int>::iterator |
| 287 i = allocated_dibs_.find(dib_id); |
| 288 |
| 289 if (i != allocated_dibs_.end()) { |
| 290 close(i->second); |
| 291 allocated_dibs_.erase(i); |
| 292 } else { |
| 293 DLOG(WARNING) << "Renderer asked us to free unknown transport DIB"; |
| 294 } |
| 295 } |
| 296 |
| 297 void RenderWidgetHelper::ClearAllocatedDIBs() { |
| 298 for (std::map<TransportDIB::Id, int>::iterator |
| 299 i = allocated_dibs_.begin(); i != allocated_dibs_.end(); ++i) { |
| 300 close(i->second); |
| 301 } |
| 302 |
| 303 allocated_dibs_.clear(); |
| 304 } |
| 305 #endif |
| OLD | NEW |