OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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/extensions/chooser_dialog_cocoa_controller.h" | 5 #import "chrome/browser/ui/cocoa/extensions/chooser_dialog_cocoa_controller.h" |
6 | 6 |
7 #include "base/strings/sys_string_conversions.h" | 7 #include "base/strings/sys_string_conversions.h" |
8 #include "base/strings/utf_string_conversions.h" | 8 #include "base/strings/utf_string_conversions.h" |
9 #import "chrome/browser/ui/cocoa/chooser_content_view_cocoa.h" | 9 #import "chrome/browser/ui/cocoa/chooser_content_view_cocoa.h" |
10 #import "chrome/browser/ui/cocoa/extensions/chooser_dialog_cocoa.h" | 10 #import "chrome/browser/ui/cocoa/extensions/chooser_dialog_cocoa.h" |
11 #include "chrome/grit/generated_resources.h" | 11 #include "chrome/grit/generated_resources.h" |
12 #include "components/chooser_controller/chooser_controller.h" | 12 #include "components/chooser_controller/chooser_controller.h" |
13 #include "components/url_formatter/elide_url.h" | 13 #include "components/url_formatter/elide_url.h" |
14 #include "content/public/browser/web_contents.h" | 14 #include "content/public/browser/web_contents.h" |
15 #include "extensions/browser/extension_registry.h" | 15 #include "extensions/browser/extension_registry.h" |
16 #import "ui/base/l10n/l10n_util_mac.h" | 16 #import "ui/base/l10n/l10n_util_mac.h" |
17 #include "url/gurl.h" | 17 #include "url/gurl.h" |
18 #include "url/origin.h" | 18 #include "url/origin.h" |
19 | 19 |
20 @implementation ChooserDialogCocoaController | 20 @implementation ChooserDialogCocoaController |
21 | 21 |
22 - (instancetype) | 22 - (instancetype) |
23 initWithChooserDialogCocoa:(ChooserDialogCocoa*)chooserDialogCocoa | 23 initWithChooserDialogCocoa:(ChooserDialogCocoa*)chooserDialogCocoa |
24 chooserController:(ChooserController*)chooserController { | 24 chooserController: |
| 25 (std::unique_ptr<ChooserController>)chooserController { |
25 DCHECK(chooserDialogCocoa); | 26 DCHECK(chooserDialogCocoa); |
26 DCHECK(chooserController); | 27 DCHECK(chooserController); |
27 if ((self = [super init])) { | 28 if ((self = [super init])) |
28 chooserDialogCocoa_ = chooserDialogCocoa; | 29 chooserDialogCocoa_ = chooserDialogCocoa; |
29 chooserController_ = chooserController; | |
30 } | |
31 | 30 |
32 base::string16 chooserTitle; | 31 base::string16 chooserTitle; |
33 url::Origin origin = chooserController_->GetOrigin(); | 32 url::Origin origin = chooserController->GetOrigin(); |
34 content::WebContents* web_contents = chooserDialogCocoa_->web_contents(); | 33 content::WebContents* web_contents = chooserDialogCocoa_->web_contents(); |
35 content::BrowserContext* browser_context = web_contents->GetBrowserContext(); | 34 content::BrowserContext* browser_context = web_contents->GetBrowserContext(); |
36 extensions::ExtensionRegistry* extension_registry = | 35 extensions::ExtensionRegistry* extension_registry = |
37 extensions::ExtensionRegistry::Get(browser_context); | 36 extensions::ExtensionRegistry::Get(browser_context); |
38 if (extension_registry) { | 37 if (extension_registry) { |
39 const extensions::Extension* extension = | 38 const extensions::Extension* extension = |
40 extension_registry->enabled_extensions().GetExtensionOrAppByURL( | 39 extension_registry->enabled_extensions().GetExtensionOrAppByURL( |
41 GURL(origin.Serialize())); | 40 GURL(origin.Serialize())); |
42 if (extension) | 41 if (extension) |
43 chooserTitle = base::UTF8ToUTF16(extension->name()); | 42 chooserTitle = base::UTF8ToUTF16(extension->name()); |
44 } | 43 } |
45 | 44 |
46 if (chooserTitle.empty()) { | 45 if (chooserTitle.empty()) { |
47 chooserTitle = url_formatter::FormatOriginForSecurityDisplay( | 46 chooserTitle = url_formatter::FormatOriginForSecurityDisplay( |
48 origin, url_formatter::SchemeDisplay::OMIT_CRYPTOGRAPHIC); | 47 origin, url_formatter::SchemeDisplay::OMIT_CRYPTOGRAPHIC); |
49 } | 48 } |
50 | 49 |
51 chooserContentView_.reset([[ChooserContentViewCocoa alloc] | 50 chooserContentView_.reset([[ChooserContentViewCocoa alloc] |
52 initWithChooserTitle:l10n_util::GetNSStringF(IDS_DEVICE_CHOOSER_PROMPT, | 51 initWithChooserTitle:l10n_util::GetNSStringF(IDS_DEVICE_CHOOSER_PROMPT, |
53 chooserTitle)]); | 52 chooserTitle) |
| 53 ChooserController:std::move(chooserController)]); |
54 | 54 |
55 tableView_ = [chooserContentView_ tableView]; | 55 tableView_ = [chooserContentView_ tableView]; |
56 connectButton_ = [chooserContentView_ connectButton]; | 56 connectButton_ = [chooserContentView_ connectButton]; |
57 cancelButton_ = [chooserContentView_ cancelButton]; | 57 cancelButton_ = [chooserContentView_ cancelButton]; |
58 helpButton_ = [chooserContentView_ helpButton]; | |
59 | 58 |
60 [connectButton_ setTarget:self]; | 59 [connectButton_ setTarget:self]; |
61 [connectButton_ setAction:@selector(onConnect:)]; | 60 [connectButton_ setAction:@selector(onConnect:)]; |
62 [cancelButton_ setTarget:self]; | 61 [cancelButton_ setTarget:self]; |
63 [cancelButton_ setAction:@selector(onCancel:)]; | 62 [cancelButton_ setAction:@selector(onCancel:)]; |
64 [tableView_ setDelegate:self]; | 63 [tableView_ setDelegate:self]; |
65 [tableView_ setDataSource:self]; | 64 [tableView_ setDataSource:self]; |
66 [helpButton_ setTarget:self]; | |
67 [helpButton_ setAction:@selector(onHelpPressed:)]; | |
68 self.view = chooserContentView_; | 65 self.view = chooserContentView_; |
69 [self updateTableView]; | 66 [chooserContentView_ updateTableView]; |
70 | 67 |
71 return self; | 68 return self; |
72 } | 69 } |
73 | 70 |
74 - (NSInteger)numberOfRowsInTableView:(NSTableView*)tableView { | 71 - (NSInteger)numberOfRowsInTableView:(NSTableView*)tableView { |
75 // When there are no devices, the table contains a message saying there are | 72 return [chooserContentView_ numOptions]; |
76 // no devices, so the number of rows is always at least 1. | |
77 return std::max(static_cast<NSInteger>(chooserController_->NumOptions()), | |
78 static_cast<NSInteger>(1)); | |
79 } | 73 } |
80 | 74 |
81 - (id)tableView:(NSTableView*)tableView | 75 - (id)tableView:(NSTableView*)tableView |
82 objectValueForTableColumn:(NSTableColumn*)tableColumn | 76 objectValueForTableColumn:(NSTableColumn*)tableColumn |
83 row:(NSInteger)rowIndex { | 77 row:(NSInteger)rowIndex { |
84 NSInteger num_options = | 78 return [chooserContentView_ getOption:rowIndex]; |
85 static_cast<NSInteger>(chooserController_->NumOptions()); | |
86 if (num_options == 0) { | |
87 DCHECK_EQ(0, rowIndex); | |
88 return l10n_util::GetNSString(IDS_DEVICE_CHOOSER_NO_DEVICES_FOUND_PROMPT); | |
89 } | |
90 | |
91 DCHECK_GE(rowIndex, 0); | |
92 DCHECK_LT(rowIndex, num_options); | |
93 return base::SysUTF16ToNSString( | |
94 chooserController_->GetOption(static_cast<size_t>(rowIndex))); | |
95 } | 79 } |
96 | 80 |
97 - (BOOL)tableView:(NSTableView*)aTableView | 81 - (BOOL)tableView:(NSTableView*)aTableView |
98 shouldEditTableColumn:(NSTableColumn*)aTableColumn | 82 shouldEditTableColumn:(NSTableColumn*)aTableColumn |
99 row:(NSInteger)rowIndex { | 83 row:(NSInteger)rowIndex { |
100 return NO; | 84 return NO; |
101 } | 85 } |
102 | 86 |
103 - (void)onOptionsInitialized { | |
104 [self updateTableView]; | |
105 } | |
106 | |
107 - (void)onOptionAdded:(NSInteger)index { | |
108 [self updateTableView]; | |
109 } | |
110 | |
111 - (void)onOptionRemoved:(NSInteger)index { | |
112 // |tableView_| will automatically select the removed item's next item. | |
113 // So here it tracks if the removed item is the item that was currently | |
114 // selected, if so, deselect it. Also if the removed item is before the | |
115 // currently selected item, the currently selected item's index needs to | |
116 // be adjusted by one. | |
117 NSInteger selectedRow = [tableView_ selectedRow]; | |
118 if (selectedRow == index) | |
119 [tableView_ deselectRow:index]; | |
120 else if (selectedRow > index) | |
121 [tableView_ selectRowIndexes:[NSIndexSet indexSetWithIndex:selectedRow - 1] | |
122 byExtendingSelection:NO]; | |
123 | |
124 [self updateTableView]; | |
125 } | |
126 | |
127 - (void)updateTableView { | |
128 [tableView_ setEnabled:chooserController_->NumOptions() > 0]; | |
129 [tableView_ reloadData]; | |
130 } | |
131 | |
132 - (void)tableViewSelectionDidChange:(NSNotification*)aNotification { | 87 - (void)tableViewSelectionDidChange:(NSNotification*)aNotification { |
133 [connectButton_ setEnabled:[tableView_ numberOfSelectedRows] > 0]; | 88 [connectButton_ setEnabled:[tableView_ numberOfSelectedRows] > 0]; |
134 } | 89 } |
135 | 90 |
136 - (void)onConnect:(id)sender { | 91 - (void)onConnect:(id)sender { |
137 NSInteger row = [tableView_ selectedRow]; | 92 [chooserContentView_ accept]; |
138 chooserDialogCocoa_->Dismissed(); | 93 chooserDialogCocoa_->Dismissed(); |
139 chooserController_->Select(row); | |
140 } | 94 } |
141 | 95 |
142 - (void)onCancel:(id)sender { | 96 - (void)onCancel:(id)sender { |
| 97 [chooserContentView_ cancel]; |
143 chooserDialogCocoa_->Dismissed(); | 98 chooserDialogCocoa_->Dismissed(); |
144 chooserController_->Cancel(); | |
145 } | |
146 | |
147 - (void)onHelpPressed:(id)sender { | |
148 chooserController_->OpenHelpCenterUrl(); | |
149 } | 99 } |
150 | 100 |
151 - (ChooserContentViewCocoa*)chooserContentView { | 101 - (ChooserContentViewCocoa*)chooserContentView { |
152 return chooserContentView_.get(); | 102 return chooserContentView_.get(); |
153 } | 103 } |
154 | 104 |
155 @end | 105 @end |
OLD | NEW |