15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#import <Cocoa/Cocoa.h> 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@class ChromeUILocalizer; 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@class DownloadItemCell; 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@class DownloadItemButton; 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DownloadItemMac; 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class DownloadItemModel; 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DownloadShelfContextMenuMac; 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@class DownloadShelfController; 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@class GTMWidthBasedTweaker; 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DownloadItem; 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PageNavigator; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)namespace extensions { 2503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)class ExperienceSamplingEvent; 2603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 2703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gfx { 2958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class FontList; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochnamespace ui { 33558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochclass MenuModel; 34558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 35558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A controller class that manages one download item. 371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// 381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// The view hierarchy is as follows: 391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// 401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// DownloadItemController 411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// | 421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// | A container that is showing one of its child views (progressView_ or 431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// | dangerousDownloadView_) depending on whether the download is safe or not. 441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// | 451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// +-- progressView_ (instance of DownloadItemButton) 461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// | | 471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// | +-- cell_ (instance of DownloadItemCell) 481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// | 491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// +-- dangerousDownloadView_ 501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// | 511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// | Contains the dangerous download warning. Dependong on whether the 521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// | download is dangerous (e.g. dangerous due to type of file), or 531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// | malicious (e.g. downloaded from a known malware site) only one of 541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// | dangerousButtonTweaker_ or maliciousButtonTweaker_ will be visible at 551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// | one time. 561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// | 571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// +-- dangerousDownloadLabel_ 581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// | 591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// +-- image_ 601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// | 611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// +-- dangerousButtonTweaker_ 621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// | 631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// | Contains the 'Discard'/'Save' buttons for a dangerous download. This 641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// | is a GTMWidthBasedTweaker that adjusts the width based on the text of 651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// | buttons. 661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// | 671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// +-- maliciousButtonTweaker_ 681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// 691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Contains the 'Discard' button and the drop down context menu button. 701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// This is a GTMWidthBasedTweaker that adjusts the width based on the 711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// text of the 'Discard' button. 721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@interface DownloadItemController : NSViewController { 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @private 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IBOutlet DownloadItemButton* progressView_; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IBOutlet DownloadItemCell* cell_; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This is shown instead of progressView_ for dangerous downloads. 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IBOutlet NSView* dangerousDownloadView_; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IBOutlet NSTextField* dangerousDownloadLabel_; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IBOutlet NSButton* dangerousDownloadConfirmButton_; 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 83f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Needed to find out how much the tweakers changed sizes to update the other 84f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // views. 85f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) IBOutlet GTMWidthBasedTweaker* dangerousButtonTweaker_; 86f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) IBOutlet GTMWidthBasedTweaker* maliciousButtonTweaker_; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Because the confirm text and button for dangerous downloads are determined 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // at runtime, an outlet to the localizer is needed to construct the layout 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // tweaker in awakeFromNib in order to adjust the UI after all strings are 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // determined. 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IBOutlet ChromeUILocalizer* localizer_; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IBOutlet NSImageView* image_; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<DownloadItemMac> bridge_; 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<DownloadShelfContextMenuMac> menuBridge_; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Weak pointer to the shelf that owns us. 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadShelfController* shelf_; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The time at which this view was created. 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time creationTime_; 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Default font list to use for text metrics. 10658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scoped_ptr<gfx::FontList> font_list_; 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The state of this item. 1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci enum DownloadItemState { 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kNormal, 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kDangerous 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } state_; 11303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 11403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // ExperienceSampling: This tracks dangerous/malicious downloads warning UI 11503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // and the user's decisions about it. 11603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) scoped_ptr<extensions::ExperienceSamplingEvent> sampling_event_; 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Initialize controller for |downloadItem|. 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)- (id)initWithDownload:(content::DownloadItem*)downloadItem 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) shelf:(DownloadShelfController*)shelf 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) navigator:(content::PageNavigator*)navigator; 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Updates the UI and menu state from |downloadModel|. 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)- (void)setStateFromDownload:(DownloadItemModel*)downloadModel; 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Remove ourself from the download UI. 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (void)remove; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Update item's visibility depending on if the item is still completely 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// contained in its parent. 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (void)updateVisibility:(id)sender; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Called after a download is opened. 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (void)downloadWasOpened; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Asynchronous icon loading callback. 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (void)setIcon:(NSImage*)icon; 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Download item button clicked 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (IBAction)handleButtonClick:(id)sender; 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns the size this item wants to have. 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (NSSize)preferredSize; 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns the DownloadItem model object belonging to this item. 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (content::DownloadItem*)download; 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 149558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// Returns the MenuModel for the download item context menu. The returned 150558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// MenuModel is owned by the DownloadItemController and will be valid until the 151558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// DownloadItemController is destroyed. 152558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch- (ui::MenuModel*)contextMenuModel; 153558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Updates the tooltip with the download's path. 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (void)updateToolTip; 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Handling of dangerous downloads 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (void)clearDangerousMode; 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (BOOL)isDangerousMode; 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (IBAction)saveDownload:(id)sender; 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (IBAction)discardDownload:(id)sender; 162f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)- (IBAction)dismissMaliciousDownload:(id)sender; 163f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)- (IBAction)showContextMenu:(id)sender; 1641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@end 166