| 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/resource_message_filter.h" | 5 #include "chrome/browser/resource_message_filter.h" |
| 6 | 6 |
| 7 #include "base/clipboard.h" | 7 #include "base/clipboard.h" |
| 8 #include "base/gfx/native_widget_types.h" | 8 #include "base/gfx/native_widget_types.h" |
| 9 #include "base/histogram.h" | 9 #include "base/histogram.h" |
| 10 #include "base/thread.h" | 10 #include "base/thread.h" |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 55 host->OnMessageReceived(context_menu_message_); | 55 host->OnMessageReceived(context_menu_message_); |
| 56 } | 56 } |
| 57 | 57 |
| 58 private: | 58 private: |
| 59 int render_process_host_id_; | 59 int render_process_host_id_; |
| 60 const ViewHostMsg_ContextMenu context_menu_message_; | 60 const ViewHostMsg_ContextMenu context_menu_message_; |
| 61 | 61 |
| 62 DISALLOW_COPY_AND_ASSIGN(ContextMenuMessageDispatcher); | 62 DISALLOW_COPY_AND_ASSIGN(ContextMenuMessageDispatcher); |
| 63 }; | 63 }; |
| 64 | 64 |
| 65 // Completes a clipboard write initiated by the renderer. The write must be |
| 66 // performed on the UI thread because the clipboard service from the IO thread |
| 67 // cannot create windows so it cannot be the "owner" of the clipboard's |
| 68 // contents. |
| 69 class WriteClipboardTask : public Task { |
| 70 public: |
| 71 explicit WriteClipboardTask(Clipboard::ObjectMap* objects) |
| 72 : objects_(objects) {} |
| 73 ~WriteClipboardTask() {} |
| 74 |
| 75 void Run() { |
| 76 g_browser_process->clipboard_service()->WriteObjects(*objects_.get()); |
| 77 } |
| 78 |
| 79 private: |
| 80 scoped_ptr<Clipboard::ObjectMap> objects_; |
| 81 }; |
| 82 |
| 83 |
| 65 } // namespace | 84 } // namespace |
| 66 | 85 |
| 67 ResourceMessageFilter::ResourceMessageFilter( | 86 ResourceMessageFilter::ResourceMessageFilter( |
| 68 ResourceDispatcherHost* resource_dispatcher_host, | 87 ResourceDispatcherHost* resource_dispatcher_host, |
| 69 PluginService* plugin_service, | 88 PluginService* plugin_service, |
| 70 printing::PrintJobManager* print_job_manager, | 89 printing::PrintJobManager* print_job_manager, |
| 71 int render_process_host_id, | 90 int render_process_host_id, |
| 72 Profile* profile, | 91 Profile* profile, |
| 73 RenderWidgetHelper* render_widget_helper, | 92 RenderWidgetHelper* render_widget_helper, |
| 74 SpellChecker* spellchecker) | 93 SpellChecker* spellchecker) |
| (...skipping 363 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 438 const GURL& referrer) { | 457 const GURL& referrer) { |
| 439 resource_dispatcher_host_->BeginDownload(url, | 458 resource_dispatcher_host_->BeginDownload(url, |
| 440 referrer, | 459 referrer, |
| 441 render_process_host_id_, | 460 render_process_host_id_, |
| 442 message.routing_id(), | 461 message.routing_id(), |
| 443 request_context_); | 462 request_context_); |
| 444 } | 463 } |
| 445 | 464 |
| 446 void ResourceMessageFilter::OnClipboardWriteObjects( | 465 void ResourceMessageFilter::OnClipboardWriteObjects( |
| 447 const Clipboard::ObjectMap& objects) { | 466 const Clipboard::ObjectMap& objects) { |
| 467 // We cannot write directly from the IO thread, and cannot service the IPC |
| 468 // on the UI thread. We'll copy the relevant data and get a handle to any |
| 469 // shared memory so it doesn't go away when we resume the renderer, and post |
| 470 // a task to perform the write on the UI thread. |
| 471 Clipboard::ObjectMap* long_living_objects = new Clipboard::ObjectMap(objects);
|
| 472 |
| 448 // We pass the render_handle_ to assist the clipboard with using shared | 473 // We pass the render_handle_ to assist the clipboard with using shared |
| 449 // memory objects. render_handle_ is a handle to the process that would | 474 // memory objects. render_handle_ is a handle to the process that would |
| 450 // own any shared memory that might be in the object list. | 475 // own any shared memory that might be in the object list. |
| 451 GetClipboardService()->WriteObjects(objects, render_handle_); | 476 Clipboard::DuplicateRemoteHandles(render_handle_, long_living_objects); |
| 477 |
| 478 render_widget_helper_->ui_loop()->PostTask(FROM_HERE, |
| 479 new WriteClipboardTask(long_living_objects)); |
| 452 } | 480 } |
| 453 | 481 |
| 454 void ResourceMessageFilter::OnClipboardIsFormatAvailable(unsigned int format, | 482 void ResourceMessageFilter::OnClipboardIsFormatAvailable(unsigned int format, |
| 455 bool* result) { | 483 bool* result) { |
| 456 DCHECK(result); | 484 DCHECK(result); |
| 457 *result = GetClipboardService()->IsFormatAvailable(format); | 485 *result = GetClipboardService()->IsFormatAvailable(format); |
| 458 } | 486 } |
| 459 | 487 |
| 460 void ResourceMessageFilter::OnClipboardReadText(std::wstring* result) { | 488 void ResourceMessageFilter::OnClipboardReadText(std::wstring* result) { |
| 461 GetClipboardService()->ReadText(result); | 489 GetClipboardService()->ReadText(result); |
| (...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 686 if (type == NOTIFY_SPELLCHECKER_REINITIALIZED) { | 714 if (type == NOTIFY_SPELLCHECKER_REINITIALIZED) { |
| 687 spellchecker_ = Details<SpellcheckerReinitializedDetails> | 715 spellchecker_ = Details<SpellcheckerReinitializedDetails> |
| 688 (details).ptr()->spellchecker; | 716 (details).ptr()->spellchecker; |
| 689 } | 717 } |
| 690 } | 718 } |
| 691 | 719 |
| 692 void ResourceMessageFilter::OnDnsPrefetch( | 720 void ResourceMessageFilter::OnDnsPrefetch( |
| 693 const std::vector<std::string>& hostnames) { | 721 const std::vector<std::string>& hostnames) { |
| 694 chrome_browser_net::DnsPrefetchList(hostnames); | 722 chrome_browser_net::DnsPrefetchList(hostnames); |
| 695 } | 723 } |
| OLD | NEW |