15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef CONTENT_BROWSER_LOADER_RESOURCE_MESSAGE_FILTER_H_ 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define CONTENT_BROWSER_LOADER_RESOURCE_MESSAGE_FILTER_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/callback_forward.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 1068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "base/memory/weak_ptr.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/content_export.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_message_filter.h" 13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/public/common/resource_type.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)struct ResourceHostMsg_Request; 1658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 1703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)namespace storage { 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class FileSystemContext; 1903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} // namespace storage 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net { 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class URLRequestContext; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace net 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ChromeAppCacheService; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ChromeBlobStorageContext; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ResourceContext; 30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class ServiceWorkerContextWrapper; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class filters out incoming IPC messages for network requests and 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// processes them on the IPC thread. As a result, network requests are not 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// delayed by costly UI processing that may be occuring on the main thread of 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the browser. It also means that any hangs in starting a network request 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// will not interfere with browser UI. 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CONTENT_EXPORT ResourceMessageFilter : public BrowserMessageFilter { 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 3958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) typedef base::Callback<void(const ResourceHostMsg_Request&, 4058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ResourceContext**, 4158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) net::URLRequestContext**)> GetContextsCallback; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // |appcache_service|, |blob_storage_context|, |file_system_context| may be 4458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // NULL in unittests or for requests from the (NPAPI) plugin process. 4503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ResourceMessageFilter(int child_id, 4603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) int process_type, 4703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ChromeAppCacheService* appcache_service, 4803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ChromeBlobStorageContext* blob_storage_context, 4903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) storage::FileSystemContext* file_system_context, 5003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ServiceWorkerContextWrapper* service_worker_context, 5103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const GetContextsCallback& get_contexts_callback); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // BrowserMessageFilter implementation. 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnChannelClosing() OVERRIDE; 55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void GetContexts(const ResourceHostMsg_Request& request, 5858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ResourceContext** resource_context, 5958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) net::URLRequestContext** request_context); 6058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 6158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Returns the net::URLRequestContext for the given request. 625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) net::URLRequestContext* GetURLRequestContext(ResourceType request_type); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChromeAppCacheService* appcache_service() const { 65868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return appcache_service_.get(); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChromeBlobStorageContext* blob_storage_context() const { 69868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return blob_storage_context_.get(); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) storage::FileSystemContext* file_system_context() const { 73868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return file_system_context_.get(); 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ServiceWorkerContextWrapper* service_worker_context() const { 77a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return service_worker_context_.get(); 78a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 79a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int child_id() const { return child_id_; } 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int process_type() const { return process_type_; } 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) base::WeakPtr<ResourceMessageFilter> GetWeakPtr(); 8468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Protected destructor so that we can be overriden in tests. 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~ResourceMessageFilter(); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The ID of the child process. 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int child_id_; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int process_type_; 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<ChromeAppCacheService> appcache_service_; 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<ChromeBlobStorageContext> blob_storage_context_; 9703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) scoped_refptr<storage::FileSystemContext> file_system_context_; 98a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_refptr<ServiceWorkerContextWrapper> service_worker_context_; 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GetContextsCallback get_contexts_callback_; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // This must come last to make sure weak pointers are invalidated first. 10368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) base::WeakPtrFactory<ResourceMessageFilter> weak_ptr_factory_; 10468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_IMPLICIT_CONSTRUCTORS(ResourceMessageFilter); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // CONTENT_BROWSER_LOADER_RESOURCE_MESSAGE_FILTER_H_ 111