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

Side by Side Diff: chrome/browser/ui/cocoa/notifications/balloon_controller.mm

Issue 6327017: Fix crash when notification disappears under popup menu. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 9 years, 11 months 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 | Annotate | Revision Log
« no previous file with comments | « chrome/browser/ui/cocoa/notifications/balloon_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) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 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 #include "chrome/browser/ui/cocoa/notifications/balloon_controller.h" 5 #include "chrome/browser/ui/cocoa/notifications/balloon_controller.h"
6 6
7 #include "app/l10n_util.h" 7 #include "app/l10n_util.h"
8 #include "app/mac/nsimage_cache.h" 8 #include "app/mac/nsimage_cache.h"
9 #import "base/mac/cocoa_protocols.h" 9 #import "base/mac/cocoa_protocols.h"
10 #include "base/mac/mac_util.h" 10 #include "base/mac/mac_util.h"
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
114 } 114 }
115 115
116 - (void) mouseEntered:(NSEvent*)event { 116 - (void) mouseEntered:(NSEvent*)event {
117 [[closeButton_ cell] setHighlighted:YES]; 117 [[closeButton_ cell] setHighlighted:YES];
118 } 118 }
119 119
120 - (void) mouseExited:(NSEvent*)event { 120 - (void) mouseExited:(NSEvent*)event {
121 [[closeButton_ cell] setHighlighted:NO]; 121 [[closeButton_ cell] setHighlighted:NO];
122 } 122 }
123 123
124 - (void)closeBalloonNow:(bool)byUser {
125 if (!balloon_)
126 return;
127 [self close];
128 if (htmlContents_.get())
129 htmlContents_->Shutdown();
130 if (balloon_)
131 balloon_->OnClose(byUser);
132 balloon_ = NULL;
133 }
134
124 - (IBAction)optionsButtonPressed:(id)sender { 135 - (IBAction)optionsButtonPressed:(id)sender {
136 optionMenuIsActive_ = YES;
125 [NSMenu popUpContextMenu:[menuController_ menu] 137 [NSMenu popUpContextMenu:[menuController_ menu]
126 withEvent:[NSApp currentEvent] 138 withEvent:[NSApp currentEvent]
127 forView:optionsButton_]; 139 forView:optionsButton_];
140 optionMenuIsActive_ = NO;
141 if (delayedClose_) {
John Gregg 2011/01/25 02:12:42 no { } necessary, more consistent with file
142 [self closeBalloonNow: false]; // always by script.
143 }
128 } 144 }
129 145
130 - (IBAction)permissionRevoked:(id)sender { 146 - (IBAction)permissionRevoked:(id)sender {
131 DesktopNotificationService* service = 147 DesktopNotificationService* service =
132 balloon_->profile()->GetDesktopNotificationService(); 148 balloon_->profile()->GetDesktopNotificationService();
133 service->DenyPermission(balloon_->notification().origin_url()); 149 service->DenyPermission(balloon_->notification().origin_url());
134 } 150 }
135 151
136 - (IBAction)closeButtonPressed:(id)sender { 152 - (IBAction)closeButtonPressed:(id)sender {
137 [self closeBalloon:YES]; 153 [self closeBalloon:YES];
138 [self close]; 154 [self close];
139 } 155 }
140 156
141 - (void)close { 157 - (void)close {
142 if (closeButtonTrackingTag_) 158 if (closeButtonTrackingTag_)
143 [shelf_ removeTrackingRect:closeButtonTrackingTag_]; 159 [shelf_ removeTrackingRect:closeButtonTrackingTag_];
144 160
145 [super close]; 161 [super close];
146 } 162 }
147 163
148 - (void)closeBalloon:(bool)byUser { 164 - (void)closeBalloon:(bool)byUser {
149 if (!balloon_) 165 // Keep alive while user is interacting with popup menu.
166 // Otherwise the script can close the notification and underlying balloon
167 // will be destroyed while user select a menu command.
168 if (!byUser && optionMenuIsActive_) {
169 delayedClose_ = YES;
150 return; 170 return;
151 [self close]; 171 }
152 if (htmlContents_.get()) 172 [self closeBalloonNow: byUser];
153 htmlContents_->Shutdown();
154 if (balloon_)
155 balloon_->OnClose(byUser);
156 balloon_ = NULL;
157 } 173 }
158 174
159 - (void)updateContents { 175 - (void)updateContents {
160 DCHECK(htmlContents_.get()) << "BalloonView::Update called before Show"; 176 DCHECK(htmlContents_.get()) << "BalloonView::Update called before Show";
161 if (htmlContents_->render_view_host()) 177 if (htmlContents_->render_view_host())
162 htmlContents_->render_view_host()->NavigateToURL( 178 htmlContents_->render_view_host()->NavigateToURL(
163 balloon_->notification().content_url()); 179 balloon_->notification().content_url());
164 } 180 }
165 181
166 - (void)repositionToBalloon { 182 - (void)repositionToBalloon {
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
199 htmlContents_.reset(new BalloonViewHost(balloon_)); 215 htmlContents_.reset(new BalloonViewHost(balloon_));
200 htmlContents_->Init(); 216 htmlContents_->Init();
201 } 217 }
202 218
203 // NSWindowDelegate notification. 219 // NSWindowDelegate notification.
204 - (void)windowWillClose:(NSNotification*)notif { 220 - (void)windowWillClose:(NSNotification*)notif {
205 [self autorelease]; 221 [self autorelease];
206 } 222 }
207 223
208 @end 224 @end
OLDNEW
« no previous file with comments | « chrome/browser/ui/cocoa/notifications/balloon_controller.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698