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
|
// Copyright 2018 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/offline_pages/core/background_snapshot_controller.h"
#include "base/functional/bind.h"
#include "base/location.h"
#include "base/task/single_thread_task_runner.h"
#include "base/time/time.h"
#include "components/offline_pages/core/offline_page_feature.h"
namespace {
// Default delay, in milliseconds, between the main document OnLoad event and
// snapshot.
const int64_t kDelayAfterDocumentOnLoadCompletedMsBackground = 2000;
// Default delay, in milliseconds, between renovations finishing and
// taking a snapshot. Allows for page to update in response to the
// renovations.
const int64_t kDelayAfterRenovationsCompletedMs = 2000;
// Delay for testing to keep polling times reasonable.
const int64_t kDelayForTests = 0;
} // namespace
namespace offline_pages {
BackgroundSnapshotController::BackgroundSnapshotController(
const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
BackgroundSnapshotController::Client* client,
bool renovations_enabled)
: task_runner_(task_runner),
client_(client),
state_(State::READY),
delay_after_document_on_load_completed_ms_(
kDelayAfterDocumentOnLoadCompletedMsBackground),
delay_after_renovations_completed_ms_(kDelayAfterRenovationsCompletedMs) {
DCHECK(!renovations_enabled);
if (offline_pages::ShouldUseTestingSnapshotDelay()) {
delay_after_document_on_load_completed_ms_ = kDelayForTests;
delay_after_renovations_completed_ms_ = kDelayForTests;
}
}
BackgroundSnapshotController::~BackgroundSnapshotController() = default;
void BackgroundSnapshotController::Reset() {
// Cancel potentially delayed tasks that relate to the previous 'session'.
weak_ptr_factory_.InvalidateWeakPtrs();
state_ = State::READY;
}
void BackgroundSnapshotController::Stop() {
state_ = State::STOPPED;
}
void BackgroundSnapshotController::RenovationsCompleted() {
}
void BackgroundSnapshotController::DocumentOnLoadCompletedInPrimaryMainFrame() {
// Post a delayed task to snapshot and then stop this controller.
task_runner_->PostDelayedTask(
FROM_HERE,
base::BindOnce(&BackgroundSnapshotController::MaybeStartSnapshotThenStop,
weak_ptr_factory_.GetWeakPtr()),
base::Milliseconds(delay_after_document_on_load_completed_ms_));
}
void BackgroundSnapshotController::MaybeStartSnapshot() {
if (state_ != State::READY) {
return;
}
state_ = State::SNAPSHOT_PENDING;
client_->StartSnapshot();
}
void BackgroundSnapshotController::MaybeStartSnapshotThenStop() {
MaybeStartSnapshot();
Stop();
}
int64_t
BackgroundSnapshotController::GetDelayAfterDocumentOnLoadCompletedForTest() {
return delay_after_document_on_load_completed_ms_;
}
int64_t
BackgroundSnapshotController::GetDelayAfterRenovationsCompletedForTest() {
return delay_after_renovations_completed_ms_;
}
} // namespace offline_pages
|