Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(753)

Unified Diff: ios/chrome/browser/autofill/autofill_controller.mm

Issue 2580363002: Upstream Chrome on iOS source code [1/11]. (Closed)
Patch Set: Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: ios/chrome/browser/autofill/autofill_controller.mm
diff --git a/ios/chrome/browser/autofill/autofill_controller.mm b/ios/chrome/browser/autofill/autofill_controller.mm
new file mode 100644
index 0000000000000000000000000000000000000000..196ca15d15434454b6ef214e94b681d78d1e42ab
--- /dev/null
+++ b/ios/chrome/browser/autofill/autofill_controller.mm
@@ -0,0 +1,200 @@
+// Copyright 2013 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 "ios/chrome/browser/autofill/autofill_controller.h"
+
+#include <stdint.h>
+
+#include <memory>
+#include <utility>
+
+#include "base/strings/sys_string_conversions.h"
+#include "base/strings/utf_string_conversions.h"
+#include "components/autofill/core/browser/autofill_manager.h"
+#include "components/autofill/core/browser/popup_item_ids.h"
+#include "components/autofill/core/common/autofill_pref_names.h"
+#import "components/autofill/ios/browser/autofill_client_ios_bridge.h"
+#include "components/autofill/ios/browser/autofill_driver_ios.h"
+#include "components/autofill/ios/browser/autofill_driver_ios_bridge.h"
+#import "components/autofill/ios/browser/form_suggestion.h"
+#include "components/infobars/core/infobar_manager.h"
+#include "components/pref_registry/pref_registry_syncable.h"
+#include "components/prefs/pref_service.h"
+#include "components/signin/core/browser/profile_identity_provider.h"
+#include "components/signin/core/browser/signin_manager.h"
+#include "ios/chrome/browser/application_context.h"
+#import "ios/chrome/browser/autofill/autofill_agent.h"
+#import "ios/chrome/browser/autofill/form_suggestion_provider.h"
+#include "ios/chrome/browser/browser_state/chrome_browser_state.h"
+#include "ios/chrome/browser/infobars/infobar_manager_impl.h"
+#include "ios/chrome/browser/pref_names.h"
+#include "ios/chrome/browser/signin/oauth2_token_service_factory.h"
+#include "ios/chrome/browser/signin/signin_manager_factory.h"
+#import "ios/chrome/browser/ui/autofill/autofill_client_ios.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
+
+using autofill::AutofillPopupDelegate;
+
+@interface AutofillController ()<AutofillClientIOSBridge,
+ AutofillDriverIOSBridge> {
+ AutofillAgent* _autofillAgent;
+ std::unique_ptr<autofill::AutofillClient> _autofillClient;
+ autofill::AutofillManager* _autofillManager; // weak
+}
+
+@end
+
+@implementation AutofillController
+
+@synthesize browserState = _browserState;
+
+- (instancetype)initWithBrowserState:(ios::ChromeBrowserState*)browserState
+ webState:(web::WebState*)webState
+ autofillAgent:(AutofillAgent*)autofillAgent
+ passwordGenerationManager:
+ (password_manager::PasswordGenerationManager*)
+ passwordGenerationManager
+ downloadEnabled:(BOOL)downloadEnabled {
+ DCHECK(browserState);
+ DCHECK(webState);
+ self = [super init];
+ if (self) {
+ _browserState = browserState;
+ infobars::InfoBarManager* infobarManager =
+ InfoBarManagerImpl::FromWebState(webState);
+ DCHECK(infobarManager);
+ ios::ChromeBrowserState* originalBrowserState =
+ browserState->GetOriginalChromeBrowserState();
+ std::unique_ptr<IdentityProvider> identityProvider(
+ new ProfileIdentityProvider(
+ ios::SigninManagerFactory::GetForBrowserState(originalBrowserState),
+ OAuth2TokenServiceFactory::GetForBrowserState(originalBrowserState),
+ base::Closure()));
+ _autofillClient.reset(new autofill::AutofillClientIOS(
+ browserState, infobarManager, self, passwordGenerationManager,
+ std::move(identityProvider)));
+ autofill::AutofillDriverIOS::CreateForWebStateAndDelegate(
+ webState, _autofillClient.get(), self,
+ GetApplicationContext()->GetApplicationLocale(),
+ downloadEnabled
+ ? autofill::AutofillManager::ENABLE_AUTOFILL_DOWNLOAD_MANAGER
+ : autofill::AutofillManager::DISABLE_AUTOFILL_DOWNLOAD_MANAGER);
+ _autofillAgent = autofillAgent;
+ _autofillManager =
+ autofill::AutofillDriverIOS::FromWebState(webState)->autofill_manager();
+ }
+ return self;
+}
+
+- (instancetype)initWithBrowserState:(ios::ChromeBrowserState*)browserState
+ passwordGenerationManager:
+ (password_manager::PasswordGenerationManager*)
+ passwordGenerationManager
+ webState:(web::WebState*)webState {
+ AutofillAgent* autofillAgent =
+ [[AutofillAgent alloc] initWithBrowserState:browserState
+ webState:webState];
+ return [self initWithBrowserState:browserState
+ webState:webState
+ autofillAgent:autofillAgent
+ passwordGenerationManager:passwordGenerationManager
+ downloadEnabled:YES];
+}
+
+- (instancetype)init {
+ NOTREACHED();
+ return nil;
+}
+
+- (void)dealloc {
+ DCHECK(!_autofillAgent); // detachFromWebController must have been called.
+}
+
+- (id<FormSuggestionProvider>)suggestionProvider {
+ return _autofillAgent;
+}
+
+- (void)detachFromWebState {
+ _autofillManager = nullptr;
+ [_autofillAgent detachFromWebState];
+ _autofillAgent = nil;
+}
+
+#pragma mark - AutofillClientIOSBridge
+
+- (void)
+showAutofillPopup:(const std::vector<autofill::Suggestion>&)popup_suggestions
+ popupDelegate:(const base::WeakPtr<AutofillPopupDelegate>&)delegate {
+ DCHECK(
+ _browserState->GetPrefs()->GetBoolean(autofill::prefs::kAutofillEnabled));
+ // Convert the suggestions into an NSArray for the keyboard.
+ NSMutableArray* suggestions = [[NSMutableArray alloc] init];
+ for (size_t i = 0; i < popup_suggestions.size(); ++i) {
+ // In the Chromium implementation the identifiers represent rows on the
+ // drop down of options. These include elements that aren't relevant to us
+ // such as separators ... see blink::WebAutofillClient::MenuItemIDSeparator
+ // for example. We can't include that enum because it's from WebKit, but
+ // fortunately almost all the entries we are interested in (profile or
+ // autofill entries) are zero or positive. The only negative entry we are
+ // interested in is autofill::POPUP_ITEM_ID_CLEAR_FORM, used to show the
+ // "clear form" button.
+ NSString* value = nil;
+ NSString* displayDescription = nil;
+ if (popup_suggestions[i].frontend_id >= 0) {
+ // Value will contain the text to be filled in the selected element while
+ // displayDescription will contain a summary of the data to be filled in
+ // the other elements.
+ value = base::SysUTF16ToNSString(popup_suggestions[i].value);
+ displayDescription = base::SysUTF16ToNSString(popup_suggestions[i].label);
+ } else if (popup_suggestions[i].frontend_id ==
+ autofill::POPUP_ITEM_ID_CLEAR_FORM) {
+ // Show the "clear form" button.
+ value = base::SysUTF16ToNSString(popup_suggestions[i].value);
+ }
+
+ if (!value)
+ continue;
+
+ FormSuggestion* suggestion = [FormSuggestion
+ suggestionWithValue:value
+ displayDescription:displayDescription
+ icon:base::SysUTF16ToNSString(popup_suggestions[i].icon)
+ identifier:popup_suggestions[i].frontend_id];
+ [suggestions addObject:suggestion];
+ }
+ [_autofillAgent onSuggestionsReady:suggestions popupDelegate:delegate];
+
+ // The parameter is an optional callback.
+ if (delegate)
+ delegate->OnPopupShown();
+}
+
+- (void)hideAutofillPopup {
+ [_autofillAgent onSuggestionsReady:@[]
+ popupDelegate:base::WeakPtr<AutofillPopupDelegate>()];
+}
+
+#pragma mark - AutofillDriverIOSBridge
+
+- (void)onFormDataFilled:(uint16_t)query_id
+ result:(const autofill::FormData&)result {
+ DCHECK(
+ _browserState->GetPrefs()->GetBoolean(autofill::prefs::kAutofillEnabled));
+ [_autofillAgent onFormDataFilled:result];
+ if (_autofillManager)
+ _autofillManager->OnDidFillAutofillFormData(result, base::TimeTicks::Now());
+}
+
+- (void)sendAutofillTypePredictionsToRenderer:
+ (const std::vector<autofill::FormStructure*>&)forms {
+ NSUserDefaults* standardDefaults = [NSUserDefaults standardUserDefaults];
+ if ([standardDefaults boolForKey:@"ShowAutofillTypePredictions"])
+ [_autofillAgent renderAutofillTypePredictions:forms];
+}
+
+@end
« no previous file with comments | « ios/chrome/browser/autofill/autofill_controller.h ('k') | ios/chrome/browser/autofill/autofill_controller_js_unittest.mm » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698