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