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
|
// Copyright 2017 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/download/internal/background_service/navigation_monitor_impl.h"
#include "base/functional/bind.h"
#include "base/functional/callback_helpers.h"
#include "base/task/single_thread_task_runner.h"
namespace download {
NavigationMonitorImpl::NavigationMonitorImpl()
: observer_(nullptr), current_navigation_count_(0) {}
NavigationMonitorImpl::~NavigationMonitorImpl() = default;
void NavigationMonitorImpl::Configure(
base::TimeDelta navigation_completion_delay,
base::TimeDelta navigation_timeout_delay) {
navigation_completion_delay_ = navigation_completion_delay;
navigation_timeout_delay_ = navigation_timeout_delay;
}
bool NavigationMonitorImpl::IsNavigationInProgress() const {
return current_navigation_count_ > 0;
}
void NavigationMonitorImpl::SetObserver(NavigationMonitor::Observer* observer) {
observer_ = observer;
if (observer_)
observer_->OnNavigationEvent();
}
void NavigationMonitorImpl::OnNavigationEvent(NavigationEvent event) {
if (event == NavigationEvent::START_NAVIGATION) {
current_navigation_count_++;
if (observer_)
observer_->OnNavigationEvent();
navigation_finished_callback_.Cancel();
ScheduleBackupTask();
} else {
if (current_navigation_count_ == 0) {
// Somehow we didn't record the beginning of the navigation. No need to
// take any action.
backup_navigation_finished_callback_.Cancel();
navigation_finished_callback_.Cancel();
return;
}
current_navigation_count_--;
if (current_navigation_count_ == 0)
NotifyNavigationFinished();
}
}
void NavigationMonitorImpl::NotifyNavigationFinished() {
backup_navigation_finished_callback_.Cancel();
navigation_finished_callback_.Reset(
base::BindOnce(&NavigationMonitorImpl::OnNavigationFinished,
weak_ptr_factory_.GetWeakPtr()));
base::SingleThreadTaskRunner::GetCurrentDefault()->PostDelayedTask(
FROM_HERE, navigation_finished_callback_.callback(),
navigation_completion_delay_);
}
void NavigationMonitorImpl::OnNavigationFinished() {
// Reset the counter to handle timeout.
current_navigation_count_ = 0;
if (observer_)
observer_->OnNavigationEvent();
}
void NavigationMonitorImpl::ScheduleBackupTask() {
backup_navigation_finished_callback_.Reset(
base::BindOnce(&NavigationMonitorImpl::OnNavigationFinished,
weak_ptr_factory_.GetWeakPtr()));
base::SingleThreadTaskRunner::GetCurrentDefault()->PostDelayedTask(
FROM_HERE, backup_navigation_finished_callback_.callback(),
navigation_timeout_delay_);
}
} // namespace download
|