blob: 1d3d6429306b3d52bedacb53577dd5f17635357b [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 EXTENSIONS_BROWSER_LAZY_CONTEXT_TASK_QUEUE_H_
#define EXTENSIONS_BROWSER_LAZY_CONTEXT_TASK_QUEUE_H_
#include "base/callback.h"
#include "extensions/common/extension_id.h"
#include "url/gurl.h"
namespace content {
class BrowserContext;
class RenderProcessHost;
class WebContents;
} // namespace content
namespace extensions {
class Extension;
class ExtensionHost;
class LazyContextId;
// Interface for performing tasks after loading lazy contexts of an extension.
//
// Lazy contexts are non-persistent, so they can unload any time and this
// interface exposes an async mechanism to perform tasks after loading the
// context.
class LazyContextTaskQueue {
public:
// Represents information about an extension lazy context, which is passed to
// consumers that add tasks to LazyContextTaskQueue.
struct ContextInfo {
const ExtensionId extension_id;
content::RenderProcessHost* const render_process_host;
const int64_t service_worker_version_id;
const int worker_thread_id;
const GURL url;
// TODO(dbertoni): This needs to be initialized for the Service Worker
// version of the constructor.
content::BrowserContext* const browser_context = nullptr;
// This data member will have a nullptr value for Service Worker-related
// tasks.
content::WebContents* const web_contents = nullptr;
explicit ContextInfo(ExtensionHost* host);
ContextInfo(const ExtensionId& extension_id,
content::RenderProcessHost* render_process_host,
int64_t service_worker_version_id,
int worker_thread_id,
const GURL& url);
};
using PendingTask =
base::OnceCallback<void(std::unique_ptr<ContextInfo> params)>;
// Returns true if the task should be added to the queue (that is, if the
// extension has a lazy background page or service worker that isn't ready
// yet).
virtual bool ShouldEnqueueTask(content::BrowserContext* context,
const Extension* extension) = 0;
// Adds a task to the queue for a given extension. If this is the first
// task added for the extension, its "lazy context" (i.e. lazy background
// page for event pages, service worker for extension service workers) will
// be loaded. The task will be called either when the page is loaded,
// or when the page fails to load for some reason (e.g. a crash or browser
// shutdown). In the latter case, the ContextInfo will be nullptr.
virtual void AddPendingTask(const LazyContextId& context_id,
PendingTask task) = 0;
};
} // namespace extensions
#endif // EXTENSIONS_BROWSER_LAZY_CONTEXT_TASK_QUEUE_H_