Commit 1ea248da authored by Dan Harrington's avatar Dan Harrington Committed by Commit Bot

feedv2: Use a placeholder client_instance_id

The server expects a value here for infinite feed to work.

Bug: 1044139, b/162375361
Change-Id: I9fb7b0085040db871ae1a497a17e6125ecd97095
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2325081
Commit-Queue: Dan H <harringtond@chromium.org>
Reviewed-by: default avatarRoger McFarlane <rogerm@chromium.org>
Cr-Commit-Position: refs/heads/master@{#793207}
parent 20b9851e
......@@ -44,6 +44,10 @@ public final class FeedServiceBridge {
FeedServiceBridgeJni.get().startup();
}
public static String getClientInstanceId() {
return FeedServiceBridgeJni.get().getClientInstanceId();
}
/** Retrieves the config value for load_more_trigger_lookahead. */
public static int getLoadMoreTriggerLookahead() {
return FeedServiceBridgeJni.get().getLoadMoreTriggerLookahead();
......@@ -54,5 +58,6 @@ public final class FeedServiceBridge {
boolean isEnabled();
void startup();
int getLoadMoreTriggerLookahead();
String getClientInstanceId();
}
}
......@@ -181,7 +181,6 @@ public class FeedStreamSurface implements SurfaceActionsHandler, FeedActionsHand
* Provides logging and context for all surfaces.
*
* TODO(rogerm): Find a more global home for this.
* TODO(rogerm): implement getClientInstanceId.
*/
private static class FeedSurfaceDependencyProvider implements SurfaceDependencyProvider {
FeedSurfaceDependencyProvider() {}
......@@ -204,6 +203,11 @@ public class FeedStreamSurface implements SurfaceActionsHandler, FeedActionsHand
public int[] getExperimentIds() {
return FeedStreamSurfaceJni.get().getExperimentIds();
}
@Override
public String getClientInstanceId() {
return FeedServiceBridge.getClientInstanceId();
}
}
/**
......
......@@ -18,6 +18,16 @@
#include "components/feed/core/v2/public/feed_service.h"
namespace feed {
namespace {
FeedService* GetFeedService() {
Profile* profile = ProfileManager::GetLastUsedProfile();
if (!profile)
return nullptr;
return FeedServiceFactory::GetForBrowserContext(profile);
}
} // namespace
static jboolean JNI_FeedServiceBridge_IsEnabled(JNIEnv* env) {
return FeedServiceBridge::IsEnabled();
......@@ -26,17 +36,23 @@ static jboolean JNI_FeedServiceBridge_IsEnabled(JNIEnv* env) {
static void JNI_FeedServiceBridge_Startup(JNIEnv* env) {
// Trigger creation FeedService, since we need to handle certain browser
// events, like sign-in/sign-out, even if the Feed isn't visible.
Profile* profile = ProfileManager::GetLastUsedProfile();
if (!profile)
return;
FeedServiceFactory::GetForBrowserContext(profile);
GetFeedService();
}
static int JNI_FeedServiceBridge_GetLoadMoreTriggerLookahead(JNIEnv* env) {
return GetFeedConfig().load_more_trigger_lookahead;
}
static base::android::ScopedJavaLocalRef<jstring>
JNI_FeedServiceBridge_GetClientInstanceId(JNIEnv* env) {
FeedService* service = GetFeedService();
std::string instance_id;
if (service) {
instance_id = service->GetStream()->GetClientInstanceId();
}
return base::android::ConvertUTF8ToJavaString(env, instance_id);
}
std::string FeedServiceBridge::GetLanguageTag() {
JNIEnv* env = base::android::AttachCurrentThread();
return ConvertJavaStringToUTF8(env,
......
......@@ -40,6 +40,7 @@ const char kThrottlerLastRequestTime[] =
const char kDebugStreamData[] = "feedv2.debug_stream_data";
const char kRequestSchedule[] = "feedv2.request_schedule";
const char kMetricsData[] = "feedv2.metrics_data";
const char kClientInstanceId[] = "feedv2.client_instance_id";
} // namespace prefs
......@@ -57,6 +58,7 @@ void RegisterProfilePrefs(PrefRegistrySimple* registry) {
registry->RegisterStringPref(feed::prefs::kDebugStreamData, std::string());
registry->RegisterDictionaryPref(feed::prefs::kRequestSchedule);
registry->RegisterDictionaryPref(feed::prefs::kMetricsData);
registry->RegisterStringPref(feed::prefs::kClientInstanceId, "");
UserClassifier::RegisterProfilePrefs(registry);
}
......
......@@ -54,6 +54,8 @@ extern const char kDebugStreamData[];
extern const char kRequestSchedule[];
// The pref name for storing the persistent metrics data.
extern const char kMetricsData[];
// The pref name for storing client instance id.
extern const char kClientInstanceId[];
} // namespace prefs
......
......@@ -244,6 +244,10 @@ bool FeedStream::IsArticlesListVisible() {
return profile_prefs_->GetBoolean(prefs::kArticlesListVisible);
}
std::string FeedStream::GetClientInstanceId() {
return prefs::GetClientInstanceId(*profile_prefs_);
}
bool FeedStream::IsFeedEnabledByEnterprisePolicy() {
return profile_prefs_->GetBoolean(prefs::kEnableSnippets);
}
......@@ -476,11 +480,12 @@ LoadStreamStatus FeedStream::ShouldMakeFeedQueryRequest(bool is_load_more,
return LoadStreamStatus::kNoStatus;
}
RequestMetadata FeedStream::GetRequestMetadata() const {
RequestMetadata FeedStream::GetRequestMetadata() {
RequestMetadata result;
result.chrome_info = chrome_info_;
result.display_metrics = delegate_->GetDisplayMetrics();
result.language_tag = delegate_->GetLanguageTag();
result.client_instance_id = GetClientInstanceId();
return result;
}
......@@ -536,8 +541,8 @@ void FeedStream::BackgroundRefreshComplete(LoadStreamTask::Result result) {
}
void FeedStream::ClearAll() {
prefs::ClearClientInstanceId(*profile_prefs_);
delegate_->ClearAll();
metrics_reporter_->OnClearAll(clock_->Now() - GetLastFetchTime());
task_queue_.AddTask(std::make_unique<ClearAllTask>(this));
......
......@@ -122,6 +122,7 @@ class FeedStream : public FeedStreamApi,
void DetachSurface(SurfaceInterface*) override;
void SetArticlesListVisible(bool is_visible) override;
bool IsArticlesListVisible() override;
std::string GetClientInstanceId() override;
void ExecuteRefreshTask() override;
void LoadMore(SurfaceId surface_id,
base::OnceCallback<void(bool)> callback) override;
......@@ -227,7 +228,7 @@ class FeedStream : public FeedStreamApi,
const base::Clock* GetClock() const { return clock_; }
const base::TickClock* GetTickClock() const { return tick_clock_; }
RequestMetadata GetRequestMetadata() const;
RequestMetadata GetRequestMetadata();
WireResponseTranslator* GetWireResponseTranslator() const {
return wire_response_translator_;
......
......@@ -1800,5 +1800,40 @@ TEST_F(FeedStreamTest, MultipleOfflineBadgesWithSameUrl) {
surface.GetDataStoreEntries());
}
TEST_F(FeedStreamTest, SendsClientInstanceId) {
stream_->GetMetadata()->SetConsistencyToken("token");
// Store is empty, so we should fallback to a network request.
response_translator_.InjectResponse(MakeTypicalInitialModelState());
TestSurface surface(stream_.get());
WaitForIdleTaskQueue();
ASSERT_EQ(1, network_.send_query_call_count);
ASSERT_TRUE(network_.query_request_sent);
// Instance ID is a random token. Verify it is not empty.
std::string first_instance_id = network_.query_request_sent->feed_request()
.client_info()
.client_instance_id();
EXPECT_NE("", first_instance_id);
// LoadMore, and verify the same token is used.
response_translator_.InjectResponse(MakeTypicalNextPageState(2));
stream_->LoadMore(surface.GetSurfaceId(), base::DoNothing());
WaitForIdleTaskQueue();
ASSERT_EQ(2, network_.send_query_call_count);
EXPECT_EQ(first_instance_id, network_.query_request_sent->feed_request()
.client_info()
.client_instance_id());
// Trigger a ClearAll to verify the instance ID changes.
stream_->OnSignedOut();
const std::string new_instance_id =
stream_->GetRequestMetadata().client_instance_id;
ASSERT_NE("", new_instance_id);
ASSERT_NE(first_instance_id, new_instance_id);
}
} // namespace
} // namespace feed
......@@ -6,6 +6,7 @@
#include <utility>
#include "base/token.h"
#include "base/values.h"
#include "components/feed/core/common/pref_names.h"
#include "components/feed/core/v2/scheduling.h"
......@@ -72,6 +73,19 @@ PersistentMetricsData GetPersistentMetricsData(PrefService& pref_service) {
return PersistentMetricsDataFromValue(*pref_service.Get(kMetricsData));
}
std::string GetClientInstanceId(PrefService& pref_service) {
std::string id = pref_service.GetString(feed::prefs::kClientInstanceId);
if (!id.empty())
return id;
id = base::Token::CreateRandom().ToString();
pref_service.SetString(feed::prefs::kClientInstanceId, id);
return id;
}
void ClearClientInstanceId(PrefService& pref_service) {
pref_service.ClearPref(feed::prefs::kClientInstanceId);
}
} // namespace prefs
} // namespace feed
......@@ -41,6 +41,9 @@ PersistentMetricsData GetPersistentMetricsData(PrefService& pref_service);
void SetPersistentMetricsData(const PersistentMetricsData& data,
PrefService& pref_service);
std::string GetClientInstanceId(PrefService& pref_service);
void ClearClientInstanceId(PrefService& pref_service);
} // namespace prefs
} // namespace feed
......
......@@ -180,7 +180,7 @@ bool CompareContent(const feedstore::Content& a, const feedstore::Content& b) {
feedwire::ClientInfo CreateClientInfo(const RequestMetadata& request_metadata) {
feedwire::ClientInfo client_info;
// TODO(harringtond): Fill out client_instance_id.
client_info.set_client_instance_id(request_metadata.client_instance_id);
feedwire::DisplayInfo& display_info = *client_info.add_display_info();
display_info.set_screen_density(request_metadata.display_metrics.density);
......
......@@ -56,6 +56,10 @@ class FeedStreamApi {
virtual void SetArticlesListVisible(bool is_visible) = 0;
virtual bool IsArticlesListVisible() = 0;
// Returns the client_instance_id. This value is reset whenever the feed
// stream is cleared (on sign-in, sign-out, and some data clear events).
virtual std::string GetClientInstanceId() = 0;
// Invoked by RefreshTaskScheduler's scheduled task.
virtual void ExecuteRefreshTask() = 0;
......
......@@ -68,6 +68,11 @@ base::Optional<DebugStreamData> UnpickleDebugStreamData(
} // namespace
RequestMetadata::RequestMetadata() = default;
RequestMetadata::~RequestMetadata() = default;
RequestMetadata::RequestMetadata(RequestMetadata&&) = default;
RequestMetadata& RequestMetadata::operator=(RequestMetadata&&) = default;
NetworkResponseInfo::NetworkResponseInfo() = default;
NetworkResponseInfo::~NetworkResponseInfo() = default;
NetworkResponseInfo::NetworkResponseInfo(const NetworkResponseInfo&) = default;
......
......@@ -30,8 +30,14 @@ ContentRevision ToContentRevision(const std::string& str);
// Metadata sent with Feed requests.
struct RequestMetadata {
RequestMetadata();
~RequestMetadata();
RequestMetadata(RequestMetadata&&);
RequestMetadata& operator=(RequestMetadata&&);
ChromeInfo chrome_info;
std::string language_tag;
std::string client_instance_id;
DisplayMetrics display_metrics;
};
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment