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

Unified Diff: chrome/browser/download/download_util.cc

Issue 3127008: Preliminary work on resuming downloads whose connections have expired.
Patch Set: Waiting to send download automation error message until after other downloads are canceled. Created 10 years, 3 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/download/download_util.cc
diff --git a/chrome/browser/download/download_util.cc b/chrome/browser/download/download_util.cc
index 5747e510b2f107efe855a35d604efb795f05e4b1..cd64bf5bd3a2fe18cc10e07a4a7c8db9f27e8b98 100644
--- a/chrome/browser/download/download_util.cc
+++ b/chrome/browser/download/download_util.cc
@@ -13,6 +13,7 @@
#include "app/l10n_util.h"
#include "app/resource_bundle.h"
+#include "base/file_path.h"
#include "base/file_util.h"
#include "base/i18n/rtl.h"
#include "base/i18n/time_formatting.h"
@@ -30,6 +31,7 @@
#include "chrome/browser/download/download_item.h"
#include "chrome/browser/download/download_item_model.h"
#include "chrome/browser/download/download_manager.h"
+#include "chrome/browser/download/download_types.h"
#include "chrome/browser/extensions/crx_installer.h"
#include "chrome/browser/extensions/extension_install_ui.h"
#include "chrome/browser/extensions/extensions_service.h"
@@ -78,6 +80,8 @@
#include "chrome/browser/views/frame/browser_view.h"
#endif
+static const double PI = 3.141592653589793;
+
namespace download_util {
// How many times to cycle the complete animation. This should be an odd number
@@ -452,7 +456,6 @@ void PaintDownloadComplete(gfx::Canvas* canvas,
// Start at full opacity, then loop back and forth five times before ending
// at zero opacity.
- static const double PI = 3.141592653589793;
double opacity = sin(animation_progress * PI * kCompleteAnimationCycles +
PI/2) / 2 + 0.5;
@@ -462,6 +465,43 @@ void PaintDownloadComplete(gfx::Canvas* canvas,
canvas->Restore();
}
+void PaintDownloadInterrupted(gfx::Canvas* canvas,
+#if defined(TOOLKIT_VIEWS)
+ views::View* containing_view,
+#endif
+ int origin_x,
+ int origin_y,
+ double animation_progress,
+ PaintDownloadProgressSize size) {
+ // Load up our common bitmaps.
+ if (!g_foreground_16) {
+ ResourceBundle& rb = ResourceBundle::GetSharedInstance();
+ g_foreground_16 = rb.GetBitmapNamed(IDR_DOWNLOAD_PROGRESS_FOREGROUND_16);
+ g_foreground_32 = rb.GetBitmapNamed(IDR_DOWNLOAD_PROGRESS_FOREGROUND_32);
+ }
+
+ SkBitmap* complete = (size == BIG) ? g_foreground_32 : g_foreground_16;
+
+ gfx::Rect complete_bounds(origin_x, origin_y,
+ complete->width(), complete->height());
+#if defined(TOOLKIT_VIEWS)
+ // Mirror the positions if necessary.
+ complete_bounds.set_x(
+ containing_view->MirroredLeftPointForRect(complete_bounds));
+#endif
+
+ // Start at zero opacity, then loop back and forth five times before ending
+ // at full opacity.
+ double opacity =
+ sin((1.0 - animation_progress) * PI * kCompleteAnimationCycles +
+ PI/2) / 2 + 0.5;
+
+ canvas->SaveLayerAlpha(static_cast<int>(255.0 * opacity), complete_bounds);
+ canvas->AsCanvasSkia()->drawARGB(0, 255, 255, 255, SkXfermode::kClear_Mode);
+ canvas->DrawBitmapInt(*complete, complete_bounds.x(), complete_bounds.y());
+ canvas->Restore();
+}
+
// Load a language dependent height so that the dangerous download confirmation
// message doesn't overlap with the download link label.
int GetBigProgressIconSize() {
@@ -573,6 +613,20 @@ DictionaryValue* CreateDownloadItemValue(DownloadItem* download, int id) {
static_cast<int>(download->PercentComplete()));
file_value->SetInteger("received",
static_cast<int>(download->received_bytes()));
+ } else if (download->state() == DownloadItem::INTERRUPTED) {
+ if (download->safety_state() == DownloadItem::DANGEROUS) {
+ file_value->SetString("state", "DANGEROUS");
+ } else {
+ file_value->SetString("state", "INTERRUPTED");
+ }
+
+ file_value->SetString("progress_status_text",
+ WideToUTF16Hack(GetProgressStatusText(download)));
+
+ file_value->SetInteger("percent",
+ static_cast<int>(download->PercentComplete()));
+ file_value->SetInteger("received",
+ static_cast<int>(download->received_bytes()));
} else if (download->state() == DownloadItem::CANCELLED) {
file_value->SetString("state", "CANCELLED");
} else if (download->state() == DownloadItem::COMPLETE) {
@@ -729,7 +783,72 @@ void DownloadUrl(
true, // Show "Save as" UI.
render_process_host_id,
render_view_id,
- context);
+ context,
+ 0);
+}
+
+static void PostBeginDownload(ResourceDispatcherHost* rdh,
+ const GURL& url,
+ const GURL& referrer,
+ const DownloadSaveInfo& save_info,
+ int render_process_host_id,
+ int render_view_id,
+ uint64 start_offset) {
+ DCHECK(ChromeThread::CurrentlyOn(ChromeThread::IO));
+ URLRequestContextGetter* context_getter = Profile::GetDefaultRequestContext();
+ if (context_getter) {
+ URLRequestContext* context = context_getter->GetURLRequestContext();
+ // |referrer_charset| is used to construct suggested filename, but we are
+ // using an existing file so we don't need to set it.
+
+ rdh->BeginDownload(url,
+ referrer,
+ save_info,
+ false, // Don't show "Save as" UI.
+ render_process_host_id,
+ render_view_id,
+ context,
+ start_offset);
+ }
+}
+
+void RestartDownloadUrl(
+ ResourceDispatcherHost* rdh,
+ const GURL& url,
+ const GURL& referrer,
+ const FilePath& path,
+ int64 start_offset,
+ int render_process_host_id,
+ int render_view_id) {
+ DCHECK(ChromeThread::CurrentlyOn(ChromeThread::FILE));
+
+ // Get the temporary file and rename it to the original value.
+ FilePath crpath = download_util::GetCrDownloadPath(path);
+
+ // Validate the start offset.
+ int64 end = 0;
+ if (file_util::GetFileSize(crpath, &end)) {
+ if (end != start_offset) {
+ LOG(WARNING) << " File size (" << end
+ << ") is different from the expected size (" << start_offset
+ << ") for \"" << path.value() << "\"";
+ }
+ }
+
+ DownloadSaveInfo save_info;
+ save_info.file_path = path;
+
+ ChromeThread::PostTask(
+ ChromeThread::IO,
+ FROM_HERE,
+ NewRunnableFunction(&PostBeginDownload,
+ rdh,
+ url,
+ referrer,
+ save_info,
+ render_process_host_id,
+ render_view_id,
+ end));
}
void CancelDownloadRequest(ResourceDispatcherHost* rdh,
@@ -766,4 +885,23 @@ FilePath GetCrDownloadPath(const FilePath& suggested_path) {
return FilePath(file_name);
}
+FilePath RemoveCrDownloadPath(const FilePath& cr_path) {
+ FilePath::StringType file_name = cr_path.value();
+ size_t pos = file_name.find(FILE_PATH_LITERAL(".crdownload"));
+ if (pos != std::string::npos)
+ file_name = file_name.substr(0, pos);
+ return FilePath(file_name);
+}
+
+bool IsCrDownloadPath(const FilePath& path) {
+ FilePath::StringType file_name = path.value();
+ FilePath::StringType extension = FILE_PATH_LITERAL(".crdownload");
+ FilePath::StringType::size_type name_len = file_name.length();
+ FilePath::StringType::size_type ext_len = extension.length();
+ if (ext_len > name_len)
+ return false;
+
+ return file_name.substr(name_len - ext_len, ext_len) == extension;
+}
+
} // namespace download_util

Powered by Google App Engine
This is Rietveld 408576698