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

Side by Side Diff: chrome/browser/ui/cocoa/website_settings/chooser_bubble_ui_cocoa.mm

Issue 2086663003: Change ChooserController ownership model (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: changed some Cocoa function names to start with lowercase letter Created 4 years, 6 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
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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 #import "chrome/browser/ui/cocoa/website_settings/chooser_bubble_ui_cocoa.h" 5 #import "chrome/browser/ui/cocoa/website_settings/chooser_bubble_ui_cocoa.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <algorithm> 9 #include <algorithm>
10 #include <cmath> 10 #include <cmath>
11 11
12 #include "base/mac/scoped_nsobject.h" 12 #include "base/mac/scoped_nsobject.h"
13 #include "base/memory/ptr_util.h" 13 #include "base/memory/ptr_util.h"
14 #include "base/strings/sys_string_conversions.h"
15 #include "base/strings/utf_string_conversions.h" 14 #include "base/strings/utf_string_conversions.h"
16 #include "chrome/browser/ui/browser.h" 15 #include "chrome/browser/ui/browser.h"
17 #include "chrome/browser/ui/browser_window.h" 16 #include "chrome/browser/ui/browser_window.h"
18 #import "chrome/browser/ui/cocoa/base_bubble_controller.h" 17 #import "chrome/browser/ui/cocoa/base_bubble_controller.h"
19 #import "chrome/browser/ui/cocoa/browser_window_controller.h" 18 #import "chrome/browser/ui/cocoa/browser_window_controller.h"
20 #import "chrome/browser/ui/cocoa/browser_window_utils.h" 19 #import "chrome/browser/ui/cocoa/browser_window_utils.h"
21 #import "chrome/browser/ui/cocoa/chooser_content_view_cocoa.h" 20 #import "chrome/browser/ui/cocoa/chooser_content_view_cocoa.h"
22 #import "chrome/browser/ui/cocoa/info_bubble_view.h" 21 #import "chrome/browser/ui/cocoa/info_bubble_view.h"
23 #import "chrome/browser/ui/cocoa/info_bubble_window.h" 22 #import "chrome/browser/ui/cocoa/info_bubble_window.h"
24 #import "chrome/browser/ui/cocoa/location_bar/location_bar_view_mac.h" 23 #import "chrome/browser/ui/cocoa/location_bar/location_bar_view_mac.h"
25 #include "chrome/browser/ui/website_settings/chooser_bubble_delegate.h" 24 #include "chrome/browser/ui/website_settings/chooser_bubble_delegate.h"
26 #include "chrome/grit/generated_resources.h" 25 #include "chrome/grit/generated_resources.h"
27 #include "components/bubble/bubble_controller.h" 26 #include "components/bubble/bubble_controller.h"
27 #include "components/chooser_controller/chooser_controller.h"
28 #include "components/url_formatter/elide_url.h" 28 #include "components/url_formatter/elide_url.h"
29 #include "content/public/browser/native_web_keyboard_event.h" 29 #include "content/public/browser/native_web_keyboard_event.h"
30 #include "ui/base/cocoa/cocoa_base_utils.h" 30 #include "ui/base/cocoa/cocoa_base_utils.h"
31 #include "ui/base/cocoa/window_size_constants.h" 31 #include "ui/base/cocoa/window_size_constants.h"
32 #include "ui/base/l10n/l10n_util.h"
33 #include "ui/base/l10n/l10n_util_mac.h" 32 #include "ui/base/l10n/l10n_util_mac.h"
34 #include "url/gurl.h" 33 #include "url/gurl.h"
35 #include "url/origin.h" 34 #include "url/origin.h"
36 35
37 std::unique_ptr<BubbleUi> ChooserBubbleDelegate::BuildBubbleUi() { 36 std::unique_ptr<BubbleUi> ChooserBubbleDelegate::BuildBubbleUi() {
38 return base::WrapUnique( 37 return base::WrapUnique(
39 new ChooserBubbleUiCocoa(browser_, chooser_controller())); 38 new ChooserBubbleUiCocoa(browser_, std::move(chooser_controller_)));
40 } 39 }
41 40
42 @interface ChooserBubbleUiController 41 @interface ChooserBubbleUiController
43 : BaseBubbleController<NSTableViewDataSource, NSTableViewDelegate> { 42 : BaseBubbleController<NSTableViewDataSource, NSTableViewDelegate> {
44 @private 43 @private
45 // Bridge to the C++ class that created this object. 44 // Bridge to the C++ class that created this object.
46 ChooserBubbleUiCocoa* bridge_; // Weak. 45 ChooserBubbleUiCocoa* bridge_; // Weak.
47 bool buttonPressed_; 46 bool buttonPressed_;
48 47
49 base::scoped_nsobject<ChooserContentViewCocoa> chooserContentView_; 48 base::scoped_nsobject<ChooserContentViewCocoa> chooserContentView_;
50 NSTableView* tableView_; // Weak. 49 NSTableView* tableView_; // Weak.
51 NSButton* connectButton_; // Weak. 50 NSButton* connectButton_; // Weak.
52 NSButton* cancelButton_; // Weak. 51 NSButton* cancelButton_; // Weak.
53 NSButton* helpButton_; // Weak.
54 52
55 Browser* browser_; // Weak. 53 Browser* browser_; // Weak.
56 ChooserController* chooserController_; // Weak. 54 // |chooserController_| is not owned by this class, it is owned by
55 // ChooserContentViewCocoa.
56 // This field only temporarily owns the ChooserController. It is moved
57 // into the ChooserContentViewCocoa when BuildBubbleUi() is called and
58 // the bubble is shown.
59 std::unique_ptr<ChooserController> chooserController_;
57 } 60 }
58 61
59 // Designated initializer. |browser| and |bridge| must both be non-nil. 62 // Designated initializer. |browser| and |bridge| must both be non-nil.
60 - (id)initWithBrowser:(Browser*)browser 63 - (id)initWithBrowser:(Browser*)browser
61 chooserController:(ChooserController*)chooserController 64 chooserController:(std::unique_ptr<ChooserController>)chooserController
62 bubbleReference:(BubbleReference)bubbleReference 65 bubbleReference:(BubbleReference)bubbleReference
63 bridge:(ChooserBubbleUiCocoa*)bridge; 66 bridge:(ChooserBubbleUiCocoa*)bridge;
64 67
65 // Makes the bubble visible. 68 // Makes the bubble visible.
66 - (void)show; 69 - (void)show;
67 70
68 // Will reposition the bubble based in case the anchor or parent should change. 71 // Will reposition the bubble based in case the anchor or parent should change.
69 - (void)updateAnchorPosition; 72 - (void)updateAnchorPosition;
70 73
71 // Will calculate the expected anchor point for this bubble. 74 // Will calculate the expected anchor point for this bubble.
72 // Should only be used outside this class for tests. 75 // Should only be used outside this class for tests.
73 - (NSPoint)getExpectedAnchorPoint; 76 - (NSPoint)getExpectedAnchorPoint;
74 77
75 // Returns true if the browser has support for the location bar. 78 // Returns true if the browser has support for the location bar.
76 // Should only be used outside this class for tests. 79 // Should only be used outside this class for tests.
77 - (bool)hasLocationBar; 80 - (bool)hasLocationBar;
78 81
79 // Update |tableView_| when chooser options were initialized.
80 - (void)onOptionsInitialized;
81
82 // Update |tableView_| when chooser option was added.
83 - (void)onOptionAdded:(NSInteger)index;
84
85 // Update |tableView_| when chooser option was removed.
86 - (void)onOptionRemoved:(NSInteger)index;
87
88 // Update |tableView_| when chooser options changed. 82 // Update |tableView_| when chooser options changed.
89 - (void)updateTableView; 83 - (void)updateTableView;
90 84
91 // Determines if the bubble has an anchor in a corner or no anchor at all. 85 // Determines if the bubble has an anchor in a corner or no anchor at all.
92 - (info_bubble::BubbleArrowLocation)getExpectedArrowLocation; 86 - (info_bubble::BubbleArrowLocation)getExpectedArrowLocation;
93 87
94 // Returns the expected parent for this bubble. 88 // Returns the expected parent for this bubble.
95 - (NSWindow*)getExpectedParentWindow; 89 - (NSWindow*)getExpectedParentWindow;
96 90
97 // Called when the "Connect" button is pressed. 91 // Called when the "Connect" button is pressed.
98 - (void)onConnect:(id)sender; 92 - (void)onConnect:(id)sender;
99 93
100 // Called when the "Cancel" button is pressed. 94 // Called when the "Cancel" button is pressed.
101 - (void)onCancel:(id)sender; 95 - (void)onCancel:(id)sender;
102 96
103 // Called when the "Get help" button is pressed.
104 - (void)onHelpPressed:(id)sender;
105
106 @end 97 @end
107 98
108 @implementation ChooserBubbleUiController 99 @implementation ChooserBubbleUiController
109 100
110 - (id)initWithBrowser:(Browser*)browser 101 - (id)initWithBrowser:(Browser*)browser
111 chooserController:(ChooserController*)chooserController 102 chooserController:(std::unique_ptr<ChooserController>)chooserController
112 bubbleReference:(BubbleReference)bubbleReference 103 bubbleReference:(BubbleReference)bubbleReference
113 bridge:(ChooserBubbleUiCocoa*)bridge { 104 bridge:(ChooserBubbleUiCocoa*)bridge {
114 DCHECK(browser); 105 DCHECK(browser);
115 DCHECK(chooserController); 106 DCHECK(chooserController);
116 DCHECK(bubbleReference); 107 DCHECK(bubbleReference);
117 DCHECK(bridge); 108 DCHECK(bridge);
118 109
119 browser_ = browser; 110 browser_ = browser;
120 chooserController_ = chooserController; 111 chooserController_ = std::move(chooserController);
121 112
122 base::scoped_nsobject<InfoBubbleWindow> window([[InfoBubbleWindow alloc] 113 base::scoped_nsobject<InfoBubbleWindow> window([[InfoBubbleWindow alloc]
123 initWithContentRect:ui::kWindowSizeDeterminedLater 114 initWithContentRect:ui::kWindowSizeDeterminedLater
124 styleMask:NSBorderlessWindowMask 115 styleMask:NSBorderlessWindowMask
125 backing:NSBackingStoreBuffered 116 backing:NSBackingStoreBuffered
126 defer:NO]); 117 defer:NO]);
127 [window setAllowedAnimations:info_bubble::kAnimateNone]; 118 [window setAllowedAnimations:info_bubble::kAnimateNone];
128 [window setReleasedWhenClosed:NO]; 119 [window setReleasedWhenClosed:NO];
129 if ((self = [super initWithWindow:window 120 if ((self = [super initWithWindow:window
130 parentWindow:[self getExpectedParentWindow] 121 parentWindow:[self getExpectedParentWindow]
131 anchoredAt:NSZeroPoint])) { 122 anchoredAt:NSZeroPoint])) {
132 self.bubbleReference = bubbleReference; 123 self.bubbleReference = bubbleReference;
133 [self setShouldCloseOnResignKey:NO]; 124 [self setShouldCloseOnResignKey:NO];
134 [self setShouldOpenAsKeyWindow:YES]; 125 [self setShouldOpenAsKeyWindow:YES];
135 [[self bubble] setArrowLocation:[self getExpectedArrowLocation]]; 126 [[self bubble] setArrowLocation:[self getExpectedArrowLocation]];
136 bridge_ = bridge; 127 bridge_ = bridge;
137 NSNotificationCenter* center = [NSNotificationCenter defaultCenter]; 128 NSNotificationCenter* center = [NSNotificationCenter defaultCenter];
138 [center addObserver:self 129 [center addObserver:self
139 selector:@selector(parentWindowDidMove:) 130 selector:@selector(parentWindowDidMove:)
140 name:NSWindowDidMoveNotification 131 name:NSWindowDidMoveNotification
141 object:[self getExpectedParentWindow]]; 132 object:[self getExpectedParentWindow]];
142 } 133 }
134
143 return self; 135 return self;
144 } 136 }
145 137
146 - (void)windowWillClose:(NSNotification*)notification { 138 - (void)windowWillClose:(NSNotification*)notification {
147 [[NSNotificationCenter defaultCenter] 139 [[NSNotificationCenter defaultCenter]
148 removeObserver:self 140 removeObserver:self
149 name:NSWindowDidMoveNotification 141 name:NSWindowDidMoveNotification
150 object:nil]; 142 object:nil];
151 if (!buttonPressed_) 143 if (!buttonPressed_)
152 chooserController_->Close(); 144 [chooserContentView_ close];
153 bridge_->OnBubbleClosing(); 145 bridge_->OnBubbleClosing();
154 [super windowWillClose:notification]; 146 [super windowWillClose:notification];
155 } 147 }
156 148
157 - (void)parentWindowWillToggleFullScreen:(NSNotification*)notification { 149 - (void)parentWindowWillToggleFullScreen:(NSNotification*)notification {
158 // Override the base class implementation, which would have closed the bubble. 150 // Override the base class implementation, which would have closed the bubble.
159 } 151 }
160 152
161 - (void)parentWindowDidResize:(NSNotification*)notification { 153 - (void)parentWindowDidResize:(NSNotification*)notification {
162 [self setAnchorPoint:[self getExpectedAnchorPoint]]; 154 [self setAnchorPoint:[self getExpectedAnchorPoint]];
163 } 155 }
164 156
165 - (void)parentWindowDidMove:(NSNotification*)notification { 157 - (void)parentWindowDidMove:(NSNotification*)notification {
166 DCHECK(bridge_); 158 DCHECK(bridge_);
167 [self setAnchorPoint:[self getExpectedAnchorPoint]]; 159 [self setAnchorPoint:[self getExpectedAnchorPoint]];
168 } 160 }
169 161
170 - (void)show { 162 - (void)show {
163 url::Origin origin = chooserController_->GetOrigin();
171 chooserContentView_.reset([[ChooserContentViewCocoa alloc] 164 chooserContentView_.reset([[ChooserContentViewCocoa alloc]
172 initWithChooserTitle: 165 initWithChooserTitle:
173 l10n_util::GetNSStringF( 166 l10n_util::GetNSStringF(
174 IDS_DEVICE_CHOOSER_PROMPT, 167 IDS_DEVICE_CHOOSER_PROMPT,
175 url_formatter::FormatOriginForSecurityDisplay( 168 url_formatter::FormatOriginForSecurityDisplay(
176 chooserController_->GetOrigin(), 169 origin, url_formatter::SchemeDisplay::OMIT_CRYPTOGRAPHIC))
177 url_formatter::SchemeDisplay::OMIT_CRYPTOGRAPHIC))]); 170 ChooserController:std::move(chooserController_)]);
178 171
179 tableView_ = [chooserContentView_ tableView]; 172 tableView_ = [chooserContentView_ tableView];
180 connectButton_ = [chooserContentView_ connectButton]; 173 connectButton_ = [chooserContentView_ connectButton];
181 cancelButton_ = [chooserContentView_ cancelButton]; 174 cancelButton_ = [chooserContentView_ cancelButton];
182 helpButton_ = [chooserContentView_ helpButton];
183 175
184 [connectButton_ setTarget:self]; 176 [connectButton_ setTarget:self];
185 [connectButton_ setAction:@selector(onConnect:)]; 177 [connectButton_ setAction:@selector(onConnect:)];
186 [cancelButton_ setTarget:self]; 178 [cancelButton_ setTarget:self];
187 [cancelButton_ setAction:@selector(onCancel:)]; 179 [cancelButton_ setAction:@selector(onCancel:)];
188 [tableView_ setDelegate:self]; 180 [tableView_ setDelegate:self];
189 [tableView_ setDataSource:self]; 181 [tableView_ setDataSource:self];
190 [helpButton_ setTarget:self];
191 [helpButton_ setAction:@selector(onHelpPressed:)];
192 182
193 [[[self window] contentView] addSubview:chooserContentView_.get()]; 183 [[[self window] contentView] addSubview:chooserContentView_.get()];
194 184
195 NSRect bubbleFrame = 185 NSRect bubbleFrame =
196 [[self window] frameRectForContentRect:[chooserContentView_ frame]]; 186 [[self window] frameRectForContentRect:[chooserContentView_ frame]];
197 if ([[self window] isVisible]) { 187 if ([[self window] isVisible]) {
198 // Unfortunately, calling -setFrame followed by -setFrameOrigin (called 188 // Unfortunately, calling -setFrame followed by -setFrameOrigin (called
199 // within -setAnchorPoint) causes flickering. Avoid the flickering by 189 // within -setAnchorPoint) causes flickering. Avoid the flickering by
200 // manually adjusting the new frame's origin so that the top left stays the 190 // manually adjusting the new frame's origin so that the top left stays the
201 // same, and only calling -setFrame. 191 // same, and only calling -setFrame.
202 NSRect currentWindowFrame = [[self window] frame]; 192 NSRect currentWindowFrame = [[self window] frame];
203 bubbleFrame.origin = currentWindowFrame.origin; 193 bubbleFrame.origin = currentWindowFrame.origin;
204 bubbleFrame.origin.y = bubbleFrame.origin.y + 194 bubbleFrame.origin.y = bubbleFrame.origin.y +
205 currentWindowFrame.size.height - 195 currentWindowFrame.size.height -
206 bubbleFrame.size.height; 196 bubbleFrame.size.height;
207 [[self window] setFrame:bubbleFrame display:YES]; 197 [[self window] setFrame:bubbleFrame display:YES];
208 } else { 198 } else {
209 [[self window] setFrame:bubbleFrame display:NO]; 199 [[self window] setFrame:bubbleFrame display:NO];
210 [self setAnchorPoint:[self getExpectedAnchorPoint]]; 200 [self setAnchorPoint:[self getExpectedAnchorPoint]];
211 [self showWindow:nil]; 201 [self showWindow:nil];
212 [[self window] makeFirstResponder:nil]; 202 [[self window] makeFirstResponder:nil];
213 [[self window] setInitialFirstResponder:tableView_]; 203 [[self window] setInitialFirstResponder:tableView_];
214 } 204 }
215 } 205 }
216 206
217 - (NSInteger)numberOfRowsInTableView:(NSTableView*)tableView { 207 - (NSInteger)numberOfRowsInTableView:(NSTableView*)tableView {
218 // When there are no devices, the table contains a message saying there are 208 return [chooserContentView_ numOptions];
219 // no devices, so the number of rows is always at least 1.
220 return std::max(static_cast<NSInteger>(chooserController_->NumOptions()),
221 static_cast<NSInteger>(1));
222 } 209 }
223 210
224 - (id)tableView:(NSTableView*)tableView 211 - (id)tableView:(NSTableView*)tableView
225 objectValueForTableColumn:(NSTableColumn*)tableColumn 212 objectValueForTableColumn:(NSTableColumn*)tableColumn
226 row:(NSInteger)rowIndex { 213 row:(NSInteger)rowIndex {
227 NSInteger num_options = 214 return [chooserContentView_ getOption:rowIndex];
228 static_cast<NSInteger>(chooserController_->NumOptions());
229 if (num_options == 0) {
230 DCHECK_EQ(0, rowIndex);
231 return l10n_util::GetNSString(IDS_DEVICE_CHOOSER_NO_DEVICES_FOUND_PROMPT);
232 }
233
234 DCHECK_GE(rowIndex, 0);
235 DCHECK_LT(rowIndex, num_options);
236 return base::SysUTF16ToNSString(
237 chooserController_->GetOption(static_cast<size_t>(rowIndex)));
238 } 215 }
239 216
240 - (BOOL)tableView:(NSTableView*)aTableView 217 - (BOOL)tableView:(NSTableView*)aTableView
241 shouldEditTableColumn:(NSTableColumn*)aTableColumn 218 shouldEditTableColumn:(NSTableColumn*)aTableColumn
242 row:(NSInteger)rowIndex { 219 row:(NSInteger)rowIndex {
243 return NO; 220 return NO;
244 } 221 }
245 222
246 - (void)onOptionsInitialized {
247 [self updateTableView];
248 }
249
250 - (void)onOptionAdded:(NSInteger)index {
251 [self updateTableView];
252 }
253
254 - (void)onOptionRemoved:(NSInteger)index {
255 // |tableView_| will automatically select the removed item's next item.
256 // So here it tracks if the removed item is the item that was currently
257 // selected, if so, deselect it. Also if the removed item is before the
258 // currently selected item, the currently selected item's index needs to
259 // be adjusted by one.
260 NSInteger selectedRow = [tableView_ selectedRow];
261 if (selectedRow == index)
262 [tableView_ deselectRow:index];
263 else if (selectedRow > index)
264 [tableView_ selectRowIndexes:[NSIndexSet indexSetWithIndex:selectedRow - 1]
265 byExtendingSelection:NO];
266
267 [self updateTableView];
268 }
269
270 - (void)updateTableView { 223 - (void)updateTableView {
271 [tableView_ setEnabled:chooserController_->NumOptions() > 0]; 224 [chooserContentView_ updateTableView];
272 [tableView_ reloadData];
273 } 225 }
274 226
275 - (void)tableViewSelectionDidChange:(NSNotification*)aNotification { 227 - (void)tableViewSelectionDidChange:(NSNotification*)aNotification {
276 [connectButton_ setEnabled:[tableView_ numberOfSelectedRows] > 0]; 228 [connectButton_ setEnabled:[tableView_ numberOfSelectedRows] > 0];
277 } 229 }
278 230
279 - (void)updateAnchorPosition { 231 - (void)updateAnchorPosition {
280 [self setParentWindow:[self getExpectedParentWindow]]; 232 [self setParentWindow:[self getExpectedParentWindow]];
281 [self setAnchorPoint:[self getExpectedAnchorPoint]]; 233 [self setAnchorPoint:[self getExpectedAnchorPoint]];
282 } 234 }
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
322 + (void)alignCenterOf:(NSView*)viewA verticallyToCenterOf:(NSView*)viewB { 274 + (void)alignCenterOf:(NSView*)viewA verticallyToCenterOf:(NSView*)viewB {
323 NSRect frameA = [viewA frame]; 275 NSRect frameA = [viewA frame];
324 NSRect frameB = [viewB frame]; 276 NSRect frameB = [viewB frame];
325 frameA.origin.y = 277 frameA.origin.y =
326 NSMinY(frameB) + std::floor((NSHeight(frameB) - NSHeight(frameA)) / 2); 278 NSMinY(frameB) + std::floor((NSHeight(frameB) - NSHeight(frameA)) / 2);
327 [viewA setFrameOrigin:frameA.origin]; 279 [viewA setFrameOrigin:frameA.origin];
328 } 280 }
329 281
330 - (void)onConnect:(id)sender { 282 - (void)onConnect:(id)sender {
331 buttonPressed_ = true; 283 buttonPressed_ = true;
332 NSInteger row = [tableView_ selectedRow]; 284 [chooserContentView_ accept];
333 chooserController_->Select(row);
334 self.bubbleReference->CloseBubble(BUBBLE_CLOSE_ACCEPTED); 285 self.bubbleReference->CloseBubble(BUBBLE_CLOSE_ACCEPTED);
335 [self close]; 286 [self close];
336 } 287 }
337 288
338 - (void)onCancel:(id)sender { 289 - (void)onCancel:(id)sender {
339 buttonPressed_ = true; 290 buttonPressed_ = true;
340 chooserController_->Cancel(); 291 [chooserContentView_ cancel];
341 self.bubbleReference->CloseBubble(BUBBLE_CLOSE_CANCELED); 292 self.bubbleReference->CloseBubble(BUBBLE_CLOSE_CANCELED);
342 [self close]; 293 [self close];
343 } 294 }
344 295
345 - (void)onHelpPressed:(id)sender {
346 chooserController_->OpenHelpCenterUrl();
347 }
348
349 @end 296 @end
350 297
351 ChooserBubbleUiCocoa::ChooserBubbleUiCocoa( 298 ChooserBubbleUiCocoa::ChooserBubbleUiCocoa(
352 Browser* browser, 299 Browser* browser,
353 ChooserController* chooser_controller) 300 std::unique_ptr<ChooserController> chooser_controller)
354 : browser_(browser), 301 : browser_(browser),
355 chooser_controller_(chooser_controller), 302 chooser_controller_(std::move(chooser_controller)),
356 chooser_bubble_ui_controller_(nil) { 303 chooser_bubble_ui_controller_(nil) {
357 DCHECK(browser); 304 DCHECK(browser_);
358 DCHECK(chooser_controller); 305 DCHECK(chooser_controller_);
359 chooser_controller_->set_observer(this);
360 } 306 }
361 307
362 ChooserBubbleUiCocoa::~ChooserBubbleUiCocoa() { 308 ChooserBubbleUiCocoa::~ChooserBubbleUiCocoa() {
363 chooser_controller_->set_observer(nullptr); 309 if (chooser_bubble_ui_controller_) {
364 [chooser_bubble_ui_controller_ close]; 310 [chooser_bubble_ui_controller_ close];
365 chooser_bubble_ui_controller_ = nil; 311 chooser_bubble_ui_controller_ = nil;
312 }
366 } 313 }
367 314
368 void ChooserBubbleUiCocoa::Show(BubbleReference bubble_reference) { 315 void ChooserBubbleUiCocoa::Show(BubbleReference bubble_reference) {
369 if (!chooser_bubble_ui_controller_) { 316 if (!chooser_bubble_ui_controller_) {
370 chooser_bubble_ui_controller_ = 317 chooser_bubble_ui_controller_ = [[ChooserBubbleUiController alloc]
371 [[ChooserBubbleUiController alloc] initWithBrowser:browser_ 318 initWithBrowser:browser_
372 chooserController:chooser_controller_ 319 chooserController:std::move(chooser_controller_)
373 bubbleReference:bubble_reference 320 bubbleReference:bubble_reference
374 bridge:this]; 321 bridge:this];
375 } 322 }
376
377 [chooser_bubble_ui_controller_ show]; 323 [chooser_bubble_ui_controller_ show];
378 [chooser_bubble_ui_controller_ updateTableView]; 324 [chooser_bubble_ui_controller_ updateTableView];
379 } 325 }
380 326
381 void ChooserBubbleUiCocoa::Close() { 327 void ChooserBubbleUiCocoa::Close() {
382 [chooser_bubble_ui_controller_ close]; 328 if (chooser_bubble_ui_controller_) {
383 chooser_bubble_ui_controller_ = nil; 329 [chooser_bubble_ui_controller_ close];
330 chooser_bubble_ui_controller_ = nil;
331 }
384 } 332 }
385 333
386 void ChooserBubbleUiCocoa::UpdateAnchorPosition() { 334 void ChooserBubbleUiCocoa::UpdateAnchorPosition() {
387 [chooser_bubble_ui_controller_ updateAnchorPosition]; 335 if (chooser_bubble_ui_controller_)
388 } 336 [chooser_bubble_ui_controller_ updateAnchorPosition];
389
390 void ChooserBubbleUiCocoa::OnOptionsInitialized() {
391 [chooser_bubble_ui_controller_ onOptionsInitialized];
392 }
393
394 void ChooserBubbleUiCocoa::OnOptionAdded(size_t index) {
395 [chooser_bubble_ui_controller_ onOptionAdded:static_cast<NSInteger>(index)];
396 }
397
398 void ChooserBubbleUiCocoa::OnOptionRemoved(size_t index) {
399 [chooser_bubble_ui_controller_ onOptionRemoved:static_cast<NSInteger>(index)];
400 } 337 }
401 338
402 void ChooserBubbleUiCocoa::OnBubbleClosing() { 339 void ChooserBubbleUiCocoa::OnBubbleClosing() {
403 chooser_bubble_ui_controller_ = nil; 340 chooser_bubble_ui_controller_ = nil;
404 } 341 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698