node_service.h 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. // Copyright (c) 2022 Microsoft, Inc.
  2. // Use of this source code is governed by the MIT license that can be
  3. // found in the LICENSE file.
  4. #ifndef ELECTRON_SHELL_SERVICES_NODE_NODE_SERVICE_H_
  5. #define ELECTRON_SHELL_SERVICES_NODE_NODE_SERVICE_H_
  6. #include <memory>
  7. #include "mojo/public/cpp/bindings/pending_receiver.h"
  8. #include "mojo/public/cpp/bindings/pending_remote.h"
  9. #include "mojo/public/cpp/bindings/receiver.h"
  10. #include "mojo/public/cpp/bindings/remote.h"
  11. #include "services/network/public/cpp/shared_url_loader_factory.h"
  12. #include "services/network/public/mojom/host_resolver.mojom.h"
  13. #include "services/network/public/mojom/url_loader_factory.mojom-forward.h"
  14. #include "shell/services/node/public/mojom/node_service.mojom.h"
  15. namespace node {
  16. class Environment;
  17. } // namespace node
  18. namespace electron {
  19. class ElectronBindings;
  20. class JavascriptEnvironment;
  21. class NodeBindings;
  22. class URLLoaderBundle {
  23. public:
  24. URLLoaderBundle();
  25. ~URLLoaderBundle();
  26. URLLoaderBundle(const URLLoaderBundle&) = delete;
  27. URLLoaderBundle& operator=(const URLLoaderBundle&) = delete;
  28. static URLLoaderBundle* GetInstance();
  29. void SetURLLoaderFactory(
  30. mojo::PendingRemote<network::mojom::URLLoaderFactory> factory,
  31. mojo::Remote<network::mojom::HostResolver> host_resolver,
  32. bool use_network_observer_from_url_loader_factory);
  33. scoped_refptr<network::SharedURLLoaderFactory> GetSharedURLLoaderFactory();
  34. network::mojom::HostResolver* GetHostResolver();
  35. bool ShouldUseNetworkObserverfromURLLoaderFactory() const;
  36. private:
  37. scoped_refptr<network::SharedURLLoaderFactory> factory_;
  38. mojo::Remote<network::mojom::HostResolver> host_resolver_;
  39. bool should_use_network_observer_from_url_loader_factory_ = false;
  40. };
  41. class NodeService : public node::mojom::NodeService {
  42. public:
  43. explicit NodeService(
  44. mojo::PendingReceiver<node::mojom::NodeService> receiver);
  45. ~NodeService() override;
  46. NodeService(const NodeService&) = delete;
  47. NodeService& operator=(const NodeService&) = delete;
  48. // mojom::NodeService implementation:
  49. void Initialize(node::mojom::NodeServiceParamsPtr params,
  50. mojo::PendingRemote<node::mojom::NodeServiceClient>
  51. client_pending_remote) override;
  52. private:
  53. // This needs to be initialized first so that it can be destroyed last
  54. // after the node::Environment is destroyed. This ensures that if
  55. // there are crashes in the node::Environment destructor, they
  56. // will be propagated to the exit handler.
  57. mojo::Receiver<node::mojom::NodeService> receiver_{this};
  58. bool node_env_stopped_ = false;
  59. const std::unique_ptr<NodeBindings> node_bindings_;
  60. // depends-on: node_bindings_'s uv_loop
  61. const std::unique_ptr<ElectronBindings> electron_bindings_;
  62. // depends-on: node_bindings_'s uv_loop
  63. std::unique_ptr<JavascriptEnvironment> js_env_;
  64. // depends-on: js_env_'s isolate
  65. std::shared_ptr<node::Environment> node_env_;
  66. };
  67. } // namespace electron
  68. #endif // ELECTRON_SHELL_SERVICES_NODE_NODE_SERVICE_H_