| Index: chrome/android/java/src/org/chromium/chrome/browser/download/DownloadUtils.java
|
| diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadUtils.java
|
| index 78c40104567fa4e9aec6cf5576a04a13281d5d26..c228920794cde07e8c8df84592264bd3a51e353b 100644
|
| --- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadUtils.java
|
| +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadUtils.java
|
| @@ -38,6 +38,8 @@ import org.chromium.chrome.browser.download.ui.BackendProvider;
|
| import org.chromium.chrome.browser.download.ui.BackendProvider.DownloadDelegate;
|
| import org.chromium.chrome.browser.download.ui.DownloadFilter;
|
| import org.chromium.chrome.browser.download.ui.DownloadHistoryItemWrapper;
|
| +import org.chromium.chrome.browser.offlinepages.ClientId;
|
| +import org.chromium.chrome.browser.offlinepages.OfflinePageBridge;
|
| import org.chromium.chrome.browser.offlinepages.downloads.OfflinePageDownloadBridge;
|
| import org.chromium.chrome.browser.tab.Tab;
|
| import org.chromium.chrome.browser.tabmodel.TabModel.TabLaunchType;
|
| @@ -187,10 +189,21 @@ public class DownloadUtils {
|
| * @param context Context to pull resources from.
|
| */
|
| public static void downloadOfflinePage(Context context, Tab tab) {
|
| - final OfflinePageDownloadBridge bridge = new OfflinePageDownloadBridge(tab.getProfile());
|
| - bridge.startDownload(tab);
|
| - bridge.destroy();
|
| - DownloadUtils.recordDownloadPageMetrics(tab);
|
| + if (tab.isShowingErrorPage()) {
|
| + // The download needs to be scheduled to happen at later time due to current network
|
| + // error.
|
| + ClientId clientId = ClientId.createGuidClientIdForNamespace(
|
| + OfflinePageBridge.ASYNC_NAMESPACE);
|
| + final OfflinePageBridge bridge = OfflinePageBridge.getForProfile(tab.getProfile());
|
| + bridge.savePageLater(tab.getUrl(), clientId, true /* userRequested */);
|
| + } else {
|
| + // Otherwise, the download can be started immediately.
|
| + final OfflinePageDownloadBridge bridge =
|
| + new OfflinePageDownloadBridge(tab.getProfile());
|
| + bridge.startDownload(tab);
|
| + bridge.destroy();
|
| + DownloadUtils.recordDownloadPageMetrics(tab);
|
| + }
|
| }
|
|
|
| /**
|
| @@ -201,13 +214,15 @@ public class DownloadUtils {
|
| public static boolean isAllowedToDownloadPage(Tab tab) {
|
| if (tab == null) return false;
|
|
|
| - // Only allow HTTP and HTTPS pages, as that is these are the only scenarios supported by the
|
| - // background/offline page saving.
|
| - if (!tab.getUrl().startsWith(UrlConstants.HTTP_SCHEME)
|
| - && !tab.getUrl().startsWith(UrlConstants.HTTPS_SCHEME)) {
|
| - return false;
|
| + // Check if the page url is supported for saving. Only HTTP and HTTPS pages are allowed.
|
| + if (!OfflinePageBridge.canSavePage(tab.getUrl())) return false;
|
| +
|
| + // Download will only be allowed for the error page if download button is shown in the page.
|
| + if (tab.isShowingErrorPage()) {
|
| + final OfflinePageBridge bridge = OfflinePageBridge.getForProfile(tab.getProfile());
|
| + return bridge.isShowingDownloadButtonInErrorPage(tab.getWebContents());
|
| }
|
| - if (tab.isShowingErrorPage()) return false;
|
| +
|
| if (tab.isShowingInterstitialPage()) return false;
|
|
|
| // Don't allow re-downloading the currently displayed offline page.
|
|
|