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

Unified Diff: chrome/browser/ui/gtk/download/download_item_gtk.cc

Issue 8588037: Updates to DownloadItemGtk for supporting download items marked as DANGEROUS_CONTENT. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: " Created 9 years, 1 month 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/ui/gtk/download/download_item_gtk.cc
diff --git a/chrome/browser/ui/gtk/download/download_item_gtk.cc b/chrome/browser/ui/gtk/download/download_item_gtk.cc
index 7bef1e8206c971878af87f1bec8dbf2a96c8b4cf..ff07fa8a10677754e3b77c5ccc96c739ed7bb0b7 100644
--- a/chrome/browser/ui/gtk/download/download_item_gtk.cc
+++ b/chrome/browser/ui/gtk/download/download_item_gtk.cc
@@ -62,6 +62,9 @@ const int kMinDownloadItemWidth = download_util::kSmallProgressIconSize;
// New download item animation speed in milliseconds.
const int kNewItemAnimationDurationMs = 800;
+// Dangerous download prompt transition animation speed in milliseconds.
+const int kDangerPromptAnimationDurationMs = 800;
+
// How long the 'download complete/interrupted' animation should last for.
const int kCompleteAnimationDurationMs = 2500;
@@ -184,76 +187,13 @@ DownloadItemGtk::DownloadItemGtk(DownloadShelfGtk* parent_shelf,
new_item_animation_->SetSlideDuration(kNewItemAnimationDurationMs);
gtk_widget_show_all(hbox_.get());
- if (IsDangerous()) {
- // Hide the download item components for now.
- gtk_widget_set_no_show_all(body_.get(), TRUE);
- gtk_widget_set_no_show_all(menu_button_, TRUE);
- gtk_widget_hide(body_.get());
- gtk_widget_hide(menu_button_);
-
- // Create an hbox to hold it all.
- dangerous_hbox_.Own(gtk_hbox_new(FALSE, kDangerousElementPadding));
-
- // Add padding at the beginning and end. The hbox will add padding between
- // the empty labels and the other elements.
- GtkWidget* empty_label_a = gtk_label_new(NULL);
- GtkWidget* empty_label_b = gtk_label_new(NULL);
- gtk_box_pack_start(GTK_BOX(dangerous_hbox_.get()), empty_label_a,
- FALSE, FALSE, 0);
- gtk_box_pack_end(GTK_BOX(dangerous_hbox_.get()), empty_label_b,
- FALSE, FALSE, 0);
-
- // Create the warning icon.
- dangerous_image_ = gtk_image_new();
- gtk_box_pack_start(GTK_BOX(dangerous_hbox_.get()), dangerous_image_,
- FALSE, FALSE, 0);
-
- dangerous_label_ = gtk_label_new(NULL);
- // We pass TRUE, TRUE so that the label will condense to less than its
- // request when the animation is going on.
- gtk_box_pack_start(GTK_BOX(dangerous_hbox_.get()), dangerous_label_,
- TRUE, TRUE, 0);
-
- // Create the nevermind button.
- GtkWidget* dangerous_decline = gtk_button_new_with_label(
- l10n_util::GetStringUTF8(IDS_DISCARD_DOWNLOAD).c_str());
- g_signal_connect(dangerous_decline, "clicked",
- G_CALLBACK(OnDangerousDeclineThunk), this);
- gtk_util::CenterWidgetInHBox(dangerous_hbox_.get(), dangerous_decline,
- false, 0);
-
- // Create the ok button.
- GtkWidget* dangerous_accept = gtk_button_new_with_label(
- l10n_util::GetStringUTF8(
- ChromeDownloadManagerDelegate::IsExtensionDownload(
- download_model->download()) ?
- IDS_CONTINUE_EXTENSION_DOWNLOAD :
- IDS_CONFIRM_DOWNLOAD).c_str());
- g_signal_connect(dangerous_accept, "clicked",
- G_CALLBACK(OnDangerousAcceptThunk), this);
- gtk_util::CenterWidgetInHBox(dangerous_hbox_.get(), dangerous_accept, false,
- 0);
-
- // Put it in an alignment so that padding will be added on the left and
- // right.
- dangerous_prompt_ = gtk_alignment_new(0.0, 0.0, 1.0, 1.0);
- gtk_alignment_set_padding(GTK_ALIGNMENT(dangerous_prompt_),
- 0, 0, kDangerousElementPadding, kDangerousElementPadding);
- gtk_container_add(GTK_CONTAINER(dangerous_prompt_), dangerous_hbox_.get());
- gtk_box_pack_start(GTK_BOX(hbox_.get()), dangerous_prompt_, FALSE, FALSE,
- 0);
- gtk_widget_set_app_paintable(dangerous_prompt_, TRUE);
- gtk_widget_set_redraw_on_allocate(dangerous_prompt_, TRUE);
- g_signal_connect(dangerous_prompt_, "expose-event",
- G_CALLBACK(OnDangerousPromptExposeThunk), this);
- gtk_widget_show_all(dangerous_prompt_);
- }
+ if (IsDangerous())
+ ShowDangerPrompt();
registrar_.Add(this, chrome::NOTIFICATION_BROWSER_THEME_CHANGED,
content::Source<ThemeService>(theme_service_));
theme_service_->InitThemesFor(this);
- // Set the initial width of the widget to be animated.
if (IsDangerous()) {
gtk_widget_set_size_request(dangerous_hbox_.get(),
dangerous_hbox_start_width_, -1);
@@ -304,6 +244,15 @@ void DownloadItemGtk::OnDownloadUpdated(DownloadItem* download) {
// We may free some shelf space for showing more download items.
parent_shelf_->MaybeShowMoreDownloadItems();
+ } else if (dangerous_prompt_ == NULL && IsDangerous()) {
+ ShowDangerPrompt();
+ gtk_widget_set_size_request(dangerous_hbox_.get(), kBodyWidth, -1);
+ // Complete the new_item_animation_, so we don't race each other.
+ new_item_animation_->Reset(1);
+ danger_prompt_animation_.reset(new ui::SlideAnimation(this));
+ danger_prompt_animation_->SetSlideDuration(
+ kDangerPromptAnimationDurationMs);
+ danger_prompt_animation_->Show();
}
if (download->GetUserVerifiedFilePath() != icon_filepath_) {
@@ -364,6 +313,13 @@ void DownloadItemGtk::OnDownloadUpdated(DownloadItem* download) {
void DownloadItemGtk::AnimationProgressed(const ui::Animation* animation) {
if (animation == &complete_animation_) {
gtk_widget_queue_draw(progress_area_.get());
+ } else if (danger_prompt_animation_.get() &&
+ animation == danger_prompt_animation_.get()) {
+ int progress = static_cast<int>((dangerous_hbox_full_width_ -
+ kBodyWidth) *
+ animation->GetCurrentValue());
+ int showing_width = kBodyWidth + progress;
+ gtk_widget_set_size_request(dangerous_hbox_.get(), showing_width, -1);
} else {
DCHECK(animation == new_item_animation_.get());
if (IsDangerous()) {
@@ -558,16 +514,17 @@ void DownloadItemGtk::UpdateDangerWarning() {
// We create |dangerous_warning| as a wide string so we can more easily
// calculate its length in characters.
string16 dangerous_warning;
+ DownloadStateInfo::DangerType danger_type = get_download()->GetDangerType();
// The dangerous download label text is different for different cases.
- if (get_download()->GetDangerType() == DownloadStateInfo::DANGEROUS_URL) {
+ if (danger_type == DownloadStateInfo::DANGEROUS_URL ||
+ danger_type == DownloadStateInfo::DANGEROUS_CONTENT) {
// Safebrowsing shows the download URL leads to malicious file.
dangerous_warning =
l10n_util::GetStringUTF16(IDS_PROMPT_UNSAFE_DOWNLOAD_URL);
Randy Smith (Not in Mondays) 2011/11/21 01:38:13 Noe': Do we want the prompts to be the same for co
} else {
// It's a dangerous file type (e.g.: an executable).
- DCHECK(get_download()->GetDangerType() ==
- DownloadStateInfo::DANGEROUS_FILE);
+ DCHECK(danger_type == DownloadStateInfo::DANGEROUS_FILE);
if (ChromeDownloadManagerDelegate::IsExtensionDownload(get_download())) {
dangerous_warning =
l10n_util::GetStringUTF16(IDS_PROMPT_DANGEROUS_DOWNLOAD_EXTENSION);
@@ -615,9 +572,11 @@ void DownloadItemGtk::UpdateDangerWarning() {
}
void DownloadItemGtk::UpdateDangerIcon() {
+ DownloadStateInfo::DangerType danger_type = get_download()->GetDangerType();
if (theme_service_->UsingNativeTheme()) {
const char* stock =
- get_download()->GetDangerType() == DownloadStateInfo::DANGEROUS_URL ?
+ (danger_type == DownloadStateInfo::DANGEROUS_URL ||
+ danger_type == DownloadStateInfo::DANGEROUS_CONTENT) ?
GTK_STOCK_DIALOG_ERROR : GTK_STOCK_DIALOG_WARNING;
gtk_image_set_from_stock(
GTK_IMAGE(dangerous_image_), stock, GTK_ICON_SIZE_SMALL_TOOLBAR);
@@ -625,13 +584,82 @@ void DownloadItemGtk::UpdateDangerIcon() {
// Set the warning icon.
ResourceBundle& rb = ResourceBundle::GetSharedInstance();
int pixbuf_id =
- get_download()->GetDangerType() == DownloadStateInfo::DANGEROUS_URL ?
+ (danger_type == DownloadStateInfo::DANGEROUS_URL ||
+ danger_type == DownloadStateInfo::DANGEROUS_CONTENT) ?
IDR_SAFEBROWSING_WARNING : IDR_WARNING;
GdkPixbuf* download_pixbuf = rb.GetNativeImageNamed(pixbuf_id);
gtk_image_set_from_pixbuf(GTK_IMAGE(dangerous_image_), download_pixbuf);
}
}
+void DownloadItemGtk::ShowDangerPrompt() {
+ if (dangerous_prompt_)
+ return;
+
+ // Hide the download item components for now.
+ gtk_widget_set_no_show_all(body_.get(), TRUE);
+ gtk_widget_set_no_show_all(menu_button_, TRUE);
+ gtk_widget_hide(body_.get());
+ gtk_widget_hide(menu_button_);
+
+ // Create an hbox to hold it all.
+ dangerous_hbox_.Own(gtk_hbox_new(FALSE, kDangerousElementPadding));
+
+ // Add padding at the beginning and end. The hbox will add padding between
+ // the empty labels and the other elements.
+ GtkWidget* empty_label_a = gtk_label_new(NULL);
+ GtkWidget* empty_label_b = gtk_label_new(NULL);
+ gtk_box_pack_start(GTK_BOX(dangerous_hbox_.get()), empty_label_a,
+ FALSE, FALSE, 0);
+ gtk_box_pack_end(GTK_BOX(dangerous_hbox_.get()), empty_label_b,
+ FALSE, FALSE, 0);
+
+ // Create the warning icon.
+ dangerous_image_ = gtk_image_new();
+ gtk_box_pack_start(GTK_BOX(dangerous_hbox_.get()), dangerous_image_,
+ FALSE, FALSE, 0);
+
+ dangerous_label_ = gtk_label_new(NULL);
+ // We pass TRUE, TRUE so that the label will condense to less than its
+ // request when the animation is going on.
+ gtk_box_pack_start(GTK_BOX(dangerous_hbox_.get()), dangerous_label_,
+ TRUE, TRUE, 0);
+
+ // Create the nevermind button.
+ GtkWidget* dangerous_decline = gtk_button_new_with_label(
+ l10n_util::GetStringUTF8(IDS_DISCARD_DOWNLOAD).c_str());
+ g_signal_connect(dangerous_decline, "clicked",
+ G_CALLBACK(OnDangerousDeclineThunk), this);
+ gtk_util::CenterWidgetInHBox(dangerous_hbox_.get(), dangerous_decline,
+ false, 0);
+
+ // Create the ok button.
+ GtkWidget* dangerous_accept = gtk_button_new_with_label(
+ l10n_util::GetStringUTF8(
+ ChromeDownloadManagerDelegate::IsExtensionDownload(
+ download_model_->download()) ?
+ IDS_CONTINUE_EXTENSION_DOWNLOAD :
+ IDS_CONFIRM_DOWNLOAD).c_str());
+ g_signal_connect(dangerous_accept, "clicked",
+ G_CALLBACK(OnDangerousAcceptThunk), this);
+ gtk_util::CenterWidgetInHBox(dangerous_hbox_.get(), dangerous_accept, false,
+ 0);
+
+ // Put it in an alignment so that padding will be added on the left and right.
+ dangerous_prompt_ = gtk_alignment_new(0.0, 0.0, 1.0, 1.0);
+ gtk_alignment_set_padding(
+ GTK_ALIGNMENT(dangerous_prompt_),
+ 0, 0, kDangerousElementPadding, kDangerousElementPadding);
+ gtk_container_add(GTK_CONTAINER(dangerous_prompt_), dangerous_hbox_.get());
+ gtk_box_pack_start(GTK_BOX(hbox_.get()), dangerous_prompt_, FALSE, FALSE, 0);
+ gtk_widget_set_app_paintable(dangerous_prompt_, TRUE);
+ gtk_widget_set_redraw_on_allocate(dangerous_prompt_, TRUE);
+ g_signal_connect(dangerous_prompt_, "expose-event",
+ G_CALLBACK(OnDangerousPromptExposeThunk), this);
+ gtk_widget_show_all(dangerous_prompt_);
+ UpdateDangerWarning();
+}
+
// static
void DownloadItemGtk::InitNineBoxes() {
if (body_nine_box_normal_)

Powered by Google App Engine
This is Rietveld 408576698