Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(215)

Side by Side Diff: content/browser/android/download_controller_android_impl.cc

Issue 11112022: Add DownloadControllerAndroid public interface for android. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Adding OWNERS file Created 8 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/browser/android/download_controller.h" 5 #include "content/browser/android/download_controller_android_impl.h"
6 6
7 #include "base/android/jni_android.h" 7 #include "base/android/jni_android.h"
8 #include "base/android/jni_string.h" 8 #include "base/android/jni_string.h"
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
11 #include "base/memory/scoped_ptr.h" 11 #include "base/memory/scoped_ptr.h"
12 #include "content/browser/android/content_view_core_impl.h" 12 #include "content/browser/android/content_view_core_impl.h"
13 #include "content/browser/download/download_item_impl.h" 13 #include "content/browser/download/download_item_impl.h"
14 #include "content/browser/renderer_host/render_process_host_impl.h" 14 #include "content/browser/renderer_host/render_process_host_impl.h"
15 #include "content/browser/renderer_host/render_view_host_delegate.h" 15 #include "content/browser/renderer_host/render_view_host_delegate.h"
(...skipping 17 matching lines...) Expand all
33 33
34 namespace { 34 namespace {
35 const char kDownloadControllerClassPathName[] = 35 const char kDownloadControllerClassPathName[] =
36 "org/chromium/content/browser/DownloadController"; 36 "org/chromium/content/browser/DownloadController";
37 } // namespace 37 } // namespace
38 38
39 namespace content { 39 namespace content {
40 40
41 // JNI methods 41 // JNI methods
42 static void Init(JNIEnv* env, jobject obj) { 42 static void Init(JNIEnv* env, jobject obj) {
43 DownloadController::GetInstance()->Init(env, obj); 43 DownloadControllerAndroidImpl::GetInstance()->Init(env, obj);
44 } 44 }
45 45
46 struct DownloadController::JavaObject { 46 struct DownloadControllerAndroidImpl::JavaObject {
47 ScopedJavaLocalRef<jobject> Controller(JNIEnv* env) { 47 ScopedJavaLocalRef<jobject> Controller(JNIEnv* env) {
48 return GetRealObject(env, obj); 48 return GetRealObject(env, obj);
49 } 49 }
50 jweak obj; 50 jweak obj;
51 }; 51 };
52 52
53 // static 53 // static
54 bool DownloadController::RegisterDownloadController(JNIEnv* env) { 54 bool DownloadControllerAndroidImpl::RegisterDownloadController(JNIEnv* env) {
55 return RegisterNativesImpl(env); 55 return RegisterNativesImpl(env);
56 } 56 }
57 57
58 DownloadController* DownloadController::GetInstance() { 58 // static
59 return Singleton<DownloadController>::get(); 59 DownloadControllerAndroid* DownloadControllerAndroid::Get() {
60 return DownloadControllerAndroidImpl::GetInstance();
60 } 61 }
61 62
62 DownloadController::DownloadController() 63 // static
64 DownloadControllerAndroidImpl* DownloadControllerAndroidImpl::GetInstance() {
65 return Singleton<DownloadControllerAndroidImpl>::get();
66 }
67
68 DownloadControllerAndroidImpl::DownloadControllerAndroidImpl()
63 : java_object_(NULL) { 69 : java_object_(NULL) {
64 } 70 }
65 71
66 DownloadController::~DownloadController() { 72 DownloadControllerAndroidImpl::~DownloadControllerAndroidImpl() {
67 if (java_object_) { 73 if (java_object_) {
68 JNIEnv* env = AttachCurrentThread(); 74 JNIEnv* env = AttachCurrentThread();
69 env->DeleteWeakGlobalRef(java_object_->obj); 75 env->DeleteWeakGlobalRef(java_object_->obj);
70 delete java_object_; 76 delete java_object_;
71 CheckException(env); 77 CheckException(env);
72 } 78 }
73 } 79 }
74 80
75 // Initialize references to Java object. 81 // Initialize references to Java object.
76 void DownloadController::Init(JNIEnv* env, jobject obj) { 82 void DownloadControllerAndroidImpl::Init(JNIEnv* env, jobject obj) {
77 java_object_ = new JavaObject; 83 java_object_ = new JavaObject;
78 java_object_->obj = env->NewWeakGlobalRef(obj); 84 java_object_->obj = env->NewWeakGlobalRef(obj);
79 } 85 }
80 86
81 void DownloadController::CreateGETDownload( 87 void DownloadControllerAndroidImpl::CreateGETDownload(
82 RenderViewHost* render_view_host, 88 RenderViewHost* render_view_host,
83 int request_id) { 89 int request_id) {
84 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 90 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
85 int render_process_id = render_view_host->GetProcess()->GetID(); 91 int render_process_id = render_view_host->GetProcess()->GetID();
86 GlobalRequestID global_id(render_process_id, request_id); 92 GlobalRequestID global_id(render_process_id, request_id);
87 93
88 // We are yielding the UI thread and render_view_host may go away by 94 // We are yielding the UI thread and render_view_host may go away by
89 // the time we come back. Pass along render_process_id and render_view_id 95 // the time we come back. Pass along render_process_id and render_view_id
90 // to retrieve it later (if it still exists). 96 // to retrieve it later (if it still exists).
91 BrowserThread::PostTask( 97 BrowserThread::PostTask(
92 BrowserThread::IO, FROM_HERE, 98 BrowserThread::IO, FROM_HERE,
93 base::Bind(&DownloadController::PrepareDownloadInfo, 99 base::Bind(&DownloadControllerAndroidImpl::PrepareDownloadInfo,
94 base::Unretained(this), global_id, 100 base::Unretained(this), global_id,
95 render_process_id, 101 render_process_id,
96 render_view_host->GetRoutingID())); 102 render_view_host->GetRoutingID()));
97 } 103 }
98 104
99 void DownloadController::PrepareDownloadInfo( 105 void DownloadControllerAndroidImpl::PrepareDownloadInfo(
100 const GlobalRequestID& global_id, 106 const GlobalRequestID& global_id,
101 int render_process_id, int render_view_id) { 107 int render_process_id, int render_view_id) {
102 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 108 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
103 109
104 net::URLRequest* request = 110 net::URLRequest* request =
105 ResourceDispatcherHostImpl::Get()->GetURLRequest(global_id); 111 ResourceDispatcherHostImpl::Get()->GetURLRequest(global_id);
106 DCHECK(request) << "Request to download not found."; 112 DCHECK(request) << "Request to download not found.";
107 113
108 DownloadInfoAndroid info_android(request); 114 DownloadInfoAndroid info_android(request);
109 115
110 net::CookieStore* cookie_store = request->context()->cookie_store(); 116 net::CookieStore* cookie_store = request->context()->cookie_store();
111 if (cookie_store) { 117 if (cookie_store) {
112 net::CookieMonster* cookie_monster = cookie_store->GetCookieMonster(); 118 net::CookieMonster* cookie_monster = cookie_store->GetCookieMonster();
113 if (cookie_monster) { 119 if (cookie_monster) {
114 cookie_monster->GetAllCookiesForURLAsync( 120 cookie_monster->GetAllCookiesForURLAsync(
115 request->url(), 121 request->url(),
116 base::Bind(&DownloadController::CheckPolicyAndLoadCookies, 122 base::Bind(&DownloadControllerAndroidImpl::CheckPolicyAndLoadCookies,
117 base::Unretained(this), info_android, render_process_id, 123 base::Unretained(this), info_android, render_process_id,
118 render_view_id, global_id)); 124 render_view_id, global_id));
119 } else { 125 } else {
120 DoLoadCookies( 126 DoLoadCookies(
121 info_android, render_process_id, render_view_id, global_id); 127 info_android, render_process_id, render_view_id, global_id);
122 } 128 }
123 } else { 129 } else {
124 // Can't get any cookies, start android download. 130 // Can't get any cookies, start android download.
125 StartAndroidDownload(info_android, render_process_id, render_view_id); 131 StartAndroidDownload(info_android, render_process_id, render_view_id);
126 } 132 }
127 } 133 }
128 134
129 void DownloadController::CheckPolicyAndLoadCookies( 135 void DownloadControllerAndroidImpl::CheckPolicyAndLoadCookies(
130 const DownloadInfoAndroid& info, int render_process_id, 136 const DownloadInfoAndroid& info, int render_process_id,
131 int render_view_id, const GlobalRequestID& global_id, 137 int render_view_id, const GlobalRequestID& global_id,
132 const net::CookieList& cookie_list) { 138 const net::CookieList& cookie_list) {
133 net::URLRequest* request = 139 net::URLRequest* request =
134 ResourceDispatcherHostImpl::Get()->GetURLRequest(global_id); 140 ResourceDispatcherHostImpl::Get()->GetURLRequest(global_id);
135 DCHECK(request) << "Request to download not found."; 141 DCHECK(request) << "Request to download not found.";
136 142
137 if (request->context()->network_delegate()->CanGetCookies( 143 if (request->context()->network_delegate()->CanGetCookies(
138 *request, cookie_list)) { 144 *request, cookie_list)) {
139 DoLoadCookies(info, render_process_id, render_view_id, global_id); 145 DoLoadCookies(info, render_process_id, render_view_id, global_id);
140 } else { 146 } else {
141 StartAndroidDownload(info, render_process_id, render_view_id); 147 StartAndroidDownload(info, render_process_id, render_view_id);
142 } 148 }
143 } 149 }
144 150
145 void DownloadController::DoLoadCookies( 151 void DownloadControllerAndroidImpl::DoLoadCookies(
146 const DownloadInfoAndroid& info, int render_process_id, 152 const DownloadInfoAndroid& info, int render_process_id,
147 int render_view_id, const GlobalRequestID& global_id) { 153 int render_view_id, const GlobalRequestID& global_id) {
148 net::CookieOptions options; 154 net::CookieOptions options;
149 options.set_include_httponly(); 155 options.set_include_httponly();
150 156
151 net::URLRequest* request = 157 net::URLRequest* request =
152 ResourceDispatcherHostImpl::Get()->GetURLRequest(global_id); 158 ResourceDispatcherHostImpl::Get()->GetURLRequest(global_id);
153 DCHECK(request) << "Request to download not found."; 159 DCHECK(request) << "Request to download not found.";
154 160
155 request->context()->cookie_store()->GetCookiesWithOptionsAsync( 161 request->context()->cookie_store()->GetCookiesWithOptionsAsync(
156 info.url, options, 162 info.url, options,
157 base::Bind(&DownloadController::OnCookieResponse, 163 base::Bind(&DownloadControllerAndroidImpl::OnCookieResponse,
158 base::Unretained(this), info, render_process_id, 164 base::Unretained(this), info, render_process_id,
159 render_view_id)); 165 render_view_id));
160 } 166 }
161 167
162 void DownloadController::OnCookieResponse(DownloadInfoAndroid download_info, 168 void DownloadControllerAndroidImpl::OnCookieResponse(
163 int render_process_id, 169 DownloadInfoAndroid download_info,
164 int render_view_id, 170 int render_process_id,
165 const std::string& cookie) { 171 int render_view_id,
172 const std::string& cookie) {
166 download_info.cookie = cookie; 173 download_info.cookie = cookie;
167 174
168 // We have everything we need, start Android download. 175 // We have everything we need, start Android download.
169 StartAndroidDownload(download_info, render_process_id, render_view_id); 176 StartAndroidDownload(download_info, render_process_id, render_view_id);
170 } 177 }
171 178
172 void DownloadController::StartAndroidDownload( 179 void DownloadControllerAndroidImpl::StartAndroidDownload(
173 const DownloadInfoAndroid& info, 180 const DownloadInfoAndroid& info,
174 int render_process_id, 181 int render_process_id,
175 int render_view_id) { 182 int render_view_id) {
176 // Call ourself on the UI thread if not already on it. 183 // Call ourself on the UI thread if not already on it.
177 if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) { 184 if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) {
178 BrowserThread::PostTask( 185 BrowserThread::PostTask(
179 BrowserThread::UI, FROM_HERE, 186 BrowserThread::UI, FROM_HERE,
180 base::Bind(&DownloadController::StartAndroidDownload, 187 base::Bind(&DownloadControllerAndroidImpl::StartAndroidDownload,
181 base::Unretained(this), info, render_process_id, 188 base::Unretained(this), info, render_process_id,
182 render_view_id)); 189 render_view_id));
183 return; 190 return;
184 } 191 }
185 192
186 JNIEnv* env = AttachCurrentThread(); 193 JNIEnv* env = AttachCurrentThread();
187 194
188 // Call newHttpGetDownload 195 // Call newHttpGetDownload
189 ScopedJavaLocalRef<jobject> view = GetContentView(render_process_id, 196 ScopedJavaLocalRef<jobject> view = GetContentView(render_process_id,
190 render_view_id); 197 render_view_id);
(...skipping 15 matching lines...) Expand all
206 ConvertUTF8ToJavaString(env, info.cookie); 213 ConvertUTF8ToJavaString(env, info.cookie);
207 ScopedJavaLocalRef<jstring> jreferer = 214 ScopedJavaLocalRef<jstring> jreferer =
208 ConvertUTF8ToJavaString(env, info.referer); 215 ConvertUTF8ToJavaString(env, info.referer);
209 216
210 Java_DownloadController_newHttpGetDownload( 217 Java_DownloadController_newHttpGetDownload(
211 env, GetJavaObject()->Controller(env).obj(), view.obj(), jurl.obj(), 218 env, GetJavaObject()->Controller(env).obj(), view.obj(), jurl.obj(),
212 juser_agent.obj(), jcontent_disposition.obj(), jmime_type.obj(), 219 juser_agent.obj(), jcontent_disposition.obj(), jmime_type.obj(),
213 jcookie.obj(), jreferer.obj(), info.total_bytes); 220 jcookie.obj(), jreferer.obj(), info.total_bytes);
214 } 221 }
215 222
216 void DownloadController::OnPostDownloadStarted( 223 void DownloadControllerAndroidImpl::OnPostDownloadStarted(
217 WebContents* web_contents, 224 WebContents* web_contents,
218 DownloadItem* download_item) { 225 DownloadItem* download_item) {
219 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 226 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
220 JNIEnv* env = AttachCurrentThread(); 227 JNIEnv* env = AttachCurrentThread();
221 228
222 // Register for updates to the DownloadItem. 229 // Register for updates to the DownloadItem.
223 download_item->AddObserver(this); 230 download_item->AddObserver(this);
224 231
225 ScopedJavaLocalRef<jobject> view = 232 ScopedJavaLocalRef<jobject> view =
226 GetContentViewCoreFromWebContents(web_contents); 233 GetContentViewCoreFromWebContents(web_contents);
227 if(view.is_null()) { 234 if(view.is_null()) {
228 // The view went away. Can't proceed. 235 // The view went away. Can't proceed.
229 return; 236 return;
230 } 237 }
231 238
232 Java_DownloadController_onHttpPostDownloadStarted( 239 Java_DownloadController_onHttpPostDownloadStarted(
233 env, GetJavaObject()->Controller(env).obj(), view.obj()); 240 env, GetJavaObject()->Controller(env).obj(), view.obj());
234 } 241 }
235 242
236 void DownloadController::OnDownloadUpdated(DownloadItem* item) { 243 void DownloadControllerAndroidImpl::OnDownloadUpdated(DownloadItem* item) {
237 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 244 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
238 245
239 if (item->GetState() != DownloadItem::COMPLETE) 246 if (item->GetState() != DownloadItem::COMPLETE)
240 return; 247 return;
241 248
242 // Call onHttpPostDownloadCompleted 249 // Call onHttpPostDownloadCompleted
243 JNIEnv* env = AttachCurrentThread(); 250 JNIEnv* env = AttachCurrentThread();
244 ScopedJavaLocalRef<jstring> jurl = 251 ScopedJavaLocalRef<jstring> jurl =
245 ConvertUTF8ToJavaString(env, item->GetURL().spec()); 252 ConvertUTF8ToJavaString(env, item->GetURL().spec());
246 ScopedJavaLocalRef<jstring> jcontent_disposition = 253 ScopedJavaLocalRef<jstring> jcontent_disposition =
247 ConvertUTF8ToJavaString(env, item->GetContentDisposition()); 254 ConvertUTF8ToJavaString(env, item->GetContentDisposition());
248 ScopedJavaLocalRef<jstring> jmime_type = 255 ScopedJavaLocalRef<jstring> jmime_type =
249 ConvertUTF8ToJavaString(env, item->GetMimeType()); 256 ConvertUTF8ToJavaString(env, item->GetMimeType());
250 ScopedJavaLocalRef<jstring> jpath = 257 ScopedJavaLocalRef<jstring> jpath =
251 ConvertUTF8ToJavaString(env, item->GetFullPath().value()); 258 ConvertUTF8ToJavaString(env, item->GetFullPath().value());
252 259
253 ScopedJavaLocalRef<jobject> view_core = GetContentViewCoreFromWebContents( 260 ScopedJavaLocalRef<jobject> view_core = GetContentViewCoreFromWebContents(
254 item->GetWebContents()); 261 item->GetWebContents());
255 if (view_core.is_null()) { 262 if (view_core.is_null()) {
256 // We can get NULL WebContents from the DownloadItem. 263 // We can get NULL WebContents from the DownloadItem.
257 return; 264 return;
258 } 265 }
259 266
260 Java_DownloadController_onHttpPostDownloadCompleted(env, 267 Java_DownloadController_onHttpPostDownloadCompleted(env,
261 GetJavaObject()->Controller(env).obj(), view_core.obj(), jurl.obj(), 268 GetJavaObject()->Controller(env).obj(), view_core.obj(), jurl.obj(),
262 jcontent_disposition.obj(), jmime_type.obj(), jpath.obj(), 269 jcontent_disposition.obj(), jmime_type.obj(), jpath.obj(),
263 item->GetReceivedBytes(), true); 270 item->GetReceivedBytes(), true);
264 } 271 }
265 272
266 void DownloadController::OnDownloadOpened(DownloadItem* item) { 273 void DownloadControllerAndroidImpl::OnDownloadOpened(DownloadItem* item) {
267 } 274 }
268 275
269 ScopedJavaLocalRef<jobject> DownloadController::GetContentView( 276 ScopedJavaLocalRef<jobject> DownloadControllerAndroidImpl::GetContentView(
270 int render_process_id, int render_view_id) { 277 int render_process_id, int render_view_id) {
271 RenderViewHost* render_view_host = 278 RenderViewHost* render_view_host =
272 RenderViewHost::FromID(render_process_id, render_view_id); 279 RenderViewHost::FromID(render_process_id, render_view_id);
273 280
274 if (!render_view_host) 281 if (!render_view_host)
275 return ScopedJavaLocalRef<jobject>(); 282 return ScopedJavaLocalRef<jobject>();
276 283
277 WebContents* web_contents = 284 WebContents* web_contents =
278 render_view_host->GetDelegate()->GetAsWebContents(); 285 render_view_host->GetDelegate()->GetAsWebContents();
279 286
280 if (!web_contents) 287 if (!web_contents)
281 return ScopedJavaLocalRef<jobject>(); 288 return ScopedJavaLocalRef<jobject>();
282 289
283 return GetContentViewCoreFromWebContents(web_contents); 290 return GetContentViewCoreFromWebContents(web_contents);
284 } 291 }
285 292
286 ScopedJavaLocalRef<jobject> 293 ScopedJavaLocalRef<jobject>
287 DownloadController::GetContentViewCoreFromWebContents( 294 DownloadControllerAndroidImpl::GetContentViewCoreFromWebContents(
288 WebContents* web_contents) { 295 WebContents* web_contents) {
289 if (!web_contents) 296 if (!web_contents)
290 return ScopedJavaLocalRef<jobject>(); 297 return ScopedJavaLocalRef<jobject>();
291 298
292 ContentViewCore* view_core = web_contents->GetContentNativeView(); 299 ContentViewCore* view_core = web_contents->GetContentNativeView();
293 return view_core ? view_core->GetJavaObject() : 300 return view_core ? view_core->GetJavaObject() :
294 ScopedJavaLocalRef<jobject>(); 301 ScopedJavaLocalRef<jobject>();
295 } 302 }
296 303
297 DownloadController::JavaObject* DownloadController::GetJavaObject() { 304 DownloadControllerAndroidImpl::JavaObject*
305 DownloadControllerAndroidImpl::GetJavaObject() {
298 if (!java_object_) { 306 if (!java_object_) {
299 // Initialize Java DownloadController by calling 307 // Initialize Java DownloadController by calling
300 // DownloadController.getInstance(), which will call Init() 308 // DownloadController.getInstance(), which will call Init()
301 // if Java DownloadController is not instantiated already. 309 // if Java DownloadController is not instantiated already.
302 JNIEnv* env = AttachCurrentThread(); 310 JNIEnv* env = AttachCurrentThread();
303 ScopedJavaLocalRef<jclass> clazz = 311 ScopedJavaLocalRef<jclass> clazz =
304 GetClass(env, kDownloadControllerClassPathName); 312 GetClass(env, kDownloadControllerClassPathName);
305 jmethodID get_instance = GetStaticMethodID(env, clazz, "getInstance", 313 jmethodID get_instance = GetStaticMethodID(env, clazz, "getInstance",
306 "()Lorg/chromium/content/browser/DownloadController;"); 314 "()Lorg/chromium/content/browser/DownloadController;");
307 ScopedJavaLocalRef<jobject> jobj(env, 315 ScopedJavaLocalRef<jobject> jobj(env,
308 env->CallStaticObjectMethod(clazz.obj(), get_instance)); 316 env->CallStaticObjectMethod(clazz.obj(), get_instance));
309 CheckException(env); 317 CheckException(env);
310 } 318 }
311 319
312 DCHECK(java_object_); 320 DCHECK(java_object_);
313 return java_object_; 321 return java_object_;
314 } 322 }
315 323
316 DownloadController::DownloadInfoAndroid::DownloadInfoAndroid( 324 DownloadControllerAndroidImpl::DownloadInfoAndroid::DownloadInfoAndroid(
317 net::URLRequest* request) { 325 net::URLRequest* request) {
318 request->GetResponseHeaderByName("content-disposition", &content_disposition); 326 request->GetResponseHeaderByName("content-disposition", &content_disposition);
319 request->GetMimeType(&original_mime_type); 327 request->GetResponseHeaderByName("mime-type", &original_mime_type);
320 request->extra_request_headers().GetHeader( 328 request->extra_request_headers().GetHeader(
321 net::HttpRequestHeaders::kUserAgent, &user_agent); 329 net::HttpRequestHeaders::kUserAgent, &user_agent);
322 GURL referer_url(request->GetSanitizedReferrer()); 330 GURL referer_url(request->GetSanitizedReferrer());
323 if (referer_url.is_valid()) 331 if (referer_url.is_valid())
324 referer = referer_url.spec(); 332 referer = referer_url.spec();
325 if (!request->url_chain().empty()) { 333 if (!request->url_chain().empty()) {
326 original_url = request->url_chain().front(); 334 original_url = request->url_chain().front();
327 url = request->url_chain().back(); 335 url = request->url_chain().back();
328 } 336 }
329 } 337 }
330 338
331 DownloadController::DownloadInfoAndroid::~DownloadInfoAndroid() {} 339 DownloadControllerAndroidImpl::DownloadInfoAndroid::~DownloadInfoAndroid() {}
332 340
333 } // namespace content 341 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/android/download_controller_android_impl.h ('k') | content/content_browser.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698