OLD | NEW |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 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/browser/zoom_bubble_controller.h" | 5 #include "chrome/browser/ui/cocoa/browser/zoom_bubble_controller.h" |
6 | 6 |
7 #include "base/mac/foundation_util.h" | 7 #include "base/mac/foundation_util.h" |
8 #include "base/strings/string_number_conversions.h" | 8 #include "base/strings/string_number_conversions.h" |
9 #import "chrome/browser/ui/cocoa/info_bubble_view.h" | 9 #import "chrome/browser/ui/cocoa/info_bubble_view.h" |
10 #import "chrome/browser/ui/cocoa/info_bubble_window.h" | 10 #import "chrome/browser/ui/cocoa/info_bubble_window.h" |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
68 namespace chrome { | 68 namespace chrome { |
69 | 69 |
70 void SetZoomBubbleAutoCloseDelayForTesting(NSTimeInterval time_interval) { | 70 void SetZoomBubbleAutoCloseDelayForTesting(NSTimeInterval time_interval) { |
71 gAutoCloseDelay = time_interval; | 71 gAutoCloseDelay = time_interval; |
72 } | 72 } |
73 | 73 |
74 } // namespace chrome | 74 } // namespace chrome |
75 | 75 |
76 @implementation ZoomBubbleController | 76 @implementation ZoomBubbleController |
77 | 77 |
| 78 @synthesize delegate = delegate_; |
| 79 |
78 - (id)initWithParentWindow:(NSWindow*)parentWindow | 80 - (id)initWithParentWindow:(NSWindow*)parentWindow |
79 delegate:(ZoomBubbleControllerDelegate*)delegate { | 81 delegate:(ZoomBubbleControllerDelegate*)delegate { |
80 base::scoped_nsobject<InfoBubbleWindow> window( | 82 base::scoped_nsobject<InfoBubbleWindow> window( |
81 [[InfoBubbleWindow alloc] initWithContentRect:NSMakeRect(0, 0, 200, 100) | 83 [[InfoBubbleWindow alloc] initWithContentRect:NSMakeRect(0, 0, 200, 100) |
82 styleMask:NSBorderlessWindowMask | 84 styleMask:NSBorderlessWindowMask |
83 backing:NSBackingStoreBuffered | 85 backing:NSBackingStoreBuffered |
84 defer:NO]); | 86 defer:NO]); |
85 if ((self = [super initWithWindow:window | 87 if ((self = [super initWithWindow:window |
86 parentWindow:parentWindow | 88 parentWindow:parentWindow |
87 anchoredAt:NSZeroPoint])) { | 89 anchoredAt:NSZeroPoint])) { |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
119 : info_bubble::kAnimateNone]; | 121 : info_bubble::kAnimateNone]; |
120 | 122 |
121 self.anchorPoint = anchorPoint; | 123 self.anchorPoint = anchorPoint; |
122 [self showWindow:nil]; | 124 [self showWindow:nil]; |
123 | 125 |
124 autoClose_ = autoClose; | 126 autoClose_ = autoClose; |
125 [self updateAutoCloseTimer]; | 127 [self updateAutoCloseTimer]; |
126 } | 128 } |
127 | 129 |
128 - (void)onZoomChanged { | 130 - (void)onZoomChanged { |
| 131 // |delegate_| may be set null by this object's owner. |
| 132 if (!delegate_) |
| 133 return; |
| 134 |
129 // TODO(shess): It may be appropriate to close the window if | 135 // TODO(shess): It may be appropriate to close the window if |
130 // |contents| or |zoomController| are NULL. But they can be NULL in | 136 // |contents| or |zoomController| are NULL. But they can be NULL in |
131 // tests. | 137 // tests. |
132 | 138 |
133 content::WebContents* contents = delegate_->GetWebContents(); | 139 content::WebContents* contents = delegate_->GetWebContents(); |
134 if (!contents) | 140 if (!contents) |
135 return; | 141 return; |
136 | 142 |
137 ui_zoom::ZoomController* zoomController = | 143 ui_zoom::ZoomController* zoomController = |
138 ui_zoom::ZoomController::FromWebContents(contents); | 144 ui_zoom::ZoomController::FromWebContents(contents); |
(...skipping 23 matching lines...) Expand all Loading... |
162 } | 168 } |
163 | 169 |
164 - (void)closeWithoutAnimation { | 170 - (void)closeWithoutAnimation { |
165 InfoBubbleWindow* window = | 171 InfoBubbleWindow* window = |
166 base::mac::ObjCCastStrict<InfoBubbleWindow>([self window]); | 172 base::mac::ObjCCastStrict<InfoBubbleWindow>([self window]); |
167 [window setAllowedAnimations:info_bubble::kAnimateNone]; | 173 [window setAllowedAnimations:info_bubble::kAnimateNone]; |
168 [self close]; | 174 [self close]; |
169 } | 175 } |
170 | 176 |
171 - (void)windowWillClose:(NSNotification*)notification { | 177 - (void)windowWillClose:(NSNotification*)notification { |
172 delegate_->OnClose(); | 178 // |delegate_| may be set null by this object's owner. |
173 delegate_ = NULL; | 179 if (delegate_) { |
| 180 delegate_->OnClose(); |
| 181 delegate_ = NULL; |
| 182 } |
174 [NSObject cancelPreviousPerformRequestsWithTarget:self | 183 [NSObject cancelPreviousPerformRequestsWithTarget:self |
175 selector:@selector(autoCloseBubble) | 184 selector:@selector(autoCloseBubble) |
176 object:nil]; | 185 object:nil]; |
177 [super windowWillClose:notification]; | 186 [super windowWillClose:notification]; |
178 } | 187 } |
179 | 188 |
180 - (void)mouseEntered:(NSEvent*)theEvent { | 189 - (void)mouseEntered:(NSEvent*)theEvent { |
181 isMouseInside_ = YES; | 190 isMouseInside_ = YES; |
182 [self updateAutoCloseTimer]; | 191 [self updateAutoCloseTimer]; |
183 } | 192 } |
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
341 range:NSMakeRange(0, [title length])]; | 350 range:NSMakeRange(0, [title length])]; |
342 title = selectedTitle.autorelease(); | 351 title = selectedTitle.autorelease(); |
343 } | 352 } |
344 | 353 |
345 [[self cell] drawTitle:title | 354 [[self cell] drawTitle:title |
346 withFrame:bounds | 355 withFrame:bounds |
347 inView:self]; | 356 inView:self]; |
348 } | 357 } |
349 | 358 |
350 @end | 359 @end |
OLD | NEW |