extension_interaction_provider.h 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. // Copyright 2019 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #ifndef EXTENSIONS_RENDERER_EXTENSION_INTERACTION_PROVIDER_H_
  5. #define EXTENSIONS_RENDERER_EXTENSION_INTERACTION_PROVIDER_H_
  6. #include "extensions/renderer/bindings/interaction_provider.h"
  7. #include "v8/include/v8-forward.h"
  8. namespace extensions {
  9. // Provides user interaction related utilities specific to extensions system,
  10. // works for both RenderFrame based and Service Worker based extensions.
  11. class ExtensionInteractionProvider : public InteractionProvider {
  12. public:
  13. // Extension system specific implementation of token.
  14. // Can refer to a RenderFrame based extension token or Service Worker based
  15. // extension token.
  16. class Token : public InteractionProvider::Token {
  17. public:
  18. Token(const Token&) = delete;
  19. Token& operator=(const Token&) = delete;
  20. ~Token() override;
  21. bool is_for_service_worker() const { return is_for_service_worker_; }
  22. private:
  23. friend class ExtensionInteractionProvider;
  24. friend class TestInteractionProvider;
  25. Token(bool is_for_service_worker);
  26. bool is_for_service_worker_ = false;
  27. };
  28. // Extension system specific implementation of scope.
  29. class Scope : public InteractionProvider::Scope {
  30. public:
  31. Scope(const Scope&) = delete;
  32. Scope& operator=(const Scope&) = delete;
  33. ~Scope() override;
  34. // Creates a Scope for a Service Worker context, without token.
  35. static std::unique_ptr<Scope> ForWorker(v8::Local<v8::Context> v8_context);
  36. // Creates a scope from a |token|.
  37. static std::unique_ptr<Scope> ForToken(
  38. v8::Local<v8::Context> v8_context,
  39. std::unique_ptr<InteractionProvider::Token> token);
  40. private:
  41. Scope();
  42. // Increments and decrements Service Worker specific interaction counts.
  43. class ScopedWorkerInteraction {
  44. public:
  45. ScopedWorkerInteraction(v8::Local<v8::Context> v8_context,
  46. bool created_from_token);
  47. ~ScopedWorkerInteraction();
  48. private:
  49. v8::Local<v8::Context> v8_context_;
  50. bool created_from_token_ = false;
  51. };
  52. // Used for Service Worker based extension Contexts.
  53. std::unique_ptr<ScopedWorkerInteraction> worker_thread_interaction_;
  54. };
  55. ExtensionInteractionProvider();
  56. ExtensionInteractionProvider(const ExtensionInteractionProvider&) = delete;
  57. ExtensionInteractionProvider& operator=(const ExtensionInteractionProvider&) =
  58. delete;
  59. ~ExtensionInteractionProvider() override;
  60. // Returns true if |v8_context| has an active interaction.
  61. static bool HasActiveExtensionInteraction(v8::Local<v8::Context> v8_context);
  62. // InteractionProvider:
  63. std::unique_ptr<InteractionProvider::Token> GetCurrentToken(
  64. v8::Local<v8::Context> v8_context) const override;
  65. std::unique_ptr<InteractionProvider::Scope> CreateScopedInteraction(
  66. v8::Local<v8::Context> v8_context,
  67. std::unique_ptr<InteractionProvider::Token> token) const override;
  68. bool HasActiveInteraction(v8::Local<v8::Context> v8_context) const override;
  69. };
  70. } // namespace extensions
  71. #endif // EXTENSIONS_RENDERER_EXTENSION_INTERACTION_PROVIDER_H_