| // Copyright 2022 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_FEED_WEB_FEED_PAGE_INFORMATION_FETCHER_H_ |
| #define CHROME_BROWSER_FEED_WEB_FEED_PAGE_INFORMATION_FETCHER_H_ |
| |
| #include <vector> |
| |
| #include "base/functional/callback.h" |
| #include "base/memory/raw_ptr.h" |
| #include "base/memory/ref_counted.h" |
| #include "base/metrics/histogram_functions.h" |
| #include "components/feed/core/v2/public/types.h" |
| |
| namespace content { |
| class WebContents; |
| } |
| |
| namespace feed { |
| |
| // TODO(carlosk): Add tests. |
| class WebFeedPageInformationFetcher |
| : public base::RefCounted<WebFeedPageInformationFetcher> { |
| public: |
| struct PageInformation { |
| GURL url; |
| // web_contents should be set. |
| raw_ptr<content::WebContents> web_contents = nullptr; |
| }; |
| |
| // Fetches the canonical URL and RSS URLs for a web page, and then calls |
| // `callback` with the results. |
| static void Start(const PageInformation& page_info, |
| const WebFeedPageInformationRequestReason reason, |
| base::OnceCallback<void(WebFeedPageInformation)> callback); |
| |
| // For internal use only. |
| WebFeedPageInformationFetcher( |
| const PageInformation& initial_page_info, |
| base::OnceCallback<void(WebFeedPageInformation)> callback); |
| |
| private: |
| friend class base::RefCounted<WebFeedPageInformationFetcher>; |
| |
| ~WebFeedPageInformationFetcher(); |
| |
| void CallCallbackIfReady(); |
| void OnCanonicalUrlFetched(const absl::optional<::GURL>& url); |
| void OnRssFetched(std::vector<GURL> rss_urls); |
| |
| WebFeedPageInformation page_info_; |
| base::OnceCallback<void(WebFeedPageInformation)> callback_; |
| bool rss_fetched_ = false; |
| bool url_fetched_ = false; |
| }; |
| |
| } // namespace feed |
| |
| #endif // CHROME_BROWSER_FEED_WEB_FEED_PAGE_INFORMATION_FETCHER_H_ |