Index: chrome/browser/renderer_host/resource_message_filter.cc |
=================================================================== |
--- chrome/browser/renderer_host/resource_message_filter.cc (revision 69057) |
+++ chrome/browser/renderer_host/resource_message_filter.cc (working copy) |
@@ -1,1763 +0,0 @@ |
-// Copyright (c) 2010 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "chrome/browser/renderer_host/resource_message_filter.h" |
- |
-#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/thread.h" |
-#include "base/utf_string_conversions.h" |
-#include "base/worker_pool.h" |
-#include "chrome/browser/automation/automation_resource_message_filter.h" |
-#include "chrome/browser/browser_process.h" |
-#include "chrome/browser/browser_thread.h" |
-#include "chrome/browser/child_process_security_policy.h" |
-#include "chrome/browser/chrome_plugin_browsing_context.h" |
-#include "chrome/browser/clipboard_dispatcher.h" |
-#include "chrome/browser/download/download_types.h" |
-#include "chrome/browser/extensions/extension_message_service.h" |
-#include "chrome/browser/geolocation/geolocation_dispatcher_host_old.h" |
-#include "chrome/browser/geolocation/geolocation_permission_context.h" |
-#include "chrome/browser/gpu_process_host.h" |
-#include "chrome/browser/host_zoom_map.h" |
-#include "chrome/browser/metrics/histogram_synchronizer.h" |
-#include "chrome/browser/nacl_host/nacl_process_host.h" |
-#include "chrome/browser/net/chrome_url_request_context.h" |
-#include "chrome/browser/net/predictor_api.h" |
-#include "chrome/browser/notifications/desktop_notification_service.h" |
-#include "chrome/browser/notifications/notifications_prefs_cache.h" |
-#include "chrome/browser/platform_util.h" |
-#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/renderer_host/render_view_host_delegate.h" |
-#include "chrome/browser/renderer_host/render_view_host_notification_task.h" |
-#include "chrome/browser/renderer_host/render_widget_helper.h" |
-#include "chrome/browser/spellchecker_platform_engine.h" |
-#include "chrome/browser/task_manager/task_manager.h" |
-#include "chrome/browser/worker_host/message_port_dispatcher.h" |
-#include "chrome/browser/worker_host/worker_service.h" |
-#include "chrome/common/chrome_switches.h" |
-#include "chrome/common/extensions/extension_file_util.h" |
-#include "chrome/common/extensions/extension_message_bundle.h" |
-#include "chrome/common/notification_service.h" |
-#include "chrome/common/render_messages.h" |
-#include "chrome/common/render_messages_params.h" |
-#include "chrome/common/url_constants.h" |
-#include "ipc/ipc_channel_handle.h" |
-#include "net/base/cookie_monster.h" |
-#include "net/base/io_buffer.h" |
-#include "net/base/keygen_handler.h" |
-#include "net/base/mime_util.h" |
-#include "net/base/net_errors.h" |
-#include "net/disk_cache/disk_cache.h" |
-#include "net/http/http_cache.h" |
-#include "net/http/http_network_layer.h" |
-#include "net/url_request/url_request_context.h" |
-#include "third_party/WebKit/WebKit/chromium/public/WebNotificationPresenter.h" |
-#include "webkit/glue/context_menu.h" |
-#include "webkit/glue/plugins/plugin_group.h" |
-#include "webkit/glue/plugins/plugin_list.h" |
-#include "webkit/glue/plugins/webplugin.h" |
-#include "webkit/glue/webcookie.h" |
-#include "webkit/glue/webkit_glue.h" |
- |
-#if defined(OS_CHROMEOS) |
-#include "chrome/browser/chromeos/plugin_selection_policy.h" |
-#endif |
-#if defined(OS_MACOSX) |
-#include "chrome/browser/ui/cocoa/task_helpers.h" |
-#include "chrome/common/font_descriptor_mac.h" |
-#include "chrome/common/font_loader_mac.h" |
-#endif |
-#if defined(OS_POSIX) |
-#include "base/file_descriptor_posix.h" |
-#endif |
-#if defined(OS_WIN) |
-#include "chrome/common/child_process_host.h" |
-#endif |
-#if defined(USE_TCMALLOC) |
-#include "chrome/browser/browser_about_handler.h" |
-#endif |
- |
-using net::CookieStore; |
-using WebKit::WebCache; |
- |
-namespace { |
- |
-const int kPluginsRefreshThresholdInSeconds = 3; |
- |
-// Context menus are somewhat complicated. We need to intercept them here on |
-// the I/O thread to add any spelling suggestions to them. After that's done, |
-// we need to forward the modified message to the UI thread and the normal |
-// message forwarding isn't set up for sending modified messages. |
-// |
-// Therefore, this class dispatches the IPC message to the RenderProcessHost |
-// with the given ID (if possible) to emulate the normal dispatch. |
-class ContextMenuMessageDispatcher : public Task { |
- public: |
- ContextMenuMessageDispatcher( |
- int render_process_id, |
- const ViewHostMsg_ContextMenu& context_menu_message) |
- : render_process_id_(render_process_id), |
- context_menu_message_(context_menu_message) { |
- } |
- |
- void Run() { |
- RenderProcessHost* host = |
- RenderProcessHost::FromID(render_process_id_); |
- if (host) |
- host->OnMessageReceived(context_menu_message_); |
- } |
- |
- private: |
- int render_process_id_; |
- const ViewHostMsg_ContextMenu context_menu_message_; |
- |
- DISALLOW_COPY_AND_ASSIGN(ContextMenuMessageDispatcher); |
-}; |
- |
-// Completes a clipboard write initiated by the renderer. The write must be |
-// performed on the UI thread because the clipboard service from the IO thread |
-// cannot create windows so it cannot be the "owner" of the clipboard's |
-// contents. |
-class WriteClipboardTask : public Task { |
- public: |
- explicit WriteClipboardTask(Clipboard::ObjectMap* objects) |
- : objects_(objects) {} |
- ~WriteClipboardTask() {} |
- |
- void Run() { |
- g_browser_process->clipboard()->WriteObjects(*objects_.get()); |
- } |
- |
- private: |
- scoped_ptr<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; |
-} |
- |
-class ClearCacheCompletion : public net::CompletionCallback { |
- public: |
- ClearCacheCompletion(IPC::Message* reply_msg, |
- ResourceMessageFilter* filter) |
- : reply_msg_(reply_msg), |
- filter_(filter) { |
- } |
- |
- virtual void RunWithParams(const Tuple1<int>& params) { |
- ViewHostMsg_ClearCache::WriteReplyParams(reply_msg_, params.a); |
- filter_->Send(reply_msg_); |
- delete this; |
- } |
- |
- private: |
- IPC::Message* reply_msg_; |
- scoped_refptr<ResourceMessageFilter> filter_; |
-}; |
- |
-class OpenChannelToPluginCallback : public PluginProcessHost::Client { |
- public: |
- OpenChannelToPluginCallback(ResourceMessageFilter* filter, |
- IPC::Message* reply_msg) |
- : filter_(filter), |
- reply_msg_(reply_msg) { |
- } |
- |
- virtual int ID() { |
- return filter_->id(); |
- } |
- |
- virtual bool OffTheRecord() { |
- return filter_->off_the_record(); |
- } |
- |
- virtual void SetPluginInfo(const WebPluginInfo& info) { |
- info_ = info; |
- } |
- |
- virtual void OnChannelOpened(const IPC::ChannelHandle& handle) { |
- WriteReply(handle); |
- } |
- |
- virtual void OnError() { |
- WriteReply(IPC::ChannelHandle()); |
- } |
- |
- private: |
- void WriteReply(const IPC::ChannelHandle& handle) { |
- ViewHostMsg_OpenChannelToPlugin::WriteReplyParams(reply_msg_, |
- handle, |
- info_); |
- filter_->Send(reply_msg_); |
- delete this; |
- } |
- |
- scoped_refptr<ResourceMessageFilter> filter_; |
- IPC::Message* reply_msg_; |
- WebPluginInfo info_; |
-}; |
- |
-} // namespace |
- |
-ResourceMessageFilter::ResourceMessageFilter( |
- ResourceDispatcherHost* resource_dispatcher_host, |
- int child_id, |
- PluginService* plugin_service, |
- printing::PrintJobManager* print_job_manager, |
- Profile* profile, |
- RenderWidgetHelper* render_widget_helper) |
- : Receiver(RENDER_PROCESS, child_id), |
- channel_(NULL), |
- resource_dispatcher_host_(resource_dispatcher_host), |
- plugin_service_(plugin_service), |
- print_job_manager_(print_job_manager), |
- profile_(profile), |
- ALLOW_THIS_IN_INITIALIZER_LIST(resolve_proxy_msg_helper_(this, NULL)), |
- media_request_context_(profile->GetRequestContextForMedia()), |
- extensions_request_context_(profile->GetRequestContextForExtensions()), |
- render_widget_helper_(render_widget_helper), |
- notification_prefs_( |
- profile->GetDesktopNotificationService()->prefs_cache()), |
- host_zoom_map_(profile->GetHostZoomMap()), |
- off_the_record_(profile->IsOffTheRecord()), |
- next_route_id_callback_(NewCallbackWithReturnValue( |
- render_widget_helper, &RenderWidgetHelper::GetNextRoutingID)), |
- ALLOW_THIS_IN_INITIALIZER_LIST(geolocation_dispatcher_host_( |
- GeolocationDispatcherHostOld::New( |
- this->id(), profile->GetGeolocationPermissionContext()))), |
- webkit_context_(profile->GetWebKitContext()) { |
- request_context_ = profile_->GetRequestContext(); |
- DCHECK(request_context_); |
- DCHECK(media_request_context_); |
- |
- render_widget_helper_->Init(id(), resource_dispatcher_host_); |
-#if defined(OS_CHROMEOS) |
- cloud_print_enabled_ = true; |
-#else |
- cloud_print_enabled_ = CommandLine::ForCurrentProcess()->HasSwitch( |
- switches::kEnableCloudPrint); |
-#endif |
-} |
- |
-ResourceMessageFilter::~ResourceMessageFilter() { |
- // This function should be called on the IO thread. |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- |
- // Let interested observers know we are being deleted. |
- NotificationService::current()->Notify( |
- NotificationType::RESOURCE_MESSAGE_FILTER_SHUTDOWN, |
- Source<ResourceMessageFilter>(this), |
- NotificationService::NoDetails()); |
- |
- if (handle()) |
- base::CloseProcessHandle(handle()); |
-} |
- |
-// Called on the IPC thread: |
-void ResourceMessageFilter::OnFilterAdded(IPC::Channel* channel) { |
- channel_ = channel; |
-} |
- |
-// Called on the IPC thread: |
-void ResourceMessageFilter::OnChannelConnected(int32 peer_pid) { |
- DCHECK(!handle()) << " " << handle(); |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- |
- base::ProcessHandle peer_handle; |
- if (!base::OpenProcessHandle(peer_pid, &peer_handle)) { |
- NOTREACHED(); |
- } |
- set_handle(peer_handle); |
- |
- WorkerService::GetInstance()->Initialize(resource_dispatcher_host_); |
-} |
- |
-void ResourceMessageFilter::OnChannelError() { |
- NotificationService::current()->Notify( |
- NotificationType::RESOURCE_MESSAGE_FILTER_SHUTDOWN, |
- Source<ResourceMessageFilter>(this), |
- NotificationService::NoDetails()); |
-} |
- |
-// Called on the IPC thread: |
-void ResourceMessageFilter::OnChannelClosing() { |
- channel_ = NULL; |
- |
- // Unhook us from all pending network requests so they don't get sent to a |
- // deleted object. |
- resource_dispatcher_host_->CancelRequestsForProcess(id()); |
-} |
- |
-// Called on the IPC thread: |
-bool ResourceMessageFilter::OnMessageReceived(const IPC::Message& msg) { |
- MessagePortDispatcher* mp_dispatcher = MessagePortDispatcher::GetInstance(); |
- bool msg_is_ok = true; |
- bool handled = |
- resource_dispatcher_host_->OnMessageReceived(msg, this, &msg_is_ok) || |
- mp_dispatcher->OnMessageReceived( |
- msg, this, next_route_id_callback(), &msg_is_ok) || |
- geolocation_dispatcher_host_->OnMessageReceived(msg, &msg_is_ok); |
- |
- if (!handled) { |
- DCHECK(msg_is_ok); // It should have been marked handled if it wasn't OK. |
- handled = true; |
- IPC_BEGIN_MESSAGE_MAP_EX(ResourceMessageFilter, msg, msg_is_ok) |
- // On Linux we need to dispatch these messages to the UI2 thread |
- // because we cannot make X calls from the IO thread. Mac |
- // doesn't have windowed plug-ins so we handle the messages in |
- // the UI thread. On Windows, we intercept the messages and |
- // handle them directly. |
-#if !defined(OS_MACOSX) |
- IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_GetScreenInfo, |
- OnGetScreenInfo) |
- IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_GetWindowRect, |
- OnGetWindowRect) |
- IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_GetRootWindowRect, |
- OnGetRootWindowRect) |
-#endif |
- |
- IPC_MESSAGE_HANDLER(ViewHostMsg_CreateWindow, OnMsgCreateWindow) |
- IPC_MESSAGE_HANDLER(ViewHostMsg_CreateWidget, OnMsgCreateWidget) |
- IPC_MESSAGE_HANDLER(ViewHostMsg_CreateFullscreenWidget, |
- OnMsgCreateFullscreenWidget) |
- IPC_MESSAGE_HANDLER(ViewHostMsg_SetCookie, OnSetCookie) |
- IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_GetCookies, OnGetCookies) |
- IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_GetRawCookies, |
- OnGetRawCookies) |
- IPC_MESSAGE_HANDLER(ViewHostMsg_DeleteCookie, OnDeleteCookie) |
- IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_CookiesEnabled, |
- OnCookiesEnabled) |
-#if defined(OS_MACOSX) |
- IPC_MESSAGE_HANDLER(ViewHostMsg_LoadFont, OnLoadFont) |
-#endif |
-#if defined(OS_WIN) // This hack is Windows-specific. |
- IPC_MESSAGE_HANDLER(ViewHostMsg_PreCacheFont, OnPreCacheFont) |
-#endif |
- IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_GetPlugins, OnGetPlugins) |
- IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_GetPluginInfo, |
- OnGetPluginInfo) |
- IPC_MESSAGE_HANDLER(ViewHostMsg_DownloadUrl, OnDownloadUrl) |
- IPC_MESSAGE_HANDLER_GENERIC(ViewHostMsg_ContextMenu, |
- OnReceiveContextMenuMsg(msg)) |
- IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_OpenChannelToPlugin, |
- OnOpenChannelToPlugin) |
- IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_OpenChannelToPepperPlugin, |
- OnOpenChannelToPepperPlugin) |
- IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_LaunchNaCl, OnLaunchNaCl) |
- IPC_MESSAGE_HANDLER(ViewHostMsg_CreateWorker, OnCreateWorker) |
- IPC_MESSAGE_HANDLER(ViewHostMsg_LookupSharedWorker, OnLookupSharedWorker) |
- IPC_MESSAGE_HANDLER(ViewHostMsg_DocumentDetached, OnDocumentDetached) |
- IPC_MESSAGE_HANDLER(ViewHostMsg_CancelCreateDedicatedWorker, |
- OnCancelCreateDedicatedWorker) |
- IPC_MESSAGE_HANDLER(ViewHostMsg_ForwardToWorker, |
- OnForwardToWorker) |
- IPC_MESSAGE_HANDLER(ViewHostMsg_SpellChecker_PlatformCheckSpelling, |
- OnPlatformCheckSpelling) |
- IPC_MESSAGE_HANDLER(ViewHostMsg_SpellChecker_PlatformFillSuggestionList, |
- OnPlatformFillSuggestionList) |
- IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_GetDocumentTag, |
- OnGetDocumentTag) |
- IPC_MESSAGE_HANDLER(ViewHostMsg_DocumentWithTagClosed, |
- OnDocumentWithTagClosed) |
- IPC_MESSAGE_HANDLER(ViewHostMsg_ShowSpellingPanel, OnShowSpellingPanel) |
- IPC_MESSAGE_HANDLER(ViewHostMsg_UpdateSpellingPanelWithMisspelledWord, |
- OnUpdateSpellingPanelWithMisspelledWord) |
- IPC_MESSAGE_HANDLER(ViewHostMsg_DnsPrefetch, OnDnsPrefetch) |
- IPC_MESSAGE_HANDLER(ViewHostMsg_RendererHistograms, |
- OnRendererHistograms) |
- IPC_MESSAGE_HANDLER_GENERIC(ViewHostMsg_UpdateRect, |
- render_widget_helper_->DidReceiveUpdateMsg(msg)) |
- IPC_MESSAGE_HANDLER(ViewHostMsg_ClipboardWriteObjectsAsync, |
- OnClipboardWriteObjectsAsync) |
- IPC_MESSAGE_HANDLER(ViewHostMsg_ClipboardWriteObjectsSync, |
- OnClipboardWriteObjectsSync) |
- IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_ClipboardIsFormatAvailable, |
- OnClipboardIsFormatAvailable) |
- IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_ClipboardReadText, |
- OnClipboardReadText) |
- IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_ClipboardReadAsciiText, |
- OnClipboardReadAsciiText) |
- IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_ClipboardReadHTML, |
- OnClipboardReadHTML) |
-#if defined(OS_MACOSX) |
- IPC_MESSAGE_HANDLER(ViewHostMsg_ClipboardFindPboardWriteStringAsync, |
- OnClipboardFindPboardWriteString) |
-#endif |
- IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_ClipboardReadAvailableTypes, |
- OnClipboardReadAvailableTypes) |
- IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_ClipboardReadData, |
- OnClipboardReadData) |
- IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_ClipboardReadFilenames, |
- OnClipboardReadFilenames) |
- IPC_MESSAGE_HANDLER(ViewHostMsg_CheckNotificationPermission, |
- OnCheckNotificationPermission) |
- 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_MACOSX) |
- IPC_MESSAGE_HANDLER(ViewHostMsg_AllocatePDFTransport, |
- OnAllocateSharedMemoryBuffer) |
-#endif |
-#if defined(OS_POSIX) |
- IPC_MESSAGE_HANDLER(ViewHostMsg_AllocateSharedMemoryBuffer, |
- OnAllocateSharedMemoryBuffer) |
-#endif |
-#if defined(OS_POSIX) && !defined(OS_MACOSX) |
- 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) |
-#endif |
- IPC_MESSAGE_HANDLER(ViewHostMsg_OpenChannelToExtension, |
- OnOpenChannelToExtension) |
- IPC_MESSAGE_HANDLER(ViewHostMsg_OpenChannelToTab, OnOpenChannelToTab) |
- IPC_MESSAGE_HANDLER(ViewHostMsg_CloseCurrentConnections, |
- OnCloseCurrentConnections) |
- IPC_MESSAGE_HANDLER(ViewHostMsg_SetCacheMode, OnSetCacheMode) |
- IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_ClearCache, OnClearCache) |
- IPC_MESSAGE_HANDLER(ViewHostMsg_DidGenerateCacheableMetadata, |
- OnCacheableMetadataAvailable) |
- IPC_MESSAGE_HANDLER(ViewHostMsg_EnableSpdy, OnEnableSpdy) |
- IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_Keygen, OnKeygen) |
- IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_GetExtensionMessageBundle, |
- OnGetExtensionMessageBundle) |
-#if defined(USE_TCMALLOC) |
- IPC_MESSAGE_HANDLER(ViewHostMsg_RendererTcmalloc, OnRendererTcmalloc) |
-#endif |
- IPC_MESSAGE_HANDLER(ViewHostMsg_EstablishGpuChannel, |
- OnEstablishGpuChannel) |
- IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_SynchronizeGpu, |
- OnSynchronizeGpu) |
- IPC_MESSAGE_HANDLER(ViewHostMsg_AsyncOpenFile, OnAsyncOpenFile) |
- IPC_MESSAGE_UNHANDLED( |
- handled = false) |
- IPC_END_MESSAGE_MAP_EX() |
- } |
- |
- if (!msg_is_ok) |
- BrowserRenderProcessHost::BadMessageTerminateProcess(msg.type(), handle()); |
- |
- return handled; |
-} |
- |
-void ResourceMessageFilter::OnRevealFolderInOS(const FilePath& path) { |
-#if defined(OS_MACOSX) |
- const BrowserThread::ID kThreadID = BrowserThread::UI; |
-#else |
- const BrowserThread::ID kThreadID = BrowserThread::FILE; |
-#endif |
- if (!BrowserThread::CurrentlyOn(kThreadID)) { |
- // Only honor the request if appropriate persmissions are granted. |
- if (ChildProcessSecurityPolicy::GetInstance()->CanReadFile(id(), path)) |
- BrowserThread::PostTask( |
- kThreadID, FROM_HERE, |
- NewRunnableMethod( |
- this, &ResourceMessageFilter::OnRevealFolderInOS, path)); |
- return; |
- } |
- |
- DCHECK(BrowserThread::CurrentlyOn(kThreadID)); |
- platform_util::OpenItem(path); |
-} |
- |
-void ResourceMessageFilter::OnDestruct() const { |
- BrowserThread::DeleteOnIOThread::Destruct(this); |
-} |
- |
-void ResourceMessageFilter::OnReceiveContextMenuMsg(const IPC::Message& msg) { |
- void* iter = NULL; |
- ContextMenuParams params; |
- if (!IPC::ParamTraits<ContextMenuParams>::Read(&msg, &iter, ¶ms)) |
- return; |
- |
- // Create a new ViewHostMsg_ContextMenu message. |
- const ViewHostMsg_ContextMenu context_menu_message(msg.routing_id(), params); |
- BrowserThread::PostTask( |
- BrowserThread::UI, FROM_HERE, |
- new ContextMenuMessageDispatcher(id(), context_menu_message)); |
-} |
- |
-// Called on the IPC thread: |
-bool ResourceMessageFilter::Send(IPC::Message* message) { |
- if (!channel_) { |
- delete message; |
- return false; |
- } |
- |
- return channel_->Send(message); |
-} |
- |
-URLRequestContext* ResourceMessageFilter::GetRequestContext( |
- uint32 request_id, |
- const ViewHostMsg_Resource_Request& request_data) { |
- URLRequestContextGetter* request_context = request_context_; |
- // If the request has resource type of ResourceType::MEDIA, we use a request |
- // context specific to media for handling it because these resources have |
- // specific needs for caching. |
- if (request_data.resource_type == ResourceType::MEDIA) |
- request_context = media_request_context_; |
- return request_context->GetURLRequestContext(); |
-} |
- |
-void ResourceMessageFilter::OnMsgCreateWindow( |
- const ViewHostMsg_CreateWindow_Params& params, |
- int* route_id, int64* cloned_session_storage_namespace_id) { |
- *cloned_session_storage_namespace_id = |
- webkit_context_->dom_storage_context()->CloneSessionStorage( |
- params.session_storage_namespace_id); |
- render_widget_helper_->CreateNewWindow(params.opener_id, |
- params.user_gesture, |
- params.window_container_type, |
- params.frame_name, |
- handle(), |
- route_id); |
-} |
- |
-void ResourceMessageFilter::OnMsgCreateWidget(int opener_id, |
- WebKit::WebPopupType popup_type, |
- int* route_id) { |
- render_widget_helper_->CreateNewWidget(opener_id, popup_type, route_id); |
-} |
- |
-void ResourceMessageFilter::OnMsgCreateFullscreenWidget( |
- int opener_id, WebKit::WebPopupType popup_type, int* route_id) { |
- render_widget_helper_->CreateNewFullscreenWidget( |
- opener_id, popup_type, route_id); |
-} |
- |
-void ResourceMessageFilter::OnSetCookie(const IPC::Message& message, |
- const GURL& url, |
- const GURL& first_party_for_cookies, |
- const std::string& cookie) { |
- ChromeURLRequestContext* context = GetRequestContextForURL(url); |
- |
- SetCookieCompletion* callback = |
- new SetCookieCompletion(id(), message.routing_id(), url, cookie, |
- context); |
- |
- // If this render view is associated with an automation channel, aka |
- // ChromeFrame then we need to set cookies in the external host. |
- if (!AutomationResourceMessageFilter::SetCookiesForUrl(url, cookie, |
- callback)) { |
- int policy = net::OK; |
- if (context->cookie_policy()) { |
- policy = context->cookie_policy()->CanSetCookie( |
- url, first_party_for_cookies, cookie, callback); |
- if (policy == net::ERR_IO_PENDING) |
- return; |
- } |
- callback->Run(policy); |
- } |
-} |
- |
-void ResourceMessageFilter::OnGetCookies(const GURL& url, |
- const GURL& first_party_for_cookies, |
- IPC::Message* reply_msg) { |
- ChromeURLRequestContext* context = GetRequestContextForURL(url); |
- |
- GetCookiesCompletion* callback = |
- new GetCookiesCompletion(id(), reply_msg->routing_id(), url, reply_msg, |
- this, context, false); |
- |
- // If this render view is associated with an automation channel, aka |
- // ChromeFrame then we need to retrieve cookies from the external host. |
- if (!AutomationResourceMessageFilter::GetCookiesForUrl(url, callback)) { |
- int policy = net::OK; |
- if (context->cookie_policy()) { |
- policy = context->cookie_policy()->CanGetCookies( |
- url, first_party_for_cookies, callback); |
- if (policy == net::ERR_IO_PENDING) { |
- Send(new ViewMsg_SignalCookiePromptEvent()); |
- return; |
- } |
- } |
- callback->Run(policy); |
- } |
-} |
- |
-void ResourceMessageFilter::OnGetRawCookies( |
- const GURL& url, |
- const GURL& first_party_for_cookies, |
- IPC::Message* reply_msg) { |
- |
- ChromeURLRequestContext* context = GetRequestContextForURL(url); |
- |
- // Only return raw cookies to trusted renderers or if this request is |
- // not targeted to an an external host like ChromeFrame. |
- // TODO(ananta) We need to support retreiving raw cookies from external |
- // hosts. |
- if (!ChildProcessSecurityPolicy::GetInstance()->CanReadRawCookies(id()) || |
- context->IsExternal()) { |
- ViewHostMsg_GetRawCookies::WriteReplyParams( |
- reply_msg, |
- std::vector<webkit_glue::WebCookie>()); |
- Send(reply_msg); |
- return; |
- } |
- |
- GetCookiesCompletion* callback = |
- new GetCookiesCompletion(id(), reply_msg->routing_id(), url, |
- reply_msg, this, context, true); |
- |
- // We check policy here to avoid sending back cookies that would not normally |
- // be applied to outbound requests for the given URL. Since this cookie info |
- // is visible in the developer tools, it is helpful to make it match reality. |
- int policy = net::OK; |
- if (context->cookie_policy()) { |
- policy = context->cookie_policy()->CanGetCookies( |
- url, first_party_for_cookies, callback); |
- if (policy == net::ERR_IO_PENDING) { |
- Send(new ViewMsg_SignalCookiePromptEvent()); |
- return; |
- } |
- } |
- callback->Run(policy); |
-} |
- |
-void ResourceMessageFilter::OnDeleteCookie(const GURL& url, |
- const std::string& cookie_name) { |
- URLRequestContext* context = GetRequestContextForURL(url); |
- context->cookie_store()->DeleteCookie(url, cookie_name); |
-} |
- |
-void ResourceMessageFilter::OnCookiesEnabled( |
- const GURL& url, |
- const GURL& first_party_for_cookies, |
- IPC::Message* reply_msg) { |
- URLRequestContext* context = GetRequestContextForURL(url); |
- CookiesEnabledCompletion* callback = |
- new CookiesEnabledCompletion(reply_msg, this); |
- int policy = net::OK; |
- // TODO(ananta): If this render view is associated with an automation channel, |
- // aka ChromeFrame then we need to retrieve cookie settings from the external |
- // host. |
- if (context->cookie_policy()) { |
- policy = context->cookie_policy()->CanGetCookies( |
- url, first_party_for_cookies, callback); |
- if (policy == net::ERR_IO_PENDING) { |
- Send(new ViewMsg_SignalCookiePromptEvent()); |
- return; // CanGetCookies will take care to call our callback in this case. |
- } |
- } |
- callback->Run(policy); |
-} |
- |
-#if defined(OS_MACOSX) |
-void ResourceMessageFilter::OnLoadFont(const FontDescriptor& font, |
- uint32* handle_size, |
- base::SharedMemoryHandle* handle) { |
- base::SharedMemory font_data; |
- uint32 font_data_size = 0; |
- bool ok = FontLoader::LoadFontIntoBuffer(font.nsFont(), &font_data, |
- &font_data_size); |
- if (!ok || font_data_size == 0) { |
- LOG(ERROR) << "Couldn't load font data for " << font.font_name << |
- " ok=" << ok << " font_data_size=" << font_data_size; |
- *handle_size = 0; |
- *handle = base::SharedMemory::NULLHandle(); |
- return; |
- } |
- |
- *handle_size = font_data_size; |
- font_data.GiveToProcess(base::GetCurrentProcessHandle(), handle); |
-} |
-#endif // OS_MACOSX |
- |
-#if defined(OS_WIN) // This hack is Windows-specific. |
-void ResourceMessageFilter::OnPreCacheFont(LOGFONT font) { |
- ChildProcessHost::PreCacheFont(font); |
-} |
-#endif // OS_WIN |
- |
-void ResourceMessageFilter::OnGetPlugins(bool refresh, |
- IPC::Message* reply_msg) { |
- // Don't refresh if the specified threshold has not been passed. Note that |
- // this check is performed before off-loading to the file thread. The reason |
- // we do this is that some pages tend to request that the list of plugins be |
- // refreshed at an excessive rate. This instigates disk scanning, as the list |
- // is accumulated by doing multiple reads from disk. This effect is |
- // multiplied when we have several pages requesting this operation. |
- if (refresh) { |
- const base::TimeDelta threshold = base::TimeDelta::FromSeconds( |
- kPluginsRefreshThresholdInSeconds); |
- const base::TimeTicks now = base::TimeTicks::Now(); |
- if (now - last_plugin_refresh_time_ < threshold) |
- refresh = false; // Ignore refresh request; threshold not exceeded yet. |
- else |
- last_plugin_refresh_time_ = now; |
- } |
- |
- // Can't load plugins on IO thread, so go to the FILE thread. |
- BrowserThread::PostTask( |
- BrowserThread::FILE, FROM_HERE, |
- NewRunnableMethod( |
- this, &ResourceMessageFilter::OnGetPluginsOnFileThread, refresh, |
- reply_msg)); |
-} |
- |
-void ResourceMessageFilter::OnGetPluginsOnFileThread( |
- bool refresh, IPC::Message* reply_msg) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); |
- std::vector<WebPluginInfo> plugins; |
- NPAPI::PluginList::Singleton()->GetEnabledPlugins(refresh, &plugins); |
- ViewHostMsg_GetPlugins::WriteReplyParams(reply_msg, plugins); |
- BrowserThread::PostTask( |
- BrowserThread::IO, FROM_HERE, |
- NewRunnableMethod(this, &ResourceMessageFilter::Send, reply_msg)); |
-} |
- |
-void ResourceMessageFilter::OnGetPluginInfo(const GURL& url, |
- const GURL& policy_url, |
- const std::string& mime_type, |
- IPC::Message* reply_msg) { |
- // The PluginService::GetFirstAllowedPluginInfo may need to load the |
- // plugins. Don't do it on the IO thread. |
- BrowserThread::PostTask( |
- BrowserThread::FILE, FROM_HERE, |
- NewRunnableMethod( |
- this, &ResourceMessageFilter::OnGetPluginInfoOnFileThread, |
- url, policy_url, mime_type, reply_msg)); |
-} |
- |
-void ResourceMessageFilter::OnGetPluginInfoOnFileThread( |
- const GURL& url, |
- const GURL& policy_url, |
- const std::string& mime_type, |
- IPC::Message* reply_msg) { |
- std::string actual_mime_type; |
- WebPluginInfo info; |
- bool found = plugin_service_->GetFirstAllowedPluginInfo(url, |
- mime_type, |
- &info, |
- &actual_mime_type); |
- BrowserThread::PostTask( |
- BrowserThread::IO, FROM_HERE, |
- NewRunnableMethod( |
- this, &ResourceMessageFilter::OnGotPluginInfo, |
- found, info, actual_mime_type, policy_url, reply_msg)); |
-} |
- |
-void ResourceMessageFilter::OnGotPluginInfo(bool found, |
- const WebPluginInfo& info, |
- const std::string& actual_mime_type, |
- const GURL& policy_url, |
- IPC::Message* reply_msg) { |
- ContentSetting setting = CONTENT_SETTING_DEFAULT; |
- WebPluginInfo info_copy = info; |
- if (found) { |
- info_copy.enabled = info_copy.enabled && |
- plugin_service_->PrivatePluginAllowedForURL(info_copy.path, policy_url); |
- HostContentSettingsMap* map = profile_->GetHostContentSettingsMap(); |
- std::string resource = |
- NPAPI::PluginList::Singleton()->GetPluginGroupIdentifier(info_copy); |
- setting = map->GetContentSetting(policy_url, |
- CONTENT_SETTINGS_TYPE_PLUGINS, |
- resource); |
- } |
- |
- ViewHostMsg_GetPluginInfo::WriteReplyParams( |
- reply_msg, found, info_copy, setting, actual_mime_type); |
- Send(reply_msg); |
-} |
- |
-void ResourceMessageFilter::OnOpenChannelToPlugin(const GURL& url, |
- const std::string& mime_type, |
- IPC::Message* reply_msg) { |
- plugin_service_->OpenChannelToPlugin( |
- url, |
- mime_type, |
- new OpenChannelToPluginCallback(this, reply_msg)); |
-} |
- |
-void ResourceMessageFilter::OnOpenChannelToPepperPlugin( |
- const FilePath& path, |
- IPC::Message* reply_msg) { |
- PpapiPluginProcessHost* host = new PpapiPluginProcessHost(this); |
- host->Init(path, reply_msg); |
- ppapi_plugin_hosts_.push_back(linked_ptr<PpapiPluginProcessHost>(host)); |
-} |
- |
-void ResourceMessageFilter::OnLaunchNaCl( |
- const std::wstring& url, int channel_descriptor, IPC::Message* reply_msg) { |
- NaClProcessHost* host = new NaClProcessHost(resource_dispatcher_host_, url); |
- host->Launch(this, channel_descriptor, reply_msg); |
-} |
- |
-void ResourceMessageFilter::OnCreateWorker( |
- const ViewHostMsg_CreateWorker_Params& params, int* route_id) { |
- *route_id = params.route_id != MSG_ROUTING_NONE ? |
- params.route_id : render_widget_helper_->GetNextRoutingID(); |
- if (params.is_shared) |
- WorkerService::GetInstance()->CreateSharedWorker( |
- params.url, off_the_record(), params.name, |
- params.document_id, id(), params.render_view_route_id, this, *route_id, |
- params.script_resource_appcache_id, |
- static_cast<ChromeURLRequestContext*>( |
- request_context_->GetURLRequestContext())); |
- else |
- WorkerService::GetInstance()->CreateDedicatedWorker( |
- params.url, off_the_record(), |
- params.document_id, id(), params.render_view_route_id, this, *route_id, |
- id(), params.parent_appcache_host_id, |
- static_cast<ChromeURLRequestContext*>( |
- request_context_->GetURLRequestContext())); |
-} |
- |
-void ResourceMessageFilter::OnLookupSharedWorker( |
- const ViewHostMsg_CreateWorker_Params& params, bool* exists, int* route_id, |
- bool* url_mismatch) { |
- *route_id = render_widget_helper_->GetNextRoutingID(); |
- *exists = WorkerService::GetInstance()->LookupSharedWorker( |
- params.url, params.name, off_the_record(), params.document_id, id(), |
- params.render_view_route_id, this, *route_id, url_mismatch); |
-} |
- |
-void ResourceMessageFilter::OnDocumentDetached(unsigned long long document_id) { |
- // Notify the WorkerService that the passed document was detached so any |
- // associated shared workers can be shut down. |
- WorkerService::GetInstance()->DocumentDetached(this, document_id); |
-} |
- |
-void ResourceMessageFilter::OnCancelCreateDedicatedWorker(int route_id) { |
- WorkerService::GetInstance()->CancelCreateDedicatedWorker(this, route_id); |
-} |
- |
-void ResourceMessageFilter::OnForwardToWorker(const IPC::Message& message) { |
- WorkerService::GetInstance()->ForwardMessage(message, this); |
-} |
- |
-void ResourceMessageFilter::OnDownloadUrl(const IPC::Message& message, |
- const GURL& url, |
- const GURL& referrer) { |
- URLRequestContext* context = request_context_->GetURLRequestContext(); |
- |
- // Don't show "Save As" UI. |
- bool prompt_for_save_location = false; |
- resource_dispatcher_host_->BeginDownload(url, |
- referrer, |
- DownloadSaveInfo(), |
- prompt_for_save_location, |
- id(), |
- message.routing_id(), |
- context); |
-} |
- |
-void ResourceMessageFilter::OnClipboardWriteObjectsSync( |
- const Clipboard::ObjectMap& objects, |
- base::SharedMemoryHandle bitmap_handle) { |
- DCHECK(base::SharedMemory::IsHandleValid(bitmap_handle)) |
- << "Bad bitmap handle"; |
- // We cannot write directly from the IO thread, and cannot service the IPC |
- // on the UI thread. We'll copy the relevant data and get a handle to any |
- // shared memory so it doesn't go away when we resume the renderer, and post |
- // a task to perform the write on the UI thread. |
- Clipboard::ObjectMap* long_living_objects = new Clipboard::ObjectMap(objects); |
- |
- // Splice the shared memory handle into the clipboard data. |
- Clipboard::ReplaceSharedMemHandle(long_living_objects, bitmap_handle, |
- handle()); |
- |
- BrowserThread::PostTask( |
- BrowserThread::UI, |
- FROM_HERE, |
- new WriteClipboardTask(long_living_objects)); |
-} |
- |
-void ResourceMessageFilter::OnClipboardWriteObjectsAsync( |
- const Clipboard::ObjectMap& objects) { |
- // We cannot write directly from the IO thread, and cannot service the IPC |
- // on the UI thread. We'll copy the relevant data and post a task to preform |
- // the write on the UI thread. |
- Clipboard::ObjectMap* long_living_objects = new Clipboard::ObjectMap(objects); |
- |
- // This async message doesn't support shared-memory based bitmaps; they must |
- // be removed otherwise we might dereference a rubbish pointer. |
- long_living_objects->erase(Clipboard::CBF_SMBITMAP); |
- |
- BrowserThread::PostTask( |
- BrowserThread::UI, |
- FROM_HERE, |
- new WriteClipboardTask(long_living_objects)); |
-} |
- |
-#if !defined(USE_X11) |
-// On non-X11 platforms, clipboard actions can be performed on the IO thread. |
-// On X11, since the clipboard is linked with GTK, we either have to do this |
-// with GTK on the UI thread, or with Xlib on the BACKGROUND_X11 thread. In an |
-// ideal world, we would do the latter. However, for now we're going to |
-// terminate these calls on the UI thread. This risks deadlock in the case of |
-// plugins, but it's better than crashing which is what doing on the IO thread |
-// gives us. |
-// |
-// See resource_message_filter_gtk.cc for the Linux implementation of these |
-// functions. |
- |
-void ResourceMessageFilter::OnClipboardIsFormatAvailable( |
- Clipboard::FormatType format, Clipboard::Buffer buffer, |
- IPC::Message* reply) { |
- const bool result = GetClipboard()->IsFormatAvailable(format, buffer); |
- ViewHostMsg_ClipboardIsFormatAvailable::WriteReplyParams(reply, result); |
- Send(reply); |
-} |
- |
-void ResourceMessageFilter::OnClipboardReadText(Clipboard::Buffer buffer, |
- IPC::Message* reply) { |
- string16 result; |
- GetClipboard()->ReadText(buffer, &result); |
- ViewHostMsg_ClipboardReadText::WriteReplyParams(reply, result); |
- Send(reply); |
-} |
- |
-void ResourceMessageFilter::OnClipboardReadAsciiText(Clipboard::Buffer buffer, |
- IPC::Message* reply) { |
- std::string result; |
- GetClipboard()->ReadAsciiText(buffer, &result); |
- ViewHostMsg_ClipboardReadAsciiText::WriteReplyParams(reply, result); |
- Send(reply); |
-} |
- |
-void ResourceMessageFilter::OnClipboardReadHTML(Clipboard::Buffer buffer, |
- IPC::Message* reply) { |
- std::string src_url_str; |
- string16 markup; |
- GetClipboard()->ReadHTML(buffer, &markup, &src_url_str); |
- const GURL src_url = GURL(src_url_str); |
- |
- ViewHostMsg_ClipboardReadHTML::WriteReplyParams(reply, markup, src_url); |
- Send(reply); |
-} |
- |
-void ResourceMessageFilter::OnClipboardReadAvailableTypes( |
- Clipboard::Buffer buffer, IPC::Message* reply) { |
- std::vector<string16> types; |
- bool contains_filenames = false; |
- bool result = ClipboardDispatcher::ReadAvailableTypes( |
- buffer, &types, &contains_filenames); |
- ViewHostMsg_ClipboardReadAvailableTypes::WriteReplyParams( |
- reply, result, types, contains_filenames); |
- Send(reply); |
-} |
- |
-void ResourceMessageFilter::OnClipboardReadData( |
- Clipboard::Buffer buffer, const string16& type, IPC::Message* reply) { |
- string16 data; |
- string16 metadata; |
- bool result = ClipboardDispatcher::ReadData(buffer, type, &data, &metadata); |
- ViewHostMsg_ClipboardReadData::WriteReplyParams( |
- reply, result, data, metadata); |
- Send(reply); |
-} |
- |
-void ResourceMessageFilter::OnClipboardReadFilenames( |
- Clipboard::Buffer buffer, IPC::Message* reply) { |
- std::vector<string16> filenames; |
- bool result = ClipboardDispatcher::ReadFilenames(buffer, &filenames); |
- ViewHostMsg_ClipboardReadFilenames::WriteReplyParams( |
- reply, result, filenames); |
- Send(reply); |
-} |
- |
-#endif |
- |
-void ResourceMessageFilter::OnCheckNotificationPermission( |
- const GURL& source_url, int* result) { |
- *result = WebKit::WebNotificationPresenter::PermissionNotAllowed; |
- |
- ChromeURLRequestContext* context = GetRequestContextForURL(source_url); |
- if (context->extension_info_map()->CheckURLAccessToExtensionPermission( |
- source_url, Extension::kNotificationPermission)) { |
- *result = WebKit::WebNotificationPresenter::PermissionAllowed; |
- return; |
- } |
- |
- // Fall back to the regular notification preferences, which works on an |
- // origin basis. |
- *result = notification_prefs_->HasPermission(source_url.GetOrigin()); |
-} |
- |
-void ResourceMessageFilter::OnGetCPBrowsingContext(uint32* context) { |
- // Always allocate a new context when a plugin requests one, since it needs to |
- // be unique for that plugin instance. |
- *context = CPBrowsingContextManager::GetInstance()->Allocate( |
- request_context_->GetURLRequestContext()); |
-} |
- |
-#if defined(OS_WIN) |
-void ResourceMessageFilter::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, handle()); |
- shared_buf.GiveToProcess(base::GetCurrentProcessHandle(), browser_handle); |
-} |
-#endif |
- |
-#if defined(OS_POSIX) |
-void ResourceMessageFilter::OnAllocateSharedMemoryBuffer( |
- uint32 buffer_size, |
- base::SharedMemoryHandle* handle) { |
- base::SharedMemory shared_buf; |
- if (!shared_buf.CreateAndMapAnonymous(buffer_size)) { |
- *handle = base::SharedMemory::NULLHandle(); |
- NOTREACHED() << "Cannot map shared memory buffer"; |
- return; |
- } |
- shared_buf.GiveToProcess(base::GetCurrentProcessHandle(), handle); |
-} |
-#endif |
- |
-void ResourceMessageFilter::OnResourceTypeStats( |
- const WebCache::ResourceTypeStats& stats) { |
- HISTOGRAM_COUNTS("WebCoreCache.ImagesSizeKB", |
- static_cast<int>(stats.images.size / 1024)); |
- HISTOGRAM_COUNTS("WebCoreCache.CSSStylesheetsSizeKB", |
- static_cast<int>(stats.cssStyleSheets.size / 1024)); |
- HISTOGRAM_COUNTS("WebCoreCache.ScriptsSizeKB", |
- static_cast<int>(stats.scripts.size / 1024)); |
- HISTOGRAM_COUNTS("WebCoreCache.XSLStylesheetsSizeKB", |
- static_cast<int>(stats.xslStyleSheets.size / 1024)); |
- HISTOGRAM_COUNTS("WebCoreCache.FontsSizeKB", |
- static_cast<int>(stats.fonts.size / 1024)); |
- // We need to notify the TaskManager of these statistics from the UI |
- // thread. |
- BrowserThread::PostTask( |
- BrowserThread::UI, FROM_HERE, |
- NewRunnableFunction( |
- &ResourceMessageFilter::OnResourceTypeStatsOnUIThread, |
- stats, |
- base::GetProcId(handle()))); |
-} |
- |
-void ResourceMessageFilter::OnResourceTypeStatsOnUIThread( |
- const WebCache::ResourceTypeStats& stats, base::ProcessId renderer_id) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- TaskManager::GetInstance()->model()->NotifyResourceTypeStats( |
- renderer_id, stats); |
-} |
- |
- |
-void ResourceMessageFilter::OnV8HeapStats(int v8_memory_allocated, |
- int v8_memory_used) { |
- BrowserThread::PostTask( |
- BrowserThread::UI, FROM_HERE, |
- NewRunnableFunction(&ResourceMessageFilter::OnV8HeapStatsOnUIThread, |
- v8_memory_allocated, |
- v8_memory_used, |
- base::GetProcId(handle()))); |
-} |
- |
-// static |
-void ResourceMessageFilter::OnV8HeapStatsOnUIThread( |
- int v8_memory_allocated, int v8_memory_used, base::ProcessId renderer_id) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- TaskManager::GetInstance()->model()->NotifyV8HeapStats( |
- renderer_id, |
- static_cast<size_t>(v8_memory_allocated), |
- static_cast<size_t>(v8_memory_used)); |
-} |
- |
-void ResourceMessageFilter::OnDidZoomURL(const IPC::Message& message, |
- double zoom_level, |
- bool remember, |
- const GURL& url) { |
- Task* task = NewRunnableMethod(this, |
- &ResourceMessageFilter::UpdateHostZoomLevelsOnUIThread, zoom_level, |
- remember, url, id(), message.routing_id()); |
-#if defined(OS_MACOSX) |
- cocoa_utils::PostTaskInEventTrackingRunLoopMode(FROM_HERE, task); |
-#else |
- BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, task); |
-#endif |
-} |
- |
-void ResourceMessageFilter::UpdateHostZoomLevelsOnUIThread( |
- double zoom_level, |
- bool remember, |
- const GURL& url, |
- int render_process_id, |
- int render_view_id) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- if (remember) { |
- host_zoom_map_->SetZoomLevel(url, zoom_level); |
- // Notify renderers from this profile. |
- for (RenderProcessHost::iterator i(RenderProcessHost::AllHostsIterator()); |
- !i.IsAtEnd(); i.Advance()) { |
- RenderProcessHost* render_process_host = i.GetCurrentValue(); |
- if (render_process_host->profile() == profile_) { |
- render_process_host->Send( |
- new ViewMsg_SetZoomLevelForCurrentURL(url, zoom_level)); |
- } |
- } |
- } else { |
- host_zoom_map_->SetTemporaryZoomLevel( |
- render_process_id, render_view_id, zoom_level); |
- } |
-} |
- |
-void ResourceMessageFilter::OnResolveProxy(const GURL& url, |
- IPC::Message* reply_msg) { |
- resolve_proxy_msg_helper_.Start(url, reply_msg); |
-} |
- |
-void ResourceMessageFilter::OnResolveProxyCompleted( |
- IPC::Message* reply_msg, |
- int result, |
- const std::string& proxy_list) { |
- ViewHostMsg_ResolveProxy::WriteReplyParams(reply_msg, result, proxy_list); |
- Send(reply_msg); |
-} |
- |
-void ResourceMessageFilter::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, |
- &ResourceMessageFilter::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 ResourceMessageFilter::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 ResourceMessageFilter::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, |
- &ResourceMessageFilter::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 ResourceMessageFilter::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 |
-Clipboard* ResourceMessageFilter::GetClipboard() { |
- // We have a static instance of the clipboard service for use by all message |
- // filters. This instance lives for the life of the browser processes. |
- static Clipboard* clipboard = new Clipboard; |
- |
- return clipboard; |
-} |
- |
-ChromeURLRequestContext* ResourceMessageFilter::GetRequestContextForURL( |
- const GURL& url) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- URLRequestContextGetter* context_getter = |
- url.SchemeIs(chrome::kExtensionScheme) ? |
- extensions_request_context_ : request_context_; |
- return static_cast<ChromeURLRequestContext*>( |
- context_getter->GetURLRequestContext()); |
-} |
- |
-void ResourceMessageFilter::OnPlatformCheckSpelling(const string16& word, |
- int tag, |
- bool* correct) { |
- *correct = SpellCheckerPlatform::CheckSpelling(word, tag); |
-} |
- |
-void ResourceMessageFilter::OnPlatformFillSuggestionList( |
- const string16& word, |
- std::vector<string16>* suggestions) { |
- SpellCheckerPlatform::FillSuggestionList(word, suggestions); |
-} |
- |
-void ResourceMessageFilter::OnGetDocumentTag(IPC::Message* reply_msg) { |
- int tag = SpellCheckerPlatform::GetDocumentTag(); |
- ViewHostMsg_GetDocumentTag::WriteReplyParams(reply_msg, tag); |
- Send(reply_msg); |
- return; |
-} |
- |
-void ResourceMessageFilter::OnDocumentWithTagClosed(int tag) { |
- SpellCheckerPlatform::CloseDocumentWithTag(tag); |
-} |
- |
-void ResourceMessageFilter::OnShowSpellingPanel(bool show) { |
- SpellCheckerPlatform::ShowSpellingPanel(show); |
-} |
- |
-void ResourceMessageFilter::OnUpdateSpellingPanelWithMisspelledWord( |
- const string16& word) { |
- SpellCheckerPlatform::UpdateSpellingPanelWithMisspelledWord(word); |
-} |
- |
-void ResourceMessageFilter::OnDnsPrefetch( |
- const std::vector<std::string>& hostnames) { |
- chrome_browser_net::DnsPrefetchList(hostnames); |
-} |
- |
-void ResourceMessageFilter::OnRendererHistograms( |
- int sequence_number, |
- const std::vector<std::string>& histograms) { |
- HistogramSynchronizer::DeserializeHistogramList(sequence_number, histograms); |
-} |
- |
-#if defined(OS_MACOSX) |
-void ResourceMessageFilter::OnAllocTransportDIB( |
- size_t size, bool cache_in_browser, TransportDIB::Handle* handle) { |
- render_widget_helper_->AllocTransportDIB(size, cache_in_browser, handle); |
-} |
- |
-void ResourceMessageFilter::OnFreeTransportDIB( |
- TransportDIB::Id dib_id) { |
- render_widget_helper_->FreeTransportDIB(dib_id); |
-} |
-#endif |
- |
-void ResourceMessageFilter::OnOpenChannelToExtension( |
- int routing_id, const std::string& source_extension_id, |
- const std::string& target_extension_id, |
- const std::string& channel_name, int* port_id) { |
- int port2_id; |
- ExtensionMessageService::AllocatePortIdPair(port_id, &port2_id); |
- |
- BrowserThread::PostTask( |
- BrowserThread::UI, FROM_HERE, |
- NewRunnableMethod( |
- this, &ResourceMessageFilter::OpenChannelToExtensionOnUIThread, |
- id(), routing_id, port2_id, source_extension_id, |
- target_extension_id, channel_name)); |
-} |
- |
-void ResourceMessageFilter::OpenChannelToExtensionOnUIThread( |
- int source_process_id, int source_routing_id, |
- int receiver_port_id, |
- const std::string& source_extension_id, |
- const std::string& target_extension_id, |
- const std::string& channel_name) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- profile_->GetExtensionMessageService()->OpenChannelToExtension( |
- source_process_id, source_routing_id, receiver_port_id, |
- source_extension_id, target_extension_id, channel_name); |
-} |
- |
-void ResourceMessageFilter::OnOpenChannelToTab( |
- int routing_id, int tab_id, const std::string& extension_id, |
- const std::string& channel_name, int* port_id) { |
- int port2_id; |
- ExtensionMessageService::AllocatePortIdPair(port_id, &port2_id); |
- |
- BrowserThread::PostTask( |
- BrowserThread::UI, FROM_HERE, |
- NewRunnableMethod( |
- this, &ResourceMessageFilter::OpenChannelToTabOnUIThread, |
- id(), routing_id, port2_id, tab_id, extension_id, channel_name)); |
-} |
- |
-void ResourceMessageFilter::OpenChannelToTabOnUIThread( |
- int source_process_id, int source_routing_id, |
- int receiver_port_id, |
- int tab_id, |
- const std::string& extension_id, |
- const std::string& channel_name) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- profile_->GetExtensionMessageService()->OpenChannelToTab( |
- source_process_id, source_routing_id, receiver_port_id, |
- tab_id, extension_id, channel_name); |
-} |
- |
-bool ResourceMessageFilter::CheckBenchmarkingEnabled() const { |
- static bool checked = false; |
- static bool result = false; |
- if (!checked) { |
- const CommandLine& command_line = *CommandLine::ForCurrentProcess(); |
- result = command_line.HasSwitch(switches::kEnableBenchmarking); |
- checked = true; |
- } |
- return result; |
-} |
- |
-void ResourceMessageFilter::OnCloseCurrentConnections() { |
- // This function is disabled unless the user has enabled |
- // benchmarking extensions. |
- if (!CheckBenchmarkingEnabled()) |
- return; |
- request_context_->GetURLRequestContext()-> |
- http_transaction_factory()->GetCache()->CloseCurrentConnections(); |
-} |
- |
-void ResourceMessageFilter::OnSetCacheMode(bool enabled) { |
- // This function is disabled unless the user has enabled |
- // benchmarking extensions. |
- if (!CheckBenchmarkingEnabled()) |
- return; |
- |
- net::HttpCache::Mode mode = enabled ? |
- net::HttpCache::NORMAL : net::HttpCache::DISABLE; |
- net::HttpCache* http_cache = request_context_->GetURLRequestContext()-> |
- http_transaction_factory()->GetCache(); |
- http_cache->set_mode(mode); |
-} |
- |
-void ResourceMessageFilter::OnClearCache(IPC::Message* reply_msg) { |
- // This function is disabled unless the user has enabled |
- // benchmarking extensions. |
- int rv = -1; |
- if (CheckBenchmarkingEnabled()) { |
- disk_cache::Backend* backend = request_context_->GetURLRequestContext()-> |
- http_transaction_factory()->GetCache()->GetCurrentBackend(); |
- if (backend) { |
- ClearCacheCompletion* callback = |
- new ClearCacheCompletion(reply_msg, this); |
- rv = backend->DoomAllEntries(callback); |
- if (rv == net::ERR_IO_PENDING) { |
- // The callback will send the reply. |
- return; |
- } |
- // Completed synchronously, no need for the callback. |
- delete callback; |
- } |
- } |
- ViewHostMsg_ClearCache::WriteReplyParams(reply_msg, rv); |
- Send(reply_msg); |
-} |
- |
-bool ResourceMessageFilter::CheckPreparsedJsCachingEnabled() const { |
- static bool checked = false; |
- static bool result = false; |
- if (!checked) { |
- const CommandLine& command_line = *CommandLine::ForCurrentProcess(); |
- result = command_line.HasSwitch(switches::kEnablePreparsedJsCaching); |
- checked = true; |
- } |
- return result; |
-} |
- |
-void ResourceMessageFilter::OnCacheableMetadataAvailable( |
- const GURL& url, |
- double expected_response_time, |
- const std::vector<char>& data) { |
- if (!CheckPreparsedJsCachingEnabled()) |
- return; |
- |
- net::HttpCache* cache = request_context_->GetURLRequestContext()-> |
- http_transaction_factory()->GetCache(); |
- DCHECK(cache); |
- |
- scoped_refptr<net::IOBuffer> buf(new net::IOBuffer(data.size())); |
- memcpy(buf->data(), &data.front(), data.size()); |
- cache->WriteMetadata( |
- url, base::Time::FromDoubleT(expected_response_time), buf, data.size()); |
-} |
- |
-// TODO(lzheng): This only enables spdy over ssl. Enable spdy for http |
-// when needed. |
-void ResourceMessageFilter::OnEnableSpdy(bool enable) { |
- if (enable) { |
- net::HttpNetworkLayer::EnableSpdy("npn,force-alt-protocols"); |
- } else { |
- net::HttpNetworkLayer::EnableSpdy("npn-http"); |
- } |
-} |
- |
-void ResourceMessageFilter::OnKeygen(uint32 key_size_index, |
- const std::string& challenge_string, |
- const GURL& url, |
- IPC::Message* reply_msg) { |
- // Map displayed strings indicating level of keysecurity in the <keygen> |
- // menu to the key size in bits. (See SSLKeyGeneratorChromium.cpp in WebCore.) |
- int key_size_in_bits; |
- switch (key_size_index) { |
- case 0: |
- key_size_in_bits = 2048; |
- break; |
- case 1: |
- key_size_in_bits = 1024; |
- break; |
- default: |
- DCHECK(false) << "Illegal key_size_index " << key_size_index; |
- ViewHostMsg_Keygen::WriteReplyParams(reply_msg, std::string()); |
- Send(reply_msg); |
- return; |
- } |
- |
- VLOG(1) << "Dispatching keygen task to worker pool."; |
- // Dispatch to worker pool, so we do not block the IO thread. |
- if (!WorkerPool::PostTask( |
- FROM_HERE, |
- NewRunnableMethod( |
- this, &ResourceMessageFilter::OnKeygenOnWorkerThread, |
- key_size_in_bits, challenge_string, url, reply_msg), |
- true)) { |
- NOTREACHED() << "Failed to dispatch keygen task to worker pool"; |
- ViewHostMsg_Keygen::WriteReplyParams(reply_msg, std::string()); |
- Send(reply_msg); |
- return; |
- } |
-} |
- |
-void ResourceMessageFilter::OnKeygenOnWorkerThread( |
- int key_size_in_bits, |
- const std::string& challenge_string, |
- const GURL& url, |
- IPC::Message* reply_msg) { |
- DCHECK(reply_msg); |
- |
- // Generate a signed public key and challenge, then send it back. |
- net::KeygenHandler keygen_handler(key_size_in_bits, challenge_string, url); |
- |
- ViewHostMsg_Keygen::WriteReplyParams( |
- reply_msg, |
- keygen_handler.GenKeyAndSignChallenge()); |
- |
- BrowserThread::PostTask( |
- BrowserThread::IO, FROM_HERE, |
- NewRunnableMethod(this, &ResourceMessageFilter::Send, reply_msg)); |
-} |
- |
-#if defined(USE_TCMALLOC) |
-void ResourceMessageFilter::OnRendererTcmalloc(base::ProcessId pid, |
- const std::string& output) { |
- BrowserThread::PostTask( |
- BrowserThread::UI, FROM_HERE, |
- NewRunnableFunction(AboutTcmallocRendererCallback, pid, output)); |
-} |
-#endif |
- |
-void ResourceMessageFilter::OnEstablishGpuChannel() { |
- GpuProcessHost::Get()->EstablishGpuChannel(id(), this); |
-} |
- |
-void ResourceMessageFilter::OnSynchronizeGpu(IPC::Message* reply) { |
- // We handle this message (and the other GPU process messages) here |
- // rather than handing the message to the GpuProcessHost for |
- // dispatch so that we can use the DELAY_REPLY macro to synthesize |
- // the reply message, and also send down a "this" pointer so that |
- // the GPU process host can send the reply later. |
- GpuProcessHost::Get()->Synchronize(reply, this); |
-} |
- |
-void ResourceMessageFilter::OnGetExtensionMessageBundle( |
- const std::string& extension_id, IPC::Message* reply_msg) { |
- ChromeURLRequestContext* context = static_cast<ChromeURLRequestContext*>( |
- request_context_->GetURLRequestContext()); |
- |
- FilePath extension_path = |
- context->extension_info_map()->GetPathForExtension(extension_id); |
- std::string default_locale = |
- context->extension_info_map()->GetDefaultLocaleForExtension(extension_id); |
- |
- BrowserThread::PostTask( |
- BrowserThread::FILE, FROM_HERE, |
- NewRunnableMethod( |
- this, &ResourceMessageFilter::OnGetExtensionMessageBundleOnFileThread, |
- extension_path, extension_id, default_locale, reply_msg)); |
-} |
- |
-void ResourceMessageFilter::OnGetExtensionMessageBundleOnFileThread( |
- const FilePath& extension_path, |
- const std::string& extension_id, |
- const std::string& default_locale, |
- IPC::Message* reply_msg) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); |
- |
- std::map<std::string, std::string> dictionary_map; |
- if (!default_locale.empty()) { |
- // Touch disk only if extension is localized. |
- std::string error; |
- scoped_ptr<ExtensionMessageBundle> bundle( |
- extension_file_util::LoadExtensionMessageBundle( |
- extension_path, default_locale, &error)); |
- |
- if (bundle.get()) |
- dictionary_map = *bundle->dictionary(); |
- } |
- |
- // Add @@extension_id reserved message here, so it's available to |
- // non-localized extensions too. |
- dictionary_map.insert( |
- std::make_pair(ExtensionMessageBundle::kExtensionIdKey, extension_id)); |
- |
- ViewHostMsg_GetExtensionMessageBundle::WriteReplyParams( |
- reply_msg, dictionary_map); |
- |
- BrowserThread::PostTask( |
- BrowserThread::IO, FROM_HERE, |
- NewRunnableMethod(this, &ResourceMessageFilter::Send, reply_msg)); |
-} |
- |
-void ResourceMessageFilter::OnAsyncOpenFile(const IPC::Message& msg, |
- const FilePath& path, |
- int flags, |
- int message_id) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- |
- if (!ChildProcessSecurityPolicy::GetInstance()->HasPermissionsForFile( |
- id(), path, flags)) { |
- DLOG(ERROR) << "Bad flags in ViewMsgHost_AsyncOpenFile message: " << flags; |
- BrowserRenderProcessHost::BadMessageTerminateProcess( |
- ViewHostMsg_AsyncOpenFile::ID, handle()); |
- return; |
- } |
- |
- BrowserThread::PostTask( |
- BrowserThread::FILE, FROM_HERE, NewRunnableMethod( |
- this, &ResourceMessageFilter::AsyncOpenFileOnFileThread, |
- path, flags, message_id, msg.routing_id())); |
-} |
- |
-void ResourceMessageFilter::AsyncOpenFileOnFileThread(const FilePath& path, |
- int flags, |
- int message_id, |
- int routing_id) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); |
- base::PlatformFileError error_code = base::PLATFORM_FILE_OK; |
- base::PlatformFile file = base::CreatePlatformFile( |
- path, flags, NULL, &error_code); |
- IPC::PlatformFileForTransit file_for_transit = |
- IPC::InvalidPlatformFileForTransit(); |
- if (file != base::kInvalidPlatformFileValue) { |
-#if defined(OS_WIN) |
- ::DuplicateHandle(::GetCurrentProcess(), file, handle(), |
- &file_for_transit, 0, false, DUPLICATE_SAME_ACCESS); |
-#else |
- file_for_transit = base::FileDescriptor(file, true); |
-#endif |
- } |
- |
- IPC::Message* reply = new ViewMsg_AsyncOpenFile_ACK( |
- routing_id, error_code, file_for_transit, message_id); |
- BrowserThread::PostTask( |
- BrowserThread::IO, FROM_HERE, NewRunnableMethod( |
- this, &ResourceMessageFilter::Send, reply)); |
-} |
- |
-SetCookieCompletion::SetCookieCompletion(int render_process_id, |
- int render_view_id, |
- const GURL& url, |
- const std::string& cookie_line, |
- ChromeURLRequestContext* context) |
- : render_process_id_(render_process_id), |
- render_view_id_(render_view_id), |
- url_(url), |
- cookie_line_(cookie_line), |
- context_(context) { |
-} |
- |
-SetCookieCompletion::~SetCookieCompletion() {} |
- |
-void SetCookieCompletion::RunWithParams(const Tuple1<int>& params) { |
- int result = params.a; |
- bool blocked_by_policy = true; |
- net::CookieOptions options; |
- if (result == net::OK || |
- result == net::OK_FOR_SESSION_ONLY) { |
- blocked_by_policy = false; |
- if (result == net::OK_FOR_SESSION_ONLY) |
- options.set_force_session(); |
- context_->cookie_store()->SetCookieWithOptions(url_, cookie_line_, |
- options); |
- } |
- if (!context_->IsExternal()) { |
- CallRenderViewHostContentSettingsDelegate( |
- render_process_id_, render_view_id_, |
- &RenderViewHostDelegate::ContentSettings::OnCookieChanged, |
- url_, cookie_line_, options, blocked_by_policy); |
- } |
- delete this; |
-} |
- |
-GetCookiesCompletion::GetCookiesCompletion(int render_process_id, |
- int render_view_id, |
- const GURL& url, |
- IPC::Message* reply_msg, |
- ResourceMessageFilter* filter, |
- ChromeURLRequestContext* context, |
- bool raw_cookies) |
- : url_(url), |
- reply_msg_(reply_msg), |
- filter_(filter), |
- context_(context), |
- render_process_id_(render_process_id), |
- render_view_id_(render_view_id), |
- raw_cookies_(raw_cookies) { |
- set_cookie_store(context_->cookie_store()); |
-} |
- |
-GetCookiesCompletion::~GetCookiesCompletion() {} |
- |
-void GetCookiesCompletion::RunWithParams(const Tuple1<int>& params) { |
- if (!raw_cookies_) { |
- int result = params.a; |
- std::string cookies; |
- if (result == net::OK) |
- cookies = cookie_store()->GetCookies(url_); |
- ViewHostMsg_GetCookies::WriteReplyParams(reply_msg_, cookies); |
- filter_->Send(reply_msg_); |
- if (!context_->IsExternal()) { |
- net::CookieMonster* cookie_monster = |
- context_->cookie_store()->GetCookieMonster(); |
- net::CookieList cookie_list = |
- cookie_monster->GetAllCookiesForURLWithOptions( |
- url_, net::CookieOptions()); |
- CallRenderViewHostContentSettingsDelegate( |
- render_process_id_, render_view_id_, |
- &RenderViewHostDelegate::ContentSettings::OnCookiesRead, |
- url_, cookie_list, result != net::OK); |
- } |
- delete this; |
- } else { |
- // Ignore the policy result. We only waited on the policy result so that |
- // any pending 'set-cookie' requests could be flushed. The intent of |
- // querying the raw cookies is to reveal the contents of the cookie DB, so |
- // it important that we don't read the cookie db ahead of pending writes. |
- net::CookieMonster* cookie_monster = |
- context_->cookie_store()->GetCookieMonster(); |
- net::CookieList cookie_list = cookie_monster->GetAllCookiesForURL(url_); |
- |
- std::vector<webkit_glue::WebCookie> cookies; |
- for (size_t i = 0; i < cookie_list.size(); ++i) { |
- cookies.push_back(webkit_glue::WebCookie(cookie_list[i])); |
- } |
- |
- ViewHostMsg_GetRawCookies::WriteReplyParams(reply_msg_, cookies); |
- filter_->Send(reply_msg_); |
- delete this; |
- } |
-} |
- |
-void GetCookiesCompletion::set_cookie_store(CookieStore* cookie_store) { |
- cookie_store_ = cookie_store; |
-} |
- |
-CookiesEnabledCompletion::CookiesEnabledCompletion( |
- IPC::Message* reply_msg, |
- ResourceMessageFilter* filter) |
- : reply_msg_(reply_msg), |
- filter_(filter) { |
-} |
- |
-CookiesEnabledCompletion::~CookiesEnabledCompletion() {} |
- |
-void CookiesEnabledCompletion::RunWithParams(const Tuple1<int>& params) { |
- bool result = params.a != net::ERR_ACCESS_DENIED; |
- ViewHostMsg_CookiesEnabled::WriteReplyParams(reply_msg_, result); |
- filter_->Send(reply_msg_); |
- delete this; |
-} |