1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
|
// Copyright 2018 The Chromium Authors
// 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_HANDLER_WEB_FLOW_VIEW_CONTROLLER_H_
#define CHROME_BROWSER_UI_VIEWS_PAYMENTS_PAYMENT_HANDLER_WEB_FLOW_VIEW_CONTROLLER_H_
#include "base/memory/weak_ptr.h"
#include "base/memory/raw_ptr.h"
#include "chrome/browser/ui/views/payments/payment_handler_modal_dialog_manager_delegate.h"
#include "chrome/browser/ui/views/payments/payment_request_sheet_controller.h"
#include "components/payments/content/developer_console_logger.h"
#include "components/payments/content/payment_request_display_manager.h"
#include "content/public/browser/web_contents_delegate.h"
#include "content/public/browser/web_contents_observer.h"
#include "ui/base/window_open_disposition.h"
#include "ui/views/controls/webview/unhandled_keyboard_event_handler.h"
#include "ui/views/view.h"
#include "url/gurl.h"
class Profile;
namespace views {
class ProgressBar;
}
namespace payments {
class PaymentRequestDialogView;
class PaymentRequestSpec;
class PaymentRequestState;
// Displays a screen in the Payment Request dialog that shows the web page at
// |target| inside a views::WebView control.
class PaymentHandlerWebFlowViewController
: public PaymentRequestSheetController,
public content::WebContentsDelegate,
public content::WebContentsObserver {
public:
// This ctor forwards its first 3 args to PaymentRequestSheetController's
// ctor.
// |payment_request_web_contents| is the page that initiated the
// PaymentRequest. It is used in two ways:
// - Its web developer console is used to print error messages.
// - Its WebContentModalDialogHost is lent to the payment handler for the
// display of modal dialogs initiated from the payment handler's web
// content.
// |profile| is the browser context used to create the new payment handler
// WebContents object that will navigate to |target|.
// |first_navigation_complete_callback| is invoked once the payment handler
// WebContents finishes the initial navigation to |target|.
PaymentHandlerWebFlowViewController(
base::WeakPtr<PaymentRequestSpec> spec,
base::WeakPtr<PaymentRequestState> state,
base::WeakPtr<PaymentRequestDialogView> dialog,
content::WebContents* payment_request_web_contents,
Profile* profile,
GURL target,
PaymentHandlerOpenWindowCallback first_navigation_complete_callback);
~PaymentHandlerWebFlowViewController() override;
private:
class RoundedCornerViewClipper;
// PaymentRequestSheetController:
std::u16string GetSheetTitle() override;
void FillContentView(views::View* content_view) override;
bool ShouldShowPrimaryButton() override;
bool ShouldShowSecondaryButton() override;
void PopulateSheetHeaderView(views::View* view) override;
views::View* GetFirstFocusedView() override;
bool GetSheetId(DialogViewID* sheet_id) override;
bool DisplayDynamicBorderForHiddenContents() override;
bool CanContentViewBeScrollable() override;
base::WeakPtr<PaymentRequestSheetController> GetWeakPtr() override;
// content::WebContentsDelegate:
void VisibleSecurityStateChanged(content::WebContents* source) override;
content::WebContents* AddNewContents(
content::WebContents* source,
std::unique_ptr<content::WebContents> new_contents,
const GURL& target_url,
WindowOpenDisposition disposition,
const blink::mojom::WindowFeatures& window_features,
bool user_gesture,
bool* was_blocked) override;
bool HandleKeyboardEvent(content::WebContents* source,
const input::NativeWebKeyboardEvent& event) override;
// content::WebContentsObserver:
void DidFinishNavigation(
content::NavigationHandle* navigation_handle) override;
void LoadProgressChanged(double progress) override;
void TitleWasSet(content::NavigationEntry* entry) override;
void AbortPayment();
// Calculates the header background based on the web contents theme, if any,
// otherwise the Chrome theme.
std::unique_ptr<views::Background> GetHeaderBackground(
views::View* header_view);
DeveloperConsoleLogger log_;
raw_ptr<Profile> profile_;
GURL target_;
raw_ptr<views::ProgressBar, DanglingUntriaged> progress_bar_ = nullptr;
raw_ptr<views::View, DanglingUntriaged> separator_ = nullptr;
base::WeakPtr<views::View> close_button_;
PaymentHandlerOpenWindowCallback first_navigation_complete_callback_;
// Used to present modal dialog triggered from the payment handler web view,
// e.g. an authenticator dialog.
PaymentHandlerModalDialogManagerDelegate dialog_manager_delegate_;
// A handler to handle unhandled keyboard messages coming back from the
// renderer process.
views::UnhandledKeyboardEventHandler unhandled_keyboard_event_handler_;
// Helper which clips the views::WebView created by this class so that it has
// rounded corners matching its parent dialog.
//
// TODO(crbug.com/344626785): Remove once WebViews obey parent clips.
std::unique_ptr<RoundedCornerViewClipper> rounded_corner_clipper_;
// Must be the last member of a leaf class.
base::WeakPtrFactory<PaymentHandlerWebFlowViewController> weak_ptr_factory_{
this};
};
} // namespace payments
#endif // CHROME_BROWSER_UI_VIEWS_PAYMENTS_PAYMENT_HANDLER_WEB_FLOW_VIEW_CONTROLLER_H_
|