| Index: chrome/browser/ui/autofill/autofill_dialog_controller_browsertest.cc
|
| diff --git a/chrome/browser/ui/autofill/autofill_dialog_controller_browsertest.cc b/chrome/browser/ui/autofill/autofill_dialog_controller_browsertest.cc
|
| deleted file mode 100644
|
| index 4980ba8236962d1e35261ccde37bff4645d528b3..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/ui/autofill/autofill_dialog_controller_browsertest.cc
|
| +++ /dev/null
|
| @@ -1,1334 +0,0 @@
|
| -// Copyright (c) 2012 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 <stddef.h>
|
| -
|
| -#include "base/bind.h"
|
| -#include "base/command_line.h"
|
| -#include "base/logging.h"
|
| -#include "base/macros.h"
|
| -#include "base/memory/ref_counted.h"
|
| -#include "base/memory/weak_ptr.h"
|
| -#include "base/message_loop/message_loop.h"
|
| -#include "base/strings/utf_string_conversions.h"
|
| -#include "base/test/histogram_tester.h"
|
| -#include "base/time/time.h"
|
| -#include "build/build_config.h"
|
| -#include "chrome/browser/autofill/personal_data_manager_factory.h"
|
| -#include "chrome/browser/profiles/profile.h"
|
| -#include "chrome/browser/signin/account_tracker_service_factory.h"
|
| -#include "chrome/browser/signin/signin_manager_factory.h"
|
| -#include "chrome/browser/ui/autofill/autofill_dialog_controller_impl.h"
|
| -#include "chrome/browser/ui/autofill/autofill_dialog_i18n_input.h"
|
| -#include "chrome/browser/ui/autofill/autofill_dialog_view.h"
|
| -#include "chrome/browser/ui/autofill/autofill_dialog_view_tester.h"
|
| -#include "chrome/browser/ui/autofill/chrome_autofill_client.h"
|
| -#include "chrome/browser/ui/autofill/data_model_wrapper.h"
|
| -#include "chrome/browser/ui/autofill/mock_address_validator.h"
|
| -#include "chrome/browser/ui/browser.h"
|
| -#include "chrome/browser/ui/browser_tabstrip.h"
|
| -#include "chrome/browser/ui/tabs/tab_strip_model.h"
|
| -#include "chrome/common/chrome_switches.h"
|
| -#include "chrome/common/pref_names.h"
|
| -#include "chrome/common/url_constants.h"
|
| -#include "chrome/test/base/in_process_browser_test.h"
|
| -#include "chrome/test/base/ui_test_utils.h"
|
| -#include "components/autofill/content/browser/risk/proto/fingerprint.pb.h"
|
| -#include "components/autofill/core/browser/autofill_metrics.h"
|
| -#include "components/autofill/core/browser/autofill_test_utils.h"
|
| -#include "components/autofill/core/browser/test_personal_data_manager.h"
|
| -#include "components/autofill/core/browser/validation.h"
|
| -#include "components/autofill/core/common/autofill_constants.h"
|
| -#include "components/autofill/core/common/autofill_switches.h"
|
| -#include "components/autofill/core/common/form_data.h"
|
| -#include "components/autofill/core/common/form_field_data.h"
|
| -#include "components/prefs/pref_service.h"
|
| -#include "components/signin/core/browser/account_tracker_service.h"
|
| -#include "components/signin/core/browser/signin_manager.h"
|
| -#include "content/public/browser/browser_thread.h"
|
| -#include "content/public/browser/interstitial_page.h"
|
| -#include "content/public/browser/navigation_details.h"
|
| -#include "content/public/browser/navigation_entry.h"
|
| -#include "content/public/browser/notification_service.h"
|
| -#include "content/public/browser/notification_types.h"
|
| -#include "content/public/browser/page_navigator.h"
|
| -#include "content/public/browser/web_contents.h"
|
| -#include "content/public/browser/web_contents_delegate.h"
|
| -#include "content/public/common/content_switches.h"
|
| -#include "content/public/common/referrer.h"
|
| -#include "content/public/common/url_constants.h"
|
| -#include "content/public/test/browser_test_utils.h"
|
| -#include "content/public/test/test_utils.h"
|
| -#include "google_apis/gaia/google_service_auth_error.h"
|
| -#include "net/test/embedded_test_server/embedded_test_server.h"
|
| -#include "testing/gmock/include/gmock/gmock.h"
|
| -#include "testing/gtest/include/gtest/gtest.h"
|
| -#include "third_party/WebKit/public/web/WebInputEvent.h"
|
| -#include "ui/base/page_transition_types.h"
|
| -#include "ui/base/window_open_disposition.h"
|
| -#include "url/gurl.h"
|
| -
|
| -#if defined(OS_WIN)
|
| -#include "base/win/windows_version.h"
|
| -#elif defined(OS_MACOSX)
|
| -#include "base/mac/scoped_nsautorelease_pool.h"
|
| -#include "chrome/browser/ui/cocoa/run_loop_testing.h"
|
| -#endif
|
| -
|
| -using base::ASCIIToUTF16;
|
| -
|
| -namespace autofill {
|
| -
|
| -namespace {
|
| -
|
| -using testing::Return;
|
| -using testing::_;
|
| -
|
| -void MockCallback(AutofillClient::RequestAutocompleteResult,
|
| - const base::string16& message,
|
| - const FormStructure*) {
|
| -}
|
| -
|
| -class TestAutofillDialogController : public AutofillDialogControllerImpl {
|
| - public:
|
| - TestAutofillDialogController(
|
| - content::WebContents* contents,
|
| - const FormData& form_data,
|
| - scoped_refptr<content::MessageLoopRunner> runner)
|
| - : AutofillDialogControllerImpl(contents,
|
| - form_data,
|
| - form_data.origin,
|
| - base::Bind(&MockCallback)),
|
| - message_loop_runner_(runner),
|
| - use_validation_(false),
|
| - weak_ptr_factory_(this) {
|
| - Profile* profile =
|
| - Profile::FromBrowserContext(contents->GetBrowserContext());
|
| - test_manager_.Init(
|
| - NULL,
|
| - profile->GetPrefs(),
|
| - AccountTrackerServiceFactory::GetForProfile(profile),
|
| - SigninManagerFactory::GetForProfile(profile),
|
| - false);
|
| - }
|
| -
|
| - ~TestAutofillDialogController() override {}
|
| -
|
| - GURL FakeSignInUrl() const {
|
| - return GURL(chrome::kChromeUIVersionURL);
|
| - }
|
| -
|
| - void ViewClosed() override {
|
| - message_loop_runner_->Quit();
|
| - AutofillDialogControllerImpl::ViewClosed();
|
| - }
|
| -
|
| - base::string16 InputValidityMessage(
|
| - DialogSection section,
|
| - ServerFieldType type,
|
| - const base::string16& value) override {
|
| - if (!use_validation_)
|
| - return base::string16();
|
| - return AutofillDialogControllerImpl::InputValidityMessage(
|
| - section, type, value);
|
| - }
|
| -
|
| - ValidityMessages InputsAreValid(
|
| - DialogSection section,
|
| - const FieldValueMap& inputs) override {
|
| - if (!use_validation_)
|
| - return ValidityMessages();
|
| - return AutofillDialogControllerImpl::InputsAreValid(section, inputs);
|
| - }
|
| -
|
| - // Saving to Chrome is tested in AutofillDialogControllerImpl unit tests.
|
| - // TODO(estade): test that the view defaults to saving to Chrome.
|
| - bool ShouldOfferToSaveInChrome() const override {
|
| - return true;
|
| - }
|
| -
|
| - // Increase visibility for testing.
|
| - using AutofillDialogControllerImpl::view;
|
| - using AutofillDialogControllerImpl::popup_input_type;
|
| -
|
| - MOCK_METHOD0(LoadRiskFingerprintData, void());
|
| -
|
| - std::vector<DialogNotification> CurrentNotifications() override {
|
| - return notifications_;
|
| - }
|
| -
|
| - void set_notifications(const std::vector<DialogNotification>& notifications) {
|
| - notifications_ = notifications;
|
| - }
|
| -
|
| - TestPersonalDataManager* GetTestingManager() {
|
| - return &test_manager_;
|
| - }
|
| -
|
| - MockAddressValidator* GetMockValidator() {
|
| - return &mock_validator_;
|
| - }
|
| -
|
| - using AutofillDialogControllerImpl::IsEditingExistingData;
|
| - using AutofillDialogControllerImpl::IsManuallyEditingSection;
|
| -
|
| - void set_use_validation(bool use_validation) {
|
| - use_validation_ = use_validation;
|
| - }
|
| -
|
| - base::WeakPtr<TestAutofillDialogController> AsWeakPtr() {
|
| - return weak_ptr_factory_.GetWeakPtr();
|
| - }
|
| -
|
| - protected:
|
| - PersonalDataManager* GetManager() const override {
|
| - return &const_cast<TestAutofillDialogController*>(this)->test_manager_;
|
| - }
|
| -
|
| - AddressValidator* GetValidator() override {
|
| - return &mock_validator_;
|
| - }
|
| -
|
| - private:
|
| - TestPersonalDataManager test_manager_;
|
| - testing::NiceMock<MockAddressValidator> mock_validator_;
|
| - scoped_refptr<content::MessageLoopRunner> message_loop_runner_;
|
| - bool use_validation_;
|
| -
|
| - // A list of notifications to show in the notification area of the dialog.
|
| - // This is used to control what |CurrentNotifications()| returns for testing.
|
| - std::vector<DialogNotification> notifications_;
|
| -
|
| - // Allows generation of WeakPtrs, so controller liveness can be tested.
|
| - base::WeakPtrFactory<TestAutofillDialogController> weak_ptr_factory_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(TestAutofillDialogController);
|
| -};
|
| -
|
| -// This is a copy of ui_test_utils::UrlLoadObserver, except it observes
|
| -// NAV_ENTRY_COMMITTED instead of LOAD_STOP. This is to match the notification
|
| -// that AutofillDialogControllerImpl observes. Since NAV_ENTRY_COMMITTED comes
|
| -// before LOAD_STOP, and the controller deletes the web contents after receiving
|
| -// the former, we will sometimes fail to observe a LOAD_STOP.
|
| -// TODO(estade): Should the controller observe LOAD_STOP instead?
|
| -class NavEntryCommittedObserver : public content::WindowedNotificationObserver {
|
| - public:
|
| - NavEntryCommittedObserver(const GURL& url,
|
| - const content::NotificationSource& source)
|
| - : WindowedNotificationObserver(content::NOTIFICATION_NAV_ENTRY_COMMITTED,
|
| - source),
|
| - url_(url) {}
|
| -
|
| - ~NavEntryCommittedObserver() override {}
|
| -
|
| - // content::NotificationObserver:
|
| - void Observe(int type,
|
| - const content::NotificationSource& source,
|
| - const content::NotificationDetails& details) override {
|
| - content::LoadCommittedDetails* load_details =
|
| - content::Details<content::LoadCommittedDetails>(details).ptr();
|
| - if (load_details->entry->GetVirtualURL() != url_)
|
| - return;
|
| -
|
| - WindowedNotificationObserver::Observe(type, source, details);
|
| - }
|
| -
|
| - private:
|
| - GURL url_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(NavEntryCommittedObserver);
|
| -};
|
| -
|
| -} // namespace
|
| -
|
| -class AutofillDialogControllerTest : public InProcessBrowserTest {
|
| - public:
|
| - AutofillDialogControllerTest() : controller_(NULL) {}
|
| - ~AutofillDialogControllerTest() override {}
|
| -
|
| - void SetUpCommandLine(base::CommandLine* command_line) override {
|
| - command_line->AppendSwitch(::switches::kReduceSecurityForTesting);
|
| - }
|
| -
|
| - void SetUpOnMainThread() override {
|
| - autofill::test::DisableSystemServices(browser()->profile()->GetPrefs());
|
| - InitializeController();
|
| - }
|
| -
|
| - protected:
|
| - bool SectionHasField(DialogSection section, ServerFieldType type) {
|
| - const DetailInputs& fields =
|
| - controller()->RequestedFieldsForSection(section);
|
| - for (size_t i = 0; i < fields.size(); ++i) {
|
| - if (type == fields[i].type)
|
| - return true;
|
| - }
|
| - return false;
|
| - }
|
| -
|
| - // A helper function that cycles the MessageLoop, and on Mac, the Cocoa run
|
| - // loop. It also drains the NSAutoreleasePool.
|
| - void CycleRunLoops() {
|
| - content::RunAllPendingInMessageLoop();
|
| -#if defined(OS_MACOSX)
|
| - chrome::testing::NSRunLoopRunAllPending();
|
| - AutoreleasePool()->Recycle();
|
| -#endif
|
| - }
|
| -
|
| - void InitializeControllerWithoutShowing() {
|
| - if (controller_)
|
| - controller_->Hide();
|
| -
|
| - FormData form;
|
| - form.name = ASCIIToUTF16("TestForm");
|
| -
|
| - FormFieldData field;
|
| - field.autocomplete_attribute = "shipping tel";
|
| - form.fields.push_back(field);
|
| -
|
| - FormFieldData cc;
|
| - cc.autocomplete_attribute = "cc-number";
|
| - form.fields.push_back(cc);
|
| -
|
| - message_loop_runner_ = new content::MessageLoopRunner;
|
| - controller_ = new TestAutofillDialogController(
|
| - GetActiveWebContents(),
|
| - form,
|
| - message_loop_runner_);
|
| - }
|
| -
|
| - void InitializeController() {
|
| - InitializeControllerWithoutShowing();
|
| - controller_->Show();
|
| - CycleRunLoops(); // Ensures dialog is fully visible.
|
| - }
|
| -
|
| - content::WebContents* GetActiveWebContents() {
|
| - return browser()->tab_strip_model()->GetActiveWebContents();
|
| - }
|
| -
|
| - content::RenderViewHost* GetRenderViewHost() {
|
| - return GetActiveWebContents()->GetRenderViewHost();
|
| - }
|
| -
|
| - std::unique_ptr<AutofillDialogViewTester> GetViewTester() {
|
| - return AutofillDialogViewTester::For(controller()->view());
|
| - }
|
| -
|
| - TestAutofillDialogController* controller() { return controller_; }
|
| -
|
| - void RunMessageLoop() {
|
| - message_loop_runner_->Run();
|
| - }
|
| -
|
| - // Loads an HTML page in |GetActiveWebContents()| with markup as follows:
|
| - // <form>|form_inner_html|</form>. After loading, emulates a click event on
|
| - // the page as requestAutocomplete() must be in response to a user gesture.
|
| - // Returns the |AutofillDialogControllerImpl| created by this invocation.
|
| - AutofillDialogControllerImpl* SetUpHtmlAndInvoke(
|
| - const std::string& form_inner_html) {
|
| - content::WebContents* contents = GetActiveWebContents();
|
| - ChromeAutofillClient* client =
|
| - ChromeAutofillClient::FromWebContents(contents);
|
| - CHECK(!client->GetDialogControllerForTesting());
|
| -
|
| - ui_test_utils::NavigateToURL(
|
| - browser(), GURL(std::string("data:text/html,") +
|
| - "<!doctype html>"
|
| - "<html>"
|
| - "<body>"
|
| - "<form>" + form_inner_html + "</form>"
|
| - "<script>"
|
| - "var invalidEvents = [];"
|
| - "function recordInvalid(e) {"
|
| - "if (e.type != 'invalid') throw 'only invalid events allowed';"
|
| - "invalidEvents.push(e);"
|
| - "}"
|
| - "function send(msg) {"
|
| - "domAutomationController.setAutomationId(0);"
|
| - "domAutomationController.send(msg);"
|
| - "}"
|
| - "document.forms[0].onautocompleteerror = function(e) {"
|
| - "send('error: ' + e.reason);"
|
| - "};"
|
| - "document.forms[0].onautocomplete = function() {"
|
| - "send('success');"
|
| - "};"
|
| - "window.onclick = function() {"
|
| - "var inputs = document.forms[0].querySelectorAll('input');"
|
| - "for (var i = 0; i < inputs.length; ++i) {"
|
| - "inputs[i].oninvalid = recordInvalid;"
|
| - "}"
|
| - "document.forms[0].requestAutocomplete();"
|
| - "send('clicked');"
|
| - "};"
|
| - "function loadIframe() {"
|
| - " var iframe = document.createElement('iframe');"
|
| - " iframe.onload = function() {"
|
| - " send('iframe loaded');"
|
| - " };"
|
| - " iframe.src = 'about:blank';"
|
| - " document.body.appendChild(iframe);"
|
| - "}"
|
| - "function getValueForFieldOfType(type) {"
|
| - " var fields = document.getElementsByTagName('input');"
|
| - " for (var i = 0; i < fields.length; i++) {"
|
| - " if (fields[i].autocomplete == type) {"
|
| - " send(fields[i].value);"
|
| - " return;"
|
| - " }"
|
| - " }"
|
| - " send('');"
|
| - "};"
|
| - "</script>"
|
| - "</body>"
|
| - "</html>"));
|
| -
|
| - InitiateDialog();
|
| - AutofillDialogControllerImpl* controller =
|
| - static_cast<AutofillDialogControllerImpl*>(
|
| - client->GetDialogControllerForTesting());
|
| - return controller;
|
| - }
|
| -
|
| - // Loads an html page on a provided server, the causes it to launch rAc.
|
| - // Returns whether rAc succesfully launched.
|
| - bool RunTestPage(const net::EmbeddedTestServer& server) {
|
| - GURL url = server.GetURL("/request_autocomplete/test_page.html");
|
| - ui_test_utils::NavigateToURL(browser(), url);
|
| -
|
| - // Pass through the broken SSL interstitial, if any.
|
| - content::WebContents* contents = GetActiveWebContents();
|
| - content::InterstitialPage* interstitial_page =
|
| - contents->GetInterstitialPage();
|
| - if (interstitial_page) {
|
| - ui_test_utils::UrlLoadObserver observer(
|
| - url,
|
| - content::Source<content::NavigationController>(
|
| - &contents->GetController()));
|
| - interstitial_page->Proceed();
|
| - observer.Wait();
|
| - }
|
| -
|
| - InitiateDialog();
|
| -
|
| - ChromeAutofillClient* client =
|
| - ChromeAutofillClient::FromWebContents(contents);
|
| - AutofillDialogControllerImpl* controller =
|
| - static_cast<AutofillDialogControllerImpl*>(
|
| - client->GetDialogControllerForTesting());
|
| - return !!controller;
|
| - }
|
| -
|
| - void RunTestPageInIframe(const net::EmbeddedTestServer& server) {
|
| - InitializeDOMMessageQueue();
|
| - GURL iframe_url = server.GetURL("/request_autocomplete/test_page.html");
|
| -
|
| - ui_test_utils::NavigateToURL(
|
| - browser(), GURL(std::string("data:text/html,") +
|
| - "<!doctype html>"
|
| - "<html>"
|
| - "<body>"
|
| - "<iframe style='position: fixed;"
|
| - "height: 100%;"
|
| - "width: 100%;'"
|
| - "id='racFrame'></iframe>"
|
| - "<script>"
|
| - "function send(msg) {"
|
| - "domAutomationController.setAutomationId(0);"
|
| - "domAutomationController.send(msg);"
|
| - "}"
|
| - "var racFrame = document.getElementById('racFrame');"
|
| - "racFrame.onload = function() {"
|
| - "send('iframe loaded');"
|
| - "};"
|
| - "racFrame.src = \"" + iframe_url.spec() + "\";"
|
| - "function navigateFrame() {"
|
| - "racFrame.src = 'about:blank';"
|
| - "}"
|
| - "</script>"
|
| - "</body>"
|
| - "</html>"));
|
| -
|
| - ChromeAutofillClient* client =
|
| - ChromeAutofillClient::FromWebContents(GetActiveWebContents());
|
| - ExpectDomMessage("iframe loaded");
|
| - EXPECT_FALSE(client->GetDialogControllerForTesting());
|
| - InitiateDialog();
|
| - EXPECT_TRUE(client->GetDialogControllerForTesting());
|
| - }
|
| -
|
| - // Wait for a message from the DOM automation controller (from JS in the
|
| - // page). Requires |SetUpHtmlAndInvoke()| be called first.
|
| - void ExpectDomMessage(const std::string& expected) {
|
| - std::string message;
|
| - ASSERT_TRUE(dom_message_queue_->WaitForMessage(&message));
|
| - dom_message_queue_->ClearQueue();
|
| - EXPECT_EQ("\"" + expected + "\"", message);
|
| - }
|
| -
|
| - void InitiateDialog() {
|
| - InitializeDOMMessageQueue();
|
| - // Triggers the onclick handler which invokes requestAutocomplete().
|
| - content::WebContents* contents = GetActiveWebContents();
|
| - content::SimulateMouseClick(contents, 0, blink::WebMouseEvent::ButtonLeft);
|
| - ExpectDomMessage("clicked");
|
| - }
|
| -
|
| - void InitializeDOMMessageQueue() {
|
| - dom_message_queue_.reset(new content::DOMMessageQueue);
|
| - }
|
| -
|
| - // Returns the value filled into the first field with autocomplete attribute
|
| - // equal to |autocomplete_type|, or an empty string if there is no such field.
|
| - std::string GetValueForHTMLFieldOfType(const std::string& autocomplete_type) {
|
| - std::string script = "getValueForFieldOfType('" + autocomplete_type + "');";
|
| - std::string result;
|
| - EXPECT_TRUE(content::ExecuteScriptAndExtractString(GetRenderViewHost(),
|
| - script,
|
| - &result));
|
| - return result;
|
| - }
|
| -
|
| - void AddCreditcardToProfile(Profile* profile, const CreditCard& card) {
|
| - PersonalDataManagerFactory::GetForProfile(profile)->AddCreditCard(card);
|
| - WaitForWebDB();
|
| - }
|
| -
|
| - void AddAutofillProfileToProfile(Profile* profile,
|
| - const AutofillProfile& autofill_profile) {
|
| - PersonalDataManagerFactory::GetForProfile(profile)->AddProfile(
|
| - autofill_profile);
|
| - WaitForWebDB();
|
| - }
|
| -
|
| - private:
|
| - void WaitForWebDB() {
|
| - content::RunAllPendingInMessageLoop(content::BrowserThread::DB);
|
| - }
|
| -
|
| - TestAutofillDialogController* controller_; // Weak reference.
|
| - scoped_refptr<content::MessageLoopRunner> message_loop_runner_;
|
| - std::unique_ptr<content::DOMMessageQueue> dom_message_queue_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(AutofillDialogControllerTest);
|
| -};
|
| -
|
| -// Submit the form data.
|
| -IN_PROC_BROWSER_TEST_F(AutofillDialogControllerTest, Submit) {
|
| - base::HistogramTester histogram;
|
| - AddCreditcardToProfile(controller()->profile(),
|
| - test::GetVerifiedCreditCard());
|
| - AddAutofillProfileToProfile(controller()->profile(),
|
| - test::GetVerifiedProfile());
|
| - std::unique_ptr<AutofillDialogViewTester> view =
|
| - AutofillDialogViewTester::For(controller()->view());
|
| - view->SetTextContentsOfSuggestionInput(SECTION_CC, ASCIIToUTF16("123"));
|
| - GetViewTester()->SubmitForTesting();
|
| - RunMessageLoop();
|
| -
|
| - histogram.ExpectTotalCount("RequestAutocomplete.UiDuration.Submit", 1);
|
| - histogram.ExpectTotalCount("RequestAutocomplete.UiDuration.Cancel", 0);
|
| -}
|
| -
|
| -// Cancel out of the dialog.
|
| -IN_PROC_BROWSER_TEST_F(AutofillDialogControllerTest, Cancel) {
|
| - base::HistogramTester histogram;
|
| - GetViewTester()->CancelForTesting();
|
| - RunMessageLoop();
|
| -
|
| - histogram.ExpectTotalCount("RequestAutocomplete.UiDuration.Submit", 0);
|
| - histogram.ExpectTotalCount("RequestAutocomplete.UiDuration.Cancel", 1);
|
| - histogram.ExpectUniqueSample(
|
| - "RequestAutocomplete.DismissalState",
|
| - AutofillMetrics::DIALOG_CANCELED_NO_INVALID_FIELDS, 1);
|
| -}
|
| -
|
| -// Take some other action that dismisses the dialog.
|
| -IN_PROC_BROWSER_TEST_F(AutofillDialogControllerTest, Hide) {
|
| - base::HistogramTester histogram;
|
| - controller()->Hide();
|
| -
|
| - RunMessageLoop();
|
| -
|
| - histogram.ExpectTotalCount("RequestAutocomplete.UiDuration.Submit", 0);
|
| - histogram.ExpectTotalCount("RequestAutocomplete.UiDuration.Cancel", 1);
|
| - histogram.ExpectUniqueSample(
|
| - "RequestAutocomplete.DismissalState",
|
| - AutofillMetrics::DIALOG_CANCELED_NO_INVALID_FIELDS, 1);
|
| -}
|
| -
|
| -IN_PROC_BROWSER_TEST_F(AutofillDialogControllerTest, CancelWithSuggestions) {
|
| - base::HistogramTester histogram;
|
| -
|
| - CreditCard card(test::GetVerifiedCreditCard());
|
| - controller()->GetTestingManager()->AddTestingCreditCard(&card);
|
| - AutofillProfile profile(test::GetVerifiedProfile());
|
| - controller()->GetTestingManager()->AddTestingProfile(&profile);
|
| -
|
| - EXPECT_FALSE(controller()->IsManuallyEditingSection(SECTION_CC));
|
| - EXPECT_FALSE(controller()->IsManuallyEditingSection(SECTION_BILLING));
|
| - EXPECT_FALSE(controller()->IsManuallyEditingSection(SECTION_SHIPPING));
|
| -
|
| - GetViewTester()->CancelForTesting();
|
| - RunMessageLoop();
|
| -
|
| - histogram.ExpectTotalCount("RequestAutocomplete.UiDuration.Submit", 0);
|
| - histogram.ExpectTotalCount("RequestAutocomplete.UiDuration.Cancel", 1);
|
| - histogram.ExpectUniqueSample("RequestAutocomplete.DismissalState",
|
| - AutofillMetrics::DIALOG_CANCELED_NO_EDITS, 1);
|
| -}
|
| -
|
| -IN_PROC_BROWSER_TEST_F(AutofillDialogControllerTest, AcceptWithSuggestions) {
|
| - base::HistogramTester histogram;
|
| - CreditCard card(test::GetVerifiedCreditCard());
|
| - controller()->GetTestingManager()->AddTestingCreditCard(&card);
|
| - AutofillProfile profile(test::GetVerifiedProfile());
|
| - controller()->GetTestingManager()->AddTestingProfile(&profile);
|
| -
|
| - EXPECT_FALSE(controller()->IsManuallyEditingSection(SECTION_CC));
|
| - EXPECT_FALSE(controller()->IsManuallyEditingSection(SECTION_BILLING));
|
| - EXPECT_FALSE(controller()->IsManuallyEditingSection(SECTION_SHIPPING));
|
| -
|
| - GetViewTester()->SubmitForTesting();
|
| - RunMessageLoop();
|
| -
|
| - histogram.ExpectTotalCount("RequestAutocomplete.UiDuration.Submit", 1);
|
| - histogram.ExpectTotalCount("RequestAutocomplete.UiDuration.Cancel", 0);
|
| - histogram.ExpectUniqueSample(
|
| - "RequestAutocomplete.DismissalState",
|
| - AutofillMetrics::DIALOG_ACCEPTED_EXISTING_AUTOFILL_DATA, 1);
|
| -}
|
| -
|
| -// Ensure that Hide() will only destroy the controller object after the
|
| -// message loop has run. Otherwise, there may be read-after-free issues
|
| -// during some tests.
|
| -IN_PROC_BROWSER_TEST_F(AutofillDialogControllerTest, DeferredDestruction) {
|
| - base::WeakPtr<TestAutofillDialogController> weak_ptr =
|
| - controller()->AsWeakPtr();
|
| - EXPECT_TRUE(weak_ptr.get());
|
| -
|
| - controller()->Hide();
|
| - EXPECT_TRUE(weak_ptr.get());
|
| -
|
| - RunMessageLoop();
|
| - EXPECT_FALSE(weak_ptr.get());
|
| -}
|
| -
|
| -IN_PROC_BROWSER_TEST_F(AutofillDialogControllerTest, FillInputFromAutofill) {
|
| - AutofillProfile full_profile(test::GetFullProfile());
|
| - const base::string16 formatted_phone(ASCIIToUTF16("+1 (310) 555 1234"));
|
| - full_profile.SetRawInfo(PHONE_HOME_WHOLE_NUMBER, formatted_phone);
|
| - controller()->GetTestingManager()->AddTestingProfile(&full_profile);
|
| -
|
| - // Dialog is already asking for a new billing address.
|
| - EXPECT_TRUE(controller()->IsManuallyEditingSection(SECTION_BILLING));
|
| -
|
| - // Select "Add new shipping address...".
|
| - ui::MenuModel* model = controller()->MenuModelForSection(SECTION_SHIPPING);
|
| - model->ActivatedAt(model->GetItemCount() - 2);
|
| - ASSERT_TRUE(controller()->IsManuallyEditingSection(SECTION_SHIPPING));
|
| -
|
| - // Enter something in a shipping input.
|
| - const DetailInputs& inputs =
|
| - controller()->RequestedFieldsForSection(SECTION_SHIPPING);
|
| - const ServerFieldType triggering_type = inputs[0].type;
|
| - base::string16 value = full_profile.GetRawInfo(triggering_type);
|
| - std::unique_ptr<AutofillDialogViewTester> view = GetViewTester();
|
| - view->SetTextContentsOfInput(triggering_type,
|
| - value.substr(0, value.size() / 2));
|
| - view->ActivateInput(triggering_type);
|
| -
|
| - ASSERT_EQ(triggering_type, controller()->popup_input_type());
|
| - controller()->DidAcceptSuggestion(base::string16(), 0, 1);
|
| -
|
| - // All inputs should be filled.
|
| - AutofillProfileWrapper wrapper(&full_profile);
|
| - for (size_t i = 0; i < inputs.size(); ++i) {
|
| - EXPECT_EQ(wrapper.GetInfoForDisplay(AutofillType(inputs[i].type)),
|
| - view->GetTextContentsOfInput(inputs[i].type));
|
| -
|
| - // Double check the correct formatting is used for the phone number.
|
| - if (inputs[i].type == PHONE_HOME_WHOLE_NUMBER)
|
| - EXPECT_EQ(formatted_phone, view->GetTextContentsOfInput(inputs[i].type));
|
| - }
|
| -
|
| - // Inputs from the other section (billing) should be left alone.
|
| - const DetailInputs& other_section_inputs =
|
| - controller()->RequestedFieldsForSection(SECTION_BILLING);
|
| - for (size_t i = 0; i < inputs.size(); ++i) {
|
| - base::string16 input_value =
|
| - view->GetTextContentsOfInput(other_section_inputs[i].type);
|
| - // If there's a combobox, the string should be non-empty.
|
| - if (controller()->ComboboxModelForAutofillType(
|
| - other_section_inputs[i].type)) {
|
| - EXPECT_NE(base::string16(), input_value);
|
| - } else {
|
| - EXPECT_EQ(base::string16(), input_value);
|
| - }
|
| - }
|
| -
|
| - // Now simulate some user edits and try again.
|
| - std::vector<base::string16> expectations;
|
| - for (size_t i = 0; i < inputs.size(); ++i) {
|
| - if (controller()->ComboboxModelForAutofillType(inputs[i].type)) {
|
| - expectations.push_back(base::string16());
|
| - continue;
|
| - }
|
| - base::string16 users_input = i % 2 == 0 ? base::string16()
|
| - : ASCIIToUTF16("dummy");
|
| - view->SetTextContentsOfInput(inputs[i].type, users_input);
|
| - // Empty inputs should be filled, others should be left alone.
|
| - base::string16 expectation =
|
| - inputs[i].type == triggering_type || users_input.empty() ?
|
| - wrapper.GetInfoForDisplay(AutofillType(inputs[i].type)) :
|
| - users_input;
|
| - expectations.push_back(expectation);
|
| - }
|
| -
|
| - view->SetTextContentsOfInput(triggering_type,
|
| - value.substr(0, value.size() / 2));
|
| - view->ActivateInput(triggering_type);
|
| - ASSERT_EQ(triggering_type, controller()->popup_input_type());
|
| - controller()->DidAcceptSuggestion(base::string16(), 0, 1);
|
| -
|
| - for (size_t i = 0; i < inputs.size(); ++i) {
|
| - if (controller()->ComboboxModelForAutofillType(inputs[i].type))
|
| - continue;
|
| - EXPECT_EQ(expectations[i], view->GetTextContentsOfInput(inputs[i].type));
|
| - }
|
| -
|
| - base::HistogramTester histogram;
|
| - view->SubmitForTesting();
|
| - histogram.ExpectUniqueSample(
|
| - "RequestAutocomplete.DismissalState",
|
| - AutofillMetrics::DIALOG_ACCEPTED_SAVE_TO_AUTOFILL, 1);
|
| -}
|
| -
|
| -// Tests that changing the value of a CC expiration date combobox works as
|
| -// expected when Autofill is used to fill text inputs.
|
| -//
|
| -// Flaky on Win7, WinXP, and Win Aura. http://crbug.com/270314.
|
| -#if defined(OS_WIN)
|
| -#define MAYBE_FillComboboxFromAutofill DISABLED_FillComboboxFromAutofill
|
| -#else
|
| -#define MAYBE_FillComboboxFromAutofill FillComboboxFromAutofill
|
| -#endif
|
| -IN_PROC_BROWSER_TEST_F(AutofillDialogControllerTest,
|
| - MAYBE_FillComboboxFromAutofill) {
|
| - CreditCard card1;
|
| - test::SetCreditCardInfo(&card1, "JJ Smith", "4111111111111111", "12", "2018");
|
| - controller()->GetTestingManager()->AddTestingCreditCard(&card1);
|
| - CreditCard card2;
|
| - test::SetCreditCardInfo(&card2, "B Bird", "3111111111111111", "11", "2017");
|
| - controller()->GetTestingManager()->AddTestingCreditCard(&card2);
|
| - AutofillProfile full_profile(test::GetFullProfile());
|
| - controller()->GetTestingManager()->AddTestingProfile(&full_profile);
|
| -
|
| - const DetailInputs& inputs =
|
| - controller()->RequestedFieldsForSection(SECTION_CC);
|
| - const ServerFieldType triggering_type = inputs[0].type;
|
| - base::string16 value = card1.GetRawInfo(triggering_type);
|
| - std::unique_ptr<AutofillDialogViewTester> view = GetViewTester();
|
| - view->SetTextContentsOfInput(triggering_type,
|
| - value.substr(0, value.size() / 2));
|
| - view->ActivateInput(triggering_type);
|
| -
|
| - ASSERT_EQ(triggering_type, controller()->popup_input_type());
|
| - controller()->DidAcceptSuggestion(base::string16(), 0, 1);
|
| -
|
| - // All inputs should be filled.
|
| - AutofillCreditCardWrapper wrapper1(&card1);
|
| - for (size_t i = 0; i < inputs.size(); ++i) {
|
| - EXPECT_EQ(wrapper1.GetInfo(AutofillType(inputs[i].type)),
|
| - view->GetTextContentsOfInput(inputs[i].type));
|
| - }
|
| -
|
| - // Try again with different data. Only expiration date and the triggering
|
| - // input should be overwritten.
|
| - value = card2.GetRawInfo(triggering_type);
|
| - view->SetTextContentsOfInput(triggering_type,
|
| - value.substr(0, value.size() / 2));
|
| - view->ActivateInput(triggering_type);
|
| - ASSERT_EQ(triggering_type, controller()->popup_input_type());
|
| - controller()->DidAcceptSuggestion(base::string16(), 0, 1);
|
| -
|
| - AutofillCreditCardWrapper wrapper2(&card2);
|
| - for (size_t i = 0; i < inputs.size(); ++i) {
|
| - const ServerFieldType type = inputs[i].type;
|
| - if (type == triggering_type ||
|
| - type == CREDIT_CARD_EXP_MONTH ||
|
| - type == CREDIT_CARD_EXP_4_DIGIT_YEAR) {
|
| - EXPECT_EQ(wrapper2.GetInfo(AutofillType(type)),
|
| - view->GetTextContentsOfInput(type));
|
| - } else if (type == CREDIT_CARD_VERIFICATION_CODE) {
|
| - EXPECT_TRUE(view->GetTextContentsOfInput(type).empty());
|
| - } else {
|
| - EXPECT_EQ(wrapper1.GetInfo(AutofillType(type)),
|
| - view->GetTextContentsOfInput(type));
|
| - }
|
| - }
|
| -
|
| - // Now fill from a profile. It should not overwrite any CC info.
|
| - const DetailInputs& billing_inputs =
|
| - controller()->RequestedFieldsForSection(SECTION_BILLING);
|
| - const ServerFieldType billing_triggering_type = billing_inputs[0].type;
|
| - value = full_profile.GetRawInfo(triggering_type);
|
| - view->SetTextContentsOfInput(billing_triggering_type,
|
| - value.substr(0, value.size() / 2));
|
| - view->ActivateInput(billing_triggering_type);
|
| -
|
| - ASSERT_EQ(billing_triggering_type, controller()->popup_input_type());
|
| - controller()->DidAcceptSuggestion(base::string16(), 0, 1);
|
| -
|
| - for (size_t i = 0; i < inputs.size(); ++i) {
|
| - const ServerFieldType type = inputs[i].type;
|
| - if (type == triggering_type ||
|
| - type == CREDIT_CARD_EXP_MONTH ||
|
| - type == CREDIT_CARD_EXP_4_DIGIT_YEAR) {
|
| - EXPECT_EQ(wrapper2.GetInfo(AutofillType(type)),
|
| - view->GetTextContentsOfInput(type));
|
| - } else if (type == CREDIT_CARD_VERIFICATION_CODE) {
|
| - EXPECT_TRUE(view->GetTextContentsOfInput(type).empty());
|
| - } else {
|
| - EXPECT_EQ(wrapper1.GetInfo(AutofillType(type)),
|
| - view->GetTextContentsOfInput(type));
|
| - }
|
| - }
|
| -}
|
| -
|
| -IN_PROC_BROWSER_TEST_F(AutofillDialogControllerTest, ShouldShowErrorBubble) {
|
| - controller()->set_use_validation(true);
|
| - EXPECT_TRUE(controller()->ShouldShowErrorBubble());
|
| -
|
| - CreditCard card(test::GetCreditCard());
|
| - ASSERT_FALSE(card.IsVerified());
|
| - controller()->GetTestingManager()->AddTestingCreditCard(&card);
|
| -
|
| - EXPECT_TRUE(controller()->IsManuallyEditingSection(SECTION_CC));
|
| - std::unique_ptr<AutofillDialogViewTester> view = GetViewTester();
|
| - view->SetTextContentsOfInput(
|
| - CREDIT_CARD_NUMBER,
|
| - card.GetRawInfo(CREDIT_CARD_NUMBER).substr(0, 1));
|
| -
|
| - view->ActivateInput(CREDIT_CARD_NUMBER);
|
| - EXPECT_FALSE(controller()->ShouldShowErrorBubble());
|
| -
|
| - controller()->FocusMoved();
|
| - EXPECT_TRUE(controller()->ShouldShowErrorBubble());
|
| -
|
| - base::HistogramTester histogram;
|
| - controller()->Hide();
|
| - histogram.ExpectUniqueSample(
|
| - "RequestAutocomplete.DismissalState",
|
| - AutofillMetrics::DIALOG_CANCELED_WITH_INVALID_FIELDS, 1);
|
| -}
|
| -
|
| -// Ensure that expired cards trigger invalid suggestions.
|
| -IN_PROC_BROWSER_TEST_F(AutofillDialogControllerTest, ExpiredCard) {
|
| - CreditCard verified_card(test::GetCreditCard());
|
| - verified_card.set_origin(kSettingsOrigin);
|
| - ASSERT_TRUE(verified_card.IsVerified());
|
| - controller()->GetTestingManager()->AddTestingCreditCard(&verified_card);
|
| -
|
| - CreditCard expired_card(test::GetCreditCard());
|
| - expired_card.set_origin(kSettingsOrigin);
|
| - expired_card.SetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR, ASCIIToUTF16("2007"));
|
| - ASSERT_TRUE(expired_card.IsVerified());
|
| - ASSERT_FALSE(
|
| - autofill::IsValidCreditCardExpirationDate(
|
| - expired_card.GetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR),
|
| - expired_card.GetRawInfo(CREDIT_CARD_EXP_MONTH),
|
| - base::Time::Now()));
|
| - controller()->GetTestingManager()->AddTestingCreditCard(&expired_card);
|
| -
|
| - ui::MenuModel* model = controller()->MenuModelForSection(SECTION_CC);
|
| - ASSERT_EQ(4, model->GetItemCount());
|
| -
|
| - ASSERT_TRUE(model->IsItemCheckedAt(0));
|
| - EXPECT_FALSE(controller()->IsEditingExistingData(SECTION_CC));
|
| -
|
| - model->ActivatedAt(1);
|
| - ASSERT_TRUE(model->IsItemCheckedAt(1));
|
| - EXPECT_TRUE(controller()->IsEditingExistingData(SECTION_CC));
|
| -}
|
| -
|
| -// Notifications with long message text should not make the dialog bigger.
|
| -IN_PROC_BROWSER_TEST_F(AutofillDialogControllerTest, LongNotifications) {
|
| - const gfx::Size no_notification_size = GetViewTester()->GetSize();
|
| - ASSERT_GT(no_notification_size.width(), 0);
|
| -
|
| - std::vector<DialogNotification> notifications;
|
| - notifications.push_back(
|
| - DialogNotification(DialogNotification::DEVELOPER_WARNING, ASCIIToUTF16(
|
| - "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do "
|
| - "eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim "
|
| - "ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut "
|
| - "aliquip ex ea commodo consequat. Duis aute irure dolor in "
|
| - "reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla "
|
| - "pariatur. Excepteur sint occaecat cupidatat non proident, sunt in "
|
| - "culpa qui officia deserunt mollit anim id est laborum.")));
|
| - controller()->set_notifications(notifications);
|
| - controller()->view()->UpdateNotificationArea();
|
| -
|
| - EXPECT_EQ(no_notification_size.width(),
|
| - GetViewTester()->GetSize().width());
|
| -}
|
| -
|
| -IN_PROC_BROWSER_TEST_F(AutofillDialogControllerTest, AutocompleteEvent) {
|
| - AutofillDialogControllerImpl* controller =
|
| - SetUpHtmlAndInvoke("<input autocomplete='cc-name'>");
|
| - ASSERT_TRUE(controller);
|
| -
|
| - AddCreditcardToProfile(controller->profile(), test::GetVerifiedCreditCard());
|
| - AddAutofillProfileToProfile(controller->profile(),
|
| - test::GetVerifiedProfile());
|
| -
|
| - std::unique_ptr<AutofillDialogViewTester> view =
|
| - AutofillDialogViewTester::For(controller->view());
|
| - view->SetTextContentsOfSuggestionInput(SECTION_CC, ASCIIToUTF16("123"));
|
| - view->SubmitForTesting();
|
| - ExpectDomMessage("success");
|
| -}
|
| -
|
| -IN_PROC_BROWSER_TEST_F(AutofillDialogControllerTest,
|
| - AutocompleteErrorEventReasonInvalid) {
|
| - AutofillDialogControllerImpl* controller =
|
| - SetUpHtmlAndInvoke("<input autocomplete='cc-name' pattern='.*zebra.*'>");
|
| - ASSERT_TRUE(controller);
|
| -
|
| - const CreditCard& credit_card = test::GetVerifiedCreditCard();
|
| - ASSERT_TRUE(credit_card.GetRawInfo(CREDIT_CARD_NAME_FULL)
|
| - .find(ASCIIToUTF16("zebra")) == base::string16::npos);
|
| - AddCreditcardToProfile(controller->profile(), credit_card);
|
| - AddAutofillProfileToProfile(controller->profile(),
|
| - test::GetVerifiedProfile());
|
| -
|
| - std::unique_ptr<AutofillDialogViewTester> view =
|
| - AutofillDialogViewTester::For(controller->view());
|
| - view->SetTextContentsOfSuggestionInput(SECTION_CC, ASCIIToUTF16("123"));
|
| - view->SubmitForTesting();
|
| - ExpectDomMessage("error: invalid");
|
| -
|
| - int invalid_count = -1;
|
| - ASSERT_TRUE(content::ExecuteScriptAndExtractInt(
|
| - GetRenderViewHost(), "send(invalidEvents.length);", &invalid_count));
|
| - EXPECT_EQ(1, invalid_count);
|
| -
|
| - std::string invalid_type;
|
| - ASSERT_TRUE(content::ExecuteScriptAndExtractString(
|
| - GetRenderViewHost(),
|
| - "send(invalidEvents[0].target.autocomplete);",
|
| - &invalid_type));
|
| - EXPECT_EQ("cc-name", invalid_type);
|
| -}
|
| -
|
| -IN_PROC_BROWSER_TEST_F(AutofillDialogControllerTest,
|
| - AutocompleteErrorEventReasonCancel) {
|
| - AutofillDialogControllerImpl* controller =
|
| - SetUpHtmlAndInvoke("<input autocomplete='cc-name'>");
|
| - ASSERT_TRUE(controller);
|
| - AutofillDialogViewTester::For(controller->view())->
|
| - CancelForTesting();
|
| - ExpectDomMessage("error: cancel");
|
| -}
|
| -
|
| -// http://crbug.com/318526
|
| -#if defined(OS_MACOSX)
|
| -#define MAYBE_ErrorWithFrameNavigation DISABLED_ErrorWithFrameNavigation
|
| -#else
|
| -#define MAYBE_ErrorWithFrameNavigation ErrorWithFrameNavigation
|
| -#endif
|
| -IN_PROC_BROWSER_TEST_F(AutofillDialogControllerTest,
|
| - MAYBE_ErrorWithFrameNavigation) {
|
| - AutofillDialogControllerImpl* controller =
|
| - SetUpHtmlAndInvoke("<input autocomplete='cc-name'>");
|
| - ASSERT_TRUE(controller);
|
| -
|
| - std::string unused;
|
| - ASSERT_TRUE(content::ExecuteScriptAndExtractString(GetRenderViewHost(),
|
| - "loadIframe();",
|
| - &unused));
|
| - ExpectDomMessage("iframe loaded");
|
| -
|
| - AutofillDialogViewTester::For(controller->view())->
|
| - CancelForTesting();
|
| - ExpectDomMessage("error: cancel");
|
| -}
|
| -
|
| -IN_PROC_BROWSER_TEST_F(AutofillDialogControllerTest, NoCvcSegfault) {
|
| - controller()->set_use_validation(true);
|
| -
|
| - CreditCard credit_card(test::GetVerifiedCreditCard());
|
| - controller()->GetTestingManager()->AddTestingCreditCard(&credit_card);
|
| - EXPECT_FALSE(controller()->IsEditingExistingData(SECTION_CC));
|
| -
|
| - ASSERT_NO_FATAL_FAILURE(GetViewTester()->SubmitForTesting());
|
| -}
|
| -
|
| -// Verify that filling a form works correctly, including filling the CVC when
|
| -// that is requested separately.
|
| -IN_PROC_BROWSER_TEST_F(AutofillDialogControllerTest,
|
| - FillFormIncludesCVC) {
|
| - AutofillDialogControllerImpl* controller =
|
| - SetUpHtmlAndInvoke("<input autocomplete='cc-csc'>");
|
| - ASSERT_TRUE(controller);
|
| -
|
| - AddCreditcardToProfile(controller->profile(), test::GetVerifiedCreditCard());
|
| - AddAutofillProfileToProfile(controller->profile(),
|
| - test::GetVerifiedProfile());
|
| -
|
| - std::unique_ptr<AutofillDialogViewTester> view =
|
| - AutofillDialogViewTester::For(controller->view());
|
| - view->SetTextContentsOfSuggestionInput(SECTION_CC, ASCIIToUTF16("123"));
|
| - view->SubmitForTesting();
|
| - ExpectDomMessage("success");
|
| - EXPECT_EQ("123", GetValueForHTMLFieldOfType("cc-csc"));
|
| -}
|
| -
|
| -IN_PROC_BROWSER_TEST_F(AutofillDialogControllerTest, AddNewClearsComboboxes) {
|
| - // Ensure the input under test is a combobox.
|
| - ASSERT_TRUE(
|
| - controller()->ComboboxModelForAutofillType(CREDIT_CARD_EXP_MONTH));
|
| -
|
| - // Set up an expired card.
|
| - CreditCard card;
|
| - test::SetCreditCardInfo(&card, "Roy Demeo", "4111111111111111", "8", "2013");
|
| - card.set_origin(kSettingsOrigin);
|
| - ASSERT_TRUE(card.IsVerified());
|
| -
|
| - // Add the card and check that there's a menu for that section.
|
| - controller()->GetTestingManager()->AddTestingCreditCard(&card);
|
| - ASSERT_TRUE(controller()->MenuModelForSection(SECTION_CC));
|
| -
|
| - // Select the invalid, suggested card from the menu.
|
| - controller()->MenuModelForSection(SECTION_CC)->ActivatedAt(0);
|
| - EXPECT_TRUE(controller()->IsEditingExistingData(SECTION_CC));
|
| -
|
| - // Get the contents of the combobox of the credit card's expiration month.
|
| - std::unique_ptr<AutofillDialogViewTester> view = GetViewTester();
|
| - base::string16 cc_exp_month_text =
|
| - view->GetTextContentsOfInput(CREDIT_CARD_EXP_MONTH);
|
| -
|
| - // Select "New X..." from the suggestion menu to clear the section's inputs.
|
| - controller()->MenuModelForSection(SECTION_CC)->ActivatedAt(1);
|
| - EXPECT_FALSE(controller()->IsEditingExistingData(SECTION_CC));
|
| -
|
| - // Ensure that the credit card expiration month has changed.
|
| - EXPECT_NE(cc_exp_month_text,
|
| - view->GetTextContentsOfInput(CREDIT_CARD_EXP_MONTH));
|
| -}
|
| -
|
| -// Flaky on Win7 (http://crbug.com/446432)
|
| -#if defined(OS_WIN)
|
| -#define MAYBE_TabOpensToJustRight DISABLED_TabOpensToJustRight
|
| -#else
|
| -#define MAYBE_TabOpensToJustRight TabOpensToJustRight
|
| -#endif
|
| -IN_PROC_BROWSER_TEST_F(AutofillDialogControllerTest,
|
| - MAYBE_TabOpensToJustRight) {
|
| - ASSERT_TRUE(browser()->is_type_tabbed());
|
| -
|
| - // Tabs should currently be: / rAc() \.
|
| - content::WebContents* dialog_invoker = controller()->GetWebContents();
|
| - EXPECT_EQ(dialog_invoker, GetActiveWebContents());
|
| -
|
| - TabStripModel* tab_strip = browser()->tab_strip_model();
|
| - ASSERT_EQ(1, tab_strip->count());
|
| - EXPECT_EQ(0, tab_strip->GetIndexOfWebContents(dialog_invoker));
|
| -
|
| - // Open a tab to about:blank in the background at the end of the tab strip.
|
| - chrome::AddTabAt(browser(), GURL(), -1, false);
|
| - // Tabs should now be: / rAc() \/ blank \.
|
| - EXPECT_EQ(2, tab_strip->count());
|
| - EXPECT_EQ(0, tab_strip->active_index());
|
| - EXPECT_EQ(dialog_invoker, GetActiveWebContents());
|
| -
|
| - content::WebContents* blank_tab = tab_strip->GetWebContentsAt(1);
|
| -
|
| - // Simulate clicking "Manage X...".
|
| - controller()->MenuModelForSection(SECTION_SHIPPING)->ActivatedAt(2);
|
| - // Tab should now be: / rAc() \/ manage 1 \/ blank \.
|
| - EXPECT_EQ(3, tab_strip->count());
|
| - int dialog_index = tab_strip->GetIndexOfWebContents(dialog_invoker);
|
| - EXPECT_EQ(0, dialog_index);
|
| - EXPECT_EQ(1, tab_strip->active_index());
|
| - EXPECT_EQ(2, tab_strip->GetIndexOfWebContents(blank_tab));
|
| -
|
| - content::WebContents* first_manage_tab = tab_strip->GetWebContentsAt(1);
|
| -
|
| - // Re-activate the dialog's tab (like a user would have to).
|
| - tab_strip->ActivateTabAt(dialog_index, true);
|
| - EXPECT_EQ(dialog_invoker, GetActiveWebContents());
|
| -
|
| - // Simulate clicking "Manage X...".
|
| - controller()->MenuModelForSection(SECTION_SHIPPING)->ActivatedAt(2);
|
| - // Tabs should now be: / rAc() \/ manage 2 \/ manage 1 \/ blank \.
|
| - EXPECT_EQ(4, tab_strip->count());
|
| - EXPECT_EQ(0, tab_strip->GetIndexOfWebContents(dialog_invoker));
|
| - EXPECT_EQ(1, tab_strip->active_index());
|
| - EXPECT_EQ(2, tab_strip->GetIndexOfWebContents(first_manage_tab));
|
| - EXPECT_EQ(3, tab_strip->GetIndexOfWebContents(blank_tab));
|
| -}
|
| -
|
| -IN_PROC_BROWSER_TEST_F(AutofillDialogControllerTest,
|
| - DoesWorkOnHttpWithFlag) {
|
| - net::EmbeddedTestServer http_server;
|
| - http_server.ServeFilesFromSourceDirectory("chrome/test/data");
|
| - ASSERT_TRUE(http_server.Start());
|
| - EXPECT_TRUE(RunTestPage(http_server));
|
| -}
|
| -
|
| -// Like the parent test, but doesn't add the --reduce-security-for-testing flag.
|
| -class AutofillDialogControllerSecurityTest :
|
| - public AutofillDialogControllerTest {
|
| - public:
|
| - AutofillDialogControllerSecurityTest() {}
|
| - ~AutofillDialogControllerSecurityTest() override {}
|
| -
|
| - void SetUpCommandLine(base::CommandLine* command_line) override {
|
| - CHECK(!command_line->HasSwitch(::switches::kReduceSecurityForTesting));
|
| - }
|
| -
|
| - typedef net::BaseTestServer::SSLOptions SSLOptions;
|
| -
|
| - private:
|
| - DISALLOW_COPY_AND_ASSIGN(AutofillDialogControllerSecurityTest);
|
| -};
|
| -
|
| -IN_PROC_BROWSER_TEST_F(AutofillDialogControllerSecurityTest,
|
| - DoesntWorkOnHttp) {
|
| - net::EmbeddedTestServer http_server;
|
| - http_server.ServeFilesFromSourceDirectory("chrome/test/data");
|
| - ASSERT_TRUE(http_server.Start());
|
| - EXPECT_FALSE(RunTestPage(http_server));
|
| -}
|
| -
|
| -IN_PROC_BROWSER_TEST_F(AutofillDialogControllerSecurityTest,
|
| - DoesWorkOnHttpWithFlags) {
|
| - net::EmbeddedTestServer https_server(net::EmbeddedTestServer::TYPE_HTTPS);
|
| - https_server.ServeFilesFromSourceDirectory("chrome/test/data");
|
| - ASSERT_TRUE(https_server.Start());
|
| - EXPECT_TRUE(RunTestPage(https_server));
|
| -}
|
| -
|
| -IN_PROC_BROWSER_TEST_F(AutofillDialogControllerSecurityTest,
|
| - DISABLED_DoesntWorkOnBrokenHttps) {
|
| - net::EmbeddedTestServer https_server(net::EmbeddedTestServer::TYPE_HTTPS);
|
| - https_server.ServeFilesFromSourceDirectory("chrome/test/data");
|
| - ASSERT_TRUE(https_server.Start());
|
| - EXPECT_FALSE(RunTestPage(https_server));
|
| -}
|
| -
|
| -IN_PROC_BROWSER_TEST_F(AutofillDialogControllerTest,
|
| - CountryChangeRebuildsSection) {
|
| - EXPECT_FALSE(SectionHasField(SECTION_BILLING, ADDRESS_BILLING_SORTING_CODE));
|
| - EXPECT_FALSE(SectionHasField(SECTION_SHIPPING, ADDRESS_HOME_SORTING_CODE));
|
| -
|
| - // Select "Add new shipping address...".
|
| - controller()->MenuModelForSection(SECTION_SHIPPING)->ActivatedAt(1);
|
| -
|
| - // Add some valid user input that should be preserved when country changes.
|
| - std::unique_ptr<AutofillDialogViewTester> view = GetViewTester();
|
| - view->SetTextContentsOfInput(NAME_FULL, ASCIIToUTF16("B. Loblaw"));
|
| -
|
| - // Change both sections' countries.
|
| - view->SetTextContentsOfInput(ADDRESS_BILLING_COUNTRY, ASCIIToUTF16("France"));
|
| - view->ActivateInput(ADDRESS_BILLING_COUNTRY);
|
| - view->SetTextContentsOfInput(ADDRESS_HOME_COUNTRY, ASCIIToUTF16("Belarus"));
|
| - view->ActivateInput(ADDRESS_HOME_COUNTRY);
|
| -
|
| - // Verify the name is still there.
|
| - EXPECT_EQ(ASCIIToUTF16("B. Loblaw"), view->GetTextContentsOfInput(NAME_FULL));
|
| -
|
| - EXPECT_TRUE(SectionHasField(SECTION_BILLING, ADDRESS_BILLING_SORTING_CODE));
|
| - EXPECT_TRUE(SectionHasField(SECTION_SHIPPING, ADDRESS_HOME_SORTING_CODE));
|
| -}
|
| -
|
| -IN_PROC_BROWSER_TEST_F(AutofillDialogControllerTest, AddNewResetsCountry) {
|
| - AutofillProfile verified_profile(test::GetVerifiedProfile());
|
| - controller()->GetTestingManager()->AddTestingProfile(&verified_profile);
|
| -
|
| - // Select "Add new billing/shipping address...".
|
| - controller()->MenuModelForSection(SECTION_BILLING)->ActivatedAt(1);
|
| - controller()->MenuModelForSection(SECTION_SHIPPING)->ActivatedAt(2);
|
| -
|
| - std::unique_ptr<AutofillDialogViewTester> view = GetViewTester();
|
| - ASSERT_EQ(ASCIIToUTF16("United States"),
|
| - view->GetTextContentsOfInput(ADDRESS_BILLING_COUNTRY));
|
| - ASSERT_EQ(ASCIIToUTF16("United States"),
|
| - view->GetTextContentsOfInput(ADDRESS_HOME_COUNTRY));
|
| -
|
| - // Switch both billing and shipping countries.
|
| - view->SetTextContentsOfInput(ADDRESS_BILLING_COUNTRY, ASCIIToUTF16("Brazil"));
|
| - view->ActivateInput(ADDRESS_BILLING_COUNTRY);
|
| - view->SetTextContentsOfInput(ADDRESS_HOME_COUNTRY, ASCIIToUTF16("France"));
|
| - view->ActivateInput(ADDRESS_HOME_COUNTRY);
|
| -
|
| - // Select "Add new billing/shipping address...".
|
| - controller()->MenuModelForSection(SECTION_BILLING)->ActivatedAt(1);
|
| - controller()->MenuModelForSection(SECTION_SHIPPING)->ActivatedAt(2);
|
| -
|
| - EXPECT_EQ(ASCIIToUTF16("United States"),
|
| - view->GetTextContentsOfInput(ADDRESS_BILLING_COUNTRY));
|
| - EXPECT_EQ(ASCIIToUTF16("United States"),
|
| - view->GetTextContentsOfInput(ADDRESS_HOME_COUNTRY));
|
| -}
|
| -
|
| -IN_PROC_BROWSER_TEST_F(AutofillDialogControllerTest,
|
| - FillingFormRebuildsInputs) {
|
| - AutofillProfile full_profile(test::GetFullProfile());
|
| - full_profile.SetRawInfo(ADDRESS_HOME_COUNTRY, ASCIIToUTF16("DE"));
|
| - controller()->GetTestingManager()->AddTestingProfile(&full_profile);
|
| -
|
| - // Select "Add new shipping address...".
|
| - controller()->MenuModelForSection(SECTION_SHIPPING)->ActivatedAt(1);
|
| -
|
| - std::unique_ptr<AutofillDialogViewTester> view = GetViewTester();
|
| - ASSERT_EQ(ASCIIToUTF16("United States"),
|
| - view->GetTextContentsOfInput(ADDRESS_BILLING_COUNTRY));
|
| - ASSERT_EQ(ASCIIToUTF16("United States"),
|
| - view->GetTextContentsOfInput(ADDRESS_HOME_COUNTRY));
|
| -
|
| - const ServerFieldType input_type = EMAIL_ADDRESS;
|
| - base::string16 name = full_profile.GetRawInfo(input_type);
|
| - view->SetTextContentsOfInput(input_type, name.substr(0, name.size() / 2));
|
| - view->ActivateInput(input_type);
|
| - ASSERT_EQ(input_type, controller()->popup_input_type());
|
| - controller()->DidAcceptSuggestion(base::string16(), 0, 1);
|
| -
|
| - EXPECT_EQ(ASCIIToUTF16("Germany"),
|
| - view->GetTextContentsOfInput(ADDRESS_BILLING_COUNTRY));
|
| - EXPECT_EQ(ASCIIToUTF16("United States"),
|
| - view->GetTextContentsOfInput(ADDRESS_HOME_COUNTRY));
|
| -}
|
| -
|
| -IN_PROC_BROWSER_TEST_F(AutofillDialogControllerTest,
|
| - FillingFormPreservesChangedCountry) {
|
| - AutofillProfile full_profile(test::GetFullProfile());
|
| - full_profile.SetRawInfo(ADDRESS_HOME_COUNTRY, ASCIIToUTF16("DE"));
|
| - controller()->GetTestingManager()->AddTestingProfile(&full_profile);
|
| -
|
| - // Select "Add new shipping address...".
|
| - controller()->MenuModelForSection(SECTION_SHIPPING)->ActivatedAt(1);
|
| -
|
| - std::unique_ptr<AutofillDialogViewTester> view = GetViewTester();
|
| - view->SetTextContentsOfInput(ADDRESS_BILLING_COUNTRY, ASCIIToUTF16("France"));
|
| - view->ActivateInput(ADDRESS_BILLING_COUNTRY);
|
| - view->SetTextContentsOfInput(ADDRESS_HOME_COUNTRY, ASCIIToUTF16("Belarus"));
|
| - view->ActivateInput(ADDRESS_HOME_COUNTRY);
|
| -
|
| - base::string16 name = full_profile.GetRawInfo(NAME_FULL);
|
| - view->SetTextContentsOfInput(NAME_FULL, name.substr(0, name.size() / 2));
|
| - view->ActivateInput(NAME_FULL);
|
| - ASSERT_EQ(NAME_FULL, controller()->popup_input_type());
|
| - controller()->DidAcceptSuggestion(base::string16(), 0, 1);
|
| -
|
| - EXPECT_EQ(ASCIIToUTF16("France"),
|
| - view->GetTextContentsOfInput(ADDRESS_BILLING_COUNTRY));
|
| - EXPECT_EQ(ASCIIToUTF16("Belarus"),
|
| - view->GetTextContentsOfInput(ADDRESS_HOME_COUNTRY));
|
| -}
|
| -
|
| -IN_PROC_BROWSER_TEST_F(AutofillDialogControllerTest, RulesLoaded) {
|
| - // Select "Add new shipping address...".
|
| - controller()->MenuModelForSection(SECTION_SHIPPING)->ActivatedAt(1);
|
| - controller()->set_use_validation(true);
|
| -
|
| - EXPECT_CALL(*controller()->GetMockValidator(),
|
| - ValidateAddress(CountryCodeMatcher("DE"), _, _)).Times(2).
|
| - WillOnce(Return(AddressValidator::RULES_NOT_READY));
|
| -
|
| - // Validation should occur on country change and see the rules haven't loaded.
|
| - std::unique_ptr<AutofillDialogViewTester> view = GetViewTester();
|
| - view->SetTextContentsOfInput(ADDRESS_HOME_ZIP, ASCIIToUTF16("123"));
|
| - view->SetTextContentsOfInput(ADDRESS_HOME_COUNTRY, ASCIIToUTF16("Germany"));
|
| - view->ActivateInput(ADDRESS_HOME_COUNTRY);
|
| -
|
| - // Different country loaded, validation should not occur.
|
| - controller()->OnAddressValidationRulesLoaded("FR", true);
|
| -
|
| - // Relevant country loaded, validation should occur.
|
| - controller()->OnAddressValidationRulesLoaded("DE", true);
|
| -
|
| - // Relevant country loaded but revalidation already happened, no further
|
| - // validation should occur.
|
| - controller()->OnAddressValidationRulesLoaded("DE", false);
|
| -
|
| - // Cancelling the dialog causes additional validation to see if the user
|
| - // cancelled with invalid fields, so verify and clear here.
|
| - testing::Mock::VerifyAndClearExpectations(controller()->GetMockValidator());
|
| -}
|
| -
|
| -IN_PROC_BROWSER_TEST_F(AutofillDialogControllerTest,
|
| - TransactionAmount) {
|
| - std::string html(
|
| - "<input type='number' step='0.01'"
|
| - " autocomplete='transaction-amount' value='24'>"
|
| - "<input autocomplete='transaction-currency' value='USD'>"
|
| - "<input autocomplete='cc-csc'>");
|
| - AutofillDialogControllerImpl* controller = SetUpHtmlAndInvoke(html);
|
| - ASSERT_TRUE(controller);
|
| -
|
| - EXPECT_EQ(ASCIIToUTF16("24"), controller->transaction_amount_);
|
| - EXPECT_EQ(ASCIIToUTF16("USD"), controller->transaction_currency_);
|
| -}
|
| -
|
| -// Same as above, plus readonly attribute.
|
| -IN_PROC_BROWSER_TEST_F(AutofillDialogControllerTest,
|
| - TransactionAmountReadonly) {
|
| - std::string html(
|
| - "<input type='number' step='0.01'"
|
| - " autocomplete='transaction-amount' value='24' readonly>"
|
| - "<input autocomplete='transaction-currency' value='USD' readonly>"
|
| - "<input autocomplete='cc-csc'>");
|
| - AutofillDialogControllerImpl* controller = SetUpHtmlAndInvoke(html);
|
| - ASSERT_TRUE(controller);
|
| -
|
| - EXPECT_EQ(ASCIIToUTF16("24"), controller->transaction_amount_);
|
| - EXPECT_EQ(ASCIIToUTF16("USD"), controller->transaction_currency_);
|
| -}
|
| -
|
| -IN_PROC_BROWSER_TEST_F(AutofillDialogControllerTest, HideOnNavigate) {
|
| - base::WeakPtr<TestAutofillDialogController> weak_ptr =
|
| - controller()->AsWeakPtr();
|
| - EXPECT_TRUE(weak_ptr.get());
|
| -
|
| - ui_test_utils::NavigateToURL(browser(), GURL("about:blank"));
|
| - EXPECT_FALSE(weak_ptr.get());
|
| -}
|
| -
|
| -// Tests that the rAc dialog hides when the main frame is navigated, even if
|
| -// it was invoked from a child frame.
|
| -IN_PROC_BROWSER_TEST_F(AutofillDialogControllerTest, HideOnNavigateMainFrame) {
|
| - net::EmbeddedTestServer http_server;
|
| - http_server.ServeFilesFromSourceDirectory("chrome/test/data");
|
| - ASSERT_TRUE(http_server.Start());
|
| - RunTestPageInIframe(http_server);
|
| -
|
| - ui_test_utils::NavigateToURL(browser(), GURL("about:blank"));
|
| - ChromeAutofillClient* client =
|
| - ChromeAutofillClient::FromWebContents(GetActiveWebContents());
|
| - EXPECT_FALSE(client->GetDialogControllerForTesting());
|
| -}
|
| -
|
| -// Tests that the rAc dialog hides when the iframe it's in is navigated.
|
| -IN_PROC_BROWSER_TEST_F(AutofillDialogControllerTest, HideOnNavigateIframe) {
|
| - net::EmbeddedTestServer http_server;
|
| - http_server.ServeFilesFromSourceDirectory("chrome/test/data");
|
| - ASSERT_TRUE(http_server.Start());
|
| - RunTestPageInIframe(http_server);
|
| -
|
| - std::string unused;
|
| - ASSERT_TRUE(content::ExecuteScriptAndExtractString(GetRenderViewHost(),
|
| - "navigateFrame();",
|
| - &unused));
|
| - ExpectDomMessage("iframe loaded");
|
| - ChromeAutofillClient* client =
|
| - ChromeAutofillClient::FromWebContents(GetActiveWebContents());
|
| - EXPECT_FALSE(client->GetDialogControllerForTesting());
|
| -}
|
| -
|
| -} // namespace autofill
|
|
|