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

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: fix build errors 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 // |chooser_controller_| is not owned by this class.
55 // It is owned by ChooserContentViewCocoa.
56 std::unique_ptr<ChooserController> chooserController_;
57 } 57 }
58 58
59 // Designated initializer. |browser| and |bridge| must both be non-nil. 59 // Designated initializer. |browser| and |bridge| must both be non-nil.
60 - (id)initWithBrowser:(Browser*)browser 60 - (id)initWithBrowser:(Browser*)browser
61 chooserController:(ChooserController*)chooserController 61 chooserController:(std::unique_ptr<ChooserController>)chooserController
62 bubbleReference:(BubbleReference)bubbleReference 62 bubbleReference:(BubbleReference)bubbleReference
63 bridge:(ChooserBubbleUiCocoa*)bridge; 63 bridge:(ChooserBubbleUiCocoa*)bridge;
64 64
65 // Makes the bubble visible. 65 // Makes the bubble visible.
66 - (void)show; 66 - (void)show;
67 67
68 // Will reposition the bubble based in case the anchor or parent should change. 68 // Will reposition the bubble based in case the anchor or parent should change.
69 - (void)updateAnchorPosition; 69 - (void)updateAnchorPosition;
70 70
71 // Will calculate the expected anchor point for this bubble. 71 // Will calculate the expected anchor point for this bubble.
72 // Should only be used outside this class for tests. 72 // Should only be used outside this class for tests.
73 - (NSPoint)getExpectedAnchorPoint; 73 - (NSPoint)getExpectedAnchorPoint;
74 74
75 // Returns true if the browser has support for the location bar. 75 // Returns true if the browser has support for the location bar.
76 // Should only be used outside this class for tests. 76 // Should only be used outside this class for tests.
77 - (bool)hasLocationBar; 77 - (bool)hasLocationBar;
78 78
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. 79 // Update |tableView_| when chooser options changed.
89 - (void)updateTableView; 80 - (void)updateTableView;
90 81
91 // Determines if the bubble has an anchor in a corner or no anchor at all. 82 // Determines if the bubble has an anchor in a corner or no anchor at all.
92 - (info_bubble::BubbleArrowLocation)getExpectedArrowLocation; 83 - (info_bubble::BubbleArrowLocation)getExpectedArrowLocation;
93 84
94 // Returns the expected parent for this bubble. 85 // Returns the expected parent for this bubble.
95 - (NSWindow*)getExpectedParentWindow; 86 - (NSWindow*)getExpectedParentWindow;
96 87
97 // Called when the "Connect" button is pressed. 88 // Called when the "Connect" button is pressed.
98 - (void)onConnect:(id)sender; 89 - (void)onConnect:(id)sender;
99 90
100 // Called when the "Cancel" button is pressed. 91 // Called when the "Cancel" button is pressed.
101 - (void)onCancel:(id)sender; 92 - (void)onCancel:(id)sender;
102 93
103 // Called when the "Get help" button is pressed.
104 - (void)onHelpPressed:(id)sender;
105
106 @end 94 @end
107 95
108 @implementation ChooserBubbleUiController 96 @implementation ChooserBubbleUiController
109 97
110 - (id)initWithBrowser:(Browser*)browser 98 - (id)initWithBrowser:(Browser*)browser
111 chooserController:(ChooserController*)chooserController 99 chooserController:(std::unique_ptr<ChooserController>)chooserController
112 bubbleReference:(BubbleReference)bubbleReference 100 bubbleReference:(BubbleReference)bubbleReference
113 bridge:(ChooserBubbleUiCocoa*)bridge { 101 bridge:(ChooserBubbleUiCocoa*)bridge {
114 DCHECK(browser); 102 DCHECK(browser);
115 DCHECK(chooserController); 103 DCHECK(chooserController);
116 DCHECK(bubbleReference); 104 DCHECK(bubbleReference);
117 DCHECK(bridge); 105 DCHECK(bridge);
118 106
119 browser_ = browser; 107 browser_ = browser;
120 chooserController_ = chooserController; 108 chooserController_ = std::move(chooserController);
121 109
122 base::scoped_nsobject<InfoBubbleWindow> window([[InfoBubbleWindow alloc] 110 base::scoped_nsobject<InfoBubbleWindow> window([[InfoBubbleWindow alloc]
123 initWithContentRect:ui::kWindowSizeDeterminedLater 111 initWithContentRect:ui::kWindowSizeDeterminedLater
124 styleMask:NSBorderlessWindowMask 112 styleMask:NSBorderlessWindowMask
125 backing:NSBackingStoreBuffered 113 backing:NSBackingStoreBuffered
126 defer:NO]); 114 defer:NO]);
127 [window setAllowedAnimations:info_bubble::kAnimateNone]; 115 [window setAllowedAnimations:info_bubble::kAnimateNone];
128 [window setReleasedWhenClosed:NO]; 116 [window setReleasedWhenClosed:NO];
129 if ((self = [super initWithWindow:window 117 if ((self = [super initWithWindow:window
130 parentWindow:[self getExpectedParentWindow] 118 parentWindow:[self getExpectedParentWindow]
131 anchoredAt:NSZeroPoint])) { 119 anchoredAt:NSZeroPoint])) {
132 self.bubbleReference = bubbleReference; 120 self.bubbleReference = bubbleReference;
133 [self setShouldCloseOnResignKey:NO]; 121 [self setShouldCloseOnResignKey:NO];
134 [self setShouldOpenAsKeyWindow:YES]; 122 [self setShouldOpenAsKeyWindow:YES];
135 [[self bubble] setArrowLocation:[self getExpectedArrowLocation]]; 123 [[self bubble] setArrowLocation:[self getExpectedArrowLocation]];
136 bridge_ = bridge; 124 bridge_ = bridge;
137 NSNotificationCenter* center = [NSNotificationCenter defaultCenter]; 125 NSNotificationCenter* center = [NSNotificationCenter defaultCenter];
138 [center addObserver:self 126 [center addObserver:self
139 selector:@selector(parentWindowDidMove:) 127 selector:@selector(parentWindowDidMove:)
140 name:NSWindowDidMoveNotification 128 name:NSWindowDidMoveNotification
141 object:[self getExpectedParentWindow]]; 129 object:[self getExpectedParentWindow]];
142 } 130 }
131
143 return self; 132 return self;
144 } 133 }
145 134
146 - (void)windowWillClose:(NSNotification*)notification { 135 - (void)windowWillClose:(NSNotification*)notification {
147 [[NSNotificationCenter defaultCenter] 136 [[NSNotificationCenter defaultCenter]
148 removeObserver:self 137 removeObserver:self
149 name:NSWindowDidMoveNotification 138 name:NSWindowDidMoveNotification
150 object:nil]; 139 object:nil];
151 if (!buttonPressed_) 140 if (!buttonPressed_)
152 chooserController_->Close(); 141 [chooserContentView_ Close];
153 bridge_->OnBubbleClosing(); 142 bridge_->OnBubbleClosing();
154 [super windowWillClose:notification]; 143 [super windowWillClose:notification];
155 } 144 }
156 145
157 - (void)parentWindowWillToggleFullScreen:(NSNotification*)notification { 146 - (void)parentWindowWillToggleFullScreen:(NSNotification*)notification {
158 // Override the base class implementation, which would have closed the bubble. 147 // Override the base class implementation, which would have closed the bubble.
159 } 148 }
160 149
161 - (void)parentWindowDidResize:(NSNotification*)notification { 150 - (void)parentWindowDidResize:(NSNotification*)notification {
162 [self setAnchorPoint:[self getExpectedAnchorPoint]]; 151 [self setAnchorPoint:[self getExpectedAnchorPoint]];
163 } 152 }
164 153
165 - (void)parentWindowDidMove:(NSNotification*)notification { 154 - (void)parentWindowDidMove:(NSNotification*)notification {
166 DCHECK(bridge_); 155 DCHECK(bridge_);
167 [self setAnchorPoint:[self getExpectedAnchorPoint]]; 156 [self setAnchorPoint:[self getExpectedAnchorPoint]];
168 } 157 }
169 158
170 - (void)show { 159 - (void)show {
160 url::Origin origin = chooserController_->GetOrigin();
171 chooserContentView_.reset([[ChooserContentViewCocoa alloc] 161 chooserContentView_.reset([[ChooserContentViewCocoa alloc]
172 initWithChooserTitle: 162 initWithChooserTitle:
173 l10n_util::GetNSStringF( 163 l10n_util::GetNSStringF(
174 IDS_DEVICE_CHOOSER_PROMPT, 164 IDS_DEVICE_CHOOSER_PROMPT,
175 url_formatter::FormatOriginForSecurityDisplay( 165 url_formatter::FormatOriginForSecurityDisplay(
176 chooserController_->GetOrigin(), 166 origin, url_formatter::SchemeDisplay::OMIT_CRYPTOGRAPHIC))
177 url_formatter::SchemeDisplay::OMIT_CRYPTOGRAPHIC))]); 167 ChooserController:std::move(chooserController_)]);
178 168
179 tableView_ = [chooserContentView_ tableView]; 169 tableView_ = [chooserContentView_ tableView];
180 connectButton_ = [chooserContentView_ connectButton]; 170 connectButton_ = [chooserContentView_ connectButton];
181 cancelButton_ = [chooserContentView_ cancelButton]; 171 cancelButton_ = [chooserContentView_ cancelButton];
182 helpButton_ = [chooserContentView_ helpButton];
183 172
184 [connectButton_ setTarget:self]; 173 [connectButton_ setTarget:self];
185 [connectButton_ setAction:@selector(onConnect:)]; 174 [connectButton_ setAction:@selector(onConnect:)];
186 [cancelButton_ setTarget:self]; 175 [cancelButton_ setTarget:self];
187 [cancelButton_ setAction:@selector(onCancel:)]; 176 [cancelButton_ setAction:@selector(onCancel:)];
188 [tableView_ setDelegate:self]; 177 [tableView_ setDelegate:self];
189 [tableView_ setDataSource:self]; 178 [tableView_ setDataSource:self];
190 [helpButton_ setTarget:self];
191 [helpButton_ setAction:@selector(onHelpPressed:)];
192 179
193 [[[self window] contentView] addSubview:chooserContentView_.get()]; 180 [[[self window] contentView] addSubview:chooserContentView_.get()];
194 181
195 NSRect bubbleFrame = 182 NSRect bubbleFrame =
196 [[self window] frameRectForContentRect:[chooserContentView_ frame]]; 183 [[self window] frameRectForContentRect:[chooserContentView_ frame]];
197 if ([[self window] isVisible]) { 184 if ([[self window] isVisible]) {
198 // Unfortunately, calling -setFrame followed by -setFrameOrigin (called 185 // Unfortunately, calling -setFrame followed by -setFrameOrigin (called
199 // within -setAnchorPoint) causes flickering. Avoid the flickering by 186 // within -setAnchorPoint) causes flickering. Avoid the flickering by
200 // manually adjusting the new frame's origin so that the top left stays the 187 // manually adjusting the new frame's origin so that the top left stays the
201 // same, and only calling -setFrame. 188 // same, and only calling -setFrame.
202 NSRect currentWindowFrame = [[self window] frame]; 189 NSRect currentWindowFrame = [[self window] frame];
203 bubbleFrame.origin = currentWindowFrame.origin; 190 bubbleFrame.origin = currentWindowFrame.origin;
204 bubbleFrame.origin.y = bubbleFrame.origin.y + 191 bubbleFrame.origin.y = bubbleFrame.origin.y +
205 currentWindowFrame.size.height - 192 currentWindowFrame.size.height -
206 bubbleFrame.size.height; 193 bubbleFrame.size.height;
207 [[self window] setFrame:bubbleFrame display:YES]; 194 [[self window] setFrame:bubbleFrame display:YES];
208 } else { 195 } else {
209 [[self window] setFrame:bubbleFrame display:NO]; 196 [[self window] setFrame:bubbleFrame display:NO];
210 [self setAnchorPoint:[self getExpectedAnchorPoint]]; 197 [self setAnchorPoint:[self getExpectedAnchorPoint]];
211 [self showWindow:nil]; 198 [self showWindow:nil];
212 [[self window] makeFirstResponder:nil]; 199 [[self window] makeFirstResponder:nil];
213 [[self window] setInitialFirstResponder:tableView_]; 200 [[self window] setInitialFirstResponder:tableView_];
214 } 201 }
215 } 202 }
216 203
217 - (NSInteger)numberOfRowsInTableView:(NSTableView*)tableView { 204 - (NSInteger)numberOfRowsInTableView:(NSTableView*)tableView {
218 // When there are no devices, the table contains a message saying there are 205 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 } 206 }
223 207
224 - (id)tableView:(NSTableView*)tableView 208 - (id)tableView:(NSTableView*)tableView
225 objectValueForTableColumn:(NSTableColumn*)tableColumn 209 objectValueForTableColumn:(NSTableColumn*)tableColumn
226 row:(NSInteger)rowIndex { 210 row:(NSInteger)rowIndex {
227 NSInteger num_options = 211 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 } 212 }
239 213
240 - (BOOL)tableView:(NSTableView*)aTableView 214 - (BOOL)tableView:(NSTableView*)aTableView
241 shouldEditTableColumn:(NSTableColumn*)aTableColumn 215 shouldEditTableColumn:(NSTableColumn*)aTableColumn
242 row:(NSInteger)rowIndex { 216 row:(NSInteger)rowIndex {
243 return NO; 217 return NO;
244 } 218 }
245 219
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 { 220 - (void)updateTableView {
271 [tableView_ setEnabled:chooserController_->NumOptions() > 0]; 221 [chooserContentView_ updateTableView];
272 [tableView_ reloadData];
273 } 222 }
274 223
275 - (void)tableViewSelectionDidChange:(NSNotification*)aNotification { 224 - (void)tableViewSelectionDidChange:(NSNotification*)aNotification {
276 [connectButton_ setEnabled:[tableView_ numberOfSelectedRows] > 0]; 225 [connectButton_ setEnabled:[tableView_ numberOfSelectedRows] > 0];
277 } 226 }
278 227
279 - (void)updateAnchorPosition { 228 - (void)updateAnchorPosition {
280 [self setParentWindow:[self getExpectedParentWindow]]; 229 [self setParentWindow:[self getExpectedParentWindow]];
281 [self setAnchorPoint:[self getExpectedAnchorPoint]]; 230 [self setAnchorPoint:[self getExpectedAnchorPoint]];
282 } 231 }
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
322 + (void)alignCenterOf:(NSView*)viewA verticallyToCenterOf:(NSView*)viewB { 271 + (void)alignCenterOf:(NSView*)viewA verticallyToCenterOf:(NSView*)viewB {
323 NSRect frameA = [viewA frame]; 272 NSRect frameA = [viewA frame];
324 NSRect frameB = [viewB frame]; 273 NSRect frameB = [viewB frame];
325 frameA.origin.y = 274 frameA.origin.y =
326 NSMinY(frameB) + std::floor((NSHeight(frameB) - NSHeight(frameA)) / 2); 275 NSMinY(frameB) + std::floor((NSHeight(frameB) - NSHeight(frameA)) / 2);
327 [viewA setFrameOrigin:frameA.origin]; 276 [viewA setFrameOrigin:frameA.origin];
328 } 277 }
329 278
330 - (void)onConnect:(id)sender { 279 - (void)onConnect:(id)sender {
331 buttonPressed_ = true; 280 buttonPressed_ = true;
332 NSInteger row = [tableView_ selectedRow]; 281 [chooserContentView_ Accept];
333 chooserController_->Select(row);
334 self.bubbleReference->CloseBubble(BUBBLE_CLOSE_ACCEPTED); 282 self.bubbleReference->CloseBubble(BUBBLE_CLOSE_ACCEPTED);
335 [self close]; 283 [self close];
336 } 284 }
337 285
338 - (void)onCancel:(id)sender { 286 - (void)onCancel:(id)sender {
339 buttonPressed_ = true; 287 buttonPressed_ = true;
340 chooserController_->Cancel(); 288 [chooserContentView_ Cancel];
341 self.bubbleReference->CloseBubble(BUBBLE_CLOSE_CANCELED); 289 self.bubbleReference->CloseBubble(BUBBLE_CLOSE_CANCELED);
342 [self close]; 290 [self close];
343 } 291 }
344 292
345 - (void)onHelpPressed:(id)sender {
346 chooserController_->OpenHelpCenterUrl();
347 }
348
349 @end 293 @end
350 294
351 ChooserBubbleUiCocoa::ChooserBubbleUiCocoa( 295 ChooserBubbleUiCocoa::ChooserBubbleUiCocoa(
352 Browser* browser, 296 Browser* browser,
353 ChooserController* chooser_controller) 297 std::unique_ptr<ChooserController> chooser_controller)
354 : browser_(browser), 298 : browser_(browser),
355 chooser_controller_(chooser_controller), 299 chooser_controller_(std::move(chooser_controller)),
356 chooser_bubble_ui_controller_(nil) { 300 chooser_bubble_ui_controller_(nil) {
357 DCHECK(browser); 301 DCHECK(browser_);
358 DCHECK(chooser_controller); 302 DCHECK(chooser_controller_);
359 chooser_controller_->set_observer(this);
360 } 303 }
361 304
362 ChooserBubbleUiCocoa::~ChooserBubbleUiCocoa() { 305 ChooserBubbleUiCocoa::~ChooserBubbleUiCocoa() {
363 chooser_controller_->set_observer(nullptr); 306 if (chooser_bubble_ui_controller_) {
364 [chooser_bubble_ui_controller_ close]; 307 [chooser_bubble_ui_controller_ close];
365 chooser_bubble_ui_controller_ = nil; 308 chooser_bubble_ui_controller_ = nil;
309 }
366 } 310 }
367 311
368 void ChooserBubbleUiCocoa::Show(BubbleReference bubble_reference) { 312 void ChooserBubbleUiCocoa::Show(BubbleReference bubble_reference) {
369 if (!chooser_bubble_ui_controller_) { 313 if (!chooser_bubble_ui_controller_) {
370 chooser_bubble_ui_controller_ = 314 chooser_bubble_ui_controller_ = [[ChooserBubbleUiController alloc]
371 [[ChooserBubbleUiController alloc] initWithBrowser:browser_ 315 initWithBrowser:browser_
372 chooserController:chooser_controller_ 316 chooserController:std::move(chooser_controller_)
373 bubbleReference:bubble_reference 317 bubbleReference:bubble_reference
374 bridge:this]; 318 bridge:this];
375 } 319 }
376
377 [chooser_bubble_ui_controller_ show]; 320 [chooser_bubble_ui_controller_ show];
378 [chooser_bubble_ui_controller_ updateTableView]; 321 [chooser_bubble_ui_controller_ updateTableView];
379 } 322 }
380 323
381 void ChooserBubbleUiCocoa::Close() { 324 void ChooserBubbleUiCocoa::Close() {
382 [chooser_bubble_ui_controller_ close]; 325 if (chooser_bubble_ui_controller_) {
383 chooser_bubble_ui_controller_ = nil; 326 [chooser_bubble_ui_controller_ close];
327 chooser_bubble_ui_controller_ = nil;
328 }
384 } 329 }
385 330
386 void ChooserBubbleUiCocoa::UpdateAnchorPosition() { 331 void ChooserBubbleUiCocoa::UpdateAnchorPosition() {
387 [chooser_bubble_ui_controller_ updateAnchorPosition]; 332 if (chooser_bubble_ui_controller_)
388 } 333 [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 } 334 }
401 335
402 void ChooserBubbleUiCocoa::OnBubbleClosing() { 336 void ChooserBubbleUiCocoa::OnBubbleClosing() {
403 chooser_bubble_ui_controller_ = nil; 337 chooser_bubble_ui_controller_ = nil;
404 } 338 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698