blob: f27033db2df7ab608ae8a790bb4e1e4def9f08cf [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.
#include "base/callback.h"
#include "extensions/common/extension_id.h"
#include "url/gurl.h"
namespace content {
class BrowserContext;
class RenderProcessHost;
} // namespace content
namespace extensions {
class Extension;
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 {
// 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 int worker_thread_id;
const GURL url;
ContextInfo(const ExtensionId& extension_id,
content::RenderProcessHost* render_process_host,
int worker_thread_id,
const GURL& url)
: extension_id(extension_id),
url(url) {}
using PendingTask = base::Callback<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.
// TODO(lazyboy): Remove "ToDispatchEvent" suffix and simply call this
// AddPendingTask. Issues:
// 1. We already have LazyBackgroundTaskQueue::AddPendingTask. Moreover, that
// is heavily used thoughout the codebase.
// 2. LazyBackgroundTaskQueue::AddPendingTask is tied to ExtensionHost. This
// class should be ExtensionHost agnostic.
virtual void AddPendingTaskToDispatchEvent(LazyContextId* context_id,
const PendingTask& task) = 0;
} // namespace extensions