| Index: components/offline_pages/background/request_coordinator.h
|
| diff --git a/components/offline_pages/background/request_coordinator.h b/components/offline_pages/background/request_coordinator.h
|
| deleted file mode 100644
|
| index c2d26b77d5fa1249cfcf5d72c3c8fd641b00e66c..0000000000000000000000000000000000000000
|
| --- a/components/offline_pages/background/request_coordinator.h
|
| +++ /dev/null
|
| @@ -1,415 +0,0 @@
|
| -// 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_REQUEST_COORDINATOR_H_
|
| -#define COMPONENTS_OFFLINE_PAGES_BACKGROUND_REQUEST_COORDINATOR_H_
|
| -
|
| -#include <memory>
|
| -#include <set>
|
| -#include <string>
|
| -#include <vector>
|
| -
|
| -#include "base/callback.h"
|
| -#include "base/macros.h"
|
| -#include "base/memory/weak_ptr.h"
|
| -#include "base/observer_list.h"
|
| -#include "base/supports_user_data.h"
|
| -#include "base/time/time.h"
|
| -#include "base/timer/timer.h"
|
| -#include "components/keyed_service/core/keyed_service.h"
|
| -#include "components/offline_pages/background/device_conditions.h"
|
| -#include "components/offline_pages/background/offliner.h"
|
| -#include "components/offline_pages/background/request_coordinator_event_logger.h"
|
| -#include "components/offline_pages/background/request_notifier.h"
|
| -#include "components/offline_pages/background/request_queue.h"
|
| -#include "components/offline_pages/background/scheduler.h"
|
| -#include "net/nqe/network_quality_estimator.h"
|
| -#include "url/gurl.h"
|
| -
|
| -namespace offline_pages {
|
| -
|
| -struct ClientId;
|
| -class OfflinerPolicy;
|
| -class OfflinerFactory;
|
| -class Offliner;
|
| -class RequestQueue;
|
| -class SavePageRequest;
|
| -class Scheduler;
|
| -class ClientPolicyController;
|
| -
|
| -// Coordinates queueing and processing save page later requests.
|
| -class RequestCoordinator : public KeyedService,
|
| - public RequestNotifier,
|
| - public base::SupportsUserData {
|
| - public:
|
| - // Nested observer class. To make sure that no events are missed, the client
|
| - // code should first register for notifications, then |GetAllRequests|, and
|
| - // ignore all events before the return from |GetAllRequests|, and consume
|
| - // events after the return callback from |GetAllRequests|.
|
| - class Observer {
|
| - public:
|
| - virtual ~Observer() = default;
|
| -
|
| - virtual void OnAdded(const SavePageRequest& request) = 0;
|
| - virtual void OnCompleted(
|
| - const SavePageRequest& request,
|
| - RequestNotifier::BackgroundSavePageResult status) = 0;
|
| - virtual void OnChanged(const SavePageRequest& request) = 0;
|
| - };
|
| -
|
| - enum class RequestAvailability {
|
| - ENABLED_FOR_OFFLINER,
|
| - DISABLED_FOR_OFFLINER,
|
| - };
|
| -
|
| - // Callback specifying which request IDs were actually removed.
|
| - typedef base::Callback<void(const MultipleItemStatuses&)>
|
| - RemoveRequestsCallback;
|
| -
|
| - // Callback that receives the response for GetAllRequests.
|
| - typedef base::Callback<void(std::vector<std::unique_ptr<SavePageRequest>>)>
|
| - GetRequestsCallback;
|
| -
|
| - RequestCoordinator(std::unique_ptr<OfflinerPolicy> policy,
|
| - std::unique_ptr<OfflinerFactory> factory,
|
| - std::unique_ptr<RequestQueue> queue,
|
| - std::unique_ptr<Scheduler> scheduler,
|
| - net::NetworkQualityEstimator::NetworkQualityProvider*
|
| - network_quality_estimator);
|
| -
|
| - ~RequestCoordinator() override;
|
| -
|
| - // Queues |request| to later load and save when system conditions allow.
|
| - // Returns an id if the page could be queued successfully, 0L otherwise.
|
| - int64_t SavePageLater(const GURL& url,
|
| - const ClientId& client_id,
|
| - bool user_requested,
|
| - RequestAvailability availability);
|
| -
|
| - // Remove a list of requests by |request_id|. This removes requests from the
|
| - // request queue, and cancels an in-progress prerender.
|
| - void RemoveRequests(const std::vector<int64_t>& request_ids,
|
| - const RemoveRequestsCallback& callback);
|
| -
|
| - // Pause a list of requests by |request_id|. This will change the state
|
| - // in the request queue so the request cannot be started.
|
| - void PauseRequests(const std::vector<int64_t>& request_ids);
|
| -
|
| - // Resume a list of previously paused requests, making them available.
|
| - void ResumeRequests(const std::vector<int64_t>& request_ids);
|
| -
|
| - // Get all save page request items in the callback.
|
| - void GetAllRequests(const GetRequestsCallback& callback);
|
| -
|
| - // Starts processing of one or more queued save page later requests.
|
| - // Returns whether processing was started and that caller should expect
|
| - // a callback. If processing was already active, returns false.
|
| - bool StartProcessing(const DeviceConditions& device_conditions,
|
| - const base::Callback<void(bool)>& callback);
|
| -
|
| - // Stops the current request processing if active. This is a way for
|
| - // caller to abort processing; otherwise, processing will complete on
|
| - // its own. In either case, the callback will be called when processing
|
| - // is stopped or complete.
|
| - void StopProcessing(Offliner::RequestStatus stop_status);
|
| -
|
| - // Used to denote that the foreground thread is ready for the offliner
|
| - // to start work on a previously entered, but unavailable request.
|
| - void EnableForOffliner(int64_t request_id, const ClientId& client_id);
|
| -
|
| - // If a request that is unavailable to the offliner is finished elsewhere,
|
| - // (by the tab helper synchronous download), send a notificaiton that it
|
| - // succeeded through our notificaiton system.
|
| - void MarkRequestCompleted(int64_t request_id);
|
| -
|
| - const Scheduler::TriggerConditions GetTriggerConditions(
|
| - const bool user_requested);
|
| -
|
| - // A way for tests to set the callback in use when an operation is over.
|
| - void SetProcessingCallbackForTest(const base::Callback<void(bool)> callback) {
|
| - scheduler_callback_ = callback;
|
| - }
|
| -
|
| - // A way to set the callback which would be called if the request will be
|
| - // scheduled immediately. Used by testing harness to determine if a request
|
| - // has been processed.
|
| - void SetImmediateScheduleCallbackForTest(
|
| - const base::Callback<void(bool)> callback) {
|
| - immediate_schedule_callback_ = callback;
|
| - }
|
| -
|
| - void StartImmediatelyForTest() { StartImmediatelyIfConnected(); }
|
| -
|
| - // Observers implementing the RequestCoordinator::Observer interface can
|
| - // register here to get notifications of changes to request state. This
|
| - // pointer is not owned, and it is the callers responsibility to remove the
|
| - // observer before the observer is deleted.
|
| - void AddObserver(RequestCoordinator::Observer* observer);
|
| -
|
| - void RemoveObserver(RequestCoordinator::Observer* observer);
|
| -
|
| - // Implement RequestNotifier
|
| - void NotifyAdded(const SavePageRequest& request) override;
|
| - void NotifyCompleted(
|
| - const SavePageRequest& request,
|
| - RequestNotifier::BackgroundSavePageResult status) override;
|
| - void NotifyChanged(const SavePageRequest& request) override;
|
| -
|
| - // Returns the request queue used for requests. Coordinator keeps ownership.
|
| - RequestQueue* queue() { return queue_.get(); }
|
| -
|
| - // Return an unowned pointer to the Scheduler.
|
| - Scheduler* scheduler() { return scheduler_.get(); }
|
| -
|
| - OfflinerPolicy* policy() { return policy_.get(); }
|
| -
|
| - ClientPolicyController* GetPolicyController();
|
| -
|
| - // Returns the status of the most recent offlining.
|
| - Offliner::RequestStatus last_offlining_status() {
|
| - return last_offlining_status_;
|
| - }
|
| -
|
| - bool is_busy() {
|
| - return is_busy_;
|
| - }
|
| -
|
| - // Returns whether processing is starting (before it is decided to actually
|
| - // process a request (is_busy()) at this time or not.
|
| - bool is_starting() { return is_starting_; }
|
| -
|
| - // Tracks whether the last offlining attempt got canceled. This is reset by
|
| - // the next StartProcessing() call.
|
| - bool is_canceled() {
|
| - return processing_state_ == ProcessingWindowState::STOPPED;
|
| - }
|
| -
|
| - RequestCoordinatorEventLogger* GetLogger() { return &event_logger_; }
|
| -
|
| - private:
|
| - // Immediate start attempt status code for UMA.
|
| - // These values are written to logs. New enum values can be added, but
|
| - // existing enums must never be renumbered or deleted and reused.
|
| - // For any additions, also update corresponding histogram in histograms.xml.
|
| - enum OfflinerImmediateStartStatus {
|
| - // Did start processing request.
|
| - STARTED = 0,
|
| - // Already busy processing a request.
|
| - BUSY = 1,
|
| - // The Offliner did not accept processing the request.
|
| - NOT_ACCEPTED = 2,
|
| - // No current network connection.
|
| - NO_CONNECTION = 3,
|
| - // Weak network connection (worse than 2G speed)
|
| - // according to network quality estimator.
|
| - WEAK_CONNECTION = 4,
|
| - // Did not start because this is svelte device.
|
| - NOT_STARTED_ON_SVELTE = 5,
|
| - // NOTE: insert new values above this line and update histogram enum too.
|
| - STATUS_COUNT = 6,
|
| - };
|
| -
|
| - enum class ProcessingWindowState {
|
| - STOPPED,
|
| - SCHEDULED_WINDOW,
|
| - IMMEDIATE_WINDOW,
|
| - };
|
| -
|
| - // Receives the results of a get from the request queue, and turns that into
|
| - // SavePageRequest objects for the caller of GetQueuedRequests.
|
| - void GetQueuedRequestsCallback(
|
| - const GetRequestsCallback& callback,
|
| - GetRequestsResult result,
|
| - std::vector<std::unique_ptr<SavePageRequest>> requests);
|
| -
|
| - // Receives the results of a get from the request queue, and turns that into
|
| - // SavePageRequest objects for the caller of GetQueuedRequests.
|
| - void GetRequestsForSchedulingCallback(
|
| - GetRequestsResult result,
|
| - std::vector<std::unique_ptr<SavePageRequest>> requests);
|
| -
|
| - // Receives the result of add requests to the request queue.
|
| - void AddRequestResultCallback(RequestAvailability availability,
|
| - AddRequestResult result,
|
| - const SavePageRequest& request);
|
| -
|
| - void UpdateMultipleRequestsCallback(
|
| - std::unique_ptr<UpdateRequestsResult> result);
|
| -
|
| - void HandleRemovedRequestsAndCallback(
|
| - const RemoveRequestsCallback& callback,
|
| - RequestNotifier::BackgroundSavePageResult status,
|
| - std::unique_ptr<UpdateRequestsResult> result);
|
| -
|
| - void HandleRemovedRequests(RequestNotifier::BackgroundSavePageResult status,
|
| - std::unique_ptr<UpdateRequestsResult> result);
|
| -
|
| - bool StartProcessingInternal(const ProcessingWindowState processing_state,
|
| - const DeviceConditions& device_conditions,
|
| - const base::Callback<void(bool)>& callback);
|
| -
|
| - // Start processing now if connected (but with conservative assumption
|
| - // as to other device conditions).
|
| - void StartImmediatelyIfConnected();
|
| -
|
| - OfflinerImmediateStartStatus TryImmediateStart();
|
| -
|
| - // Check the request queue, and schedule a task corresponding
|
| - // to the least restrictive type of request in the queue.
|
| - void ScheduleAsNeeded();
|
| -
|
| - // Callback from the request picker when it has chosen our next request.
|
| - void RequestPicked(const SavePageRequest& request);
|
| -
|
| - // Callback from the request picker when no more requests are in the queue.
|
| - // The parameter is a signal for what (if any) conditions to schedule future
|
| - // processing for.
|
| - void RequestNotPicked(bool non_user_requested_tasks_remaining);
|
| -
|
| - // Callback from request picker that receives the current available queued
|
| - // request count as well as the total queued request count (which may be
|
| - // different if unavailable requests are queued such as paused requests).
|
| - // It also receives a flag as to whether this request picking is due to the
|
| - // start of a request processing window.
|
| - void RequestCounts(bool is_start_of_processing,
|
| - size_t total_requests,
|
| - size_t available_requests);
|
| -
|
| - void HandleWatchdogTimeout();
|
| -
|
| - // Cancels an in progress pre-rendering, and updates state appropriately.
|
| - void StopPrerendering(Offliner::RequestStatus stop_status);
|
| -
|
| - // Marks attempt on the request and sends it to offliner in continuation.
|
| - void SendRequestToOffliner(const SavePageRequest& request);
|
| -
|
| - // Continuation of |SendRequestToOffliner| after the request is marked as
|
| - // started.
|
| - void StartOffliner(int64_t request_id,
|
| - const std::string& client_namespace,
|
| - std::unique_ptr<UpdateRequestsResult> update_result);
|
| -
|
| - // Called by the offliner when an offlining request is completed. (and by
|
| - // tests).
|
| - void OfflinerDoneCallback(const SavePageRequest& request,
|
| - Offliner::RequestStatus status);
|
| -
|
| - // Records a completed attempt for the request and update it in the queue
|
| - // (possibly removing it).
|
| - void UpdateRequestForCompletedAttempt(const SavePageRequest& request,
|
| - Offliner::RequestStatus status);
|
| -
|
| - // Returns whether we should try another request based on the outcome
|
| - // of the previous one.
|
| - bool ShouldTryNextRequest(Offliner::RequestStatus previous_request_status);
|
| -
|
| - // Try to find and start offlining an available request.
|
| - // |is_start_of_processing| identifies if this is the beginning of a
|
| - // processing window (vs. continuing within a current processing window).
|
| - void TryNextRequest(bool is_start_of_processing);
|
| -
|
| - // If there is an active request in the list, cancel that request.
|
| - bool CancelActiveRequestIfItMatches(const std::vector<int64_t>& request_ids);
|
| -
|
| - // Records an aborted attempt for the request and update it in the queue
|
| - // (possibly removing it).
|
| - void UpdateRequestForAbortedAttempt(const SavePageRequest& request);
|
| -
|
| - // Remove the attempted request from the queue with status to pass through to
|
| - // any observers and UMA histogram.
|
| - void RemoveAttemptedRequest(const SavePageRequest& request,
|
| - BackgroundSavePageResult status);
|
| -
|
| - // Marks the attempt as aborted. This makes the request available again
|
| - // for offlining.
|
| - void MarkAttemptAborted(int64_t request_id, const std::string& name_space);
|
| -
|
| - // Reports change from marking request, reports an error if it fails.
|
| - void MarkAttemptDone(int64_t request_id,
|
| - const std::string& name_space,
|
| - std::unique_ptr<UpdateRequestsResult> result);
|
| -
|
| - // Returns the appropriate offliner to use, getting a new one from the factory
|
| - // if needed.
|
| - void GetOffliner();
|
| -
|
| - // Method to wrap calls to getting the connection type so it can be
|
| - // changed for tests.
|
| - net::NetworkChangeNotifier::ConnectionType GetConnectionType();
|
| -
|
| - void SetNetworkConditionsForTest(
|
| - net::NetworkChangeNotifier::ConnectionType connection) {
|
| - use_test_connection_type_ = true;
|
| - test_connection_type_ = connection;
|
| - }
|
| -
|
| - void SetDeviceConditionsForTest(const DeviceConditions& current_conditions) {
|
| - current_conditions_.reset(new DeviceConditions(current_conditions));
|
| - }
|
| -
|
| - // KeyedService implementation:
|
| - void Shutdown() override;
|
| -
|
| - friend class RequestCoordinatorTest;
|
| -
|
| - // Cached value of whether low end device. Overwritable for testing.
|
| - bool is_low_end_device_;
|
| -
|
| - // The offliner can only handle one request at a time - if the offliner is
|
| - // busy, prevent other requests. This flag marks whether the offliner is in
|
| - // use.
|
| - bool is_busy_;
|
| - // There is more than one path to start processing so this flag is used
|
| - // to avoid race conditions before is_busy_ is established.
|
| - bool is_starting_;
|
| - // Identifies the type of current processing window or if processing stopped.
|
| - ProcessingWindowState processing_state_;
|
| - // True if we should use the test connection type instead of the actual type.
|
| - bool use_test_connection_type_;
|
| - // For use by tests, a fake network connection type
|
| - net::NetworkChangeNotifier::ConnectionType test_connection_type_;
|
| - // Unowned pointer to the current offliner, if any.
|
| - Offliner* offliner_;
|
| - base::Time operation_start_time_;
|
| - // The observers.
|
| - base::ObserverList<Observer> observers_;
|
| - // Last known conditions for network, battery
|
| - std::unique_ptr<DeviceConditions> current_conditions_;
|
| - // RequestCoordinator takes over ownership of the policy
|
| - std::unique_ptr<OfflinerPolicy> policy_;
|
| - // OfflinerFactory. Used to create offline pages. Owned.
|
| - std::unique_ptr<OfflinerFactory> factory_;
|
| - // RequestQueue. Used to store incoming requests. Owned.
|
| - std::unique_ptr<RequestQueue> queue_;
|
| - // Scheduler. Used to request a callback when network is available. Owned.
|
| - std::unique_ptr<Scheduler> scheduler_;
|
| - // Controller of client policies. Owned.
|
| - std::unique_ptr<ClientPolicyController> policy_controller_;
|
| - // Unowned pointer to the Network Quality Estimator.
|
| - net::NetworkQualityEstimator::NetworkQualityProvider*
|
| - network_quality_estimator_;
|
| - // Holds copy of the active request, if any.
|
| - std::unique_ptr<SavePageRequest> active_request_;
|
| - // Status of the most recent offlining.
|
| - Offliner::RequestStatus last_offlining_status_;
|
| - // A set of request_ids that we are holding off until the download manager is
|
| - // done with them.
|
| - std::set<int64_t> disabled_requests_;
|
| - // Calling this returns to the scheduler across the JNI bridge.
|
| - base::Callback<void(bool)> scheduler_callback_;
|
| - // Logger to record events.
|
| - RequestCoordinatorEventLogger event_logger_;
|
| - // Timer to watch for pre-render attempts running too long.
|
| - base::OneShotTimer watchdog_timer_;
|
| - // Callback invoked when an immediate request is done (default empty).
|
| - base::Callback<void(bool)> immediate_schedule_callback_;
|
| - // Allows us to pass a weak pointer to callbacks.
|
| - base::WeakPtrFactory<RequestCoordinator> weak_ptr_factory_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(RequestCoordinator);
|
| -};
|
| -
|
| -} // namespace offline_pages
|
| -
|
| -#endif // COMPONENTS_OFFLINE_PAGES_BACKGROUND_REQUEST_COORDINATOR_H_
|
|
|