| // Copyright 2018 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 COMPONENTS_PAYMENTS_CONTENT_INSTALLABLE_PAYMENT_APP_CRAWLER_H_ | 
 | #define COMPONENTS_PAYMENTS_CONTENT_INSTALLABLE_PAYMENT_APP_CRAWLER_H_ | 
 |  | 
 | #include <map> | 
 | #include <memory> | 
 | #include <set> | 
 | #include <string> | 
 | #include <vector> | 
 |  | 
 | #include "base/callback.h" | 
 | #include "base/memory/weak_ptr.h" | 
 | #include "components/payments/content/developer_console_logger.h" | 
 | #include "components/payments/content/manifest_verifier.h" | 
 | #include "components/payments/content/payment_manifest_web_data_service.h" | 
 | #include "components/payments/content/utility/payment_manifest_parser.h" | 
 | #include "components/payments/content/web_app_manifest.h" | 
 | #include "components/payments/core/payment_manifest_downloader.h" | 
 | #include "content/public/browser/global_routing_id.h" | 
 | #include "content/public/browser/web_contents_observer.h" | 
 | #include "third_party/blink/public/mojom/payments/payment_request.mojom.h" | 
 | #include "url/origin.h" | 
 |  | 
 | class GURL; | 
 |  | 
 | namespace content { | 
 | class RenderFrameHost; | 
 | class WebContents; | 
 | } | 
 |  | 
 | namespace payments { | 
 |  | 
 | // Crawls installable web payment apps. First, fetches and parses the payment | 
 | // method manifests to get 'default_applications' manifest urls. Then, fetches | 
 | // and parses the web app manifests to get the installable payment apps' info. | 
 | class InstallablePaymentAppCrawler : public content::WebContentsObserver { | 
 |  public: | 
 |   using FinishedCrawlingCallback = base::OnceCallback<void( | 
 |       std::map<GURL, std::unique_ptr<WebAppInstallationInfo>>, | 
 |       const std::string& error_message)>; | 
 |  | 
 |   // |merchant_origin| is the origin of the iframe that created the | 
 |   // PaymentRequest object. It is used by security features like | 
 |   // 'Sec-Fetch-Site' and 'Cross-Origin-Resource-Policy'. | 
 |   // |initiator_render_frame_host| is the iframe for |merchant_origin|. | 
 |   // | 
 |   // The owner of InstallablePaymentAppCrawler owns |downloader|, |parser| and | 
 |   // |cache|. They should live until |finished_using_resources| parameter to | 
 |   // Start() method is called. | 
 |   InstallablePaymentAppCrawler( | 
 |       const url::Origin& merchant_origin, | 
 |       content::RenderFrameHost* initiator_render_frame_host, | 
 |       content::WebContents* web_contents, | 
 |       PaymentManifestDownloader* downloader, | 
 |       PaymentManifestParser* parser, | 
 |       PaymentManifestWebDataService* cache); | 
 |   ~InstallablePaymentAppCrawler() override; | 
 |  | 
 |   // Starts the crawling process. All the url based payment methods in | 
 |   // |request_method_data| will be crawled. A list of installable payment apps' | 
 |   // info will be send back through |callback|. |finished_using_resources| is | 
 |   // called after finished using the resources (downloader, parser and cache), | 
 |   // then this object is safe to be deleted. | 
 |   void Start( | 
 |       const std::vector<mojom::PaymentMethodDataPtr>& requested_method_data, | 
 |       FinishedCrawlingCallback callback, | 
 |       base::OnceClosure finished_using_resources); | 
 |  | 
 |   void IgnorePortInOriginComparisonForTesting(); | 
 |  | 
 |  private: | 
 |   bool IsSameOriginWith(const GURL& a, const GURL& b); | 
 |  | 
 |   void OnPaymentMethodManifestDownloaded( | 
 |       const GURL& method_manifest_url, | 
 |       const GURL& method_manifest_url_after_redirects, | 
 |       const std::string& content, | 
 |       const std::string& error_message); | 
 |   void OnPaymentMethodManifestParsed( | 
 |       const GURL& method_manifest_url, | 
 |       const GURL& method_manifest_url_after_redirects, | 
 |       const std::vector<GURL>& default_applications, | 
 |       const std::vector<url::Origin>& supported_origins, | 
 |       bool all_origins_supported); | 
 |   void OnPaymentWebAppManifestDownloaded( | 
 |       const GURL& method_manifest_url, | 
 |       const GURL& web_app_manifest_url, | 
 |       const GURL& web_app_manifest_url_after_redirects, | 
 |       const std::string& content, | 
 |       const std::string& error_message); | 
 |   void OnPaymentWebAppInstallationInfo( | 
 |       const GURL& method_manifest_url, | 
 |       const GURL& web_app_manifest_url, | 
 |       std::unique_ptr<WebAppInstallationInfo> app_info, | 
 |       std::unique_ptr<std::vector<PaymentManifestParser::WebAppIcon>> icons); | 
 |   bool CompleteAndStorePaymentWebAppInfoIfValid( | 
 |       const GURL& method_manifest_url, | 
 |       const GURL& web_app_manifest_url, | 
 |       std::unique_ptr<WebAppInstallationInfo> app_info); | 
 |   void DownloadAndDecodeWebAppIcon( | 
 |       const GURL& method_manifest_url, | 
 |       const GURL& web_app_manifest_url, | 
 |       std::unique_ptr<std::vector<PaymentManifestParser::WebAppIcon>> icons); | 
 |   void OnPaymentWebAppIconDownloadAndDecoded(const GURL& method_manifest_url, | 
 |                                              const GURL& web_app_manifest_url, | 
 |                                              const SkBitmap& icon); | 
 |   void FinishCrawlingPaymentAppsIfReady(); | 
 |   void SetFirstError(const std::string& error_message); | 
 |  | 
 |   DeveloperConsoleLogger log_; | 
 |   const url::Origin merchant_origin_; | 
 |   const content::GlobalFrameRoutingId initiator_frame_routing_id_; | 
 |   PaymentManifestDownloader* downloader_; | 
 |   PaymentManifestParser* parser_; | 
 |   FinishedCrawlingCallback callback_; | 
 |   base::OnceClosure finished_using_resources_; | 
 |  | 
 |   size_t number_of_payment_method_manifest_to_download_; | 
 |   size_t number_of_payment_method_manifest_to_parse_; | 
 |   size_t number_of_web_app_manifest_to_download_; | 
 |   size_t number_of_web_app_manifest_to_parse_; | 
 |   size_t number_of_web_app_icons_to_download_and_decode_; | 
 |   std::set<GURL> downloaded_web_app_manifests_; | 
 |   std::map<GURL, std::unique_ptr<WebAppInstallationInfo>> installable_apps_; | 
 |  | 
 |   // The first error message (if any) to be forwarded to the merchant when | 
 |   // rejecting the promise returned from PaymentRequest.show(). | 
 |   std::string first_error_message_; | 
 |  | 
 |   bool ignore_port_in_origin_comparison_for_testing_ = false; | 
 |  | 
 |   base::WeakPtrFactory<InstallablePaymentAppCrawler> weak_ptr_factory_{this}; | 
 |  | 
 |   DISALLOW_COPY_AND_ASSIGN(InstallablePaymentAppCrawler); | 
 | }; | 
 |  | 
 | }  // namespace payments. | 
 |  | 
 | #endif  // COMPONENTS_PAYMENTS_CONTENT_INSTALLABLE_PAYMENT_APP_CRAWLER_H_ |