| 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/save_passwords_collection_view_controlle
r.h" | 5 #import "ios/chrome/browser/ui/settings/save_passwords_collection_view_controlle
r.h" |
| 6 | 6 |
| 7 #include <memory> | 7 #include <memory> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/ios/ios_util.h" | 10 #include "base/ios/ios_util.h" |
| 11 #import "base/ios/weak_nsobject.h" | |
| 12 #include "base/logging.h" | 11 #include "base/logging.h" |
| 13 #include "base/mac/foundation_util.h" | 12 #include "base/mac/foundation_util.h" |
| 14 #import "base/mac/objc_property_releaser.h" | 13 |
| 15 #import "base/mac/scoped_nsobject.h" | |
| 16 #include "base/memory/ptr_util.h" | 14 #include "base/memory/ptr_util.h" |
| 17 #include "base/numerics/safe_conversions.h" | 15 #include "base/numerics/safe_conversions.h" |
| 18 #include "base/strings/sys_string_conversions.h" | 16 #include "base/strings/sys_string_conversions.h" |
| 19 #include "base/strings/utf_string_conversions.h" | 17 #include "base/strings/utf_string_conversions.h" |
| 20 #include "components/autofill/core/common/password_form.h" | 18 #include "components/autofill/core/common/password_form.h" |
| 21 #include "components/google/core/browser/google_util.h" | 19 #include "components/google/core/browser/google_util.h" |
| 22 #include "components/keyed_service/core/service_access_type.h" | 20 #include "components/keyed_service/core/service_access_type.h" |
| 23 #include "components/password_manager/core/browser/affiliation_utils.h" | 21 #include "components/password_manager/core/browser/affiliation_utils.h" |
| 24 #include "components/password_manager/core/browser/password_manager_constants.h" | 22 #include "components/password_manager/core/browser/password_manager_constants.h" |
| 25 #include "components/password_manager/core/browser/password_store.h" | 23 #include "components/password_manager/core/browser/password_store.h" |
| (...skipping 15 matching lines...) Expand all Loading... |
| 41 #import "ios/chrome/browser/ui/collection_view/collection_view_model.h" | 39 #import "ios/chrome/browser/ui/collection_view/collection_view_model.h" |
| 42 #import "ios/chrome/browser/ui/settings/password_details_collection_view_control
ler.h" | 40 #import "ios/chrome/browser/ui/settings/password_details_collection_view_control
ler.h" |
| 43 #import "ios/chrome/browser/ui/settings/reauthentication_module.h" | 41 #import "ios/chrome/browser/ui/settings/reauthentication_module.h" |
| 44 #import "ios/chrome/browser/ui/settings/settings_utils.h" | 42 #import "ios/chrome/browser/ui/settings/settings_utils.h" |
| 45 #import "ios/chrome/browser/ui/settings/utils/pref_backed_boolean.h" | 43 #import "ios/chrome/browser/ui/settings/utils/pref_backed_boolean.h" |
| 46 #include "ios/chrome/grit/ios_strings.h" | 44 #include "ios/chrome/grit/ios_strings.h" |
| 47 #import "ios/third_party/material_components_ios/src/components/Palettes/src/Mat
erialPalettes.h" | 45 #import "ios/third_party/material_components_ios/src/components/Palettes/src/Mat
erialPalettes.h" |
| 48 #include "ui/base/l10n/l10n_util_mac.h" | 46 #include "ui/base/l10n/l10n_util_mac.h" |
| 49 #include "url/gurl.h" | 47 #include "url/gurl.h" |
| 50 | 48 |
| 49 #if !defined(__has_feature) || !__has_feature(objc_arc) |
| 50 #error "This file requires ARC support." |
| 51 #endif |
| 52 |
| 51 namespace { | 53 namespace { |
| 52 | 54 |
| 53 typedef NS_ENUM(NSInteger, SectionIdentifier) { | 55 typedef NS_ENUM(NSInteger, SectionIdentifier) { |
| 54 SectionIdentifierMessage = kSectionIdentifierEnumZero, | 56 SectionIdentifierMessage = kSectionIdentifierEnumZero, |
| 55 SectionIdentifierSavePasswordsSwitch, | 57 SectionIdentifierSavePasswordsSwitch, |
| 56 SectionIdentifierSavedPasswords, | 58 SectionIdentifierSavedPasswords, |
| 57 SectionIdentifierBlacklist, | 59 SectionIdentifierBlacklist, |
| 58 }; | 60 }; |
| 59 | 61 |
| 60 typedef NS_ENUM(NSInteger, ItemType) { | 62 typedef NS_ENUM(NSInteger, ItemType) { |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 124 @end | 126 @end |
| 125 @implementation BlacklistedFormContentItem | 127 @implementation BlacklistedFormContentItem |
| 126 @end | 128 @end |
| 127 | 129 |
| 128 @interface SavePasswordsCollectionViewController ()< | 130 @interface SavePasswordsCollectionViewController ()< |
| 129 BooleanObserver, | 131 BooleanObserver, |
| 130 PasswordDetailsCollectionViewControllerDelegate, | 132 PasswordDetailsCollectionViewControllerDelegate, |
| 131 SuccessfulReauthTimeAccessor> { | 133 SuccessfulReauthTimeAccessor> { |
| 132 // The observable boolean that binds to the password manager setting state. | 134 // The observable boolean that binds to the password manager setting state. |
| 133 // Saved passwords are only on if the password manager is enabled. | 135 // Saved passwords are only on if the password manager is enabled. |
| 134 base::scoped_nsobject<PrefBackedBoolean> passwordManagerEnabled_; | 136 PrefBackedBoolean* passwordManagerEnabled_; |
| 135 // The item related to the switch for the password manager setting. | 137 // The item related to the switch for the password manager setting. |
| 136 base::scoped_nsobject<CollectionViewSwitchItem> savePasswordsItem_; | 138 CollectionViewSwitchItem* savePasswordsItem_; |
| 137 // The interface for getting and manipulating a user's saved passwords. | 139 // The interface for getting and manipulating a user's saved passwords. |
| 138 scoped_refptr<password_manager::PasswordStore> passwordStore_; | 140 scoped_refptr<password_manager::PasswordStore> passwordStore_; |
| 139 // A helper object for passing data about saved passwords from a finished | 141 // A helper object for passing data about saved passwords from a finished |
| 140 // password store request to the SavePasswordsCollectionViewController. | 142 // password store request to the SavePasswordsCollectionViewController. |
| 141 std::unique_ptr<password_manager::SavePasswordsConsumer> | 143 std::unique_ptr<password_manager::SavePasswordsConsumer> |
| 142 savedPasswordsConsumer_; | 144 savedPasswordsConsumer_; |
| 143 // A helper object for passing data about blacklisted sites from a finished | 145 // A helper object for passing data about blacklisted sites from a finished |
| 144 // password store request to the SavePasswordsCollectionViewController. | 146 // password store request to the SavePasswordsCollectionViewController. |
| 145 std::unique_ptr<password_manager::SavePasswordsConsumer> | 147 std::unique_ptr<password_manager::SavePasswordsConsumer> |
| 146 blacklistPasswordsConsumer_; | 148 blacklistPasswordsConsumer_; |
| 147 // The list of the user's saved passwords. | 149 // The list of the user's saved passwords. |
| 148 std::vector<std::unique_ptr<autofill::PasswordForm>> savedForms_; | 150 std::vector<std::unique_ptr<autofill::PasswordForm>> savedForms_; |
| 149 // The list of the user's blacklisted sites. | 151 // The list of the user's blacklisted sites. |
| 150 std::vector<std::unique_ptr<autofill::PasswordForm>> blacklistedForms_; | 152 std::vector<std::unique_ptr<autofill::PasswordForm>> blacklistedForms_; |
| 151 // Deletion of password being asynchronous, and the method taking a reference | 153 // Deletion of password being asynchronous, and the method taking a reference |
| 152 // to the PasswordForm, the PasswordForm must outlive the calls to | 154 // to the PasswordForm, the PasswordForm must outlive the calls to |
| 153 // RemoveLogin. This vector will ensure this. | 155 // RemoveLogin. This vector will ensure this. |
| 154 std::vector<std::unique_ptr<autofill::PasswordForm>> deletedForms_; | 156 std::vector<std::unique_ptr<autofill::PasswordForm>> deletedForms_; |
| 155 // The current Chrome browser state. | 157 // The current Chrome browser state. |
| 156 ios::ChromeBrowserState* browserState_; | 158 ios::ChromeBrowserState* browserState_; |
| 157 // Object storing the time of the previous successful re-authentication. | 159 // Object storing the time of the previous successful re-authentication. |
| 158 // This is meant to be used by the |ReauthenticationModule| for keeping | 160 // This is meant to be used by the |ReauthenticationModule| for keeping |
| 159 // re-authentications valid for a certain time interval within the scope | 161 // re-authentications valid for a certain time interval within the scope |
| 160 // of the Save Passwords Settings. | 162 // of the Save Passwords Settings. |
| 161 base::scoped_nsobject<NSDate> successfulReauthTime_; | 163 NSDate* successfulReauthTime_; |
| 162 // Module containing the reauthentication mechanism for viewing and copying | 164 // Module containing the reauthentication mechanism for viewing and copying |
| 163 // passwords. | 165 // passwords. |
| 164 base::scoped_nsobject<ReauthenticationModule> reauthenticationModule_; | 166 ReauthenticationModule* reauthenticationModule_; |
| 165 | |
| 166 base::mac::ObjCPropertyReleaser | |
| 167 propertyReleaser_SavePasswordsCollectionViewController_; | |
| 168 } | 167 } |
| 169 // Kick off async request to get logins from password store. | 168 // Kick off async request to get logins from password store. |
| 170 - (void)getLoginsFromPasswordStore; | 169 - (void)getLoginsFromPasswordStore; |
| 171 @end | 170 @end |
| 172 | 171 |
| 173 @implementation SavePasswordsCollectionViewController | 172 @implementation SavePasswordsCollectionViewController |
| 174 | 173 |
| 175 #pragma mark - Initialization | 174 #pragma mark - Initialization |
| 176 | 175 |
| 177 - (instancetype)initWithBrowserState:(ios::ChromeBrowserState*)browserState { | 176 - (instancetype)initWithBrowserState:(ios::ChromeBrowserState*)browserState { |
| 178 DCHECK(browserState); | 177 DCHECK(browserState); |
| 179 self = [super initWithStyle:CollectionViewControllerStyleAppBar]; | 178 self = [super initWithStyle:CollectionViewControllerStyleAppBar]; |
| 180 if (self) { | 179 if (self) { |
| 181 browserState_ = browserState; | 180 browserState_ = browserState; |
| 182 reauthenticationModule_.reset([[ReauthenticationModule alloc] | 181 reauthenticationModule_ = [[ReauthenticationModule alloc] |
| 183 initWithSuccessfulReauthTimeAccessor:self]); | 182 initWithSuccessfulReauthTimeAccessor:self]; |
| 184 self.title = l10n_util::GetNSString(IDS_IOS_SAVE_PASSWORDS); | 183 self.title = l10n_util::GetNSString(IDS_IOS_SAVE_PASSWORDS); |
| 185 self.shouldHideDoneButton = YES; | 184 self.shouldHideDoneButton = YES; |
| 186 passwordStore_ = IOSChromePasswordStoreFactory::GetForBrowserState( | 185 passwordStore_ = IOSChromePasswordStoreFactory::GetForBrowserState( |
| 187 browserState_, ServiceAccessType::EXPLICIT_ACCESS); | 186 browserState_, ServiceAccessType::EXPLICIT_ACCESS); |
| 188 DCHECK(passwordStore_); | 187 DCHECK(passwordStore_); |
| 189 passwordManagerEnabled_.reset([[PrefBackedBoolean alloc] | 188 passwordManagerEnabled_ = [[PrefBackedBoolean alloc] |
| 190 initWithPrefService:browserState_->GetPrefs() | 189 initWithPrefService:browserState_->GetPrefs() |
| 191 prefName:password_manager::prefs:: | 190 prefName:password_manager::prefs:: |
| 192 kPasswordManagerSavingEnabled]); | 191 kPasswordManagerSavingEnabled]; |
| 193 [passwordManagerEnabled_ setObserver:self]; | 192 [passwordManagerEnabled_ setObserver:self]; |
| 194 [self getLoginsFromPasswordStore]; | 193 [self getLoginsFromPasswordStore]; |
| 195 [self updateEditButton]; | 194 [self updateEditButton]; |
| 196 [self loadModel]; | 195 [self loadModel]; |
| 197 | |
| 198 propertyReleaser_SavePasswordsCollectionViewController_.Init( | |
| 199 self, [SavePasswordsCollectionViewController class]); | |
| 200 } | 196 } |
| 201 return self; | 197 return self; |
| 202 } | 198 } |
| 203 | 199 |
| 204 - (void)dealloc { | 200 - (void)dealloc { |
| 205 [passwordManagerEnabled_ setObserver:nil]; | 201 [passwordManagerEnabled_ setObserver:nil]; |
| 206 [super dealloc]; | |
| 207 } | 202 } |
| 208 | 203 |
| 209 #pragma mark - SettingsRootCollectionViewController | 204 #pragma mark - SettingsRootCollectionViewController |
| 210 | 205 |
| 211 - (void)loadModel { | 206 - (void)loadModel { |
| 212 [super loadModel]; | 207 [super loadModel]; |
| 213 CollectionViewModel* model = self.collectionViewModel; | 208 CollectionViewModel* model = self.collectionViewModel; |
| 214 | 209 |
| 215 // Manage account message. | 210 // Manage account message. |
| 216 CollectionViewItem* manageAccountLinkItem = [self manageAccountLinkItem]; | 211 CollectionViewItem* manageAccountLinkItem = [self manageAccountLinkItem]; |
| 217 if (manageAccountLinkItem) { | 212 if (manageAccountLinkItem) { |
| 218 [model addSectionWithIdentifier:SectionIdentifierMessage]; | 213 [model addSectionWithIdentifier:SectionIdentifierMessage]; |
| 219 [model addItem:manageAccountLinkItem | 214 [model addItem:manageAccountLinkItem |
| 220 toSectionWithIdentifier:SectionIdentifierMessage]; | 215 toSectionWithIdentifier:SectionIdentifierMessage]; |
| 221 } | 216 } |
| 222 | 217 |
| 223 // Save passwords switch. | 218 // Save passwords switch. |
| 224 [model addSectionWithIdentifier:SectionIdentifierSavePasswordsSwitch]; | 219 [model addSectionWithIdentifier:SectionIdentifierSavePasswordsSwitch]; |
| 225 savePasswordsItem_.reset([[self savePasswordsItem] retain]); | 220 savePasswordsItem_ = [self savePasswordsItem]; |
| 226 [model addItem:savePasswordsItem_ | 221 [model addItem:savePasswordsItem_ |
| 227 toSectionWithIdentifier:SectionIdentifierSavePasswordsSwitch]; | 222 toSectionWithIdentifier:SectionIdentifierSavePasswordsSwitch]; |
| 228 | 223 |
| 229 // Saved passwords. | 224 // Saved passwords. |
| 230 if ([passwordManagerEnabled_ value]) { | 225 if ([passwordManagerEnabled_ value]) { |
| 231 if (!savedForms_.empty()) { | 226 if (!savedForms_.empty()) { |
| 232 [model addSectionWithIdentifier:SectionIdentifierSavedPasswords]; | 227 [model addSectionWithIdentifier:SectionIdentifierSavedPasswords]; |
| 233 CollectionViewTextItem* headerItem = [[[CollectionViewTextItem alloc] | 228 CollectionViewTextItem* headerItem = |
| 234 initWithType:ItemTypeHeader] autorelease]; | 229 [[CollectionViewTextItem alloc] initWithType:ItemTypeHeader]; |
| 235 headerItem.text = | 230 headerItem.text = |
| 236 l10n_util::GetNSString(IDS_PASSWORD_MANAGER_SHOW_PASSWORDS_TAB_TITLE); | 231 l10n_util::GetNSString(IDS_PASSWORD_MANAGER_SHOW_PASSWORDS_TAB_TITLE); |
| 237 headerItem.textColor = [[MDCPalette greyPalette] tint500]; | 232 headerItem.textColor = [[MDCPalette greyPalette] tint500]; |
| 238 [model setHeader:headerItem | 233 [model setHeader:headerItem |
| 239 forSectionWithIdentifier:SectionIdentifierSavedPasswords]; | 234 forSectionWithIdentifier:SectionIdentifierSavedPasswords]; |
| 240 for (const auto& form : savedForms_) { | 235 for (const auto& form : savedForms_) { |
| 241 [model addItem:[self savedFormItemWithForm:form.get()] | 236 [model addItem:[self savedFormItemWithForm:form.get()] |
| 242 toSectionWithIdentifier:SectionIdentifierSavedPasswords]; | 237 toSectionWithIdentifier:SectionIdentifierSavedPasswords]; |
| 243 } | 238 } |
| 244 } | 239 } |
| 245 if (!blacklistedForms_.empty()) { | 240 if (!blacklistedForms_.empty()) { |
| 246 [model addSectionWithIdentifier:SectionIdentifierBlacklist]; | 241 [model addSectionWithIdentifier:SectionIdentifierBlacklist]; |
| 247 CollectionViewTextItem* headerItem = [[[CollectionViewTextItem alloc] | 242 CollectionViewTextItem* headerItem = |
| 248 initWithType:ItemTypeHeader] autorelease]; | 243 [[CollectionViewTextItem alloc] initWithType:ItemTypeHeader]; |
| 249 headerItem.text = | 244 headerItem.text = |
| 250 l10n_util::GetNSString(IDS_PASSWORD_MANAGER_EXCEPTIONS_TAB_TITLE); | 245 l10n_util::GetNSString(IDS_PASSWORD_MANAGER_EXCEPTIONS_TAB_TITLE); |
| 251 headerItem.textColor = [[MDCPalette greyPalette] tint500]; | 246 headerItem.textColor = [[MDCPalette greyPalette] tint500]; |
| 252 [model setHeader:headerItem | 247 [model setHeader:headerItem |
| 253 forSectionWithIdentifier:SectionIdentifierBlacklist]; | 248 forSectionWithIdentifier:SectionIdentifierBlacklist]; |
| 254 for (const auto& form : blacklistedForms_) { | 249 for (const auto& form : blacklistedForms_) { |
| 255 [model addItem:[self blacklistedFormItemWithForm:form.get()] | 250 [model addItem:[self blacklistedFormItemWithForm:form.get()] |
| 256 toSectionWithIdentifier:SectionIdentifierBlacklist]; | 251 toSectionWithIdentifier:SectionIdentifierBlacklist]; |
| 257 } | 252 } |
| 258 } | 253 } |
| 259 } | 254 } |
| 260 } | 255 } |
| 261 | 256 |
| 262 #pragma mark - Items | 257 #pragma mark - Items |
| 263 | 258 |
| 264 - (CollectionViewItem*)manageAccountLinkItem { | 259 - (CollectionViewItem*)manageAccountLinkItem { |
| 265 CollectionViewFooterItem* footerItem = [[[CollectionViewFooterItem alloc] | 260 CollectionViewFooterItem* footerItem = |
| 266 initWithType:ItemTypeManageAccount] autorelease]; | 261 [[CollectionViewFooterItem alloc] initWithType:ItemTypeManageAccount]; |
| 267 footerItem.text = | 262 footerItem.text = |
| 268 l10n_util::GetNSString(IDS_IOS_SAVE_PASSWORDS_MANAGE_ACCOUNT); | 263 l10n_util::GetNSString(IDS_IOS_SAVE_PASSWORDS_MANAGE_ACCOUNT); |
| 269 footerItem.linkURL = google_util::AppendGoogleLocaleParam( | 264 footerItem.linkURL = google_util::AppendGoogleLocaleParam( |
| 270 GURL(password_manager::kPasswordManagerAccountDashboardURL), | 265 GURL(password_manager::kPasswordManagerAccountDashboardURL), |
| 271 GetApplicationContext()->GetApplicationLocale()); | 266 GetApplicationContext()->GetApplicationLocale()); |
| 272 footerItem.linkDelegate = self; | 267 footerItem.linkDelegate = self; |
| 273 return footerItem; | 268 return footerItem; |
| 274 } | 269 } |
| 275 | 270 |
| 276 - (CollectionViewSwitchItem*)savePasswordsItem { | 271 - (CollectionViewSwitchItem*)savePasswordsItem { |
| 277 CollectionViewSwitchItem* savePasswordsItem = | 272 CollectionViewSwitchItem* savePasswordsItem = |
| 278 [[[CollectionViewSwitchItem alloc] | 273 [[CollectionViewSwitchItem alloc] |
| 279 initWithType:ItemTypeSavePasswordsSwitch] autorelease]; | 274 initWithType:ItemTypeSavePasswordsSwitch]; |
| 280 savePasswordsItem.text = l10n_util::GetNSString(IDS_IOS_SAVE_PASSWORDS); | 275 savePasswordsItem.text = l10n_util::GetNSString(IDS_IOS_SAVE_PASSWORDS); |
| 281 savePasswordsItem.on = [passwordManagerEnabled_ value]; | 276 savePasswordsItem.on = [passwordManagerEnabled_ value]; |
| 282 return savePasswordsItem; | 277 return savePasswordsItem; |
| 283 } | 278 } |
| 284 | 279 |
| 285 - (SavedFormContentItem*)savedFormItemWithForm:(autofill::PasswordForm*)form { | 280 - (SavedFormContentItem*)savedFormItemWithForm:(autofill::PasswordForm*)form { |
| 286 SavedFormContentItem* passwordItem = [[[SavedFormContentItem alloc] | 281 SavedFormContentItem* passwordItem = |
| 287 initWithType:ItemTypeSavedPassword] autorelease]; | 282 [[SavedFormContentItem alloc] initWithType:ItemTypeSavedPassword]; |
| 288 passwordItem.text = | 283 passwordItem.text = |
| 289 base::SysUTF8ToNSString(GetHumanReadableOriginCopy(*form)); | 284 base::SysUTF8ToNSString(GetHumanReadableOriginCopy(*form)); |
| 290 passwordItem.detailText = base::SysUTF16ToNSString(form->username_value); | 285 passwordItem.detailText = base::SysUTF16ToNSString(form->username_value); |
| 291 if (experimental_flags::IsViewCopyPasswordsEnabled()) { | 286 if (experimental_flags::IsViewCopyPasswordsEnabled()) { |
| 292 passwordItem.accessibilityTraits |= UIAccessibilityTraitButton; | 287 passwordItem.accessibilityTraits |= UIAccessibilityTraitButton; |
| 293 passwordItem.accessoryType = | 288 passwordItem.accessoryType = |
| 294 MDCCollectionViewCellAccessoryDisclosureIndicator; | 289 MDCCollectionViewCellAccessoryDisclosureIndicator; |
| 295 } | 290 } |
| 296 return passwordItem; | 291 return passwordItem; |
| 297 } | 292 } |
| 298 | 293 |
| 299 - (BlacklistedFormContentItem*)blacklistedFormItemWithForm: | 294 - (BlacklistedFormContentItem*)blacklistedFormItemWithForm: |
| 300 (autofill::PasswordForm*)form { | 295 (autofill::PasswordForm*)form { |
| 301 BlacklistedFormContentItem* passwordItem = | 296 BlacklistedFormContentItem* passwordItem = |
| 302 [[[BlacklistedFormContentItem alloc] initWithType:ItemTypeBlacklisted] | 297 [[BlacklistedFormContentItem alloc] initWithType:ItemTypeBlacklisted]; |
| 303 autorelease]; | |
| 304 passwordItem.text = | 298 passwordItem.text = |
| 305 base::SysUTF8ToNSString(GetHumanReadableOriginCopy(*form)); | 299 base::SysUTF8ToNSString(GetHumanReadableOriginCopy(*form)); |
| 306 return passwordItem; | 300 return passwordItem; |
| 307 } | 301 } |
| 308 | 302 |
| 309 #pragma mark - MDCCollectionViewEditingDelegate | 303 #pragma mark - MDCCollectionViewEditingDelegate |
| 310 | 304 |
| 311 - (BOOL)collectionViewAllowsEditing:(UICollectionView*)collectionView { | 305 - (BOOL)collectionViewAllowsEditing:(UICollectionView*)collectionView { |
| 312 return YES; | 306 return YES; |
| 313 } | 307 } |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 382 [switchCell.switchView addTarget:self | 376 [switchCell.switchView addTarget:self |
| 383 action:@selector(savePasswordsSwitchChanged:) | 377 action:@selector(savePasswordsSwitchChanged:) |
| 384 forControlEvents:UIControlEventValueChanged]; | 378 forControlEvents:UIControlEventValueChanged]; |
| 385 } | 379 } |
| 386 return cell; | 380 return cell; |
| 387 } | 381 } |
| 388 | 382 |
| 389 #pragma mark - BooleanObserver | 383 #pragma mark - BooleanObserver |
| 390 | 384 |
| 391 - (void)booleanDidChange:(id<ObservableBoolean>)observableBoolean { | 385 - (void)booleanDidChange:(id<ObservableBoolean>)observableBoolean { |
| 392 DCHECK_EQ(observableBoolean, passwordManagerEnabled_.get()); | 386 DCHECK_EQ(observableBoolean, passwordManagerEnabled_); |
| 393 | 387 |
| 394 // Update the item. | 388 // Update the item. |
| 395 savePasswordsItem_.get().on = [passwordManagerEnabled_ value]; | 389 savePasswordsItem_.on = [passwordManagerEnabled_ value]; |
| 396 | 390 |
| 397 // Update the cell. | 391 // Update the cell. |
| 398 [self reconfigureCellsForItems:@[ savePasswordsItem_ ]]; | 392 [self reconfigureCellsForItems:@[ savePasswordsItem_ ]]; |
| 399 | 393 |
| 400 // Update the rest of the UI. | 394 // Update the rest of the UI. |
| 401 [self.editor setEditing:NO]; | 395 [self.editor setEditing:NO]; |
| 402 [self updateEditButton]; | 396 [self updateEditButton]; |
| 403 [self reloadData]; | 397 [self reloadData]; |
| 404 } | 398 } |
| 405 | 399 |
| 406 #pragma mark - Actions | 400 #pragma mark - Actions |
| 407 | 401 |
| 408 - (void)savePasswordsSwitchChanged:(UISwitch*)switchView { | 402 - (void)savePasswordsSwitchChanged:(UISwitch*)switchView { |
| 409 // Update the setting. | 403 // Update the setting. |
| 410 [passwordManagerEnabled_ setValue:switchView.on]; | 404 [passwordManagerEnabled_ setValue:switchView.on]; |
| 411 | 405 |
| 412 // Update the item. | 406 // Update the item. |
| 413 savePasswordsItem_.get().on = [passwordManagerEnabled_ value]; | 407 savePasswordsItem_.on = [passwordManagerEnabled_ value]; |
| 414 | 408 |
| 415 // Update the rest of the UI. | 409 // Update the rest of the UI. |
| 416 [self.editor setEditing:NO]; | 410 [self.editor setEditing:NO]; |
| 417 [self updateEditButton]; | 411 [self updateEditButton]; |
| 418 [self reloadData]; | 412 [self reloadData]; |
| 419 } | 413 } |
| 420 | 414 |
| 421 #pragma mark - Private methods | 415 #pragma mark - Private methods |
| 422 | 416 |
| 423 - (void)getLoginsFromPasswordStore { | 417 - (void)getLoginsFromPasswordStore { |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 468 if ([model itemTypeForIndexPath:indexPath] == ItemTypeSavedPassword) { | 462 if ([model itemTypeForIndexPath:indexPath] == ItemTypeSavedPassword) { |
| 469 DCHECK_EQ([model sectionIdentifierForSection:indexPath.section], | 463 DCHECK_EQ([model sectionIdentifierForSection:indexPath.section], |
| 470 SectionIdentifierSavedPasswords); | 464 SectionIdentifierSavedPasswords); |
| 471 if (experimental_flags::IsViewCopyPasswordsEnabled()) { | 465 if (experimental_flags::IsViewCopyPasswordsEnabled()) { |
| 472 DCHECK_LT(base::checked_cast<size_t>(indexPath.item), savedForms_.size()); | 466 DCHECK_LT(base::checked_cast<size_t>(indexPath.item), savedForms_.size()); |
| 473 autofill::PasswordForm* form = savedForms_[indexPath.item].get(); | 467 autofill::PasswordForm* form = savedForms_[indexPath.item].get(); |
| 474 NSString* username = base::SysUTF16ToNSString(form->username_value); | 468 NSString* username = base::SysUTF16ToNSString(form->username_value); |
| 475 NSString* password = base::SysUTF16ToNSString(form->password_value); | 469 NSString* password = base::SysUTF16ToNSString(form->password_value); |
| 476 NSString* origin = | 470 NSString* origin = |
| 477 base::SysUTF8ToNSString(GetHumanReadableOriginCopy(*form)); | 471 base::SysUTF8ToNSString(GetHumanReadableOriginCopy(*form)); |
| 478 base::scoped_nsobject<UIViewController> controller( | 472 UIViewController* controller = |
| 479 [[PasswordDetailsCollectionViewController alloc] | 473 [[PasswordDetailsCollectionViewController alloc] |
| 480 initWithPasswordForm:*form | 474 initWithPasswordForm:*form |
| 481 delegate:self | 475 delegate:self |
| 482 reauthenticationModule:reauthenticationModule_ | 476 reauthenticationModule:reauthenticationModule_ |
| 483 username:username | 477 username:username |
| 484 password:password | 478 password:password |
| 485 origin:origin]); | 479 origin:origin]; |
| 486 [self.navigationController pushViewController:controller animated:YES]; | 480 [self.navigationController pushViewController:controller animated:YES]; |
| 487 } | 481 } |
| 488 } | 482 } |
| 489 } | 483 } |
| 490 | 484 |
| 491 #pragma mark MDCCollectionViewEditingDelegate | 485 #pragma mark MDCCollectionViewEditingDelegate |
| 492 | 486 |
| 493 - (BOOL)collectionView:(UICollectionView*)collectionView | 487 - (BOOL)collectionView:(UICollectionView*)collectionView |
| 494 canEditItemAtIndexPath:(NSIndexPath*)indexPath { | 488 canEditItemAtIndexPath:(NSIndexPath*)indexPath { |
| 495 // Only password cells are editable. | 489 // Only password cells are editable. |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 542 NSMutableOrderedSet* sectionsToRemove = [NSMutableOrderedSet orderedSet]; | 536 NSMutableOrderedSet* sectionsToRemove = [NSMutableOrderedSet orderedSet]; |
| 543 // Sort and enumerate in reverse order to delete the items from the collection | 537 // Sort and enumerate in reverse order to delete the items from the collection |
| 544 // view model. | 538 // view model. |
| 545 NSArray* sortedIndexPaths = | 539 NSArray* sortedIndexPaths = |
| 546 [indexPaths sortedArrayUsingSelector:@selector(compare:)]; | 540 [indexPaths sortedArrayUsingSelector:@selector(compare:)]; |
| 547 for (NSIndexPath* indexPath in [sortedIndexPaths reverseObjectEnumerator]) { | 541 for (NSIndexPath* indexPath in [sortedIndexPaths reverseObjectEnumerator]) { |
| 548 if ([collectionView numberOfItemsInSection:indexPath.section] == 0) { | 542 if ([collectionView numberOfItemsInSection:indexPath.section] == 0) { |
| 549 [sectionsToRemove addObject:@(indexPath.section)]; | 543 [sectionsToRemove addObject:@(indexPath.section)]; |
| 550 } | 544 } |
| 551 } | 545 } |
| 552 base::WeakNSObject<SavePasswordsCollectionViewController> weakSelf(self); | 546 __weak SavePasswordsCollectionViewController* weakSelf = self; |
| 553 [self.collectionView performBatchUpdates:^{ | 547 [self.collectionView performBatchUpdates:^{ |
| 554 base::scoped_nsobject<SavePasswordsCollectionViewController> strongSelf( | 548 SavePasswordsCollectionViewController* strongSelf = weakSelf; |
| 555 [weakSelf retain]); | |
| 556 if (!strongSelf) | 549 if (!strongSelf) |
| 557 return; | 550 return; |
| 558 for (NSNumber* sectionNumber in sectionsToRemove) { | 551 for (NSNumber* sectionNumber in sectionsToRemove) { |
| 559 NSInteger section = [sectionNumber integerValue]; | 552 NSInteger section = [sectionNumber integerValue]; |
| 560 NSInteger sectionIdentifier = [[strongSelf collectionViewModel] | 553 NSInteger sectionIdentifier = [[strongSelf collectionViewModel] |
| 561 sectionIdentifierForSection:section]; | 554 sectionIdentifierForSection:section]; |
| 562 [[strongSelf collectionViewModel] | 555 [[strongSelf collectionViewModel] |
| 563 removeSectionWithIdentifier:sectionIdentifier]; | 556 removeSectionWithIdentifier:sectionIdentifier]; |
| 564 [[strongSelf collectionView] | 557 [[strongSelf collectionView] |
| 565 deleteSections:[NSIndexSet indexSetWithIndex:section]]; | 558 deleteSections:[NSIndexSet indexSetWithIndex:section]]; |
| 566 } | 559 } |
| 567 } | 560 } |
| 568 completion:^(BOOL finished) { | 561 completion:^(BOOL finished) { |
| 569 base::scoped_nsobject<SavePasswordsCollectionViewController> strongSelf( | 562 SavePasswordsCollectionViewController* strongSelf = weakSelf; |
| 570 [weakSelf retain]); | |
| 571 if (!strongSelf) | 563 if (!strongSelf) |
| 572 return; | 564 return; |
| 573 if (![strongSelf editButtonEnabled]) { | 565 if (![strongSelf editButtonEnabled]) { |
| 574 [strongSelf setEditing:NO]; | 566 [strongSelf setEditing:NO]; |
| 575 } | 567 } |
| 576 [strongSelf updateEditButton]; | 568 [strongSelf updateEditButton]; |
| 577 }]; | 569 }]; |
| 578 } | 570 } |
| 579 | 571 |
| 580 #pragma mark PasswordDetailsCollectionViewControllerDelegate | 572 #pragma mark PasswordDetailsCollectionViewControllerDelegate |
| 581 | 573 |
| 582 - (void)deletePassword:(const autofill::PasswordForm&)form { | 574 - (void)deletePassword:(const autofill::PasswordForm&)form { |
| 583 passwordStore_->RemoveLogin(form); | 575 passwordStore_->RemoveLogin(form); |
| 584 for (auto it = savedForms_.begin(); it != savedForms_.end(); ++it) { | 576 for (auto it = savedForms_.begin(); it != savedForms_.end(); ++it) { |
| 585 if (**it == form) { | 577 if (**it == form) { |
| 586 savedForms_.erase(it); | 578 savedForms_.erase(it); |
| 587 return; | 579 return; |
| 588 } | 580 } |
| 589 } | 581 } |
| 590 [self.navigationController popViewControllerAnimated:YES]; | 582 [self.navigationController popViewControllerAnimated:YES]; |
| 591 } | 583 } |
| 592 | 584 |
| 593 #pragma mark SuccessfulReauthTimeAccessor | 585 #pragma mark SuccessfulReauthTimeAccessor |
| 594 | 586 |
| 595 - (void)updateSuccessfulReauthTime { | 587 - (void)updateSuccessfulReauthTime { |
| 596 successfulReauthTime_.reset([[NSDate alloc] init]); | 588 successfulReauthTime_ = [[NSDate alloc] init]; |
| 597 } | 589 } |
| 598 | 590 |
| 599 - (NSDate*)lastSuccessfulReauthTime { | 591 - (NSDate*)lastSuccessfulReauthTime { |
| 600 return successfulReauthTime_.get(); | 592 return successfulReauthTime_; |
| 601 } | 593 } |
| 602 | 594 |
| 603 @end | 595 @end |
| OLD | NEW |