1 // Copyright 2017 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 
5 #include "components/offline_pages/core/prefetch/prefetch_background_task.h"
6 
7 #include "components/offline_pages/core/prefetch/prefetch_background_task_handler.h"
8 #include "components/offline_pages/core/prefetch/prefetch_dispatcher.h"
9 #include "components/offline_pages/core/prefetch/prefetch_service.h"
10 
11 namespace offline_pages {
12 
PrefetchBackgroundTask(PrefetchService * service)13 PrefetchBackgroundTask::PrefetchBackgroundTask(PrefetchService* service)
14     : service_(service) {}
15 
~PrefetchBackgroundTask()16 PrefetchBackgroundTask::~PrefetchBackgroundTask() {
17   PrefetchBackgroundTaskHandler* handler =
18       service_->GetPrefetchBackgroundTaskHandler();
19   if (!handler)
20     return;
21   switch (reschedule_type_) {
22     case PrefetchBackgroundTaskRescheduleType::NO_RESCHEDULE:
23       break;
24     case PrefetchBackgroundTaskRescheduleType::RESCHEDULE_WITHOUT_BACKOFF:
25       handler->ResetBackoff();
26       break;
27     case PrefetchBackgroundTaskRescheduleType::RESCHEDULE_WITH_BACKOFF:
28       handler->Backoff();
29       break;
30     case PrefetchBackgroundTaskRescheduleType::RESCHEDULE_DUE_TO_SYSTEM:
31       // If the task is killed due to the system, it should be rescheduled
32       // without backoff even when it is in effect because we want to rerun the
33       // task asap.
34       handler->PauseBackoffUntilNextRun();
35       break;
36     case PrefetchBackgroundTaskRescheduleType::SUSPEND:
37       handler->Suspend();
38       break;
39   }
40 
41   if (reschedule_type_ != PrefetchBackgroundTaskRescheduleType::NO_RESCHEDULE)
42     handler->EnsureTaskScheduled();
43 }
44 
SetReschedule(PrefetchBackgroundTaskRescheduleType type)45 void PrefetchBackgroundTask::SetReschedule(
46     PrefetchBackgroundTaskRescheduleType type) {
47   switch (type) {
48     // |SUSPEND| takes highest precendence.
49     case PrefetchBackgroundTaskRescheduleType::SUSPEND:
50       reschedule_type_ = PrefetchBackgroundTaskRescheduleType::SUSPEND;
51       break;
52     // |RESCHEDULE_DUE_TO_SYSTEM| takes 2nd highest precendence and thus it
53     // can't overwrite |SUSPEND|.
54     case PrefetchBackgroundTaskRescheduleType::RESCHEDULE_DUE_TO_SYSTEM:
55       if (reschedule_type_ != PrefetchBackgroundTaskRescheduleType::SUSPEND) {
56         reschedule_type_ =
57             PrefetchBackgroundTaskRescheduleType::RESCHEDULE_DUE_TO_SYSTEM;
58       }
59       break;
60     // |RESCHEDULE_WITH_BACKOFF| takes 3rd highest precendence and thus it can't
61     // overwrite |SUSPEND| and |RESCHEDULE_DUE_TO_SYSTEM|.
62     case PrefetchBackgroundTaskRescheduleType::RESCHEDULE_WITH_BACKOFF:
63       if (reschedule_type_ != PrefetchBackgroundTaskRescheduleType::SUSPEND &&
64           reschedule_type_ !=
65               PrefetchBackgroundTaskRescheduleType::RESCHEDULE_DUE_TO_SYSTEM) {
66         reschedule_type_ =
67             PrefetchBackgroundTaskRescheduleType::RESCHEDULE_WITH_BACKOFF;
68       }
69       break;
70     // |RESCHEDULE_WITHOUT_BACKOFF| takes 4th highest precendence and thus it
71     // only overwrites the lowest precendence |NO_RESCHEDULE|.
72     case PrefetchBackgroundTaskRescheduleType::RESCHEDULE_WITHOUT_BACKOFF:
73       if (reschedule_type_ ==
74           PrefetchBackgroundTaskRescheduleType::NO_RESCHEDULE) {
75         reschedule_type_ =
76             PrefetchBackgroundTaskRescheduleType::RESCHEDULE_WITHOUT_BACKOFF;
77       }
78       break;
79     case PrefetchBackgroundTaskRescheduleType::NO_RESCHEDULE:
80       break;
81   }
82 }
83 
84 }  // namespace offline_pages
85