| // Copyright 2017 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. |
| |
| #ifndef CHROME_BROWSER_UI_VIEWS_PAYMENTS_PAYMENT_REQUEST_BROWSERTEST_BASE_H_ |
| #define CHROME_BROWSER_UI_VIEWS_PAYMENTS_PAYMENT_REQUEST_BROWSERTEST_BASE_H_ |
| |
| #include <iosfwd> |
| #include <list> |
| #include <memory> |
| #include <string> |
| #include <vector> |
| |
| #include "base/command_line.h" |
| #include "base/macros.h" |
| #include "base/run_loop.h" |
| #include "base/strings/string16.h" |
| #include "chrome/browser/ui/views/payments/payment_request_dialog_view.h" |
| #include "chrome/browser/ui/views/payments/test_chrome_payment_request_delegate.h" |
| #include "chrome/test/base/in_process_browser_test.h" |
| #include "components/autofill/core/browser/field_types.h" |
| #include "components/autofill/core/browser/personal_data_manager_observer.h" |
| #include "components/autofill/core/browser/test_event_waiter.h" |
| #include "components/autofill/core/browser/test_sync_service.h" |
| #include "components/payments/content/payment_request.h" |
| #include "components/sync_preferences/testing_pref_service_syncable.h" |
| #include "content/public/browser/web_contents_observer.h" |
| #include "net/test/embedded_test_server/embedded_test_server.h" |
| #include "services/service_manager/public/cpp/binder_registry.h" |
| #include "testing/gmock/include/gmock/gmock.h" |
| #include "third_party/blink/public/mojom/payments/payment_request.mojom.h" |
| |
| namespace autofill { |
| class AutofillProfile; |
| class CreditCard; |
| } // namespace autofill |
| |
| namespace content { |
| class RenderFrameHost; |
| class WebContents; |
| } // namespace content |
| |
| namespace payments { |
| |
| enum class DialogViewID; |
| |
| ACTION_P(QuitMessageLoop, loop) { |
| loop->Quit(); |
| } |
| |
| class PersonalDataLoadedObserverMock |
| : public autofill::PersonalDataManagerObserver { |
| public: |
| PersonalDataLoadedObserverMock(); |
| ~PersonalDataLoadedObserverMock() override; |
| |
| MOCK_METHOD0(OnPersonalDataChanged, void()); |
| }; |
| |
| // Base class for any interactive PaymentRequest test that will need to open |
| // the UI and interact with it. |
| class PaymentRequestBrowserTestBase |
| : public InProcessBrowserTest, |
| public PaymentRequest::ObserverForTest, |
| public PaymentRequestDialogView::ObserverForTest, |
| public content::WebContentsObserver { |
| public: |
| // Various events that can be waited on by the EventWaiter. |
| enum DialogEvent : int { |
| DIALOG_OPENED, |
| DIALOG_CLOSED, |
| ORDER_SUMMARY_OPENED, |
| PAYMENT_METHOD_OPENED, |
| SHIPPING_ADDRESS_SECTION_OPENED, |
| SHIPPING_OPTION_SECTION_OPENED, |
| CREDIT_CARD_EDITOR_OPENED, |
| SHIPPING_ADDRESS_EDITOR_OPENED, |
| CONTACT_INFO_EDITOR_OPENED, |
| BACK_NAVIGATION, |
| BACK_TO_PAYMENT_SHEET_NAVIGATION, |
| CONTACT_INFO_OPENED, |
| EDITOR_VIEW_UPDATED, |
| CAN_MAKE_PAYMENT_CALLED, |
| CAN_MAKE_PAYMENT_RETURNED, |
| ERROR_MESSAGE_SHOWN, |
| SPEC_DONE_UPDATING, |
| CVC_PROMPT_SHOWN, |
| NOT_SUPPORTED_ERROR, |
| ABORT_CALLED, |
| PROCESSING_SPINNER_SHOWN, |
| PROCESSING_SPINNER_HIDDEN, |
| }; |
| |
| protected: |
| PaymentRequestBrowserTestBase(); |
| ~PaymentRequestBrowserTestBase() override; |
| |
| void SetUpCommandLine(base::CommandLine* command_line) override; |
| void SetUpOnMainThread() override; |
| |
| // Test will open a browser window to |file_path| (relative to |
| // components/test/data/payments). |
| void NavigateTo(const std::string& file_path); |
| |
| void SetIncognito(); |
| void SetInvalidSsl(); |
| void SetBrowserWindowInactive(); |
| |
| // PaymentRequest::ObserverForTest: |
| void OnCanMakePaymentCalled() override; |
| void OnCanMakePaymentReturned() override; |
| void OnNotSupportedError() override; |
| void OnConnectionTerminated() override; |
| void OnAbortCalled() override; |
| |
| // PaymentRequestDialogView::ObserverForTest: |
| void OnDialogOpened() override; |
| void OnOrderSummaryOpened() override; |
| void OnPaymentMethodOpened() override; |
| void OnShippingAddressSectionOpened() override; |
| void OnShippingOptionSectionOpened() override; |
| void OnCreditCardEditorOpened() override; |
| void OnShippingAddressEditorOpened() override; |
| void OnContactInfoEditorOpened() override; |
| void OnBackNavigation() override; |
| void OnBackToPaymentSheetNavigation() override; |
| void OnContactInfoOpened() override; |
| void OnEditorViewUpdated() override; |
| void OnErrorMessageShown() override; |
| void OnSpecDoneUpdating() override; |
| void OnCvcPromptShown() override; |
| void OnProcessingSpinnerShown() override; |
| void OnProcessingSpinnerHidden() override; |
| |
| // content::WebContentsObserver implementation. |
| void OnInterfaceRequestFromFrame( |
| content::RenderFrameHost* render_frame_host, |
| const std::string& interface_name, |
| mojo::ScopedMessagePipeHandle* interface_pipe) override; |
| |
| // Will call JavaScript to invoke the PaymentRequest dialog and verify that |
| // it's open and ready for input. |
| void InvokePaymentRequestUI(); |
| |
| // Will expect that all strings in |expected_strings| are present in output. |
| void ExpectBodyContains(const std::vector<std::string>& expected_strings); |
| void ExpectBodyContains(const std::vector<base::string16>& expected_strings); |
| |
| // Utility functions that will click on Dialog views and wait for the |
| // associated action to happen. |
| void OpenOrderSummaryScreen(); |
| void OpenPaymentMethodScreen(); |
| void OpenShippingAddressSectionScreen(); |
| void OpenShippingOptionSectionScreen(); |
| void OpenContactInfoScreen(); |
| void OpenCreditCardEditorScreen(); |
| void OpenShippingAddressEditorScreen(); |
| void OpenContactInfoEditorScreen(); |
| void ClickOnBackArrow(); |
| void ClickOnCancel(); |
| |
| content::WebContents* GetActiveWebContents(); |
| |
| // Convenience method to get a list of PaymentRequest associated with |
| // |web_contents|. |
| const std::vector<PaymentRequest*> GetPaymentRequests( |
| content::WebContents* web_contents); |
| |
| autofill::PersonalDataManager* GetDataManager(); |
| // Adds the various models to the database, waiting until the personal data |
| // manager notifies that they are added. |
| // NOTE: If no use_count is specified on the models and multiple items are |
| // inserted, the order in which they are returned is undefined, since they |
| // are added close to each other. |
| void AddAutofillProfile(const autofill::AutofillProfile& profile); |
| void AddCreditCard(const autofill::CreditCard& card); |
| |
| void CreatePaymentRequestForTest( |
| payments::mojom::PaymentRequestRequest request, |
| content::RenderFrameHost* render_frame_host); |
| |
| // Click on a view from within the dialog and waits for an observed event |
| // to be observed. |
| void ClickOnDialogViewAndWait(DialogViewID view_id, |
| bool wait_for_animation = true); |
| void ClickOnDialogViewAndWait(DialogViewID view_id, |
| PaymentRequestDialogView* dialog_view, |
| bool wait_for_animation = true); |
| void ClickOnDialogViewAndWait(views::View* view, |
| bool wait_for_animation = true); |
| void ClickOnDialogViewAndWait(views::View* view, |
| PaymentRequestDialogView* dialog_view, |
| bool wait_for_animation = true); |
| void ClickOnChildInListViewAndWait(int child_index, |
| int total_num_children, |
| DialogViewID list_view_id, |
| bool wait_for_animation = true); |
| // Returns profile label values under |parent_view|. |
| std::vector<base::string16> GetProfileLabelValues( |
| DialogViewID parent_view_id); |
| // Returns the shipping option labels under |parent_view_id|. |
| std::vector<base::string16> GetShippingOptionLabelValues( |
| DialogViewID parent_view_id); |
| |
| void OpenCVCPromptWithCVC(const base::string16& cvc); |
| void OpenCVCPromptWithCVC(const base::string16& cvc, |
| PaymentRequestDialogView* dialog_view); |
| void PayWithCreditCardAndWait(const base::string16& cvc); |
| void PayWithCreditCardAndWait(const base::string16& cvc, |
| PaymentRequestDialogView* dialog_view); |
| void PayWithCreditCard(const base::string16& cvc); |
| void RetryPaymentRequest(const std::string& validation_errors); |
| void RetryPaymentRequest(const std::string& validation_errors, |
| const DialogEvent& dialog_event); |
| |
| // Getting/setting the |value| in the textfield of a given |type|. |
| base::string16 GetEditorTextfieldValue(autofill::ServerFieldType type); |
| void SetEditorTextfieldValue(const base::string16& value, |
| autofill::ServerFieldType type); |
| // Getting/setting the |value| in the combobox of a given |type|. |
| base::string16 GetComboboxValue(autofill::ServerFieldType type); |
| void SetComboboxValue(const base::string16& value, |
| autofill::ServerFieldType type); |
| // Special case for the billing address since the interesting value is not |
| // the visible one accessible directly on the base combobox model. |
| void SelectBillingAddress(const std::string& billing_address_id); |
| |
| // Whether the editor textfield/combobox for the given |type| is currently in |
| // an invalid state. |
| bool IsEditorTextfieldInvalid(autofill::ServerFieldType type); |
| bool IsEditorComboboxInvalid(autofill::ServerFieldType type); |
| |
| bool IsPayButtonEnabled(); |
| |
| // Sets proper animation delegates and waits for animation to finish. |
| void WaitForAnimation(); |
| void WaitForAnimation(PaymentRequestDialogView* dialog_view); |
| |
| // Returns the text of the Label or StyledLabel with the specific |view_id| |
| // that is a child of the Payment Request dialog view. |
| const base::string16& GetLabelText(DialogViewID view_id); |
| const base::string16& GetStyledLabelText(DialogViewID view_id); |
| // Returns the error label text associated with a given field |type|. |
| const base::string16& GetErrorLabelForType(autofill::ServerFieldType type); |
| |
| net::EmbeddedTestServer* https_server() { return https_server_.get(); } |
| |
| PaymentRequestDialogView* dialog_view() { return delegate_->dialog_view(); } |
| |
| void SetRegionDataLoader(autofill::RegionDataLoader* region_data_loader) { |
| delegate_->SetRegionDataLoader(region_data_loader); |
| } |
| |
| // Sets the value of the payments.can_make_payment_enabled pref. |
| void SetCanMakePaymentEnabledPref(bool can_make_payment_enabled); |
| |
| // Resets the event waiter for a given |event| or |event_sequence|. |
| void ResetEventWaiter(DialogEvent event); |
| void ResetEventWaiterForSequence(std::list<DialogEvent> event_sequence); |
| // Resets the event waiter for the events that trigger when opening a dialog. |
| void ResetEventWaiterForDialogOpened(); |
| // Wait for the event(s) passed to ResetEventWaiter*() to occur. |
| void WaitForObservedEvent(); |
| |
| private: |
| std::unique_ptr<autofill::EventWaiter<DialogEvent>> event_waiter_; |
| std::unique_ptr<net::EmbeddedTestServer> https_server_; |
| // Weak, owned by the PaymentRequest object. |
| TestChromePaymentRequestDelegate* delegate_; |
| autofill::TestSyncService sync_service_; |
| sync_preferences::TestingPrefServiceSyncable prefs_; |
| bool is_incognito_; |
| bool is_valid_ssl_; |
| bool is_browser_window_active_; |
| |
| service_manager::BinderRegistryWithArgs<content::RenderFrameHost*> registry_; |
| |
| DISALLOW_COPY_AND_ASSIGN(PaymentRequestBrowserTestBase); |
| }; |
| |
| } // namespace payments |
| |
| std::ostream& operator<<( |
| std::ostream& out, |
| payments::PaymentRequestBrowserTestBase::DialogEvent event); |
| |
| #endif // CHROME_BROWSER_UI_VIEWS_PAYMENTS_PAYMENT_REQUEST_BROWSERTEST_BASE_H_ |