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)13PrefetchBackgroundTask::PrefetchBackgroundTask(PrefetchService* service) 14 : service_(service) {} 15 ~PrefetchBackgroundTask()16PrefetchBackgroundTask::~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)45void 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