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

Side by Side Diff: chrome/android/java/src/org/chromium/chrome/browser/download/ChromeDownloadDelegate.java

Issue 2871663004: Remove webContents check when download starts (Closed)
Patch Set: nits Created 3 years, 7 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
« no previous file with comments | « no previous file | chrome/android/java/src/org/chromium/chrome/browser/download/DownloadController.java » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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 package org.chromium.chrome.browser.download; 5 package org.chromium.chrome.browser.download;
6 6
7 import android.Manifest.permission; 7 import android.Manifest.permission;
8 import android.app.Activity;
9 import android.app.DownloadManager; 8 import android.app.DownloadManager;
10 import android.content.Context; 9 import android.content.Context;
11 import android.content.pm.PackageManager; 10 import android.content.pm.PackageManager;
12 import android.net.Uri; 11 import android.net.Uri;
13 import android.os.AsyncTask; 12 import android.os.AsyncTask;
14 import android.os.Environment; 13 import android.os.Environment;
15 import android.os.Handler;
16 import android.text.TextUtils; 14 import android.text.TextUtils;
17 import android.webkit.MimeTypeMap; 15 import android.webkit.MimeTypeMap;
18 import android.webkit.URLUtil; 16 import android.webkit.URLUtil;
19 17
20 import org.chromium.base.Log; 18 import org.chromium.base.Log;
21 import org.chromium.base.ThreadUtils; 19 import org.chromium.base.ThreadUtils;
22 import org.chromium.base.annotations.CalledByNative; 20 import org.chromium.base.annotations.CalledByNative;
23 import org.chromium.chrome.browser.ChromeActivity;
24 import org.chromium.chrome.browser.UrlConstants; 21 import org.chromium.chrome.browser.UrlConstants;
25 import org.chromium.chrome.browser.tab.EmptyTabObserver; 22 import org.chromium.chrome.browser.tab.EmptyTabObserver;
26 import org.chromium.chrome.browser.tab.Tab; 23 import org.chromium.chrome.browser.tab.Tab;
27 import org.chromium.chrome.browser.tabmodel.TabModelSelector;
28 import org.chromium.content_public.browser.WebContents; 24 import org.chromium.content_public.browser.WebContents;
29 import org.chromium.ui.base.WindowAndroid; 25 import org.chromium.ui.base.WindowAndroid;
30 import org.chromium.ui.base.WindowAndroid.PermissionCallback; 26 import org.chromium.ui.base.WindowAndroid.PermissionCallback;
31 27
32 import java.io.File; 28 import java.io.File;
33 29
34 /** 30 /**
35 * Chrome implementation of the ContentViewDownloadDelegate interface. 31 * Chrome implementation of the ContentViewDownloadDelegate interface.
36 * 32 *
37 * Listens to POST and GET download events. GET download requests are passed alo ng to the 33 * Listens to POST and GET download events. GET download requests are passed alo ng to the
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after
180 } 176 }
181 177
182 @Override 178 @Override
183 public void onPostExecute(Void args) { 179 public void onPostExecute(Void args) {
184 enqueueDownloadManagerRequest(downloadInfo); 180 enqueueDownloadManagerRequest(downloadInfo);
185 } 181 }
186 }.execute(); 182 }.execute();
187 } else { 183 } else {
188 enqueueDownloadManagerRequest(downloadInfo); 184 enqueueDownloadManagerRequest(downloadInfo);
189 } 185 }
190 return closeBlankTab(); 186 return DownloadController.closeTabIfBlank(mTab);
191 } 187 }
192 188
193 private void launchDownloadInfoBar(DownloadInfo info, File fullDirPath) { 189 private void launchDownloadInfoBar(DownloadInfo info, File fullDirPath) {
194 if (mTab == null) return; 190 if (mTab == null) return;
195 nativeLaunchDuplicateDownloadInfoBar(ChromeDownloadDelegate.this, mTab, info, 191 nativeLaunchDuplicateDownloadInfoBar(ChromeDownloadDelegate.this, mTab, info,
196 new File(fullDirPath, info.getFileName()).toString(), mTab.isInc ognito()); 192 new File(fullDirPath, info.getFileName()).toString(), mTab.isInc ognito());
197 } 193 }
198 194
199 /** 195 /**
200 * Enqueue a request to download a file using Android DownloadManager. 196 * Enqueue a request to download a file using Android DownloadManager.
201 * 197 *
202 * @param info Download information about the download. 198 * @param info Download information about the download.
203 */ 199 */
204 private void enqueueDownloadManagerRequest(final DownloadInfo info) { 200 private void enqueueDownloadManagerRequest(final DownloadInfo info) {
205 DownloadManagerService.getDownloadManagerService().enqueueDownloadManage rRequest( 201 DownloadManagerService.getDownloadManagerService().enqueueDownloadManage rRequest(
206 new DownloadItem(true, info), true); 202 new DownloadItem(true, info), true);
207 closeBlankTab(); 203 DownloadController.closeTabIfBlank(mTab);
208 } 204 }
209 205
210 /** 206 /**
211 * Check the external storage and notify user on error. 207 * Check the external storage and notify user on error.
212 * 208 *
213 * @param fullDirPath The dir path to download a file. Normally this is exte rnal storage. 209 * @param fullDirPath The dir path to download a file. Normally this is exte rnal storage.
214 * @param externalStorageStatus The status of the external storage. 210 * @param externalStorageStatus The status of the external storage.
215 * @return Whether external storage is ok for downloading. 211 * @return Whether external storage is ok for downloading.
216 */ 212 */
217 private boolean checkExternalStorageAndNotify( 213 private boolean checkExternalStorageAndNotify(
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
265 .setFileName(fileName) 261 .setFileName(fileName)
266 .setMimeType(mimeType) 262 .setMimeType(mimeType)
267 .setCookie(cookie) 263 .setCookie(cookie)
268 .setReferrer(referrer) 264 .setReferrer(referrer)
269 .setIsGETRequest(true) 265 .setIsGETRequest(true)
270 .build(); 266 .build();
271 enqueueDownloadManagerRequest(downloadInfo); 267 enqueueDownloadManagerRequest(downloadInfo);
272 } 268 }
273 269
274 /** 270 /**
275 * Called when download starts.
276 *
277 * @param filename Name of the file.
278 * @param mimeType MIME type of the content.
279 */
280 @CalledByNative
281 private void onDownloadStarted(String filename) {
282 DownloadUtils.showDownloadStartToast(mContext);
283 new Handler().post(new Runnable() {
284 @Override
285 public void run() {
286 closeBlankTab();
287 }
288 });
289 }
290
291 /**
292 * If the given MIME type is null, or one of the "generic" types (text/plain 271 * If the given MIME type is null, or one of the "generic" types (text/plain
293 * or application/octet-stream) map it to a type that Android can deal with. 272 * or application/octet-stream) map it to a type that Android can deal with.
294 * If the given type is not generic, return it unchanged. 273 * If the given type is not generic, return it unchanged.
295 * 274 *
296 * We have to implement this ourselves as 275 * We have to implement this ourselves as
297 * MimeTypeMap.remapGenericMimeType() is not public. 276 * MimeTypeMap.remapGenericMimeType() is not public.
298 * See http://crbug.com/407829. 277 * See http://crbug.com/407829.
299 * 278 *
300 * @param mimeType MIME type provided by the server. 279 * @param mimeType MIME type provided by the server.
301 * @param url URL of the data being loaded. 280 * @param url URL of the data being loaded.
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
354 File file = new File(filepath); 333 File file = new File(filepath);
355 if (file.exists() && !file.delete()) { 334 if (file.exists() && !file.delete()) {
356 Log.e(TAG, "Error discarding file: " + filepath); 335 Log.e(TAG, "Error discarding file: " + filepath);
357 } 336 }
358 return null; 337 return null;
359 } 338 }
360 }.execute(); 339 }.execute();
361 } 340 }
362 341
363 /** 342 /**
364 * Close a blank tab just opened for the download purpose.
365 * @return true iff the tab was (already) closed.
366 */
367 private boolean closeBlankTab() {
368 if (mTab == null) {
369 // We do not want caller to dismiss infobar.
370 return true;
371 }
372 WebContents contents = mTab.getWebContents();
373 boolean isInitialNavigation = contents == null
374 || contents.getNavigationController().isInitialNavigation();
375 if (isInitialNavigation) {
376 // Tab is created just for download, close it.
377 Activity activity = mTab.getWindowAndroid().getActivity().get();
378 if (!(activity instanceof ChromeActivity)) return true;
379
380 TabModelSelector selector = ((ChromeActivity) activity).getTabModelS elector();
381 if (mTab.isIncognito() && selector.getModel(true).getCount() == 1) r eturn false;
382 return selector == null ? true : selector.closeTab(mTab);
383 }
384 return false;
385 }
386
387 /**
388 * For certain download types(OMA for example), android DownloadManager shou ld 343 * For certain download types(OMA for example), android DownloadManager shou ld
389 * handle them. Call this function to intercept those downloads. 344 * handle them. Call this function to intercept those downloads.
390 * 345 *
391 * @param url URL to be downloaded. 346 * @param url URL to be downloaded.
392 * @return whether the DownloadManager should intercept the download. 347 * @return whether the DownloadManager should intercept the download.
393 */ 348 */
394 public boolean shouldInterceptContextMenuDownload(String url) { 349 public boolean shouldInterceptContextMenuDownload(String url) {
395 Uri uri = Uri.parse(url); 350 Uri uri = Uri.parse(url);
396 String scheme = uri.normalizeScheme().getScheme(); 351 String scheme = uri.normalizeScheme().getScheme();
397 if (!UrlConstants.HTTP_SCHEME.equals(scheme) && !UrlConstants.HTTPS_SCHE ME.equals(scheme)) { 352 if (!UrlConstants.HTTP_SCHEME.equals(scheme) && !UrlConstants.HTTPS_SCHE ME.equals(scheme)) {
(...skipping 30 matching lines...) Expand all
428 383
429 protected Context getContext() { 384 protected Context getContext() {
430 return mContext; 385 return mContext;
431 } 386 }
432 387
433 private native void nativeInit(WebContents webContents); 388 private native void nativeInit(WebContents webContents);
434 private static native String nativeGetDownloadWarningText(String filename); 389 private static native String nativeGetDownloadWarningText(String filename);
435 private static native void nativeLaunchDuplicateDownloadInfoBar(ChromeDownlo adDelegate delegate, 390 private static native void nativeLaunchDuplicateDownloadInfoBar(ChromeDownlo adDelegate delegate,
436 Tab tab, DownloadInfo downloadInfo, String filePath, boolean isIncog nito); 391 Tab tab, DownloadInfo downloadInfo, String filePath, boolean isIncog nito);
437 } 392 }
OLDNEW
« no previous file with comments | « no previous file | chrome/android/java/src/org/chromium/chrome/browser/download/DownloadController.java » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698