| Index: ios/chrome/browser/autofill/form_suggestion_controller.mm
|
| diff --git a/ios/chrome/browser/autofill/form_suggestion_controller.mm b/ios/chrome/browser/autofill/form_suggestion_controller.mm
|
| index 3e96631b386bcff900b7a6dd0fe01135d4a0515f..4fe75f1f24a3d01d36a28348d140363ba7befc67 100644
|
| --- a/ios/chrome/browser/autofill/form_suggestion_controller.mm
|
| +++ b/ios/chrome/browser/autofill/form_suggestion_controller.mm
|
| @@ -7,10 +7,8 @@
|
| #include <memory>
|
|
|
| #include "base/ios/ios_util.h"
|
| -#include "base/ios/weak_nsobject.h"
|
| #include "base/mac/foundation_util.h"
|
| #include "base/mac/scoped_block.h"
|
| -#include "base/mac/scoped_nsobject.h"
|
| #include "base/strings/sys_string_conversions.h"
|
| #include "base/strings/utf_string_conversions.h"
|
| #include "components/autofill/core/browser/autofill_popup_delegate.h"
|
| @@ -25,6 +23,10 @@
|
| #import "ios/web/public/web_state/ui/crw_web_view_proxy.h"
|
| #import "ios/web/public/web_state/web_state.h"
|
|
|
| +#if !defined(__has_feature) || !__has_feature(objc_arc)
|
| +#error "This file requires ARC support."
|
| +#endif
|
| +
|
| namespace {
|
|
|
| // Struct that describes suggestion state.
|
| @@ -39,7 +41,7 @@ struct AutofillSuggestionState {
|
| // The user-typed value in the field.
|
| std::string typed_value;
|
| // The suggestions for the form field. An array of |FormSuggestion|.
|
| - base::scoped_nsobject<NSArray> suggestions;
|
| + NSArray* suggestions;
|
| };
|
|
|
| AutofillSuggestionState::AutofillSuggestionState(const std::string& form_name,
|
| @@ -52,21 +54,20 @@ AutofillSuggestionState::AutofillSuggestionState(const std::string& form_name,
|
|
|
| @interface FormSuggestionController () <FormInputAccessoryViewProvider> {
|
| // Form navigation delegate.
|
| - base::WeakNSProtocol<id<FormInputAccessoryViewDelegate>> _delegate;
|
| + __weak id<FormInputAccessoryViewDelegate> _delegate;
|
|
|
| // Callback to update the accessory view.
|
| - base::mac::ScopedBlock<AccessoryViewReadyCompletion>
|
| - accessoryViewUpdateBlock_;
|
| + AccessoryViewReadyCompletion accessoryViewUpdateBlock_;
|
|
|
| // Autofill suggestion state.
|
| std::unique_ptr<AutofillSuggestionState> _suggestionState;
|
|
|
| // Providers for suggestions, sorted according to the order in which
|
| // they should be asked for suggestions, with highest priority in front.
|
| - base::scoped_nsobject<NSArray> _suggestionProviders;
|
| + NSArray* _suggestionProviders;
|
|
|
| // Access to WebView from the CRWWebController.
|
| - base::scoped_nsprotocol<id<CRWWebViewProxy>> _webViewProxy;
|
| + id<CRWWebViewProxy> _webViewProxy;
|
| }
|
|
|
| // Returns an autoreleased input accessory view that shows |suggestions|.
|
| @@ -88,7 +89,7 @@ AutofillSuggestionState::AutofillSuggestionState(const std::string& form_name,
|
| std::unique_ptr<web::WebStateObserverBridge> _webStateObserverBridge;
|
|
|
| // Manager for FormSuggestion JavaScripts.
|
| - base::scoped_nsobject<JsSuggestionManager> _jsSuggestionManager;
|
| + JsSuggestionManager* _jsSuggestionManager;
|
|
|
| // The provider for the current set of suggestions.
|
| __unsafe_unretained id<FormSuggestionProvider> _provider; // weak
|
| @@ -101,9 +102,9 @@ AutofillSuggestionState::AutofillSuggestionState(const std::string& form_name,
|
| if (self) {
|
| _webStateObserverBridge.reset(
|
| new web::WebStateObserverBridge(webState, self));
|
| - _webViewProxy.reset([webState->GetWebViewProxy() retain]);
|
| - _jsSuggestionManager.reset([jsSuggestionManager retain]);
|
| - _suggestionProviders.reset([providers copy]);
|
| + _webViewProxy = webState->GetWebViewProxy();
|
| + _jsSuggestionManager = jsSuggestionManager;
|
| + _suggestionProviders = [providers copy];
|
| }
|
| return self;
|
| }
|
| @@ -153,49 +154,43 @@ AutofillSuggestionState::AutofillSuggestionState(const std::string& form_name,
|
| }
|
|
|
| - (void)setWebViewProxy:(id<CRWWebViewProxy>)webViewProxy {
|
| - _webViewProxy.reset([webViewProxy retain]);
|
| + _webViewProxy = webViewProxy;
|
| }
|
|
|
| - (void)retrieveSuggestionsForFormNamed:(const std::string&)formName
|
| fieldName:(const std::string&)fieldName
|
| type:(const std::string&)type
|
| webState:(web::WebState*)webState {
|
| - base::WeakNSObject<FormSuggestionController> weakSelf(self);
|
| - base::scoped_nsobject<NSString> strongFormName(
|
| - [base::SysUTF8ToNSString(formName) copy]);
|
| - base::scoped_nsobject<NSString> strongFieldName(
|
| - [base::SysUTF8ToNSString(fieldName) copy]);
|
| - base::scoped_nsobject<NSString> strongType(
|
| - [base::SysUTF8ToNSString(type) copy]);
|
| - base::scoped_nsobject<NSString> strongValue(
|
| - [base::SysUTF8ToNSString(_suggestionState.get()->typed_value) copy]);
|
| + __weak FormSuggestionController* weakSelf = self;
|
| + NSString* strongFormName = [base::SysUTF8ToNSString(formName) copy];
|
| + NSString* strongFieldName = [base::SysUTF8ToNSString(fieldName) copy];
|
| + NSString* strongType = [base::SysUTF8ToNSString(type) copy];
|
| + NSString* strongValue =
|
| + [base::SysUTF8ToNSString(_suggestionState.get()->typed_value) copy];
|
|
|
| // Build a block for each provider that will invoke its completion with YES
|
| // if the provider can provide suggestions for the specified form/field/type
|
| // and NO otherwise.
|
| - base::scoped_nsobject<NSMutableArray> findProviderBlocks(
|
| - [[NSMutableArray alloc] init]);
|
| + NSMutableArray* findProviderBlocks = [[NSMutableArray alloc] init];
|
| for (NSUInteger i = 0; i < [_suggestionProviders count]; i++) {
|
| - base::mac::ScopedBlock<passwords::PipelineBlock> block(
|
| + passwords::PipelineBlock block =
|
| ^(void (^completion)(BOOL success)) {
|
| // Access all the providers through |self| to guarantee that both
|
| // |self| and all the providers exist when the block is executed.
|
| // |_suggestionProviders| is immutable, so the subscripting is
|
| // always valid.
|
| - base::scoped_nsobject<FormSuggestionController> strongSelf(
|
| - [weakSelf retain]);
|
| + FormSuggestionController* strongSelf = weakSelf;
|
| if (!strongSelf)
|
| return;
|
| id<FormSuggestionProvider> provider =
|
| - strongSelf.get()->_suggestionProviders[i];
|
| + strongSelf->_suggestionProviders[i];
|
| [provider checkIfSuggestionsAvailableForForm:strongFormName
|
| field:strongFieldName
|
| type:strongType
|
| typedValue:strongValue
|
| webState:webState
|
| completionHandler:completion];
|
| - },
|
| - base::scoped_policy::RETAIN);
|
| + };
|
| [findProviderBlocks addObject:block];
|
| }
|
|
|
| @@ -211,12 +206,11 @@ AutofillSuggestionState::AutofillSuggestionState(const std::string& form_name,
|
| [weakSelf onNoSuggestionsAvailable];
|
| return;
|
| }
|
| - base::scoped_nsobject<FormSuggestionController> strongSelf(
|
| - [weakSelf retain]);
|
| + FormSuggestionController* strongSelf = weakSelf;
|
| if (!strongSelf)
|
| return;
|
| id<FormSuggestionProvider> provider =
|
| - strongSelf.get()->_suggestionProviders[providerIndex];
|
| + strongSelf->_suggestionProviders[providerIndex];
|
| [provider retrieveSuggestionsForForm:strongFormName
|
| field:strongFieldName
|
| type:strongType
|
| @@ -244,7 +238,7 @@ AutofillSuggestionState::AutofillSuggestionState(const std::string& form_name,
|
| }
|
|
|
| _provider = provider;
|
| - _suggestionState->suggestions.reset([suggestions copy]);
|
| + _suggestionState->suggestions = [suggestions copy];
|
| [self updateKeyboard:_suggestionState.get()];
|
| }
|
|
|
| @@ -257,14 +251,14 @@ AutofillSuggestionState::AutofillSuggestionState(const std::string& form_name,
|
| // Note that other parts of the suggestionsState are not reset.
|
| if (!_suggestionState.get())
|
| return;
|
| - _suggestionState->suggestions.reset([[NSArray alloc] init]);
|
| + _suggestionState->suggestions = [[NSArray alloc] init];
|
| [self updateKeyboard:_suggestionState.get()];
|
| }
|
|
|
| - (void)updateKeyboard:(AutofillSuggestionState*)suggestionState {
|
| if (!suggestionState) {
|
| if (accessoryViewUpdateBlock_)
|
| - accessoryViewUpdateBlock_.get()(nil, self);
|
| + accessoryViewUpdateBlock_(nil, self);
|
| } else {
|
| [self updateKeyboardWithSuggestions:suggestionState->suggestions];
|
| }
|
| @@ -272,8 +266,8 @@ AutofillSuggestionState::AutofillSuggestionState(const std::string& form_name,
|
|
|
| - (void)updateKeyboardWithSuggestions:(NSArray*)suggestions {
|
| if (accessoryViewUpdateBlock_) {
|
| - accessoryViewUpdateBlock_.get()(
|
| - [self suggestionViewWithSuggestions:suggestions], self);
|
| + accessoryViewUpdateBlock_([self suggestionViewWithSuggestions:suggestions],
|
| + self);
|
| }
|
| }
|
|
|
| @@ -284,11 +278,11 @@ AutofillSuggestionState::AutofillSuggestionState(const std::string& form_name,
|
| if (IsIPadIdiom()) {
|
| frame.size.height = autofill::kInputAccessoryHeight;
|
| }
|
| - base::scoped_nsobject<FormSuggestionView> view([[FormSuggestionView alloc]
|
| - initWithFrame:frame
|
| - client:self
|
| - suggestions:suggestions]);
|
| - return view.autorelease();
|
| + FormSuggestionView* view =
|
| + [[FormSuggestionView alloc] initWithFrame:frame
|
| + client:self
|
| + suggestions:suggestions];
|
| + return view;
|
| }
|
|
|
| - (void)didSelectSuggestion:(FormSuggestion*)suggestion {
|
| @@ -297,7 +291,7 @@ AutofillSuggestionState::AutofillSuggestionState(const std::string& form_name,
|
|
|
| // Send the suggestion to the provider. Upon completion advance the cursor
|
| // for single-field Autofill, or close the keyboard for full-form Autofill.
|
| - base::WeakNSObject<FormSuggestionController> weakSelf(self);
|
| + __weak FormSuggestionController* weakSelf = self;
|
| [_provider
|
| didSelectSuggestion:suggestion
|
| forField:base::SysUTF8ToNSString(_suggestionState->field_name)
|
| @@ -315,11 +309,11 @@ AutofillSuggestionState::AutofillSuggestionState(const std::string& form_name,
|
| #pragma mark FormInputAccessoryViewProvider
|
|
|
| - (id<FormInputAccessoryViewDelegate>)accessoryViewDelegate {
|
| - return _delegate.get();
|
| + return _delegate;
|
| }
|
|
|
| - (void)setAccessoryViewDelegate:(id<FormInputAccessoryViewDelegate>)delegate {
|
| - _delegate.reset(delegate);
|
| + _delegate = delegate;
|
| }
|
|
|
| - (void)
|
| @@ -343,7 +337,7 @@ AutofillSuggestionState::AutofillSuggestionState(const std::string& form_name,
|
| _suggestionState.reset(
|
| new AutofillSuggestionState(formName, fieldName, value));
|
| accessoryViewUpdateBlock([self suggestionViewWithSuggestions:@[]], self);
|
| - accessoryViewUpdateBlock_.reset([accessoryViewUpdateBlock copy]);
|
| + accessoryViewUpdateBlock_ = [accessoryViewUpdateBlock copy];
|
| [self retrieveSuggestionsForFormNamed:formName
|
| fieldName:fieldName
|
| type:type
|
| @@ -352,7 +346,7 @@ AutofillSuggestionState::AutofillSuggestionState(const std::string& form_name,
|
|
|
| - (void)inputAccessoryViewControllerDidReset:
|
| (FormInputAccessoryViewController*)controller {
|
| - accessoryViewUpdateBlock_.reset();
|
| + accessoryViewUpdateBlock_ = nil;
|
| [self resetSuggestionState];
|
| }
|
|
|
|
|