snapshot_controller.cc 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. // Copyright 2016 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "components/offline_pages/core/snapshot_controller.h"
  5. #include "base/bind.h"
  6. #include "base/check_op.h"
  7. #include "base/location.h"
  8. #include "base/time/time.h"
  9. #include "components/offline_pages/core/offline_page_feature.h"
  10. namespace {
  11. // Default delay, in milliseconds, between the main document parsed event and
  12. // snapshot. Note: this snapshot might not occur if the OnLoad event and
  13. // OnLoad delay elapses first to trigger a final snapshot.
  14. const int64_t kDefaultDelayAfterDocumentAvailableMs = 7000;
  15. // Default delay, in milliseconds, between the main document OnLoad event and
  16. // snapshot.
  17. const int64_t kDelayAfterDocumentOnLoadCompletedMsForeground = 1000;
  18. // Delay for testing to keep polling times reasonable.
  19. const int64_t kDelayForTests = 0;
  20. } // namespace
  21. namespace offline_pages {
  22. SnapshotController::SnapshotController(
  23. const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
  24. SnapshotController::Client* client)
  25. : task_runner_(task_runner),
  26. client_(client),
  27. state_(State::READY),
  28. delay_after_document_available_ms_(kDefaultDelayAfterDocumentAvailableMs),
  29. delay_after_document_on_load_completed_ms_(
  30. kDelayAfterDocumentOnLoadCompletedMsForeground) {
  31. if (offline_pages::ShouldUseTestingSnapshotDelay()) {
  32. delay_after_document_available_ms_ = kDelayForTests;
  33. delay_after_document_on_load_completed_ms_ = kDelayForTests;
  34. }
  35. }
  36. SnapshotController::~SnapshotController() {}
  37. void SnapshotController::Reset() {
  38. // Cancel potentially delayed tasks that relate to the previous 'session'.
  39. weak_ptr_factory_.InvalidateWeakPtrs();
  40. state_ = State::READY;
  41. current_page_quality_ = PageQuality::POOR;
  42. }
  43. void SnapshotController::Stop() {
  44. state_ = State::STOPPED;
  45. }
  46. void SnapshotController::PendingSnapshotCompleted() {
  47. // Unless the controller is "stopped", enable the subsequent snapshots.
  48. // Stopped state prevents any further snapshots form being started.
  49. if (state_ == State::STOPPED)
  50. return;
  51. state_ = State::READY;
  52. }
  53. void SnapshotController::PrimaryMainDocumentElementAvailable() {
  54. DCHECK_EQ(PageQuality::POOR, current_page_quality_);
  55. // Post a delayed task to snapshot.
  56. task_runner_->PostDelayedTask(
  57. FROM_HERE,
  58. base::BindOnce(&SnapshotController::MaybeStartSnapshot,
  59. weak_ptr_factory_.GetWeakPtr(),
  60. PageQuality::FAIR_AND_IMPROVING),
  61. base::Milliseconds(delay_after_document_available_ms_));
  62. }
  63. void SnapshotController::DocumentOnLoadCompletedInPrimaryMainFrame() {
  64. // Post a delayed task to snapshot and then stop this controller.
  65. task_runner_->PostDelayedTask(
  66. FROM_HERE,
  67. base::BindOnce(&SnapshotController::MaybeStartSnapshotThenStop,
  68. weak_ptr_factory_.GetWeakPtr()),
  69. base::Milliseconds(delay_after_document_on_load_completed_ms_));
  70. }
  71. void SnapshotController::MaybeStartSnapshot(PageQuality updated_page_quality) {
  72. if (state_ != State::READY)
  73. return;
  74. DCHECK_LT(current_page_quality_, updated_page_quality);
  75. current_page_quality_ = updated_page_quality;
  76. state_ = State::SNAPSHOT_PENDING;
  77. client_->StartSnapshot();
  78. }
  79. void SnapshotController::MaybeStartSnapshotThenStop() {
  80. MaybeStartSnapshot(PageQuality::HIGH);
  81. Stop();
  82. }
  83. int64_t SnapshotController::GetDelayAfterDocumentAvailableForTest() {
  84. return delay_after_document_available_ms_;
  85. }
  86. int64_t SnapshotController::GetDelayAfterDocumentOnLoadCompletedForTest() {
  87. return delay_after_document_on_load_completed_ms_;
  88. }
  89. } // namespace offline_pages