| Index: chrome/browser/resource_message_filter.cc
|
| ===================================================================
|
| --- chrome/browser/resource_message_filter.cc (revision 9158)
|
| +++ chrome/browser/resource_message_filter.cc (working copy)
|
| @@ -1,741 +0,0 @@
|
| -// Copyright (c) 2006-2008 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/resource_message_filter.h"
|
| -
|
| -#include "base/clipboard.h"
|
| -#include "base/gfx/native_widget_types.h"
|
| -#include "base/histogram.h"
|
| -#include "base/thread.h"
|
| -#include "chrome/browser/chrome_plugin_browsing_context.h"
|
| -#include "chrome/browser/chrome_thread.h"
|
| -#include "chrome/browser/net/dns_global.h"
|
| -#include "chrome/browser/printing/print_job_manager.h"
|
| -#include "chrome/browser/printing/printer_query.h"
|
| -#include "chrome/browser/profile.h"
|
| -#include "chrome/browser/plugin_service.h"
|
| -#include "chrome/browser/renderer_host/browser_render_process_host.h"
|
| -#include "chrome/browser/renderer_host/render_widget_helper.h"
|
| -#include "chrome/browser/spellchecker.h"
|
| -#include "chrome/common/chrome_plugin_lib.h"
|
| -#include "chrome/common/chrome_plugin_util.h"
|
| -#include "chrome/common/clipboard_service.h"
|
| -#include "chrome/common/notification_service.h"
|
| -#include "chrome/common/pref_names.h"
|
| -#include "chrome/common/pref_service.h"
|
| -#include "chrome/common/ipc_message_macros.h"
|
| -#include "chrome/common/render_messages.h"
|
| -#include "net/base/cookie_monster.h"
|
| -#include "net/base/mime_util.h"
|
| -#include "webkit/glue/webkit_glue.h"
|
| -#include "webkit/glue/webplugin.h"
|
| -
|
| -namespace {
|
| -
|
| -// 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_host_id,
|
| - const ViewHostMsg_ContextMenu& context_menu_message)
|
| - : render_process_host_id_(render_process_host_id),
|
| - context_menu_message_(context_menu_message) {
|
| - }
|
| -
|
| - void Run() {
|
| - RenderProcessHost* host =
|
| - RenderProcessHost::FromID(render_process_host_id_);
|
| - if (host)
|
| - host->OnMessageReceived(context_menu_message_);
|
| - }
|
| -
|
| - private:
|
| - int render_process_host_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_service()->WriteObjects(*objects_.get());
|
| - }
|
| -
|
| - private:
|
| - scoped_ptr<Clipboard::ObjectMap> objects_;
|
| -};
|
| -
|
| -
|
| -} // namespace
|
| -
|
| -ResourceMessageFilter::ResourceMessageFilter(
|
| - ResourceDispatcherHost* resource_dispatcher_host,
|
| - PluginService* plugin_service,
|
| - printing::PrintJobManager* print_job_manager,
|
| - int render_process_host_id,
|
| - Profile* profile,
|
| - RenderWidgetHelper* render_widget_helper,
|
| - SpellChecker* spellchecker)
|
| - : channel_(NULL),
|
| - resource_dispatcher_host_(resource_dispatcher_host),
|
| - plugin_service_(plugin_service),
|
| - print_job_manager_(print_job_manager),
|
| - render_process_host_id_(render_process_host_id),
|
| - render_handle_(NULL),
|
| - request_context_(profile->GetRequestContext()),
|
| - profile_(profile),
|
| - render_widget_helper_(render_widget_helper),
|
| - spellchecker_(spellchecker),
|
| - ALLOW_THIS_IN_INITIALIZER_LIST(resolve_proxy_msg_helper_(this, NULL)) {
|
| -
|
| - DCHECK(request_context_.get());
|
| - DCHECK(request_context_->cookie_store());
|
| -}
|
| -
|
| -ResourceMessageFilter::~ResourceMessageFilter() {
|
| - if (render_handle_)
|
| - CloseHandle(render_handle_);
|
| -
|
| - // This function should be called on the IO thread.
|
| - DCHECK(MessageLoop::current() ==
|
| - ChromeThread::GetMessageLoop(ChromeThread::IO));
|
| - NotificationService::current()->RemoveObserver(
|
| - this,
|
| - NotificationType::SPELLCHECKER_REINITIALIZED,
|
| - Source<Profile>(static_cast<Profile*>(profile_)));
|
| -}
|
| -
|
| -// Called on the IPC thread:
|
| -void ResourceMessageFilter::OnFilterAdded(IPC::Channel* channel) {
|
| - channel_ = channel;
|
| -
|
| - // Add the observers to intercept
|
| - NotificationService::current()->AddObserver(
|
| - this,
|
| - NotificationType::SPELLCHECKER_REINITIALIZED,
|
| - Source<Profile>(static_cast<Profile*>(profile_)));
|
| -}
|
| -
|
| -// Called on the IPC thread:
|
| -void ResourceMessageFilter::OnChannelConnected(int32 peer_pid) {
|
| - DCHECK(!render_handle_);
|
| - render_handle_ = OpenProcess(PROCESS_DUP_HANDLE | PROCESS_TERMINATE,
|
| - FALSE, peer_pid);
|
| - DCHECK(render_handle_);
|
| -}
|
| -
|
| -// 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(render_process_host_id_);
|
| -}
|
| -
|
| -// Called on the IPC thread:
|
| -bool ResourceMessageFilter::OnMessageReceived(const IPC::Message& message) {
|
| - bool handled = true;
|
| - bool msg_is_ok = true;
|
| - IPC_BEGIN_MESSAGE_MAP_EX(ResourceMessageFilter, message, msg_is_ok)
|
| - IPC_MESSAGE_HANDLER(ViewHostMsg_CreateWindow, OnMsgCreateWindow)
|
| - IPC_MESSAGE_HANDLER(ViewHostMsg_CreateWidget, OnMsgCreateWidget)
|
| - // TODO(brettw): we should get the view ID for this so the resource
|
| - // dispatcher can prioritize things based on the visible view.
|
| - IPC_MESSAGE_HANDLER(ViewHostMsg_RequestResource, OnRequestResource)
|
| - IPC_MESSAGE_HANDLER(ViewHostMsg_CancelRequest, OnCancelRequest)
|
| - IPC_MESSAGE_HANDLER(ViewHostMsg_ClosePage_ACK, OnClosePageACK)
|
| - IPC_MESSAGE_HANDLER(ViewHostMsg_DataReceived_ACK, OnDataReceivedACK)
|
| - IPC_MESSAGE_HANDLER(ViewHostMsg_UploadProgress_ACK, OnUploadProgressACK)
|
| -
|
| - IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_SyncLoad, OnSyncLoad)
|
| -
|
| - IPC_MESSAGE_HANDLER(ViewHostMsg_SetCookie, OnSetCookie)
|
| - IPC_MESSAGE_HANDLER(ViewHostMsg_GetCookies, OnGetCookies)
|
| - IPC_MESSAGE_HANDLER(ViewHostMsg_GetDataDir, OnGetDataDir)
|
| - IPC_MESSAGE_HANDLER(ViewHostMsg_PluginMessage, OnPluginMessage)
|
| - IPC_MESSAGE_HANDLER(ViewHostMsg_PluginSyncMessage, OnPluginSyncMessage)
|
| - IPC_MESSAGE_HANDLER(ViewHostMsg_LoadFont, OnLoadFont)
|
| - IPC_MESSAGE_HANDLER(ViewHostMsg_GetScreenInfo, OnGetScreenInfo)
|
| - IPC_MESSAGE_HANDLER(ViewHostMsg_GetPlugins, OnGetPlugins)
|
| - IPC_MESSAGE_HANDLER(ViewHostMsg_GetPluginPath, OnGetPluginPath)
|
| - IPC_MESSAGE_HANDLER(ViewHostMsg_DownloadUrl, OnDownloadUrl)
|
| - IPC_MESSAGE_HANDLER_GENERIC(ViewHostMsg_ContextMenu,
|
| - OnReceiveContextMenuMsg(message))
|
| - IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_OpenChannelToPlugin,
|
| - OnOpenChannelToPlugin)
|
| - IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_SpellCheck, OnSpellCheck)
|
| - IPC_MESSAGE_HANDLER(ViewHostMsg_DnsPrefetch, OnDnsPrefetch)
|
| - IPC_MESSAGE_HANDLER_GENERIC(ViewHostMsg_PaintRect,
|
| - render_widget_helper_->DidReceivePaintMsg(message))
|
| - IPC_MESSAGE_HANDLER(ViewHostMsg_ClipboardWriteObjectsAsync,
|
| - OnClipboardWriteObjects)
|
| - IPC_MESSAGE_HANDLER(ViewHostMsg_ClipboardWriteObjectsSync,
|
| - OnClipboardWriteObjects)
|
| - IPC_MESSAGE_HANDLER(ViewHostMsg_ClipboardIsFormatAvailable,
|
| - OnClipboardIsFormatAvailable)
|
| - IPC_MESSAGE_HANDLER(ViewHostMsg_ClipboardReadText, OnClipboardReadText)
|
| - IPC_MESSAGE_HANDLER(ViewHostMsg_ClipboardReadAsciiText,
|
| - OnClipboardReadAsciiText)
|
| - IPC_MESSAGE_HANDLER(ViewHostMsg_ClipboardReadHTML,
|
| - OnClipboardReadHTML)
|
| -#if defined(OS_WIN)
|
| - IPC_MESSAGE_HANDLER(ViewHostMsg_GetWindowRect, OnGetWindowRect)
|
| - IPC_MESSAGE_HANDLER(ViewHostMsg_GetRootWindowRect, OnGetRootWindowRect)
|
| - IPC_MESSAGE_HANDLER(ViewHostMsg_GetRootWindowResizerRect,
|
| - OnGetRootWindowResizerRect)
|
| -#endif
|
| - IPC_MESSAGE_HANDLER(ViewHostMsg_GetMimeTypeFromExtension,
|
| - OnGetMimeTypeFromExtension)
|
| - IPC_MESSAGE_HANDLER(ViewHostMsg_GetMimeTypeFromFile,
|
| - OnGetMimeTypeFromFile)
|
| - IPC_MESSAGE_HANDLER(ViewHostMsg_GetPreferredExtensionForMimeType,
|
| - OnGetPreferredExtensionForMimeType)
|
| - IPC_MESSAGE_HANDLER(ViewHostMsg_GetCPBrowsingContext,
|
| - OnGetCPBrowsingContext)
|
| - IPC_MESSAGE_HANDLER(ViewHostMsg_DuplicateSection, OnDuplicateSection)
|
| - IPC_MESSAGE_HANDLER(ViewHostMsg_ResourceTypeStats, OnResourceTypeStats)
|
| - IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_ResolveProxy, OnResolveProxy)
|
| - IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_GetDefaultPrintSettings,
|
| - OnGetDefaultPrintSettings)
|
| -#if defined(OS_WIN)
|
| - IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_ScriptedPrint,
|
| - OnScriptedPrint)
|
| -#endif
|
| - IPC_MESSAGE_UNHANDLED(
|
| - handled = false)
|
| - IPC_END_MESSAGE_MAP_EX()
|
| -
|
| - if (!msg_is_ok) {
|
| - BrowserRenderProcessHost::BadMessageTerminateProcess(message.type(),
|
| - render_handle_);
|
| - }
|
| -
|
| - return handled;
|
| -}
|
| -
|
| -void ResourceMessageFilter::OnReceiveContextMenuMsg(const IPC::Message& msg) {
|
| - void* iter = NULL;
|
| - ViewHostMsg_ContextMenu_Params params;
|
| - if (!IPC::ParamTraits<ViewHostMsg_ContextMenu_Params>::
|
| - Read(&msg, &iter, ¶ms))
|
| - return;
|
| -
|
| - // Fill in the dictionary suggestions if required.
|
| - if (!params.misspelled_word.empty() &&
|
| - spellchecker_ != NULL && params.spellcheck_enabled) {
|
| - int misspell_location, misspell_length;
|
| - bool is_misspelled = !spellchecker_->SpellCheckWord(
|
| - params.misspelled_word.c_str(),
|
| - static_cast<int>(params.misspelled_word.length()),
|
| - &misspell_location, &misspell_length,
|
| - ¶ms.dictionary_suggestions);
|
| -
|
| - // If not misspelled, make the misspelled_word param empty.
|
| - if (!is_misspelled)
|
| - params.misspelled_word.clear();
|
| - }
|
| -
|
| - // Create a new ViewHostMsg_ContextMenu message.
|
| - const ViewHostMsg_ContextMenu context_menu_message(msg.routing_id(), params);
|
| - render_widget_helper_->ui_loop()->PostTask(FROM_HERE,
|
| - new ContextMenuMessageDispatcher(render_process_host_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);
|
| -}
|
| -
|
| -void ResourceMessageFilter::OnMsgCreateWindow(
|
| - int opener_id, bool user_gesture, int* route_id,
|
| - ModalDialogEvent* modal_dialog_event) {
|
| - render_widget_helper_->CreateNewWindow(opener_id,
|
| - user_gesture,
|
| - render_handle_,
|
| - route_id,
|
| - modal_dialog_event);
|
| -}
|
| -
|
| -void ResourceMessageFilter::OnMsgCreateWidget(int opener_id,
|
| - bool activatable,
|
| - int* route_id) {
|
| - render_widget_helper_->CreateNewWidget(opener_id, activatable, route_id);
|
| -}
|
| -
|
| -void ResourceMessageFilter::OnRequestResource(
|
| - const IPC::Message& message,
|
| - int request_id,
|
| - const ViewHostMsg_Resource_Request& request) {
|
| - resource_dispatcher_host_->BeginRequest(this,
|
| - render_handle_,
|
| - render_process_host_id_,
|
| - message.routing_id(),
|
| - request_id,
|
| - request,
|
| - request_context_,
|
| - NULL);
|
| -}
|
| -
|
| -void ResourceMessageFilter::OnDataReceivedACK(int request_id) {
|
| - resource_dispatcher_host_->OnDataReceivedACK(render_process_host_id_,
|
| - request_id);
|
| -}
|
| -
|
| -void ResourceMessageFilter::OnUploadProgressACK(int request_id) {
|
| - resource_dispatcher_host_->OnUploadProgressACK(render_process_host_id_,
|
| - request_id);
|
| -}
|
| -
|
| -void ResourceMessageFilter::OnCancelRequest(int request_id) {
|
| - resource_dispatcher_host_->CancelRequest(render_process_host_id_, request_id,
|
| - true);
|
| -}
|
| -
|
| -void ResourceMessageFilter::OnClosePageACK(int new_render_process_host_id,
|
| - int new_request_id) {
|
| - resource_dispatcher_host_->OnClosePageACK(new_render_process_host_id,
|
| - new_request_id);
|
| -}
|
| -
|
| -void ResourceMessageFilter::OnSyncLoad(
|
| - int request_id,
|
| - const ViewHostMsg_Resource_Request& request,
|
| - IPC::Message* sync_result) {
|
| - resource_dispatcher_host_->BeginRequest(this,
|
| - render_handle_,
|
| - render_process_host_id_,
|
| - sync_result->routing_id(),
|
| - request_id,
|
| - request,
|
| - request_context_,
|
| - sync_result);
|
| -}
|
| -
|
| -void ResourceMessageFilter::OnSetCookie(const GURL& url,
|
| - const GURL& policy_url,
|
| - const std::string& cookie) {
|
| - if (request_context_->cookie_policy()->CanSetCookie(url, policy_url))
|
| - request_context_->cookie_store()->SetCookie(url, cookie);
|
| -}
|
| -
|
| -void ResourceMessageFilter::OnGetCookies(const GURL& url,
|
| - const GURL& policy_url,
|
| - std::string* cookies) {
|
| - if (request_context_->cookie_policy()->CanGetCookies(url, policy_url))
|
| - *cookies = request_context_->cookie_store()->GetCookies(url);
|
| -}
|
| -
|
| -void ResourceMessageFilter::OnGetDataDir(std::wstring* data_dir) {
|
| - *data_dir = plugin_service_->GetChromePluginDataDir().ToWStringHack();
|
| -}
|
| -
|
| -void ResourceMessageFilter::OnPluginMessage(const FilePath& plugin_path,
|
| - const std::vector<uint8>& data) {
|
| - DCHECK(MessageLoop::current() ==
|
| - ChromeThread::GetMessageLoop(ChromeThread::IO));
|
| -
|
| - ChromePluginLib *chrome_plugin = ChromePluginLib::Find(plugin_path);
|
| - if (chrome_plugin) {
|
| - void *data_ptr = const_cast<void*>(reinterpret_cast<const void*>(&data[0]));
|
| - uint32 data_len = static_cast<uint32>(data.size());
|
| - chrome_plugin->functions().on_message(data_ptr, data_len);
|
| - }
|
| -}
|
| -
|
| -void ResourceMessageFilter::OnPluginSyncMessage(const FilePath& plugin_path,
|
| - const std::vector<uint8>& data,
|
| - std::vector<uint8> *retval) {
|
| - DCHECK(MessageLoop::current() ==
|
| - ChromeThread::GetMessageLoop(ChromeThread::IO));
|
| -
|
| - ChromePluginLib *chrome_plugin = ChromePluginLib::Find(plugin_path);
|
| - if (chrome_plugin) {
|
| - void *data_ptr = const_cast<void*>(reinterpret_cast<const void*>(&data[0]));
|
| - uint32 data_len = static_cast<uint32>(data.size());
|
| - void *retval_buffer = 0;
|
| - uint32 retval_size = 0;
|
| - chrome_plugin->functions().on_sync_message(data_ptr, data_len,
|
| - &retval_buffer, &retval_size);
|
| - if (retval_buffer) {
|
| - retval->resize(retval_size);
|
| - memcpy(&(retval->at(0)), retval_buffer, retval_size);
|
| - CPB_Free(retval_buffer);
|
| - }
|
| - }
|
| -}
|
| -
|
| -void ResourceMessageFilter::OnLoadFont(LOGFONT font) {
|
| - // If renderer is running in a sandbox, GetTextMetrics
|
| - // can sometimes fail. If a font has not been loaded
|
| - // previously, GetTextMetrics will try to load the font
|
| - // from the font file. However, the sandboxed renderer does
|
| - // not have permissions to access any font files and
|
| - // the call fails. So we make the browser pre-load the
|
| - // font for us by using a dummy call to GetTextMetrics of
|
| - // the same font.
|
| -
|
| - // Maintain a circular queue for the fonts and DCs to be cached.
|
| - // font_index maintains next available location in the queue.
|
| - static const int kFontCacheSize = 32;
|
| - static HFONT fonts[kFontCacheSize] = {0};
|
| - static HDC hdcs[kFontCacheSize] = {0};
|
| - static size_t font_index = 0;
|
| -
|
| - UMA_HISTOGRAM_COUNTS_100(L"Memory.CachedFontAndDC",
|
| - fonts[kFontCacheSize-1] ? kFontCacheSize : static_cast<int>(font_index));
|
| -
|
| - HDC hdc = GetDC(NULL);
|
| - HFONT font_handle = CreateFontIndirect(&font);
|
| - DCHECK(NULL != font_handle);
|
| -
|
| - HGDIOBJ old_font = SelectObject(hdc, font_handle);
|
| - DCHECK(NULL != old_font);
|
| -
|
| - TEXTMETRIC tm;
|
| - BOOL ret = GetTextMetrics(hdc, &tm);
|
| - DCHECK(ret);
|
| -
|
| - if (fonts[font_index] || hdcs[font_index]) {
|
| - // We already have too many fonts, we will delete one and take it's place.
|
| - DeleteObject(fonts[font_index]);
|
| - ReleaseDC(NULL, hdcs[font_index]);
|
| - }
|
| -
|
| - fonts[font_index] = font_handle;
|
| - hdcs[font_index] = hdc;
|
| - font_index = (font_index + 1) % kFontCacheSize;
|
| -}
|
| -
|
| -void ResourceMessageFilter::OnGetScreenInfo(
|
| - gfx::NativeViewId window, webkit_glue::ScreenInfo* results) {
|
| - *results = webkit_glue::GetScreenInfoHelper(gfx::NativeViewFromId(window));
|
| -}
|
| -
|
| -void ResourceMessageFilter::OnGetPlugins(bool refresh,
|
| - std::vector<WebPluginInfo>* plugins) {
|
| - plugin_service_->GetPlugins(refresh, plugins);
|
| -}
|
| -
|
| -void ResourceMessageFilter::OnGetPluginPath(const GURL& url,
|
| - const std::string& mime_type,
|
| - const std::string& clsid,
|
| - FilePath* filename,
|
| - std::string* url_mime_type) {
|
| - *filename = plugin_service_->GetPluginPath(url, mime_type, clsid,
|
| - url_mime_type);
|
| -}
|
| -
|
| -void ResourceMessageFilter::OnOpenChannelToPlugin(const GURL& url,
|
| - const std::string& mime_type,
|
| - const std::string& clsid,
|
| - const std::wstring& locale,
|
| - IPC::Message* reply_msg) {
|
| - plugin_service_->OpenChannelToPlugin(this, url, mime_type, clsid,
|
| - locale, reply_msg);
|
| -}
|
| -
|
| -void ResourceMessageFilter::OnDownloadUrl(const IPC::Message& message,
|
| - const GURL& url,
|
| - const GURL& referrer) {
|
| - resource_dispatcher_host_->BeginDownload(url,
|
| - referrer,
|
| - render_process_host_id_,
|
| - message.routing_id(),
|
| - request_context_);
|
| -}
|
| -
|
| -void ResourceMessageFilter::OnClipboardWriteObjects(
|
| - 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 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);
|
| -
|
| - // We pass the render_handle_ to assist the clipboard with using shared
|
| - // memory objects. render_handle_ is a handle to the process that would
|
| - // own any shared memory that might be in the object list.
|
| - Clipboard::DuplicateRemoteHandles(render_handle_, long_living_objects);
|
| -
|
| - render_widget_helper_->ui_loop()->PostTask(FROM_HERE,
|
| - new WriteClipboardTask(long_living_objects));
|
| -}
|
| -
|
| -void ResourceMessageFilter::OnClipboardIsFormatAvailable(unsigned int format,
|
| - bool* result) {
|
| - DCHECK(result);
|
| - *result = GetClipboardService()->IsFormatAvailable(format);
|
| -}
|
| -
|
| -void ResourceMessageFilter::OnClipboardReadText(std::wstring* result) {
|
| - GetClipboardService()->ReadText(result);
|
| -}
|
| -
|
| -void ResourceMessageFilter::OnClipboardReadAsciiText(std::string* result) {
|
| - GetClipboardService()->ReadAsciiText(result);
|
| -}
|
| -
|
| -void ResourceMessageFilter::OnClipboardReadHTML(std::wstring* markup,
|
| - GURL* src_url) {
|
| - std::string src_url_str;
|
| - GetClipboardService()->ReadHTML(markup, &src_url_str);
|
| - *src_url = GURL(src_url_str);
|
| -}
|
| -
|
| -#if defined(OS_WIN)
|
| -
|
| -void ResourceMessageFilter::OnGetWindowRect(gfx::NativeViewId window_id,
|
| - gfx::Rect* rect) {
|
| - HWND window = gfx::NativeViewFromId(window_id);
|
| - RECT window_rect = {0};
|
| - GetWindowRect(window, &window_rect);
|
| - *rect = window_rect;
|
| -}
|
| -
|
| -void ResourceMessageFilter::OnGetRootWindowRect(gfx::NativeViewId window_id,
|
| - gfx::Rect* rect) {
|
| - HWND window = gfx::NativeViewFromId(window_id);
|
| - RECT window_rect = {0};
|
| - HWND root_window = ::GetAncestor(window, GA_ROOT);
|
| - GetWindowRect(root_window, &window_rect);
|
| - *rect = window_rect;
|
| -}
|
| -
|
| -void ResourceMessageFilter::OnGetRootWindowResizerRect(gfx::NativeViewId window,
|
| - gfx::Rect* rect) {
|
| - RECT window_rect = {0};
|
| - *rect = window_rect;
|
| -}
|
| -
|
| -#endif // OS_WIN
|
| -
|
| -void ResourceMessageFilter::OnGetMimeTypeFromExtension(
|
| - const std::wstring& ext, std::string* mime_type) {
|
| - net::GetMimeTypeFromExtension(ext, mime_type);
|
| -}
|
| -
|
| -void ResourceMessageFilter::OnGetMimeTypeFromFile(
|
| - const std::wstring& file_path, std::string* mime_type) {
|
| - net::GetMimeTypeFromFile(file_path, mime_type);
|
| -}
|
| -
|
| -void ResourceMessageFilter::OnGetPreferredExtensionForMimeType(
|
| - const std::string& mime_type, std::wstring* ext) {
|
| - net::GetPreferredExtensionForMimeType(mime_type, ext);
|
| -}
|
| -
|
| -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::Instance()->Allocate(request_context_.get());
|
| -}
|
| -
|
| -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, render_handle_);
|
| - shared_buf.GiveToProcess(GetCurrentProcess(), browser_handle);
|
| -}
|
| -
|
| -void ResourceMessageFilter::OnResourceTypeStats(
|
| - const CacheManager::ResourceTypeStats& stats) {
|
| - HISTOGRAM_COUNTS(L"WebCoreCache.ImagesSizeKB",
|
| - static_cast<int>(stats.images.size / 1024));
|
| - HISTOGRAM_COUNTS(L"WebCoreCache.CSSStylesheetsSizeKB",
|
| - static_cast<int>(stats.css_stylesheets.size / 1024));
|
| - HISTOGRAM_COUNTS(L"WebCoreCache.ScriptsSizeKB",
|
| - static_cast<int>(stats.scripts.size / 1024));
|
| - HISTOGRAM_COUNTS(L"WebCoreCache.XSLStylesheetsSizeKB",
|
| - static_cast<int>(stats.xsl_stylesheets.size / 1024));
|
| - HISTOGRAM_COUNTS(L"WebCoreCache.FontsSizeKB",
|
| - static_cast<int>(stats.fonts.size / 1024));
|
| -}
|
| -
|
| -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;
|
| - 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,
|
| - task);
|
| -}
|
| -
|
| -void ResourceMessageFilter::OnGetDefaultPrintSettingsReply(
|
| - scoped_refptr<printing::PrinterQuery> printer_query,
|
| - IPC::Message* reply_msg) {
|
| - ViewMsg_Print_Params params;
|
| - if (printer_query->last_status() != printing::PrintingContext::OK) {
|
| - memset(¶ms, 0, sizeof(params));
|
| - } else {
|
| - printer_query->settings().RenderParams(¶ms);
|
| - params.document_cookie = printer_query->cookie();
|
| - }
|
| - ViewHostMsg_GetDefaultPrintSettings::WriteReplyParams(reply_msg, params);
|
| - Send(reply_msg);
|
| - // If user hasn't cancelled.
|
| - if (printer_query->cookie() && printer_query->settings().dpi()) {
|
| - print_job_manager_->QueuePrinterQuery(printer_query.get());
|
| - } else {
|
| - printer_query->StopWorker();
|
| - }
|
| -}
|
| -
|
| -#if defined(OS_WIN)
|
| -
|
| -void ResourceMessageFilter::OnScriptedPrint(gfx::NativeViewId host_window_id,
|
| - int cookie,
|
| - int expected_pages_count,
|
| - IPC::Message* reply_msg) {
|
| - HWND host_window = gfx::NativeViewFromId(host_window_id);
|
| -
|
| - scoped_refptr<printing::PrinterQuery> printer_query;
|
| - print_job_manager_->PopPrinterQuery(cookie, &printer_query);
|
| - if (!printer_query.get()) {
|
| - printer_query = new printing::PrinterQuery;
|
| - }
|
| -
|
| - CancelableTask* task = NewRunnableMethod(
|
| - this,
|
| - &ResourceMessageFilter::OnScriptedPrintReply,
|
| - printer_query,
|
| - reply_msg);
|
| - // Shows the Print... dialog box. This is asynchronous, only the IPC message
|
| - // sender will hang until the Print dialog is dismissed.
|
| - if (!host_window || !IsWindow(host_window)) {
|
| - // TODO(maruel): bug 1214347 Get the right browser window instead.
|
| - host_window = GetDesktopWindow();
|
| - } else {
|
| - host_window = GetAncestor(host_window, GA_ROOTOWNER);
|
| - }
|
| - DCHECK(host_window);
|
| - printer_query->GetSettings(printing::PrinterQuery::ASK_USER,
|
| - host_window,
|
| - expected_pages_count,
|
| - task);
|
| -}
|
| -
|
| -void ResourceMessageFilter::OnScriptedPrintReply(
|
| - scoped_refptr<printing::PrinterQuery> printer_query,
|
| - 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 {
|
| - printer_query->settings().RenderParams(¶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();
|
| - }
|
| -}
|
| -
|
| -#endif // OS_WIN
|
| -
|
| -// static
|
| -ClipboardService* ResourceMessageFilter::GetClipboardService() {
|
| - // 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 ClipboardService* clipboard_service = new ClipboardService();
|
| -
|
| - return clipboard_service;
|
| -}
|
| -
|
| -// Notes about SpellCheck.
|
| -//
|
| -// Spellchecking generally uses a fair amount of RAM. For this reason, we load
|
| -// the spellcheck dictionaries into the browser process, and all renderers ask
|
| -// the browsers to do SpellChecking.
|
| -//
|
| -// This filter should not try to initialize the spellchecker. It is up to the
|
| -// profile to initialize it when required, and send it here. If |spellchecker_|
|
| -// is made NULL, it corresponds to spellchecker turned off - i.e., all
|
| -// spellings are correct.
|
| -//
|
| -// Note: This is called in the IO thread.
|
| -void ResourceMessageFilter::OnSpellCheck(const std::wstring& word,
|
| - IPC::Message* reply_msg) {
|
| - int misspell_location = 0;
|
| - int misspell_length = 0;
|
| -
|
| - if (spellchecker_ != NULL) {
|
| - spellchecker_->SpellCheckWord(word.c_str(),
|
| - static_cast<int>(word.length()),
|
| - &misspell_location, &misspell_length, NULL);
|
| - }
|
| -
|
| - ViewHostMsg_SpellCheck::WriteReplyParams(reply_msg, misspell_location,
|
| - misspell_length);
|
| - Send(reply_msg);
|
| - return;
|
| -}
|
| -
|
| -void ResourceMessageFilter::Observe(NotificationType type,
|
| - const NotificationSource &source,
|
| - const NotificationDetails &details) {
|
| - if (type == NotificationType::SPELLCHECKER_REINITIALIZED) {
|
| - spellchecker_ = Details<SpellcheckerReinitializedDetails>
|
| - (details).ptr()->spellchecker;
|
| - }
|
| -}
|
| -
|
| -void ResourceMessageFilter::OnDnsPrefetch(
|
| - const std::vector<std::string>& hostnames) {
|
| - chrome_browser_net::DnsPrefetchList(hostnames);
|
| -}
|
|
|