blob: 56646f504b4c8ccd360514057a3ba951e9075baa [file] [log] [blame]
// 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.
#ifndef COMPONENTS_OFFLINE_PAGES_BACKGROUND_PICK_REQUEST_TASK_H_
#define COMPONENTS_OFFLINE_PAGES_BACKGROUND_PICK_REQUEST_TASK_H_
#include <set>
#include "base/memory/weak_ptr.h"
#include "components/offline_pages/background/request_queue_results.h"
#include "components/offline_pages/background/save_page_request.h"
#include "components/offline_pages/core/task.h"
namespace offline_pages {
class DeviceConditions;
class OfflinerPolicy;
class PickRequestTask;
class RequestCoordinatorEventLogger;
class RequestNotifier;
class RequestQueueStore;
typedef bool (PickRequestTask::*RequestCompareFunction)(
const SavePageRequest* left,
const SavePageRequest* right);
class PickRequestTask : public Task {
public:
// Callback to report when a request was available.
typedef base::Callback<void(const SavePageRequest& request)>
RequestPickedCallback;
// Callback to report when no request was available.
typedef base::Callback<void(bool)> RequestNotPickedCallback;
// Callback to report available total and available queued request counts.
typedef base::Callback<void(size_t, size_t)> RequestCountCallback;
PickRequestTask(RequestQueueStore* store,
OfflinerPolicy* policy,
RequestNotifier* notifier,
RequestCoordinatorEventLogger* event_logger,
RequestPickedCallback picked_callback,
RequestNotPickedCallback not_picked_callback,
RequestCountCallback request_count_callback,
DeviceConditions& device_conditions,
const std::set<int64_t>& disabled_requests);
~PickRequestTask() override;
// TaskQueue::Task implementation, starts the async chain
void Run() override;
private:
// Step 1, handle getting the results from the store.
void ChooseAndPrune(bool request,
std::vector<std::unique_ptr<SavePageRequest>> requests);
// Step 2a. Handle choosing an entry, and calling the right picked callback
// and the request count callback.
void ChooseRequestAndCallback(
std::vector<std::unique_ptr<SavePageRequest>> valid_requests);
// Step 2b. Handle deleting stale entries and notifying observers.
void RemoveStaleRequests(std::vector<int64_t> stale_request_ids);
// Step 3. Send delete notifications for the expired requests.
void OnRequestsExpired(std::unique_ptr<UpdateRequestsResult> result);
// Helper functions.
// Split requests into valid and expired categories.
void SplitRequests(
std::vector<std::unique_ptr<SavePageRequest>> requests,
std::vector<std::unique_ptr<SavePageRequest>>* valid_requests,
std::vector<int64_t>* expired_request_ids);
// Determine if this request has device conditions appropriate for running it.
bool RequestConditionsSatisfied(const SavePageRequest* request);
// Determine if the new request is preferred under current policies.
bool IsNewRequestBetter(const SavePageRequest* oldRequest,
const SavePageRequest* newRequest,
RequestCompareFunction comparator);
// Returns true if the left hand side is better.
bool RetryCountFirstCompareFunction(const SavePageRequest* left,
const SavePageRequest* right);
// Returns true if the left hand side is better.
bool RecencyFirstCompareFunction(const SavePageRequest* left,
const SavePageRequest* right);
// Compare left and right side, returning 1 if the left side is better
// (preferred by policy), 0 if the same, and -1 if the right side is better.
int CompareRetryCount(const SavePageRequest* left,
const SavePageRequest* right);
// Compare left and right side, returning 1 if the left side is better
// (preferred by policy), 0 if the same, and -1 if the right side is better.
int CompareCreationTime(const SavePageRequest* left,
const SavePageRequest* right);
// Member variables, all pointers are not owned here.
RequestQueueStore* store_;
OfflinerPolicy* policy_;
RequestNotifier* notifier_;
RequestCoordinatorEventLogger* event_logger_;
RequestPickedCallback picked_callback_;
RequestNotPickedCallback not_picked_callback_;
RequestCountCallback request_count_callback_;
std::unique_ptr<DeviceConditions> device_conditions_;
const std::set<int64_t>& disabled_requests_;
// Allows us to pass a weak pointer to callbacks.
base::WeakPtrFactory<PickRequestTask> weak_ptr_factory_;
};
} // namespace offline_pages
#endif // COMPONENTS_OFFLINE_PAGES_BACKGROUND_PICK_REQUEST_TASK_H_