Index: chrome/browser/download/download_util.cc |
=================================================================== |
--- chrome/browser/download/download_util.cc (revision 134311) |
+++ chrome/browser/download/download_util.cc (working copy) |
@@ -6,9 +6,8 @@ |
#include "chrome/browser/download/download_util.h" |
-#if defined(OS_WIN) |
-#include <shobjidl.h> |
-#endif |
+#define _USE_MATH_DEFINES // For VC++ to get M_PI |
+#include <cmath> |
#include <string> |
#include "base/file_util.h" |
@@ -24,7 +23,6 @@ |
#include "base/utf_string_conversions.h" |
#include "base/value_conversions.h" |
#include "base/values.h" |
-#include "base/win/windows_version.h" |
#include "chrome/browser/download/download_extensions.h" |
#include "chrome/browser/download/download_item_model.h" |
#include "chrome/browser/profiles/profile.h" |
@@ -52,6 +50,12 @@ |
#include "ui/gfx/image/image.h" |
#include "ui/gfx/rect.h" |
+#if defined(OS_WIN) |
+#include <shobjidl.h> |
+ |
+#include "base/win/windows_version.h" |
+#endif |
+ |
#if defined(TOOLKIT_VIEWS) |
#include "ui/base/dragdrop/drag_utils.h" |
#include "ui/base/dragdrop/os_exchange_data.h" |
@@ -73,12 +77,6 @@ |
#include "ui/base/dragdrop/os_exchange_data_provider_win.h" |
#endif |
-// TODO(phajdan.jr): Find some standard location for this, maintaining |
-// the same value on all platforms. |
-static const double PI = 3.141592653589793; |
- |
-using content::DownloadItem; |
- |
namespace { |
// Returns a string constant to be used as the |danger_type| value in |
@@ -103,13 +101,24 @@ |
} |
} |
+// Get the opacity based on |animation_progress|, with values in [0.0, 1.0]. |
+// Range of return value is [0, 255]. |
+int GetOpacity(double animation_progress) { |
+ DCHECK(animation_progress >= 0 && animation <= 1); |
asanka
2012/04/27 19:06:00
* animation_progress <= 1
Lei Zhang
2012/04/27 19:50:15
Autocomplete has failed me.
|
+ |
+ // How many times to cycle the complete animation. This should be an odd |
+ // number so that the animation ends faded out. |
+ static const int kCompleteAnimationCycles = 5; |
+ double temp = animation_progress * kCompleteAnimationCycles * M_PI + M_PI_2; |
+ temp = sin(temp) / 2 + 0.5; |
+ return static_cast<int>(255.0 * temp); |
+} |
+ |
} // namespace |
namespace download_util { |
-// How many times to cycle the complete animation. This should be an odd number |
-// so that the animation ends faded out. |
-static const int kCompleteAnimationCycles = 5; |
+using content::DownloadItem; |
// Download temporary file creation -------------------------------------------- |
@@ -122,6 +131,8 @@ |
NOTREACHED(); |
} |
if (DownloadPathIsDangerous(path_)) { |
+ // This is only useful on platforms that support |
+ // DIR_DEFAULT_DOWNLOADS_SAFE. |
if (!PathService::Get(chrome::DIR_DEFAULT_DOWNLOADS_SAFE, &path_)) { |
NOTREACHED(); |
} |
@@ -138,7 +149,16 @@ |
return g_default_download_directory.Get().path(); |
} |
+// Consider downloads 'dangerous' if they go to the home directory on Linux and |
+// to the desktop on any platform. |
bool DownloadPathIsDangerous(const FilePath& download_path) { |
+#if defined(OS_LINUX) |
+ FilePath home_dir = file_util::GetHomeDir(); |
+ if (download_path == home_dir) { |
+ return true; |
+ } |
+#endif |
+ |
FilePath desktop_dir; |
if (!PathService::Get(chrome::DIR_USER_DESKTOP, &desktop_dir)) { |
NOTREACHED(); |
@@ -295,10 +315,7 @@ |
// Start at full opacity, then loop back and forth five times before ending |
// at zero opacity. |
- double opacity = sin(animation_progress * PI * kCompleteAnimationCycles + |
- PI/2) / 2 + 0.5; |
- |
- canvas->SaveLayerAlpha(static_cast<int>(255.0 * opacity), complete_bounds); |
+ canvas->SaveLayerAlpha(GetOpacity(animation_progress), complete_bounds); |
canvas->sk_canvas()->drawARGB(0, 255, 255, 255, SkXfermode::kClear_Mode); |
canvas->DrawBitmapInt(*complete, complete_bounds.x(), complete_bounds.y()); |
canvas->Restore(); |
@@ -330,11 +347,7 @@ |
// 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->SaveLayerAlpha(GetOpacity(1.0 - animation_progress), complete_bounds); |
canvas->sk_canvas()->drawARGB(0, 255, 255, 255, SkXfermode::kClear_Mode); |
canvas->DrawBitmapInt(*complete, complete_bounds.x(), complete_bounds.y()); |
canvas->Restore(); |
@@ -397,7 +410,7 @@ |
// we pass NULL to RunShellDrag for the source view. |
widget->RunShellDrag(NULL, data, location, |
ui::DragDropTypes::DRAG_COPY | ui::DragDropTypes::DRAG_LINK); |
-#else // We are on WIN without AURA |
+#else // We are on WIN without AURA |
// We cannot use Widget::RunShellDrag on WIN since the |view| is backed by a |
// TabContentsViewWin, not a NativeWidgetWin. |
scoped_refptr<ui::DragSource> drag_source(new ui::DragSource); |