| // 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_CONTEXT_H_ |
| #define CONTENT_BROWSER_BACKGROUND_FETCH_BACKGROUND_FETCH_CONTEXT_H_ |
| |
| #include <map> |
| #include <string> |
| #include <vector> |
| |
| #include "base/macros.h" |
| #include "base/memory/ref_counted.h" |
| #include "content/common/content_export.h" |
| #include "content/public/browser/browser_thread.h" |
| #include "third_party/WebKit/public/platform/modules/background_fetch/background_fetch.mojom.h" |
| |
| namespace net { |
| class URLRequestContextGetter; |
| } |
| |
| namespace url { |
| class Origin; |
| } |
| |
| namespace content { |
| |
| class BackgroundFetchDataManager; |
| class BackgroundFetchEventDispatcher; |
| class BackgroundFetchJobController; |
| struct BackgroundFetchOptions; |
| class BackgroundFetchRegistrationId; |
| class BackgroundFetchRequestInfo; |
| class BlobHandle; |
| class BrowserContext; |
| class ServiceWorkerContextWrapper; |
| struct ServiceWorkerFetchRequest; |
| class StoragePartitionImpl; |
| |
| // The BackgroundFetchContext is the central moderator of ongoing background |
| // fetch requests from the Mojo service and from other callers. |
| // Background Fetch requests function similar to normal fetches except that |
| // they are persistent across Chromium or service worker shutdown. |
| class CONTENT_EXPORT BackgroundFetchContext |
| : public base::RefCountedThreadSafe<BackgroundFetchContext, |
| BrowserThread::DeleteOnUIThread> { |
| public: |
| // The BackgroundFetchContext will watch the ServiceWorkerContextWrapper so |
| // that it can respond to service worker events such as unregister. |
| BackgroundFetchContext(BrowserContext* browser_context, |
| StoragePartitionImpl* storage_partition, |
| scoped_refptr<ServiceWorkerContextWrapper> context); |
| |
| // Finishes initializing the Background Fetch context on the IO thread by |
| // setting the |request_context_getter|. |
| void InitializeOnIOThread( |
| scoped_refptr<net::URLRequestContextGetter> request_context_getter); |
| |
| // Shutdown must be called before deleting this. Call on the UI thread. |
| void Shutdown(); |
| |
| // Starts a Background Fetch for the |registration_id|. The |requests| will be |
| // asynchronously fetched. The |callback| will be invoked when the fetch has |
| // been registered, or an error occurred that avoids it from doing so. |
| void StartFetch(const BackgroundFetchRegistrationId& registration_id, |
| const std::vector<ServiceWorkerFetchRequest>& requests, |
| const BackgroundFetchOptions& options, |
| blink::mojom::BackgroundFetchService::FetchCallback callback); |
| |
| // Returns a vector with the tags of the active fetches for the given |origin| |
| // and |service_worker_registration_id|. |
| std::vector<std::string> GetActiveTagsForServiceWorkerRegistration( |
| int64_t service_worker_registration_id, |
| const url::Origin& origin) const; |
| |
| // Returns the JobController that is handling the |registration_id|, or a |
| // nullptr if it does not exist. Must be immediately used by the caller. |
| BackgroundFetchJobController* GetActiveFetch( |
| const BackgroundFetchRegistrationId& registration_id) const; |
| |
| private: |
| friend class base::DeleteHelper<BackgroundFetchContext>; |
| friend struct BrowserThread::DeleteOnThread<BrowserThread::UI>; |
| friend class base::RefCountedThreadSafe<BackgroundFetchContext, |
| BrowserThread::DeleteOnUIThread>; |
| |
| ~BackgroundFetchContext(); |
| |
| // Shuts down the active Job Controllers on the IO thread. |
| void ShutdownOnIO(); |
| |
| // Creates a new Job Controller for the given |registration_id| and |options|, |
| // which will start fetching the files that are part of the registration. |
| void CreateController( |
| const BackgroundFetchRegistrationId& registration_id, |
| const BackgroundFetchOptions& options, |
| std::vector<scoped_refptr<BackgroundFetchRequestInfo>> initial_requests); |
| |
| // Called when a new registration has been created by the data manager. |
| void DidCreateRegistration( |
| const BackgroundFetchRegistrationId& registration_id, |
| const BackgroundFetchOptions& options, |
| blink::mojom::BackgroundFetchService::FetchCallback callback, |
| blink::mojom::BackgroundFetchError error, |
| std::vector<scoped_refptr<BackgroundFetchRequestInfo>> initial_requests); |
| |
| // Called when the given |controller| has finished processing its job. |
| void DidCompleteJob(BackgroundFetchJobController* controller); |
| |
| // Called when the sequence of settled fetches for |registration_id| have been |
| // retrieved from storage, and the Service Worker event can be invoked. |
| void DidGetSettledFetches( |
| const BackgroundFetchRegistrationId& registration_id, |
| blink::mojom::BackgroundFetchError error, |
| bool background_fetch_succeeded, |
| std::vector<BackgroundFetchSettledFetch> settled_fetches, |
| std::vector<std::unique_ptr<BlobHandle>> blob_handles); |
| |
| // Called when all processing for the |registration_id| has been finished and |
| // the job, including its associated data, is ready to be deleted. |
| void DeleteRegistration( |
| const BackgroundFetchRegistrationId& registration_id, |
| const std::vector<std::unique_ptr<BlobHandle>>& blob_handles); |
| |
| // |this| is owned, indirectly, by the BrowserContext. |
| BrowserContext* browser_context_; |
| |
| scoped_refptr<net::URLRequestContextGetter> request_context_getter_; |
| |
| std::unique_ptr<BackgroundFetchDataManager> data_manager_; |
| std::unique_ptr<BackgroundFetchEventDispatcher> event_dispatcher_; |
| |
| // Map of the Background Fetch fetches that are currently in-progress. |
| std::map<BackgroundFetchRegistrationId, |
| std::unique_ptr<BackgroundFetchJobController>> |
| active_fetches_; |
| |
| DISALLOW_COPY_AND_ASSIGN(BackgroundFetchContext); |
| }; |
| |
| } // namespace content |
| |
| #endif // CONTENT_BROWSER_BACKGROUND_FETCH_BACKGROUND_FETCH_CONTEXT_H_ |