OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "ios/chrome/browser/ui/settings/password_details_collection_view_control
ler.h" | 5 #import "ios/chrome/browser/ui/settings/password_details_collection_view_control
ler.h" |
6 | 6 |
7 #include "base/mac/foundation_util.h" | 7 #include "base/mac/foundation_util.h" |
8 #include "base/strings/sys_string_conversions.h" | 8 #include "base/strings/sys_string_conversions.h" |
9 #include "components/autofill/core/common/password_form.h" | 9 #include "components/autofill/core/common/password_form.h" |
10 #include "components/password_manager/core/browser/affiliation_utils.h" | 10 #include "components/password_manager/core/browser/affiliation_utils.h" |
(...skipping 14 matching lines...) Expand all Loading... |
25 #import "ios/third_party/material_components_ios/src/components/Snackbar/src/Mat
erialSnackbar.h" | 25 #import "ios/third_party/material_components_ios/src/components/Snackbar/src/Mat
erialSnackbar.h" |
26 #include "ui/base/l10n/l10n_util_mac.h" | 26 #include "ui/base/l10n/l10n_util_mac.h" |
27 | 27 |
28 #if !defined(__has_feature) || !__has_feature(objc_arc) | 28 #if !defined(__has_feature) || !__has_feature(objc_arc) |
29 #error "This file requires ARC support." | 29 #error "This file requires ARC support." |
30 #endif | 30 #endif |
31 | 31 |
32 namespace { | 32 namespace { |
33 | 33 |
34 typedef NS_ENUM(NSInteger, SectionIdentifier) { | 34 typedef NS_ENUM(NSInteger, SectionIdentifier) { |
35 SectionIdentifierUsername = kSectionIdentifierEnumZero, | 35 SectionIdentifierSite = kSectionIdentifierEnumZero, |
| 36 SectionIdentifierUsername, |
36 SectionIdentifierPassword, | 37 SectionIdentifierPassword, |
37 }; | 38 }; |
38 | 39 |
39 typedef NS_ENUM(NSInteger, ItemType) { | 40 typedef NS_ENUM(NSInteger, ItemType) { |
40 ItemTypeHeader = kItemTypeEnumZero, | 41 ItemTypeHeader = kItemTypeEnumZero, |
| 42 ItemTypeSite, |
| 43 ItemTypeCopySite, |
41 ItemTypeUsername, | 44 ItemTypeUsername, |
42 ItemTypeCopyUsername, | 45 ItemTypeCopyUsername, |
43 ItemTypePassword, | 46 ItemTypePassword, |
44 ItemTypeShowHide, | 47 ItemTypeShowHide, |
45 ItemTypeCopyPassword, | 48 ItemTypeCopyPassword, |
46 ItemTypeDelete, | 49 ItemTypeDelete, |
47 }; | 50 }; |
48 | 51 |
49 } // namespace | 52 } // namespace |
50 | 53 |
51 @interface PasswordDetailsCollectionViewController () { | 54 @interface PasswordDetailsCollectionViewController () { |
52 // The username to which the saved password belongs. | 55 // The username to which the saved password belongs. |
53 NSString* _username; | 56 NSString* _username; |
54 // The saved password. | 57 // The saved password. |
55 NSString* _password; | 58 NSString* _password; |
| 59 // The origin site of the saved credential. |
| 60 NSString* _site; |
56 // Whether the password is shown in plain text form or in obscured form. | 61 // Whether the password is shown in plain text form or in obscured form. |
57 BOOL _plainTextPasswordShown; | 62 BOOL _plainTextPasswordShown; |
58 // The password form. | 63 // The password form. |
59 autofill::PasswordForm _passwordForm; | 64 autofill::PasswordForm _passwordForm; |
60 // Instance of the parent view controller needed in order to update the | 65 // Instance of the parent view controller needed in order to update the |
61 // password list when a password is deleted. | 66 // password list when a password is deleted. |
62 __weak id<PasswordDetailsCollectionViewControllerDelegate> _weakDelegate; | 67 __weak id<PasswordDetailsCollectionViewControllerDelegate> _weakDelegate; |
63 // Module containing the reauthentication mechanism for viewing and copying | 68 // Module containing the reauthentication mechanism for viewing and copying |
64 // passwords. | 69 // passwords. |
65 __weak id<ReauthenticationProtocol> _weakReauthenticationModule; | 70 __weak id<ReauthenticationProtocol> _weakReauthenticationModule; |
(...skipping 15 matching lines...) Expand all Loading... |
81 origin:(NSString*)origin { | 86 origin:(NSString*)origin { |
82 DCHECK(delegate); | 87 DCHECK(delegate); |
83 DCHECK(reauthenticationModule); | 88 DCHECK(reauthenticationModule); |
84 self = [super initWithStyle:CollectionViewControllerStyleAppBar]; | 89 self = [super initWithStyle:CollectionViewControllerStyleAppBar]; |
85 if (self) { | 90 if (self) { |
86 _weakDelegate = delegate; | 91 _weakDelegate = delegate; |
87 _weakReauthenticationModule = reauthenticationModule; | 92 _weakReauthenticationModule = reauthenticationModule; |
88 _passwordForm = passwordForm; | 93 _passwordForm = passwordForm; |
89 _username = [username copy]; | 94 _username = [username copy]; |
90 _password = [password copy]; | 95 _password = [password copy]; |
| 96 _site = base::SysUTF8ToNSString(_passwordForm.origin.spec()); |
91 self.title = | 97 self.title = |
92 [PasswordDetailsCollectionViewController simplifyOrigin:origin]; | 98 [PasswordDetailsCollectionViewController simplifyOrigin:origin]; |
93 NSNotificationCenter* defaultCenter = [NSNotificationCenter defaultCenter]; | 99 NSNotificationCenter* defaultCenter = [NSNotificationCenter defaultCenter]; |
94 [defaultCenter addObserver:self | 100 [defaultCenter addObserver:self |
95 selector:@selector(hidePassword) | 101 selector:@selector(hidePassword) |
96 name:UIApplicationDidEnterBackgroundNotification | 102 name:UIApplicationDidEnterBackgroundNotification |
97 object:nil]; | 103 object:nil]; |
98 | 104 |
99 [self loadModel]; | 105 [self loadModel]; |
100 } | 106 } |
(...skipping 11 matching lines...) Expand all Loading... |
112 return | 118 return |
113 [[originWithoutScheme componentsSeparatedByString:@"/"] objectAtIndex:0]; | 119 [[originWithoutScheme componentsSeparatedByString:@"/"] objectAtIndex:0]; |
114 } | 120 } |
115 | 121 |
116 #pragma mark - SettingsRootCollectionViewController | 122 #pragma mark - SettingsRootCollectionViewController |
117 | 123 |
118 - (void)loadModel { | 124 - (void)loadModel { |
119 [super loadModel]; | 125 [super loadModel]; |
120 CollectionViewModel* model = self.collectionViewModel; | 126 CollectionViewModel* model = self.collectionViewModel; |
121 | 127 |
| 128 [model addSectionWithIdentifier:SectionIdentifierSite]; |
| 129 CollectionViewTextItem* siteHeader = |
| 130 [[CollectionViewTextItem alloc] initWithType:ItemTypeHeader]; |
| 131 siteHeader.text = l10n_util::GetNSString(IDS_IOS_SHOW_PASSWORD_VIEW_SITE); |
| 132 [model setHeader:siteHeader forSectionWithIdentifier:SectionIdentifierSite]; |
| 133 PasswordDetailsItem* siteItem = |
| 134 [[PasswordDetailsItem alloc] initWithType:ItemTypeSite]; |
| 135 siteItem.text = _site; |
| 136 siteItem.showingText = YES; |
| 137 [model addItem:siteItem toSectionWithIdentifier:SectionIdentifierSite]; |
| 138 [model addItem:[self siteCopyButtonItem] |
| 139 toSectionWithIdentifier:SectionIdentifierSite]; |
| 140 |
122 [model addSectionWithIdentifier:SectionIdentifierUsername]; | 141 [model addSectionWithIdentifier:SectionIdentifierUsername]; |
123 CollectionViewTextItem* usernameHeader = | 142 CollectionViewTextItem* usernameHeader = |
124 [[CollectionViewTextItem alloc] initWithType:ItemTypeHeader]; | 143 [[CollectionViewTextItem alloc] initWithType:ItemTypeHeader]; |
125 usernameHeader.text = | 144 usernameHeader.text = |
126 l10n_util::GetNSString(IDS_IOS_SHOW_PASSWORD_VIEW_USERNAME); | 145 l10n_util::GetNSString(IDS_IOS_SHOW_PASSWORD_VIEW_USERNAME); |
127 usernameHeader.textColor = [[MDCPalette greyPalette] tint500]; | 146 usernameHeader.textColor = [[MDCPalette greyPalette] tint500]; |
128 [model setHeader:usernameHeader | 147 [model setHeader:usernameHeader |
129 forSectionWithIdentifier:SectionIdentifierUsername]; | 148 forSectionWithIdentifier:SectionIdentifierUsername]; |
130 PasswordDetailsItem* usernameItem = | 149 PasswordDetailsItem* usernameItem = |
131 [[PasswordDetailsItem alloc] initWithType:ItemTypeUsername]; | 150 [[PasswordDetailsItem alloc] initWithType:ItemTypeUsername]; |
(...skipping 27 matching lines...) Expand all Loading... |
159 [model addItem:[self deletePasswordButtonItem] | 178 [model addItem:[self deletePasswordButtonItem] |
160 toSectionWithIdentifier:SectionIdentifierPassword]; | 179 toSectionWithIdentifier:SectionIdentifierPassword]; |
161 } | 180 } |
162 | 181 |
163 - (void)dealloc { | 182 - (void)dealloc { |
164 [[NSNotificationCenter defaultCenter] removeObserver:self]; | 183 [[NSNotificationCenter defaultCenter] removeObserver:self]; |
165 } | 184 } |
166 | 185 |
167 #pragma mark - Items | 186 #pragma mark - Items |
168 | 187 |
| 188 - (CollectionViewItem*)siteCopyButtonItem { |
| 189 CollectionViewTextItem* item = |
| 190 [[CollectionViewTextItem alloc] initWithType:ItemTypeCopySite]; |
| 191 item.text = l10n_util::GetNSString(IDS_IOS_SETTINGS_SITE_COPY_BUTTON); |
| 192 item.textColor = [[MDCPalette cr_bluePalette] tint500]; |
| 193 // Accessibility label adds the header to the text, so that accessibility |
| 194 // users do not have to rely on the visual grouping to understand which part |
| 195 // of the credential is being copied. |
| 196 item.accessibilityLabel = [NSString |
| 197 stringWithFormat:@"%@: %@", |
| 198 l10n_util::GetNSString(IDS_IOS_SHOW_PASSWORD_VIEW_SITE), |
| 199 l10n_util::GetNSString( |
| 200 IDS_IOS_SETTINGS_SITE_COPY_BUTTON)]; |
| 201 item.accessibilityTraits |= UIAccessibilityTraitButton; |
| 202 return item; |
| 203 } |
| 204 |
169 - (CollectionViewItem*)usernameCopyButtonItem { | 205 - (CollectionViewItem*)usernameCopyButtonItem { |
170 CollectionViewTextItem* item = | 206 CollectionViewTextItem* item = |
171 [[CollectionViewTextItem alloc] initWithType:ItemTypeCopyUsername]; | 207 [[CollectionViewTextItem alloc] initWithType:ItemTypeCopyUsername]; |
172 item.text = l10n_util::GetNSString(IDS_IOS_SETTINGS_USERNAME_COPY_BUTTON); | 208 item.text = l10n_util::GetNSString(IDS_IOS_SETTINGS_USERNAME_COPY_BUTTON); |
173 item.textColor = [[MDCPalette cr_bluePalette] tint500]; | 209 item.textColor = [[MDCPalette cr_bluePalette] tint500]; |
174 // Accessibility label adds the header to the text, so that accessibility | 210 // Accessibility label adds the header to the text, so that accessibility |
175 // users do not have to rely on the visual grouping to understand which part | 211 // users do not have to rely on the visual grouping to understand which part |
176 // of the credential is being copied. | 212 // of the credential is being copied. |
177 item.accessibilityLabel = | 213 item.accessibilityLabel = |
178 [NSString stringWithFormat:@"%@: %@", | 214 [NSString stringWithFormat:@"%@: %@", |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
215 CollectionViewTextItem* item = | 251 CollectionViewTextItem* item = |
216 [[CollectionViewTextItem alloc] initWithType:ItemTypeDelete]; | 252 [[CollectionViewTextItem alloc] initWithType:ItemTypeDelete]; |
217 item.text = l10n_util::GetNSString(IDS_IOS_SETTINGS_PASSWORD_DELETE_BUTTON); | 253 item.text = l10n_util::GetNSString(IDS_IOS_SETTINGS_PASSWORD_DELETE_BUTTON); |
218 item.textColor = [[MDCPalette cr_redPalette] tint500]; | 254 item.textColor = [[MDCPalette cr_redPalette] tint500]; |
219 item.accessibilityTraits |= UIAccessibilityTraitButton; | 255 item.accessibilityTraits |= UIAccessibilityTraitButton; |
220 return item; | 256 return item; |
221 } | 257 } |
222 | 258 |
223 #pragma mark - Actions | 259 #pragma mark - Actions |
224 | 260 |
| 261 - (void)copySite { |
| 262 UIPasteboard* generalPasteboard = [UIPasteboard generalPasteboard]; |
| 263 generalPasteboard.string = _site; |
| 264 [self showCopyResultToast:l10n_util::GetNSString( |
| 265 IDS_IOS_SETTINGS_SITE_WAS_COPIED_MESSAGE)]; |
| 266 } |
| 267 |
225 - (void)copyUsername { | 268 - (void)copyUsername { |
226 UIPasteboard* generalPasteboard = [UIPasteboard generalPasteboard]; | 269 UIPasteboard* generalPasteboard = [UIPasteboard generalPasteboard]; |
227 generalPasteboard.string = _username; | 270 generalPasteboard.string = _username; |
228 [self showCopyResultToast:l10n_util::GetNSString( | 271 [self showCopyResultToast:l10n_util::GetNSString( |
229 IDS_IOS_SETTINGS_USERNAME_WAS_COPIED_MESSAGE)]; | 272 IDS_IOS_SETTINGS_USERNAME_WAS_COPIED_MESSAGE)]; |
230 } | 273 } |
231 | 274 |
232 - (NSString*)showHideButtonText { | 275 - (NSString*)showHideButtonText { |
233 if (_plainTextPasswordShown) { | 276 if (_plainTextPasswordShown) { |
234 return l10n_util::GetNSString(IDS_IOS_SETTINGS_PASSWORD_HIDE_BUTTON); | 277 return l10n_util::GetNSString(IDS_IOS_SETTINGS_PASSWORD_HIDE_BUTTON); |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
342 } | 385 } |
343 | 386 |
344 #pragma mark - UICollectionViewDelegate | 387 #pragma mark - UICollectionViewDelegate |
345 | 388 |
346 - (void)collectionView:(UICollectionView*)collectionView | 389 - (void)collectionView:(UICollectionView*)collectionView |
347 didSelectItemAtIndexPath:(NSIndexPath*)indexPath { | 390 didSelectItemAtIndexPath:(NSIndexPath*)indexPath { |
348 [super collectionView:collectionView didSelectItemAtIndexPath:indexPath]; | 391 [super collectionView:collectionView didSelectItemAtIndexPath:indexPath]; |
349 NSInteger itemType = | 392 NSInteger itemType = |
350 [self.collectionViewModel itemTypeForIndexPath:indexPath]; | 393 [self.collectionViewModel itemTypeForIndexPath:indexPath]; |
351 switch (itemType) { | 394 switch (itemType) { |
| 395 case ItemTypeCopySite: |
| 396 [self copySite]; |
| 397 break; |
352 case ItemTypeCopyUsername: | 398 case ItemTypeCopyUsername: |
353 [self copyUsername]; | 399 [self copyUsername]; |
354 break; | 400 break; |
355 case ItemTypeShowHide: | 401 case ItemTypeShowHide: |
356 if (_plainTextPasswordShown) { | 402 if (_plainTextPasswordShown) { |
357 [self hidePassword]; | 403 [self hidePassword]; |
358 } else { | 404 } else { |
359 [self showPassword]; | 405 [self showPassword]; |
360 } | 406 } |
361 break; | 407 break; |
(...skipping 26 matching lines...) Expand all Loading... |
388 } | 434 } |
389 | 435 |
390 #pragma mark - ForTesting | 436 #pragma mark - ForTesting |
391 | 437 |
392 - (void)setReauthenticationModule: | 438 - (void)setReauthenticationModule: |
393 (id<ReauthenticationProtocol>)reauthenticationModule { | 439 (id<ReauthenticationProtocol>)reauthenticationModule { |
394 _weakReauthenticationModule = reauthenticationModule; | 440 _weakReauthenticationModule = reauthenticationModule; |
395 } | 441 } |
396 | 442 |
397 @end | 443 @end |
OLD | NEW |