blob: f2ec8330d5f02cb5171f26154ed0ae165a18b07a [file] [log] [blame]
// Copyright 2015 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/android/history_report/data_observer.h"
#include "base/time/time.h"
#include "chrome/browser/android/history_report/delta_file_commons.h"
#include "chrome/browser/android/history_report/delta_file_service.h"
#include "chrome/browser/android/history_report/usage_report_util.h"
#include "chrome/browser/android/history_report/usage_reports_buffer_service.h"
#include "components/bookmarks/browser/bookmark_model.h"
#include "components/history/core/browser/history_service.h"
using bookmarks::BookmarkModel;
using bookmarks::BookmarkNode;
namespace history_report {
DataObserver::DataObserver(
base::RepeatingCallback<void(void)> data_changed_callback,
base::RepeatingCallback<void(void)> data_cleared_callback,
base::RepeatingCallback<void(void)> stop_reporting_callback,
DeltaFileService* delta_file_service,
UsageReportsBufferService* usage_reports_buffer_service,
BookmarkModel* bookmark_model,
history::HistoryService* history_service)
: data_changed_callback_(data_changed_callback),
data_cleared_callback_(data_cleared_callback),
stop_reporting_callback_(stop_reporting_callback),
delta_file_service_(delta_file_service),
usage_reports_buffer_service_(usage_reports_buffer_service) {
scoped_bookmark_model_observer_.Observe(bookmark_model);
scoped_history_service_observer_.Observe(history_service);
}
DataObserver::~DataObserver() = default;
void DataObserver::BookmarkModelLoaded(BookmarkModel* model,
bool ids_reassigned) {}
void DataObserver::BookmarkModelBeingDeleted(BookmarkModel* model) {
DCHECK(scoped_bookmark_model_observer_.IsObservingSource(model));
scoped_bookmark_model_observer_.Reset();
}
void DataObserver::BookmarkNodeMoved(BookmarkModel* model,
const BookmarkNode* old_parent,
size_t old_index,
const BookmarkNode* new_parent,
size_t new_index) {}
void DataObserver::BookmarkNodeAdded(BookmarkModel* model,
const BookmarkNode* parent,
size_t index) {
delta_file_service_->PageAdded(parent->children()[index]->url());
data_changed_callback_.Run();
}
void DataObserver::BookmarkNodeRemoved(BookmarkModel* model,
const BookmarkNode* parent,
size_t old_index,
const BookmarkNode* node,
const std::set<GURL>& removed_urls) {
DeleteBookmarks(removed_urls);
}
void DataObserver::BookmarkAllUserNodesRemoved(
BookmarkModel* model,
const std::set<GURL>& removed_urls) {
DeleteBookmarks(removed_urls);
}
void DataObserver::BookmarkNodeChanged(BookmarkModel* model,
const BookmarkNode* node) {
delta_file_service_->PageAdded(node->url());
data_changed_callback_.Run();
}
void DataObserver::BookmarkNodeFaviconChanged(BookmarkModel* model,
const BookmarkNode* node) {}
void DataObserver::BookmarkNodeChildrenReordered(BookmarkModel* model,
const BookmarkNode* node) {}
void DataObserver::DeleteBookmarks(const std::set<GURL>& removed_urls) {
for (std::set<GURL>::const_iterator it = removed_urls.begin();
it != removed_urls.end();
++it) {
delta_file_service_->PageDeleted(*it);
}
if (!removed_urls.empty())
data_changed_callback_.Run();
}
void DataObserver::OnURLVisited(history::HistoryService* history_service,
ui::PageTransition transition,
const history::URLRow& row,
const history::RedirectList& redirects,
base::Time visit_time) {
if (row.hidden() || ui::PageTransitionIsRedirect(transition))
return;
delta_file_service_->PageAdded(row.url());
// TODO(haaawk): check if this is really a data change not just a
// visit of already seen page.
data_changed_callback_.Run();
std::string id = DeltaFileEntryWithData::UrlToId(row.url().spec());
usage_reports_buffer_service_->AddVisit(
id,
visit_time.ToJavaTime(),
usage_report_util::IsTypedVisit(transition));
// We stop any usage reporting to wait for gmscore to query the provider
// for this url. We do not want to report usage for a URL which might
// not be known to gmscore.
stop_reporting_callback_.Run();
}
void DataObserver::OnURLsModified(history::HistoryService* history_service,
const history::URLRows& changed_urls) {
for (const auto& row : changed_urls) {
if (!row.hidden())
delta_file_service_->PageAdded(row.url());
}
data_changed_callback_.Run();
}
void DataObserver::OnURLsDeleted(history::HistoryService* history_service,
const history::DeletionInfo& deletion_info) {
if (deletion_info.IsAllHistory()) {
delta_file_service_->Clear();
data_cleared_callback_.Run();
} else {
for (const auto& row : deletion_info.deleted_rows()) {
if (!row.hidden())
delta_file_service_->PageDeleted(row.url());
}
data_changed_callback_.Run();
}
}
void DataObserver::HistoryServiceBeingDeleted(
history::HistoryService* history_service) {
scoped_history_service_observer_.Reset();
}
} // namespace history_report