| 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..b1a40b565a2d6334e2b40790f8fecd6154d43b5b
|
| --- /dev/null
|
| +++ b/chrome/browser/ui/cocoa/extensions/chooser_dialog_cocoa_controller.mm
|
| @@ -0,0 +1,149 @@
|
| +// Copyright 2016 The Chromium Authors. All rights reserved.
|
| +// 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/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
|
| + chooserController:(ChooserController*)chooserController {
|
| + DCHECK(chooserDialogCocoa);
|
| + DCHECK(chooserController);
|
| + if ((self = [super init])) {
|
| + chooserDialogCocoa_ = chooserDialogCocoa;
|
| + chooserController_ = chooserController;
|
| + }
|
| +
|
| + 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];
|
| +
|
| + return self;
|
| +}
|
| +
|
| +- (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));
|
| +}
|
| +
|
| +- (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_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];
|
| + chooserDialogCocoa_->Dismissed();
|
| + chooserController_->Select(row);
|
| +}
|
| +
|
| +- (void)onCancel:(id)sender {
|
| + chooserDialogCocoa_->Dismissed();
|
| + chooserController_->Cancel();
|
| +}
|
| +
|
| +- (void)onHelpPressed:(id)sender {
|
| + chooserController_->OpenHelpCenterUrl();
|
| +}
|
| +
|
| +- (ChooserContentView*)chooserContentView {
|
| + return chooserContentView_.get();
|
| +}
|
| +
|
| +@end
|
|
|