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 |