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

Side by Side Diff: chrome/browser/ui/cocoa/download/download_item_controller.mm

Issue 40733005: [Mac] Update the warnings UI for malicious downloads. (Closed) Base URL: ssh://asankaworkstation.cam.corp.google.com/home/asanka/l/git/src.git@master
Patch Set: Rebase Created 7 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 unified diff | Download patch
« no previous file with comments | « chrome/browser/ui/cocoa/download/download_item_controller.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 #import "chrome/browser/ui/cocoa/download/download_item_controller.h" 5 #import "chrome/browser/ui/cocoa/download/download_item_controller.h"
6 6
7 #include "base/mac/bundle_locations.h" 7 #include "base/mac/bundle_locations.h"
8 #include "base/mac/mac_util.h" 8 #include "base/mac/mac_util.h"
9 #include "base/metrics/histogram.h" 9 #include "base/metrics/histogram.h"
10 #include "base/strings/string16.h" 10 #include "base/strings/string16.h"
11 #include "base/strings/string_util.h" 11 #include "base/strings/string_util.h"
12 #include "base/strings/sys_string_conversions.h" 12 #include "base/strings/sys_string_conversions.h"
13 #include "base/strings/utf_string_conversions.h" 13 #include "base/strings/utf_string_conversions.h"
14 #include "chrome/browser/download/chrome_download_manager_delegate.h" 14 #include "chrome/browser/download/chrome_download_manager_delegate.h"
15 #include "chrome/browser/download/download_item_model.h" 15 #include "chrome/browser/download/download_item_model.h"
16 #include "chrome/browser/download/download_shelf_context_menu.h" 16 #include "chrome/browser/download/download_shelf_context_menu.h"
17 #import "chrome/browser/themes/theme_properties.h" 17 #import "chrome/browser/themes/theme_properties.h"
18 #import "chrome/browser/themes/theme_service.h" 18 #import "chrome/browser/themes/theme_service.h"
19 #import "chrome/browser/ui/cocoa/download/download_item_button.h" 19 #import "chrome/browser/ui/cocoa/download/download_item_button.h"
20 #import "chrome/browser/ui/cocoa/download/download_item_cell.h" 20 #import "chrome/browser/ui/cocoa/download/download_item_cell.h"
21 #include "chrome/browser/ui/cocoa/download/download_item_mac.h" 21 #include "chrome/browser/ui/cocoa/download/download_item_mac.h"
22 #import "chrome/browser/ui/cocoa/download/download_shelf_context_menu_controller .h"
22 #import "chrome/browser/ui/cocoa/download/download_shelf_controller.h" 23 #import "chrome/browser/ui/cocoa/download/download_shelf_controller.h"
23 #import "chrome/browser/ui/cocoa/themed_window.h" 24 #import "chrome/browser/ui/cocoa/themed_window.h"
24 #import "chrome/browser/ui/cocoa/ui_localizer.h" 25 #import "chrome/browser/ui/cocoa/ui_localizer.h"
25 #include "content/public/browser/download_item.h" 26 #include "content/public/browser/download_item.h"
26 #include "content/public/browser/page_navigator.h" 27 #include "content/public/browser/page_navigator.h"
27 #include "grit/generated_resources.h" 28 #include "grit/generated_resources.h"
28 #include "grit/theme_resources.h" 29 #include "grit/theme_resources.h"
29 #include "third_party/GTM/AppKit/GTMUILocalizerAndLayoutTweaker.h" 30 #include "third_party/GTM/AppKit/GTMUILocalizerAndLayoutTweaker.h"
30 #include "ui/base/l10n/l10n_util_mac.h" 31 #include "ui/base/l10n/l10n_util_mac.h"
31 #include "ui/base/resource/resource_bundle.h" 32 #include "ui/base/resource/resource_bundle.h"
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
118 - (void)dealloc { 119 - (void)dealloc {
119 [[NSNotificationCenter defaultCenter] removeObserver:self]; 120 [[NSNotificationCenter defaultCenter] removeObserver:self];
120 [progressView_ setController:nil]; 121 [progressView_ setController:nil];
121 [[self view] removeFromSuperview]; 122 [[self view] removeFromSuperview];
122 [super dealloc]; 123 [super dealloc];
123 } 124 }
124 125
125 - (void)awakeFromNib { 126 - (void)awakeFromNib {
126 [progressView_ setController:self]; 127 [progressView_ setController:self];
127 128
128 [self setStateFromDownload:bridge_->download_model()];
129
130 GTMUILocalizerAndLayoutTweaker* localizerAndLayoutTweaker = 129 GTMUILocalizerAndLayoutTweaker* localizerAndLayoutTweaker =
131 [[[GTMUILocalizerAndLayoutTweaker alloc] init] autorelease]; 130 [[[GTMUILocalizerAndLayoutTweaker alloc] init] autorelease];
132 [localizerAndLayoutTweaker applyLocalizer:localizer_ tweakingUI:[self view]]; 131 [localizerAndLayoutTweaker applyLocalizer:localizer_ tweakingUI:[self view]];
133 132
134 // The strings are based on the download item's name, sizing tweaks have to be 133 [self setStateFromDownload:bridge_->download_model()];
135 // manually done.
136 DCHECK(buttonTweaker_ != nil);
137 CGFloat widthChange = [buttonTweaker_ changedWidth];
138 // If it's a dangerous download, size the two lines so the text/filename
139 // is always visible.
140 if ([self isDangerousMode]) {
141 widthChange +=
142 [GTMUILocalizerAndLayoutTweaker
143 sizeToFitFixedHeightTextField:dangerousDownloadLabel_
144 minWidth:kTextWidth];
145 }
146 // Grow the parent views
147 WidenView([self view], widthChange);
148 WidenView(dangerousDownloadView_, widthChange);
149 // Slide the two buttons over.
150 NSPoint frameOrigin = [buttonTweaker_ frame].origin;
151 frameOrigin.x += widthChange;
152 [buttonTweaker_ setFrameOrigin:frameOrigin];
153 134
154 bridge_->LoadIcon(); 135 bridge_->LoadIcon();
155 [self updateToolTip]; 136 [self updateToolTip];
156 } 137 }
157 138
139 - (void)showDangerousWarning:(DownloadItemModel*)downloadModel {
140 // The transition from safe -> dangerous should only happen once. The code
141 // assumes that the danger type of the download doesn't change once it's set.
142 if ([self isDangerousMode])
143 return;
144
145 [self setState:kDangerous];
146
147 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
148 NSImage* alertIcon;
149
150 NSString* dangerousWarning = base::SysUTF16ToNSString(
151 downloadModel->GetWarningText(*font_list_, kTextWidth));
152 DCHECK(dangerousWarning);
153 [dangerousDownloadLabel_ setStringValue:dangerousWarning];
154 CGFloat labelWidthChange =
155 [GTMUILocalizerAndLayoutTweaker
156 sizeToFitFixedHeightTextField:dangerousDownloadLabel_
157 minWidth:kTextWidth];
158 CGFloat buttonWidthChange = 0.0;
159
160 if (downloadModel->MightBeMalicious()) {
161 alertIcon = rb.GetNativeImageNamed(IDR_SAFEBROWSING_WARNING).ToNSImage();
162 buttonWidthChange = [maliciousButtonTweaker_ changedWidth];
163
164 // Move the buttons to account for the change in label size.
165 NSPoint frameOrigin = [maliciousButtonTweaker_ frame].origin;
166 frameOrigin.x += labelWidthChange;
167 [maliciousButtonTweaker_ setFrameOrigin:frameOrigin];
168
169 [dangerousButtonTweaker_ setHidden:YES];
170 [maliciousButtonTweaker_ setHidden:NO];
171 } else {
172 alertIcon = rb.GetNativeImageNamed(IDR_WARNING).ToNSImage();
173 buttonWidthChange = [dangerousButtonTweaker_ changedWidth];
174
175 // The text on the confirm button can change depending on the type of the
176 // download.
177 NSString* confirmButtonTitle =
178 base::SysUTF16ToNSString(downloadModel->GetWarningConfirmButtonText());
179 DCHECK(confirmButtonTitle);
180 [dangerousDownloadConfirmButton_ setTitle:confirmButtonTitle];
181
182 // Move the button to account for the change in label size.
183 NSPoint frameOrigin = [dangerousButtonTweaker_ frame].origin;
184 frameOrigin.x += labelWidthChange;
185 [dangerousButtonTweaker_ setFrameOrigin:frameOrigin];
186
187 [dangerousButtonTweaker_ setHidden:NO];
188 [maliciousButtonTweaker_ setHidden:YES];
189 }
190 DCHECK(alertIcon);
191 [image_ setImage:alertIcon];
192
193 // Grow the parent views
194 WidenView([self view], labelWidthChange + buttonWidthChange);
195 WidenView(dangerousDownloadView_, labelWidthChange + buttonWidthChange);
196 }
197
158 - (void)setStateFromDownload:(DownloadItemModel*)downloadModel { 198 - (void)setStateFromDownload:(DownloadItemModel*)downloadModel {
159 DCHECK_EQ([self download], downloadModel->download()); 199 DCHECK_EQ([self download], downloadModel->download());
160 200
161 // Handle dangerous downloads. 201 // Handle dangerous downloads.
162 if (downloadModel->IsDangerous()) { 202 if (downloadModel->IsDangerous()) {
163 [self setState:kDangerous]; 203 [self showDangerousWarning:downloadModel];
164
165 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
166 NSString* dangerousWarning;
167 NSString* confirmButtonTitle;
168 NSImage* alertIcon;
169
170 dangerousWarning =
171 base::SysUTF16ToNSString(downloadModel->GetWarningText(
172 *font_list_, kTextWidth));
173 confirmButtonTitle =
174 base::SysUTF16ToNSString(downloadModel->GetWarningConfirmButtonText());
175 if (downloadModel->MightBeMalicious())
176 alertIcon = rb.GetNativeImageNamed(IDR_SAFEBROWSING_WARNING).ToNSImage();
177 else
178 alertIcon = rb.GetNativeImageNamed(IDR_WARNING).ToNSImage();
179 DCHECK(alertIcon);
180 [image_ setImage:alertIcon];
181 DCHECK(dangerousWarning);
182 [dangerousDownloadLabel_ setStringValue:dangerousWarning];
183 DCHECK(confirmButtonTitle);
184 [dangerousDownloadConfirmButton_ setTitle:confirmButtonTitle];
185 return; 204 return;
186 } 205 }
187 206
188 // Set path to draggable download on completion. 207 // Set path to draggable download on completion.
189 if (downloadModel->download()->GetState() == DownloadItem::COMPLETE) 208 if (downloadModel->download()->GetState() == DownloadItem::COMPLETE)
190 [progressView_ setDownload:downloadModel->download()->GetTargetFilePath()]; 209 [progressView_ setDownload:downloadModel->download()->GetTargetFilePath()];
191 210
192 [cell_ setStateFromDownload:downloadModel]; 211 [cell_ setStateFromDownload:downloadModel];
193 } 212 }
194 213
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
300 } 319 }
301 320
302 - (IBAction)discardDownload:(id)sender { 321 - (IBAction)discardDownload:(id)sender {
303 UMA_HISTOGRAM_LONG_TIMES("clickjacking.discard_download", 322 UMA_HISTOGRAM_LONG_TIMES("clickjacking.discard_download",
304 base::Time::Now() - creationTime_); 323 base::Time::Now() - creationTime_);
305 DownloadItem* download = bridge_->download_model()->download(); 324 DownloadItem* download = bridge_->download_model()->download();
306 download->Remove(); 325 download->Remove();
307 // WARNING: we are deleted at this point. Don't access 'this'. 326 // WARNING: we are deleted at this point. Don't access 'this'.
308 } 327 }
309 328
329 - (IBAction)dismissMaliciousDownload:(id)sender {
330 [self remove];
331 // WARNING: we are deleted at this point.
332 }
333
334 - (IBAction)showContextMenu:(id)sender {
335 base::scoped_nsobject<DownloadShelfContextMenuController> menuController(
336 [[DownloadShelfContextMenuController alloc]
337 initWithItemController:self
338 withDelegate:nil]);
339 [NSMenu popUpContextMenu:[menuController menu]
340 withEvent:[NSApp currentEvent]
341 forView:[self view]];
342 }
343
310 @end 344 @end
OLDNEW
« no previous file with comments | « chrome/browser/ui/cocoa/download/download_item_controller.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698