1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CONTENT_BROWSER_LOADER_RESOURCE_MESSAGE_FILTER_H_
6#define CONTENT_BROWSER_LOADER_RESOURCE_MESSAGE_FILTER_H_
7
8#include "base/callback_forward.h"
9#include "base/memory/scoped_ptr.h"
10#include "base/memory/weak_ptr.h"
11#include "content/common/content_export.h"
12#include "content/public/browser/browser_message_filter.h"
13#include "content/public/common/resource_type.h"
14
15struct ResourceHostMsg_Request;
16
17namespace storage {
18class FileSystemContext;
19}  // namespace storage
20
21namespace net {
22class URLRequestContext;
23}  // namespace net
24
25
26namespace content {
27class ChromeAppCacheService;
28class ChromeBlobStorageContext;
29class ResourceContext;
30class ServiceWorkerContextWrapper;
31
32// This class filters out incoming IPC messages for network requests and
33// processes them on the IPC thread.  As a result, network requests are not
34// delayed by costly UI processing that may be occuring on the main thread of
35// the browser.  It also means that any hangs in starting a network request
36// will not interfere with browser UI.
37class CONTENT_EXPORT ResourceMessageFilter : public BrowserMessageFilter {
38 public:
39  typedef base::Callback<void(const ResourceHostMsg_Request&,
40                              ResourceContext**,
41                              net::URLRequestContext**)> GetContextsCallback;
42
43  // |appcache_service|, |blob_storage_context|, |file_system_context| may be
44  // NULL in unittests or for requests from the (NPAPI) plugin process.
45  ResourceMessageFilter(int child_id,
46                        int process_type,
47                        ChromeAppCacheService* appcache_service,
48                        ChromeBlobStorageContext* blob_storage_context,
49                        storage::FileSystemContext* file_system_context,
50                        ServiceWorkerContextWrapper* service_worker_context,
51                        const GetContextsCallback& get_contexts_callback);
52
53  // BrowserMessageFilter implementation.
54  virtual void OnChannelClosing() OVERRIDE;
55  virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
56
57  void GetContexts(const ResourceHostMsg_Request& request,
58                   ResourceContext** resource_context,
59                   net::URLRequestContext** request_context);
60
61  // Returns the net::URLRequestContext for the given request.
62  net::URLRequestContext* GetURLRequestContext(ResourceType request_type);
63
64  ChromeAppCacheService* appcache_service() const {
65    return appcache_service_.get();
66  }
67
68  ChromeBlobStorageContext* blob_storage_context() const {
69    return blob_storage_context_.get();
70  }
71
72  storage::FileSystemContext* file_system_context() const {
73    return file_system_context_.get();
74  }
75
76  ServiceWorkerContextWrapper* service_worker_context() const {
77    return service_worker_context_.get();
78  }
79
80  int child_id() const { return child_id_; }
81  int process_type() const { return process_type_; }
82
83  base::WeakPtr<ResourceMessageFilter> GetWeakPtr();
84
85 protected:
86  // Protected destructor so that we can be overriden in tests.
87  virtual ~ResourceMessageFilter();
88
89 private:
90  // The ID of the child process.
91  int child_id_;
92
93  int process_type_;
94
95  scoped_refptr<ChromeAppCacheService> appcache_service_;
96  scoped_refptr<ChromeBlobStorageContext> blob_storage_context_;
97  scoped_refptr<storage::FileSystemContext> file_system_context_;
98  scoped_refptr<ServiceWorkerContextWrapper> service_worker_context_;
99
100  GetContextsCallback get_contexts_callback_;
101
102  // This must come last to make sure weak pointers are invalidated first.
103  base::WeakPtrFactory<ResourceMessageFilter> weak_ptr_factory_;
104
105  DISALLOW_IMPLICIT_CONSTRUCTORS(ResourceMessageFilter);
106};
107
108}  // namespace content
109
110#endif  // CONTENT_BROWSER_LOADER_RESOURCE_MESSAGE_FILTER_H_
111