OLD | NEW |
| (Empty) |
1 // Copyright (c) 2011 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 #include "chrome/browser/appcache/appcache_dispatcher_host.h" | |
6 | |
7 #include "base/callback.h" | |
8 #include "chrome/browser/appcache/chrome_appcache_service.h" | |
9 #include "chrome/browser/metrics/user_metrics.h" | |
10 #include "chrome/browser/net/chrome_url_request_context.h" | |
11 #include "chrome/browser/renderer_host/browser_render_process_host.h" | |
12 #include "chrome/common/render_messages.h" | |
13 | |
14 AppCacheDispatcherHost::AppCacheDispatcherHost( | |
15 net::URLRequestContext* request_context, | |
16 int process_id) | |
17 : ALLOW_THIS_IN_INITIALIZER_LIST(frontend_proxy_(this)), | |
18 request_context_(request_context), | |
19 process_id_(process_id) { | |
20 DCHECK(request_context_.get()); | |
21 } | |
22 | |
23 AppCacheDispatcherHost::AppCacheDispatcherHost( | |
24 URLRequestContextGetter* request_context_getter, | |
25 int process_id) | |
26 : ALLOW_THIS_IN_INITIALIZER_LIST(frontend_proxy_(this)), | |
27 request_context_getter_(request_context_getter), | |
28 process_id_(process_id) { | |
29 DCHECK(request_context_getter_.get()); | |
30 } | |
31 | |
32 AppCacheDispatcherHost::~AppCacheDispatcherHost() {} | |
33 | |
34 void AppCacheDispatcherHost::OnChannelConnected(int32 peer_pid) { | |
35 BrowserMessageFilter::OnChannelConnected(peer_pid); | |
36 | |
37 DCHECK(request_context_.get() || request_context_getter_.get()); | |
38 | |
39 // Get the AppCacheService (it can only be accessed from IO thread). | |
40 net::URLRequestContext* context = request_context_.get(); | |
41 if (!context) | |
42 context = request_context_getter_->GetURLRequestContext(); | |
43 appcache_service_ = | |
44 static_cast<ChromeURLRequestContext*>(context)->appcache_service(); | |
45 request_context_ = NULL; | |
46 request_context_getter_ = NULL; | |
47 | |
48 if (appcache_service_.get()) { | |
49 backend_impl_.Initialize( | |
50 appcache_service_.get(), &frontend_proxy_, process_id_); | |
51 get_status_callback_.reset( | |
52 NewCallback(this, &AppCacheDispatcherHost::GetStatusCallback)); | |
53 start_update_callback_.reset( | |
54 NewCallback(this, &AppCacheDispatcherHost::StartUpdateCallback)); | |
55 swap_cache_callback_.reset( | |
56 NewCallback(this, &AppCacheDispatcherHost::SwapCacheCallback)); | |
57 } | |
58 } | |
59 | |
60 bool AppCacheDispatcherHost::OnMessageReceived(const IPC::Message& message, | |
61 bool* message_was_ok) { | |
62 bool handled = true; | |
63 IPC_BEGIN_MESSAGE_MAP_EX(AppCacheDispatcherHost, message, *message_was_ok) | |
64 IPC_MESSAGE_HANDLER(AppCacheMsg_RegisterHost, OnRegisterHost) | |
65 IPC_MESSAGE_HANDLER(AppCacheMsg_UnregisterHost, OnUnregisterHost) | |
66 IPC_MESSAGE_HANDLER(AppCacheMsg_GetResourceList, OnGetResourceList) | |
67 IPC_MESSAGE_HANDLER(AppCacheMsg_SelectCache, OnSelectCache) | |
68 IPC_MESSAGE_HANDLER(AppCacheMsg_SelectCacheForWorker, | |
69 OnSelectCacheForWorker) | |
70 IPC_MESSAGE_HANDLER(AppCacheMsg_SelectCacheForSharedWorker, | |
71 OnSelectCacheForSharedWorker) | |
72 IPC_MESSAGE_HANDLER(AppCacheMsg_MarkAsForeignEntry, OnMarkAsForeignEntry) | |
73 IPC_MESSAGE_HANDLER_DELAY_REPLY(AppCacheMsg_GetStatus, OnGetStatus) | |
74 IPC_MESSAGE_HANDLER_DELAY_REPLY(AppCacheMsg_StartUpdate, OnStartUpdate) | |
75 IPC_MESSAGE_HANDLER_DELAY_REPLY(AppCacheMsg_SwapCache, OnSwapCache) | |
76 IPC_MESSAGE_UNHANDLED(handled = false) | |
77 IPC_END_MESSAGE_MAP_EX() | |
78 | |
79 return handled; | |
80 } | |
81 | |
82 void AppCacheDispatcherHost::BadMessageReceived() { | |
83 UserMetrics::RecordAction(UserMetricsAction("BadMessageTerminate_ACDH")); | |
84 BrowserMessageFilter::BadMessageReceived(); | |
85 } | |
86 | |
87 void AppCacheDispatcherHost::OnRegisterHost(int host_id) { | |
88 if (appcache_service_.get()) { | |
89 if (!backend_impl_.RegisterHost(host_id)) { | |
90 BadMessageReceived(); | |
91 } | |
92 } | |
93 } | |
94 | |
95 void AppCacheDispatcherHost::OnUnregisterHost(int host_id) { | |
96 if (appcache_service_.get()) { | |
97 if (!backend_impl_.UnregisterHost(host_id)) { | |
98 BadMessageReceived(); | |
99 } | |
100 } | |
101 } | |
102 | |
103 void AppCacheDispatcherHost::OnSelectCache( | |
104 int host_id, const GURL& document_url, | |
105 int64 cache_document_was_loaded_from, | |
106 const GURL& opt_manifest_url) { | |
107 if (appcache_service_.get()) { | |
108 if (!backend_impl_.SelectCache(host_id, document_url, | |
109 cache_document_was_loaded_from, | |
110 opt_manifest_url)) { | |
111 BadMessageReceived(); | |
112 } | |
113 } else { | |
114 frontend_proxy_.OnCacheSelected(host_id, appcache::AppCacheInfo()); | |
115 } | |
116 } | |
117 | |
118 void AppCacheDispatcherHost::OnSelectCacheForWorker( | |
119 int host_id, int parent_process_id, int parent_host_id) { | |
120 if (appcache_service_.get()) { | |
121 if (!backend_impl_.SelectCacheForWorker( | |
122 host_id, parent_process_id, parent_host_id)) { | |
123 BadMessageReceived(); | |
124 } | |
125 } else { | |
126 frontend_proxy_.OnCacheSelected(host_id, appcache::AppCacheInfo()); | |
127 } | |
128 } | |
129 | |
130 void AppCacheDispatcherHost::OnSelectCacheForSharedWorker( | |
131 int host_id, int64 appcache_id) { | |
132 if (appcache_service_.get()) { | |
133 if (!backend_impl_.SelectCacheForSharedWorker(host_id, appcache_id)) | |
134 BadMessageReceived(); | |
135 } else { | |
136 frontend_proxy_.OnCacheSelected(host_id, appcache::AppCacheInfo()); | |
137 } | |
138 } | |
139 | |
140 void AppCacheDispatcherHost::OnMarkAsForeignEntry( | |
141 int host_id, const GURL& document_url, | |
142 int64 cache_document_was_loaded_from) { | |
143 if (appcache_service_.get()) { | |
144 if (!backend_impl_.MarkAsForeignEntry(host_id, document_url, | |
145 cache_document_was_loaded_from)) { | |
146 BadMessageReceived(); | |
147 } | |
148 } | |
149 } | |
150 | |
151 void AppCacheDispatcherHost::OnGetResourceList( | |
152 int host_id, std::vector<appcache::AppCacheResourceInfo>* params) { | |
153 if (appcache_service_.get()) | |
154 backend_impl_.GetResourceList(host_id, params); | |
155 } | |
156 | |
157 void AppCacheDispatcherHost::OnGetStatus(int host_id, | |
158 IPC::Message* reply_msg) { | |
159 if (pending_reply_msg_.get()) { | |
160 BadMessageReceived(); | |
161 delete reply_msg; | |
162 return; | |
163 } | |
164 | |
165 pending_reply_msg_.reset(reply_msg); | |
166 if (appcache_service_.get()) { | |
167 if (!backend_impl_.GetStatusWithCallback( | |
168 host_id, get_status_callback_.get(), reply_msg)) { | |
169 BadMessageReceived(); | |
170 } | |
171 return; | |
172 } | |
173 | |
174 GetStatusCallback(appcache::UNCACHED, reply_msg); | |
175 } | |
176 | |
177 void AppCacheDispatcherHost::OnStartUpdate(int host_id, | |
178 IPC::Message* reply_msg) { | |
179 if (pending_reply_msg_.get()) { | |
180 BadMessageReceived(); | |
181 delete reply_msg; | |
182 return; | |
183 } | |
184 | |
185 pending_reply_msg_.reset(reply_msg); | |
186 if (appcache_service_.get()) { | |
187 if (!backend_impl_.StartUpdateWithCallback( | |
188 host_id, start_update_callback_.get(), reply_msg)) { | |
189 BadMessageReceived(); | |
190 } | |
191 return; | |
192 } | |
193 | |
194 StartUpdateCallback(false, reply_msg); | |
195 } | |
196 | |
197 void AppCacheDispatcherHost::OnSwapCache(int host_id, | |
198 IPC::Message* reply_msg) { | |
199 if (pending_reply_msg_.get()) { | |
200 BadMessageReceived(); | |
201 delete reply_msg; | |
202 return; | |
203 } | |
204 | |
205 pending_reply_msg_.reset(reply_msg); | |
206 if (appcache_service_.get()) { | |
207 if (!backend_impl_.SwapCacheWithCallback( | |
208 host_id, swap_cache_callback_.get(), reply_msg)) { | |
209 BadMessageReceived(); | |
210 } | |
211 return; | |
212 } | |
213 | |
214 SwapCacheCallback(false, reply_msg); | |
215 } | |
216 | |
217 void AppCacheDispatcherHost::GetStatusCallback( | |
218 appcache::Status status, void* param) { | |
219 IPC::Message* reply_msg = reinterpret_cast<IPC::Message*>(param); | |
220 DCHECK_EQ(reply_msg, pending_reply_msg_.get()); | |
221 AppCacheMsg_GetStatus::WriteReplyParams(reply_msg, status); | |
222 Send(pending_reply_msg_.release()); | |
223 } | |
224 | |
225 void AppCacheDispatcherHost::StartUpdateCallback(bool result, void* param) { | |
226 IPC::Message* reply_msg = reinterpret_cast<IPC::Message*>(param); | |
227 DCHECK_EQ(reply_msg, pending_reply_msg_.get()); | |
228 AppCacheMsg_StartUpdate::WriteReplyParams(reply_msg, result); | |
229 Send(pending_reply_msg_.release()); | |
230 } | |
231 | |
232 void AppCacheDispatcherHost::SwapCacheCallback(bool result, void* param) { | |
233 IPC::Message* reply_msg = reinterpret_cast<IPC::Message*>(param); | |
234 DCHECK_EQ(reply_msg, pending_reply_msg_.get()); | |
235 AppCacheMsg_SwapCache::WriteReplyParams(reply_msg, result); | |
236 Send(pending_reply_msg_.release()); | |
237 } | |
OLD | NEW |