1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152
|
// Copyright 2016 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/browsing_data/core/history_notice_utils.h"
#include "base/functional/bind.h"
#include "base/functional/callback.h"
#include "base/location.h"
#include "base/task/single_thread_task_runner.h"
#include "components/history/core/browser/web_history_service.h"
#include "components/sync/service/sync_service.h"
#include "components/sync/service/sync_user_settings.h"
#include "components/version_info/version_info.h"
#include "net/traffic_annotation/network_traffic_annotation.h"
namespace {
// Merges several asynchronous boolean callbacks into one that returns a boolean
// product of their responses. Deletes itself when done.
class MergeBooleanCallbacks {
public:
// Constructor. Upon receiving |expected_call_count| calls to |RunCallback|,
// |target_callback| will be run with the boolean product of their results.
MergeBooleanCallbacks(int expected_call_count,
base::OnceCallback<void(bool)> target_callback)
: expected_call_count_(expected_call_count),
target_callback_(std::move(target_callback)),
final_response_(true),
call_count_(0) {}
// This method is to be bound to all asynchronous callbacks which we want
// to merge.
void RunCallback(bool response) {
final_response_ &= response;
if (++call_count_ < expected_call_count_)
return;
std::move(target_callback_).Run(final_response_);
base::SingleThreadTaskRunner::GetCurrentDefault()->DeleteSoon(FROM_HERE,
this);
}
private:
int expected_call_count_;
base::OnceCallback<void(bool)> target_callback_;
bool final_response_;
int call_count_;
};
} // namespace
namespace browsing_data {
void ShouldShowNoticeAboutOtherFormsOfBrowsingHistory(
const syncer::SyncService* sync_service,
history::WebHistoryService* history_service,
base::OnceCallback<void(bool)> callback) {
if (!sync_service ||
!sync_service->GetActiveDataTypes().Has(
syncer::HISTORY_DELETE_DIRECTIVES) ||
sync_service->GetUserSettings()->IsUsingExplicitPassphrase() ||
!history_service) {
std::move(callback).Run(false);
return;
}
net::PartialNetworkTrafficAnnotationTag partial_traffic_annotation =
net::DefinePartialNetworkTrafficAnnotation("history_notice_utils_notice",
"web_history_service", R"(
semantics {
description:
"Queries history.google.com to find out if user has the 'Include "
"Chrome browsing history and activity from websites and apps that "
"use Google services' option enabled in the Activity controls of "
"their Google account. This is done for users who sync their "
"browsing history without a custom passphrase in order to show "
"information about history.google.com on the history page and in "
"the Clear Browsing Data dialog."
trigger:
"This request is sent when user opens the history page or the "
"Clear Browsing Data dialog and history sync without a custom "
"passphrase is (re)enabled."
data:
"An OAuth2 token authenticating the user."
}
policy {
chrome_policy {
SyncDisabled {
SyncDisabled: true
}
}
})");
history_service->QueryWebAndAppActivity(std::move(callback),
partial_traffic_annotation);
}
void ShouldPopupDialogAboutOtherFormsOfBrowsingHistory(
const syncer::SyncService* sync_service,
history::WebHistoryService* history_service,
version_info::Channel channel,
base::OnceCallback<void(bool)> callback) {
if (!sync_service ||
!sync_service->GetActiveDataTypes().Has(
syncer::HISTORY_DELETE_DIRECTIVES) ||
sync_service->GetUserSettings()->IsUsingExplicitPassphrase() ||
!history_service) {
std::move(callback).Run(false);
return;
}
// Return the boolean product of QueryWebAndAppActivity and
// QueryOtherFormsOfBrowsingHistory. MergeBooleanCallbacks deletes itself
// after processing both callbacks.
MergeBooleanCallbacks* merger =
new MergeBooleanCallbacks(2, std::move(callback));
net::PartialNetworkTrafficAnnotationTag partial_traffic_annotation =
net::DefinePartialNetworkTrafficAnnotation("history_notice_utils_popup",
"web_history_service", R"(
semantics {
description:
"Determines if the user has other forms of browsing history "
"(than Chrome browsing history) stored in their Google account. "
"This is used to inform the users about the existence of other "
"forms of browsing history when they delete their Chrome "
"browsing history from the Clear Browsing Data dialog."
trigger:
"This request is sent when user opens the Clear Browsing Data "
"dialog and history sync without a custom passphrase is "
"(re)enabled."
data: "An OAuth2 token authenticating the user."
}
policy {
chrome_policy {
SyncDisabled {
SyncDisabled: true
}
}
})");
history_service->QueryWebAndAppActivity(
base::BindOnce(&MergeBooleanCallbacks::RunCallback,
base::Unretained(merger)),
partial_traffic_annotation);
history_service->QueryOtherFormsOfBrowsingHistory(
channel,
base::BindOnce(&MergeBooleanCallbacks::RunCallback,
base::Unretained(merger)),
partial_traffic_annotation);
}
} // namespace browsing_data
|