0

Remove Kaleidoscope code

Kaleidoscope has been turned down.

Change-Id: Ia7808eff9d37b46fcf8d1eba95d9d52e456ca34b
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2596439
Commit-Queue: Becca Hughes <beccahughes@chromium.org>
Reviewed-by: Martin Šrámek <msramek@chromium.org>
Reviewed-by: Tommy Steimel <steimel@chromium.org>
Reviewed-by: Avi Drissman <avi@chromium.org>
Reviewed-by: Daniel Cheng <dcheng@chromium.org>
Reviewed-by: Bruce Dawson <brucedawson@chromium.org>
Cr-Commit-Position: refs/heads/master@{#840632}
This commit is contained in:
Becca Hughes
2021-01-06 16:42:54 +00:00
committed by Chromium LUCI CQ
parent 587c3e2042
commit 3e5b1be4a2
65 changed files with 9 additions and 3873 deletions
BUILD.gn
chrome
browser
chrome_paks.gni
common
test
tools/traffic_annotation/summary

@ -1402,10 +1402,6 @@ if (enable_js_type_check) {
if (is_android) {
data_deps += [ "components/offline_pages/resources:closure_compile" ]
}
if (enable_kaleidoscope) {
data_deps +=
[ "chrome/browser/media/kaleidoscope/internal:closure_compile" ]
}
}
}

@ -77,7 +77,6 @@ if (is_win) {
buildflag_header("buildflags") {
header = "buildflags.h"
flags = [
"ENABLE_KALEIDOSCOPE=$enable_kaleidoscope",
"USE_MINIKIN_HYPHENATION=$use_minikin_hyphenation",
"ENABLE_CHROMIUM_UPDATER=$enable_chromium_updater",
"USE_THIN_LTO=$use_thin_lto",
@ -682,8 +681,6 @@ static_library("browser") {
"media/history/media_history_feeds_table.h",
"media/history/media_history_images_table.cc",
"media/history/media_history_images_table.h",
"media/history/media_history_kaleidoscope_data_table.cc",
"media/history/media_history_kaleidoscope_data_table.h",
"media/history/media_history_keyed_service.cc",
"media/history/media_history_keyed_service.h",
"media/history/media_history_keyed_service_factory.cc",
@ -1989,7 +1986,6 @@ static_library("browser") {
"//chrome/browser/media:mojo_bindings",
"//chrome/browser/media/feeds:mojo_bindings",
"//chrome/browser/media/feeds:proto",
"//chrome/browser/media/kaleidoscope/mojom",
"//chrome/browser/media/router",
"//chrome/browser/metrics:expired_histograms_array",
"//chrome/browser/metrics/variations:chrome_ui_string_overrider_factory",
@ -3673,26 +3669,6 @@ static_library("browser") {
"media/feeds/media_feeds_service.h",
"media/feeds/media_feeds_service_factory.cc",
"media/feeds/media_feeds_service_factory.h",
"media/kaleidoscope/constants.cc",
"media/kaleidoscope/constants.h",
"media/kaleidoscope/kaleidoscope_data_provider_impl.cc",
"media/kaleidoscope/kaleidoscope_data_provider_impl.h",
"media/kaleidoscope/kaleidoscope_identity_manager_impl.cc",
"media/kaleidoscope/kaleidoscope_identity_manager_impl.h",
"media/kaleidoscope/kaleidoscope_metrics_recorder.cc",
"media/kaleidoscope/kaleidoscope_metrics_recorder.h",
"media/kaleidoscope/kaleidoscope_prefs.cc",
"media/kaleidoscope/kaleidoscope_prefs.h",
"media/kaleidoscope/kaleidoscope_service.cc",
"media/kaleidoscope/kaleidoscope_service.h",
"media/kaleidoscope/kaleidoscope_service_factory.cc",
"media/kaleidoscope/kaleidoscope_service_factory.h",
"media/kaleidoscope/kaleidoscope_switches.cc",
"media/kaleidoscope/kaleidoscope_switches.h",
"media/kaleidoscope/kaleidoscope_tab_helper.cc",
"media/kaleidoscope/kaleidoscope_tab_helper.h",
"media/kaleidoscope/kaleidoscope_ui.cc",
"media/kaleidoscope/kaleidoscope_ui.h",
"media/unified_autoplay_config.cc",
"media/unified_autoplay_config.h",
"media/webrtc/desktop_capture_devices_util.cc",
@ -4171,8 +4147,6 @@ static_library("browser") {
"//chrome/app:command_ids",
"//chrome/app/theme:chrome_unscaled_resources_grit",
"//chrome/app/vector_icons",
"//chrome/browser/media/kaleidoscope:kaleidoscope_resources",
"//chrome/browser/media/kaleidoscope/mojom",
"//chrome/browser/policy:path_parser",
"//chrome/browser/profile_resetter:profile_reset_report_proto",
"//chrome/browser/resource_coordinator:intervention_policy_database_proto",

@ -990,11 +990,6 @@ void ChromeBrowsingDataRemoverDelegate::RemoveEmbedderData(
media_history_service->ResetMediaFeedDueToCacheClearing(
delete_begin_, delete_end_, nullable_filter,
CreateTaskCompletionClosure(TracingDataType::kMediaFeeds));
if (nullable_filter.is_null() ||
nullable_filter.Run(GaiaUrls::GetInstance()->google_url())) {
media_history_service->DeleteKaleidoscopeData();
}
}
}

@ -5,8 +5,6 @@
import("//build/config/chrome_build.gni")
declare_args() {
enable_kaleidoscope = false
# Chromium Updater is a cross-platform updater for desktop clients built using
# Chromium code and tools. Code is in //chrome/updater. The design doc is
# located at http://bit.ly/chromium-updater. Chrome is currently installed and

@ -105,10 +105,6 @@
#include "chrome/browser/badging/badge_manager.h"
#include "chrome/browser/cart/chrome_cart.mojom.h"
#include "chrome/browser/media/feeds/media_feeds_store.mojom.h"
#include "chrome/browser/media/kaleidoscope/kaleidoscope_data_provider_impl.h"
#include "chrome/browser/media/kaleidoscope/kaleidoscope_identity_manager_impl.h"
#include "chrome/browser/media/kaleidoscope/kaleidoscope_ui.h"
#include "chrome/browser/media/kaleidoscope/mojom/kaleidoscope.mojom.h"
#include "chrome/browser/payments/payment_credential_factory.h"
#include "chrome/browser/payments/payment_request_factory.h"
#include "chrome/browser/promo_browser_command/promo_browser_command.mojom.h"
@ -815,14 +811,6 @@ void PopulateChromeWebUIFrameBinders(
ResetPasswordUI>(map);
#endif
#if !defined(OS_ANDROID)
RegisterWebUIControllerInterfaceBinder<media::mojom::KaleidoscopeDataProvider,
KaleidoscopeUI>(map);
RegisterWebUIControllerInterfaceBinder<
media::mojom::KaleidoscopeIdentityManager, KaleidoscopeUI>(map);
#endif // !defined(OS_ANDROID)
#if BUILDFLAG(IS_CHROMEOS_ASH)
if (base::FeatureList::IsEnabled(features::kNearbySharing)) {
RegisterWebUIControllerInterfaceBinder<

@ -23,7 +23,6 @@
#include "chrome/browser/media/feeds/media_feeds_store.mojom.h"
#include "chrome/browser/media/history/media_history_keyed_service.h"
#include "chrome/browser/media/history/media_history_keyed_service_factory.h"
#include "chrome/browser/media/kaleidoscope/kaleidoscope_prefs.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/common/pref_names.h"
#include "components/pref_registry/pref_registry_syncable.h"
@ -211,6 +210,7 @@ void MediaFeedsService::RegisterProfilePrefs(
user_prefs::PrefRegistrySyncable* registry) {
registry->RegisterBooleanPref(prefs::kMediaFeedsBackgroundFetching, false);
registry->RegisterBooleanPref(prefs::kMediaFeedsSafeSearchEnabled, false);
registry->RegisterBooleanPref(prefs::kMediaFeedsAutoSelectEnabled, false);
}
void MediaFeedsService::CheckItemsAgainstSafeSearch(
@ -382,8 +382,7 @@ void MediaFeedsService::FetchTopMediaFeeds(base::OnceClosure callback) {
// If the user has opted into auto selection of media feeds then we should get
// the top media feeds based on heuristics. Otherwise, we should fallback to
// feeds the user has opted into.
if (profile_->GetPrefs()->GetBoolean(
kaleidoscope::prefs::kKaleidoscopeAutoSelectMediaFeeds)) {
if (profile_->GetPrefs()->GetBoolean(prefs::kMediaFeedsAutoSelectEnabled)) {
GetMediaHistoryService()->GetMediaFeeds(
media_history::MediaHistoryKeyedService::GetMediaFeedsRequest::
CreateTopFeedsForFetch(kMaxTopFeedsToFetch, kTopFeedsMinWatchTime),

@ -17,7 +17,6 @@
#include "chrome/browser/media/feeds/media_feeds_store.mojom-shared.h"
#include "chrome/browser/media/history/media_history_keyed_service.h"
#include "chrome/browser/media/history/media_history_test_utils.h"
#include "chrome/browser/media/kaleidoscope/kaleidoscope_prefs.h"
#include "chrome/common/pref_names.h"
#include "chrome/test/base/chrome_render_view_host_test_harness.h"
#include "chrome/test/base/testing_profile.h"
@ -347,8 +346,8 @@ class MediaFeedsServiceTest : public ChromeRenderViewHostTestHarness {
}
void SetAutomaticSelectionEnabled() {
profile()->GetPrefs()->SetBoolean(
kaleidoscope::prefs::kKaleidoscopeAutoSelectMediaFeeds, true);
profile()->GetPrefs()->SetBoolean(prefs::kMediaFeedsAutoSelectEnabled,
true);
}
safe_search_api::StubURLChecker* safe_search_checker() {

@ -1,119 +0,0 @@
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/media/history/media_history_kaleidoscope_data_table.h"
#include "base/logging.h"
#include "base/strings/string_util.h"
#include "base/strings/stringprintf.h"
#include "sql/statement.h"
namespace media_history {
const char MediaHistoryKaleidoscopeDataTable::kTableName[] = "kaleidoscopeData";
MediaHistoryKaleidoscopeDataTable::MediaHistoryKaleidoscopeDataTable(
scoped_refptr<base::UpdateableSequencedTaskRunner> db_task_runner)
: MediaHistoryTableBase(std::move(db_task_runner)) {}
MediaHistoryKaleidoscopeDataTable::~MediaHistoryKaleidoscopeDataTable() =
default;
sql::InitStatus MediaHistoryKaleidoscopeDataTable::CreateTableIfNonExistent() {
if (!CanAccessDatabase())
return sql::INIT_FAILURE;
bool success = DB()->Execute(
"CREATE TABLE IF NOT EXISTS kaleidoscopeData("
"id INTEGER PRIMARY KEY AUTOINCREMENT,"
"data BLOB, "
"result INTEGER, "
"gaia_id TEXT UNIQUE, "
"last_updated_time_s INTEGER)");
if (!success) {
ResetDB();
DLOG(ERROR) << "Failed to create media history kaleidoscope data table.";
return sql::INIT_FAILURE;
}
return sql::INIT_OK;
}
bool MediaHistoryKaleidoscopeDataTable::Set(
media::mojom::GetCollectionsResponsePtr data,
const std::string& gaia_id) {
DCHECK_LT(0, DB()->transaction_nesting());
if (!CanAccessDatabase())
return false;
sql::Statement statement(DB()->GetCachedStatement(
SQL_FROM_HERE,
"INSERT OR REPLACE INTO kaleidoscopeData "
"(id, data, result, gaia_id, last_updated_time_s) VALUES "
"(0, ?, ?, ?, ?)"));
statement.BindBlob(0, data->response.data(), data->response.length());
statement.BindInt64(1, static_cast<int>(data->result));
statement.BindString(2, gaia_id);
statement.BindInt64(3,
base::Time::Now().ToDeltaSinceWindowsEpoch().InSeconds());
if (!statement.Run()) {
DLOG(ERROR) << "Failed to update the data.";
return false;
}
return true;
}
media::mojom::GetCollectionsResponsePtr MediaHistoryKaleidoscopeDataTable::Get(
const std::string& gaia_id) {
DCHECK_LT(0, DB()->transaction_nesting());
if (!CanAccessDatabase())
return nullptr;
sql::Statement statement(DB()->GetCachedStatement(
SQL_FROM_HERE,
"SELECT data, result, gaia_id, last_updated_time_s FROM "
"kaleidoscopeData WHERE id = 0"));
while (statement.Step()) {
// If the GAIA id for the current user does not match the one we stored then
// wipe the stored data and return an empty string.
if (statement.ColumnString(2) != gaia_id) {
CHECK(Delete());
return nullptr;
}
// If the data that was stored was older than 24 hours then we should wipe
// the stored data and return an empty string.
auto updated_time = base::Time::FromDeltaSinceWindowsEpoch(
base::TimeDelta::FromSeconds(statement.ColumnInt64(3)));
if ((base::Time::Now() - updated_time) > base::TimeDelta::FromDays(1)) {
CHECK(Delete());
return nullptr;
}
auto out = media::mojom::GetCollectionsResponse::New();
statement.ColumnBlobAsString(0, &out->response);
out->result = static_cast<media::mojom::GetCollectionsResult>(
statement.ColumnInt64(1));
return out;
}
// If there is no data then return nullptr.
return nullptr;
}
bool MediaHistoryKaleidoscopeDataTable::Delete() {
DCHECK_LT(0, DB()->transaction_nesting());
if (!CanAccessDatabase())
return false;
sql::Statement statement(
DB()->GetCachedStatement(SQL_FROM_HERE, "DELETE FROM kaleidoscopeData"));
return statement.Run();
}
} // namespace media_history

@ -1,43 +0,0 @@
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_MEDIA_HISTORY_MEDIA_HISTORY_KALEIDOSCOPE_DATA_TABLE_H_
#define CHROME_BROWSER_MEDIA_HISTORY_MEDIA_HISTORY_KALEIDOSCOPE_DATA_TABLE_H_
#include <string>
#include "base/updateable_sequenced_task_runner.h"
#include "chrome/browser/media/history/media_history_table_base.h"
#include "chrome/browser/media/kaleidoscope/mojom/kaleidoscope.mojom.h"
#include "sql/init_status.h"
namespace media_history {
class MediaHistoryKaleidoscopeDataTable : public MediaHistoryTableBase {
public:
static const char kTableName[];
private:
friend class MediaHistoryStore;
explicit MediaHistoryKaleidoscopeDataTable(
scoped_refptr<base::UpdateableSequencedTaskRunner> db_task_runner);
~MediaHistoryKaleidoscopeDataTable() override;
// MediaHistoryTableBase:
sql::InitStatus CreateTableIfNonExistent() override;
bool Set(media::mojom::GetCollectionsResponsePtr data,
const std::string& gaia_id);
media::mojom::GetCollectionsResponsePtr Get(const std::string& gaia_id);
bool Delete();
DISALLOW_COPY_AND_ASSIGN(MediaHistoryKaleidoscopeDataTable);
};
} // namespace media_history
#endif // CHROME_BROWSER_MEDIA_HISTORY_MEDIA_HISTORY_KALEIDOSCOPE_DATA_TABLE_H_

@ -571,35 +571,4 @@ void MediaHistoryKeyedService::GetMediaFeedFetchDetails(
std::move(callback));
}
void MediaHistoryKeyedService::SetKaleidoscopeData(
media::mojom::GetCollectionsResponsePtr data,
const std::string& gaia_id) {
if (auto* store = store_->GetForWrite()) {
store->db_task_runner_->PostTask(
FROM_HERE, base::BindOnce(&MediaHistoryStore::SetKaleidoscopeData,
store, std::move(data), gaia_id));
}
}
void MediaHistoryKeyedService::GetKaleidoscopeData(
const std::string& gaia_id,
GetKaleidoscopeDataCallback callback) {
if (auto* store = store_->GetForWrite()) {
base::PostTaskAndReplyWithResult(
store_->GetForRead()->db_task_runner_.get(), FROM_HERE,
base::BindOnce(&MediaHistoryStore::GetKaleidoscopeData, store, gaia_id),
std::move(callback));
} else {
std::move(callback).Run(nullptr);
}
}
void MediaHistoryKeyedService::DeleteKaleidoscopeData() {
if (auto* store = store_->GetForWrite()) {
store->db_task_runner_->PostTask(
FROM_HERE,
base::BindOnce(&MediaHistoryStore::DeleteKaleidoscopeData, store));
}
}
} // namespace media_history

@ -9,7 +9,6 @@
#include "base/time/time.h"
#include "chrome/browser/media/feeds/media_feeds_store.mojom.h"
#include "chrome/browser/media/history/media_history_store.mojom.h"
#include "chrome/browser/media/kaleidoscope/mojom/kaleidoscope.mojom.h"
#include "components/history/core/browser/history_service_observer.h"
#include "components/keyed_service/core/keyed_service.h"
#include "content/public/browser/media_player_watch_time.h"
@ -347,20 +346,6 @@ class MediaHistoryKeyedService : public KeyedService,
void UpdateFeedUserStatus(const int64_t feed_id,
media_feeds::mojom::FeedUserStatus status);
// Stores the Kaleidocope data keyed against a GAIA ID.
void SetKaleidoscopeData(media::mojom::GetCollectionsResponsePtr data,
const std::string& gaia_id);
// Retrieves the Kaleidoscope data keyed against a GAIA ID. The data expires
// after 24 hours or if the GAIA ID changes.
using GetKaleidoscopeDataCallback =
base::OnceCallback<void(media::mojom::GetCollectionsResponsePtr)>;
void GetKaleidoscopeData(const std::string& gaia_id,
GetKaleidoscopeDataCallback callback);
// Delete any stored data.
void DeleteKaleidoscopeData();
protected:
friend class media_feeds::MediaFeedsService;

@ -15,7 +15,6 @@
#include "chrome/browser/media/history/media_history_feed_items_table.h"
#include "chrome/browser/media/history/media_history_feeds_table.h"
#include "chrome/browser/media/history/media_history_images_table.h"
#include "chrome/browser/media/history/media_history_kaleidoscope_data_table.h"
#include "chrome/browser/media/history/media_history_origin_table.h"
#include "chrome/browser/media/history/media_history_playback_table.h"
#include "chrome/browser/media/history/media_history_session_images_table.h"
@ -216,8 +215,6 @@ MediaHistoryStore::MediaHistoryStore(
feed_items_table_(IsMediaFeedsEnabled()
? new MediaHistoryFeedItemsTable(db_task_runner_)
: nullptr),
kaleidoscope_table_(
new MediaHistoryKaleidoscopeDataTable(db_task_runner_)),
initialization_successful_(false) {
db_->set_histogram_tag("MediaHistory");
@ -480,8 +477,6 @@ sql::InitStatus MediaHistoryStore::InitializeTables() {
status = feeds_table_->Initialize(db_.get());
if (feed_items_table_ && status == sql::INIT_OK)
status = feed_items_table_->Initialize(db_.get());
if (status == sql::INIT_OK)
status = kaleidoscope_table_->Initialize(db_.get());
return status;
}
@ -1249,58 +1244,4 @@ void MediaHistoryStore::UpdateFeedUserStatus(
DB()->CommitTransaction();
}
void MediaHistoryStore::SetKaleidoscopeData(
media::mojom::GetCollectionsResponsePtr data,
const std::string& gaia_id) {
DCHECK(db_task_runner_->RunsTasksInCurrentSequence());
if (!CanAccessDatabase())
return;
if (!DB()->BeginTransaction()) {
DLOG(ERROR) << "Failed to begin the transaction.";
return;
}
if (!kaleidoscope_table_->Set(std::move(data), gaia_id)) {
DB()->RollbackTransaction();
return;
}
DB()->CommitTransaction();
}
media::mojom::GetCollectionsResponsePtr MediaHistoryStore::GetKaleidoscopeData(
const std::string& gaia_id) {
DCHECK(db_task_runner_->RunsTasksInCurrentSequence());
if (!CanAccessDatabase())
return nullptr;
if (!DB()->BeginTransaction()) {
DLOG(ERROR) << "Failed to begin the transaction.";
return nullptr;
}
auto out = kaleidoscope_table_->Get(gaia_id);
DB()->CommitTransaction();
return out;
}
void MediaHistoryStore::DeleteKaleidoscopeData() {
DCHECK(db_task_runner_->RunsTasksInCurrentSequence());
if (!CanAccessDatabase())
return;
if (!DB()->BeginTransaction()) {
DLOG(ERROR) << "Failed to begin the transaction.";
return;
}
if (!kaleidoscope_table_->Delete()) {
DB()->RollbackTransaction();
return;
}
DB()->CommitTransaction();
}
} // namespace media_history

@ -42,7 +42,6 @@ class MediaHistorySessionImagesTable;
class MediaHistoryImagesTable;
class MediaHistoryFeedsTable;
class MediaHistoryFeedItemsTable;
class MediaHistoryKaleidoscopeDataTable;
// Refcounted as it is created, initialized and destroyed on a different thread
// from the DB sequence provided to the constructor of this class that is
@ -203,14 +202,6 @@ class MediaHistoryStore : public base::RefCountedThreadSafe<MediaHistoryStore> {
void UpdateFeedUserStatus(const int64_t feed_id,
media_feeds::mojom::FeedUserStatus status);
void SetKaleidoscopeData(media::mojom::GetCollectionsResponsePtr data,
const std::string& gaia_id);
media::mojom::GetCollectionsResponsePtr GetKaleidoscopeData(
const std::string& gaia_id);
void DeleteKaleidoscopeData();
private:
friend class base::RefCountedThreadSafe<MediaHistoryStore>;
@ -233,7 +224,6 @@ class MediaHistoryStore : public base::RefCountedThreadSafe<MediaHistoryStore> {
scoped_refptr<MediaHistoryImagesTable> images_table_;
scoped_refptr<MediaHistoryFeedsTable> feeds_table_;
scoped_refptr<MediaHistoryFeedItemsTable> feed_items_table_;
scoped_refptr<MediaHistoryKaleidoscopeDataTable> kaleidoscope_table_;
bool initialization_successful_;
base::AtomicFlag cancelled_;
};

@ -179,23 +179,6 @@ class MediaHistoryStoreUnitTest
return out;
}
media::mojom::GetCollectionsResponsePtr GetKaleidoscopeDataSync(
MediaHistoryKeyedService* service,
const std::string& gaia_id) {
base::RunLoop run_loop;
media::mojom::GetCollectionsResponsePtr out;
service->GetKaleidoscopeData(
gaia_id, base::BindLambdaForTesting(
[&](media::mojom::GetCollectionsResponsePtr data) {
out = std::move(data);
run_loop.Quit();
}));
run_loop.Run();
return out;
}
std::vector<mojom::MediaHistoryPlaybackRowPtr> GetPlaybackRowsSync(
MediaHistoryKeyedService* service) {
base::RunLoop run_loop;
@ -285,13 +268,6 @@ class MediaHistoryStoreUnitTest
Profile* GetProfile() { return profile_.get(); }
media::mojom::GetCollectionsResponsePtr GetExpectedKaleidoscopeData() {
auto data = media::mojom::GetCollectionsResponse::New();
data->response = "abcd";
data->result = media::mojom::GetCollectionsResult::kFailed;
return data;
}
private:
base::ScopedTempDir temp_dir_;
@ -636,64 +612,6 @@ TEST_P(MediaHistoryStoreUnitTest, SavePlayback_IncrementAggregateWatchtime) {
EXPECT_EQ(origins, GetOriginRowsSync(otr_service()));
}
TEST_P(MediaHistoryStoreUnitTest, KaleidoscopeData) {
{
// The data should be empty at the start.
auto data = GetKaleidoscopeDataSync(service(), "123");
EXPECT_TRUE(data.is_null());
}
service()->SetKaleidoscopeData(GetExpectedKaleidoscopeData(), "123");
WaitForDB();
{
// We should be able to get the data.
auto data = GetKaleidoscopeDataSync(service(), "123");
if (IsReadOnly()) {
EXPECT_TRUE(data.is_null());
} else {
EXPECT_EQ(GetExpectedKaleidoscopeData(), data);
}
}
{
// Getting with a different GAIA ID should wipe the data and return an
// empty string.
auto data = GetKaleidoscopeDataSync(service(), "1234");
EXPECT_TRUE(data.is_null());
}
{
// The data should be empty for the other GAIA ID too.
auto data = GetKaleidoscopeDataSync(service(), "123");
EXPECT_TRUE(data.is_null());
}
service()->SetKaleidoscopeData(GetExpectedKaleidoscopeData(), "123");
WaitForDB();
{
// We should be able to get the data.
auto data = GetKaleidoscopeDataSync(service(), "123");
if (IsReadOnly()) {
EXPECT_TRUE(data.is_null());
} else {
EXPECT_EQ(GetExpectedKaleidoscopeData(), data);
}
}
service()->DeleteKaleidoscopeData();
WaitForDB();
{
// The data should have been deleted.
auto data = GetKaleidoscopeDataSync(service(), "123");
EXPECT_TRUE(data.is_null());
}
}
TEST_P(MediaHistoryStoreUnitTest, GetOriginsWithHighWatchTime) {
const GURL url("http://google.com/test");
const GURL url_alt("http://example.org/test");

@ -1,38 +0,0 @@
# Copyright 2020 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import("//chrome/browser/buildflags.gni")
import("//tools/grit/grit_rule.gni")
# If the ENABLE_KALEIDOSCOPE flag is enabled and src-internal is available then
# include the internal resources. Otherwise, empty resources are used.
if (enable_kaleidoscope) {
grit("kaleidoscope_resources") {
source = "kaleidoscope_internal_resources.grd"
outputs = [
"grit/kaleidoscope_resources.h",
"kaleidoscope_resources.pak",
]
deps = [
"//chrome/browser/media/kaleidoscope/internal:kaleidoscope_strings",
"//chrome/browser/media/kaleidoscope/internal/resources:all",
"//chrome/browser/media/kaleidoscope/mojom:mojom_js",
"//chrome/browser/resources/kaleidoscope:web_components",
"//url/mojom:url_mojom_gurl_js",
]
}
} else {
grit("kaleidoscope_resources") {
source = "kaleidoscope_resources.grd"
outputs = [
"grit/kaleidoscope_resources.h",
"kaleidoscope_resources.pak",
]
inputs = [ "//third_party/shaka-player/dist/shaka-player.ui.js" ]
deps = [
"//chrome/browser/media/kaleidoscope/mojom:mojom_js",
"//url/mojom:url_mojom_gurl_js",
]
}
}

@ -1,3 +0,0 @@
monorail: {
component: "Internals>Media>UI"
}

@ -1,3 +0,0 @@
beccahughes@chromium.org
steimel@chromium.org
mlamouri@chromium.org

@ -1,21 +0,0 @@
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/media/kaleidoscope/constants.h"
const char kKaleidoscopeUIHost[] = "kaleidoscope";
const char kKaleidoscopeUIWatchHost[] = "watch";
const char kKaleidoscopeUIURL[] = "chrome://kaleidoscope";
const char kKaleidoscopeWatchUIURL[] = "chrome://watch";
const char kKaleidoscopeUntrustedContentUIURL[] =
"chrome-untrusted://kaleidoscope/";
const char kKaleidoscopeUntrustedPALChildURL[] =
"chrome-untrusted://kaleidoscope-pal-generator/";
const int kKaleidoscopeFirstRunLatestVersion = 2;

@ -1,23 +0,0 @@
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_MEDIA_KALEIDOSCOPE_CONSTANTS_H_
#define CHROME_BROWSER_MEDIA_KALEIDOSCOPE_CONSTANTS_H_
extern const char kKaleidoscopeUIHost[];
extern const char kKaleidoscopeUIWatchHost[];
extern const char kKaleidoscopeUIURL[];
extern const char kKaleidoscopeWatchUIURL[];
extern const char kKaleidoscopeUntrustedContentUIURL[];
extern const char kKaleidoscopeUntrustedPALChildURL[];
// The current latest version of the first run experience.
extern const int kKaleidoscopeFirstRunLatestVersion;
#endif // CHROME_BROWSER_MEDIA_KALEIDOSCOPE_CONSTANTS_H_

@ -1,345 +0,0 @@
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/media/kaleidoscope/kaleidoscope_data_provider_impl.h"
#include <memory>
#include "base/callback.h"
#include "base/metrics/histogram_functions.h"
#include "base/strings/string_util.h"
#include "chrome/browser/media/history/media_history_keyed_service.h"
#include "chrome/browser/media/history/media_history_keyed_service_factory.h"
#include "chrome/browser/media/kaleidoscope/constants.h"
#include "chrome/browser/media/kaleidoscope/kaleidoscope_metrics_recorder.h"
#include "chrome/browser/media/kaleidoscope/kaleidoscope_prefs.h"
#include "chrome/browser/media/kaleidoscope/kaleidoscope_service.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/signin/identity_manager_factory.h"
#include "chrome/browser/ui/chrome_pages.h"
#include "chrome/common/pref_names.h"
#include "components/prefs/pref_service.h"
#include "components/signin/public/identity_manager/identity_manager.h"
#include "components/signin/public/identity_manager/scope_set.h"
#include "content/public/browser/storage_partition.h"
#include "google_apis/gaia/gaia_constants.h"
#include "media/base/media_switches.h"
namespace {
// The number of top media feeds to load for potential display.
constexpr unsigned kMediaFeedsLoadLimit = 5u;
// The minimum number of items a media feed needs to be displayed. This is the
// number of items needed to populate a collection.
constexpr int kMediaFeedsFetchedItemsMin = 4;
// The maximum number of feed items to display.
constexpr int kMediaFeedsItemsMaxCount = 20;
// The minimum watch time needed in media history for a provider to be
// considered high watch time.
constexpr base::TimeDelta kProviderHighWatchTimeMin =
base::TimeDelta::FromMinutes(30);
// The feedback tag for Kaleidoscope.
constexpr char kKaleidoscopeFeedbackCategoryTag[] =
"kaleidoscope_settings_menu";
base::Optional<media_feeds::mojom::MediaFeedItemType> GetFeedItemTypeForTab(
media::mojom::KaleidoscopeTab tab) {
switch (tab) {
case media::mojom::KaleidoscopeTab::kForYou:
return base::nullopt;
case media::mojom::KaleidoscopeTab::kMovies:
return media_feeds::mojom::MediaFeedItemType::kMovie;
case media::mojom::KaleidoscopeTab::kTVShows:
return media_feeds::mojom::MediaFeedItemType::kTVSeries;
}
}
} // namespace
KaleidoscopeDataProviderImpl::KaleidoscopeDataProviderImpl(
mojo::PendingReceiver<media::mojom::KaleidoscopeDataProvider> receiver,
Profile* profile,
KaleidoscopeMetricsRecorder* metrics_recorder)
: KaleidoscopeDataProviderImpl(profile, metrics_recorder) {
receiver_.Bind(std::move(receiver));
}
KaleidoscopeDataProviderImpl::KaleidoscopeDataProviderImpl(
mojo::PendingReceiver<media::mojom::KaleidoscopeNTPDataProvider> receiver,
Profile* profile,
KaleidoscopeMetricsRecorder* metrics_recorder)
: KaleidoscopeDataProviderImpl(profile, metrics_recorder) {
ntp_receiver_.Bind(std::move(receiver));
}
KaleidoscopeDataProviderImpl::KaleidoscopeDataProviderImpl(
Profile* profile,
KaleidoscopeMetricsRecorder* metrics_recorder)
: profile_(profile),
metrics_recorder_(metrics_recorder),
receiver_(this),
ntp_receiver_(this) {
DCHECK(profile);
identity_manager_ = IdentityManagerFactory::GetForProfile(profile_);
}
KaleidoscopeDataProviderImpl::~KaleidoscopeDataProviderImpl() = default;
void KaleidoscopeDataProviderImpl::GetShouldShowFirstRunExperience(
GetShouldShowFirstRunExperienceCallback cb) {
auto* service = kaleidoscope::KaleidoscopeService::Get(profile_);
// The Kaleidoscope Service would not be available for incognito profiles.
if (!service) {
std::move(cb).Run(false);
return;
}
std::move(cb).Run(service->ShouldShowFirstRunExperience());
}
void KaleidoscopeDataProviderImpl::SetFirstRunExperienceStep(
media::mojom::KaleidoscopeFirstRunExperienceStep step) {
if (metrics_recorder_)
metrics_recorder_->OnFirstRunExperienceStepChanged(step);
// If the FRE is completed, then store a pref so we know to not show it again.
if (step != media::mojom::KaleidoscopeFirstRunExperienceStep::kCompleted)
return;
auto* prefs = profile_->GetPrefs();
if (!prefs)
return;
prefs->SetInteger(kaleidoscope::prefs::kKaleidoscopeFirstRunCompleted,
kKaleidoscopeFirstRunLatestVersion);
// Delete any cached data that has the first run stored in it.
GetMediaHistoryService()->DeleteKaleidoscopeData();
}
void KaleidoscopeDataProviderImpl::GetAllMediaFeeds(
GetAllMediaFeedsCallback cb) {
GetMediaHistoryService()->GetMediaFeeds(
media_history::MediaHistoryKeyedService::GetMediaFeedsRequest(),
std::move(cb));
}
void KaleidoscopeDataProviderImpl::SetMediaFeedsConsent(
bool accepted_media_feeds,
bool accepted_auto_select_media_feeds,
const std::vector<int64_t>& enabled_feed_ids,
const std::vector<int64_t>& disabled_feed_ids) {
auto* prefs = profile_->GetPrefs();
if (!prefs)
return;
prefs->SetBoolean(prefs::kMediaFeedsBackgroundFetching, accepted_media_feeds);
prefs->SetBoolean(prefs::kMediaFeedsSafeSearchEnabled, accepted_media_feeds);
// If the user declined to use Media Feeds at all, then there's nothing left
// to do.
if (!accepted_media_feeds)
return;
prefs->SetBoolean(kaleidoscope::prefs::kKaleidoscopeAutoSelectMediaFeeds,
accepted_auto_select_media_feeds);
for (auto& feed_id : disabled_feed_ids) {
GetMediaHistoryService()->UpdateFeedUserStatus(
feed_id, media_feeds::mojom::FeedUserStatus::kDisabled);
}
for (auto& feed_id : enabled_feed_ids) {
GetMediaHistoryService()->UpdateFeedUserStatus(
feed_id, media_feeds::mojom::FeedUserStatus::kEnabled);
}
}
void KaleidoscopeDataProviderImpl::GetAutoSelectMediaFeedsConsent(
GetAutoSelectMediaFeedsConsentCallback cb) {
auto* prefs = profile_->GetPrefs();
if (!prefs) {
std::move(cb).Run(false);
return;
}
std::move(cb).Run(prefs->GetBoolean(
kaleidoscope::prefs::kKaleidoscopeAutoSelectMediaFeeds));
}
void KaleidoscopeDataProviderImpl::GetHighWatchTimeOrigins(
GetHighWatchTimeOriginsCallback cb) {
GetMediaHistoryService()->GetHighWatchTimeOrigins(kProviderHighWatchTimeMin,
std::move(cb));
}
void KaleidoscopeDataProviderImpl::GetTopMediaFeeds(
media::mojom::KaleidoscopeTab tab,
media::mojom::KaleidoscopeDataProvider::GetTopMediaFeedsCallback callback) {
GetMediaHistoryService()->GetMediaFeeds(
media_history::MediaHistoryKeyedService::GetMediaFeedsRequest::
CreateTopFeedsForDisplay(
kMediaFeedsLoadLimit, kMediaFeedsFetchedItemsMin,
// Require Safe Search checking if the integration is enabled.
base::FeatureList::IsEnabled(media::kMediaFeedsSafeSearch),
GetFeedItemTypeForTab(tab)),
std::move(callback));
}
void KaleidoscopeDataProviderImpl::GetMediaFeedContents(
int64_t feed_id,
media::mojom::KaleidoscopeTab tab,
media::mojom::KaleidoscopeDataProvider::GetMediaFeedContentsCallback
callback) {
GetMediaHistoryService()->GetMediaFeedItems(
media_history::MediaHistoryKeyedService::GetMediaFeedItemsRequest::
CreateItemsForFeed(
feed_id, kMediaFeedsItemsMaxCount,
// Require Safe Search checking if the integration is enabled.
base::FeatureList::IsEnabled(media::kMediaFeedsSafeSearch),
GetFeedItemTypeForTab(tab)),
base::BindOnce(&KaleidoscopeDataProviderImpl::OnGotMediaFeedContents,
weak_ptr_factory.GetWeakPtr(), std::move(callback),
feed_id));
}
void KaleidoscopeDataProviderImpl::GetContinueWatchingMediaFeedItems(
media::mojom::KaleidoscopeTab tab,
media::mojom::KaleidoscopeDataProvider::
GetContinueWatchingMediaFeedItemsCallback callback) {
GetMediaHistoryService()->GetMediaFeedItems(
media_history::MediaHistoryKeyedService::GetMediaFeedItemsRequest::
CreateItemsForContinueWatching(
kMediaFeedsItemsMaxCount,
// Require Safe Search checking if the integration is enabled.
base::FeatureList::IsEnabled(media::kMediaFeedsSafeSearch),
GetFeedItemTypeForTab(tab)),
base::BindOnce(
&KaleidoscopeDataProviderImpl::OnGotContinueWatchingMediaFeedItems,
weak_ptr_factory.GetWeakPtr(), std::move(callback)));
}
void KaleidoscopeDataProviderImpl::SendFeedback() {
chrome::ShowFeedbackPage(GURL(kKaleidoscopeWatchUIURL), profile_,
chrome::kFeedbackSourceKaleidoscope,
std::string() /* description_template */,
std::string() /* description_placeholder_text */,
kKaleidoscopeFeedbackCategoryTag /* category_tag */,
std::string() /* extra_diagnostics */);
}
void KaleidoscopeDataProviderImpl::GetCollections(
media::mojom::CredentialsPtr credentials,
const std::string& request,
GetCollectionsCallback cb) {
auto account_info = identity_manager_->GetPrimaryAccountInfo(
signin::ConsentLevel::kNotRequired);
kaleidoscope::KaleidoscopeService::Get(profile_)->GetCollections(
std::move(credentials), account_info.gaia, request, std::move(cb));
}
void KaleidoscopeDataProviderImpl::GetSignedOutProviders(
media::mojom::KaleidoscopeDataProvider::GetSignedOutProvidersCallback cb) {
DCHECK(!identity_manager_->HasPrimaryAccount(
signin::ConsentLevel::kNotRequired));
auto* providers = profile_->GetPrefs()->GetList(
kaleidoscope::prefs::kKaleidoscopeSignedOutProviders);
std::vector<std::string> providers_copy;
for (auto& provider : providers->GetList()) {
providers_copy.push_back(provider.GetString());
}
std::move(cb).Run(providers_copy);
}
void KaleidoscopeDataProviderImpl::SetSignedOutProviders(
const std::vector<std::string>& providers) {
DCHECK(!identity_manager_->HasPrimaryAccount(
signin::ConsentLevel::kNotRequired));
auto providers_copy = std::make_unique<base::Value>(base::Value::Type::LIST);
for (auto& provider : providers) {
providers_copy->Append(provider);
}
profile_->GetPrefs()->Set(
kaleidoscope::prefs::kKaleidoscopeSignedOutProviders, *providers_copy);
}
void KaleidoscopeDataProviderImpl::RecordTimeTakenToStartWatchHistogram(
base::TimeDelta time) {
base::UmaHistogramMediumTimes("Media.Kaleidoscope.TimeTakenToStartWatch",
time);
}
void KaleidoscopeDataProviderImpl::RecordDialogClosedHistogram(bool value) {
// If |value| is true then the user opened a watch action from this dialog.
base::UmaHistogramBoolean("Media.Kaleidoscope.DialogClosed", value);
}
void KaleidoscopeDataProviderImpl::GetNewMediaFeeds(
GetNewMediaFeedsCallback cb) {
auto* prefs = profile_->GetPrefs();
DCHECK(prefs);
const bool auto_enabled =
prefs->GetBoolean(kaleidoscope::prefs::kKaleidoscopeAutoSelectMediaFeeds);
GetMediaHistoryService()->GetMediaFeeds(
media_history::MediaHistoryKeyedService::GetMediaFeedsRequest::
CreateNewFeeds(),
base::BindOnce(
[](GetNewMediaFeedsCallback cb, bool auto_enabled,
std::vector<media_feeds::mojom::MediaFeedPtr> feeds) {
std::move(cb).Run(std::move(feeds), auto_enabled);
},
std::move(cb), auto_enabled));
}
void KaleidoscopeDataProviderImpl::UpdateFeedUserStatus(
int64_t feed_id,
media_feeds::mojom::FeedUserStatus status) {
GetMediaHistoryService()->UpdateFeedUserStatus(feed_id, status);
}
media_history::MediaHistoryKeyedService*
KaleidoscopeDataProviderImpl::GetMediaHistoryService() {
return media_history::MediaHistoryKeyedServiceFactory::GetForProfile(
profile_);
}
void KaleidoscopeDataProviderImpl::OnGotMediaFeedContents(
GetMediaFeedContentsCallback callback,
const int64_t feed_id,
std::vector<media_feeds::mojom::MediaFeedItemPtr> items) {
std::set<int64_t> ids;
for (auto& item : items)
ids.insert(item->id);
// Mark the returned feed and feed items as having been displayed.
GetMediaHistoryService()->UpdateMediaFeedDisplayTime(feed_id);
GetMediaHistoryService()->IncrementMediaFeedItemsShownCount(ids);
std::move(callback).Run(std::move(items));
}
void KaleidoscopeDataProviderImpl::OnGotContinueWatchingMediaFeedItems(
media::mojom::KaleidoscopeDataProvider::
GetContinueWatchingMediaFeedItemsCallback callback,
std::vector<media_feeds::mojom::MediaFeedItemPtr> items) {
std::set<int64_t> ids;
for (auto& item : items)
ids.insert(item->id);
// Mark the returned feed items as having been displayed.
GetMediaHistoryService()->IncrementMediaFeedItemsShownCount(ids);
std::move(callback).Run(std::move(items));
}

@ -1,116 +0,0 @@
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_MEDIA_KALEIDOSCOPE_KALEIDOSCOPE_DATA_PROVIDER_IMPL_H_
#define CHROME_BROWSER_MEDIA_KALEIDOSCOPE_KALEIDOSCOPE_DATA_PROVIDER_IMPL_H_
#include <memory>
#include "base/memory/weak_ptr.h"
#include "chrome/browser/media/kaleidoscope/mojom/kaleidoscope.mojom.h"
#include "google_apis/gaia/google_service_auth_error.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/receiver.h"
#include "url/origin.h"
namespace media_history {
class MediaHistoryKeyedService;
} // namespace media_history
namespace signin {
class IdentityManager;
} // namespace signin
class KaleidoscopeMetricsRecorder;
class Profile;
class KaleidoscopeDataProviderImpl
: public media::mojom::KaleidoscopeDataProvider,
public media::mojom::KaleidoscopeNTPDataProvider {
public:
KaleidoscopeDataProviderImpl(
mojo::PendingReceiver<media::mojom::KaleidoscopeDataProvider> receiver,
Profile* profile,
KaleidoscopeMetricsRecorder* metrics_recorder);
KaleidoscopeDataProviderImpl(
mojo::PendingReceiver<media::mojom::KaleidoscopeNTPDataProvider> receiver,
Profile* profile,
KaleidoscopeMetricsRecorder* metrics_recorder);
KaleidoscopeDataProviderImpl(const KaleidoscopeDataProviderImpl&) = delete;
KaleidoscopeDataProviderImpl& operator=(const KaleidoscopeDataProviderImpl&) =
delete;
~KaleidoscopeDataProviderImpl() override;
// media::mojom::KaleidoscopeDataProvider implementation.
void GetTopMediaFeeds(
media::mojom::KaleidoscopeTab tab,
media::mojom::KaleidoscopeDataProvider::GetTopMediaFeedsCallback callback)
override;
void GetMediaFeedContents(
int64_t feed_id,
media::mojom::KaleidoscopeTab tab,
media::mojom::KaleidoscopeDataProvider::GetMediaFeedContentsCallback
callback) override;
void GetContinueWatchingMediaFeedItems(
media::mojom::KaleidoscopeTab tab,
media::mojom::KaleidoscopeDataProvider::
GetContinueWatchingMediaFeedItemsCallback callback) override;
void GetShouldShowFirstRunExperience(
GetShouldShowFirstRunExperienceCallback cb) override;
void SetFirstRunExperienceStep(
media::mojom::KaleidoscopeFirstRunExperienceStep step) override;
void GetAllMediaFeeds(GetAllMediaFeedsCallback cb) override;
void SetMediaFeedsConsent(
bool accepted_media_feeds,
bool accepted_auto_select_media_feeds,
const std::vector<int64_t>& enabled_feed_ids,
const std::vector<int64_t>& disabled_feed_ids) override;
void GetAutoSelectMediaFeedsConsent(
GetAutoSelectMediaFeedsConsentCallback cb) override;
void GetHighWatchTimeOrigins(GetHighWatchTimeOriginsCallback cb) override;
void SendFeedback() override;
void GetCollections(media::mojom::CredentialsPtr credentials,
const std::string& request,
GetCollectionsCallback cb) override;
void GetSignedOutProviders(
media::mojom::KaleidoscopeDataProvider::GetSignedOutProvidersCallback cb)
override;
void SetSignedOutProviders(
const std::vector<std::string>& providers) override;
void RecordTimeTakenToStartWatchHistogram(base::TimeDelta time) override;
void RecordDialogClosedHistogram(bool value) override;
void GetNewMediaFeeds(GetNewMediaFeedsCallback cb) override;
void UpdateFeedUserStatus(int64_t feed_id,
media_feeds::mojom::FeedUserStatus status) override;
private:
media_history::MediaHistoryKeyedService* GetMediaHistoryService();
KaleidoscopeDataProviderImpl(Profile* profile,
KaleidoscopeMetricsRecorder* metrics_recorder);
void OnGotMediaFeedContents(
GetMediaFeedContentsCallback callback,
const int64_t feed_id,
std::vector<media_feeds::mojom::MediaFeedItemPtr> items);
void OnGotContinueWatchingMediaFeedItems(
media::mojom::KaleidoscopeDataProvider::
GetContinueWatchingMediaFeedItemsCallback callback,
std::vector<media_feeds::mojom::MediaFeedItemPtr> items);
signin::IdentityManager* identity_manager_;
Profile* const profile_;
KaleidoscopeMetricsRecorder* const metrics_recorder_;
mojo::Receiver<media::mojom::KaleidoscopeDataProvider> receiver_;
mojo::Receiver<media::mojom::KaleidoscopeNTPDataProvider> ntp_receiver_;
base::WeakPtrFactory<KaleidoscopeDataProviderImpl> weak_ptr_factory{this};
};
#endif // CHROME_BROWSER_MEDIA_KALEIDOSCOPE_KALEIDOSCOPE_DATA_PROVIDER_IMPL_H_

@ -1,168 +0,0 @@
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/media/kaleidoscope/kaleidoscope_identity_manager_impl.h"
#include "base/callback.h"
#include "build/chromeos_buildflags.h"
#include "chrome/browser/media/kaleidoscope/kaleidoscope_prefs.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/signin/identity_manager_factory.h"
#include "chrome/browser/ui/browser_finder.h"
#include "chrome/browser/ui/chrome_pages.h"
#include "chrome/common/channel_info.h"
#include "components/prefs/pref_service.h"
#include "components/signin/public/base/signin_metrics.h"
#include "components/signin/public/identity_manager/access_token_info.h"
#include "components/signin/public/identity_manager/consent_level.h"
#include "components/signin/public/identity_manager/identity_manager.h"
#include "components/signin/public/identity_manager/primary_account_access_token_fetcher.h"
#include "components/version_info/version_info.h"
#include "content/public/browser/web_ui.h"
#include "google_apis/google_api_keys.h"
namespace {
constexpr char kChromeMediaRecommendationsOAuth2Scope[] =
"https://www.googleapis.com/auth/chrome-media-recommendations";
} // namespace
KaleidoscopeIdentityManagerImpl::KaleidoscopeIdentityManagerImpl(
mojo::PendingReceiver<media::mojom::KaleidoscopeIdentityManager> receiver,
content::WebUI* web_ui)
: KaleidoscopeIdentityManagerImpl(std::move(receiver),
Profile::FromWebUI(web_ui)) {
DCHECK(web_ui);
web_ui_ = web_ui;
}
KaleidoscopeIdentityManagerImpl::KaleidoscopeIdentityManagerImpl(
mojo::PendingReceiver<media::mojom::KaleidoscopeIdentityManager> receiver,
Profile* profile)
: credentials_(media::mojom::Credentials::New()),
profile_(profile),
receiver_(this, std::move(receiver)) {
DCHECK(profile);
// If this is Google Chrome then we should use the official API key.
if (google_apis::IsGoogleChromeAPIKeyUsed()) {
bool is_stable_channel =
chrome::GetChannel() == version_info::Channel::STABLE;
credentials_->api_key = is_stable_channel
? google_apis::GetAPIKey()
: google_apis::GetNonStableAPIKey();
}
identity_manager_ = IdentityManagerFactory::GetForProfile(profile);
identity_manager_->AddObserver(this);
}
KaleidoscopeIdentityManagerImpl::~KaleidoscopeIdentityManagerImpl() {
identity_manager_->RemoveObserver(this);
}
void KaleidoscopeIdentityManagerImpl::GetCredentials(
GetCredentialsCallback cb) {
// If the profile is incognito then disable Kaleidoscope.
if (profile_->IsOffTheRecord()) {
std::move(cb).Run(nullptr,
media::mojom::CredentialsResult::kFailedIncognito);
return;
}
// If the profile is a child then disable Kaleidoscope.
if (profile_->IsSupervised() || profile_->IsChild()) {
std::move(cb).Run(nullptr, media::mojom::CredentialsResult::kFailedChild);
return;
}
// If the administrator has disabled Kaleidoscope then stop.
auto* prefs = profile_->GetPrefs();
if (!prefs->GetBoolean(kaleidoscope::prefs::kKaleidoscopePolicyEnabled)) {
std::move(cb).Run(nullptr,
media::mojom::CredentialsResult::kDisabledByPolicy);
return;
}
// If the user is not signed in, return the credentials without an access
// token. Sync consent is not required to use Kaleidoscope.
if (!identity_manager_->HasPrimaryAccount(
signin::ConsentLevel::kNotRequired)) {
std::move(cb).Run(credentials_.Clone(),
media::mojom::CredentialsResult::kSuccess);
return;
}
pending_callbacks_.push_back(std::move(cb));
// Get an OAuth token for the backend API. This token will be limited to just
// our backend scope. Destroying |token_fetcher_| will cancel the fetch so
// unretained is safe here.
signin::ScopeSet scopes = {kChromeMediaRecommendationsOAuth2Scope};
token_fetcher_ = std::make_unique<signin::PrimaryAccountAccessTokenFetcher>(
"kaleidoscope_service", identity_manager_, scopes,
base::BindOnce(&KaleidoscopeIdentityManagerImpl::OnAccessTokenAvailable,
base::Unretained(this)),
signin::PrimaryAccountAccessTokenFetcher::Mode::kImmediate,
signin::ConsentLevel::kNotRequired);
}
void KaleidoscopeIdentityManagerImpl::OnAccessTokenAvailable(
GoogleServiceAuthError error,
signin::AccessTokenInfo access_token_info) {
DCHECK(token_fetcher_);
token_fetcher_.reset();
if (error.state() == GoogleServiceAuthError::State::NONE) {
credentials_->access_token = access_token_info.token;
credentials_->expiry_time = access_token_info.expiration_time;
}
for (auto& callback : pending_callbacks_) {
std::move(callback).Run(credentials_.Clone(),
media::mojom::CredentialsResult::kSuccess);
}
pending_callbacks_.clear();
}
void KaleidoscopeIdentityManagerImpl::SignIn() {
#if BUILDFLAG(IS_CHROMEOS_ASH)
NOTREACHED() << "SignIn() shouldn't be called on Chrome OS.";
#else
// The identity manager may not be created in a context where it has access
// to the UI. The client should not request a sign-in in that case.
DCHECK(web_ui_);
content::WebContents* web_contents = web_ui_->GetWebContents();
DCHECK(web_contents);
Browser* browser = chrome::FindBrowserWithWebContents(web_contents);
DCHECK(browser);
chrome::ShowBrowserSignin(
browser, signin_metrics::AccessPoint::ACCESS_POINT_KALEIDOSCOPE,
signin::ConsentLevel::kNotRequired);
signin_metrics::RecordSigninImpressionUserActionForAccessPoint(
signin_metrics::AccessPoint::ACCESS_POINT_KALEIDOSCOPE);
#endif // BUILDFLAG(IS_CHROMEOS_ASH)
}
void KaleidoscopeIdentityManagerImpl::AddObserver(
mojo::PendingRemote<media::mojom::KaleidoscopeIdentityObserver> observer) {
identity_observers_.Add(std::move(observer));
}
void KaleidoscopeIdentityManagerImpl::OnRefreshTokenUpdatedForAccount(
const CoreAccountInfo& account_info) {
for (auto& observer : identity_observers_)
observer->OnSignedIn();
}
void KaleidoscopeIdentityManagerImpl::OnRefreshTokenRemovedForAccount(
const CoreAccountId& account_id) {
for (auto& observer : identity_observers_)
observer->OnSignedOut();
}

@ -1,85 +0,0 @@
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_MEDIA_KALEIDOSCOPE_KALEIDOSCOPE_IDENTITY_MANAGER_IMPL_H_
#define CHROME_BROWSER_MEDIA_KALEIDOSCOPE_KALEIDOSCOPE_IDENTITY_MANAGER_IMPL_H_
#include <memory>
#include "chrome/browser/media/kaleidoscope/mojom/kaleidoscope.mojom.h"
#include "components/signin/public/identity_manager/identity_manager.h"
#include "google_apis/gaia/google_service_auth_error.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/receiver.h"
#include "mojo/public/cpp/bindings/remote_set.h"
namespace content {
class WebUI;
} // namespace content
namespace signin {
struct AccessTokenInfo;
class IdentityManager;
class PrimaryAccountAccessTokenFetcher;
} // namespace signin
class Profile;
class KaleidoscopeIdentityManagerImpl
: public media::mojom::KaleidoscopeIdentityManager,
public signin::IdentityManager::Observer {
public:
KaleidoscopeIdentityManagerImpl(
mojo::PendingReceiver<media::mojom::KaleidoscopeIdentityManager> receiver,
content::WebUI* web_ui);
KaleidoscopeIdentityManagerImpl(
mojo::PendingReceiver<media::mojom::KaleidoscopeIdentityManager> receiver,
Profile* profile);
KaleidoscopeIdentityManagerImpl(const KaleidoscopeIdentityManagerImpl&) =
delete;
KaleidoscopeIdentityManagerImpl& operator=(
const KaleidoscopeIdentityManagerImpl&) = delete;
~KaleidoscopeIdentityManagerImpl() override;
// media::mojom::KaleidoscopeIdentityManager implementation.
void GetCredentials(GetCredentialsCallback cb) override;
void SignIn() override;
void AddObserver(
mojo::PendingRemote<media::mojom::KaleidoscopeIdentityObserver> observer)
override;
// signin::IdentityManager::Observer implementation.
void OnRefreshTokenUpdatedForAccount(
const CoreAccountInfo& account_info) override;
void OnRefreshTokenRemovedForAccount(
const CoreAccountId& account_id) override;
private:
// Called when an access token request completes (successfully or not).
void OnAccessTokenAvailable(GoogleServiceAuthError error,
signin::AccessTokenInfo access_token_info);
// Helper for fetching OAuth2 access tokens. This is non-null iff an access
// token request is currently in progress.
std::unique_ptr<signin::PrimaryAccountAccessTokenFetcher> token_fetcher_;
// Pending credentials waiting on an access token.
std::vector<GetCredentialsCallback> pending_callbacks_;
// The current set of credentials.
media::mojom::CredentialsPtr credentials_;
signin::IdentityManager* identity_manager_;
content::WebUI* web_ui_ = nullptr;
Profile* profile_ = nullptr;
mojo::RemoteSet<media::mojom::KaleidoscopeIdentityObserver>
identity_observers_;
mojo::Receiver<media::mojom::KaleidoscopeIdentityManager> receiver_;
};
#endif // CHROME_BROWSER_MEDIA_KALEIDOSCOPE_KALEIDOSCOPE_IDENTITY_MANAGER_IMPL_H_

@ -1,170 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<grit latest_public_release="0" current_release="1" output_all_resource_defines="false">
<outputs>
<output filename="grit/kaleidoscope_resources.h" type="rc_header">
<emit emit_type='prepend'></emit>
</output>
<output filename="kaleidoscope_resources.pak" type="data_package" />
</outputs>
<release seq="1">
<includes>
<!-- Public resources -->
<include name="IDR_KALEIDOSCOPE_SIDE_NAV_CONTAINER_JS" file="${root_gen_dir}/chrome/browser/resources/kaleidoscope/side_nav_container.js"
use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_TOOLBAR_JS" file="${root_gen_dir}/chrome/browser/resources/kaleidoscope/toolbar.js"
use_base_dir="false" type="BINDATA" />
<!-- Private resources -->
<include name="IDR_KALEIDOSCOPE_CONTENT_CSS" file="internal/resources/content.css" type="chrome_html" flattenhtml="true" />
<include name="IDR_KALEIDOSCOPE_SHARED_CSS" file="internal/resources/shared.css" type="chrome_html" flattenhtml="true" />
<include name="IDR_KALEIDOSCOPE_CONTENT_HTML" file="internal/resources/content.html" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_CONTENT_JS" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/ks-content.js" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_CONTENT_WORKER_JS" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/ks-content-worker.js" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_HTML" file="internal/resources/kaleidoscope.html" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_ICONS_JS" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/icons.js" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_JS" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/ks-kaleidoscope.js" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_MESSAGES_JS" file="internal/resources/messages.js" type="BINDATA" />
<include name="IDR_GEOMETRY_MOJOM_LITE_JS" file="${root_gen_dir}/ui/gfx/geometry/mojom/geometry.mojom-lite.js" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_MOJOM_LITE_JS" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/mojom/kaleidoscope.mojom-lite.js" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_SHAKA_PLAYER_JS" file="../../../../third_party/shaka-player/dist/shaka-player.ui.js" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_PAL_CHILD_JS" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/lib/pal/ks-pal-child.js" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_PAL_CHILD_HTML" file="internal/resources/pal-child.html" type="BINDATA" />
<!-- Strings -->
<include name="IDR_KALEIDOSCOPE_LOCALE_EN" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/en/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_AF" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/af/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_AM" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/am/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_AR_EG" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/ar-EG/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_AR_JO" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/ar-JO/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_AR_MA" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/ar-MA/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_AR_SA" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/ar-SA/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_AR_XB" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/ar-XB/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_AR" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/ar/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_AS" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/as/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_AZ" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/az/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_BE" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/be/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_BG" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/bg/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_BN" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/bn/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_BS" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/bs/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_CA" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/ca/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_CS" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/cs/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_CY" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/cy/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_DA" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/da/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_DE_AT" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/de-AT/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_DE_CH" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/de-CH/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_DE" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/de/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_EL" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/el/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_EN_AU" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/en-AU/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_EN_CA" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/en-CA/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_EN_GB" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/en-GB/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_EN_IE" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/en-IE/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_EN_IN" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/en-IN/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_EN_NZ" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/en-NZ/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_EN_SG" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/en-SG/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_EN_XA" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/en-XA/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_EN_XC" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/en-XC/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_EN_ZA" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/en-ZA/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_ES_419" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/es-419/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_ES_AR" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/es-AR/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_ES_BO" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/es-BO/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_ES_CL" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/es-CL/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_ES_CO" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/es-CO/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_ES_CR" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/es-CR/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_ES_DO" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/es-DO/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_ES_EC" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/es-EC/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_ES_GT" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/es-GT/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_ES_HN" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/es-HN/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_ES_MX" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/es-MX/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_ES_NI" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/es-NI/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_ES_PA" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/es-PA/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_ES_PE" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/es-PE/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_ES_PR" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/es-PR/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_ES_PY" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/es-PY/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_ES_SV" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/es-SV/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_ES_US" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/es-US/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_ES_UY" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/es-UY/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_ES_VE" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/es-VE/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_ES" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/es/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_ET" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/et/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_EU" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/eu/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_FA" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/fa/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_FIL" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/fil/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_FI" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/fi/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_FR_CA" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/fr-CA/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_FR_CH" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/fr-CH/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_FR" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/fr/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_GL" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/gl/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_GSW" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/gsw/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_GU" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/gu/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_HE" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/he/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_HI" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/hi/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_HR" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/hr/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_HU" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/hu/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_HY" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/hy/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_ID" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/id/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_IN" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/in/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_IS" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/is/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_IT" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/it/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_IW" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/iw/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_JA" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/ja/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_KA" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/ka/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_KK" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/kk/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_KM" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/km/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_KN" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/kn/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_KO" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/ko/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_KY" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/ky/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_LN" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/ln/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_LO" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/lo/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_LT" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/lt/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_LV" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/lv/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_MK" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/mk/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_ML" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/ml/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_MN" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/mn/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_MO" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/mo/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_MR" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/mr/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_MS" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/ms/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_MY" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/my/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_NB" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/nb/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_NE" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/ne/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_NL" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/nl/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_NO" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/no/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_OR" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/or/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_PA" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/pa/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_PL" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/pl/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_PT_BR" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/pt-BR/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_PT_PT" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/pt-PT/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_PT" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/pt/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_RO" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/ro/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_RU" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/ru/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_SI" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/si/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_SK" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/sk/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_SL" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/sl/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_SQ" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/sq/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_SR_LATN" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/sr-Latn/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_SR" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/sr/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_SV" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/sv/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_SW" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/sw/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_TA" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/ta/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_TE" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/te/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_TH" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/th/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_TL" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/tl/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_TR" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/tr/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_UK" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/uk/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_UR" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/ur/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_UZ" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/uz/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_VI" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/vi/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_ZH_CN" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/zh-CN/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_ZH_HK" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/zh-HK/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_ZH_TW" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/zh-TW/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_ZH" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/zh/messages.json" use_base_dir="false" type="BINDATA" />
<include name="IDR_KALEIDOSCOPE_LOCALE_ZU" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/_locales/zu/messages.json" use_base_dir="false" type="BINDATA" />
<!-- Google Sans -->
<include name="IDR_GOOGLE_SANS_CSS" file="internal/resources/fonts/fonts.css" type="BINDATA" />
<include name="IDR_GOOGLE_SANS_BOLD" file="internal/resources/fonts/GoogleSans-Bold.woff2" type="BINDATA" compress="gzip" />
<include name="IDR_GOOGLE_SANS_MEDIUM" file="internal/resources/fonts/GoogleSans-Medium.woff2" type="BINDATA" compress="gzip" />
<include name="IDR_GOOGLE_SANS_REGULAR" file="internal/resources/fonts/GoogleSans-Regular.woff2" type="BINDATA" compress="gzip" />
<include name="IDR_GOOGLE_SANS_DISPLAY_REGULAR" file="internal/resources/fonts/GoogleSansDisplay-Regular.woff2" type="BINDATA" compress="gzip" />
</includes>
</release>
</grit>

@ -1,53 +0,0 @@
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/media/kaleidoscope/kaleidoscope_metrics_recorder.h"
#include "base/metrics/histogram_functions.h"
namespace {
KaleidoscopeMetricsRecorder::FirstRunProgress MojoStepToMetricsStep(
media::mojom::KaleidoscopeFirstRunExperienceStep mojo_step) {
switch (mojo_step) {
case media::mojom::KaleidoscopeFirstRunExperienceStep::kCompleted:
return KaleidoscopeMetricsRecorder::FirstRunProgress::kCompleted;
case media::mojom::KaleidoscopeFirstRunExperienceStep::kProviderSelection:
return KaleidoscopeMetricsRecorder::FirstRunProgress::kProviderSelection;
case media::mojom::KaleidoscopeFirstRunExperienceStep::kMediaFeedsConsent:
return KaleidoscopeMetricsRecorder::FirstRunProgress::kMediaFeedsConsent;
case media::mojom::KaleidoscopeFirstRunExperienceStep::kWelcome:
return KaleidoscopeMetricsRecorder::FirstRunProgress::kWelcome;
}
NOTREACHED();
}
} // namespace
KaleidoscopeMetricsRecorder::KaleidoscopeMetricsRecorder() = default;
KaleidoscopeMetricsRecorder::~KaleidoscopeMetricsRecorder() = default;
void KaleidoscopeMetricsRecorder::OnExitPage() {
if (first_run_experience_step_)
RecordFirstRunProgress(MojoStepToMetricsStep(*first_run_experience_step_));
}
void KaleidoscopeMetricsRecorder::OnFirstRunExperienceStepChanged(
media::mojom::KaleidoscopeFirstRunExperienceStep step) {
first_run_experience_step_ = step;
// If the first run was completed, we can go ahead and record it.
if (first_run_experience_step_ ==
media::mojom::KaleidoscopeFirstRunExperienceStep::kCompleted) {
RecordFirstRunProgress(FirstRunProgress::kCompleted);
first_run_experience_step_.reset();
}
}
void KaleidoscopeMetricsRecorder::RecordFirstRunProgress(
FirstRunProgress progress) {
base::UmaHistogramEnumeration("Media.Kaleidoscope.FirstRunProgress",
progress);
}

@ -1,46 +0,0 @@
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_MEDIA_KALEIDOSCOPE_KALEIDOSCOPE_METRICS_RECORDER_H_
#define CHROME_BROWSER_MEDIA_KALEIDOSCOPE_KALEIDOSCOPE_METRICS_RECORDER_H_
#include "base/optional.h"
#include "chrome/browser/media/kaleidoscope/mojom/kaleidoscope.mojom.h"
// Takes care of recording metrics for Kaleidoscope. One of these objects exists
// per KaleidoscopeUI.
class KaleidoscopeMetricsRecorder {
public:
// These values are persisted to logs. Entries should not be renumbered and
// numeric values should never be reused.
enum class FirstRunProgress {
kCompleted = 0,
kProviderSelection = 1,
kMediaFeedsConsent = 2,
kWelcome = 3,
kMaxValue = kWelcome,
};
KaleidoscopeMetricsRecorder();
KaleidoscopeMetricsRecorder(const KaleidoscopeMetricsRecorder&) = delete;
KaleidoscopeMetricsRecorder& operator=(const KaleidoscopeMetricsRecorder&) =
delete;
~KaleidoscopeMetricsRecorder();
// Called when the Kaleidoscope page is exited by the user (e.g. by closing
// the tab or otherwise navigating.
void OnExitPage();
// Called when the user moves to a new step of the FRE.
void OnFirstRunExperienceStepChanged(
media::mojom::KaleidoscopeFirstRunExperienceStep step);
private:
void RecordFirstRunProgress(FirstRunProgress progress);
base::Optional<media::mojom::KaleidoscopeFirstRunExperienceStep>
first_run_experience_step_;
};
#endif // CHROME_BROWSER_MEDIA_KALEIDOSCOPE_KALEIDOSCOPE_METRICS_RECORDER_H_

@ -1,83 +0,0 @@
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/media/kaleidoscope/kaleidoscope_metrics_recorder.h"
#include "base/test/metrics/histogram_tester.h"
#include "chrome/browser/media/kaleidoscope/mojom/kaleidoscope.mojom.h"
#include "testing/gtest/include/gtest/gtest.h"
using FirstRunProgress = KaleidoscopeMetricsRecorder::FirstRunProgress;
class KaleidoscopeMetricsRecorderTest : public testing::Test {
public:
void ExpectFirstRunProgressCount(FirstRunProgress progress,
int expected_count) {
histogram_tester_.ExpectBucketCount("Media.Kaleidoscope.FirstRunProgress",
progress, expected_count);
}
void ExpectFirstRunProgressTotalCount(int expected_count) {
histogram_tester_.ExpectTotalCount("Media.Kaleidoscope.FirstRunProgress",
expected_count);
}
KaleidoscopeMetricsRecorder& recorder() { return recorder_; }
private:
KaleidoscopeMetricsRecorder recorder_;
base::HistogramTester histogram_tester_;
};
TEST_F(KaleidoscopeMetricsRecorderTest, OnCompletedRecordsCompleted) {
ExpectFirstRunProgressCount(FirstRunProgress::kCompleted, 0);
recorder().OnFirstRunExperienceStepChanged(
media::mojom::KaleidoscopeFirstRunExperienceStep::kCompleted);
ExpectFirstRunProgressCount(FirstRunProgress::kCompleted, 1);
ExpectFirstRunProgressTotalCount(1);
}
TEST_F(KaleidoscopeMetricsRecorderTest, OnExitWithNoStepsRecordsNothing) {
ExpectFirstRunProgressTotalCount(0);
recorder().OnExitPage();
ExpectFirstRunProgressTotalCount(0);
}
TEST_F(KaleidoscopeMetricsRecorderTest, OnExitRecordsCurrentStep) {
ExpectFirstRunProgressTotalCount(0);
recorder().OnFirstRunExperienceStepChanged(
media::mojom::KaleidoscopeFirstRunExperienceStep::kProviderSelection);
ExpectFirstRunProgressTotalCount(0);
recorder().OnFirstRunExperienceStepChanged(
media::mojom::KaleidoscopeFirstRunExperienceStep::kWelcome);
ExpectFirstRunProgressTotalCount(0);
recorder().OnFirstRunExperienceStepChanged(
media::mojom::KaleidoscopeFirstRunExperienceStep::kMediaFeedsConsent);
ExpectFirstRunProgressTotalCount(0);
recorder().OnExitPage();
ExpectFirstRunProgressCount(FirstRunProgress::kMediaFeedsConsent, 1);
ExpectFirstRunProgressTotalCount(1);
}
TEST_F(KaleidoscopeMetricsRecorderTest,
OnExitAfterCompletedDoesNotRecordAnythingElse) {
// Go through the steps and then complete.
ExpectFirstRunProgressTotalCount(0);
recorder().OnFirstRunExperienceStepChanged(
media::mojom::KaleidoscopeFirstRunExperienceStep::kProviderSelection);
ExpectFirstRunProgressTotalCount(0);
recorder().OnFirstRunExperienceStepChanged(
media::mojom::KaleidoscopeFirstRunExperienceStep::kMediaFeedsConsent);
ExpectFirstRunProgressTotalCount(0);
recorder().OnFirstRunExperienceStepChanged(
media::mojom::KaleidoscopeFirstRunExperienceStep::kCompleted);
// Completed should be recorded.
ExpectFirstRunProgressCount(FirstRunProgress::kCompleted, 1);
ExpectFirstRunProgressTotalCount(1);
// OnExitPage should not record any new data.
recorder().OnExitPage();
ExpectFirstRunProgressTotalCount(1);
}

@ -1,31 +0,0 @@
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/media/kaleidoscope/kaleidoscope_prefs.h"
#include "components/prefs/pref_registry_simple.h"
namespace kaleidoscope {
namespace prefs {
const char kKaleidoscopeFirstRunCompleted[] =
"kaleidoscope.first_run_completed";
const char kKaleidoscopeAutoSelectMediaFeeds[] =
"kaleidoscope.auto_select_media_feeds";
const char kKaleidoscopePolicyEnabled[] = "kaleidoscope.enabled_by_policy";
const char kKaleidoscopeSignedOutProviders[] =
"kaleidoscope.signed_out_providers";
void RegisterProfilePrefs(PrefRegistrySimple* registry) {
registry->RegisterIntegerPref(kKaleidoscopeFirstRunCompleted, 0);
registry->RegisterBooleanPref(kKaleidoscopeAutoSelectMediaFeeds, false);
registry->RegisterBooleanPref(kKaleidoscopePolicyEnabled, true);
registry->RegisterListPref(kKaleidoscopeSignedOutProviders);
}
} // namespace prefs
} // namespace kaleidoscope

@ -1,32 +0,0 @@
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_MEDIA_KALEIDOSCOPE_KALEIDOSCOPE_PREFS_H_
#define CHROME_BROWSER_MEDIA_KALEIDOSCOPE_KALEIDOSCOPE_PREFS_H_
class PrefRegistrySimple;
namespace kaleidoscope {
namespace prefs {
// Stores the latest version of the first run experience that was completed
// successfully by the user.
extern const char kKaleidoscopeFirstRunCompleted[];
// Stores true if the user has consented to us selecting Media Feeds for display
// automatically.
extern const char kKaleidoscopeAutoSelectMediaFeeds[];
// Stores true if Kaleidoscope has been enabled/disabled by an administrator.
extern const char kKaleidoscopePolicyEnabled[];
// Stores the list of provider IDs if the user is signed out.
extern const char kKaleidoscopeSignedOutProviders[];
void RegisterProfilePrefs(PrefRegistrySimple* registry);
} // namespace prefs
} // namespace kaleidoscope
#endif // CHROME_BROWSER_MEDIA_KALEIDOSCOPE_KALEIDOSCOPE_PREFS_H_

@ -1,9 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<grit latest_public_release="0" current_release="1" output_all_resource_defines="false">
<outputs>
<output filename="grit/kaleidoscope_resources.h" type="rc_header">
<emit emit_type='prepend'></emit>
</output>
<output filename="kaleidoscope_resources.pak" type="data_package" />
</outputs>
</grit>

@ -1,324 +0,0 @@
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/media/kaleidoscope/kaleidoscope_service.h"
#include "base/base64.h"
#include "base/command_line.h"
#include "base/feature_list.h"
#include "base/metrics/histogram_functions.h"
#include "base/strings/strcat.h"
#include "base/time/default_clock.h"
#include "chrome/browser/media/history/media_history_store.h"
#include "chrome/browser/media/kaleidoscope/constants.h"
#include "chrome/browser/media/kaleidoscope/kaleidoscope_prefs.h"
#include "chrome/browser/media/kaleidoscope/kaleidoscope_service_factory.h"
#include "chrome/browser/media/kaleidoscope/kaleidoscope_switches.h"
#include "chrome/browser/profiles/profile.h"
#include "components/prefs/pref_service.h"
#include "components/variations/net/variations_http_headers.h"
#include "content/public/browser/storage_partition.h"
#include "media/base/media_switches.h"
#include "net/base/load_flags.h"
#include "net/http/http_request_headers.h"
#include "net/http/http_status_code.h"
#include "services/network/public/cpp/shared_url_loader_factory.h"
#include "services/network/public/cpp/simple_url_loader.h"
namespace kaleidoscope {
namespace {
const char kRequestContentType[] = "application/x-protobuf";
const char kCollectionsURLFormat[] = "/v1/collections";
class GetCollectionsRequest {
public:
GetCollectionsRequest(
media::mojom::CredentialsPtr credentials,
const std::string& gaia_id,
const std::string& request_b64,
scoped_refptr<::network::SharedURLLoaderFactory> url_loader_factory,
base::Clock* clock,
base::OnceCallback<void(const std::string&)> callback)
: gaia_id_(gaia_id), clock_(clock), start_time_(clock->Now()) {
const auto base_url =
GetGoogleAPIBaseURL(*base::CommandLine::ForCurrentProcess());
GURL::Replacements replacements;
replacements.SetPathStr(kCollectionsURLFormat);
std::string request_body;
base::Base64Decode(request_b64, &request_body);
net::NetworkTrafficAnnotationTag traffic_annotation =
net::DefineNetworkTrafficAnnotation("kaleidoscope_service", R"(
semantics {
sender: "Kaleidoscope Service"
description:
"Kaleidoscope fetches media recommendations from Google and "
"displays them on the New Tab Page."
trigger:
"Opening the New Tab Page after having not opened the New Tab Page "
"for more than 24 hours. Opening the New Tab Page after having "
"signed in/signed out to a different user account. "
data: "Google account login."
destination: GOOGLE_OWNED_SERVICE
}
policy {
cookies_allowed: NO
setting:
"The feature is enabled by default. The user can disable "
"individual media feeds. The feature does not operate in "
"incognito mode."
policy_exception_justification:
"Not implemented."
})");
auto resource_request = std::make_unique<::network::ResourceRequest>();
resource_request->url = base_url.ReplaceComponents(replacements);
resource_request->method = net::HttpRequestHeaders::kPostMethod;
resource_request->load_flags = net::LOAD_DISABLE_CACHE;
resource_request->credentials_mode = network::mojom::CredentialsMode::kOmit;
if (credentials->access_token.has_value()) {
resource_request->headers.SetHeader(
net::HttpRequestHeaders::kAuthorization,
base::StrCat({"Bearer ", *credentials->access_token}));
}
if (!credentials->api_key.empty()) {
resource_request->headers.SetHeader("X-Goog-Api-Key",
credentials->api_key);
}
resource_request->headers.SetHeader("X-Goog-Encode-Response-If-Executable",
"base64");
variations::AppendVariationsHeader(
resource_request->url, variations::InIncognito::kNo,
credentials->access_token.has_value() ? variations::SignedIn::kYes
: variations::SignedIn::kNo,
resource_request.get());
resource_request->headers.SetHeader(net::HttpRequestHeaders::kContentType,
kRequestContentType);
pending_request_ = network::SimpleURLLoader::Create(
std::move(resource_request), traffic_annotation);
pending_request_->SetAllowHttpErrorResults(true);
pending_request_->AttachStringForUpload(request_body, kRequestContentType);
pending_request_->DownloadToStringOfUnboundedSizeUntilCrashAndDie(
url_loader_factory.get(),
base::BindOnce(&GetCollectionsRequest::OnDataLoaded,
base::Unretained(this), std::move(callback)));
}
~GetCollectionsRequest() = default;
std::string gaia_id() const { return gaia_id_; }
network::SimpleURLLoader& url_loader() const {
return *pending_request_.get();
}
bool has_failed() const {
return url_loader().NetError() != net::OK ||
response_code() != net::HTTP_OK;
}
bool not_available() const {
return url_loader().NetError() == net::OK &&
response_code() == net::HTTP_FORBIDDEN;
}
private:
void OnDataLoaded(base::OnceCallback<void(const std::string&)> callback,
std::unique_ptr<std::string> data) {
base::TimeDelta time_taken = clock_->Now() - start_time_;
base::UmaHistogramTimes(
KaleidoscopeService::kNTPModuleServerFetchTimeHistogramName,
time_taken);
if (data) {
std::move(callback).Run(*data);
} else {
std::move(callback).Run(std::string());
}
}
int response_code() const {
if (url_loader().ResponseInfo() && url_loader().ResponseInfo()->headers) {
return url_loader().ResponseInfo()->headers->response_code();
}
return 0;
}
std::string const gaia_id_;
base::Clock* const clock_;
base::Time const start_time_;
std::unique_ptr<::network::SimpleURLLoader> pending_request_;
};
} // namespace
const char KaleidoscopeService::kNTPModuleCacheHitHistogramName[] =
"Media.Kaleidoscope.NewTabPage.CacheHitWhenForced";
const char KaleidoscopeService::kNTPModuleServerFetchTimeHistogramName[] =
"Media.Kaleidoscope.NewTabPage.ServerFetchTime";
KaleidoscopeService::KaleidoscopeService(Profile* profile)
: profile_(profile), clock_(base::DefaultClock::GetInstance()) {
DCHECK(!profile->IsOffTheRecord());
DCHECK(clock_);
}
// static
KaleidoscopeService* KaleidoscopeService::Get(Profile* profile) {
return KaleidoscopeServiceFactory::GetForProfile(profile);
}
KaleidoscopeService::~KaleidoscopeService() = default;
bool KaleidoscopeService::IsEnabled() {
return base::FeatureList::IsEnabled(media::kKaleidoscope);
}
void KaleidoscopeService::GetCollections(
media::mojom::CredentialsPtr credentials,
const std::string& gaia_id,
const std::string& request,
GetCollectionsCallback callback) {
// If the GAIA id has changed then reset the request if there is one inflight.
if (request_ && request_->gaia_id() != gaia_id) {
request_.reset();
}
// Check Media History if we have any cached kaleidoscope data.
media_history::MediaHistoryKeyedService::Get(profile_)->GetKaleidoscopeData(
gaia_id,
base::BindOnce(&KaleidoscopeService::OnGotCachedData,
weak_ptr_factory_.GetWeakPtr(), std::move(credentials),
gaia_id, request, std::move(callback)));
}
void KaleidoscopeService::SetCollectionsForTesting(
const std::string& collections) {
media_history::MediaHistoryKeyedService::Get(profile_)->SetKaleidoscopeData(
media::mojom::GetCollectionsResponse::New(
collections, media::mojom::GetCollectionsResult::kSuccess),
"");
}
bool KaleidoscopeService::ShouldShowFirstRunExperience() {
// If the flag for forcing the first run experience to show is set, then just
// show it.
if (base::FeatureList::IsEnabled(
media::kKaleidoscopeForceShowFirstRunExperience)) {
return true;
}
// Otherwise, check to see if the user has already completed the latest first
// run experience.
auto* prefs = profile_->GetPrefs();
if (!prefs)
return true;
// If the pref is unset or lower than the current version, then we haven't
// shown the current first run experience before and we should show it now.
const base::Value* pref = prefs->GetUserPrefValue(
kaleidoscope::prefs::kKaleidoscopeFirstRunCompleted);
if (!pref || pref->GetInt() < kKaleidoscopeFirstRunLatestVersion)
return true;
// Otherwise, we have shown it and don't need to.
return false;
}
void KaleidoscopeService::OnGotCachedData(
media::mojom::CredentialsPtr credentials,
const std::string& gaia_id,
const std::string& request,
GetCollectionsCallback callback,
media::mojom::GetCollectionsResponsePtr cached) {
// If we got cached data then return that.
if (cached) {
if (base::FeatureList::IsEnabled(media::kKaleidoscopeModuleCacheOnly)) {
base::UmaHistogramEnumeration(kNTPModuleCacheHitHistogramName,
CacheHitResult::kCacheHit);
}
std::move(callback).Run(std::move(cached));
return;
}
// If the module is set to "cache only" then we will return an empty response
// and fire the request in the background. The next time the user opens the
// NTP they will see the recommendations.
if (base::FeatureList::IsEnabled(media::kKaleidoscopeModuleCacheOnly)) {
base::UmaHistogramEnumeration(kNTPModuleCacheHitHistogramName,
CacheHitResult::kCacheMiss);
std::move(callback).Run(media::mojom::GetCollectionsResponse::New(
"", media::mojom::GetCollectionsResult::kFailed));
} else {
// Add the callback.
pending_callbacks_.push_back(std::move(callback));
}
// Create the request.
if (!request_) {
request_ = std::make_unique<GetCollectionsRequest>(
std::move(credentials), gaia_id, request,
GetURLLoaderFactoryForFetcher(), clock_,
base::BindOnce(&KaleidoscopeService::OnURLFetchComplete,
base::Unretained(this), gaia_id));
}
}
void KaleidoscopeService::OnURLFetchComplete(const std::string& gaia_id,
const std::string& data) {
auto response = media::mojom::GetCollectionsResponse::New();
if (request_->not_available()) {
response->result = media::mojom::GetCollectionsResult::kNotAvailable;
} else if (request_->has_failed()) {
response->result = media::mojom::GetCollectionsResult::kFailed;
} else if (ShouldShowFirstRunExperience()) {
// If we should show the first run experience then we should send a special
// "first run" response which will trigger the module to display the first
// run promo message.
response->result = media::mojom::GetCollectionsResult::kFirstRun;
} else {
response->result = media::mojom::GetCollectionsResult::kSuccess;
response->response = data;
}
for (auto& callback : pending_callbacks_) {
std::move(callback).Run(response.Clone());
}
pending_callbacks_.clear();
request_.reset();
// If the request did not fail then we should save it in the cache so we avoid
// hitting the server later. If the response was that Kaleidoscope is not
// available to the user then that is cacheable too.
if (response->result != media::mojom::GetCollectionsResult::kFailed) {
media_history::MediaHistoryKeyedService::Get(profile_)->SetKaleidoscopeData(
response.Clone(), gaia_id);
}
}
scoped_refptr<::network::SharedURLLoaderFactory>
KaleidoscopeService::GetURLLoaderFactoryForFetcher() {
if (test_url_loader_factory_for_fetcher_)
return test_url_loader_factory_for_fetcher_;
return content::BrowserContext::GetDefaultStoragePartition(profile_)
->GetURLLoaderFactoryForBrowserProcess();
}
} // namespace kaleidoscope

@ -1,92 +0,0 @@
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_MEDIA_KALEIDOSCOPE_KALEIDOSCOPE_SERVICE_H_
#define CHROME_BROWSER_MEDIA_KALEIDOSCOPE_KALEIDOSCOPE_SERVICE_H_
#include <memory>
#include <set>
#include "chrome/browser/media/kaleidoscope/mojom/kaleidoscope.mojom.h"
#include "components/keyed_service/core/keyed_service.h"
#include "services/network/public/cpp/shared_url_loader_factory.h"
class Profile;
namespace base {
class Clock;
} // namespace base
namespace kaleidoscope {
namespace {
class GetCollectionsRequest;
} // namespace
class KaleidoscopeService : public KeyedService {
public:
static const char kNTPModuleCacheHitHistogramName[];
static const char kNTPModuleServerFetchTimeHistogramName[];
// When we try and ger Kaleidoscope data we store whether we hit the cache in
// |kNTPModuleCacheHitHistogramName|. Do not change the numbering since this
// is recorded.
enum class CacheHitResult {
kCacheHit = 0,
kCacheMiss = 1,
kMaxValue = kCacheMiss,
};
explicit KaleidoscopeService(Profile* profile);
~KaleidoscopeService() override;
KaleidoscopeService(const KaleidoscopeService&) = delete;
KaleidoscopeService& operator=(const KaleidoscopeService&) = delete;
static bool IsEnabled();
// Returns the instance attached to the given |profile|.
static KaleidoscopeService* Get(Profile* profile);
using GetCollectionsCallback =
base::OnceCallback<void(media::mojom::GetCollectionsResponsePtr)>;
void GetCollections(media::mojom::CredentialsPtr credentials,
const std::string& gaia_id,
const std::string& request,
GetCollectionsCallback callback);
void SetCollectionsForTesting(const std::string& collections);
bool ShouldShowFirstRunExperience();
private:
friend class KaleidoscopeServiceTest;
void OnGotCachedData(media::mojom::CredentialsPtr credentials,
const std::string& gaia_id,
const std::string& request,
GetCollectionsCallback callback,
media::mojom::GetCollectionsResponsePtr cached);
void OnURLFetchComplete(const std::string& gaia_id, const std::string& data);
scoped_refptr<::network::SharedURLLoaderFactory>
GetURLLoaderFactoryForFetcher();
scoped_refptr<::network::SharedURLLoaderFactory>
test_url_loader_factory_for_fetcher_;
Profile* const profile_;
std::unique_ptr<GetCollectionsRequest> request_;
std::vector<GetCollectionsCallback> pending_callbacks_;
base::Clock* clock_;
base::WeakPtrFactory<KaleidoscopeService> weak_ptr_factory_{this};
};
} // namespace kaleidoscope
#endif // CHROME_BROWSER_MEDIA_KALEIDOSCOPE_KALEIDOSCOPE_SERVICE_H_

@ -1,54 +0,0 @@
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/media/kaleidoscope/kaleidoscope_service_factory.h"
#include "chrome/browser/media/kaleidoscope/kaleidoscope_service.h"
#include "chrome/browser/profiles/profile.h"
#include "components/keyed_service/content/browser_context_dependency_manager.h"
#include "content/public/browser/browser_context.h"
namespace kaleidoscope {
// static
KaleidoscopeService* KaleidoscopeServiceFactory::GetForProfile(
Profile* profile) {
if (profile->IsOffTheRecord())
return nullptr;
if (!KaleidoscopeService::IsEnabled())
return nullptr;
return static_cast<KaleidoscopeService*>(
GetInstance()->GetServiceForBrowserContext(profile, true));
}
// static
KaleidoscopeServiceFactory* KaleidoscopeServiceFactory::GetInstance() {
static base::NoDestructor<KaleidoscopeServiceFactory> factory;
return factory.get();
}
KaleidoscopeServiceFactory::KaleidoscopeServiceFactory()
: BrowserContextKeyedServiceFactory(
"KaleidoscopeService",
BrowserContextDependencyManager::GetInstance()) {}
KaleidoscopeServiceFactory::~KaleidoscopeServiceFactory() = default;
bool KaleidoscopeServiceFactory::ServiceIsCreatedWithBrowserContext() const {
return true;
}
KeyedService* KaleidoscopeServiceFactory::BuildServiceInstanceFor(
content::BrowserContext* context) const {
DCHECK(!context->IsOffTheRecord());
if (!KaleidoscopeService::IsEnabled())
return nullptr;
return new KaleidoscopeService(Profile::FromBrowserContext(context));
}
} // namespace kaleidoscope

@ -1,42 +0,0 @@
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_MEDIA_KALEIDOSCOPE_KALEIDOSCOPE_SERVICE_FACTORY_H_
#define CHROME_BROWSER_MEDIA_KALEIDOSCOPE_KALEIDOSCOPE_SERVICE_FACTORY_H_
#include "base/no_destructor.h"
#include "components/keyed_service/content/browser_context_keyed_service_factory.h"
class KeyedService;
class Profile;
namespace content {
class BrowserContext;
} // namespace content
namespace kaleidoscope {
class KaleidoscopeService;
class KaleidoscopeServiceFactory : public BrowserContextKeyedServiceFactory {
public:
static KaleidoscopeService* GetForProfile(Profile* profile);
static KaleidoscopeServiceFactory* GetInstance();
protected:
bool ServiceIsCreatedWithBrowserContext() const override;
private:
friend class base::NoDestructor<KaleidoscopeServiceFactory>;
KaleidoscopeServiceFactory();
~KaleidoscopeServiceFactory() override;
KeyedService* BuildServiceInstanceFor(
content::BrowserContext* context) const override;
};
} // namespace kaleidoscope
#endif // CHROME_BROWSER_MEDIA_KALEIDOSCOPE_KALEIDOSCOPE_SERVICE_FACTORY_H_

@ -1,370 +0,0 @@
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/media/kaleidoscope/kaleidoscope_service.h"
#include <memory>
#include "base/strings/strcat.h"
#include "base/test/bind.h"
#include "base/test/metrics/histogram_tester.h"
#include "base/test/scoped_feature_list.h"
#include "base/test/simple_test_clock.h"
#include "base/test/task_environment.h"
#include "chrome/browser/media/kaleidoscope/constants.h"
#include "chrome/browser/media/kaleidoscope/kaleidoscope_prefs.h"
#include "chrome/test/base/chrome_render_view_host_test_harness.h"
#include "components/prefs/pref_service.h"
#include "media/base/media_switches.h"
#include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h"
#include "services/network/test/test_url_loader_factory.h"
#include "services/network/test/test_utils.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "url/gurl.h"
namespace kaleidoscope {
namespace {
const char kTestUrl[] =
"https://chromemediarecommendations-pa.googleapis.com/v1/collections";
const char kTestData[] = "zzzz";
const char kTestAPIKey[] = "apikey";
const char kTestAccessToken[] = "accesstoken";
} // namespace
class KaleidoscopeServiceTest : public ChromeRenderViewHostTestHarness {
public:
KaleidoscopeServiceTest() = default;
~KaleidoscopeServiceTest() override = default;
KaleidoscopeServiceTest(const KaleidoscopeServiceTest& t) = delete;
KaleidoscopeServiceTest& operator=(const KaleidoscopeServiceTest&) = delete;
void SetUp() override {
ChromeRenderViewHostTestHarness::SetUp();
GetService()->test_url_loader_factory_for_fetcher_ =
base::MakeRefCounted<::network::WeakWrapperSharedURLLoaderFactory>(
&url_loader_factory_);
GetService()->clock_ = &clock_;
feature_list_.InitWithFeatures({}, {media::kKaleidoscopeModuleCacheOnly});
}
::network::TestURLLoaderFactory* url_loader_factory() {
return &url_loader_factory_;
}
bool RespondToFetch(
const std::string& response_body,
net::HttpStatusCode response_code = net::HttpStatusCode::HTTP_OK,
int net_error = net::OK) {
auto response_head = ::network::CreateURLResponseHead(response_code);
bool rv = url_loader_factory()->SimulateResponseForPendingRequest(
GURL(kTestUrl), ::network::URLLoaderCompletionStatus(net_error),
std::move(response_head), response_body);
task_environment()->RunUntilIdle();
return rv;
}
void WaitForRequest() {
task_environment()->RunUntilIdle();
ASSERT_TRUE(GetCurrentRequest().url.is_valid());
EXPECT_EQ(net::HttpRequestHeaders::kPostMethod, GetCurrentRequest().method);
EXPECT_EQ(GetCurrentlyQueriedHeaderValue("X-Goog-Api-Key"), kTestAPIKey);
EXPECT_EQ(
GetCurrentlyQueriedHeaderValue(net::HttpRequestHeaders::kAuthorization),
base::StrCat({"Bearer ", kTestAccessToken}));
}
media::mojom::CredentialsPtr CreateCredentials() {
auto creds = media::mojom::Credentials::New();
creds->api_key = kTestAPIKey;
creds->access_token = kTestAccessToken;
return creds;
}
KaleidoscopeService* GetService() {
return KaleidoscopeService::Get(profile());
}
void MarkFirstRunAsComplete() {
profile()->GetPrefs()->SetInteger(
kaleidoscope::prefs::kKaleidoscopeFirstRunCompleted,
kKaleidoscopeFirstRunLatestVersion);
}
base::SimpleTestClock& clock() { return clock_; }
private:
std::string GetCurrentlyQueriedHeaderValue(const base::StringPiece& key) {
std::string out;
GetCurrentRequest().headers.GetHeader(key, &out);
return out;
}
const ::network::ResourceRequest& GetCurrentRequest() {
return url_loader_factory()->pending_requests()->front().request;
}
::network::TestURLLoaderFactory url_loader_factory_;
base::SimpleTestClock clock_;
base::test::ScopedFeatureList feature_list_;
};
TEST_F(KaleidoscopeServiceTest, Success) {
MarkFirstRunAsComplete();
base::HistogramTester histogram_tester;
GetService()->GetCollections(
CreateCredentials(), "123", "abcd",
base::BindLambdaForTesting(
[&](media::mojom::GetCollectionsResponsePtr result) {
EXPECT_EQ(kTestData, result->response);
EXPECT_EQ(media::mojom::GetCollectionsResult::kSuccess,
result->result);
}));
WaitForRequest();
clock().Advance(base::TimeDelta::FromSeconds(5));
ASSERT_TRUE(RespondToFetch(kTestData));
// Wait for the callback to be called.
histogram_tester.ExpectUniqueTimeSample(
KaleidoscopeService::kNTPModuleServerFetchTimeHistogramName,
base::TimeDelta::FromSeconds(5), 1);
// If we call again then we should hit the cache.
GetService()->GetCollections(
CreateCredentials(), "123", "abcd",
base::BindLambdaForTesting(
[&](media::mojom::GetCollectionsResponsePtr result) {
EXPECT_EQ(kTestData, result->response);
EXPECT_EQ(media::mojom::GetCollectionsResult::kSuccess,
result->result);
}));
task_environment()->RunUntilIdle();
EXPECT_TRUE(url_loader_factory()->pending_requests()->empty());
// If we change the GAIA id then we should trigger a refetch.
GetService()->GetCollections(
CreateCredentials(), "1234", "abcd",
base::BindLambdaForTesting(
[&](media::mojom::GetCollectionsResponsePtr result) {
EXPECT_EQ(kTestData, result->response);
EXPECT_EQ(media::mojom::GetCollectionsResult::kSuccess,
result->result);
}));
task_environment()->RunUntilIdle();
EXPECT_FALSE(url_loader_factory()->pending_requests()->empty());
}
TEST_F(KaleidoscopeServiceTest, ServerFail_Forbidden) {
MarkFirstRunAsComplete();
GetService()->GetCollections(
CreateCredentials(), "123", "abcd",
base::BindLambdaForTesting(
[&](media::mojom::GetCollectionsResponsePtr result) {
EXPECT_TRUE(result->response.empty());
EXPECT_EQ(media::mojom::GetCollectionsResult::kNotAvailable,
result->result);
}));
WaitForRequest();
ASSERT_TRUE(RespondToFetch("", net::HTTP_FORBIDDEN));
// If we call again then we should hit the cache. HTTP Forbidden is special
// cased because this indicates the user cannot access Kaleidoscope.
GetService()->GetCollections(
CreateCredentials(), "123", "abcd",
base::BindLambdaForTesting(
[&](media::mojom::GetCollectionsResponsePtr result) {
EXPECT_TRUE(result->response.empty());
EXPECT_EQ(media::mojom::GetCollectionsResult::kNotAvailable,
result->result);
}));
task_environment()->RunUntilIdle();
EXPECT_TRUE(url_loader_factory()->pending_requests()->empty());
}
TEST_F(KaleidoscopeServiceTest, ServerFail) {
MarkFirstRunAsComplete();
GetService()->GetCollections(
CreateCredentials(), "123", "abcd",
base::BindLambdaForTesting(
[&](media::mojom::GetCollectionsResponsePtr result) {
EXPECT_TRUE(result->response.empty());
EXPECT_EQ(media::mojom::GetCollectionsResult::kFailed,
result->result);
}));
WaitForRequest();
ASSERT_TRUE(RespondToFetch("", net::HTTP_BAD_REQUEST));
// If we call again then we should not hit the cache.
GetService()->GetCollections(
CreateCredentials(), "123", "abcd",
base::BindLambdaForTesting(
[&](media::mojom::GetCollectionsResponsePtr result) {
EXPECT_TRUE(result->response.empty());
EXPECT_EQ(media::mojom::GetCollectionsResult::kFailed,
result->result);
}));
task_environment()->RunUntilIdle();
EXPECT_FALSE(url_loader_factory()->pending_requests()->empty());
}
TEST_F(KaleidoscopeServiceTest, NetworkFail) {
MarkFirstRunAsComplete();
GetService()->GetCollections(
CreateCredentials(), "123", "abcd",
base::BindLambdaForTesting(
[&](media::mojom::GetCollectionsResponsePtr result) {
EXPECT_TRUE(result->response.empty());
EXPECT_EQ(media::mojom::GetCollectionsResult::kFailed,
result->result);
}));
WaitForRequest();
ASSERT_TRUE(RespondToFetch("", net::HTTP_OK, net::ERR_UNEXPECTED));
// If we call again then we should not hit the cache.
GetService()->GetCollections(
CreateCredentials(), "123", "abcd",
base::BindLambdaForTesting(
[&](media::mojom::GetCollectionsResponsePtr result) {
EXPECT_TRUE(result->response.empty());
EXPECT_EQ(media::mojom::GetCollectionsResult::kFailed,
result->result);
}));
task_environment()->RunUntilIdle();
EXPECT_FALSE(url_loader_factory()->pending_requests()->empty());
}
TEST_F(KaleidoscopeServiceTest, ForceCache) {
MarkFirstRunAsComplete();
base::test::ScopedFeatureList feature_list;
feature_list.InitAndEnableFeature(media::kKaleidoscopeModuleCacheOnly);
{
base::HistogramTester histogram_tester;
bool resolved = false;
GetService()->GetCollections(
CreateCredentials(), "123", "abcd",
base::BindLambdaForTesting(
[&](media::mojom::GetCollectionsResponsePtr result) {
EXPECT_TRUE(result->response.empty());
EXPECT_EQ(media::mojom::GetCollectionsResult::kFailed,
result->result);
resolved = true;
}));
WaitForRequest();
// Check the callback is resolved before the fetch.
EXPECT_TRUE(resolved);
histogram_tester.ExpectUniqueSample(
KaleidoscopeService::kNTPModuleCacheHitHistogramName,
KaleidoscopeService::CacheHitResult::kCacheMiss, 1);
}
// Resolve the fetch to store the data.
ASSERT_TRUE(RespondToFetch(kTestData));
{
base::HistogramTester histogram_tester;
// If we call again then we should hit the cache.
GetService()->GetCollections(
CreateCredentials(), "123", "abcd",
base::BindLambdaForTesting(
[&](media::mojom::GetCollectionsResponsePtr result) {
EXPECT_EQ(kTestData, result->response);
EXPECT_EQ(media::mojom::GetCollectionsResult::kSuccess,
result->result);
}));
task_environment()->RunUntilIdle();
EXPECT_TRUE(url_loader_factory()->pending_requests()->empty());
histogram_tester.ExpectUniqueSample(
KaleidoscopeService::kNTPModuleCacheHitHistogramName,
KaleidoscopeService::CacheHitResult::kCacheHit, 1);
}
}
TEST_F(KaleidoscopeServiceTest, FirstRun) {
GetService()->GetCollections(
CreateCredentials(), "123", "abcd",
base::BindOnce([](media::mojom::GetCollectionsResponsePtr result) {
EXPECT_TRUE(result->response.empty());
EXPECT_EQ(media::mojom::GetCollectionsResult::kFirstRun,
result->result);
}));
WaitForRequest();
ASSERT_TRUE(RespondToFetch(kTestData));
// If we call again then we should hit the cache.
GetService()->GetCollections(
CreateCredentials(), "123", "abcd",
base::BindOnce([](media::mojom::GetCollectionsResponsePtr result) {
EXPECT_TRUE(result->response.empty());
EXPECT_EQ(media::mojom::GetCollectionsResult::kFirstRun,
result->result);
}));
// A request should not be created.
task_environment()->RunUntilIdle();
EXPECT_TRUE(url_loader_factory()->pending_requests()->empty());
}
TEST_F(KaleidoscopeServiceTest, FirstRunNotAvailable) {
GetService()->GetCollections(
CreateCredentials(), "123", "abcd",
base::BindOnce([](media::mojom::GetCollectionsResponsePtr result) {
EXPECT_TRUE(result->response.empty());
EXPECT_EQ(media::mojom::GetCollectionsResult::kNotAvailable,
result->result);
}));
WaitForRequest();
ASSERT_TRUE(RespondToFetch("", net::HTTP_FORBIDDEN));
// If we call again then we should hit the cache. HTTP Forbidden is special
// cased because this indicates the user cannot access Kaleidoscope.
GetService()->GetCollections(
CreateCredentials(), "123", "abcd",
base::BindOnce([](media::mojom::GetCollectionsResponsePtr result) {
EXPECT_TRUE(result->response.empty());
EXPECT_EQ(media::mojom::GetCollectionsResult::kNotAvailable,
result->result);
}));
// A request should not be created.
task_environment()->RunUntilIdle();
EXPECT_TRUE(url_loader_factory()->pending_requests()->empty());
}
} // namespace kaleidoscope

@ -1,55 +0,0 @@
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/media/kaleidoscope/kaleidoscope_switches.h"
#include "base/command_line.h"
#include "url/gurl.h"
namespace switches {
// A command line switch for overriding the base URL of the API.
const char kKaleidoscopeBackendUrl[] = "kaleidoscope-backend-url";
// The command line alias and URL for the "prod" environment.
const char kKaleidoscopeBackendUrlProdAlias[] = "prod";
const char kKaleidoscopeBackendUrlProdUrl[] =
"https://chromemediarecommendations-pa.googleapis.com";
// The command line alias and URL for the "staging" environment.
const char kKaleidoscopeBackendUrlStagingAlias[] = "staging";
const char kKaleidoscopeBackendUrlStagingUrl[] =
"https://staging-chromemediarecommendations-pa.sandbox.googleapis.com";
// The command line alias and URL for the "autopush" environment.
const char kKaleidoscopeBackendUrlAutopushAlias[] = "autopush";
const char kKaleidoscopeBackendUrlAutopushUrl[] =
"https://autopush-chromemediarecommendations-pa.sandbox.googleapis.com";
} // namespace switches
GURL GetGoogleAPIBaseURL(const base::CommandLine& command_line) {
// Return the URL set in the command line, if any.
if (command_line.HasSwitch(switches::kKaleidoscopeBackendUrl)) {
auto value =
command_line.GetSwitchValueASCII(switches::kKaleidoscopeBackendUrl);
// If the value is a valid base URL then return it.
GURL url(value);
if (url.is_valid() && (url.path().empty() || url.path() == "/")) {
return url;
}
// Check if the value is an alias and return it.
if (value == switches::kKaleidoscopeBackendUrlProdAlias) {
return GURL(switches::kKaleidoscopeBackendUrlProdUrl);
} else if (value == switches::kKaleidoscopeBackendUrlStagingAlias) {
return GURL(switches::kKaleidoscopeBackendUrlStagingUrl);
} else if (value == switches::kKaleidoscopeBackendUrlAutopushAlias) {
return GURL(switches::kKaleidoscopeBackendUrlAutopushUrl);
}
}
return GURL(switches::kKaleidoscopeBackendUrlProdUrl);
}

@ -1,31 +0,0 @@
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_MEDIA_KALEIDOSCOPE_KALEIDOSCOPE_SWITCHES_H_
#define CHROME_BROWSER_MEDIA_KALEIDOSCOPE_KALEIDOSCOPE_SWITCHES_H_
namespace base {
class CommandLine;
} // namespace base
class GURL;
namespace switches {
extern const char kKaleidoscopeBackendUrl[];
extern const char kKaleidoscopeBackendUrlProdAlias[];
extern const char kKaleidoscopeBackendUrlProdUrl[];
extern const char kKaleidoscopeBackendUrlStagingAlias[];
extern const char kKaleidoscopeBackendUrlStagingUrl[];
extern const char kKaleidoscopeBackendUrlAutopushAlias[];
extern const char kKaleidoscopeBackendUrlAutopushUrl[];
} // namespace switches
// Based on a |command_line| return the base URL to the Google API. The
// --kaleidoscope-backend-url switch takes either a URL or an alias which is
// one of autopush, staging or prod.
GURL GetGoogleAPIBaseURL(const base::CommandLine& command_line);
#endif // CHROME_BROWSER_MEDIA_KALEIDOSCOPE_KALEIDOSCOPE_SWITCHES_H_

@ -1,89 +0,0 @@
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/media/kaleidoscope/kaleidoscope_switches.h"
#include "base/command_line.h"
#include "base/test/scoped_command_line.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "url/gurl.h"
namespace {
const char kDefaultUrl[] =
"https://chromemediarecommendations-pa.googleapis.com";
} // namespace
using KaleidoscopeSwitchesTest = testing::Test;
TEST_F(KaleidoscopeSwitchesTest, Switches_Default) {
GURL expected(kDefaultUrl);
EXPECT_EQ(expected,
GetGoogleAPIBaseURL(*base::CommandLine::ForCurrentProcess()));
}
TEST_F(KaleidoscopeSwitchesTest, Switches_Prod) {
base::test::ScopedCommandLine scoped_command_line;
base::CommandLine* command_line = scoped_command_line.GetProcessCommandLine();
command_line->AppendSwitchASCII(switches::kKaleidoscopeBackendUrl,
switches::kKaleidoscopeBackendUrlProdAlias);
GURL expected("https://chromemediarecommendations-pa.googleapis.com");
EXPECT_EQ(expected, GetGoogleAPIBaseURL(*command_line));
}
TEST_F(KaleidoscopeSwitchesTest, Switches_Staging) {
base::test::ScopedCommandLine scoped_command_line;
base::CommandLine* command_line = scoped_command_line.GetProcessCommandLine();
command_line->AppendSwitchASCII(
switches::kKaleidoscopeBackendUrl,
switches::kKaleidoscopeBackendUrlStagingAlias);
GURL expected(
"https://staging-chromemediarecommendations-pa.sandbox.googleapis.com");
EXPECT_EQ(expected, GetGoogleAPIBaseURL(*command_line));
}
TEST_F(KaleidoscopeSwitchesTest, Switches_Autopush) {
base::test::ScopedCommandLine scoped_command_line;
base::CommandLine* command_line = scoped_command_line.GetProcessCommandLine();
command_line->AppendSwitchASCII(
switches::kKaleidoscopeBackendUrl,
switches::kKaleidoscopeBackendUrlAutopushAlias);
GURL expected(
"https://autopush-chromemediarecommendations-pa.sandbox.googleapis.com");
EXPECT_EQ(expected, GetGoogleAPIBaseURL(*command_line));
}
TEST_F(KaleidoscopeSwitchesTest, Switches_Bad) {
base::test::ScopedCommandLine scoped_command_line;
base::CommandLine* command_line = scoped_command_line.GetProcessCommandLine();
command_line->AppendSwitchASCII(switches::kKaleidoscopeBackendUrl, "xxx");
GURL expected(kDefaultUrl);
EXPECT_EQ(expected, GetGoogleAPIBaseURL(*command_line));
}
TEST_F(KaleidoscopeSwitchesTest, Switches_CustomURL) {
base::test::ScopedCommandLine scoped_command_line;
base::CommandLine* command_line = scoped_command_line.GetProcessCommandLine();
command_line->AppendSwitchASCII(switches::kKaleidoscopeBackendUrl,
"https://test.sandbox.googleapis.com");
GURL expected("https://test.sandbox.googleapis.com");
EXPECT_EQ(expected, GetGoogleAPIBaseURL(*command_line));
}
TEST_F(KaleidoscopeSwitchesTest, Switches_CustomURL_WithPath) {
base::test::ScopedCommandLine scoped_command_line;
base::CommandLine* command_line = scoped_command_line.GetProcessCommandLine();
command_line->AppendSwitchASCII(switches::kKaleidoscopeBackendUrl,
"https://test.sandbox.googleapis.com/v1");
GURL expected(kDefaultUrl);
EXPECT_EQ(expected, GetGoogleAPIBaseURL(*command_line));
}

@ -1,159 +0,0 @@
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/media/kaleidoscope/kaleidoscope_tab_helper.h"
#include "base/metrics/histogram_functions.h"
#include "chrome/browser/media/kaleidoscope/constants.h"
#include "content/public/browser/navigation_handle.h"
#include "services/metrics/public/cpp/ukm_builders.h"
#include "services/metrics/public/cpp/ukm_entry_builder.h"
#include "services/metrics/public/cpp/ukm_recorder.h"
#include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h"
#include "third_party/blink/public/mojom/autoplay/autoplay.mojom.h"
namespace {
const url::Origin& KaleidoscopeOrigin() {
static base::NoDestructor<url::Origin> origin(
url::Origin::Create(GURL(kKaleidoscopeUIURL)));
return *origin;
}
const url::Origin& WatchOrigin() {
static base::NoDestructor<url::Origin> origin(
url::Origin::Create(GURL(kKaleidoscopeWatchUIURL)));
return *origin;
}
const url::Origin& KaleidoscopeUntrustedOrigin() {
static base::NoDestructor<url::Origin> origin(
url::Origin::Create(GURL(kKaleidoscopeUntrustedContentUIURL)));
return *origin;
}
bool IsMediaItemOpenedFromKaleidoscope(content::NavigationHandle* handle) {
// Google MyActivity is excluded since it is opened from Kaleidoscope FRE
// and settings.
return (handle->GetInitiatorOrigin() &&
handle->GetInitiatorOrigin()->IsSameOriginWith(
KaleidoscopeUntrustedOrigin()) &&
handle->GetURL().host() != "myactivity.google.com");
}
bool ShouldAllowAutoplay(content::NavigationHandle* handle) {
// If the initiating origin is Kaleidoscope then we should allow autoplay.
if (IsMediaItemOpenedFromKaleidoscope(handle))
return true;
// If the tab is Kaleidoscope then we should allow autoplay.
auto parent_origin =
url::Origin::Create(handle->GetWebContents()->GetLastCommittedURL());
if (parent_origin.IsSameOriginWith(KaleidoscopeOrigin()) ||
parent_origin.IsSameOriginWith(WatchOrigin())) {
return true;
}
return false;
}
} // namespace
const char KaleidoscopeTabHelper::kKaleidoscopeNavigationHistogramName[] =
"Media.Kaleidoscope.Navigation";
const char KaleidoscopeTabHelper::
kKaleidoscopeOpenedMediaRecommendationHistogramName[] =
"Media.Kaleidoscope.OpenedMediaRecommendation";
KaleidoscopeTabHelper::KaleidoscopeTabHelper(content::WebContents* web_contents)
: content::WebContentsObserver(web_contents) {}
KaleidoscopeTabHelper::~KaleidoscopeTabHelper() = default;
void KaleidoscopeTabHelper::ReadyToCommitNavigation(
content::NavigationHandle* handle) {
if (handle->IsSameDocument() || handle->IsErrorPage())
return;
RecordMetricsOnNavigation(handle);
SetAutoplayOnNavigation(handle);
if (IsMediaItemOpenedFromKaleidoscope(handle)) {
is_kaleidoscope_derived_ = true;
return;
}
auto current_origin =
url::Origin::Create(handle->GetWebContents()->GetLastCommittedURL());
auto new_origin = url::Origin::Create(handle->GetURL());
if (!current_origin.IsSameOriginWith(new_origin)) {
is_kaleidoscope_derived_ = false;
}
// If the user was on Kaleidoscope but no longer is then the session has been
// ended.
if (current_origin.IsSameOriginWith(KaleidoscopeOrigin()) &&
!new_origin.IsSameOriginWith(KaleidoscopeOrigin()) &&
handle->IsInMainFrame()) {
OnKaleidoscopeSessionEnded();
} else if (current_origin.IsSameOriginWith(WatchOrigin()) &&
!new_origin.IsSameOriginWith(WatchOrigin()) &&
handle->IsInMainFrame()) {
OnKaleidoscopeSessionEnded();
}
}
void KaleidoscopeTabHelper::WebContentsDestroyed() {
auto current_origin =
url::Origin::Create(web_contents()->GetLastCommittedURL());
if (current_origin.IsSameOriginWith(KaleidoscopeOrigin()) ||
current_origin.IsSameOriginWith(WatchOrigin())) {
OnKaleidoscopeSessionEnded();
}
}
void KaleidoscopeTabHelper::RecordMetricsOnNavigation(
content::NavigationHandle* handle) {
// Only record metrics if this page was opened by Kaleidoscope.
if (IsMediaItemOpenedFromKaleidoscope(handle)) {
if (auto* opener = web_contents()->GetOpener()) {
auto* wc = content::WebContents::FromRenderFrameHost(opener);
KaleidoscopeTabHelper::FromWebContents(wc)->MarkAsSuccessful();
}
base::UmaHistogramEnumeration(kKaleidoscopeNavigationHistogramName,
KaleidoscopeNavigation::kNormal);
ukm::UkmRecorder* ukm_recorder = ukm::UkmRecorder::Get();
if (!ukm_recorder)
return;
ukm::builders::Media_Kaleidoscope_Navigation(
handle->GetNextPageUkmSourceId())
.SetWasFromKaleidoscope(true)
.Record(ukm_recorder);
}
}
void KaleidoscopeTabHelper::SetAutoplayOnNavigation(
content::NavigationHandle* handle) {
if (!ShouldAllowAutoplay(handle))
return;
mojo::AssociatedRemote<blink::mojom::AutoplayConfigurationClient> client;
handle->GetRenderFrameHost()->GetRemoteAssociatedInterfaces()->GetInterface(
&client);
client->AddAutoplayFlags(url::Origin::Create(handle->GetURL()),
blink::mojom::kAutoplayFlagUserException);
}
void KaleidoscopeTabHelper::OnKaleidoscopeSessionEnded() {
base::UmaHistogramBoolean(kKaleidoscopeOpenedMediaRecommendationHistogramName,
was_successful_);
was_successful_ = false;
}
WEB_CONTENTS_USER_DATA_KEY_IMPL(KaleidoscopeTabHelper)

@ -1,56 +0,0 @@
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_MEDIA_KALEIDOSCOPE_KALEIDOSCOPE_TAB_HELPER_H_
#define CHROME_BROWSER_MEDIA_KALEIDOSCOPE_KALEIDOSCOPE_TAB_HELPER_H_
#include "content/public/browser/web_contents_observer.h"
#include "content/public/browser/web_contents_user_data.h"
class KaleidoscopeTabHelper
: public content::WebContentsObserver,
public content::WebContentsUserData<KaleidoscopeTabHelper> {
public:
static const char kKaleidoscopeNavigationHistogramName[];
static const char kKaleidoscopeOpenedMediaRecommendationHistogramName[];
// These values are persisted to logs. Entries should not be renumbered and
// numeric values should never be reused.
enum class KaleidoscopeNavigation {
kNormal = 0,
kMaxValue = kNormal,
};
~KaleidoscopeTabHelper() override;
KaleidoscopeTabHelper(const KaleidoscopeTabHelper&) = delete;
KaleidoscopeTabHelper& operator=(const KaleidoscopeTabHelper&) = delete;
// content::WebContentsObserver:
void ReadyToCommitNavigation(content::NavigationHandle* handle) override;
void WebContentsDestroyed() override;
// A tab is Kaleidoscope derived if the tab was opened by Kaleidoscope and
// remains on the same origin.
bool IsKaleidoscopeDerived() const { return is_kaleidoscope_derived_; }
// A tab is successful if it had a Kaleidoscope session in it that resulted
// in the user opening another tab.
void MarkAsSuccessful() { was_successful_ = true; }
private:
friend class content::WebContentsUserData<KaleidoscopeTabHelper>;
explicit KaleidoscopeTabHelper(content::WebContents* web_contents);
void RecordMetricsOnNavigation(content::NavigationHandle* handle);
void SetAutoplayOnNavigation(content::NavigationHandle* handle);
void OnKaleidoscopeSessionEnded();
bool is_kaleidoscope_derived_ = false;
bool was_successful_ = false;
WEB_CONTENTS_USER_DATA_KEY_DECL();
};
#endif // CHROME_BROWSER_MEDIA_KALEIDOSCOPE_KALEIDOSCOPE_TAB_HELPER_H_

@ -1,195 +0,0 @@
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "base/test/metrics/histogram_tester.h"
#include "chrome/browser/media/kaleidoscope/constants.h"
#include "chrome/browser/media/kaleidoscope/kaleidoscope_tab_helper.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "chrome/test/base/ui_test_utils.h"
#include "components/ukm/test_ukm_recorder.h"
#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "content/public/test/test_navigation_observer.h"
#include "net/dns/mock_host_resolver.h"
#include "services/metrics/public/cpp/ukm_builders.h"
namespace {
static constexpr char const kTestPagePath[] = "/media/unified_autoplay.html";
} // anonymous namespace
class KaleidoscopeTabHelperBrowserTest : public InProcessBrowserTest {
public:
KaleidoscopeTabHelperBrowserTest() = default;
~KaleidoscopeTabHelperBrowserTest() override = default;
void SetUpOnMainThread() override {
host_resolver()->AddRule("*", "127.0.0.1");
ASSERT_TRUE(embedded_test_server()->Start());
InProcessBrowserTest::SetUpOnMainThread();
}
bool AttemptPlay(content::WebContents* web_contents) {
bool played = false;
EXPECT_TRUE(content::ExecuteScriptWithoutUserGestureAndExtractBool(
web_contents, "attemptPlay();", &played));
return played;
}
bool NavigateInRenderer(content::WebContents* web_contents, const GURL& url) {
content::TestNavigationObserver observer(web_contents);
bool result = content::ExecuteScriptWithoutUserGesture(
web_contents, "window.location = '" + url.spec() + "';");
if (result)
observer.Wait();
return result;
}
content::WebContents* GetWebContents() {
return browser()->tab_strip_model()->GetActiveWebContents();
}
KaleidoscopeTabHelper* GetTabHelper() {
return KaleidoscopeTabHelper::FromWebContents(GetWebContents());
}
base::HistogramTester histogram_tester_;
};
IN_PROC_BROWSER_TEST_F(KaleidoscopeTabHelperBrowserTest,
NotOpenedFromKaleidoscope) {
const GURL kTestPageUrl = embedded_test_server()->GetURL(kTestPagePath);
ukm::TestAutoSetUkmRecorder test_ukm_recorder;
NavigateParams params(browser(), kTestPageUrl, ui::PAGE_TRANSITION_LINK);
ui_test_utils::NavigateToURL(&params);
// Autoplay should not be allowed since that is the default.
EXPECT_FALSE(AttemptPlay(GetWebContents()));
EXPECT_FALSE(GetTabHelper()->IsKaleidoscopeDerived());
histogram_tester_.ExpectTotalCount(
KaleidoscopeTabHelper::kKaleidoscopeNavigationHistogramName, 0);
auto ukm_entries = test_ukm_recorder.GetEntriesByName(
ukm::builders::Media_Kaleidoscope_Navigation::kEntryName);
ASSERT_EQ(0u, ukm_entries.size());
}
IN_PROC_BROWSER_TEST_F(KaleidoscopeTabHelperBrowserTest,
OpenedFromKaleidoscope) {
const GURL kTestPageUrl = embedded_test_server()->GetURL(kTestPagePath);
ukm::TestAutoSetUkmRecorder test_ukm_recorder;
NavigateParams params(browser(), kTestPageUrl, ui::PAGE_TRANSITION_LINK);
params.initiator_origin =
url::Origin::Create(GURL(kKaleidoscopeUntrustedContentUIURL));
ui_test_utils::NavigateToURL(&params);
// Autoplay should be allowed because this page was opened from Kaleidoscope.
EXPECT_TRUE(AttemptPlay(GetWebContents()));
EXPECT_TRUE(GetTabHelper()->IsKaleidoscopeDerived());
// Autoplay should not be allowed since this is a derived navigation.
NavigateInRenderer(GetWebContents(), kTestPageUrl);
EXPECT_FALSE(AttemptPlay(GetWebContents()));
EXPECT_TRUE(GetTabHelper()->IsKaleidoscopeDerived());
histogram_tester_.ExpectBucketCount(
KaleidoscopeTabHelper::kKaleidoscopeNavigationHistogramName,
KaleidoscopeTabHelper::KaleidoscopeNavigation::kNormal, 1);
auto ukm_entries = test_ukm_recorder.GetEntriesByName(
ukm::builders::Media_Kaleidoscope_Navigation::kEntryName);
ASSERT_EQ(1u, ukm_entries.size());
auto* ukm_entry = ukm_entries.back();
test_ukm_recorder.ExpectEntrySourceHasUrl(ukm_entry, kTestPageUrl);
NavigateInRenderer(GetWebContents(), embedded_test_server()->GetURL(
"example.com", kTestPagePath));
EXPECT_FALSE(GetTabHelper()->IsKaleidoscopeDerived());
}
IN_PROC_BROWSER_TEST_F(KaleidoscopeTabHelperBrowserTest,
SessionMetric_OpenedRecommendation) {
const GURL kTestPageUrl = embedded_test_server()->GetURL(kTestPagePath);
{
// Navigate to Kaleidoscope.
NavigateParams params(browser(), GURL(kKaleidoscopeUIURL),
ui::PAGE_TRANSITION_LINK);
ui_test_utils::NavigateToURL(&params);
}
// Simulate a playback.
KaleidoscopeTabHelper::FromWebContents(GetWebContents())->MarkAsSuccessful();
{
// Navigate away from Kaleidoscope.
NavigateParams params(browser(), kTestPageUrl, ui::PAGE_TRANSITION_LINK);
ui_test_utils::NavigateToURL(&params);
}
histogram_tester_.ExpectBucketCount(
KaleidoscopeTabHelper::
kKaleidoscopeOpenedMediaRecommendationHistogramName,
true, 1);
}
IN_PROC_BROWSER_TEST_F(KaleidoscopeTabHelperBrowserTest,
SessionMetric_OpenedRecommendation_Watch) {
const GURL kTestPageUrl = embedded_test_server()->GetURL(kTestPagePath);
{
// Navigate to Kaleidoscope.
NavigateParams params(browser(), GURL(kKaleidoscopeWatchUIURL),
ui::PAGE_TRANSITION_LINK);
ui_test_utils::NavigateToURL(&params);
}
// Simulate a playback.
KaleidoscopeTabHelper::FromWebContents(GetWebContents())->MarkAsSuccessful();
{
// Navigate away from Kaleidoscope.
NavigateParams params(browser(), kTestPageUrl, ui::PAGE_TRANSITION_LINK);
ui_test_utils::NavigateToURL(&params);
}
histogram_tester_.ExpectBucketCount(
KaleidoscopeTabHelper::
kKaleidoscopeOpenedMediaRecommendationHistogramName,
true, 1);
}
IN_PROC_BROWSER_TEST_F(KaleidoscopeTabHelperBrowserTest,
SessionMetric_DidNotOpenRecommendation) {
const GURL kTestPageUrl = embedded_test_server()->GetURL(kTestPagePath);
{
// Navigate to Kaleidoscope.
NavigateParams params(browser(), GURL(kKaleidoscopeUIURL),
ui::PAGE_TRANSITION_LINK);
ui_test_utils::NavigateToURL(&params);
}
{
// Navigate away from Kaleidoscope.
NavigateParams params(browser(), kTestPageUrl, ui::PAGE_TRANSITION_LINK);
ui_test_utils::NavigateToURL(&params);
}
histogram_tester_.ExpectBucketCount(
KaleidoscopeTabHelper::
kKaleidoscopeOpenedMediaRecommendationHistogramName,
false, 1);
}

@ -1,425 +0,0 @@
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/media/kaleidoscope/kaleidoscope_ui.h"
#include "base/command_line.h"
#include "base/containers/flat_map.h"
#include "base/i18n/rtl.h"
#include "base/memory/ref_counted_memory.h"
#include "chrome/browser/buildflags.h"
#include "chrome/browser/media/kaleidoscope/constants.h"
#include "chrome/browser/media/kaleidoscope/grit/kaleidoscope_resources.h"
#include "chrome/browser/media/kaleidoscope/kaleidoscope_data_provider_impl.h"
#include "chrome/browser/media/kaleidoscope/kaleidoscope_identity_manager_impl.h"
#include "chrome/browser/media/kaleidoscope/kaleidoscope_metrics_recorder.h"
#include "chrome/browser/media/kaleidoscope/kaleidoscope_switches.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/common/webui_url_constants.h"
#include "chrome/grit/dev_ui_browser_resources.h"
#include "components/language/core/browser/locale_util.h"
#include "content/public/browser/web_contents.h"
#include "content/public/browser/web_ui.h"
#include "content/public/browser/web_ui_data_source.h"
#include "services/network/public/mojom/content_security_policy.mojom.h"
#include "ui/base/resource/resource_bundle.h"
namespace {
// Wraps the strings in JS so they can be accessed by the code. The strings are
// placed on the window object so they can always be accessed.
const char kStringWrapper[] =
"window.KALEIDOSCOPE_STRINGS_FALLBACK = new Map(Object.entries(%s));"
"window.KALEIDOSCOPE_STRINGS = new Map(Object.entries(%s));";
bool OnShouldHandleRequest(const std::string& path) {
return base::EqualsCaseInsensitiveASCII(path,
"resources/_locales/strings.js");
}
#if BUILDFLAG(ENABLE_KALEIDOSCOPE)
int GetResourceForLocale(const std::string& locale) {
static const base::NoDestructor<base::flat_map<base::StringPiece, int>>
kLocaleMap({
{"en", IDR_KALEIDOSCOPE_LOCALE_EN},
{"af", IDR_KALEIDOSCOPE_LOCALE_AF},
{"am", IDR_KALEIDOSCOPE_LOCALE_AM},
{"ar-eg", IDR_KALEIDOSCOPE_LOCALE_AR_EG},
{"ar-jo", IDR_KALEIDOSCOPE_LOCALE_AR_JO},
{"ar-ma", IDR_KALEIDOSCOPE_LOCALE_AR_MA},
{"ar-sa", IDR_KALEIDOSCOPE_LOCALE_AR_SA},
{"ar-xb", IDR_KALEIDOSCOPE_LOCALE_AR_XB},
{"ar", IDR_KALEIDOSCOPE_LOCALE_AR},
{"as", IDR_KALEIDOSCOPE_LOCALE_AS},
{"az", IDR_KALEIDOSCOPE_LOCALE_AZ},
{"be", IDR_KALEIDOSCOPE_LOCALE_BE},
{"bg", IDR_KALEIDOSCOPE_LOCALE_BG},
{"bn", IDR_KALEIDOSCOPE_LOCALE_BN},
{"bs", IDR_KALEIDOSCOPE_LOCALE_BS},
{"ca", IDR_KALEIDOSCOPE_LOCALE_CA},
{"cs", IDR_KALEIDOSCOPE_LOCALE_CS},
{"cy", IDR_KALEIDOSCOPE_LOCALE_CY},
{"da", IDR_KALEIDOSCOPE_LOCALE_DA},
{"de-at", IDR_KALEIDOSCOPE_LOCALE_DE_AT},
{"de-ch", IDR_KALEIDOSCOPE_LOCALE_DE_CH},
{"de", IDR_KALEIDOSCOPE_LOCALE_DE},
{"el", IDR_KALEIDOSCOPE_LOCALE_EL},
{"en-au", IDR_KALEIDOSCOPE_LOCALE_EN_AU},
{"en-ca", IDR_KALEIDOSCOPE_LOCALE_EN_CA},
{"en-gb", IDR_KALEIDOSCOPE_LOCALE_EN_GB},
{"en-ie", IDR_KALEIDOSCOPE_LOCALE_EN_IE},
{"en-in", IDR_KALEIDOSCOPE_LOCALE_EN_IN},
{"en-nz", IDR_KALEIDOSCOPE_LOCALE_EN_NZ},
{"en-sg", IDR_KALEIDOSCOPE_LOCALE_EN_SG},
{"en-xa", IDR_KALEIDOSCOPE_LOCALE_EN_XA},
{"en-xc", IDR_KALEIDOSCOPE_LOCALE_EN_XC},
{"en-za", IDR_KALEIDOSCOPE_LOCALE_EN_ZA},
{"es-419", IDR_KALEIDOSCOPE_LOCALE_ES_419},
{"es-ar", IDR_KALEIDOSCOPE_LOCALE_ES_AR},
{"es-bo", IDR_KALEIDOSCOPE_LOCALE_ES_BO},
{"es-cl", IDR_KALEIDOSCOPE_LOCALE_ES_CL},
{"es-co", IDR_KALEIDOSCOPE_LOCALE_ES_CO},
{"es-cr", IDR_KALEIDOSCOPE_LOCALE_ES_CR},
{"es-do", IDR_KALEIDOSCOPE_LOCALE_ES_DO},
{"es-ec", IDR_KALEIDOSCOPE_LOCALE_ES_EC},
{"es-gt", IDR_KALEIDOSCOPE_LOCALE_ES_GT},
{"es-hn", IDR_KALEIDOSCOPE_LOCALE_ES_HN},
{"es-mx", IDR_KALEIDOSCOPE_LOCALE_ES_MX},
{"es-ni", IDR_KALEIDOSCOPE_LOCALE_ES_NI},
{"es-pa", IDR_KALEIDOSCOPE_LOCALE_ES_PA},
{"es-pe", IDR_KALEIDOSCOPE_LOCALE_ES_PE},
{"es-pr", IDR_KALEIDOSCOPE_LOCALE_ES_PR},
{"es-py", IDR_KALEIDOSCOPE_LOCALE_ES_PY},
{"es-sv", IDR_KALEIDOSCOPE_LOCALE_ES_SV},
{"es-us", IDR_KALEIDOSCOPE_LOCALE_ES_US},
{"es-uy", IDR_KALEIDOSCOPE_LOCALE_ES_UY},
{"es-ve", IDR_KALEIDOSCOPE_LOCALE_ES_VE},
{"es", IDR_KALEIDOSCOPE_LOCALE_ES},
{"et", IDR_KALEIDOSCOPE_LOCALE_ET},
{"eu", IDR_KALEIDOSCOPE_LOCALE_EU},
{"fa", IDR_KALEIDOSCOPE_LOCALE_FA},
{"fil", IDR_KALEIDOSCOPE_LOCALE_FIL},
{"fi", IDR_KALEIDOSCOPE_LOCALE_FI},
{"fr-ca", IDR_KALEIDOSCOPE_LOCALE_FR_CA},
{"fr-ch", IDR_KALEIDOSCOPE_LOCALE_FR_CH},
{"fr", IDR_KALEIDOSCOPE_LOCALE_FR},
{"gl", IDR_KALEIDOSCOPE_LOCALE_GL},
{"gsw", IDR_KALEIDOSCOPE_LOCALE_GSW},
{"gu", IDR_KALEIDOSCOPE_LOCALE_GU},
{"he", IDR_KALEIDOSCOPE_LOCALE_HE},
{"hi", IDR_KALEIDOSCOPE_LOCALE_HI},
{"hr", IDR_KALEIDOSCOPE_LOCALE_HR},
{"hu", IDR_KALEIDOSCOPE_LOCALE_HU},
{"hy", IDR_KALEIDOSCOPE_LOCALE_HY},
{"id", IDR_KALEIDOSCOPE_LOCALE_ID},
{"in", IDR_KALEIDOSCOPE_LOCALE_IN},
{"is", IDR_KALEIDOSCOPE_LOCALE_IS},
{"it", IDR_KALEIDOSCOPE_LOCALE_IT},
{"iw", IDR_KALEIDOSCOPE_LOCALE_IW},
{"ja", IDR_KALEIDOSCOPE_LOCALE_JA},
{"ka", IDR_KALEIDOSCOPE_LOCALE_KA},
{"kk", IDR_KALEIDOSCOPE_LOCALE_KK},
{"km", IDR_KALEIDOSCOPE_LOCALE_KM},
{"kn", IDR_KALEIDOSCOPE_LOCALE_KN},
{"ko", IDR_KALEIDOSCOPE_LOCALE_KO},
{"ky", IDR_KALEIDOSCOPE_LOCALE_KY},
{"ln", IDR_KALEIDOSCOPE_LOCALE_LN},
{"lo", IDR_KALEIDOSCOPE_LOCALE_LO},
{"lt", IDR_KALEIDOSCOPE_LOCALE_LT},
{"lv", IDR_KALEIDOSCOPE_LOCALE_LV},
{"mk", IDR_KALEIDOSCOPE_LOCALE_MK},
{"ml", IDR_KALEIDOSCOPE_LOCALE_ML},
{"mn", IDR_KALEIDOSCOPE_LOCALE_MN},
{"mo", IDR_KALEIDOSCOPE_LOCALE_MO},
{"mr", IDR_KALEIDOSCOPE_LOCALE_MR},
{"ms", IDR_KALEIDOSCOPE_LOCALE_MS},
{"my", IDR_KALEIDOSCOPE_LOCALE_MY},
{"nb", IDR_KALEIDOSCOPE_LOCALE_NB},
{"ne", IDR_KALEIDOSCOPE_LOCALE_NE},
{"nl", IDR_KALEIDOSCOPE_LOCALE_NL},
{"no", IDR_KALEIDOSCOPE_LOCALE_NO},
{"or", IDR_KALEIDOSCOPE_LOCALE_OR},
{"pa", IDR_KALEIDOSCOPE_LOCALE_PA},
{"pl", IDR_KALEIDOSCOPE_LOCALE_PL},
{"pt-br", IDR_KALEIDOSCOPE_LOCALE_PT_BR},
{"pt-pt", IDR_KALEIDOSCOPE_LOCALE_PT_PT},
{"pt", IDR_KALEIDOSCOPE_LOCALE_PT},
{"ro", IDR_KALEIDOSCOPE_LOCALE_RO},
{"ru", IDR_KALEIDOSCOPE_LOCALE_RU},
{"si", IDR_KALEIDOSCOPE_LOCALE_SI},
{"sk", IDR_KALEIDOSCOPE_LOCALE_SK},
{"sl", IDR_KALEIDOSCOPE_LOCALE_SL},
{"sq", IDR_KALEIDOSCOPE_LOCALE_SQ},
{"sr-latn", IDR_KALEIDOSCOPE_LOCALE_SR_LATN},
{"sr", IDR_KALEIDOSCOPE_LOCALE_SR},
{"sv", IDR_KALEIDOSCOPE_LOCALE_SV},
{"sw", IDR_KALEIDOSCOPE_LOCALE_SW},
{"ta", IDR_KALEIDOSCOPE_LOCALE_TA},
{"te", IDR_KALEIDOSCOPE_LOCALE_TE},
{"th", IDR_KALEIDOSCOPE_LOCALE_TH},
{"tl", IDR_KALEIDOSCOPE_LOCALE_TL},
{"tr", IDR_KALEIDOSCOPE_LOCALE_TR},
{"uk", IDR_KALEIDOSCOPE_LOCALE_UK},
{"ur", IDR_KALEIDOSCOPE_LOCALE_UR},
{"uz", IDR_KALEIDOSCOPE_LOCALE_UZ},
{"vi", IDR_KALEIDOSCOPE_LOCALE_VI},
{"zh-cn", IDR_KALEIDOSCOPE_LOCALE_ZH_CN},
{"zh-hk", IDR_KALEIDOSCOPE_LOCALE_ZH_HK},
{"zh-tw", IDR_KALEIDOSCOPE_LOCALE_ZH_TW},
{"zh", IDR_KALEIDOSCOPE_LOCALE_ZH},
{"zu", IDR_KALEIDOSCOPE_LOCALE_ZU},
});
auto it = kLocaleMap->find(locale);
if (it == kLocaleMap->end()) {
return IDR_KALEIDOSCOPE_LOCALE_EN;
}
return it->second;
}
#endif // BUILDFLAG(ENABLE_KALEIDOSCOPE)
std::string GetStringsForLocale(const std::string& locale) {
std::string str;
#if BUILDFLAG(ENABLE_KALEIDOSCOPE)
str = ui::ResourceBundle::GetSharedInstance().LoadDataResourceString(
GetResourceForLocale(locale));
#endif
return str;
}
void OnStringsRequest(const std::string& path,
content::WebUIDataSource::GotDataCallback callback) {
DCHECK(OnShouldHandleRequest(path));
auto str_lang = GetStringsForLocale(
base::ToLowerASCII(base::i18n::GetConfiguredLocale()));
auto str_lang_en = GetStringsForLocale("en");
base::RefCountedString* ref_contents = new base::RefCountedString();
ref_contents->data() =
base::StringPrintf(kStringWrapper, str_lang_en.c_str(), str_lang.c_str());
std::move(callback).Run(ref_contents);
}
void ConfigureMainFrameWebUIDataSource(content::WebUIDataSource* html_source) {
// Allows us to put content in an IFrame.
html_source->OverrideContentSecurityPolicy(
network::mojom::CSPDirectiveName::ChildSrc,
"child-src chrome-untrusted://kaleidoscope;");
html_source->DisableTrustedTypesCSP();
// Add a request filter to handle strings.js
html_source->SetRequestFilter(base::BindRepeating(OnShouldHandleRequest),
base::BindRepeating(OnStringsRequest));
// Allow workers from chrome://kaleidoscope (for testing).
html_source->OverrideContentSecurityPolicy(
network::mojom::CSPDirectiveName::WorkerSrc,
"worker-src chrome://kaleidoscope;");
#if BUILDFLAG(ENABLE_KALEIDOSCOPE)
html_source->AddResourcePath("kaleidoscope.js", IDR_KALEIDOSCOPE_JS);
html_source->AddResourcePath("messages.js", IDR_KALEIDOSCOPE_MESSAGES_JS);
html_source->AddResourcePath("content-worker.js",
IDR_KALEIDOSCOPE_CONTENT_WORKER_JS);
html_source->AddResourcePath("geometry.mojom-lite.js",
IDR_GEOMETRY_MOJOM_LITE_JS);
html_source->AddResourcePath("kaleidoscope.mojom-lite.js",
IDR_KALEIDOSCOPE_MOJOM_LITE_JS);
html_source->AddResourcePath(
"chrome/browser/media/feeds/media_feeds_store.mojom-lite.js",
IDR_MEDIA_FEEDS_STORE_MOJOM_LITE_JS);
html_source->AddResourcePath("content.js", IDR_KALEIDOSCOPE_CONTENT_JS);
html_source->AddResourcePath("shared.css", IDR_KALEIDOSCOPE_SHARED_CSS);
// Google Sans.
html_source->AddResourcePath("resources/fonts/fonts.css",
IDR_GOOGLE_SANS_CSS);
html_source->AddResourcePath("resources/fonts/GoogleSans-Bold.woff2",
IDR_GOOGLE_SANS_BOLD);
html_source->AddResourcePath("resources/fonts/GoogleSans-Medium.woff2",
IDR_GOOGLE_SANS_MEDIUM);
html_source->AddResourcePath("resources/fonts/GoogleSans-Regular.woff2",
IDR_GOOGLE_SANS_REGULAR);
html_source->AddResourcePath(
"resources/fonts/GoogleSansDisplay-Regular.woff2",
IDR_GOOGLE_SANS_DISPLAY_REGULAR);
html_source->SetDefaultResource(IDR_KALEIDOSCOPE_HTML);
#endif // BUILDFLAG(ENABLE_KALEIDOSCOPE)
}
content::WebUIDataSource* CreateUntrustedPALChildWebUIDataSource() {
content::WebUIDataSource* untrusted_source =
content::WebUIDataSource::Create(kKaleidoscopeUntrustedPALChildURL);
untrusted_source->DisableDenyXFrameOptions();
// Allow scripts from Google.
untrusted_source->OverrideContentSecurityPolicy(
network::mojom::CSPDirectiveName::ScriptSrc,
"script-src https://imasdk.googleapis.com 'unsafe-inline' 'self';");
untrusted_source->DisableTrustedTypesCSP();
#if BUILDFLAG(ENABLE_KALEIDOSCOPE)
untrusted_source->AddResourcePath("pal-child.html",
IDR_KALEIDOSCOPE_PAL_CHILD_HTML);
untrusted_source->AddResourcePath("pal-child.js",
IDR_KALEIDOSCOPE_PAL_CHILD_JS);
#endif // BUILDFLAG(ENABLE_KALEIDOSCOPE)
return untrusted_source;
}
} // anonymous namespace
// We set |enable_chrome_send| to true since we need it for browser tests.
KaleidoscopeUI::KaleidoscopeUI(content::WebUI* web_ui)
: ui::MojoWebUIController(web_ui, /*enable_chrome_send=*/true) {
web_ui->AddRequestableScheme(content::kChromeUIUntrustedScheme);
auto* browser_context = web_ui->GetWebContents()->GetBrowserContext();
content::WebUIDataSource::Add(browser_context, CreateWebUIDataSource());
content::WebUIDataSource::Add(browser_context, CreateWatchDataSource());
content::WebUIDataSource::Add(browser_context,
CreateUntrustedWebUIDataSource());
content::WebUIDataSource::Add(browser_context,
CreateUntrustedPALChildWebUIDataSource());
}
KaleidoscopeUI::~KaleidoscopeUI() {
if (metrics_recorder_)
metrics_recorder_->OnExitPage();
// Ensure that the provider is deleted before the metrics recorder, since the
// provider has a pointer to the metrics recorder.
provider_.reset();
metrics_recorder_.reset();
identity_manager_.reset();
}
// static
content::WebUIDataSource* KaleidoscopeUI::CreateWebUIDataSource() {
auto* html_source = content::WebUIDataSource::Create(kKaleidoscopeUIHost);
ConfigureMainFrameWebUIDataSource(html_source);
return html_source;
}
// static
content::WebUIDataSource* KaleidoscopeUI::CreateWatchDataSource() {
auto* html_source =
content::WebUIDataSource::Create(kKaleidoscopeUIWatchHost);
ConfigureMainFrameWebUIDataSource(html_source);
return html_source;
}
content::WebUIDataSource* KaleidoscopeUI::CreateUntrustedWebUIDataSource() {
content::WebUIDataSource* untrusted_source =
content::WebUIDataSource::Create(kKaleidoscopeUntrustedContentUIURL);
untrusted_source->DisableDenyXFrameOptions();
untrusted_source->UseStringsJs();
// Add a request filter to handle strings.js
untrusted_source->SetRequestFilter(base::BindRepeating(OnShouldHandleRequest),
base::BindRepeating(OnStringsRequest));
const auto backend_url =
GetGoogleAPIBaseURL(*base::CommandLine::ForCurrentProcess());
// Allow scripts and styles from chrome-untrusted://resources.
untrusted_source->OverrideContentSecurityPolicy(
network::mojom::CSPDirectiveName::ScriptSrc,
"script-src chrome-untrusted://resources 'unsafe-inline' 'self';");
untrusted_source->OverrideContentSecurityPolicy(
network::mojom::CSPDirectiveName::StyleSrc,
"style-src chrome-untrusted://resources 'unsafe-inline' 'self';");
untrusted_source->DisableTrustedTypesCSP();
// Allow workers from chrome-untrusted://kaleidoscope.
untrusted_source->OverrideContentSecurityPolicy(
network::mojom::CSPDirectiveName::WorkerSrc,
"worker-src chrome-untrusted://kaleidoscope;");
// Allow images and videos from anywhere.
untrusted_source->OverrideContentSecurityPolicy(
network::mojom::CSPDirectiveName::ImgSrc, "img-src * data:;");
untrusted_source->OverrideContentSecurityPolicy(
network::mojom::CSPDirectiveName::MediaSrc, "media-src * data: blob:;");
// Allow access to anywhere using fetch.
untrusted_source->OverrideContentSecurityPolicy(
network::mojom::CSPDirectiveName::ConnectSrc, "connect-src *;");
// Allow YouTube videos to be embedded.
untrusted_source->OverrideContentSecurityPolicy(
network::mojom::CSPDirectiveName::ChildSrc,
"child-src https://www.youtube.com "
"chrome-untrusted://kaleidoscope-pal-generator;");
// Add the URL to the backend.
untrusted_source->AddString("googleApiUrl", backend_url.spec());
#if BUILDFLAG(ENABLE_KALEIDOSCOPE)
untrusted_source->AddResourcePath("content.css",
IDR_KALEIDOSCOPE_CONTENT_CSS);
untrusted_source->AddResourcePath("shared.css", IDR_KALEIDOSCOPE_SHARED_CSS);
untrusted_source->AddResourcePath("content.js", IDR_KALEIDOSCOPE_CONTENT_JS);
untrusted_source->AddResourcePath("content-worker.js",
IDR_KALEIDOSCOPE_CONTENT_WORKER_JS);
untrusted_source->AddResourcePath("icons.js", IDR_KALEIDOSCOPE_ICONS_JS);
untrusted_source->AddResourcePath("messages.js",
IDR_KALEIDOSCOPE_MESSAGES_JS);
untrusted_source->AddResourcePath("toolbar.js", IDR_KALEIDOSCOPE_TOOLBAR_JS);
untrusted_source->AddResourcePath("side_nav_container.js",
IDR_KALEIDOSCOPE_SIDE_NAV_CONTAINER_JS);
untrusted_source->AddResourcePath("shaka-player.ui.js",
IDR_KALEIDOSCOPE_SHAKA_PLAYER_JS);
untrusted_source->AddResourcePath("geometry.mojom-lite.js",
IDR_GEOMETRY_MOJOM_LITE_JS);
untrusted_source->AddResourcePath("kaleidoscope.mojom-lite.js",
IDR_KALEIDOSCOPE_MOJOM_LITE_JS);
untrusted_source->AddResourcePath(
"chrome/browser/media/feeds/media_feeds_store.mojom-lite.js",
IDR_MEDIA_FEEDS_STORE_MOJOM_LITE_JS);
// Google Sans.
untrusted_source->AddResourcePath("resources/fonts/fonts.css",
IDR_GOOGLE_SANS_CSS);
untrusted_source->AddResourcePath("resources/fonts/GoogleSans-Bold.woff2",
IDR_GOOGLE_SANS_BOLD);
untrusted_source->AddResourcePath("resources/fonts/GoogleSans-Medium.woff2",
IDR_GOOGLE_SANS_MEDIUM);
untrusted_source->AddResourcePath("resources/fonts/GoogleSans-Regular.woff2",
IDR_GOOGLE_SANS_REGULAR);
untrusted_source->AddResourcePath(
"resources/fonts/GoogleSansDisplay-Regular.woff2",
IDR_GOOGLE_SANS_DISPLAY_REGULAR);
untrusted_source->AddResourcePath("content.html",
IDR_KALEIDOSCOPE_CONTENT_HTML);
#endif // BUILDFLAG(ENABLE_KALEIDOSCOPE)
return untrusted_source;
}
void KaleidoscopeUI::BindInterface(
mojo::PendingReceiver<media::mojom::KaleidoscopeDataProvider> provider) {
metrics_recorder_ = std::make_unique<KaleidoscopeMetricsRecorder>();
provider_ = std::make_unique<KaleidoscopeDataProviderImpl>(
std::move(provider), Profile::FromWebUI(web_ui()),
metrics_recorder_.get());
}
void KaleidoscopeUI::BindInterface(
mojo::PendingReceiver<media::mojom::KaleidoscopeIdentityManager>
identity_manager) {
identity_manager_ = std::make_unique<KaleidoscopeIdentityManagerImpl>(
std::move(identity_manager), web_ui());
}
WEB_UI_CONTROLLER_TYPE_IMPL(KaleidoscopeUI)

@ -1,45 +0,0 @@
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_MEDIA_KALEIDOSCOPE_KALEIDOSCOPE_UI_H_
#define CHROME_BROWSER_MEDIA_KALEIDOSCOPE_KALEIDOSCOPE_UI_H_
#include "chrome/browser/media/kaleidoscope/mojom/kaleidoscope.mojom.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "ui/webui/mojo_web_ui_controller.h"
namespace content {
class WebUIDataSource;
} // namespace content
class KaleidoscopeMetricsRecorder;
class KaleidoscopeUI : public ui::MojoWebUIController {
public:
explicit KaleidoscopeUI(content::WebUI* web_ui);
KaleidoscopeUI(const KaleidoscopeUI&) = delete;
KaleidoscopeUI& operator=(const KaleidoscopeUI&) = delete;
~KaleidoscopeUI() override;
void BindInterface(
mojo::PendingReceiver<media::mojom::KaleidoscopeDataProvider> provider);
void BindInterface(
mojo::PendingReceiver<media::mojom::KaleidoscopeIdentityManager>
identity_manager);
static content::WebUIDataSource* CreateWebUIDataSource();
static content::WebUIDataSource* CreateWatchDataSource();
static content::WebUIDataSource* CreateUntrustedWebUIDataSource();
private:
std::unique_ptr<KaleidoscopeMetricsRecorder> metrics_recorder_;
std::unique_ptr<media::mojom::KaleidoscopeDataProvider> provider_;
std::unique_ptr<media::mojom::KaleidoscopeIdentityManager> identity_manager_;
WEB_UI_CONTROLLER_TYPE_DECL();
};
#endif // CHROME_BROWSER_MEDIA_KALEIDOSCOPE_KALEIDOSCOPE_UI_H_

@ -1,14 +0,0 @@
# Copyright 2019 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import("//mojo/public/tools/bindings/mojom.gni")
mojom("mojom") {
sources = [ "kaleidoscope.mojom" ]
public_deps = [
"//chrome/browser/media/feeds:mojo_bindings",
"//url/mojom:url_mojom_origin",
]
}

@ -1,2 +0,0 @@
per-file *.mojom=set noparent
per-file *.mojom=file://ipc/SECURITY_OWNERS

@ -1,192 +0,0 @@
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
module media.mojom;
import "chrome/browser/media/feeds/media_feeds_store.mojom";
import "mojo/public/mojom/base/time.mojom";
import "url/mojom/origin.mojom";
// The result of getting the credentials.
enum CredentialsResult {
kSuccess,
kFailedIncognito,
kFailedChild,
kDisabledByPolicy,
};
// The credentials required to make Google API calls from JS.
struct Credentials {
// Chrome's API Key.
string api_key;
// An OAuth access token scoped to the Kaleidoscope API for the currently
// logged in user. If the user is not signed in then this will be empty.
string? access_token;
// The time these credentials will expire.
mojo_base.mojom.Time? expiry_time;
};
enum KaleidoscopeTab {
// The content will include content of all different types.
kForYou,
// The content will contain only TV shows.
kTVShows,
// The content will contain only Movies.
kMovies,
};
enum KaleidoscopeFirstRunExperienceStep {
kCompleted,
kProviderSelection,
kMediaFeedsConsent,
kWelcome,
};
// Provides data for the kaleidoscope page.
interface KaleidoscopeDataProvider {
// Returns all the Media Feeds that Kaleidoscope might decide to show.
// Returned feeds will be appropriate for the |tab|.
GetTopMediaFeeds(KaleidoscopeTab tab) => (array<media_feeds.mojom.MediaFeed> feeds);
// Returns all the items from a Media Feed that Kaleidoscope might decide to
// show. Returned items will be appropriate for the |tab|.
GetMediaFeedContents(int64 feed_id, KaleidoscopeTab tab) => (array<media_feeds.mojom.MediaFeedItem> items);
// Returns all the items from the Media Feeds Store that can be displayed for
// continue watching. Returned items will be appropriate for the |tab|.
GetContinueWatchingMediaFeedItems(KaleidoscopeTab tab) => (array<media_feeds.mojom.MediaFeedItem> items);
// Returns true if the first run experience should be shown.
GetShouldShowFirstRunExperience() => (bool should_show_first_run);
// While the user is on the First Run Experience, this will be called each
// time they move onto a different step. Used to set prefs and record metrics
// on what step the user stopped at.
SetFirstRunExperienceStep(KaleidoscopeFirstRunExperienceStep step);
// Returns all the Media Feeds so the user can choose which ones they want to enable/disable.
GetAllMediaFeeds() => (array<media_feeds.mojom.MediaFeed> feeds);
// Called when the user completes the consent screen for Media Feeds.
SetMediaFeedsConsent(bool accepted_media_feeds,
bool accepted_auto_select_media_feeds,
array<int64> enabled_feed_ids,
array<int64> disabled_feed_ids);
// Returns true if the user has consented to auto-select media feeds to
// display.
GetAutoSelectMediaFeedsConsent() => (bool consent);
// Returns all the watch time origins from media history store that have
// watch time above a threshold.
GetHighWatchTimeOrigins() => (array<url.mojom.Origin> origins);
// Called when the user clicks the "Send Feedback" button in Kaleidoscope.
// Will trigger a feedback dialog to be displayed.
SendFeedback();
// Gets a list of stored providers that will be used to filter the
// recommendations on the server if the user is signed out. They are arbitary
// strings that are provided by the server, stored locally and then retrieved
// when Kaleidoscope is loaded.
GetSignedOutProviders() => (array<string> providers);
// Stores a list of providers that were chosen by the user. Only used if the
// user is signed out.
SetSignedOutProviders(array<string> providers);
// Records a histogram of the time taken to start a watch action.
RecordTimeTakenToStartWatchHistogram(mojo_base.mojom.TimeDelta time);
// Records a histogram when the dialog was closed of whether the user selected
// a link from the dialog.
RecordDialogClosedHistogram(bool value);
// Returns Media Feeds that are "new" and should be displayed to the user so
// that they know this Media Feed is now being fetched.
GetNewMediaFeeds() => (
array<media_feeds.mojom.MediaFeed> feeds,
bool automatic_selection_enabled);
// Update the selection the user made as to whether they want this Media Feed
// displayed in Kaleidoscope.
UpdateFeedUserStatus(int64 feed_id, media_feeds.mojom.FeedUserStatus status);
};
// Provides data for the Kaleidoscope NTP module.
interface KaleidoscopeNTPDataProvider {
// Returns all the Media Feeds that Kaleidoscope might decide to show.
// Returned feeds will be appropriate for the |tab|.
GetTopMediaFeeds(KaleidoscopeTab tab) => (array<media_feeds.mojom.MediaFeed> feeds);
// Returns all the items from the Media Feeds Store that can be displayed for
// continue watching. Returned items will be appropriate for the |tab|.
GetContinueWatchingMediaFeedItems(KaleidoscopeTab tab) => (array<media_feeds.mojom.MediaFeedItem> items);
// Gets the collections from the backend to be displayed. Takes a credential
// instance and a string that contains the request to be sent to the server.
// The request is the GetCollectionsRequest proto here: go/ks-media-proto.
GetCollections(Credentials credentials, string request)
=> (GetCollectionsResponse response);
// Gets a list of stored providers that will be used to filter the
// recommendations on the server if the user is signed out. They are arbitary
// strings that are provided by the server, stored locally and then retrieved
// when Kaleidoscope is loaded.
GetSignedOutProviders() => (array<string> providers);
};
// Handles identity related tasks.
interface KaleidoscopeIdentityManager {
// Retrieves the current credentials.
GetCredentials() => (Credentials? credentials, CredentialsResult result);
// Will trigger a browser signin.
// The caller has to use KaleidoscopeIdentityObserver in order to be notified
// if the user signs in. This method doesn't notify the caller directly given
// that the user may take no action.
SignIn();
// Add an observer to be notified when the user signs in or out of Chrome.
AddObserver(pending_remote<KaleidoscopeIdentityObserver> observer);
};
// Interface to be implemented by clients of KaleidoscopeIdentityManager that
// want to be notified when a sign in or sign out occurs. This must be used in
// order to be notified if a call to SignIn() ultimately leads to the user
// signing in.
interface KaleidoscopeIdentityObserver {
// Called when the user signs in.
OnSignedIn();
// Called when the user signs out.
OnSignedOut();
};
enum GetCollectionsResult {
// The request was successful.
kSuccess,
// The request failed.
kFailed,
// Kaleidoscope is not available to the user.
kNotAvailable,
// The user needs to complete the first run experience.
kFirstRun,
};
struct GetCollectionsResponse {
// Contains the response from the server. The response is the
// GetCollectionsResponse proto here: go/ks-media-proto.
string response;
// Contains the result of wether the request was successful or not.
GetCollectionsResult result;
};

@ -1,18 +0,0 @@
# Copyright 2020 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import("//third_party/closure_compiler/compile_js.gni")
import("//third_party/protobuf/proto_library.gni")
proto_library("proto") {
sources = [ "test.proto" ]
generate_javascript = true
}
js_library("test") {
sources = []
deps = [ ":proto_js" ]
}

@ -1,5 +0,0 @@
syntax = "proto3";
message Test {
string id = 1;
}

@ -106,7 +106,6 @@
#include "chrome/browser/enterprise/connectors/connectors_prefs.h"
#include "chrome/browser/enterprise/connectors/enterprise_connectors_policy_handler.h"
#include "chrome/browser/enterprise/reporting/extension_request/extension_request_policy_handler.h"
#include "chrome/browser/media/kaleidoscope/kaleidoscope_prefs.h"
#include "chrome/browser/media/router/media_router_feature.h"
#include "chrome/browser/policy/local_sync_policy_handler.h"
#endif // defined(OS_ANDROID)
@ -665,9 +664,6 @@ const PolicyToPreferenceMapEntry kSimplePolicyMap[] = {
{ key::kWebRtcAllowLegacyTLSProtocols,
prefs::kWebRTCAllowLegacyTLSProtocols,
base::Value::Type::BOOLEAN },
{ key::kMediaRecommendationsEnabled,
kaleidoscope::prefs::kKaleidoscopePolicyEnabled,
base::Value::Type::BOOLEAN },
{ key::kNTPCardsVisible,
prefs::kNtpModulesVisible,
base::Value::Type::BOOLEAN },

@ -406,7 +406,6 @@
#if !defined(OS_ANDROID)
#include "chrome/browser/media/feeds/media_feeds_service.h"
#include "chrome/browser/media/kaleidoscope/kaleidoscope_prefs.h"
#endif
namespace {
@ -1102,7 +1101,6 @@ void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry,
#if !defined(OS_ANDROID)
media_feeds::MediaFeedsService::RegisterProfilePrefs(registry);
kaleidoscope::prefs::RegisterProfilePrefs(registry);
#endif
RegisterProfilePrefsForMigration(registry);

@ -140,9 +140,6 @@ if (enable_js_type_check) {
if (enable_webui_tab_strip) {
deps += [ "tab_strip:closure_compile" ]
}
if (enable_kaleidoscope) {
deps += [ "kaleidoscope:closure_compile" ]
}
if (is_android) {
deps += [
"explore_sites_internals:closure_compile",

@ -1530,7 +1530,6 @@ static_library("ui") {
"//chrome/browser:theme_properties",
"//chrome/browser/browsing_data:constants",
"//chrome/browser/cart:mojo_bindings",
"//chrome/browser/media/kaleidoscope/mojom",
"//chrome/browser/media/router",
"//chrome/browser/profile_resetter:profile_reset_report_proto",
"//chrome/browser/promo_browser_command:mojo_bindings",

@ -1698,7 +1698,6 @@ IN_PROC_BROWSER_TEST_F(BrowserTest, DisableMenuItemsWhenIncognitoIsForced) {
EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_IMPORT_SETTINGS));
EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_MANAGE_EXTENSIONS));
EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_OPTIONS));
EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_SHOW_KALEIDOSCOPE));
// Set Incognito to FORCED.
IncognitoModePrefs::SetAvailability(browser()->profile()->GetPrefs(),
@ -1709,7 +1708,6 @@ IN_PROC_BROWSER_TEST_F(BrowserTest, DisableMenuItemsWhenIncognitoIsForced) {
EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_IMPORT_SETTINGS));
EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_MANAGE_EXTENSIONS));
EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_OPTIONS));
EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_SHOW_KALEIDOSCOPE));
// New Incognito Window command, however, should be enabled.
EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_NEW_INCOGNITO_WINDOW));
@ -1724,7 +1722,6 @@ IN_PROC_BROWSER_TEST_F(BrowserTest, DisableMenuItemsWhenIncognitoIsForced) {
EXPECT_FALSE(new_command_updater->IsCommandEnabled(IDC_IMPORT_SETTINGS));
EXPECT_FALSE(new_command_updater->IsCommandEnabled(IDC_MANAGE_EXTENSIONS));
EXPECT_FALSE(new_command_updater->IsCommandEnabled(IDC_OPTIONS));
EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_SHOW_KALEIDOSCOPE));
EXPECT_TRUE(new_command_updater->IsCommandEnabled(IDC_NEW_INCOGNITO_WINDOW));
}

@ -830,9 +830,6 @@ bool BrowserCommandController::ExecuteCommandWithDisposition(
}
break;
}
case IDC_SHOW_KALEIDOSCOPE:
ShowKaleidoscope(browser_);
break;
default:
LOG(WARNING) << "Received Unimplemented Command: " << id;
break;
@ -1047,10 +1044,6 @@ void BrowserCommandController::InitCommandState() {
IDC_CLEAR_BROWSING_DATA,
(!profile()->IsGuestSession() && !profile()->IsSystemProfile() &&
!profile()->IsIncognitoProfile()));
command_updater_.UpdateCommandEnabled(
IDC_SHOW_KALEIDOSCOPE,
(!profile()->IsGuestSession() && !profile()->IsSystemProfile() &&
!profile()->IsEphemeralGuestProfile()));
#if BUILDFLAG(IS_CHROMEOS_ASH)
command_updater_.UpdateCommandEnabled(IDC_TAKE_SCREENSHOT, true);
// Chrome OS uses the system tray menu to handle multi-profiles. Avatar menu
@ -1176,8 +1169,6 @@ void BrowserCommandController::UpdateSharedCommandsForIncognitoAvailability(
!forced_incognito || is_guest);
command_updater->UpdateCommandEnabled(IDC_SHOW_SIGNIN,
!forced_incognito && !is_guest);
command_updater->UpdateCommandEnabled(IDC_SHOW_KALEIDOSCOPE,
!forced_incognito && !is_guest);
}
void BrowserCommandController::UpdateCommandsForIncognitoAvailability() {

@ -26,7 +26,6 @@
#include "chrome/browser/bookmarks/bookmark_model_factory.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/download/download_shelf.h"
#include "chrome/browser/media/kaleidoscope/constants.h"
#include "chrome/browser/policy/profile_policy_connector.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/profiles/profile_manager.h"
@ -421,12 +420,6 @@ void ShowSearchEngineSettings(Browser* browser) {
ShowSettingsSubPage(browser, kSearchEnginesSubPage);
}
void ShowKaleidoscope(Browser* browser) {
base::RecordAction(UserMetricsAction("ShowKaleidoscope"));
ShowSingletonTabIgnorePathOverwriteNTP(browser,
GURL(kKaleidoscopeWatchUIURL));
}
#if BUILDFLAG(IS_CHROMEOS_ASH)
void ShowEnterpriseManagementPageInTabbedBrowser(Browser* browser) {
// Management shows in a tab because it has a "back" arrow that takes the

@ -145,7 +145,6 @@ void ShowSafeBrowsingEnhancedProtection(Browser* browser);
void ShowImportDialog(Browser* browser);
void ShowAboutChrome(Browser* browser);
void ShowSearchEngineSettings(Browser* browser);
void ShowKaleidoscope(Browser* browser);
#if BUILDFLAG(IS_CHROMEOS_ASH)
// Shows the enterprise management info page in a browser tab.

@ -159,7 +159,6 @@
#if !defined(OS_ANDROID)
#include "chrome/browser/media/feeds/media_feeds_contents_observer.h"
#include "chrome/browser/media/feeds/media_feeds_service.h"
#include "chrome/browser/media/kaleidoscope/kaleidoscope_tab_helper.h"
#endif
#if BUILDFLAG(ENABLE_CAPTIVE_PORTAL_DETECTION)
@ -452,11 +451,6 @@ void TabHelpers::AttachTabHelpers(WebContents* web_contents) {
web_app::WebAppMetrics::Get(profile);
#endif
#if !defined(OS_ANDROID)
if (base::FeatureList::IsEnabled(media::kKaleidoscope))
KaleidoscopeTabHelper::CreateForWebContents(web_contents);
#endif // !defined(OS_ANDROID)
#if BUILDFLAG(ENABLE_OFFLINE_PAGES)
offline_pages::OfflinePageTabHelper::CreateForWebContents(web_contents);
offline_pages::RecentTabHelper::CreateForWebContents(web_contents);

@ -129,8 +129,6 @@
#include "components/feed/feed_feature_list.h"
#else // defined(OS_ANDROID)
#include "chrome/browser/media/feeds/media_feeds_service.h"
#include "chrome/browser/media/kaleidoscope/constants.h"
#include "chrome/browser/media/kaleidoscope/kaleidoscope_ui.h"
#include "chrome/browser/media/router/media_router_feature.h"
#include "chrome/browser/ui/ui_features.h"
#include "chrome/browser/ui/webui/bookmarks/bookmarks_ui.h"
@ -873,14 +871,6 @@ WebUIFactoryFunction GetWebUIFactoryFunction(WebUI* web_ui,
return &NewWebUI<WelcomeUI>;
#endif
#if !defined(OS_ANDROID)
if (base::FeatureList::IsEnabled(media::kKaleidoscope)) {
if (url.host_piece() == kKaleidoscopeUIHost ||
url.host_piece() == kKaleidoscopeUIWatchHost) {
return &NewWebUI<KaleidoscopeUI>;
}
}
#endif // !defined(OS_ANDROID)
#if BUILDFLAG(ENABLE_NACL)
if (url.host_piece() == chrome::kChromeUINaClHost)
return &NewWebUI<NaClUI>;

@ -131,7 +131,6 @@ template("chrome_extra_paks") {
# New paks should be added here by default.
sources += [
"$root_gen_dir/chrome/bookmarks_resources.pak",
"$root_gen_dir/chrome/browser/media/kaleidoscope/kaleidoscope_resources.pak",
"$root_gen_dir/chrome/commander_resources.pak",
"$root_gen_dir/chrome/component_extension_resources.pak",
"$root_gen_dir/chrome/dev_ui_resources.pak",
@ -148,7 +147,6 @@ template("chrome_extra_paks") {
"$root_gen_dir/headless/headless_lib_resources.pak",
]
deps += [
"//chrome/browser/media/kaleidoscope:kaleidoscope_resources",
"//chrome/browser/resources:component_extension_resources",
"//chrome/browser/resources:dev_ui_paks",
"//chrome/browser/resources:local_ntp_resources",

@ -3087,6 +3087,9 @@ const char kMediaFeedsBackgroundFetching[] =
// This pref enables checking of Media Feed items against the Safe Search API.
const char kMediaFeedsSafeSearchEnabled[] = "media_feeds_safe_search_enabled";
// This pref enables automated selection of Media Feeds to fetch.
const char kMediaFeedsAutoSelectEnabled[] = "media_feeds_auto_select_enabled";
// This pref reenables AppCache temporarily during its deprecation process.
// In particular, this sets the AppcacheRequireOriginTrial feature to false.
// TODO(enne): Remove this once AppCache has been removed.

@ -1078,6 +1078,7 @@ extern const char kCertificateProvisioningStateForDevice[];
extern const char kMediaFeedsBackgroundFetching[];
extern const char kMediaFeedsSafeSearchEnabled[];
extern const char kMediaFeedsAutoSelectEnabled[];
extern const char kAppCacheForceEnabled[];

@ -1085,7 +1085,6 @@ if (!is_android) {
"../browser/media/encrypted_media_supported_types_browsertest.cc",
"../browser/media/feeds/media_feeds_browsertest.cc",
"../browser/media/history/media_history_browsertest.cc",
"../browser/media/kaleidoscope/kaleidoscope_tab_helper_browsertest.cc",
"../browser/media/media_browsertest.cc",
"../browser/media/media_browsertest.h",
"../browser/media/media_engagement_autoplay_browsertest.cc",
@ -2937,9 +2936,6 @@ if (!is_android) {
]
}
}
if (enable_kaleidoscope) {
deps += [ "../browser/media/kaleidoscope/internal:browser_tests" ]
}
if (safe_browsing_mode == 1) {
sources += [
"../browser/safe_browsing/ad_redirect_trigger_browsertest.cc",
@ -4061,9 +4057,6 @@ test("unit_tests") {
"../browser/media/feeds/media_feeds_converter_unittest.cc",
"../browser/media/feeds/media_feeds_fetcher_unittest.cc",
"../browser/media/feeds/media_feeds_service_unittest.cc",
"../browser/media/kaleidoscope/kaleidoscope_metrics_recorder_unittest.cc",
"../browser/media/kaleidoscope/kaleidoscope_service_unittest.cc",
"../browser/media/kaleidoscope/kaleidoscope_switches_unittest.cc",
"../browser/notifications/muted_notification_handler_unittest.cc",
"../browser/notifications/screen_capture_notification_blocker_unittest.cc",
"../browser/password_manager/generated_password_leak_detection_pref_unittest.cc",
@ -4121,7 +4114,6 @@ test("unit_tests") {
configs += [ "//build/config:precompiled_headers" ]
data_deps = [
"//chrome/browser/media/kaleidoscope/test/proto:test",
"//chrome/test/data/media/engagement/preload:generate_preload_list",
"//chrome/test/data/media/engagement/preload:test_data",
"//testing/buildbot/filters:unit_tests_filters",

@ -8253,13 +8253,7 @@
]
},
"MediaRecommendationsEnabled": {
"os": ["win", "linux", "mac", "chromeos"],
"policy_pref_mapping_tests": [
{
"policies": { "MediaRecommendationsEnabled": false },
"prefs": { "kaleidoscope.enabled_by_policy": { } }
}
]
"note": "This policy has been removed since Chrome 89."
},
"EduCoexistenceToSVersion": {
"os": ["chromeos"],

@ -57,7 +57,6 @@ TEST_F('MediaHistoryStatsWebUIBrowserTest', 'MAYBE_All', function() {
assertDeepEquals(
[
['kaleidoscopeData', '0'],
['mediaFeed', '0'],
['mediaFeedItem', '0'],
['mediaImage', '0'],

@ -165,7 +165,6 @@ Refer to README.md for content description and update process.
<item id="intranet_redirect_detector" added_in_milestone="62" hash_code="21785164" type="0" content_hash_code="62025595" os_list="linux,windows" file_path="chrome/browser/intranet_redirect_detector.cc"/>
<item id="invalidation_service" added_in_milestone="62" hash_code="72354423" type="0" deprecated="2020-01-23" content_hash_code="78425687" file_path=""/>
<item id="javascript_report_error" added_in_milestone="87" hash_code="109607776" type="0" content_hash_code="7229012" os_list="linux" file_path="chrome/browser/error_reporting/chrome_js_error_report_processor.cc"/>
<item id="kaleidoscope_service" added_in_milestone="87" hash_code="49759694" type="0" content_hash_code="14307563" os_list="linux,windows" file_path="chrome/browser/media/kaleidoscope/kaleidoscope_service.cc"/>
<item id="kids_chrome_management_client_classify_url" added_in_milestone="77" hash_code="109987793" type="0" deprecated="2019-07-30" content_hash_code="112740597" file_path=""/>
<item id="lib_address_input" added_in_milestone="62" hash_code="50816767" type="0" content_hash_code="57977576" os_list="linux,windows" file_path="third_party/libaddressinput/chromium/chrome_metadata_source.cc"/>
<item id="litepages_robots_rules" added_in_milestone="89" hash_code="50910588" type="0" content_hash_code="72567080" os_list="linux,windows" file_path="chrome/browser/subresource_redirect/origin_robots_rules.cc"/>