diff options
author | paul@chromium.org <paul@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-07-16 22:04:43 +0000 |
---|---|---|
committer | paul@chromium.org <paul@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-07-16 22:04:43 +0000 |
commit | 44b4b0ccfdfc1ca2a8a56094d86a554b79f43ce7 (patch) | |
tree | 80eed9ac234d0025b259bd8fda1c2aca8327caf1 /chrome/browser/cocoa | |
parent | 0443eaf9d4e7784521ce23f9c05e62ea2018ebe6 (diff) | |
download | chromium_src-44b4b0ccfdfc1ca2a8a56094d86a554b79f43ce7.zip chromium_src-44b4b0ccfdfc1ca2a8a56094d86a554b79f43ce7.tar.gz chromium_src-44b4b0ccfdfc1ca2a8a56094d86a554b79f43ce7.tar.bz2 |
Fix for the Mac download shelf crash when clearing all downloads.
We also now automatically hide the shelf when the downloads are
cleared.
BUG=15855,15893
TEST=Download a few things, clear all downloads and the shelf will
empty and hide.
Review URL: http://codereview.chromium.org/149732
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@20907 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/cocoa')
-rw-r--r-- | chrome/browser/cocoa/browser_window_controller.mm | 2 | ||||
-rw-r--r-- | chrome/browser/cocoa/download_item_controller.h | 10 | ||||
-rw-r--r-- | chrome/browser/cocoa/download_item_controller.mm | 10 | ||||
-rw-r--r-- | chrome/browser/cocoa/download_item_mac.mm | 13 | ||||
-rw-r--r-- | chrome/browser/cocoa/download_shelf_controller.h | 6 | ||||
-rw-r--r-- | chrome/browser/cocoa/download_shelf_controller.mm | 23 |
6 files changed, 60 insertions, 4 deletions
diff --git a/chrome/browser/cocoa/browser_window_controller.mm b/chrome/browser/cocoa/browser_window_controller.mm index 860429b..7115e1f 100644 --- a/chrome/browser/cocoa/browser_window_controller.mm +++ b/chrome/browser/cocoa/browser_window_controller.mm @@ -203,6 +203,8 @@ willPositionSheet:(NSWindow*)sheet - (void)dealloc { browser_->CloseAllTabs(); + [downloadShelfController_ exiting]; + // Under certain testing configurations we may not actually own the browser. if (ownsBrowser_ == NO) browser_.release(); diff --git a/chrome/browser/cocoa/download_item_controller.h b/chrome/browser/cocoa/download_item_controller.h index d55231d..dec9f7c 100644 --- a/chrome/browser/cocoa/download_item_controller.h +++ b/chrome/browser/cocoa/download_item_controller.h @@ -9,6 +9,7 @@ class BaseDownloadItemModel; class DownloadItemMac; class DownloadShelfContextMenuMac; +@class DownloadShelfController; // A controller class that manages one download item. @@ -21,15 +22,22 @@ class DownloadShelfContextMenuMac; scoped_ptr<DownloadItemMac> bridge_; scoped_ptr<DownloadShelfContextMenuMac> menuBridge_; + + // Weak pointer to the shelf that owns us. + DownloadShelfController* shelf_; }; // Takes ownership of |downloadModel|. - (id)initWithFrame:(NSRect)frameRect - model:(BaseDownloadItemModel*)downloadModel; + model:(BaseDownloadItemModel*)downloadModel + shelf:(DownloadShelfController*)shelf; // Updates the UI and menu state from |downloadModel|. - (void)setStateFromDownload:(BaseDownloadItemModel*)downloadModel; +// Remove ourself from the download UI. +- (void)remove; + // Context menu handlers. - (IBAction)handleOpen:(id)sender; - (IBAction)handleAlwaysOpen:(id)sender; diff --git a/chrome/browser/cocoa/download_item_controller.mm b/chrome/browser/cocoa/download_item_controller.mm index c189c66..aa0d8a5 100644 --- a/chrome/browser/cocoa/download_item_controller.mm +++ b/chrome/browser/cocoa/download_item_controller.mm @@ -33,13 +33,16 @@ class DownloadShelfContextMenuMac : public DownloadShelfContextMenu { @implementation DownloadItemController - (id)initWithFrame:(NSRect)frameRect - model:(BaseDownloadItemModel*)downloadModel { + model:(BaseDownloadItemModel*)downloadModel + shelf:(DownloadShelfController*)shelf { if ((self = [super initWithNibName:@"DownloadItem" bundle:mac_util::MainAppBundle()])) { // Must be called before [self view], so that bridge_ is set in awakeFromNib bridge_.reset(new DownloadItemMac(downloadModel, self)); menuBridge_.reset(new DownloadShelfContextMenuMac(downloadModel)); + shelf_ = shelf; + [[self view] setFrame:frameRect]; } return self; @@ -84,6 +87,11 @@ class DownloadShelfContextMenuMac : public DownloadShelfContextMenu { // TODO(thakis): Set status_text as status label. } +- (void)remove { + // We are deleted after this! + [shelf_ remove:self]; +} + // Sets the enabled and checked state of a particular menu item for this // download. We translate the NSMenuItem selection to menu selections understood // by the non platform specific download context menu. diff --git a/chrome/browser/cocoa/download_item_mac.mm b/chrome/browser/cocoa/download_item_mac.mm index 05d4717..d3e12a9 100644 --- a/chrome/browser/cocoa/download_item_mac.mm +++ b/chrome/browser/cocoa/download_item_mac.mm @@ -22,5 +22,16 @@ DownloadItemMac::~DownloadItemMac() { void DownloadItemMac::OnDownloadUpdated(DownloadItem* download) { DCHECK_EQ(download, download_model_->download()); - [item_controller_ setStateFromDownload:download_model_.get()]; + switch (download_model_->download()->state()) { + case DownloadItem::REMOVING: + [item_controller_ remove]; // We're deleted now! + break; + case DownloadItem::IN_PROGRESS: + case DownloadItem::CANCELLED: + case DownloadItem::COMPLETE: + [item_controller_ setStateFromDownload:download_model_.get()]; + break; + default: + NOTREACHED(); + } } diff --git a/chrome/browser/cocoa/download_shelf_controller.h b/chrome/browser/cocoa/download_shelf_controller.h index c1beb69..ff4cedc 100644 --- a/chrome/browser/cocoa/download_shelf_controller.h +++ b/chrome/browser/cocoa/download_shelf_controller.h @@ -47,4 +47,10 @@ class DownloadShelf; // Resizes the download shelf based on the state of the content area. - (void)resizeDownloadShelf; +// Remove a download, possibly via clearing browser data. +- (void)remove:(DownloadItemController*)download; + +// Notification that we are closing and should release our downloads. +- (void)exiting; + @end diff --git a/chrome/browser/cocoa/download_shelf_controller.mm b/chrome/browser/cocoa/download_shelf_controller.mm index d6bbf83..0256ccd 100644 --- a/chrome/browser/cocoa/download_shelf_controller.mm +++ b/chrome/browser/cocoa/download_shelf_controller.mm @@ -109,6 +109,25 @@ const int kDownloadItemPadding = 10; [[self view] setFrame:barFrame]; } +- (void)remove:(DownloadItemController*)download { + // Look for the download in our controller array and remove it. This will + // explicity release it so that it removes itself as an Observer of the + // DownloadItem. We don't want to wait for autorelease since the DownloadItem + // we are observing will likely be gone by then. + [[download view] removeFromSuperview]; + [downloadItemControllers_ removeObject:download]; + + // Check to see if we have any downloads remaining and if not, hide the shelf. + if (![downloadItemControllers_ count]) + [self showDownloadShelf:NO]; +} + +// We need to explicitly release our download controllers here since they need +// to remove themselves as observers before the remaining shutdown happens. +- (void)exiting { + downloadItemControllers_.reset(); +} + // Show or hide the bar based on the value of |enable|. Handles animating the // resize of the content view. - (void)showDownloadShelf:(BOOL)enable { @@ -174,7 +193,9 @@ const int kDownloadItemPadding = 10; NSRect position = NSMakeRect(startX, kDownloadItemBorderPadding, kDownloadItemWidth, kDownloadItemHeight); scoped_nsobject<DownloadItemController> controller( - [[DownloadItemController alloc] initWithFrame:position model:model]); + [[DownloadItemController alloc] initWithFrame:position + model:model + shelf:self]); [downloadItemControllers_ addObject:controller.get()]; [[self view] addSubview:[controller.get() view]]; |