blob: 4bf35b18c970267c202a43c550a8080e6e1ed095 [file] [log] [blame]
// Copyright 2017 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 CONTENT_BROWSER_BACKGROUND_FETCH_BACKGROUND_FETCH_DELEGATE_PROXY_H_
#define CONTENT_BROWSER_BACKGROUND_FETCH_BACKGROUND_FETCH_DELEGATE_PROXY_H_
#include <stdint.h>
#include <map>
#include <memory>
#include <string>
#include <utility>
#include <vector>
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
#include "content/browser/background_fetch/background_fetch_request_info.h"
#include "content/public/browser/background_fetch_response.h"
#include "content/public/browser/browser_thread.h"
namespace content {
class BackgroundFetchDelegate;
// Proxy class for passing messages between BackgroundFetchJobControllers on the
// IO thread and BackgroundFetchDelegate on the UI thread.
class CONTENT_EXPORT BackgroundFetchDelegateProxy {
public:
// Subclasses must only be destroyed on the IO thread, since these methods
// will be called on the IO thread.
class Controller {
public:
// Called when the given |request| has started fetching.
virtual void DidStartRequest(
const scoped_refptr<BackgroundFetchRequestInfo>& request) = 0;
// Called when the given |request| has an update, meaning that a total of
// |bytes_downloaded| are now available for the response.
virtual void DidUpdateRequest(
const scoped_refptr<BackgroundFetchRequestInfo>& request,
uint64_t bytes_downloaded) = 0;
// Called when the given |request| has been completed.
virtual void DidCompleteRequest(
const scoped_refptr<BackgroundFetchRequestInfo>& request) = 0;
// Called when the user aborts a Background Fetch registration.
virtual void AbortFromUser() = 0;
virtual ~Controller() {}
};
explicit BackgroundFetchDelegateProxy(BackgroundFetchDelegate* delegate);
~BackgroundFetchDelegateProxy();
// Creates a new download grouping identified by |job_unique_id|. Further
// downloads started by StartRequest will also use this |job_unique_id| so
// that a notification can be updated with the current status. If the download
// was already started in a previous browser session, then |current_guids|
// should contain the GUIDs of in progress downloads, while completed
// downloads are recorded in |completed_parts|.
// Should only be called from the Controller (on the IO
// thread).
void CreateDownloadJob(const std::string& job_unique_id,
const std::string& title,
const url::Origin& origin,
base::WeakPtr<Controller> controller,
int completed_parts,
int total_parts,
const std::vector<std::string>& current_guids);
// Requests that the download manager start fetching |request|.
// Should only be called from the Controller (on the IO
// thread).
void StartRequest(const std::string& job_unique_id,
const url::Origin& origin,
scoped_refptr<BackgroundFetchRequestInfo> request);
// Updates the representation of this registration in the user interface to
// match the given |title|. Called from the Controller (on the IO thread).
void UpdateUI(const std::string& job_unique_id, const std::string& title);
// Aborts in progress downloads for the given registration. Called from the
// Controller (on the IO thread) after it is aborted, either by the user or
// website. May occur even if all requests already called OnDownloadComplete.
void Abort(const std::string& job_unique_id);
private:
class Core;
// Called when the job identified by |job_unique|id| was cancelled by the
// delegate. Should only be called on the IO thread.
void OnJobCancelled(const std::string& job_unique_id);
// Called when the download identified by |guid| has succeeded/failed/aborted.
// Should only be called on the IO thread.
void OnDownloadComplete(const std::string& job_unique_id,
const std::string& guid,
std::unique_ptr<BackgroundFetchResult> result);
// Called when progress has been made for the download identified by |guid|.
// Should only be called on the IO thread.
void OnDownloadUpdated(const std::string& job_unique_id,
const std::string& guid,
uint64_t bytes_downloaded);
// Should only be called from the BackgroundFetchDelegate (on the IO thread).
void DidStartRequest(const std::string& job_unique_id,
const std::string& guid,
std::unique_ptr<BackgroundFetchResponse> response);
std::unique_ptr<Core, BrowserThread::DeleteOnUIThread> ui_core_;
base::WeakPtr<Core> ui_core_ptr_;
struct JobDetails {
explicit JobDetails(base::WeakPtr<Controller> controller);
JobDetails(JobDetails&& details);
~JobDetails();
base::WeakPtr<Controller> controller;
// Map from DownloadService GUIDs to their corresponding request.
base::flat_map<std::string, scoped_refptr<BackgroundFetchRequestInfo>>
current_request_map;
private:
DISALLOW_COPY_AND_ASSIGN(JobDetails);
};
// Map from unique job ids to a JobDetails containing the outstanding download
// GUIDs and the controller that started the download.
std::map<std::string, JobDetails> job_details_map_;
base::WeakPtrFactory<BackgroundFetchDelegateProxy> weak_ptr_factory_;
DISALLOW_COPY_AND_ASSIGN(BackgroundFetchDelegateProxy);
};
} // namespace content
#endif // CONTENT_BROWSER_BACKGROUND_FETCH_BACKGROUND_FETCH_DELEGATE_PROXY_H_