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:

committed by
Chromium LUCI CQ

parent
587c3e2042
commit
3e5b1be4a2
BUILD.gn
chrome
browser
BUILD.gn
chrome_paks.gnibrowsing_data
buildflags.gnichrome_browser_interface_binders.ccmedia
feeds
history
media_history_kaleidoscope_data_table.ccmedia_history_kaleidoscope_data_table.hmedia_history_keyed_service.ccmedia_history_keyed_service.hmedia_history_store.ccmedia_history_store.hmedia_history_store_unittest.cc
kaleidoscope
BUILD.gnDIR_METADATAOWNERSconstants.ccconstants.hkaleidoscope_data_provider_impl.cckaleidoscope_data_provider_impl.hkaleidoscope_identity_manager_impl.cckaleidoscope_identity_manager_impl.hkaleidoscope_internal_resources.grdkaleidoscope_metrics_recorder.cckaleidoscope_metrics_recorder.hkaleidoscope_metrics_recorder_unittest.cckaleidoscope_prefs.cckaleidoscope_prefs.hkaleidoscope_resources.grdkaleidoscope_service.cckaleidoscope_service.hkaleidoscope_service_factory.cckaleidoscope_service_factory.hkaleidoscope_service_unittest.cckaleidoscope_switches.cckaleidoscope_switches.hkaleidoscope_switches_unittest.cckaleidoscope_tab_helper.cckaleidoscope_tab_helper.hkaleidoscope_tab_helper_browsertest.cckaleidoscope_ui.cckaleidoscope_ui.h
mojom
test
proto
policy
prefs
resources
ui
common
test
tools/traffic_annotation/summary
4
BUILD.gn
4
BUILD.gn
@ -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(¶ms);
|
||||
|
||||
// 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(¶ms);
|
||||
|
||||
// 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(¶ms);
|
||||
}
|
||||
|
||||
// Simulate a playback.
|
||||
KaleidoscopeTabHelper::FromWebContents(GetWebContents())->MarkAsSuccessful();
|
||||
|
||||
{
|
||||
// Navigate away from Kaleidoscope.
|
||||
NavigateParams params(browser(), kTestPageUrl, ui::PAGE_TRANSITION_LINK);
|
||||
ui_test_utils::NavigateToURL(¶ms);
|
||||
}
|
||||
|
||||
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(¶ms);
|
||||
}
|
||||
|
||||
// Simulate a playback.
|
||||
KaleidoscopeTabHelper::FromWebContents(GetWebContents())->MarkAsSuccessful();
|
||||
|
||||
{
|
||||
// Navigate away from Kaleidoscope.
|
||||
NavigateParams params(browser(), kTestPageUrl, ui::PAGE_TRANSITION_LINK);
|
||||
ui_test_utils::NavigateToURL(¶ms);
|
||||
}
|
||||
|
||||
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(¶ms);
|
||||
}
|
||||
|
||||
{
|
||||
// Navigate away from Kaleidoscope.
|
||||
NavigateParams params(browser(), kTestPageUrl, ui::PAGE_TRANSITION_LINK);
|
||||
ui_test_utils::NavigateToURL(¶ms);
|
||||
}
|
||||
|
||||
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"/>
|
||||
|
Reference in New Issue
Block a user