Chromium Code Reviews| Index: chrome/browser/ui/cocoa/extensions/chooser_dialog_cocoa_controller.mm |
| diff --git a/chrome/browser/ui/cocoa/extensions/chooser_dialog_cocoa_controller.mm b/chrome/browser/ui/cocoa/extensions/chooser_dialog_cocoa_controller.mm |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..9454d5fe2052ba255a28d70dd8fd6993bcf9dffd |
| --- /dev/null |
| +++ b/chrome/browser/ui/cocoa/extensions/chooser_dialog_cocoa_controller.mm |
| @@ -0,0 +1,153 @@ |
| +// Copyright 2016 The Chromium Authors. All rights reserved. |
|
Robert Sesek
2016/05/23 20:13:53
How about a unit test?
juncai
2016/05/27 21:30:37
Done.
|
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#import "chrome/browser/ui/cocoa/extensions/chooser_dialog_cocoa_controller.h" |
| + |
| +#include "base/strings/sys_string_conversions.h" |
| +#include "base/strings/utf_string_conversions.h" |
| +#import "chrome/browser/ui/cocoa/chooser_content_view.h" |
| +#import "chrome/browser/ui/cocoa/extensions/chooser_dialog_cocoa.h" |
| +#include "chrome/grit/generated_resources.h" |
| +#include "components/ui/chooser_controller/chooser_controller.h" |
| +#include "components/url_formatter/elide_url.h" |
| +#include "content/public/browser/web_contents.h" |
| +#include "extensions/browser/extension_registry.h" |
| +#import "ui/base/l10n/l10n_util_mac.h" |
| +#include "url/gurl.h" |
| +#include "url/origin.h" |
| + |
| +@implementation ChooserDialogCocoaController |
| + |
| +- (instancetype) |
| +initWithChooserDialogCocoa:(ChooserDialogCocoa*)chooserDialogCocoa |
| + initWithChooserController:(ChooserController*)chooserController { |
| + DCHECK(chooserDialogCocoa); |
| + DCHECK(chooserController); |
| + if ((self = [super init])) { |
| + chooserDialogCocoa_ = chooserDialogCocoa; |
| + chooserController_ = chooserController; |
| + } |
| + |
| + return self; |
| +} |
| + |
| +- (void)loadView { |
| + base::string16 chooserTitle; |
| + url::Origin origin = chooserController_->GetOrigin(); |
| + content::WebContents* web_contents = chooserDialogCocoa_->web_contents(); |
| + content::BrowserContext* browser_context = web_contents->GetBrowserContext(); |
| + extensions::ExtensionRegistry* extension_registry = |
| + extensions::ExtensionRegistry::Get(browser_context); |
| + if (extension_registry) { |
| + const extensions::Extension* extension = |
| + extension_registry->enabled_extensions().GetExtensionOrAppByURL( |
| + GURL(origin.Serialize())); |
| + if (extension) |
| + chooserTitle = base::UTF8ToUTF16(extension->name()); |
| + } |
| + |
| + if (chooserTitle.empty()) { |
| + chooserTitle = url_formatter::FormatOriginForSecurityDisplay( |
| + origin, url_formatter::SchemeDisplay::OMIT_CRYPTOGRAPHIC); |
| + } |
| + |
| + chooserContentView_.reset([[ChooserContentView alloc] |
| + initWithChooserTitle:l10n_util::GetNSStringF(IDS_CHOOSER_BUBBLE_PROMPT, |
| + chooserTitle)]); |
| + |
| + tableView_ = [chooserContentView_ tableView]; |
| + connectButton_ = [chooserContentView_ connectButton]; |
| + cancelButton_ = [chooserContentView_ cancelButton]; |
| + helpButton_ = [chooserContentView_ helpButton]; |
| + |
| + [connectButton_ setTarget:self]; |
| + [connectButton_ setAction:@selector(onConnect:)]; |
| + [cancelButton_ setTarget:self]; |
| + [cancelButton_ setAction:@selector(onCancel:)]; |
| + [tableView_ setDelegate:self]; |
| + [tableView_ setDataSource:self]; |
| + [helpButton_ setTarget:self]; |
| + [helpButton_ setAction:@selector(onHelpPressed:)]; |
| + self.view = chooserContentView_; |
| + [self updateTableView]; |
| +} |
| + |
| +- (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)); |
|
Robert Sesek
2016/05/23 20:13:53
You shouldn't need to static_cast 1...
juncai
2016/05/27 21:30:37
It seems that the static_cast is necessary, otherw
|
| +} |
| + |
| +- (id)tableView:(NSTableView*)tableView |
| + objectValueForTableColumn:(NSTableColumn*)tableColumn |
| + row:(NSInteger)rowIndex { |
| + if (!chooserController_) |
| + return @""; |
| + NSInteger num_options = |
| + static_cast<NSInteger>(chooserController_->NumOptions()); |
| + if (num_options == 0) { |
| + DCHECK_EQ(0, rowIndex); |
| + return l10n_util::GetNSString(IDS_CHOOSER_BUBBLE_NO_DEVICES_FOUND_PROMPT); |
| + } |
| + |
| + DCHECK_GE(rowIndex, 0); |
| + DCHECK_LT(rowIndex, num_options); |
| + return base::SysUTF16ToNSString( |
| + chooserController_->GetOption(static_cast<size_t>(rowIndex))); |
| +} |
| + |
| +- (BOOL)tableView:(NSTableView*)aTableView |
| + shouldEditTableColumn:(NSTableColumn*)aTableColumn |
| + row:(NSInteger)rowIndex { |
| + return NO; |
| +} |
| + |
| +- (void)onOptionsInitialized { |
| + [self updateTableView]; |
| +} |
| + |
| +- (void)onOptionAdded:(NSInteger)index { |
| + [self updateTableView]; |
| +} |
| + |
| +- (void)onOptionRemoved:(NSInteger)index { |
| + // |tableView_| will automatically selects the next item if the current |
| + // item is removed, so here it tracks if the removed item is the item |
| + // that was previously selected, if so, deselect it. |
| + if ([tableView_ selectedRow] == index) |
| + [tableView_ deselectRow:index]; |
| + |
| + [self updateTableView]; |
| +} |
| + |
| +- (void)updateTableView { |
| + [tableView_ setEnabled:chooserController_->NumOptions() > 0]; |
| + [tableView_ reloadData]; |
| +} |
| + |
| +- (void)tableViewSelectionDidChange:(NSNotification*)aNotification { |
| + [connectButton_ setEnabled:[tableView_ numberOfSelectedRows] > 0]; |
| +} |
| + |
| +- (void)onConnect:(id)sender { |
| + NSInteger row = [tableView_ selectedRow]; |
| + chooserController_->Select(row); |
| + chooserController_ = nil; |
|
Robert Sesek
2016/05/23 20:13:53
nil is only for ObjC objects, use nullptr for C++
Robert Sesek
2016/05/23 20:13:53
If you mash the button hooked up to onConnect, can
juncai
2016/05/27 21:30:37
It seems that after switching the order of:
choose
|
| + chooserDialogCocoa_->Dismissed(); |
| + chooserDialogCocoa_ = nil; |
| +} |
| + |
| +- (void)onCancel:(id)sender { |
| + chooserController_->Cancel(); |
| + chooserController_ = nil; |
| + chooserDialogCocoa_->Dismissed(); |
| + chooserDialogCocoa_ = nil; |
| +} |
| + |
| +- (void)onHelpPressed:(id)sender { |
| + chooserController_->OpenHelpCenterUrl(); |
| +} |
| + |
| +@end |