blob: 6a54c26d407457b4c1ab2892112874101d7149a3 [file] [log] [blame]
// Copyright 2016 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 "components/browsing_data_ui/history_notice_utils.h"
#include "base/bind.h"
#include "base/callback.h"
#include "base/message_loop/message_loop.h"
#include "base/strings/stringprintf.h"
#include "components/history/core/browser/web_history_service.h"
#include "components/sync_driver/sync_service.h"
#include "components/version_info/version_info.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,
const base::Callback<void(bool)>& target_callback)
: expected_call_count_(expected_call_count),
target_callback_(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;
target_callback_.Run(final_response_);
base::MessageLoop::current()->DeleteSoon(FROM_HERE, this);
}
private:
int expected_call_count_;
base::Callback<void(bool)> target_callback_;
bool final_response_;
int call_count_;
};
} // namespace
namespace browsing_data_ui {
namespace testing {
bool g_override_other_forms_of_browsing_history_query = false;
} // namespace testing
void ShouldShowNoticeAboutOtherFormsOfBrowsingHistory(
const sync_driver::SyncService* sync_service,
history::WebHistoryService* history_service,
base::Callback<void(bool)> callback) {
if (!sync_service ||
!sync_service->IsSyncActive() ||
!sync_service->GetActiveDataTypes().Has(
syncer::HISTORY_DELETE_DIRECTIVES) ||
sync_service->IsUsingSecondaryPassphrase() ||
!history_service) {
callback.Run(false);
return;
}
history_service->QueryWebAndAppActivity(callback);
}
void ShouldPopupDialogAboutOtherFormsOfBrowsingHistory(
const sync_driver::SyncService* sync_service,
history::WebHistoryService* history_service,
version_info::Channel channel,
base::Callback<void(bool)> callback) {
// If the query for other forms of browsing history is overriden for testing,
// the conditions are identical with
// ShouldShowNoticeAboutOtherFormsOfBrowsingHistory.
if (testing::g_override_other_forms_of_browsing_history_query) {
ShouldShowNoticeAboutOtherFormsOfBrowsingHistory(
sync_service, history_service, callback);
return;
}
if (!sync_service ||
!sync_service->IsSyncActive() ||
!sync_service->GetActiveDataTypes().Has(
syncer::HISTORY_DELETE_DIRECTIVES) ||
sync_service->IsUsingSecondaryPassphrase() ||
!history_service) {
callback.Run(false);
return;
}
// Return the boolean product of QueryWebAndAppActivity and
// QueryOtherFormsOfBrowsingHistory. MergeBooleanCallbacks deletes itself
// after processing both callbacks.
MergeBooleanCallbacks* merger = new MergeBooleanCallbacks(2, callback);
history_service->QueryWebAndAppActivity(base::Bind(
&MergeBooleanCallbacks::RunCallback, base::Unretained(merger)));
history_service->QueryOtherFormsOfBrowsingHistory(
channel,
base::Bind(
&MergeBooleanCallbacks::RunCallback, base::Unretained(merger)));
}
// TODO(crbug.com/614319): This function is deprecated and should be removed.
void ShouldPopupDialogAboutOtherFormsOfBrowsingHistory(
const sync_driver::SyncService* sync_service,
history::WebHistoryService* history_service,
base::Callback<void(bool)> callback) {
if (!history_service ||
!testing::g_override_other_forms_of_browsing_history_query) {
callback.Run(false);
return;
}
ShouldShowNoticeAboutOtherFormsOfBrowsingHistory(
sync_service, history_service, callback);
}
} // namespace browsing_data_ui