Commit c3f7c09f authored by Ian Wells's avatar Ian Wells Committed by Commit Bot

feedv2: Allow disabling feedwire::Capabilities through Finch

This change makes it possible to stop capabilities from being added to feed requests by setting "enable_CAPABILITY_NAME = false" to InterestFeedV2's Finch config. Note that "enable_... = true" has no effect.

Bug: 1044139
Change-Id: I5a5122affa355d4d30d15b9004554c64b7777d43
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2357449
Commit-Queue: Ian Wells <iwells@chromium.org>
Reviewed-by: default avatarDan H <harringtond@chromium.org>
Cr-Commit-Position: refs/heads/master@{#798676}
parent 87244d9b
......@@ -4,7 +4,11 @@
#include "components/feed/core/v2/config.h"
#include "base/containers/flat_set.h"
#include "base/metrics/field_trial_params.h"
#include "base/stl_util.h"
#include "base/strings/strcat.h"
#include "components/feed/core/proto/v2/wire/capability.pb.h"
#include "components/feed/feed_feature_list.h"
namespace feed {
......@@ -16,7 +20,12 @@ namespace {
// plan is to send configuration down from the server, and store it in prefs.
// The source of a config value would be the following, in order of preference:
// finch, server, default-value.
Config g_config;
bool CapabilityDisabled(feedwire::Capability capability) {
return !base::GetFieldTrialParamByFeatureAsBool(
kInterestFeedV2,
base::StrCat({"enable_", feedwire::Capability_Name(capability)}), true);
}
// Override any parameters that may be provided by Finch.
void OverrideWithFinch(Config* config) {
......@@ -66,24 +75,32 @@ void OverrideWithFinch(Config* config) {
base::GetFieldTrialParamByFeatureAsBool(
kInterestFeedV2, "upload_actions_on_enter_background",
config->upload_actions_on_enter_background);
// Erase any capabilities with "enable_CAPABILITY = false" set.
base::EraseIf(config->experimental_capabilities, CapabilityDisabled);
}
} // namespace
const Config& GetFeedConfig() {
static bool initialized = false;
if (!initialized) {
initialized = true;
OverrideWithFinch(&g_config);
static Config* s_config = nullptr;
if (!s_config) {
s_config = new Config;
OverrideWithFinch(s_config);
}
return g_config;
return *s_config;
}
void SetFeedConfigForTesting(const Config& config) {
g_config = config;
const_cast<Config&>(GetFeedConfig()) = config;
}
void OverrideConfigWithFinchForTesting() {
OverrideWithFinch(&const_cast<Config&>(GetFeedConfig()));
}
Config::Config() = default;
Config::Config(const Config& other) = default;
Config::~Config() = default;
} // namespace feed
......@@ -5,7 +5,9 @@
#ifndef COMPONENTS_FEED_CORE_V2_CONFIG_H_
#define COMPONENTS_FEED_CORE_V2_CONFIG_H_
#include "base/containers/flat_set.h"
#include "base/time/time.h"
#include "components/feed/core/proto/v2/wire/capability.pb.h"
namespace feed {
......@@ -36,15 +38,28 @@ struct Config {
int load_more_trigger_lookahead = 5;
// Whether to attempt uploading actions when Chrome is hidden.
bool upload_actions_on_enter_background = true;
// Set of optional capabilities included in requests. See
// CreateFeedQueryRequest() for required capabilities.
base::flat_set<feedwire::Capability> experimental_capabilities = {
feedwire::Capability::REQUEST_SCHEDULE,
feedwire::Capability::OPEN_IN_TAB,
feedwire::Capability::DOWNLOAD_LINK,
feedwire::Capability::INFINITE_FEED,
feedwire::Capability::DISMISS_COMMAND,
feedwire::Capability::UI_THEME_V2,
feedwire::Capability::UNDO_FOR_DISMISS_COMMAND,
};
Config();
Config(const Config& other);
~Config();
};
// Gets the current configuration.
const Config& GetFeedConfig();
void SetFeedConfigForTesting(const Config& config);
void OverrideConfigWithFinchForTesting();
} // namespace feed
......
......@@ -15,6 +15,7 @@
#include "components/feed/core/proto/v2/wire/capability.pb.h"
#include "components/feed/core/proto/v2/wire/feed_request.pb.h"
#include "components/feed/core/proto/v2/wire/request.pb.h"
#include "components/feed/core/v2/config.h"
#include "components/feed/core/v2/feed_stream.h"
#if defined(OS_ANDROID)
......@@ -116,15 +117,9 @@ feedwire::Request CreateFeedQueryRequest(
feedwire::FeedRequest& feed_request = *request.mutable_feed_request();
feed_request.add_client_capability(feedwire::Capability::BASE_UI);
feed_request.add_client_capability(feedwire::Capability::REQUEST_SCHEDULE);
feed_request.add_client_capability(feedwire::Capability::OPEN_IN_TAB);
feed_request.add_client_capability(feedwire::Capability::CARD_MENU);
feed_request.add_client_capability(feedwire::Capability::DOWNLOAD_LINK);
feed_request.add_client_capability(feedwire::Capability::INFINITE_FEED);
feed_request.add_client_capability(feedwire::Capability::DISMISS_COMMAND);
feed_request.add_client_capability(feedwire::Capability::UI_THEME_V2);
feed_request.add_client_capability(
feedwire::Capability::UNDO_FOR_DISMISS_COMMAND);
for (auto capability : GetFeedConfig().experimental_capabilities)
feed_request.add_client_capability(capability);
*feed_request.mutable_client_info() = CreateClientInfo(request_metadata);
feedwire::FeedQuery& query = *feed_request.mutable_feed_query();
......
......@@ -4,15 +4,30 @@
#include "components/feed/core/v2/proto_util.h"
#include "base/test/scoped_feature_list.h"
#include "components/feed/core/proto/v2/wire/capability.pb.h"
#include "components/feed/core/proto/v2/wire/client_info.pb.h"
#include "components/feed/core/proto/v2/wire/feed_request.pb.h"
#include "components/feed/core/proto/v2/wire/request.pb.h"
#include "components/feed/core/v2/config.h"
#include "components/feed/core/v2/test/proto_printer.h"
#include "components/feed/core/v2/types.h"
#include "components/feed/feed_feature_list.h"
#include "components/version_info/channel.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace feed {
namespace {
bool HasCapability(const feedwire::FeedRequest& request,
feedwire::Capability wanted_capability) {
for (auto capability : request.client_capability()) {
if (wanted_capability == capability)
return true;
}
return false;
}
TEST(ProtoUtilTest, CreateClientInfo) {
RequestMetadata request_metadata;
request_metadata.chrome_info.version = base::Version({1, 2, 3, 4});
......@@ -40,5 +55,56 @@ TEST(ProtoUtilTest, CreateClientInfo) {
EXPECT_EQ("en-US", result.locale());
}
TEST(ProtoUtilTest, DefaultCapabilities) {
feedwire::FeedRequest request =
CreateFeedQueryRefreshRequest(feedwire::FeedQuery::MANUAL_REFRESH,
/*request_metadata=*/{},
/*consistency_token=*/std::string())
.feed_request();
ASSERT_EQ(9, request.client_capability_size());
EXPECT_TRUE(HasCapability(request, feedwire::Capability::BASE_UI));
EXPECT_TRUE(HasCapability(request, feedwire::Capability::REQUEST_SCHEDULE));
EXPECT_TRUE(HasCapability(request, feedwire::Capability::OPEN_IN_TAB));
EXPECT_TRUE(HasCapability(request, feedwire::Capability::CARD_MENU));
EXPECT_TRUE(HasCapability(request, feedwire::Capability::DOWNLOAD_LINK));
EXPECT_TRUE(HasCapability(request, feedwire::Capability::INFINITE_FEED));
EXPECT_TRUE(HasCapability(request, feedwire::Capability::DISMISS_COMMAND));
EXPECT_TRUE(HasCapability(request, feedwire::Capability::UI_THEME_V2));
EXPECT_TRUE(
HasCapability(request, feedwire::Capability::UNDO_FOR_DISMISS_COMMAND));
}
TEST(ProtoUtilTest, DisableCapabilitiesWithFinch) {
base::test::ScopedFeatureList scoped_feature_list;
scoped_feature_list.InitAndEnableFeatureWithParameters(
kInterestFeedV2,
{{"enable_BASE_UI", "false"}, {"enable_INFINITE_FEED", "false"}});
OverrideConfigWithFinchForTesting();
feedwire::FeedRequest request =
CreateFeedQueryRefreshRequest(feedwire::FeedQuery::MANUAL_REFRESH,
/*request_metadata=*/{},
/*consistency_token=*/std::string())
.feed_request();
ASSERT_EQ(8, request.client_capability_size());
// Optional capabilities can be disabled.
EXPECT_FALSE(HasCapability(request, feedwire::Capability::INFINITE_FEED));
// Required capabilities can't be disabled.
EXPECT_TRUE(HasCapability(request, feedwire::Capability::BASE_UI));
EXPECT_TRUE(HasCapability(request, feedwire::Capability::REQUEST_SCHEDULE));
EXPECT_TRUE(HasCapability(request, feedwire::Capability::OPEN_IN_TAB));
EXPECT_TRUE(HasCapability(request, feedwire::Capability::CARD_MENU));
EXPECT_TRUE(HasCapability(request, feedwire::Capability::DOWNLOAD_LINK));
EXPECT_TRUE(HasCapability(request, feedwire::Capability::DISMISS_COMMAND));
EXPECT_TRUE(HasCapability(request, feedwire::Capability::UI_THEME_V2));
EXPECT_TRUE(
HasCapability(request, feedwire::Capability::UNDO_FOR_DISMISS_COMMAND));
}
} // namespace
} // namespace feed
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