// Copyright (c) 2020 Samuel Maddock . // Use of this source code is governed by the MIT license that can be // found in the LICENSE file. #ifndef SHELL_BROWSER_API_ELECTRON_API_WEB_FRAME_MAIN_H_ #define SHELL_BROWSER_API_ELECTRON_API_WEB_FRAME_MAIN_H_ #include #include #include "base/memory/weak_ptr.h" #include "base/process/process.h" #include "gin/handle.h" #include "gin/wrappable.h" #include "mojo/public/cpp/bindings/remote.h" #include "shell/common/gin_helper/constructible.h" #include "shell/common/gin_helper/pinnable.h" #include "third_party/blink/public/mojom/page/page_visibility_state.mojom-forward.h" class GURL; namespace content { class RenderFrameHost; } namespace gin { class Arguments; } namespace electron { namespace api { // Bindings for accessing frames from the main process. class WebFrameMain : public gin::Wrappable, public gin_helper::Pinnable, public gin_helper::Constructible { public: // Create a new WebFrameMain and return the V8 wrapper of it. static gin::Handle New(v8::Isolate* isolate); static gin::Handle FromID(v8::Isolate* isolate, int render_process_id, int render_frame_id); static gin::Handle From( v8::Isolate* isolate, content::RenderFrameHost* render_frame_host); // Called to mark any RenderFrameHost as disposed by any WebFrameMain that // may be holding a weak reference. static void RenderFrameDeleted(content::RenderFrameHost* rfh); static void RenderFrameCreated(content::RenderFrameHost* rfh); // Mark RenderFrameHost as disposed and to no longer access it. This can // occur upon frame navigation. void MarkRenderFrameDisposed(); const mojo::Remote& GetRendererApi(); // gin::Wrappable static gin::WrapperInfo kWrapperInfo; static v8::Local FillObjectTemplate( v8::Isolate*, v8::Local); const char* GetTypeName() override; protected: explicit WebFrameMain(content::RenderFrameHost* render_frame); ~WebFrameMain() override; private: // WebFrameMain can outlive its RenderFrameHost pointer so we need to check // whether its been disposed of prior to accessing it. bool CheckRenderFrame() const; void Connect(); v8::Local ExecuteJavaScript(gin::Arguments* args, const std::u16string& code); bool Reload(); void Send(v8::Isolate* isolate, bool internal, const std::string& channel, v8::Local args); void PostMessage(v8::Isolate* isolate, const std::string& channel, v8::Local message_value, absl::optional> transfer); int FrameTreeNodeID() const; std::string Name() const; base::ProcessId OSProcessID() const; int ProcessID() const; int RoutingID() const; GURL URL() const; blink::mojom::PageVisibilityState VisibilityState() const; content::RenderFrameHost* Top() const; content::RenderFrameHost* Parent() const; std::vector Frames() const; std::vector FramesInSubtree() const; void OnRendererConnectionError(); mojo::Remote renderer_api_; mojo::PendingReceiver pending_receiver_; content::RenderFrameHost* render_frame_ = nullptr; // Whether the RenderFrameHost has been removed and that it should no longer // be accessed. bool render_frame_disposed_ = false; base::WeakPtrFactory weak_factory_{this}; DISALLOW_COPY_AND_ASSIGN(WebFrameMain); }; } // namespace api } // namespace electron #endif // SHELL_BROWSER_API_ELECTRON_API_WEB_FRAME_MAIN_H_