diff options
author | kmadhusu@chromium.org <kmadhusu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-02-25 17:52:18 +0000 |
---|---|---|
committer | kmadhusu@chromium.org <kmadhusu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-02-25 17:52:18 +0000 |
commit | 0d9667bedff2c8f7e218a32806b17b39c3dcb407 (patch) | |
tree | b968128a7f6094afa1f0c08d9a4f9e4e05895bfa /content/browser | |
parent | 6d85939af0786b05485ff2d7a91be861df1687ba (diff) | |
download | chromium_src-0d9667bedff2c8f7e218a32806b17b39c3dcb407.zip chromium_src-0d9667bedff2c8f7e218a32806b17b39c3dcb407.tar.gz chromium_src-0d9667bedff2c8f7e218a32806b17b39c3dcb407.tar.bz2 |
Created a new BrowserMessageFilter to handle print related IPC messages.
Move print related IPC message handlers from render_message_filter to printing_message_filter.
BUG=none
TEST=printing works after code changes.
Review URL: http://codereview.chromium.org/6546051
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@76067 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content/browser')
3 files changed, 6 insertions, 298 deletions
diff --git a/content/browser/renderer_host/render_message_filter.cc b/content/browser/renderer_host/render_message_filter.cc index 6fefd70..8aef1ce 100644 --- a/content/browser/renderer_host/render_message_filter.cc +++ b/content/browser/renderer_host/render_message_filter.cc @@ -9,8 +9,6 @@ #include "base/command_line.h" #include "base/file_util.h" #include "base/metrics/histogram.h" -#include "base/process_util.h" -#include "base/shared_memory.h" #include "base/sys_string_conversions.h" #include "base/threading/worker_pool.h" #include "base/threading/thread.h" @@ -35,8 +33,6 @@ #include "chrome/browser/plugin_process_host.h" #include "chrome/browser/plugin_service.h" #include "chrome/browser/ppapi_plugin_process_host.h" -#include "chrome/browser/printing/print_job_manager.h" -#include "chrome/browser/printing/printer_query.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/renderer_host/browser_render_process_host.h" #include "chrome/browser/spellchecker_platform_engine.h" @@ -145,28 +141,6 @@ class WriteClipboardTask : public Task { scoped_ptr<ui::Clipboard::ObjectMap> objects_; }; -void RenderParamsFromPrintSettings(const printing::PrintSettings& settings, - ViewMsg_Print_Params* params) { - DCHECK(params); - params->page_size = settings.page_setup_device_units().physical_size(); - params->printable_size.SetSize( - settings.page_setup_device_units().content_area().width(), - settings.page_setup_device_units().content_area().height()); - params->margin_top = settings.page_setup_device_units().content_area().x(); - params->margin_left = settings.page_setup_device_units().content_area().y(); - params->dpi = settings.dpi(); - // Currently hardcoded at 1.25. See PrintSettings' constructor. - params->min_shrink = settings.min_shrink; - // Currently hardcoded at 2.0. See PrintSettings' constructor. - params->max_shrink = settings.max_shrink; - // Currently hardcoded at 72dpi. See PrintSettings' constructor. - params->desired_dpi = settings.desired_dpi; - // Always use an invalid cookie. - params->document_cookie = 0; - params->selection_only = settings.selection_only; - params->supports_alpha_blend = settings.supports_alpha_blend(); -} - // Common functionality for converting a sync renderer message to a callback // function in the browser. Derive from this, create it on the heap when // issuing your callback. When done, write your reply parameters into @@ -327,7 +301,6 @@ RenderMessageFilter::RenderMessageFilter( RenderWidgetHelper* render_widget_helper) : resource_dispatcher_host_(g_browser_process->resource_dispatcher_host()), plugin_service_(plugin_service), - print_job_manager_(g_browser_process->print_job_manager()), profile_(profile), content_settings_(profile->GetHostContentSettingsMap()), ALLOW_THIS_IN_INITIALIZER_LIST(resolve_proxy_msg_helper_(this, NULL)), @@ -343,12 +316,6 @@ RenderMessageFilter::RenderMessageFilter( DCHECK(request_context_); render_widget_helper_->Init(render_process_id_, resource_dispatcher_host_); -#if defined(OS_CHROMEOS) - cloud_print_enabled_ = true; -#else - cloud_print_enabled_ = CommandLine::ForCurrentProcess()->HasSwitch( - switches::kEnableCloudPrint); -#endif } RenderMessageFilter::~RenderMessageFilter() { @@ -443,24 +410,14 @@ bool RenderMessageFilter::OnMessageReceived(const IPC::Message& message, IPC_MESSAGE_HANDLER(ViewHostMsg_RevealFolderInOS, OnRevealFolderInOS) IPC_MESSAGE_HANDLER(ViewHostMsg_GetCPBrowsingContext, OnGetCPBrowsingContext) -#if defined(OS_WIN) - IPC_MESSAGE_HANDLER(ViewHostMsg_DuplicateSection, OnDuplicateSection) -#endif +#if defined(OS_POSIX) IPC_MESSAGE_HANDLER(ViewHostMsg_AllocateSharedMemoryBuffer, OnAllocateSharedMemoryBuffer) -#if defined(OS_CHROMEOS) - IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_AllocateTempFileForPrinting, - OnAllocateTempFileForPrinting) - IPC_MESSAGE_HANDLER(ViewHostMsg_TempFileForPrintingWritten, - OnTempFileForPrintingWritten) #endif IPC_MESSAGE_HANDLER(ViewHostMsg_ResourceTypeStats, OnResourceTypeStats) IPC_MESSAGE_HANDLER(ViewHostMsg_V8HeapStats, OnV8HeapStats) IPC_MESSAGE_HANDLER(ViewHostMsg_DidZoomURL, OnDidZoomURL) IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_ResolveProxy, OnResolveProxy) - IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_GetDefaultPrintSettings, - OnGetDefaultPrintSettings) - IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_ScriptedPrint, OnScriptedPrint) #if defined(OS_MACOSX) IPC_MESSAGE_HANDLER(ViewHostMsg_AllocTransportDIB, OnAllocTransportDIB) IPC_MESSAGE_HANDLER(ViewHostMsg_FreeTransportDIB, OnFreeTransportDIB) @@ -987,17 +944,7 @@ void RenderMessageFilter::OnGetCPBrowsingContext(uint32* context) { request_context_->GetURLRequestContext()); } -#if defined(OS_WIN) -void RenderMessageFilter::OnDuplicateSection( - base::SharedMemoryHandle renderer_handle, - base::SharedMemoryHandle* browser_handle) { - // Duplicate the handle in this process right now so the memory is kept alive - // (even if it is not mapped) - base::SharedMemory shared_buf(renderer_handle, true, peer_handle()); - shared_buf.GiveToProcess(base::GetCurrentProcessHandle(), browser_handle); -} -#endif - +#if defined(OS_POSIX) void RenderMessageFilter::OnAllocateSharedMemoryBuffer( uint32 buffer_size, base::SharedMemoryHandle* handle) { @@ -1007,8 +954,9 @@ void RenderMessageFilter::OnAllocateSharedMemoryBuffer( NOTREACHED() << "Cannot map shared memory buffer"; return; } - shared_buf.GiveToProcess(peer_handle(), handle); + shared_buf.GiveToProcess(base::GetCurrentProcessHandle(), handle); } +#endif void RenderMessageFilter::OnResourceTypeStats( const WebCache::ResourceTypeStats& stats) { @@ -1107,108 +1055,6 @@ void RenderMessageFilter::OnResolveProxyCompleted( Send(reply_msg); } -void RenderMessageFilter::OnGetDefaultPrintSettings(IPC::Message* reply_msg) { - scoped_refptr<printing::PrinterQuery> printer_query; - if (!print_job_manager_->printing_enabled()) { - // Reply with NULL query. - OnGetDefaultPrintSettingsReply(printer_query, reply_msg); - return; - } - - print_job_manager_->PopPrinterQuery(0, &printer_query); - if (!printer_query.get()) { - printer_query = new printing::PrinterQuery; - } - - CancelableTask* task = NewRunnableMethod( - this, - &RenderMessageFilter::OnGetDefaultPrintSettingsReply, - printer_query, - reply_msg); - // Loads default settings. This is asynchronous, only the IPC message sender - // will hang until the settings are retrieved. - printer_query->GetSettings(printing::PrinterQuery::DEFAULTS, - NULL, - 0, - false, - true, - task); -} - -void RenderMessageFilter::OnGetDefaultPrintSettingsReply( - scoped_refptr<printing::PrinterQuery> printer_query, - IPC::Message* reply_msg) { - ViewMsg_Print_Params params; - if (!printer_query.get() || - printer_query->last_status() != printing::PrintingContext::OK) { - memset(¶ms, 0, sizeof(params)); - } else { - RenderParamsFromPrintSettings(printer_query->settings(), ¶ms); - params.document_cookie = printer_query->cookie(); - } - ViewHostMsg_GetDefaultPrintSettings::WriteReplyParams(reply_msg, params); - Send(reply_msg); - // If printing was enabled. - if (printer_query.get()) { - // If user hasn't cancelled. - if (printer_query->cookie() && printer_query->settings().dpi()) { - print_job_manager_->QueuePrinterQuery(printer_query.get()); - } else { - printer_query->StopWorker(); - } - } -} - -void RenderMessageFilter::OnScriptedPrint( - const ViewHostMsg_ScriptedPrint_Params& params, - IPC::Message* reply_msg) { - gfx::NativeView host_view = - gfx::NativeViewFromIdInBrowser(params.host_window_id); - - scoped_refptr<printing::PrinterQuery> printer_query; - print_job_manager_->PopPrinterQuery(params.cookie, &printer_query); - if (!printer_query.get()) { - printer_query = new printing::PrinterQuery; - } - - CancelableTask* task = NewRunnableMethod( - this, - &RenderMessageFilter::OnScriptedPrintReply, - printer_query, - params.routing_id, - reply_msg); - - printer_query->GetSettings(printing::PrinterQuery::ASK_USER, - host_view, - params.expected_pages_count, - params.has_selection, - params.use_overlays, - task); -} - -void RenderMessageFilter::OnScriptedPrintReply( - scoped_refptr<printing::PrinterQuery> printer_query, - int routing_id, - IPC::Message* reply_msg) { - ViewMsg_PrintPages_Params params; - if (printer_query->last_status() != printing::PrintingContext::OK || - !printer_query->settings().dpi()) { - memset(¶ms, 0, sizeof(params)); - } else { - RenderParamsFromPrintSettings(printer_query->settings(), ¶ms.params); - params.params.document_cookie = printer_query->cookie(); - params.pages = - printing::PageRange::GetPages(printer_query->settings().ranges); - } - ViewHostMsg_ScriptedPrint::WriteReplyParams(reply_msg, params); - Send(reply_msg); - if (params.params.dpi && params.params.document_cookie) { - print_job_manager_->QueuePrinterQuery(printer_query.get()); - } else { - printer_query->StopWorker(); - } -} - // static ui::Clipboard* RenderMessageFilter::GetClipboard() { // We have a static instance of the clipboard service for use by all message diff --git a/content/browser/renderer_host/render_message_filter.h b/content/browser/renderer_host/render_message_filter.h index 4f16c62..34fbd71 100644 --- a/content/browser/renderer_host/render_message_filter.h +++ b/content/browser/renderer_host/render_message_filter.h @@ -54,13 +54,6 @@ namespace net { class CookieStore; } -namespace printing { -class PrinterQuery; -class PrintJobManager; -} - -struct ViewHostMsg_ScriptedPrint_Params; - // This class filters out incoming IPC messages for the renderer process on the // IPC thread. class RenderMessageFilter : public BrowserMessageFilter, @@ -216,24 +209,13 @@ class RenderMessageFilter : public BrowserMessageFilter, void OnRevealFolderInOS(const FilePath& path); void OnGetCPBrowsingContext(uint32* context); -#if defined(OS_WIN) - // Used to pass resulting EMF from renderer to browser in printing. - void OnDuplicateSection(base::SharedMemoryHandle renderer_handle, - base::SharedMemoryHandle* browser_handle); -#endif - -#if defined(OS_CHROMEOS) - // Used to ask the browser allocate a temporary file for the renderer - // to fill in resulting PDF in renderer. - void OnAllocateTempFileForPrinting(IPC::Message* reply_msg); - void OnTempFileForPrintingWritten(int sequence_number); -#endif - +#if defined(OS_POSIX) // Used to ask the browser to allocate a block of shared memory for the // renderer to send back data in, since shared memory can't be created // in the renderer on POSIX due to the sandbox. void OnAllocateSharedMemoryBuffer(uint32 buffer_size, base::SharedMemoryHandle* handle); +#endif void OnResourceTypeStats(const WebKit::WebCache::ResourceTypeStats& stats); static void OnResourceTypeStatsOnUIThread( @@ -262,24 +244,6 @@ class RenderMessageFilter : public BrowserMessageFilter, int result, const std::string& proxy_list); - // A javascript code requested to print the current page. This is done in two - // steps and this is the first step. Get the print setting right here - // synchronously. It will hang the I/O completely. - void OnGetDefaultPrintSettings(IPC::Message* reply_msg); - void OnGetDefaultPrintSettingsReply( - scoped_refptr<printing::PrinterQuery> printer_query, - IPC::Message* reply_msg); - - // A javascript code requested to print the current page. The renderer host - // have to show to the user the print dialog and returns the selected print - // settings. - void OnScriptedPrint(const ViewHostMsg_ScriptedPrint_Params& params, - IPC::Message* reply_msg); - void OnScriptedPrintReply( - scoped_refptr<printing::PrinterQuery> printer_query, - int routing_id, - IPC::Message* reply_msg); - // Browser side transport DIB allocation void OnAllocTransportDIB(size_t size, bool cache_in_browser, @@ -353,8 +317,6 @@ class RenderMessageFilter : public BrowserMessageFilter, IPC::Message* reply_msg); void DoOnClipboardReadFilenames(ui::Clipboard::Buffer buffer, IPC::Message* reply_msg); - void DoOnAllocateTempFileForPrinting(IPC::Message* reply_msg); - void DoOnTempFileForPrintingWritten(int sequence_number); #endif bool CheckBenchmarkingEnabled() const; @@ -371,7 +333,6 @@ class RenderMessageFilter : public BrowserMessageFilter, // by the BrowserProcess, which has a wider scope than we do. ResourceDispatcherHost* resource_dispatcher_host_; PluginService* plugin_service_; - printing::PrintJobManager* print_job_manager_; // The Profile associated with our renderer process. This should only be // accessed on the UI thread! @@ -403,8 +364,6 @@ class RenderMessageFilter : public BrowserMessageFilter, // Whether this process is used for off the record tabs. bool off_the_record_; - bool cloud_print_enabled_; - base::TimeTicks last_plugin_refresh_time_; // Initialized to 0. scoped_refptr<WebKitContext> webkit_context_; diff --git a/content/browser/renderer_host/render_message_filter_gtk.cc b/content/browser/renderer_host/render_message_filter_gtk.cc index ce260c4..1d25313 100644 --- a/content/browser/renderer_host/render_message_filter_gtk.cc +++ b/content/browser/renderer_host/render_message_filter_gtk.cc @@ -4,14 +4,7 @@ #include "content/browser/renderer_host/render_message_filter.h" -#include <fcntl.h> -#include <map> - -#include "base/file_util.h" -#include "base/lazy_instance.h" -#include "base/path_service.h" #include "chrome/browser/browser_thread.h" -#include "chrome/common/chrome_paths.h" #include "chrome/common/render_messages.h" #include "third_party/WebKit/Source/WebKit/chromium/public/WebScreenInfo.h" #include "third_party/WebKit/Source/WebKit/chromium/public/x11/WebScreenInfoFactory.h" @@ -19,28 +12,9 @@ #include "ui/base/x/x11_util.h" #include "ui/gfx/gtk_native_view_id_manager.h" -#if defined(OS_CHROMEOS) -#include "chrome/browser/printing/print_dialog_cloud.h" -#endif - using WebKit::WebScreenInfo; using WebKit::WebScreenInfoFactory; -namespace { - -typedef std::map<int, FilePath> SequenceToPathMap; - -struct PrintingSequencePathMap { - SequenceToPathMap map; - int sequence; -}; - -// No locking, only access on the FILE thread. -static base::LazyInstance<PrintingSequencePathMap> - g_printing_file_descriptor_map(base::LINKER_INITIALIZED); - -} // namespace - // We get null window_ids passed into the two functions below; please see // http://crbug.com/9060 for more details. @@ -175,56 +149,6 @@ void RenderMessageFilter::DoOnClipboardReadFilenames( Send(reply_msg); } -#if defined(OS_CHROMEOS) -void RenderMessageFilter::DoOnAllocateTempFileForPrinting( - IPC::Message* reply_msg) { - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); - base::FileDescriptor temp_file_fd(-1, false); - SequenceToPathMap* map = &g_printing_file_descriptor_map.Get().map; - const int sequence_number = g_printing_file_descriptor_map.Get().sequence++; - - FilePath path; - if (file_util::CreateTemporaryFile(&path)) { - int fd = open(path.value().c_str(), O_WRONLY); - if (fd >= 0) { - SequenceToPathMap::iterator it = map->find(sequence_number); - if (it != map->end()) { - NOTREACHED() << "Sequence number already in use. seq=" << - sequence_number; - } else { - (*map)[sequence_number] = path; - temp_file_fd.fd = fd; - temp_file_fd.auto_close = true; - } - } - } - - ViewHostMsg_AllocateTempFileForPrinting::WriteReplyParams( - reply_msg, temp_file_fd, sequence_number); - Send(reply_msg); -} - -void RenderMessageFilter::DoOnTempFileForPrintingWritten(int sequence_number) { - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); - SequenceToPathMap* map = &g_printing_file_descriptor_map.Get().map; - SequenceToPathMap::iterator it = map->find(sequence_number); - if (it == map->end()) { - NOTREACHED() << "Got a sequence that we didn't pass to the " - "renderer: " << sequence_number; - return; - } - - if (cloud_print_enabled_) - PrintDialogCloud::CreatePrintDialogForPdf(it->second, string16(), true); - else - NOTIMPLEMENTED(); - - // Erase the entry in the map. - map->erase(it); -} - -#endif // defined(OS_CHROMEOS) - void RenderMessageFilter::OnGetScreenInfo(gfx::NativeViewId view, IPC::Message* reply_msg) { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); @@ -323,24 +247,3 @@ void RenderMessageFilter::OnClipboardReadFilenames( this, &RenderMessageFilter::DoOnClipboardReadFilenames, buffer, reply_msg)); } - -#if defined(OS_CHROMEOS) -void RenderMessageFilter::OnAllocateTempFileForPrinting( - IPC::Message* reply_msg) { - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); - BrowserThread::PostTask( - BrowserThread::FILE, FROM_HERE, - NewRunnableMethod( - this, &RenderMessageFilter::DoOnAllocateTempFileForPrinting, - reply_msg)); -} - -void RenderMessageFilter::OnTempFileForPrintingWritten(int sequence_number) { - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); - BrowserThread::PostTask( - BrowserThread::FILE, FROM_HERE, - NewRunnableMethod( - this, &RenderMessageFilter::DoOnTempFileForPrintingWritten, - sequence_number)); -} -#endif // defined(OS_CHROMEOS) |