summaryrefslogtreecommitdiffstats
path: root/chrome/browser/cocoa
diff options
context:
space:
mode:
authorpaul@chromium.org <paul@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-07-16 22:04:43 +0000
committerpaul@chromium.org <paul@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-07-16 22:04:43 +0000
commit44b4b0ccfdfc1ca2a8a56094d86a554b79f43ce7 (patch)
tree80eed9ac234d0025b259bd8fda1c2aca8327caf1 /chrome/browser/cocoa
parent0443eaf9d4e7784521ce23f9c05e62ea2018ebe6 (diff)
downloadchromium_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.mm2
-rw-r--r--chrome/browser/cocoa/download_item_controller.h10
-rw-r--r--chrome/browser/cocoa/download_item_controller.mm10
-rw-r--r--chrome/browser/cocoa/download_item_mac.mm13
-rw-r--r--chrome/browser/cocoa/download_shelf_controller.h6
-rw-r--r--chrome/browser/cocoa/download_shelf_controller.mm23
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]];