blob: 35ce347683f04937bf835574edd373099b759016 [file] [log] [blame]
// Copyright 2021 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_USER_SCRIPT_MANAGER_H_
#define EXTENSIONS_BROWSER_USER_SCRIPT_MANAGER_H_
#include <map>
#include <memory>
#include <set>
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/scoped_observation.h"
#include "base/values.h"
#include "extensions/browser/extension_registry.h"
#include "extensions/browser/extension_registry_observer.h"
#include "extensions/browser/extension_user_script_loader.h"
#include "extensions/browser/web_ui_user_script_loader.h"
#include "extensions/common/extension.h"
#include "extensions/common/mojom/host_id.mojom-forward.h"
#include "extensions/common/user_script.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
#include "url/gurl.h"
namespace content {
class BrowserContext;
}
namespace extensions {
class UserScriptLoader;
// Manages user scripts for all extensions and webview scripts from WebUI pages.
// Owns one UserScriptLoader for manifest extension scripts, and a map of
// mojom::HostID to UserScriptLoaders for declarative extension and WebUI
// scripts. File loading and shared memory management operations are delegated
// to these UserScriptLoaders.
class UserScriptManager : public ExtensionRegistryObserver {
public:
explicit UserScriptManager(content::BrowserContext* browser_context);
~UserScriptManager() override;
UserScriptManager(const UserScriptManager& other) = delete;
UserScriptManager& operator=(const UserScriptManager& other) = delete;
UserScriptLoader* GetUserScriptLoaderByID(const mojom::HostID& host_id);
ExtensionUserScriptLoader* GetUserScriptLoaderForExtension(
const ExtensionId& extension_id);
WebUIUserScriptLoader* GetUserScriptLoaderForWebUI(const GURL& url);
private:
// ExtensionRegistryObserver implementation.
void OnExtensionWillBeInstalled(content::BrowserContext* browser_context,
const Extension* extension,
bool is_update,
const std::string& old_name) override;
void OnExtensionLoaded(content::BrowserContext* browser_context,
const Extension* extension) override;
void OnExtensionUnloaded(content::BrowserContext* browser_context,
const Extension* extension,
UnloadedExtensionReason reason) override;
// Called when `loader` has finished loading its initial set of scripts. This
// is only fired for extension script loaders.
void OnInitialExtensionLoadComplete(UserScriptLoader* loader,
const absl::optional<std::string>& error);
// Removes the given ID from `pending_initial_extension_loads_` and if there
// are no more pending initial loads, signal to the UserScriptListener.
void RemovePendingExtensionLoadAndSignal(const ExtensionId& extension_id);
// Creates a ExtensionUserScriptLoader object.
ExtensionUserScriptLoader* CreateExtensionUserScriptLoader(
const Extension* extension);
// Creates a WebUIUserScriptLoader object.
WebUIUserScriptLoader* CreateWebUIUserScriptLoader(const GURL& url);
// A map of ExtensionUserScriptLoader for each extension host, with one loader
// per extension. Currently, each loader is lazily initialized and contains
// scripts from APIs webview tags.
std::map<ExtensionId, std::unique_ptr<ExtensionUserScriptLoader>>
extension_script_loaders_;
// A map of WebUIUserScriptLoader for each WebUI host, each loader contains
// webview content scripts for the corresponding WebUI page and is lazily
// initialized.
std::map<GURL, std::unique_ptr<WebUIUserScriptLoader>> webui_script_loaders_;
// Tracks the IDs of extensions with initial script loads (consisting of
// manifest and persistent dynamic scripts) in progress.
std::set<ExtensionId> pending_initial_extension_loads_;
const raw_ptr<content::BrowserContext> browser_context_;
base::ScopedObservation<ExtensionRegistry, ExtensionRegistryObserver>
extension_registry_observation_{this};
base::WeakPtrFactory<UserScriptManager> weak_factory_{this};
};
} // namespace extensions
#endif // EXTENSIONS_BROWSER_USER_SCRIPT_MANAGER_H_