// 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