| // 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. | 
 |  | 
 | #include "chrome/browser/feed/web_feed_tab_helper.h" | 
 |  | 
 | #include <utility> | 
 |  | 
 | #include "base/functional/bind.h" | 
 | #include "chrome/browser/feed/web_feed_util.h" | 
 | #include "content/public/browser/browser_thread.h" | 
 | #include "content/public/browser/navigation_handle.h" | 
 | #include "content/public/browser/web_contents.h" | 
 |  | 
 | namespace feed { | 
 |  | 
 | namespace { | 
 |  | 
 | class WebFeedInfoFinderImpl : public WebFeedTabHelper::WebFeedInfoFinder { | 
 |  public: | 
 |   WebFeedInfoFinderImpl() = default; | 
 |   ~WebFeedInfoFinderImpl() override = default; | 
 |  | 
 |   void FindForPage( | 
 |       content::WebContents* web_contents, | 
 |       base::OnceCallback<void(WebFeedMetadata)> callback) override { | 
 |     FindWebFeedInfoForPage( | 
 |         web_contents, | 
 |         WebFeedPageInformationRequestReason::kMenuItemPresentation, | 
 |         std::move(callback)); | 
 |   } | 
 | }; | 
 |  | 
 | }  // namespace | 
 |  | 
 | WebFeedTabHelper::WebFeedTabHelper(content::WebContents* web_contents) | 
 |     : content::WebContentsObserver(web_contents), | 
 |       content::WebContentsUserData<WebFeedTabHelper>(*web_contents) { | 
 |   DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); | 
 |   web_feed_info_finder_ = std::make_unique<WebFeedInfoFinderImpl>(); | 
 | } | 
 |  | 
 | WebFeedTabHelper::~WebFeedTabHelper() = default; | 
 |  | 
 | void WebFeedTabHelper::PrimaryPageChanged(content::Page& page) { | 
 |   // This is a new navigation so we can invalidate any previously scheduled | 
 |   // operations. | 
 |   weak_ptr_factory_.InvalidateWeakPtrs(); | 
 |  | 
 |   web_feed_info_finder_->FindForPage( | 
 |       web_contents(), base::BindOnce(&WebFeedTabHelper::OnWebFeedInfoRetrieved, | 
 |                                      weak_ptr_factory_.GetWeakPtr(), | 
 |                                      web_contents()->GetLastCommittedURL())); | 
 | } | 
 |  | 
 | void WebFeedTabHelper::OnWebFeedInfoRetrieved(const GURL& url, | 
 |                                               WebFeedMetadata metadata) { | 
 |   url_ = url; | 
 |   if (metadata.subscription_status == WebFeedSubscriptionStatus::kSubscribed) { | 
 |     follow_state_ = TabWebFeedFollowState::kFollowed; | 
 |     web_feed_id_ = metadata.web_feed_id; | 
 |   } else if (metadata.subscription_status == | 
 |              WebFeedSubscriptionStatus::kNotSubscribed) { | 
 |     follow_state_ = TabWebFeedFollowState::kNotFollowed; | 
 |   } else { | 
 |     follow_state_ = TabWebFeedFollowState::kUnknown; | 
 |   } | 
 | } | 
 |  | 
 | void WebFeedTabHelper::UpdateWebFeedInfo(const GURL& url, | 
 |                                          TabWebFeedFollowState follow_state, | 
 |                                          const std::string& web_feed_id) { | 
 |   if (url != url_) | 
 |     return; | 
 |   follow_state_ = follow_state; | 
 |   web_feed_id_ = web_feed_id; | 
 | } | 
 |  | 
 | void WebFeedTabHelper::SetWebFeedInfoForTesting( | 
 |     const GURL& url, | 
 |     TabWebFeedFollowState follow_state, | 
 |     const std::string& web_feed_id) { | 
 |   url_ = url; | 
 |   follow_state_ = follow_state; | 
 |   web_feed_id_ = web_feed_id; | 
 | } | 
 |  | 
 | void WebFeedTabHelper::SetWebFeedInfoFinderForTesting( | 
 |     std::unique_ptr<WebFeedInfoFinder> finder) { | 
 |   web_feed_info_finder_ = std::move(finder); | 
 | } | 
 |  | 
 | WEB_CONTENTS_USER_DATA_KEY_IMPL(WebFeedTabHelper); | 
 |  | 
 | }  // namespace feed |