| 
									
										
										
										
											2020-10-09 12:50:46 -04:00
										 |  |  | // Copyright (c) 2020 Samuel Maddock <sam@samuelmaddock.com>.
 | 
					
						
							|  |  |  | // Use of this source code is governed by the MIT license that can be
 | 
					
						
							|  |  |  | // found in the LICENSE file.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "shell/browser/api/electron_api_web_frame_main.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <string>
 | 
					
						
							|  |  |  | #include <unordered_map>
 | 
					
						
							|  |  |  | #include <utility>
 | 
					
						
							|  |  |  | #include <vector>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "base/logging.h"
 | 
					
						
							| 
									
										
										
										
											2021-08-18 14:23:41 -04:00
										 |  |  | #include "base/no_destructor.h"
 | 
					
						
							| 
									
										
										
										
											2022-08-17 13:08:13 +09:00
										 |  |  | #include "content/browser/renderer_host/render_frame_host_impl.h"  // nogncheck
 | 
					
						
							| 
									
										
										
										
											2020-10-09 12:50:46 -04:00
										 |  |  | #include "content/public/browser/render_frame_host.h"
 | 
					
						
							| 
									
										
										
										
											2022-08-17 13:08:13 +09:00
										 |  |  | #include "content/public/common/isolated_world_ids.h"
 | 
					
						
							| 
									
										
										
										
											2021-01-15 01:00:37 +01:00
										 |  |  | #include "electron/shell/common/api/api.mojom.h"
 | 
					
						
							| 
									
										
										
										
											2020-10-09 12:50:46 -04:00
										 |  |  | #include "gin/object_template_builder.h"
 | 
					
						
							| 
									
										
										
										
											2021-02-09 12:16:21 -08:00
										 |  |  | #include "services/service_manager/public/cpp/interface_provider.h"
 | 
					
						
							| 
									
										
										
										
											2021-01-15 01:00:37 +01:00
										 |  |  | #include "shell/browser/api/message_port.h"
 | 
					
						
							| 
									
										
										
										
											2020-10-09 12:50:46 -04:00
										 |  |  | #include "shell/browser/browser.h"
 | 
					
						
							|  |  |  | #include "shell/browser/javascript_environment.h"
 | 
					
						
							| 
									
										
										
										
											2021-01-15 01:00:37 +01:00
										 |  |  | #include "shell/common/gin_converters/blink_converter.h"
 | 
					
						
							| 
									
										
										
										
											2020-10-09 12:50:46 -04:00
										 |  |  | #include "shell/common/gin_converters/frame_converter.h"
 | 
					
						
							|  |  |  | #include "shell/common/gin_converters/gurl_converter.h"
 | 
					
						
							|  |  |  | #include "shell/common/gin_converters/value_converter.h"
 | 
					
						
							|  |  |  | #include "shell/common/gin_helper/dictionary.h"
 | 
					
						
							|  |  |  | #include "shell/common/gin_helper/error_thrower.h"
 | 
					
						
							|  |  |  | #include "shell/common/gin_helper/object_template_builder.h"
 | 
					
						
							|  |  |  | #include "shell/common/gin_helper/promise.h"
 | 
					
						
							|  |  |  | #include "shell/common/node_includes.h"
 | 
					
						
							| 
									
										
										
										
											2021-01-15 01:00:37 +01:00
										 |  |  | #include "shell/common/v8_value_serializer.h"
 | 
					
						
							| 
									
										
										
										
											2020-10-09 12:50:46 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-22 12:00:58 -04:00
										 |  |  | namespace gin { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | template <> | 
					
						
							|  |  |  | struct Converter<blink::mojom::PageVisibilityState> { | 
					
						
							|  |  |  |   static v8::Local<v8::Value> ToV8(v8::Isolate* isolate, | 
					
						
							|  |  |  |                                    blink::mojom::PageVisibilityState val) { | 
					
						
							|  |  |  |     std::string visibility; | 
					
						
							|  |  |  |     switch (val) { | 
					
						
							|  |  |  |       case blink::mojom::PageVisibilityState::kVisible: | 
					
						
							|  |  |  |         visibility = "visible"; | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |       case blink::mojom::PageVisibilityState::kHidden: | 
					
						
							|  |  |  |       case blink::mojom::PageVisibilityState::kHiddenButPainting: | 
					
						
							|  |  |  |         visibility = "hidden"; | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return gin::ConvertToV8(isolate, visibility); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | }  // namespace gin
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-29 12:55:47 -07:00
										 |  |  | namespace electron::api { | 
					
						
							| 
									
										
										
										
											2020-10-09 12:50:46 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-18 14:23:41 -04:00
										 |  |  | typedef std::unordered_map<int, WebFrameMain*> WebFrameMainIdMap; | 
					
						
							| 
									
										
										
										
											2020-10-09 12:50:46 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-18 14:23:41 -04:00
										 |  |  | WebFrameMainIdMap& GetWebFrameMainMap() { | 
					
						
							|  |  |  |   static base::NoDestructor<WebFrameMainIdMap> instance; | 
					
						
							|  |  |  |   return *instance; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // static
 | 
					
						
							|  |  |  | WebFrameMain* WebFrameMain::FromFrameTreeNodeId(int frame_tree_node_id) { | 
					
						
							|  |  |  |   WebFrameMainIdMap& frame_map = GetWebFrameMainMap(); | 
					
						
							|  |  |  |   auto iter = frame_map.find(frame_tree_node_id); | 
					
						
							| 
									
										
										
										
											2020-10-09 12:50:46 -04:00
										 |  |  |   auto* web_frame = iter == frame_map.end() ? nullptr : iter->second; | 
					
						
							|  |  |  |   return web_frame; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-18 14:23:41 -04:00
										 |  |  | // static
 | 
					
						
							|  |  |  | WebFrameMain* WebFrameMain::FromRenderFrameHost(content::RenderFrameHost* rfh) { | 
					
						
							| 
									
										
										
										
											2024-03-14 09:50:52 +01:00
										 |  |  |   if (!rfh) | 
					
						
							|  |  |  |     return nullptr; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // TODO(codebytere): remove after refactoring away from FrameTreeNodeId as map
 | 
					
						
							|  |  |  |   // key.
 | 
					
						
							|  |  |  |   auto* ftn = | 
					
						
							|  |  |  |       static_cast<content::RenderFrameHostImpl*>(rfh)->frame_tree_node(); | 
					
						
							|  |  |  |   if (!ftn) | 
					
						
							|  |  |  |     return nullptr; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return FromFrameTreeNodeId(rfh->GetFrameTreeNodeId()); | 
					
						
							| 
									
										
										
										
											2021-08-18 14:23:41 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-09 12:50:46 -04:00
										 |  |  | gin::WrapperInfo WebFrameMain::kWrapperInfo = {gin::kEmbedderNativeGin}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-18 14:23:41 -04:00
										 |  |  | WebFrameMain::WebFrameMain(content::RenderFrameHost* rfh) | 
					
						
							|  |  |  |     : frame_tree_node_id_(rfh->GetFrameTreeNodeId()), render_frame_(rfh) { | 
					
						
							|  |  |  |   GetWebFrameMainMap().emplace(frame_tree_node_id_, this); | 
					
						
							| 
									
										
										
										
											2020-10-09 12:50:46 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | WebFrameMain::~WebFrameMain() { | 
					
						
							| 
									
										
										
										
											2021-08-18 14:23:41 -04:00
										 |  |  |   Destroyed(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void WebFrameMain::Destroyed() { | 
					
						
							| 
									
										
										
										
											2020-10-09 12:50:46 -04:00
										 |  |  |   MarkRenderFrameDisposed(); | 
					
						
							| 
									
										
										
										
											2021-08-18 14:23:41 -04:00
										 |  |  |   GetWebFrameMainMap().erase(frame_tree_node_id_); | 
					
						
							|  |  |  |   Unpin(); | 
					
						
							| 
									
										
										
										
											2020-10-09 12:50:46 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void WebFrameMain::MarkRenderFrameDisposed() { | 
					
						
							| 
									
										
										
										
											2021-08-18 14:23:41 -04:00
										 |  |  |   render_frame_ = nullptr; | 
					
						
							| 
									
										
										
										
											2020-10-09 12:50:46 -04:00
										 |  |  |   render_frame_disposed_ = true; | 
					
						
							| 
									
										
										
										
											2022-05-19 14:34:58 -04:00
										 |  |  |   TeardownMojoConnection(); | 
					
						
							| 
									
										
										
										
											2020-10-09 12:50:46 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-18 14:23:41 -04:00
										 |  |  | void WebFrameMain::UpdateRenderFrameHost(content::RenderFrameHost* rfh) { | 
					
						
							|  |  |  |   // Should only be called when swapping frames.
 | 
					
						
							| 
									
										
										
										
											2021-10-14 09:44:44 -07:00
										 |  |  |   render_frame_disposed_ = false; | 
					
						
							| 
									
										
										
										
											2021-08-18 14:23:41 -04:00
										 |  |  |   render_frame_ = rfh; | 
					
						
							| 
									
										
										
										
											2022-05-19 14:34:58 -04:00
										 |  |  |   TeardownMojoConnection(); | 
					
						
							|  |  |  |   MaybeSetupMojoConnection(); | 
					
						
							| 
									
										
										
										
											2021-08-18 14:23:41 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-09 12:50:46 -04:00
										 |  |  | bool WebFrameMain::CheckRenderFrame() const { | 
					
						
							|  |  |  |   if (render_frame_disposed_) { | 
					
						
							|  |  |  |     v8::Isolate* isolate = JavascriptEnvironment::GetIsolate(); | 
					
						
							|  |  |  |     v8::HandleScope scope(isolate); | 
					
						
							|  |  |  |     gin_helper::ErrorThrower(isolate).ThrowError( | 
					
						
							|  |  |  |         "Render frame was disposed before WebFrameMain could be accessed"); | 
					
						
							|  |  |  |     return false; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   return true; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | v8::Local<v8::Promise> WebFrameMain::ExecuteJavaScript( | 
					
						
							|  |  |  |     gin::Arguments* args, | 
					
						
							| 
									
										
										
										
											2021-03-16 12:18:45 -04:00
										 |  |  |     const std::u16string& code) { | 
					
						
							| 
									
										
										
										
											2020-10-09 12:50:46 -04:00
										 |  |  |   gin_helper::Promise<base::Value> promise(args->isolate()); | 
					
						
							|  |  |  |   v8::Local<v8::Promise> handle = promise.GetHandle(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // Optional userGesture parameter
 | 
					
						
							|  |  |  |   bool user_gesture; | 
					
						
							|  |  |  |   if (!args->PeekNext().IsEmpty()) { | 
					
						
							|  |  |  |     if (args->PeekNext()->IsBoolean()) { | 
					
						
							|  |  |  |       args->GetNext(&user_gesture); | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |       args->ThrowTypeError("userGesture must be a boolean"); | 
					
						
							|  |  |  |       return handle; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } else { | 
					
						
							|  |  |  |     user_gesture = false; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (render_frame_disposed_) { | 
					
						
							|  |  |  |     promise.RejectWithErrorMessage( | 
					
						
							|  |  |  |         "Render frame was disposed before WebFrameMain could be accessed"); | 
					
						
							|  |  |  |     return handle; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-17 13:08:13 +09:00
										 |  |  |   static_cast<content::RenderFrameHostImpl*>(render_frame_) | 
					
						
							|  |  |  |       ->ExecuteJavaScriptForTests( | 
					
						
							|  |  |  |           code, user_gesture, true /* resolve_promises */, | 
					
						
							|  |  |  |           content::ISOLATED_WORLD_ID_GLOBAL, | 
					
						
							|  |  |  |           base::BindOnce( | 
					
						
							|  |  |  |               [](gin_helper::Promise<base::Value> promise, | 
					
						
							|  |  |  |                  blink::mojom::JavaScriptExecutionResultType type, | 
					
						
							|  |  |  |                  base::Value value) { | 
					
						
							|  |  |  |                 if (type == | 
					
						
							|  |  |  |                     blink::mojom::JavaScriptExecutionResultType::kSuccess) { | 
					
						
							|  |  |  |                   promise.Resolve(value); | 
					
						
							|  |  |  |                 } else { | 
					
						
							|  |  |  |                   v8::Isolate* isolate = JavascriptEnvironment::GetIsolate(); | 
					
						
							|  |  |  |                   v8::HandleScope scope(isolate); | 
					
						
							|  |  |  |                   promise.Reject(gin::ConvertToV8(isolate, value)); | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |               }, | 
					
						
							|  |  |  |               std::move(promise))); | 
					
						
							| 
									
										
										
										
											2020-10-09 12:50:46 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |   return handle; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-26 22:46:09 +01:00
										 |  |  | bool WebFrameMain::Reload() { | 
					
						
							| 
									
										
										
										
											2020-10-09 12:50:46 -04:00
										 |  |  |   if (!CheckRenderFrame()) | 
					
						
							|  |  |  |     return false; | 
					
						
							|  |  |  |   return render_frame_->Reload(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-15 01:00:37 +01:00
										 |  |  | void WebFrameMain::Send(v8::Isolate* isolate, | 
					
						
							|  |  |  |                         bool internal, | 
					
						
							|  |  |  |                         const std::string& channel, | 
					
						
							|  |  |  |                         v8::Local<v8::Value> args) { | 
					
						
							|  |  |  |   blink::CloneableMessage message; | 
					
						
							|  |  |  |   if (!gin::ConvertFromV8(isolate, args, &message)) { | 
					
						
							|  |  |  |     isolate->ThrowException(v8::Exception::Error( | 
					
						
							|  |  |  |         gin::StringToV8(isolate, "Failed to serialize arguments"))); | 
					
						
							|  |  |  |     return; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (!CheckRenderFrame()) | 
					
						
							|  |  |  |     return; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-28 16:29:27 +02:00
										 |  |  |   GetRendererApi()->Message(internal, channel, std::move(message)); | 
					
						
							| 
									
										
										
										
											2021-02-09 12:16:21 -08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const mojo::Remote<mojom::ElectronRenderer>& WebFrameMain::GetRendererApi() { | 
					
						
							| 
									
										
										
										
											2022-05-19 14:34:58 -04:00
										 |  |  |   MaybeSetupMojoConnection(); | 
					
						
							|  |  |  |   return renderer_api_; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void WebFrameMain::MaybeSetupMojoConnection() { | 
					
						
							| 
									
										
										
										
											2022-06-02 20:23:01 -04:00
										 |  |  |   if (render_frame_disposed_) { | 
					
						
							|  |  |  |     // RFH may not be set yet if called between when a new RFH is created and
 | 
					
						
							|  |  |  |     // before it's been swapped with an old RFH.
 | 
					
						
							|  |  |  |     LOG(INFO) << "Attempt to setup WebFrameMain connection while render frame " | 
					
						
							|  |  |  |                  "is disposed"; | 
					
						
							|  |  |  |     return; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-09 12:16:21 -08:00
										 |  |  |   if (!renderer_api_) { | 
					
						
							|  |  |  |     pending_receiver_ = renderer_api_.BindNewPipeAndPassReceiver(); | 
					
						
							|  |  |  |     renderer_api_.set_disconnect_handler(base::BindOnce( | 
					
						
							|  |  |  |         &WebFrameMain::OnRendererConnectionError, weak_factory_.GetWeakPtr())); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2022-06-01 16:03:04 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |   DCHECK(render_frame_); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-19 14:34:58 -04:00
										 |  |  |   // Wait for RenderFrame to be created in renderer before accessing remote.
 | 
					
						
							| 
									
										
										
										
											2022-06-01 16:03:04 -07:00
										 |  |  |   if (pending_receiver_ && render_frame_ && | 
					
						
							| 
									
										
										
										
											2022-06-27 15:50:08 -05:00
										 |  |  |       render_frame_->IsRenderFrameLive()) { | 
					
						
							| 
									
										
										
										
											2022-05-19 14:34:58 -04:00
										 |  |  |     render_frame_->GetRemoteInterfaces()->GetInterface( | 
					
						
							|  |  |  |         std::move(pending_receiver_)); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2021-02-09 12:16:21 -08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-19 14:34:58 -04:00
										 |  |  | void WebFrameMain::TeardownMojoConnection() { | 
					
						
							| 
									
										
										
										
											2021-02-09 12:16:21 -08:00
										 |  |  |   renderer_api_.reset(); | 
					
						
							| 
									
										
										
										
											2022-05-19 14:34:58 -04:00
										 |  |  |   pending_receiver_.reset(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void WebFrameMain::OnRendererConnectionError() { | 
					
						
							|  |  |  |   TeardownMojoConnection(); | 
					
						
							| 
									
										
										
										
											2021-01-15 01:00:37 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void WebFrameMain::PostMessage(v8::Isolate* isolate, | 
					
						
							|  |  |  |                                const std::string& channel, | 
					
						
							|  |  |  |                                v8::Local<v8::Value> message_value, | 
					
						
							| 
									
										
										
										
											2024-01-10 23:23:35 +01:00
										 |  |  |                                std::optional<v8::Local<v8::Value>> transfer) { | 
					
						
							| 
									
										
										
										
											2021-01-15 01:00:37 +01:00
										 |  |  |   blink::TransferableMessage transferable_message; | 
					
						
							|  |  |  |   if (!electron::SerializeV8Value(isolate, message_value, | 
					
						
							|  |  |  |                                   &transferable_message)) { | 
					
						
							|  |  |  |     // SerializeV8Value sets an exception.
 | 
					
						
							|  |  |  |     return; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   std::vector<gin::Handle<MessagePort>> wrapped_ports; | 
					
						
							| 
									
										
										
										
											2022-01-13 14:52:48 +01:00
										 |  |  |   if (transfer && !transfer.value()->IsUndefined()) { | 
					
						
							| 
									
										
										
										
											2021-01-15 01:00:37 +01:00
										 |  |  |     if (!gin::ConvertFromV8(isolate, *transfer, &wrapped_ports)) { | 
					
						
							|  |  |  |       isolate->ThrowException(v8::Exception::Error( | 
					
						
							|  |  |  |           gin::StringToV8(isolate, "Invalid value for transfer"))); | 
					
						
							|  |  |  |       return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   bool threw_exception = false; | 
					
						
							|  |  |  |   transferable_message.ports = | 
					
						
							|  |  |  |       MessagePort::DisentanglePorts(isolate, wrapped_ports, &threw_exception); | 
					
						
							|  |  |  |   if (threw_exception) | 
					
						
							|  |  |  |     return; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (!CheckRenderFrame()) | 
					
						
							|  |  |  |     return; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-09 12:16:21 -08:00
										 |  |  |   GetRendererApi()->ReceivePostMessage(channel, | 
					
						
							|  |  |  |                                        std::move(transferable_message)); | 
					
						
							| 
									
										
										
										
											2021-01-15 01:00:37 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-26 22:46:09 +01:00
										 |  |  | int WebFrameMain::FrameTreeNodeID() const { | 
					
						
							| 
									
										
										
										
											2021-08-18 14:23:41 -04:00
										 |  |  |   return frame_tree_node_id_; | 
					
						
							| 
									
										
										
										
											2020-10-09 12:50:46 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-26 22:46:09 +01:00
										 |  |  | std::string WebFrameMain::Name() const { | 
					
						
							| 
									
										
										
										
											2020-10-26 04:03:34 +01:00
										 |  |  |   if (!CheckRenderFrame()) | 
					
						
							|  |  |  |     return std::string(); | 
					
						
							|  |  |  |   return render_frame_->GetFrameName(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-26 22:46:09 +01:00
										 |  |  | base::ProcessId WebFrameMain::OSProcessID() const { | 
					
						
							| 
									
										
										
										
											2020-10-26 04:03:34 +01:00
										 |  |  |   if (!CheckRenderFrame()) | 
					
						
							|  |  |  |     return -1; | 
					
						
							|  |  |  |   base::ProcessHandle process_handle = | 
					
						
							|  |  |  |       render_frame_->GetProcess()->GetProcess().Handle(); | 
					
						
							|  |  |  |   return base::GetProcId(process_handle); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-26 22:46:09 +01:00
										 |  |  | int WebFrameMain::ProcessID() const { | 
					
						
							| 
									
										
										
										
											2020-10-09 12:50:46 -04:00
										 |  |  |   if (!CheckRenderFrame()) | 
					
						
							|  |  |  |     return -1; | 
					
						
							|  |  |  |   return render_frame_->GetProcess()->GetID(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-26 22:46:09 +01:00
										 |  |  | int WebFrameMain::RoutingID() const { | 
					
						
							| 
									
										
										
										
											2020-10-09 12:50:46 -04:00
										 |  |  |   if (!CheckRenderFrame()) | 
					
						
							|  |  |  |     return -1; | 
					
						
							|  |  |  |   return render_frame_->GetRoutingID(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-26 22:46:09 +01:00
										 |  |  | GURL WebFrameMain::URL() const { | 
					
						
							| 
									
										
										
										
											2020-10-09 12:50:46 -04:00
										 |  |  |   if (!CheckRenderFrame()) | 
					
						
							|  |  |  |     return GURL::EmptyGURL(); | 
					
						
							|  |  |  |   return render_frame_->GetLastCommittedURL(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-31 17:40:57 -07:00
										 |  |  | std::string WebFrameMain::Origin() const { | 
					
						
							|  |  |  |   if (!CheckRenderFrame()) | 
					
						
							|  |  |  |     return std::string(); | 
					
						
							|  |  |  |   return render_frame_->GetLastCommittedOrigin().Serialize(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-22 12:00:58 -04:00
										 |  |  | blink::mojom::PageVisibilityState WebFrameMain::VisibilityState() const { | 
					
						
							|  |  |  |   if (!CheckRenderFrame()) | 
					
						
							|  |  |  |     return blink::mojom::PageVisibilityState::kHidden; | 
					
						
							|  |  |  |   return render_frame_->GetVisibilityState(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-26 22:46:09 +01:00
										 |  |  | content::RenderFrameHost* WebFrameMain::Top() const { | 
					
						
							| 
									
										
										
										
											2020-10-09 12:50:46 -04:00
										 |  |  |   if (!CheckRenderFrame()) | 
					
						
							|  |  |  |     return nullptr; | 
					
						
							|  |  |  |   return render_frame_->GetMainFrame(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-26 22:46:09 +01:00
										 |  |  | content::RenderFrameHost* WebFrameMain::Parent() const { | 
					
						
							| 
									
										
										
										
											2020-10-09 12:50:46 -04:00
										 |  |  |   if (!CheckRenderFrame()) | 
					
						
							|  |  |  |     return nullptr; | 
					
						
							|  |  |  |   return render_frame_->GetParent(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-26 22:46:09 +01:00
										 |  |  | std::vector<content::RenderFrameHost*> WebFrameMain::Frames() const { | 
					
						
							| 
									
										
										
										
											2020-10-09 12:50:46 -04:00
										 |  |  |   std::vector<content::RenderFrameHost*> frame_hosts; | 
					
						
							|  |  |  |   if (!CheckRenderFrame()) | 
					
						
							|  |  |  |     return frame_hosts; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-07 09:46:37 +02:00
										 |  |  |   render_frame_->ForEachRenderFrameHost( | 
					
						
							|  |  |  |       [&frame_hosts, this](content::RenderFrameHost* rfh) { | 
					
						
							|  |  |  |         if (rfh->GetParent() == render_frame_) | 
					
						
							|  |  |  |           frame_hosts.push_back(rfh); | 
					
						
							|  |  |  |       }); | 
					
						
							| 
									
										
										
										
											2020-10-09 12:50:46 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |   return frame_hosts; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-26 22:46:09 +01:00
										 |  |  | std::vector<content::RenderFrameHost*> WebFrameMain::FramesInSubtree() const { | 
					
						
							| 
									
										
										
										
											2020-10-09 12:50:46 -04:00
										 |  |  |   std::vector<content::RenderFrameHost*> frame_hosts; | 
					
						
							|  |  |  |   if (!CheckRenderFrame()) | 
					
						
							|  |  |  |     return frame_hosts; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-07 09:46:37 +02:00
										 |  |  |   render_frame_->ForEachRenderFrameHost( | 
					
						
							|  |  |  |       [&frame_hosts](content::RenderFrameHost* rfh) { | 
					
						
							|  |  |  |         frame_hosts.push_back(rfh); | 
					
						
							|  |  |  |       }); | 
					
						
							| 
									
										
										
										
											2020-10-09 12:50:46 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |   return frame_hosts; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-01 18:21:15 -04:00
										 |  |  | void WebFrameMain::DOMContentLoaded() { | 
					
						
							|  |  |  |   Emit("dom-ready"); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-15 01:00:37 +01:00
										 |  |  | // static
 | 
					
						
							|  |  |  | gin::Handle<WebFrameMain> WebFrameMain::New(v8::Isolate* isolate) { | 
					
						
							|  |  |  |   return gin::Handle<WebFrameMain>(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-09 12:50:46 -04:00
										 |  |  | // static
 | 
					
						
							|  |  |  | gin::Handle<WebFrameMain> WebFrameMain::From(v8::Isolate* isolate, | 
					
						
							|  |  |  |                                              content::RenderFrameHost* rfh) { | 
					
						
							| 
									
										
										
										
											2024-03-14 09:50:52 +01:00
										 |  |  |   if (!rfh) | 
					
						
							| 
									
										
										
										
											2020-10-09 12:50:46 -04:00
										 |  |  |     return gin::Handle<WebFrameMain>(); | 
					
						
							| 
									
										
										
										
											2024-03-14 09:50:52 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-09 12:50:46 -04:00
										 |  |  |   auto* web_frame = FromRenderFrameHost(rfh); | 
					
						
							| 
									
										
										
										
											2021-02-08 14:30:18 -05:00
										 |  |  |   if (web_frame) | 
					
						
							|  |  |  |     return gin::CreateHandle(isolate, web_frame); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   auto handle = gin::CreateHandle(isolate, new WebFrameMain(rfh)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // Prevent garbage collection of frame until it has been deleted internally.
 | 
					
						
							|  |  |  |   handle->Pin(isolate); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-09 12:50:46 -04:00
										 |  |  |   return handle; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-03 16:55:12 -07:00
										 |  |  | // static
 | 
					
						
							|  |  |  | gin::Handle<WebFrameMain> WebFrameMain::FromOrNull( | 
					
						
							|  |  |  |     v8::Isolate* isolate, | 
					
						
							|  |  |  |     content::RenderFrameHost* rfh) { | 
					
						
							| 
									
										
										
										
											2024-03-14 09:50:52 +01:00
										 |  |  |   if (!rfh) | 
					
						
							| 
									
										
										
										
											2022-08-03 16:55:12 -07:00
										 |  |  |     return gin::Handle<WebFrameMain>(); | 
					
						
							| 
									
										
										
										
											2024-03-14 09:50:52 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-03 16:55:12 -07:00
										 |  |  |   auto* web_frame = FromRenderFrameHost(rfh); | 
					
						
							| 
									
										
										
										
											2024-03-14 09:50:52 +01:00
										 |  |  |   if (!web_frame) | 
					
						
							|  |  |  |     return gin::Handle<WebFrameMain>(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return gin::CreateHandle(isolate, web_frame); | 
					
						
							| 
									
										
										
										
											2022-08-03 16:55:12 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-15 01:00:37 +01:00
										 |  |  | // static
 | 
					
						
							| 
									
										
										
										
											2023-02-06 12:59:49 -08:00
										 |  |  | void WebFrameMain::FillObjectTemplate(v8::Isolate* isolate, | 
					
						
							|  |  |  |                                       v8::Local<v8::ObjectTemplate> templ) { | 
					
						
							|  |  |  |   gin_helper::ObjectTemplateBuilder(isolate, templ) | 
					
						
							| 
									
										
										
										
											2020-10-09 12:50:46 -04:00
										 |  |  |       .SetMethod("executeJavaScript", &WebFrameMain::ExecuteJavaScript) | 
					
						
							|  |  |  |       .SetMethod("reload", &WebFrameMain::Reload) | 
					
						
							| 
									
										
										
										
											2021-01-15 01:00:37 +01:00
										 |  |  |       .SetMethod("_send", &WebFrameMain::Send) | 
					
						
							|  |  |  |       .SetMethod("_postMessage", &WebFrameMain::PostMessage) | 
					
						
							| 
									
										
										
										
											2020-10-09 12:50:46 -04:00
										 |  |  |       .SetProperty("frameTreeNodeId", &WebFrameMain::FrameTreeNodeID) | 
					
						
							| 
									
										
										
										
											2020-10-26 04:03:34 +01:00
										 |  |  |       .SetProperty("name", &WebFrameMain::Name) | 
					
						
							|  |  |  |       .SetProperty("osProcessId", &WebFrameMain::OSProcessID) | 
					
						
							| 
									
										
										
										
											2020-10-09 12:50:46 -04:00
										 |  |  |       .SetProperty("processId", &WebFrameMain::ProcessID) | 
					
						
							|  |  |  |       .SetProperty("routingId", &WebFrameMain::RoutingID) | 
					
						
							|  |  |  |       .SetProperty("url", &WebFrameMain::URL) | 
					
						
							| 
									
										
										
										
											2022-08-31 17:40:57 -07:00
										 |  |  |       .SetProperty("origin", &WebFrameMain::Origin) | 
					
						
							| 
									
										
										
										
											2021-04-22 12:00:58 -04:00
										 |  |  |       .SetProperty("visibilityState", &WebFrameMain::VisibilityState) | 
					
						
							| 
									
										
										
										
											2020-10-09 12:50:46 -04:00
										 |  |  |       .SetProperty("top", &WebFrameMain::Top) | 
					
						
							|  |  |  |       .SetProperty("parent", &WebFrameMain::Parent) | 
					
						
							|  |  |  |       .SetProperty("frames", &WebFrameMain::Frames) | 
					
						
							| 
									
										
										
										
											2021-01-15 01:00:37 +01:00
										 |  |  |       .SetProperty("framesInSubtree", &WebFrameMain::FramesInSubtree) | 
					
						
							|  |  |  |       .Build(); | 
					
						
							| 
									
										
										
										
											2020-10-09 12:50:46 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const char* WebFrameMain::GetTypeName() { | 
					
						
							| 
									
										
										
										
											2023-07-10 11:49:20 +02:00
										 |  |  |   return GetClassName(); | 
					
						
							| 
									
										
										
										
											2020-10-09 12:50:46 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-29 12:55:47 -07:00
										 |  |  | }  // namespace electron::api
 | 
					
						
							| 
									
										
										
										
											2020-10-09 12:50:46 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | namespace { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | using electron::api::WebFrameMain; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | v8::Local<v8::Value> FromID(gin_helper::ErrorThrower thrower, | 
					
						
							|  |  |  |                             int render_process_id, | 
					
						
							|  |  |  |                             int render_frame_id) { | 
					
						
							|  |  |  |   if (!electron::Browser::Get()->is_ready()) { | 
					
						
							|  |  |  |     thrower.ThrowError("WebFrameMain is available only after app ready"); | 
					
						
							|  |  |  |     return v8::Null(thrower.isolate()); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-18 14:23:41 -04:00
										 |  |  |   auto* rfh = | 
					
						
							|  |  |  |       content::RenderFrameHost::FromID(render_process_id, render_frame_id); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return WebFrameMain::From(thrower.isolate(), rfh).ToV8(); | 
					
						
							| 
									
										
										
										
											2020-10-09 12:50:46 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-03 16:55:12 -07:00
										 |  |  | v8::Local<v8::Value> FromIDOrNull(gin_helper::ErrorThrower thrower, | 
					
						
							|  |  |  |                                   int render_process_id, | 
					
						
							|  |  |  |                                   int render_frame_id) { | 
					
						
							|  |  |  |   if (!electron::Browser::Get()->is_ready()) { | 
					
						
							|  |  |  |     thrower.ThrowError("WebFrameMain is available only after app ready"); | 
					
						
							|  |  |  |     return v8::Null(thrower.isolate()); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   auto* rfh = | 
					
						
							|  |  |  |       content::RenderFrameHost::FromID(render_process_id, render_frame_id); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return WebFrameMain::FromOrNull(thrower.isolate(), rfh).ToV8(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-09 12:50:46 -04:00
										 |  |  | void Initialize(v8::Local<v8::Object> exports, | 
					
						
							|  |  |  |                 v8::Local<v8::Value> unused, | 
					
						
							|  |  |  |                 v8::Local<v8::Context> context, | 
					
						
							|  |  |  |                 void* priv) { | 
					
						
							|  |  |  |   v8::Isolate* isolate = context->GetIsolate(); | 
					
						
							|  |  |  |   gin_helper::Dictionary dict(isolate, exports); | 
					
						
							| 
									
										
										
										
											2021-01-15 01:00:37 +01:00
										 |  |  |   dict.Set("WebFrameMain", WebFrameMain::GetConstructor(context)); | 
					
						
							| 
									
										
										
										
											2020-10-09 12:50:46 -04:00
										 |  |  |   dict.SetMethod("fromId", &FromID); | 
					
						
							| 
									
										
										
										
											2022-08-03 16:55:12 -07:00
										 |  |  |   dict.SetMethod("fromIdOrNull", &FromIDOrNull); | 
					
						
							| 
									
										
										
										
											2020-10-09 12:50:46 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | }  // namespace
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-09 02:31:38 +01:00
										 |  |  | NODE_LINKED_BINDING_CONTEXT_AWARE(electron_browser_web_frame_main, Initialize) |