// 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. #include "extensions/browser/process_util.h" #include "base/check.h" #include "content/public/browser/browser_context.h" #include "extensions/browser/extension_host.h" #include "extensions/browser/extension_util.h" #include "extensions/browser/extensions_browser_client.h" #include "extensions/browser/process_manager.h" #include "extensions/common/extension.h" #include "extensions/common/manifest_handlers/background_info.h" #include "extensions/common/manifest_handlers/incognito_info.h" namespace extensions { namespace process_util { PersistentBackgroundPageState GetPersistentBackgroundPageState( const Extension& extension, content::BrowserContext* browser_context) { // If the extension doesn't have a persistent background page, it can never // be ready. if (!BackgroundInfo::HasPersistentBackgroundPage(&extension)) return PersistentBackgroundPageState::kInvalid; content::BrowserContext* browser_context_to_use = browser_context; if (browser_context->IsOffTheRecord()) { // Sanity checks: First check that the extension supports running in // incognito, according to its manifest. DCHECK(IncognitoInfo::IsIncognitoAllowed(&extension)) << "Can't use an incognito browser context for an extension that " "doesn't suppport incognito!"; // Then, check that the user enabled the extension in incognito. DCHECK(util::IsIncognitoEnabled(extension.id(), browser_context)) << "Can't use an incognito browser context for an extension that isn't " "allowed to run in incognito!"; // If the extension runs in spanning mode, the background page will be // associated with the on-the-record context. if (!IncognitoInfo::IsSplitMode(&extension)) { browser_context_to_use = ExtensionsBrowserClient::Get()->GetOriginalContext(browser_context); } } ProcessManager* process_manager = ProcessManager::Get(browser_context_to_use); DCHECK(process_manager); ExtensionHost* background_host = process_manager->GetBackgroundHostForExtension(extension.id()); if (!background_host || !background_host->document_element_available()) return PersistentBackgroundPageState::kNotReady; return PersistentBackgroundPageState::kReady; } } // namespace process_util } // namespace extensions