910e62b5创建于 1月15日历史提交
// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef EXTENSIONS_BROWSER_API_OFFSCREEN_OFFSCREEN_API_H_
#define EXTENSIONS_BROWSER_API_OFFSCREEN_OFFSCREEN_API_H_

#include "base/scoped_observation.h"
#include "extensions/browser/extension_function.h"
#include "extensions/browser/extension_function_histogram_value.h"
#include "extensions/browser/extension_host.h"
#include "extensions/browser/extension_host_observer.h"
#include "extensions/buildflags/buildflags.h"

static_assert(BUILDFLAG(ENABLE_EXTENSIONS_CORE));

namespace extensions {

class OffscreenCreateDocumentFunction : public ExtensionFunction,
                                        public ExtensionHostObserver {
 public:
  DECLARE_EXTENSION_FUNCTION("offscreen.createDocument",
                             OFFSCREEN_CREATEDOCUMENT)

  OffscreenCreateDocumentFunction();
  OffscreenCreateDocumentFunction(const OffscreenCreateDocumentFunction&) =
      delete;
  OffscreenCreateDocumentFunction& operator=(
      const OffscreenCreateDocumentFunction&) = delete;

  // ExtensionFunction:
  ResponseAction Run() override;

 private:
  ~OffscreenCreateDocumentFunction() override;

  // ExtensionFunction:
  void OnBrowserContextShutdown() override;

  // ExtensionHostObserver:
  void OnExtensionHostDestroyed(ExtensionHost* host) override;
  void OnExtensionHostDidStopFirstLoad(const ExtensionHost* host) override;

  // Called (asynchronously) if the page fails to load.
  void NotifyPageFailedToLoad();

  // Sends a reply asynchronously to the extension.
  void SendResponseToExtension(ResponseValue response_value);

  // Observes the newly-created document to wait for it to be ready.
  base::ScopedObservation<ExtensionHost, ExtensionHostObserver> host_observer_{
      this};
};

class OffscreenCloseDocumentFunction : public ExtensionFunction,
                                       public ExtensionHostObserver {
 public:
  DECLARE_EXTENSION_FUNCTION("offscreen.closeDocument", OFFSCREEN_CLOSEDOCUMENT)

  OffscreenCloseDocumentFunction();
  OffscreenCloseDocumentFunction(const OffscreenCloseDocumentFunction&) =
      delete;
  OffscreenCloseDocumentFunction& operator=(
      const OffscreenCloseDocumentFunction&) = delete;

  // ExtensionFunction:
  ResponseAction Run() override;

 private:
  ~OffscreenCloseDocumentFunction() override;

  // ExtensionFunction:
  void OnBrowserContextShutdown() override;

  // ExtensionHostObserver:
  void OnExtensionHostDestroyed(ExtensionHost* host) override;

  // Sends a reply asynchronously to the extension.
  void SendResponseToExtension(ResponseValue response_value);

  // Observes the newly-created document to wait for it to be ready.
  base::ScopedObservation<ExtensionHost, ExtensionHostObserver> host_observer_{
      this};
};

class OffscreenHasDocumentFunction : public ExtensionFunction,
                                     public ExtensionHostObserver {
 public:
  // Note: We use `UNKNOWN` as the histogram value here because we are unlikely
  // to ship this API to stable.
  DECLARE_EXTENSION_FUNCTION("offscreen.hasDocument", UNKNOWN)

  OffscreenHasDocumentFunction();
  OffscreenHasDocumentFunction(const OffscreenHasDocumentFunction&) = delete;
  OffscreenHasDocumentFunction& operator=(const OffscreenHasDocumentFunction&) =
      delete;

  // ExtensionFunction:
  ResponseAction Run() override;

 private:
  ~OffscreenHasDocumentFunction() override;
};

}  // namespace extensions

#endif  // EXTENSIONS_BROWSER_API_OFFSCREEN_OFFSCREEN_API_H_