| 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..359a74b559967e2d230af748b5335aa2b34d664c 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() {
|
|
|