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

Unified Diff: components/autofill/content/browser/autocheckout_manager.cc

Issue 23033016: Remove autocheckout code. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Even more deletes, and Ilya review. Created 7 years, 4 months 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: components/autofill/content/browser/autocheckout_manager.cc
diff --git a/components/autofill/content/browser/autocheckout_manager.cc b/components/autofill/content/browser/autocheckout_manager.cc
deleted file mode 100644
index be8192362e87396fd69a445b3f75fc5c88b773a9..0000000000000000000000000000000000000000
--- a/components/autofill/content/browser/autocheckout_manager.cc
+++ /dev/null
@@ -1,581 +0,0 @@
-// 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.
-
-#include "components/autofill/content/browser/autocheckout_manager.h"
-
-#include "base/basictypes.h"
-#include "base/bind.h"
-#include "base/strings/utf_string_conversions.h"
-#include "components/autofill/content/browser/autocheckout_request_manager.h"
-#include "components/autofill/content/browser/autocheckout_statistic.h"
-#include "components/autofill/content/browser/autocheckout_steps.h"
-#include "components/autofill/core/browser/autofill_country.h"
-#include "components/autofill/core/browser/autofill_field.h"
-#include "components/autofill/core/browser/autofill_manager.h"
-#include "components/autofill/core/browser/autofill_metrics.h"
-#include "components/autofill/core/browser/autofill_profile.h"
-#include "components/autofill/core/browser/autofill_type.h"
-#include "components/autofill/core/browser/credit_card.h"
-#include "components/autofill/core/browser/form_structure.h"
-#include "components/autofill/core/common/autofill_messages.h"
-#include "components/autofill/core/common/form_data.h"
-#include "components/autofill/core/common/form_field_data.h"
-#include "components/autofill/core/common/web_element_descriptor.h"
-#include "content/public/browser/browser_context.h"
-#include "content/public/browser/browser_thread.h"
-#include "content/public/browser/render_view_host.h"
-#include "content/public/browser/web_contents.h"
-#include "net/cookies/cookie_options.h"
-#include "net/cookies/cookie_store.h"
-#include "net/url_request/url_request_context.h"
-#include "net/url_request/url_request_context_getter.h"
-#include "ui/gfx/rect.h"
-#include "url/gurl.h"
-
-using content::RenderViewHost;
-using content::WebContents;
-
-namespace autofill {
-
-namespace {
-
-const char kGoogleAccountsUrl[] = "https://accounts.google.com/";
-
-// Build FormFieldData based on the supplied |autocomplete_attribute|. Will
-// fill rest of properties with default values.
-FormFieldData BuildField(const std::string& autocomplete_attribute) {
- FormFieldData field;
- field.name = base::string16();
- field.value = base::string16();
- field.autocomplete_attribute = autocomplete_attribute;
- field.form_control_type = "text";
- return field;
-}
-
-// Build Autocheckout specific form data to be consumed by
-// AutofillDialogController to show the Autocheckout specific UI.
-FormData BuildAutocheckoutFormData() {
- FormData formdata;
- formdata.fields.push_back(BuildField("email"));
- formdata.fields.push_back(BuildField("cc-name"));
- formdata.fields.push_back(BuildField("cc-number"));
- formdata.fields.push_back(BuildField("cc-exp-month"));
- formdata.fields.push_back(BuildField("cc-exp-year"));
- formdata.fields.push_back(BuildField("cc-csc"));
- formdata.fields.push_back(BuildField("billing address-line1"));
- formdata.fields.push_back(BuildField("billing address-line2"));
- formdata.fields.push_back(BuildField("billing locality"));
- formdata.fields.push_back(BuildField("billing region"));
- formdata.fields.push_back(BuildField("billing country"));
- formdata.fields.push_back(BuildField("billing postal-code"));
- formdata.fields.push_back(BuildField("billing tel"));
- formdata.fields.push_back(BuildField("shipping name"));
- formdata.fields.push_back(BuildField("shipping address-line1"));
- formdata.fields.push_back(BuildField("shipping address-line2"));
- formdata.fields.push_back(BuildField("shipping locality"));
- formdata.fields.push_back(BuildField("shipping region"));
- formdata.fields.push_back(BuildField("shipping country"));
- formdata.fields.push_back(BuildField("shipping postal-code"));
- formdata.fields.push_back(BuildField("shipping tel"));
- return formdata;
-}
-
-AutofillMetrics::AutocheckoutBuyFlowMetric AutocheckoutStatusToUmaMetric(
- AutocheckoutStatus status) {
- switch (status) {
- case SUCCESS:
- return AutofillMetrics::AUTOCHECKOUT_BUY_FLOW_SUCCESS;
- case MISSING_FIELDMAPPING:
- return AutofillMetrics::AUTOCHECKOUT_BUY_FLOW_MISSING_FIELDMAPPING;
- case MISSING_CLICK_ELEMENT_BEFORE_FORM_FILLING:
- return AutofillMetrics::
- AUTOCHECKOUT_BUY_FLOW_MISSING_CLICK_ELEMENT_BEFORE_FORM_FILLING;
- case MISSING_CLICK_ELEMENT_AFTER_FORM_FILLING:
- return AutofillMetrics::
- AUTOCHECKOUT_BUY_FLOW_MISSING_CLICK_ELEMENT_AFTER_FORM_FILLING;
- case MISSING_ADVANCE:
- return AutofillMetrics::AUTOCHECKOUT_BUY_FLOW_MISSING_ADVANCE_ELEMENT;
- case CANNOT_PROCEED:
- return AutofillMetrics::AUTOCHECKOUT_BUY_FLOW_CANNOT_PROCEED;
- case AUTOCHECKOUT_STATUS_NUM_STATUS:
- NOTREACHED();
- }
-
- NOTREACHED();
- return AutofillMetrics::NUM_AUTOCHECKOUT_BUY_FLOW_METRICS;
-}
-
-// Callback for retrieving Google Account cookies. |callback| is passed the
-// retrieved cookies and posted back to the UI thread. |cookies| is any Google
-// Account cookies.
-void GetGoogleCookiesCallback(
- const base::Callback<void(const std::string&)>& callback,
- const std::string& cookies) {
- content::BrowserThread::PostTask(content::BrowserThread::UI,
- FROM_HERE,
- base::Bind(callback, cookies));
-}
-
-// Gets Google Account cookies. Must be called on the IO thread.
-// |request_context_getter| is a getter for the current request context.
-// |callback| is called when retrieving cookies is completed.
-void GetGoogleCookies(
- scoped_refptr<net::URLRequestContextGetter> request_context_getter,
- const base::Callback<void(const std::string&)>& callback) {
- net::URLRequestContext* url_request_context =
- request_context_getter->GetURLRequestContext();
- if (!url_request_context)
- return;
-
- net::CookieStore* cookie_store = url_request_context->cookie_store();
-
- base::Callback<void(const std::string&)> cookie_callback = base::Bind(
- &GetGoogleCookiesCallback,
- callback);
-
- net::CookieOptions cookie_options;
- cookie_options.set_include_httponly();
- cookie_store->GetCookiesWithOptionsAsync(GURL(kGoogleAccountsUrl),
- cookie_options,
- cookie_callback);
-}
-
-bool IsBillingGroup(FieldTypeGroup group) {
- return group == ADDRESS_BILLING ||
- group == PHONE_BILLING ||
- group == NAME_BILLING;
-}
-
-const char kTransactionIdNotSet[] = "transaction id not set";
-
-} // namespace
-
-AutocheckoutManager::AutocheckoutManager(AutofillManager* autofill_manager)
- : autofill_manager_(autofill_manager),
- metric_logger_(new AutofillMetrics),
- should_show_bubble_(true),
- is_autocheckout_bubble_showing_(false),
- in_autocheckout_flow_(false),
- should_preserve_dialog_(false),
- google_transaction_id_(kTransactionIdNotSet),
- weak_ptr_factory_(this) {}
-
-AutocheckoutManager::~AutocheckoutManager() {
-}
-
-void AutocheckoutManager::FillForms() {
- // |page_meta_data_| should have been set by OnLoadedPageMetaData.
- DCHECK(page_meta_data_);
-
- // Fill the forms on the page with data given by user.
- std::vector<FormData> filled_forms;
- const std::vector<FormStructure*>& form_structures =
- autofill_manager_->GetFormStructures();
- for (std::vector<FormStructure*>::const_iterator iter =
- form_structures.begin(); iter != form_structures.end(); ++iter) {
- FormStructure* form_structure = *iter;
- form_structure->set_filled_by_autocheckout(true);
- FormData form = form_structure->ToFormData();
- DCHECK_EQ(form_structure->field_count(), form.fields.size());
-
- for (size_t i = 0; i < form_structure->field_count(); ++i) {
- const AutofillField* field = form_structure->field(i);
- SetValue(*field, &form.fields[i]);
- }
-
- filled_forms.push_back(form);
- }
-
- // Send filled forms along with proceed descriptor to renderer.
- RenderViewHost* host =
- autofill_manager_->GetWebContents()->GetRenderViewHost();
- if (!host)
- return;
-
- host->Send(new AutofillMsg_FillFormsAndClick(
- host->GetRoutingID(),
- filled_forms,
- page_meta_data_->click_elements_before_form_fill,
- page_meta_data_->click_elements_after_form_fill,
- page_meta_data_->proceed_element_descriptor));
- // Record time taken for navigating current page.
- RecordTimeTaken(page_meta_data_->current_page_number);
-}
-
-void AutocheckoutManager::OnAutocheckoutPageCompleted(
- AutocheckoutStatus status) {
- if (!in_autocheckout_flow_)
- return;
-
- DVLOG(2) << "OnAutocheckoutPageCompleted, page_no: "
- << page_meta_data_->current_page_number
- << " status: "
- << status;
-
- DCHECK_NE(MISSING_FIELDMAPPING, status);
-
- SetStepProgressForPage(
- page_meta_data_->current_page_number,
- (status == SUCCESS) ? AUTOCHECKOUT_STEP_COMPLETED :
- AUTOCHECKOUT_STEP_FAILED);
-
- if (page_meta_data_->IsEndOfAutofillableFlow() || status != SUCCESS)
- EndAutocheckout(status);
-}
-
-void AutocheckoutManager::OnLoadedPageMetaData(
- scoped_ptr<AutocheckoutPageMetaData> page_meta_data) {
- scoped_ptr<AutocheckoutPageMetaData> old_meta_data = page_meta_data_.Pass();
- page_meta_data_ = page_meta_data.Pass();
-
- // If there is no click element in the last page, then it's the real last page
- // of the flow, and the dialog will be closed when the page navigates.
- // Otherwise, the dialog should be preserved for the page loaded by the click
- // element on the last page of the flow.
- // Note, |should_preserve_dialog_| has to be computed at this point because
- // |in_autocheckout_flow_| may change after |OnLoadedPageMetaData| is called.
- should_preserve_dialog_ = in_autocheckout_flow_ ||
- (old_meta_data.get() &&
- old_meta_data->IsEndOfAutofillableFlow() &&
- old_meta_data->proceed_element_descriptor.retrieval_method !=
- WebElementDescriptor::NONE);
-
- // Don't log that the bubble could be displayed if the user entered an
- // Autocheckout flow and sees the first page of the flow again due to an
- // error.
- if (IsStartOfAutofillableFlow() && !in_autocheckout_flow_) {
- metric_logger_->LogAutocheckoutBubbleMetric(
- AutofillMetrics::BUBBLE_COULD_BE_DISPLAYED);
- }
-
- // On the first page of an Autocheckout flow, when this function is called the
- // user won't have opted into the flow yet.
- if (!in_autocheckout_flow_)
- return;
-
- AutocheckoutStatus status = SUCCESS;
-
- // Missing Autofill server results.
- if (!page_meta_data_.get()) {
- status = MISSING_FIELDMAPPING;
- } else if (IsStartOfAutofillableFlow()) {
- // Not possible unless Autocheckout failed to proceed.
- status = CANNOT_PROCEED;
- } else if (!page_meta_data_->IsInAutofillableFlow()) {
- // Missing Autocheckout meta data in the Autofill server results.
- status = MISSING_FIELDMAPPING;
- } else if (page_meta_data_->current_page_number <=
- old_meta_data->current_page_number) {
- // Not possible unless Autocheckout failed to proceed.
- status = CANNOT_PROCEED;
- }
-
- // Encountered an error during the Autocheckout flow, probably to
- // do with a problem on the previous page.
- if (status != SUCCESS) {
- SetStepProgressForPage(old_meta_data->current_page_number,
- AUTOCHECKOUT_STEP_FAILED);
- EndAutocheckout(status);
- return;
- }
-
- SetStepProgressForPage(page_meta_data_->current_page_number,
- AUTOCHECKOUT_STEP_STARTED);
-
- FillForms();
-}
-
-void AutocheckoutManager::OnFormsSeen() {
- should_show_bubble_ = true;
-}
-
-bool AutocheckoutManager::ShouldIgnoreAjax() {
- return in_autocheckout_flow_ && page_meta_data_->ignore_ajax;
-}
-
-void AutocheckoutManager::MaybeShowAutocheckoutBubble(
- const GURL& frame_url,
- const gfx::RectF& bounding_box) {
- if (!should_show_bubble_ ||
- is_autocheckout_bubble_showing_ ||
- !IsStartOfAutofillableFlow())
- return;
-
- base::Callback<void(const std::string&)> callback = base::Bind(
- &AutocheckoutManager::ShowAutocheckoutBubble,
- weak_ptr_factory_.GetWeakPtr(),
- frame_url,
- bounding_box);
-
- content::WebContents* web_contents = autofill_manager_->GetWebContents();
- if (!web_contents)
- return;
-
- content::BrowserContext* browser_context = web_contents->GetBrowserContext();
- if(!browser_context)
- return;
-
- scoped_refptr<net::URLRequestContextGetter> request_context =
- scoped_refptr<net::URLRequestContextGetter>(
- browser_context->GetRequestContext());
-
- if (!request_context.get())
- return;
-
- base::Closure task = base::Bind(&GetGoogleCookies, request_context, callback);
-
- content::BrowserThread::PostTask(content::BrowserThread::IO,
- FROM_HERE,
- task);
-}
-
-void AutocheckoutManager::ReturnAutocheckoutData(
- const FormStructure* result,
- const std::string& google_transaction_id) {
- if (!result) {
- // When user cancels the dialog, |result| is NULL.
- // TODO(): add AutocheckoutStatus.USER_CANCELLED, and call
- // EndAutocheckout(USER_CANCELLED) instead.
- in_autocheckout_flow_ = false;
- return;
- }
-
- latency_statistics_.clear();
- last_step_completion_timestamp_ = base::TimeTicks().Now();
- google_transaction_id_ = google_transaction_id;
- in_autocheckout_flow_ = true;
- should_preserve_dialog_ = true;
- metric_logger_->LogAutocheckoutBuyFlowMetric(
- AutofillMetrics::AUTOCHECKOUT_BUY_FLOW_STARTED);
-
- profile_.reset(new AutofillProfile());
- credit_card_.reset(new CreditCard());
- billing_address_.reset(new AutofillProfile());
-
- for (size_t i = 0; i < result->field_count(); ++i) {
- const AutofillType& type = result->field(i)->Type();
- const base::string16& value = result->field(i)->value;
- ServerFieldType server_type = type.GetStorableType();
- if (server_type == CREDIT_CARD_VERIFICATION_CODE) {
- cvv_ = result->field(i)->value;
- continue;
- }
- FieldTypeGroup group = type.group();
- if (group == CREDIT_CARD) {
- credit_card_->SetRawInfo(server_type, value);
- // TODO(dgwallinga): Find a way of cleanly deprecating CREDIT_CARD_NAME.
- // code.google.com/p/chromium/issues/detail?id=263498
- if (server_type == CREDIT_CARD_NAME)
- billing_address_->SetRawInfo(NAME_BILLING_FULL, value);
- } else if (server_type == ADDRESS_HOME_COUNTRY) {
- if (IsBillingGroup(group))
- billing_address_->SetInfo(type, value, autofill_manager_->app_locale());
- else
- profile_->SetInfo(type, value, autofill_manager_->app_locale());
- } else if (IsBillingGroup(group)) {
- billing_address_->SetRawInfo(server_type, value);
- } else {
- profile_->SetRawInfo(server_type, value);
- }
- }
-
- // Page types only available in first-page meta data, so save
- // them for use later as we navigate.
- page_types_ = page_meta_data_->page_types;
- SetStepProgressForPage(page_meta_data_->current_page_number,
- AUTOCHECKOUT_STEP_STARTED);
-
- FillForms();
-}
-
-void AutocheckoutManager::set_metric_logger(
- scoped_ptr<AutofillMetrics> metric_logger) {
- metric_logger_ = metric_logger.Pass();
-}
-
-void AutocheckoutManager::MaybeShowAutocheckoutDialog(
- const GURL& frame_url,
- AutocheckoutBubbleState state) {
- is_autocheckout_bubble_showing_ = false;
-
- // User has taken action on the bubble, don't offer bubble again.
- if (state != AUTOCHECKOUT_BUBBLE_IGNORED)
- should_show_bubble_ = false;
-
- if (state != AUTOCHECKOUT_BUBBLE_ACCEPTED)
- return;
-
- base::Callback<void(const FormStructure*, const std::string&)> callback =
- base::Bind(&AutocheckoutManager::ReturnAutocheckoutData,
- weak_ptr_factory_.GetWeakPtr());
- autofill_manager_->ShowRequestAutocompleteDialog(BuildAutocheckoutFormData(),
- frame_url,
- DIALOG_TYPE_AUTOCHECKOUT,
- callback);
-
- for (std::map<int, std::vector<AutocheckoutStepType> >::const_iterator
- it = page_meta_data_->page_types.begin();
- it != page_meta_data_->page_types.end(); ++it) {
- for (size_t i = 0; i < it->second.size(); ++i) {
- autofill_manager_->delegate()->AddAutocheckoutStep(it->second[i]);
- }
- }
-}
-
-void AutocheckoutManager::ShowAutocheckoutBubble(
- const GURL& frame_url,
- const gfx::RectF& bounding_box,
- const std::string& cookies) {
- DCHECK(thread_checker_.CalledOnValidThread());
-
- base::Callback<void(AutocheckoutBubbleState)> callback = base::Bind(
- &AutocheckoutManager::MaybeShowAutocheckoutDialog,
- weak_ptr_factory_.GetWeakPtr(),
- frame_url);
- is_autocheckout_bubble_showing_ =
- autofill_manager_->delegate()->ShowAutocheckoutBubble(
- bounding_box,
- cookies.find("LSID") != std::string::npos,
- callback);
-}
-
-bool AutocheckoutManager::IsStartOfAutofillableFlow() const {
- return page_meta_data_ && page_meta_data_->IsStartOfAutofillableFlow();
-}
-
-bool AutocheckoutManager::IsInAutofillableFlow() const {
- return page_meta_data_ && page_meta_data_->IsInAutofillableFlow();
-}
-
-void AutocheckoutManager::SetValue(const AutofillField& field,
- FormFieldData* field_to_fill) {
- // No-op if Autofill server doesn't know about the field.
- if (field.server_type() == NO_SERVER_DATA)
- return;
-
- const AutofillType& type = field.Type();
-
- ServerFieldType server_type = type.GetStorableType();
- if (server_type == FIELD_WITH_DEFAULT_VALUE) {
- // For a form with radio buttons, like:
- // <form>
- // <input type="radio" name="sex" value="male">Male<br>
- // <input type="radio" name="sex" value="female">Female
- // </form>
- // If the default value specified at the server is "female", then
- // Autofill server responds back with following field mappings
- // (fieldtype: FIELD_WITH_DEFAULT_VALUE, value: "female")
- // (fieldtype: FIELD_WITH_DEFAULT_VALUE, value: "female")
- // Note that, the field mapping is repeated twice to respond to both the
- // input elements with the same name/signature in the form.
- //
- // FIELD_WITH_DEFAULT_VALUE can also be used for selects, the correspondent
- // example of the radio buttons example above is:
- // <SELECT name="sex">
- // <OPTION value="female">Female</OPTION>
- // <OPTION value="male">Male</OPTION>
- // </SELECT>
- base::string16 default_value = UTF8ToUTF16(field.default_value());
- if (field.is_checkable) {
- // Mark the field checked if server says the default value of the field
- // to be this field's value.
- field_to_fill->is_checked = (field.value == default_value);
- } else if (field.form_control_type == "select-one") {
- field_to_fill->value = default_value;
- } else {
- // FIELD_WITH_DEFAULT_VALUE should not be used for other type of fields.
- NOTREACHED();
- }
- return;
- }
-
- // Handle verification code directly.
- if (server_type == CREDIT_CARD_VERIFICATION_CODE) {
- field_to_fill->value = cvv_;
- return;
- }
-
- if (type.group() == CREDIT_CARD) {
- credit_card_->FillFormField(
- field, 0, autofill_manager_->app_locale(), field_to_fill);
- } else if (IsBillingGroup(type.group())) {
- billing_address_->FillFormField(
- field, 0, autofill_manager_->app_locale(), field_to_fill);
- } else {
- profile_->FillFormField(
- field, 0, autofill_manager_->app_locale(), field_to_fill);
- }
-}
-
-void AutocheckoutManager::SendAutocheckoutStatus(AutocheckoutStatus status) {
- // To ensure stale data isn't being sent.
- DCHECK_NE(kTransactionIdNotSet, google_transaction_id_);
-
- AutocheckoutRequestManager::CreateForBrowserContext(
- autofill_manager_->GetWebContents()->GetBrowserContext());
- AutocheckoutRequestManager* autocheckout_request_manager =
- AutocheckoutRequestManager::FromBrowserContext(
- autofill_manager_->GetWebContents()->GetBrowserContext());
- // It is assumed that the domain Autocheckout starts on does not change
- // during the flow. If this proves to be incorrect, the |source_url| from
- // AutofillDialogControllerImpl will need to be provided in its callback in
- // addition to the Google transaction id.
- autocheckout_request_manager->SendAutocheckoutStatus(
- status,
- autofill_manager_->GetWebContents()->GetURL(),
- latency_statistics_,
- google_transaction_id_);
-
- // Log the result of this Autocheckout flow to UMA.
- metric_logger_->LogAutocheckoutBuyFlowMetric(
- AutocheckoutStatusToUmaMetric(status));
-
- google_transaction_id_ = kTransactionIdNotSet;
-}
-
-void AutocheckoutManager::SetStepProgressForPage(
- int page_number,
- AutocheckoutStepStatus status) {
- if (page_types_.count(page_number) == 1) {
- for (size_t i = 0; i < page_types_[page_number].size(); ++i) {
- autofill_manager_->delegate()->UpdateAutocheckoutStep(
- page_types_[page_number][i], status);
- }
- }
-}
-
-void AutocheckoutManager::RecordTimeTaken(int page_number) {
- AutocheckoutStatistic statistic;
- statistic.page_number = page_number;
- if (page_types_.count(page_number) == 1) {
- for (size_t i = 0; i < page_types_[page_number].size(); ++i) {
- statistic.steps.push_back(page_types_[page_number][i]);
- }
- }
-
- statistic.time_taken =
- base::TimeTicks().Now() - last_step_completion_timestamp_;
- latency_statistics_.push_back(statistic);
-
- // Reset timestamp.
- last_step_completion_timestamp_ = base::TimeTicks().Now();
-}
-
-void AutocheckoutManager::EndAutocheckout(AutocheckoutStatus status) {
- DCHECK(in_autocheckout_flow_);
-
- DVLOG(2) << "EndAutocheckout at step: "
- << page_meta_data_->current_page_number
- << " with status: "
- << status;
-
- SendAutocheckoutStatus(status);
- if (status == SUCCESS)
- autofill_manager_->delegate()->OnAutocheckoutSuccess();
- else
- autofill_manager_->delegate()->OnAutocheckoutError();
- in_autocheckout_flow_ = false;
-}
-
-} // namespace autofill

Powered by Google App Engine
This is Rietveld 408576698