| Index: components/offline_pages/snapshot_controller.cc
|
| diff --git a/components/offline_pages/snapshot_controller.cc b/components/offline_pages/snapshot_controller.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..b086e486c34a505e5adbfb7711486d462f9ea652
|
| --- /dev/null
|
| +++ b/components/offline_pages/snapshot_controller.cc
|
| @@ -0,0 +1,79 @@
|
| +// 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/offline_pages/snapshot_controller.h"
|
| +
|
| +#include "base/bind.h"
|
| +#include "base/location.h"
|
| +#include "base/logging.h"
|
| +#include "base/time/time.h"
|
| +
|
| +namespace {
|
| +// Delay, in milliseconds, between the main document parsed event and snapshot.
|
| +// Note if the "load" event fires before this delay is up, then the snapshot
|
| +// is taken immediately.
|
| +const size_t kDelayAfterDocumentAvailable = 7000;
|
| +
|
| +} // namespace
|
| +
|
| +namespace offline_pages {
|
| +
|
| +SnapshotController::SnapshotController(
|
| + const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
|
| + SnapshotController::Client* client)
|
| + : task_runner_(task_runner),
|
| + client_(client),
|
| + state_(State::kReady),
|
| + weak_ptr_factory_(this) {
|
| +}
|
| +
|
| +SnapshotController::~SnapshotController() {}
|
| +
|
| +void SnapshotController::Reset() {
|
| + state_ = State::kReady;
|
| +}
|
| +
|
| +void SnapshotController::Stop() {
|
| + state_ = State::kStopped;
|
| +}
|
| +
|
| +void SnapshotController::PendingSnapshotCompleted() {
|
| + // Unless the controller is "stopped", enable the subsequent snapshots.
|
| + // Stopped state prevents any further snapshots form being started.
|
| + if (state_ == State::kStopped)
|
| + return;
|
| + DCHECK(state_ == State::kSnapshotPending);
|
| + state_ = State::kReady;
|
| +}
|
| +
|
| +void SnapshotController::DocumentAvailableInMainFrame() {
|
| + // Post a delayed task. The snapshot will happen either when the delay
|
| + // is up, or if the "load" event is dispatched in the main frame.
|
| + task_runner_->PostDelayedTask(
|
| + FROM_HERE,
|
| + base::Bind(&SnapshotController::MaybeStartSnapshot,
|
| + weak_ptr_factory_.GetWeakPtr()),
|
| + base::TimeDelta::FromMilliseconds(kDelayAfterDocumentAvailable));
|
| +}
|
| +
|
| +void SnapshotController::DocumentOnLoadCompletedInMainFrame() {
|
| + MaybeStartSnapshot();
|
| + // No more snapshots after onLoad (there still can be other events
|
| + // or delayed tasks that can try to start another snapshot)
|
| + Stop();
|
| +}
|
| +
|
| +void SnapshotController::MaybeStartSnapshot() {
|
| + if (state_ != State::kReady)
|
| + return;
|
| + if (client_->StartSnapshot())
|
| + state_ = State::kSnapshotPending;
|
| +}
|
| +
|
| +size_t SnapshotController::GetDelayAfterDocumentAvailableForTest() {
|
| + return kDelayAfterDocumentAvailable;
|
| +}
|
| +
|
| +
|
| +} // namespace offline_pages
|
|
|