Index: chrome/browser/ui/cocoa/website_settings/chooser_bubble_ui_cocoa.mm |
diff --git a/chrome/browser/ui/cocoa/website_settings/chooser_bubble_ui_cocoa.mm b/chrome/browser/ui/cocoa/website_settings/chooser_bubble_ui_cocoa.mm |
index ba063bfdfefadd2a363daa042a6502ec0f6f4d44..1809cc13742a2e38285817921bee44446047c768 100644 |
--- a/chrome/browser/ui/cocoa/website_settings/chooser_bubble_ui_cocoa.mm |
+++ b/chrome/browser/ui/cocoa/website_settings/chooser_bubble_ui_cocoa.mm |
@@ -11,7 +11,6 @@ |
#include "base/mac/scoped_nsobject.h" |
#include "base/memory/ptr_util.h" |
-#include "base/strings/sys_string_conversions.h" |
#include "base/strings/utf_string_conversions.h" |
#include "chrome/browser/ui/browser.h" |
#include "chrome/browser/ui/browser_window.h" |
@@ -25,18 +24,18 @@ |
#include "chrome/browser/ui/website_settings/chooser_bubble_delegate.h" |
#include "chrome/grit/generated_resources.h" |
#include "components/bubble/bubble_controller.h" |
+#include "components/chooser_controller/chooser_controller.h" |
#include "components/url_formatter/elide_url.h" |
#include "content/public/browser/native_web_keyboard_event.h" |
#include "ui/base/cocoa/cocoa_base_utils.h" |
#include "ui/base/cocoa/window_size_constants.h" |
-#include "ui/base/l10n/l10n_util.h" |
#include "ui/base/l10n/l10n_util_mac.h" |
#include "url/gurl.h" |
#include "url/origin.h" |
std::unique_ptr<BubbleUi> ChooserBubbleDelegate::BuildBubbleUi() { |
return base::WrapUnique( |
- new ChooserBubbleUiCocoa(browser_, chooser_controller())); |
+ new ChooserBubbleUiCocoa(browser_, std::move(chooser_controller_))); |
} |
@interface ChooserBubbleUiController |
@@ -50,15 +49,19 @@ std::unique_ptr<BubbleUi> ChooserBubbleDelegate::BuildBubbleUi() { |
NSTableView* tableView_; // Weak. |
NSButton* connectButton_; // Weak. |
NSButton* cancelButton_; // Weak. |
- NSButton* helpButton_; // Weak. |
- Browser* browser_; // Weak. |
- ChooserController* chooserController_; // Weak. |
+ Browser* browser_; // Weak. |
+ // |chooserController_| is not owned by this class, it is owned by |
+ // ChooserContentViewCocoa. |
+ // This field only temporarily owns the ChooserController. It is moved |
+ // into the ChooserContentViewCocoa when BuildBubbleUi() is called and |
+ // the bubble is shown. |
+ std::unique_ptr<ChooserController> chooserController_; |
} |
// Designated initializer. |browser| and |bridge| must both be non-nil. |
- (id)initWithBrowser:(Browser*)browser |
- chooserController:(ChooserController*)chooserController |
+ chooserController:(std::unique_ptr<ChooserController>)chooserController |
bubbleReference:(BubbleReference)bubbleReference |
bridge:(ChooserBubbleUiCocoa*)bridge; |
@@ -76,15 +79,6 @@ std::unique_ptr<BubbleUi> ChooserBubbleDelegate::BuildBubbleUi() { |
// Should only be used outside this class for tests. |
- (bool)hasLocationBar; |
-// Update |tableView_| when chooser options were initialized. |
-- (void)onOptionsInitialized; |
- |
-// Update |tableView_| when chooser option was added. |
-- (void)onOptionAdded:(NSInteger)index; |
- |
-// Update |tableView_| when chooser option was removed. |
-- (void)onOptionRemoved:(NSInteger)index; |
- |
// Update |tableView_| when chooser options changed. |
- (void)updateTableView; |
@@ -100,15 +94,12 @@ std::unique_ptr<BubbleUi> ChooserBubbleDelegate::BuildBubbleUi() { |
// Called when the "Cancel" button is pressed. |
- (void)onCancel:(id)sender; |
-// Called when the "Get help" button is pressed. |
-- (void)onHelpPressed:(id)sender; |
- |
@end |
@implementation ChooserBubbleUiController |
- (id)initWithBrowser:(Browser*)browser |
- chooserController:(ChooserController*)chooserController |
+ chooserController:(std::unique_ptr<ChooserController>)chooserController |
bubbleReference:(BubbleReference)bubbleReference |
bridge:(ChooserBubbleUiCocoa*)bridge { |
DCHECK(browser); |
@@ -117,7 +108,7 @@ std::unique_ptr<BubbleUi> ChooserBubbleDelegate::BuildBubbleUi() { |
DCHECK(bridge); |
browser_ = browser; |
- chooserController_ = chooserController; |
+ chooserController_ = std::move(chooserController); |
base::scoped_nsobject<InfoBubbleWindow> window([[InfoBubbleWindow alloc] |
initWithContentRect:ui::kWindowSizeDeterminedLater |
@@ -140,6 +131,7 @@ std::unique_ptr<BubbleUi> ChooserBubbleDelegate::BuildBubbleUi() { |
name:NSWindowDidMoveNotification |
object:[self getExpectedParentWindow]]; |
} |
+ |
return self; |
} |
@@ -149,7 +141,7 @@ std::unique_ptr<BubbleUi> ChooserBubbleDelegate::BuildBubbleUi() { |
name:NSWindowDidMoveNotification |
object:nil]; |
if (!buttonPressed_) |
- chooserController_->Close(); |
+ [chooserContentView_ close]; |
bridge_->OnBubbleClosing(); |
[super windowWillClose:notification]; |
} |
@@ -168,18 +160,18 @@ std::unique_ptr<BubbleUi> ChooserBubbleDelegate::BuildBubbleUi() { |
} |
- (void)show { |
+ url::Origin origin = chooserController_->GetOrigin(); |
chooserContentView_.reset([[ChooserContentViewCocoa alloc] |
initWithChooserTitle: |
l10n_util::GetNSStringF( |
IDS_DEVICE_CHOOSER_PROMPT, |
url_formatter::FormatOriginForSecurityDisplay( |
- chooserController_->GetOrigin(), |
- url_formatter::SchemeDisplay::OMIT_CRYPTOGRAPHIC))]); |
+ origin, url_formatter::SchemeDisplay::OMIT_CRYPTOGRAPHIC)) |
+ ChooserController:std::move(chooserController_)]); |
tableView_ = [chooserContentView_ tableView]; |
connectButton_ = [chooserContentView_ connectButton]; |
cancelButton_ = [chooserContentView_ cancelButton]; |
- helpButton_ = [chooserContentView_ helpButton]; |
[connectButton_ setTarget:self]; |
[connectButton_ setAction:@selector(onConnect:)]; |
@@ -187,8 +179,6 @@ std::unique_ptr<BubbleUi> ChooserBubbleDelegate::BuildBubbleUi() { |
[cancelButton_ setAction:@selector(onCancel:)]; |
[tableView_ setDelegate:self]; |
[tableView_ setDataSource:self]; |
- [helpButton_ setTarget:self]; |
- [helpButton_ setAction:@selector(onHelpPressed:)]; |
[[[self window] contentView] addSubview:chooserContentView_.get()]; |
@@ -215,26 +205,13 @@ std::unique_ptr<BubbleUi> ChooserBubbleDelegate::BuildBubbleUi() { |
} |
- (NSInteger)numberOfRowsInTableView:(NSTableView*)tableView { |
- // When there are no devices, the table contains a message saying there are |
- // no devices, so the number of rows is always at least 1. |
- return std::max(static_cast<NSInteger>(chooserController_->NumOptions()), |
- static_cast<NSInteger>(1)); |
+ return [chooserContentView_ numOptions]; |
} |
- (id)tableView:(NSTableView*)tableView |
objectValueForTableColumn:(NSTableColumn*)tableColumn |
row:(NSInteger)rowIndex { |
- NSInteger num_options = |
- static_cast<NSInteger>(chooserController_->NumOptions()); |
- if (num_options == 0) { |
- DCHECK_EQ(0, rowIndex); |
- return l10n_util::GetNSString(IDS_DEVICE_CHOOSER_NO_DEVICES_FOUND_PROMPT); |
- } |
- |
- DCHECK_GE(rowIndex, 0); |
- DCHECK_LT(rowIndex, num_options); |
- return base::SysUTF16ToNSString( |
- chooserController_->GetOption(static_cast<size_t>(rowIndex))); |
+ return [chooserContentView_ getOption:rowIndex]; |
} |
- (BOOL)tableView:(NSTableView*)aTableView |
@@ -243,33 +220,8 @@ std::unique_ptr<BubbleUi> ChooserBubbleDelegate::BuildBubbleUi() { |
return NO; |
} |
-- (void)onOptionsInitialized { |
- [self updateTableView]; |
-} |
- |
-- (void)onOptionAdded:(NSInteger)index { |
- [self updateTableView]; |
-} |
- |
-- (void)onOptionRemoved:(NSInteger)index { |
- // |tableView_| will automatically select the removed item's next item. |
- // So here it tracks if the removed item is the item that was currently |
- // selected, if so, deselect it. Also if the removed item is before the |
- // currently selected item, the currently selected item's index needs to |
- // be adjusted by one. |
- NSInteger selectedRow = [tableView_ selectedRow]; |
- if (selectedRow == index) |
- [tableView_ deselectRow:index]; |
- else if (selectedRow > index) |
- [tableView_ selectRowIndexes:[NSIndexSet indexSetWithIndex:selectedRow - 1] |
- byExtendingSelection:NO]; |
- |
- [self updateTableView]; |
-} |
- |
- (void)updateTableView { |
- [tableView_ setEnabled:chooserController_->NumOptions() > 0]; |
- [tableView_ reloadData]; |
+ [chooserContentView_ updateTableView]; |
} |
- (void)tableViewSelectionDidChange:(NSNotification*)aNotification { |
@@ -329,74 +281,59 @@ std::unique_ptr<BubbleUi> ChooserBubbleDelegate::BuildBubbleUi() { |
- (void)onConnect:(id)sender { |
buttonPressed_ = true; |
- NSInteger row = [tableView_ selectedRow]; |
- chooserController_->Select(row); |
+ [chooserContentView_ accept]; |
self.bubbleReference->CloseBubble(BUBBLE_CLOSE_ACCEPTED); |
[self close]; |
} |
- (void)onCancel:(id)sender { |
buttonPressed_ = true; |
- chooserController_->Cancel(); |
+ [chooserContentView_ cancel]; |
self.bubbleReference->CloseBubble(BUBBLE_CLOSE_CANCELED); |
[self close]; |
} |
-- (void)onHelpPressed:(id)sender { |
- chooserController_->OpenHelpCenterUrl(); |
-} |
- |
@end |
ChooserBubbleUiCocoa::ChooserBubbleUiCocoa( |
Browser* browser, |
- ChooserController* chooser_controller) |
+ std::unique_ptr<ChooserController> chooser_controller) |
: browser_(browser), |
- chooser_controller_(chooser_controller), |
+ chooser_controller_(std::move(chooser_controller)), |
chooser_bubble_ui_controller_(nil) { |
- DCHECK(browser); |
- DCHECK(chooser_controller); |
- chooser_controller_->set_observer(this); |
+ DCHECK(browser_); |
+ DCHECK(chooser_controller_); |
} |
ChooserBubbleUiCocoa::~ChooserBubbleUiCocoa() { |
- chooser_controller_->set_observer(nullptr); |
- [chooser_bubble_ui_controller_ close]; |
- chooser_bubble_ui_controller_ = nil; |
+ if (chooser_bubble_ui_controller_) { |
+ [chooser_bubble_ui_controller_ close]; |
+ chooser_bubble_ui_controller_ = nil; |
+ } |
} |
void ChooserBubbleUiCocoa::Show(BubbleReference bubble_reference) { |
if (!chooser_bubble_ui_controller_) { |
- chooser_bubble_ui_controller_ = |
- [[ChooserBubbleUiController alloc] initWithBrowser:browser_ |
- chooserController:chooser_controller_ |
- bubbleReference:bubble_reference |
- bridge:this]; |
+ chooser_bubble_ui_controller_ = [[ChooserBubbleUiController alloc] |
+ initWithBrowser:browser_ |
+ chooserController:std::move(chooser_controller_) |
+ bubbleReference:bubble_reference |
+ bridge:this]; |
} |
- |
[chooser_bubble_ui_controller_ show]; |
[chooser_bubble_ui_controller_ updateTableView]; |
} |
void ChooserBubbleUiCocoa::Close() { |
- [chooser_bubble_ui_controller_ close]; |
- chooser_bubble_ui_controller_ = nil; |
+ if (chooser_bubble_ui_controller_) { |
+ [chooser_bubble_ui_controller_ close]; |
+ chooser_bubble_ui_controller_ = nil; |
+ } |
} |
void ChooserBubbleUiCocoa::UpdateAnchorPosition() { |
- [chooser_bubble_ui_controller_ updateAnchorPosition]; |
-} |
- |
-void ChooserBubbleUiCocoa::OnOptionsInitialized() { |
- [chooser_bubble_ui_controller_ onOptionsInitialized]; |
-} |
- |
-void ChooserBubbleUiCocoa::OnOptionAdded(size_t index) { |
- [chooser_bubble_ui_controller_ onOptionAdded:static_cast<NSInteger>(index)]; |
-} |
- |
-void ChooserBubbleUiCocoa::OnOptionRemoved(size_t index) { |
- [chooser_bubble_ui_controller_ onOptionRemoved:static_cast<NSInteger>(index)]; |
+ if (chooser_bubble_ui_controller_) |
+ [chooser_bubble_ui_controller_ updateAnchorPosition]; |
} |
void ChooserBubbleUiCocoa::OnBubbleClosing() { |