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 { ...@@ -44,6 +44,10 @@ public final class FeedServiceBridge {
FeedServiceBridgeJni.get().startup(); FeedServiceBridgeJni.get().startup();
} }
public static String getClientInstanceId() {
return FeedServiceBridgeJni.get().getClientInstanceId();
}
/** Retrieves the config value for load_more_trigger_lookahead. */ /** Retrieves the config value for load_more_trigger_lookahead. */
public static int getLoadMoreTriggerLookahead() { public static int getLoadMoreTriggerLookahead() {
return FeedServiceBridgeJni.get().getLoadMoreTriggerLookahead(); return FeedServiceBridgeJni.get().getLoadMoreTriggerLookahead();
...@@ -54,5 +58,6 @@ public final class FeedServiceBridge { ...@@ -54,5 +58,6 @@ public final class FeedServiceBridge {
boolean isEnabled(); boolean isEnabled();
void startup(); void startup();
int getLoadMoreTriggerLookahead(); int getLoadMoreTriggerLookahead();
String getClientInstanceId();
} }
} }
...@@ -181,7 +181,6 @@ public class FeedStreamSurface implements SurfaceActionsHandler, FeedActionsHand ...@@ -181,7 +181,6 @@ public class FeedStreamSurface implements SurfaceActionsHandler, FeedActionsHand
* Provides logging and context for all surfaces. * Provides logging and context for all surfaces.
* *
* TODO(rogerm): Find a more global home for this. * TODO(rogerm): Find a more global home for this.
* TODO(rogerm): implement getClientInstanceId.
*/ */
private static class FeedSurfaceDependencyProvider implements SurfaceDependencyProvider { private static class FeedSurfaceDependencyProvider implements SurfaceDependencyProvider {
FeedSurfaceDependencyProvider() {} FeedSurfaceDependencyProvider() {}
...@@ -204,6 +203,11 @@ public class FeedStreamSurface implements SurfaceActionsHandler, FeedActionsHand ...@@ -204,6 +203,11 @@ public class FeedStreamSurface implements SurfaceActionsHandler, FeedActionsHand
public int[] getExperimentIds() { public int[] getExperimentIds() {
return FeedStreamSurfaceJni.get().getExperimentIds(); return FeedStreamSurfaceJni.get().getExperimentIds();
} }
@Override
public String getClientInstanceId() {
return FeedServiceBridge.getClientInstanceId();
}
} }
/** /**
......
...@@ -18,6 +18,16 @@ ...@@ -18,6 +18,16 @@
#include "components/feed/core/v2/public/feed_service.h" #include "components/feed/core/v2/public/feed_service.h"
namespace feed { 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) { static jboolean JNI_FeedServiceBridge_IsEnabled(JNIEnv* env) {
return FeedServiceBridge::IsEnabled(); return FeedServiceBridge::IsEnabled();
...@@ -26,17 +36,23 @@ static jboolean JNI_FeedServiceBridge_IsEnabled(JNIEnv* env) { ...@@ -26,17 +36,23 @@ static jboolean JNI_FeedServiceBridge_IsEnabled(JNIEnv* env) {
static void JNI_FeedServiceBridge_Startup(JNIEnv* env) { static void JNI_FeedServiceBridge_Startup(JNIEnv* env) {
// Trigger creation FeedService, since we need to handle certain browser // Trigger creation FeedService, since we need to handle certain browser
// events, like sign-in/sign-out, even if the Feed isn't visible. // events, like sign-in/sign-out, even if the Feed isn't visible.
Profile* profile = ProfileManager::GetLastUsedProfile(); GetFeedService();
if (!profile)
return;
FeedServiceFactory::GetForBrowserContext(profile);
} }
static int JNI_FeedServiceBridge_GetLoadMoreTriggerLookahead(JNIEnv* env) { static int JNI_FeedServiceBridge_GetLoadMoreTriggerLookahead(JNIEnv* env) {
return GetFeedConfig().load_more_trigger_lookahead; 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() { std::string FeedServiceBridge::GetLanguageTag() {
JNIEnv* env = base::android::AttachCurrentThread(); JNIEnv* env = base::android::AttachCurrentThread();
return ConvertJavaStringToUTF8(env, return ConvertJavaStringToUTF8(env,
......
...@@ -40,6 +40,7 @@ const char kThrottlerLastRequestTime[] = ...@@ -40,6 +40,7 @@ const char kThrottlerLastRequestTime[] =
const char kDebugStreamData[] = "feedv2.debug_stream_data"; const char kDebugStreamData[] = "feedv2.debug_stream_data";
const char kRequestSchedule[] = "feedv2.request_schedule"; const char kRequestSchedule[] = "feedv2.request_schedule";
const char kMetricsData[] = "feedv2.metrics_data"; const char kMetricsData[] = "feedv2.metrics_data";
const char kClientInstanceId[] = "feedv2.client_instance_id";
} // namespace prefs } // namespace prefs
...@@ -57,6 +58,7 @@ void RegisterProfilePrefs(PrefRegistrySimple* registry) { ...@@ -57,6 +58,7 @@ void RegisterProfilePrefs(PrefRegistrySimple* registry) {
registry->RegisterStringPref(feed::prefs::kDebugStreamData, std::string()); registry->RegisterStringPref(feed::prefs::kDebugStreamData, std::string());
registry->RegisterDictionaryPref(feed::prefs::kRequestSchedule); registry->RegisterDictionaryPref(feed::prefs::kRequestSchedule);
registry->RegisterDictionaryPref(feed::prefs::kMetricsData); registry->RegisterDictionaryPref(feed::prefs::kMetricsData);
registry->RegisterStringPref(feed::prefs::kClientInstanceId, "");
UserClassifier::RegisterProfilePrefs(registry); UserClassifier::RegisterProfilePrefs(registry);
} }
......
...@@ -54,6 +54,8 @@ extern const char kDebugStreamData[]; ...@@ -54,6 +54,8 @@ extern const char kDebugStreamData[];
extern const char kRequestSchedule[]; extern const char kRequestSchedule[];
// The pref name for storing the persistent metrics data. // The pref name for storing the persistent metrics data.
extern const char kMetricsData[]; extern const char kMetricsData[];
// The pref name for storing client instance id.
extern const char kClientInstanceId[];
} // namespace prefs } // namespace prefs
......
...@@ -244,6 +244,10 @@ bool FeedStream::IsArticlesListVisible() { ...@@ -244,6 +244,10 @@ bool FeedStream::IsArticlesListVisible() {
return profile_prefs_->GetBoolean(prefs::kArticlesListVisible); return profile_prefs_->GetBoolean(prefs::kArticlesListVisible);
} }
std::string FeedStream::GetClientInstanceId() {
return prefs::GetClientInstanceId(*profile_prefs_);
}
bool FeedStream::IsFeedEnabledByEnterprisePolicy() { bool FeedStream::IsFeedEnabledByEnterprisePolicy() {
return profile_prefs_->GetBoolean(prefs::kEnableSnippets); return profile_prefs_->GetBoolean(prefs::kEnableSnippets);
} }
...@@ -476,11 +480,12 @@ LoadStreamStatus FeedStream::ShouldMakeFeedQueryRequest(bool is_load_more, ...@@ -476,11 +480,12 @@ LoadStreamStatus FeedStream::ShouldMakeFeedQueryRequest(bool is_load_more,
return LoadStreamStatus::kNoStatus; return LoadStreamStatus::kNoStatus;
} }
RequestMetadata FeedStream::GetRequestMetadata() const { RequestMetadata FeedStream::GetRequestMetadata() {
RequestMetadata result; RequestMetadata result;
result.chrome_info = chrome_info_; result.chrome_info = chrome_info_;
result.display_metrics = delegate_->GetDisplayMetrics(); result.display_metrics = delegate_->GetDisplayMetrics();
result.language_tag = delegate_->GetLanguageTag(); result.language_tag = delegate_->GetLanguageTag();
result.client_instance_id = GetClientInstanceId();
return result; return result;
} }
...@@ -536,8 +541,8 @@ void FeedStream::BackgroundRefreshComplete(LoadStreamTask::Result result) { ...@@ -536,8 +541,8 @@ void FeedStream::BackgroundRefreshComplete(LoadStreamTask::Result result) {
} }
void FeedStream::ClearAll() { void FeedStream::ClearAll() {
prefs::ClearClientInstanceId(*profile_prefs_);
delegate_->ClearAll(); delegate_->ClearAll();
metrics_reporter_->OnClearAll(clock_->Now() - GetLastFetchTime()); metrics_reporter_->OnClearAll(clock_->Now() - GetLastFetchTime());
task_queue_.AddTask(std::make_unique<ClearAllTask>(this)); task_queue_.AddTask(std::make_unique<ClearAllTask>(this));
......
...@@ -122,6 +122,7 @@ class FeedStream : public FeedStreamApi, ...@@ -122,6 +122,7 @@ class FeedStream : public FeedStreamApi,
void DetachSurface(SurfaceInterface*) override; void DetachSurface(SurfaceInterface*) override;
void SetArticlesListVisible(bool is_visible) override; void SetArticlesListVisible(bool is_visible) override;
bool IsArticlesListVisible() override; bool IsArticlesListVisible() override;
std::string GetClientInstanceId() override;
void ExecuteRefreshTask() override; void ExecuteRefreshTask() override;
void LoadMore(SurfaceId surface_id, void LoadMore(SurfaceId surface_id,
base::OnceCallback<void(bool)> callback) override; base::OnceCallback<void(bool)> callback) override;
...@@ -227,7 +228,7 @@ class FeedStream : public FeedStreamApi, ...@@ -227,7 +228,7 @@ class FeedStream : public FeedStreamApi,
const base::Clock* GetClock() const { return clock_; } const base::Clock* GetClock() const { return clock_; }
const base::TickClock* GetTickClock() const { return tick_clock_; } const base::TickClock* GetTickClock() const { return tick_clock_; }
RequestMetadata GetRequestMetadata() const; RequestMetadata GetRequestMetadata();
WireResponseTranslator* GetWireResponseTranslator() const { WireResponseTranslator* GetWireResponseTranslator() const {
return wire_response_translator_; return wire_response_translator_;
......
...@@ -1800,5 +1800,40 @@ TEST_F(FeedStreamTest, MultipleOfflineBadgesWithSameUrl) { ...@@ -1800,5 +1800,40 @@ TEST_F(FeedStreamTest, MultipleOfflineBadgesWithSameUrl) {
surface.GetDataStoreEntries()); 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
} // namespace feed } // namespace feed
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
#include <utility> #include <utility>
#include "base/token.h"
#include "base/values.h" #include "base/values.h"
#include "components/feed/core/common/pref_names.h" #include "components/feed/core/common/pref_names.h"
#include "components/feed/core/v2/scheduling.h" #include "components/feed/core/v2/scheduling.h"
...@@ -72,6 +73,19 @@ PersistentMetricsData GetPersistentMetricsData(PrefService& pref_service) { ...@@ -72,6 +73,19 @@ PersistentMetricsData GetPersistentMetricsData(PrefService& pref_service) {
return PersistentMetricsDataFromValue(*pref_service.Get(kMetricsData)); 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 prefs
} // namespace feed } // namespace feed
...@@ -41,6 +41,9 @@ PersistentMetricsData GetPersistentMetricsData(PrefService& pref_service); ...@@ -41,6 +41,9 @@ PersistentMetricsData GetPersistentMetricsData(PrefService& pref_service);
void SetPersistentMetricsData(const PersistentMetricsData& data, void SetPersistentMetricsData(const PersistentMetricsData& data,
PrefService& pref_service); PrefService& pref_service);
std::string GetClientInstanceId(PrefService& pref_service);
void ClearClientInstanceId(PrefService& pref_service);
} // namespace prefs } // namespace prefs
} // namespace feed } // namespace feed
......
...@@ -180,7 +180,7 @@ bool CompareContent(const feedstore::Content& a, const feedstore::Content& b) { ...@@ -180,7 +180,7 @@ bool CompareContent(const feedstore::Content& a, const feedstore::Content& b) {
feedwire::ClientInfo CreateClientInfo(const RequestMetadata& request_metadata) { feedwire::ClientInfo CreateClientInfo(const RequestMetadata& request_metadata) {
feedwire::ClientInfo client_info; 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(); feedwire::DisplayInfo& display_info = *client_info.add_display_info();
display_info.set_screen_density(request_metadata.display_metrics.density); display_info.set_screen_density(request_metadata.display_metrics.density);
......
...@@ -56,6 +56,10 @@ class FeedStreamApi { ...@@ -56,6 +56,10 @@ class FeedStreamApi {
virtual void SetArticlesListVisible(bool is_visible) = 0; virtual void SetArticlesListVisible(bool is_visible) = 0;
virtual bool IsArticlesListVisible() = 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. // Invoked by RefreshTaskScheduler's scheduled task.
virtual void ExecuteRefreshTask() = 0; virtual void ExecuteRefreshTask() = 0;
......
...@@ -68,6 +68,11 @@ base::Optional<DebugStreamData> UnpickleDebugStreamData( ...@@ -68,6 +68,11 @@ base::Optional<DebugStreamData> UnpickleDebugStreamData(
} // namespace } // namespace
RequestMetadata::RequestMetadata() = default;
RequestMetadata::~RequestMetadata() = default;
RequestMetadata::RequestMetadata(RequestMetadata&&) = default;
RequestMetadata& RequestMetadata::operator=(RequestMetadata&&) = default;
NetworkResponseInfo::NetworkResponseInfo() = default; NetworkResponseInfo::NetworkResponseInfo() = default;
NetworkResponseInfo::~NetworkResponseInfo() = default; NetworkResponseInfo::~NetworkResponseInfo() = default;
NetworkResponseInfo::NetworkResponseInfo(const NetworkResponseInfo&) = default; NetworkResponseInfo::NetworkResponseInfo(const NetworkResponseInfo&) = default;
......
...@@ -30,8 +30,14 @@ ContentRevision ToContentRevision(const std::string& str); ...@@ -30,8 +30,14 @@ ContentRevision ToContentRevision(const std::string& str);
// Metadata sent with Feed requests. // Metadata sent with Feed requests.
struct RequestMetadata { struct RequestMetadata {
RequestMetadata();
~RequestMetadata();
RequestMetadata(RequestMetadata&&);
RequestMetadata& operator=(RequestMetadata&&);
ChromeInfo chrome_info; ChromeInfo chrome_info;
std::string language_tag; std::string language_tag;
std::string client_instance_id;
DisplayMetrics display_metrics; 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