| 
									
										
										
										
											2016-08-19 08:47:32 -03:00
										 |  |  | // Copyright (c) 2016 GitHub, Inc.
 | 
					
						
							|  |  |  | // Use of this source code is governed by the MIT license that can be
 | 
					
						
							|  |  |  | // found in the LICENSE file.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "atom/renderer/atom_sandboxed_renderer_client.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-21 07:30:21 -03:00
										 |  |  | #include "atom/common/api/api_messages.h"
 | 
					
						
							| 
									
										
										
										
											2019-03-18 12:37:06 -07:00
										 |  |  | #include "atom/common/api/electron_bindings.h"
 | 
					
						
							| 
									
										
										
										
											2018-10-24 12:49:10 +02:00
										 |  |  | #include "atom/common/application_info.h"
 | 
					
						
							| 
									
										
										
										
											2016-08-21 07:30:21 -03:00
										 |  |  | #include "atom/common/native_mate_converters/string16_converter.h"
 | 
					
						
							|  |  |  | #include "atom/common/native_mate_converters/value_converter.h"
 | 
					
						
							| 
									
										
										
										
											2018-01-06 07:58:24 -08:00
										 |  |  | #include "atom/common/node_bindings.h"
 | 
					
						
							| 
									
										
										
										
											2019-03-11 17:13:43 -07:00
										 |  |  | #include "atom/common/node_includes.h"
 | 
					
						
							| 
									
										
										
										
											2016-08-21 07:30:21 -03:00
										 |  |  | #include "atom/common/options_switches.h"
 | 
					
						
							| 
									
										
										
										
											2018-03-09 15:01:09 +05:30
										 |  |  | #include "atom/renderer/atom_render_frame_observer.h"
 | 
					
						
							| 
									
										
										
										
											2018-07-30 03:13:42 +02:00
										 |  |  | #include "base/base_paths.h"
 | 
					
						
							| 
									
										
										
										
											2016-08-21 07:30:21 -03:00
										 |  |  | #include "base/command_line.h"
 | 
					
						
							| 
									
										
										
										
											2018-03-07 08:40:00 -08:00
										 |  |  | #include "base/files/file_path.h"
 | 
					
						
							| 
									
										
										
										
											2018-07-30 03:13:42 +02:00
										 |  |  | #include "base/path_service.h"
 | 
					
						
							| 
									
										
										
										
											2018-08-21 20:05:45 +02:00
										 |  |  | #include "base/process/process_handle.h"
 | 
					
						
							| 
									
										
										
										
											2016-08-21 07:30:21 -03:00
										 |  |  | #include "content/public/renderer/render_frame.h"
 | 
					
						
							| 
									
										
										
										
											2018-11-29 07:25:03 +05:30
										 |  |  | #include "gin/converter.h"
 | 
					
						
							| 
									
										
										
										
											2017-02-20 10:59:39 -03:00
										 |  |  | #include "native_mate/dictionary.h"
 | 
					
						
							| 
									
										
										
										
											2018-07-20 18:08:18 +02:00
										 |  |  | #include "third_party/blink/public/web/blink.h"
 | 
					
						
							| 
									
										
										
										
											2018-09-19 13:10:26 +02:00
										 |  |  | #include "third_party/blink/public/web/web_document.h"
 | 
					
						
							| 
									
										
										
										
											2019-01-12 06:30:43 +05:30
										 |  |  | #include "third_party/electron_node/src/node_binding.h"
 | 
					
						
							|  |  |  | #include "third_party/electron_node/src/node_native_module.h"
 | 
					
						
							| 
									
										
										
										
											2017-04-27 16:56:47 +09:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-19 08:47:32 -03:00
										 |  |  | namespace atom { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-21 07:30:21 -03:00
										 |  |  | namespace { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-02 15:38:16 -07:00
										 |  |  | const char kLifecycleKey[] = "lifecycle"; | 
					
						
							| 
									
										
										
										
											2018-09-12 19:25:56 -05:00
										 |  |  | const char kModuleCacheKey[] = "native-module-cache"; | 
					
						
							| 
									
										
										
										
											2017-02-20 10:59:39 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-22 00:15:57 -07:00
										 |  |  | bool IsDevTools(content::RenderFrame* render_frame) { | 
					
						
							| 
									
										
										
										
											2018-04-17 21:55:30 -04:00
										 |  |  |   return render_frame->GetWebFrame()->GetDocument().Url().ProtocolIs( | 
					
						
							| 
									
										
										
										
											2019-05-17 15:37:09 -07:00
										 |  |  |       "devtools"); | 
					
						
							| 
									
										
										
										
											2018-03-22 00:15:57 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-22 04:56:58 +11:00
										 |  |  | bool IsDevToolsExtension(content::RenderFrame* render_frame) { | 
					
						
							|  |  |  |   return render_frame->GetWebFrame()->GetDocument().Url().ProtocolIs( | 
					
						
							|  |  |  |       "chrome-extension"); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-20 10:59:39 -03:00
										 |  |  | v8::Local<v8::Object> GetModuleCache(v8::Isolate* isolate) { | 
					
						
							| 
									
										
										
										
											2019-04-20 13:20:37 -04:00
										 |  |  |   auto context = isolate->GetCurrentContext(); | 
					
						
							|  |  |  |   mate::Dictionary global(isolate, context->Global()); | 
					
						
							| 
									
										
										
										
											2017-02-20 10:59:39 -03:00
										 |  |  |   v8::Local<v8::Value> cache; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (!global.GetHidden(kModuleCacheKey, &cache)) { | 
					
						
							|  |  |  |     cache = v8::Object::New(isolate); | 
					
						
							|  |  |  |     global.SetHidden(kModuleCacheKey, cache); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-20 13:20:37 -04:00
										 |  |  |   return cache->ToObject(context).ToLocalChecked(); | 
					
						
							| 
									
										
										
										
											2017-02-20 10:59:39 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // adapted from node.cc
 | 
					
						
							| 
									
										
										
										
											2018-04-17 21:55:30 -04:00
										 |  |  | v8::Local<v8::Value> GetBinding(v8::Isolate* isolate, | 
					
						
							|  |  |  |                                 v8::Local<v8::String> key, | 
					
						
							|  |  |  |                                 mate::Arguments* margs) { | 
					
						
							| 
									
										
										
										
											2017-02-20 10:59:39 -03:00
										 |  |  |   v8::Local<v8::Object> exports; | 
					
						
							| 
									
										
										
										
											2018-11-29 07:25:03 +05:30
										 |  |  |   std::string module_key = gin::V8ToString(isolate, key); | 
					
						
							| 
									
										
										
										
											2017-02-20 10:59:39 -03:00
										 |  |  |   mate::Dictionary cache(isolate, GetModuleCache(isolate)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (cache.Get(module_key.c_str(), &exports)) { | 
					
						
							|  |  |  |     return exports; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-08 23:59:52 +05:30
										 |  |  |   auto* mod = node::binding::get_linked_module(module_key.c_str()); | 
					
						
							| 
									
										
										
										
											2017-02-20 10:59:39 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  |   if (!mod) { | 
					
						
							|  |  |  |     char errmsg[1024]; | 
					
						
							|  |  |  |     snprintf(errmsg, sizeof(errmsg), "No such module: %s", module_key.c_str()); | 
					
						
							|  |  |  |     margs->ThrowError(errmsg); | 
					
						
							|  |  |  |     return exports; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   exports = v8::Object::New(isolate); | 
					
						
							|  |  |  |   DCHECK_EQ(mod->nm_register_func, nullptr); | 
					
						
							|  |  |  |   DCHECK_NE(mod->nm_context_register_func, nullptr); | 
					
						
							|  |  |  |   mod->nm_context_register_func(exports, v8::Null(isolate), | 
					
						
							| 
									
										
										
										
											2018-04-17 21:55:30 -04:00
										 |  |  |                                 isolate->GetCurrentContext(), mod->nm_priv); | 
					
						
							| 
									
										
										
										
											2017-02-20 10:59:39 -03:00
										 |  |  |   cache.Set(module_key.c_str(), exports); | 
					
						
							|  |  |  |   return exports; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-29 07:25:03 +05:30
										 |  |  | v8::Local<v8::Value> CreatePreloadScript(v8::Isolate* isolate, | 
					
						
							|  |  |  |                                          v8::Local<v8::String> preloadSrc) { | 
					
						
							|  |  |  |   return RendererClientBase::RunScript(isolate->GetCurrentContext(), | 
					
						
							|  |  |  |                                        preloadSrc); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-02 15:38:16 -07:00
										 |  |  | void InvokeHiddenCallback(v8::Handle<v8::Context> context, | 
					
						
							|  |  |  |                           const std::string& hidden_key, | 
					
						
							|  |  |  |                           const std::string& callback_name) { | 
					
						
							|  |  |  |   auto* isolate = context->GetIsolate(); | 
					
						
							| 
									
										
										
										
											2019-04-20 13:20:37 -04:00
										 |  |  |   auto binding_key = mate::ConvertToV8(isolate, hidden_key) | 
					
						
							|  |  |  |                          ->ToString(context) | 
					
						
							|  |  |  |                          .ToLocalChecked(); | 
					
						
							| 
									
										
										
										
											2019-04-02 15:38:16 -07:00
										 |  |  |   auto private_binding_key = v8::Private::ForApi(isolate, binding_key); | 
					
						
							|  |  |  |   auto global_object = context->Global(); | 
					
						
							|  |  |  |   v8::Local<v8::Value> value; | 
					
						
							|  |  |  |   if (!global_object->GetPrivate(context, private_binding_key).ToLocal(&value)) | 
					
						
							|  |  |  |     return; | 
					
						
							|  |  |  |   if (value.IsEmpty() || !value->IsObject()) | 
					
						
							|  |  |  |     return; | 
					
						
							| 
									
										
										
										
											2019-04-20 13:20:37 -04:00
										 |  |  |   auto binding = value->ToObject(context).ToLocalChecked(); | 
					
						
							|  |  |  |   auto callback_key = mate::ConvertToV8(isolate, callback_name) | 
					
						
							|  |  |  |                           ->ToString(context) | 
					
						
							|  |  |  |                           .ToLocalChecked(); | 
					
						
							| 
									
										
										
										
											2019-04-30 20:18:22 -04:00
										 |  |  |   auto callback_value = binding->Get(context, callback_key).ToLocalChecked(); | 
					
						
							| 
									
										
										
										
											2019-04-02 15:38:16 -07:00
										 |  |  |   DCHECK(callback_value->IsFunction());  // set by sandboxed_renderer/init.js
 | 
					
						
							|  |  |  |   auto callback = v8::Handle<v8::Function>::Cast(callback_value); | 
					
						
							|  |  |  |   ignore_result(callback->Call(context, binding, 0, nullptr)); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2016-08-21 07:30:21 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | }  // namespace
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-19 08:47:32 -03:00
										 |  |  | AtomSandboxedRendererClient::AtomSandboxedRendererClient() { | 
					
						
							| 
									
										
										
										
											2018-01-06 07:58:24 -08:00
										 |  |  |   // Explicitly register electron's builtin modules.
 | 
					
						
							|  |  |  |   NodeBindings::RegisterBuiltinModules(); | 
					
						
							| 
									
										
										
										
											2018-08-21 20:05:45 +02:00
										 |  |  |   metrics_ = base::ProcessMetrics::CreateCurrentProcessMetrics(); | 
					
						
							| 
									
										
										
										
											2016-08-19 08:47:32 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-17 21:55:30 -04:00
										 |  |  | AtomSandboxedRendererClient::~AtomSandboxedRendererClient() {} | 
					
						
							| 
									
										
										
										
											2016-08-19 08:47:32 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-21 20:05:45 +02:00
										 |  |  | void AtomSandboxedRendererClient::InitializeBindings( | 
					
						
							|  |  |  |     v8::Local<v8::Object> binding, | 
					
						
							| 
									
										
										
										
											2019-01-22 11:24:46 -08:00
										 |  |  |     v8::Local<v8::Context> context, | 
					
						
							|  |  |  |     bool is_main_frame) { | 
					
						
							| 
									
										
										
										
											2018-08-21 20:05:45 +02:00
										 |  |  |   auto* isolate = context->GetIsolate(); | 
					
						
							|  |  |  |   mate::Dictionary b(isolate, binding); | 
					
						
							|  |  |  |   b.SetMethod("get", GetBinding); | 
					
						
							| 
									
										
										
										
											2018-11-29 07:25:03 +05:30
										 |  |  |   b.SetMethod("createPreloadScript", CreatePreloadScript); | 
					
						
							| 
									
										
										
										
											2018-09-30 23:24:00 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |   mate::Dictionary process = mate::Dictionary::CreateEmpty(isolate); | 
					
						
							|  |  |  |   b.Set("process", process); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-18 12:37:06 -07:00
										 |  |  |   ElectronBindings::BindProcess(isolate, &process, metrics_.get()); | 
					
						
							| 
									
										
										
										
											2018-09-30 23:24:00 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |   process.Set("argv", base::CommandLine::ForCurrentProcess()->argv()); | 
					
						
							| 
									
										
										
										
											2018-11-08 06:28:06 -08:00
										 |  |  |   process.SetReadOnly("pid", base::GetCurrentProcId()); | 
					
						
							|  |  |  |   process.SetReadOnly("sandboxed", true); | 
					
						
							|  |  |  |   process.SetReadOnly("type", "renderer"); | 
					
						
							| 
									
										
										
										
											2019-01-22 11:24:46 -08:00
										 |  |  |   process.SetReadOnly("isMainFrame", is_main_frame); | 
					
						
							| 
									
										
										
										
											2018-09-30 23:24:00 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-21 20:05:45 +02:00
										 |  |  |   // Pass in CLI flags needed to setup the renderer
 | 
					
						
							|  |  |  |   base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); | 
					
						
							|  |  |  |   if (command_line->HasSwitch(switches::kGuestInstanceID)) | 
					
						
							|  |  |  |     b.Set(options::kGuestInstanceID, | 
					
						
							|  |  |  |           command_line->GetSwitchValueASCII(switches::kGuestInstanceID)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-21 07:30:21 -03:00
										 |  |  | void AtomSandboxedRendererClient::RenderFrameCreated( | 
					
						
							|  |  |  |     content::RenderFrame* render_frame) { | 
					
						
							| 
									
										
										
										
											2019-04-02 15:38:16 -07:00
										 |  |  |   new AtomRenderFrameObserver(render_frame, this); | 
					
						
							| 
									
										
										
										
											2017-03-27 18:31:18 -03:00
										 |  |  |   RendererClientBase::RenderFrameCreated(render_frame); | 
					
						
							| 
									
										
										
										
											2016-08-21 07:30:21 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void AtomSandboxedRendererClient::RenderViewCreated( | 
					
						
							|  |  |  |     content::RenderView* render_view) { | 
					
						
							| 
									
										
										
										
											2017-03-27 18:31:18 -03:00
										 |  |  |   RendererClientBase::RenderViewCreated(render_view); | 
					
						
							| 
									
										
										
										
											2016-08-21 07:30:21 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-07 19:00:28 -05:00
										 |  |  | void AtomSandboxedRendererClient::RunScriptsAtDocumentStart( | 
					
						
							|  |  |  |     content::RenderFrame* render_frame) { | 
					
						
							|  |  |  |   if (injected_frames_.find(render_frame) == injected_frames_.end()) | 
					
						
							|  |  |  |     return; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   auto* isolate = blink::MainThreadIsolate(); | 
					
						
							|  |  |  |   v8::HandleScope handle_scope(isolate); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   v8::Local<v8::Context> context = | 
					
						
							|  |  |  |       GetContext(render_frame->GetWebFrame(), isolate); | 
					
						
							|  |  |  |   v8::Context::Scope context_scope(context); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-02 15:38:16 -07:00
										 |  |  |   InvokeHiddenCallback(context, kLifecycleKey, "onDocumentStart"); | 
					
						
							| 
									
										
										
										
											2019-03-07 19:00:28 -05:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void AtomSandboxedRendererClient::RunScriptsAtDocumentEnd( | 
					
						
							|  |  |  |     content::RenderFrame* render_frame) { | 
					
						
							|  |  |  |   if (injected_frames_.find(render_frame) == injected_frames_.end()) | 
					
						
							|  |  |  |     return; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   auto* isolate = blink::MainThreadIsolate(); | 
					
						
							|  |  |  |   v8::HandleScope handle_scope(isolate); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   v8::Local<v8::Context> context = | 
					
						
							|  |  |  |       GetContext(render_frame->GetWebFrame(), isolate); | 
					
						
							|  |  |  |   v8::Context::Scope context_scope(context); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-02 15:38:16 -07:00
										 |  |  |   InvokeHiddenCallback(context, kLifecycleKey, "onDocumentEnd"); | 
					
						
							| 
									
										
										
										
											2019-03-07 19:00:28 -05:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-21 07:30:21 -03:00
										 |  |  | void AtomSandboxedRendererClient::DidCreateScriptContext( | 
					
						
							| 
									
										
										
										
											2018-04-17 21:55:30 -04:00
										 |  |  |     v8::Handle<v8::Context> context, | 
					
						
							|  |  |  |     content::RenderFrame* render_frame) { | 
					
						
							| 
									
										
										
										
											2018-07-19 13:29:47 +09:00
										 |  |  |   RendererClientBase::DidCreateScriptContext(context, render_frame); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-22 00:15:57 -07:00
										 |  |  |   // Only allow preload for the main frame or
 | 
					
						
							|  |  |  |   // For devtools we still want to run the preload_bundle script
 | 
					
						
							| 
									
										
										
										
											2019-01-22 11:24:46 -08:00
										 |  |  |   // Or when nodeSupport is explicitly enabled in sub frames
 | 
					
						
							|  |  |  |   bool is_main_frame = render_frame->IsMainFrame(); | 
					
						
							|  |  |  |   bool is_devtools = | 
					
						
							|  |  |  |       IsDevTools(render_frame) || IsDevToolsExtension(render_frame); | 
					
						
							|  |  |  |   bool allow_node_in_sub_frames = | 
					
						
							|  |  |  |       base::CommandLine::ForCurrentProcess()->HasSwitch( | 
					
						
							|  |  |  |           switches::kNodeIntegrationInSubFrames); | 
					
						
							|  |  |  |   bool should_load_preload = | 
					
						
							|  |  |  |       is_main_frame || is_devtools || allow_node_in_sub_frames; | 
					
						
							|  |  |  |   if (!should_load_preload) | 
					
						
							| 
									
										
										
										
											2017-11-23 07:25:16 +01:00
										 |  |  |     return; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-07 19:00:28 -05:00
										 |  |  |   injected_frames_.insert(render_frame); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-12 06:30:43 +05:30
										 |  |  |   // Wrap the bundle into a function that receives the binding object as
 | 
					
						
							|  |  |  |   // argument.
 | 
					
						
							| 
									
										
										
										
											2018-04-17 15:41:47 -07:00
										 |  |  |   auto* isolate = context->GetIsolate(); | 
					
						
							| 
									
										
										
										
											2016-08-21 07:30:21 -03:00
										 |  |  |   auto binding = v8::Object::New(isolate); | 
					
						
							| 
									
										
										
										
											2019-01-22 11:24:46 -08:00
										 |  |  |   InitializeBindings(binding, context, render_frame->IsMainFrame()); | 
					
						
							| 
									
										
										
										
											2017-03-27 18:31:18 -03:00
										 |  |  |   AddRenderBindings(isolate, binding); | 
					
						
							| 
									
										
										
										
											2019-01-12 06:30:43 +05:30
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-17 17:18:03 -04:00
										 |  |  |   std::vector<v8::Local<v8::String>> sandbox_preload_bundle_params = { | 
					
						
							| 
									
										
										
										
											2019-01-12 06:30:43 +05:30
										 |  |  |       node::FIXED_ONE_BYTE_STRING(isolate, "binding")}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-17 17:18:03 -04:00
										 |  |  |   std::vector<v8::Local<v8::Value>> sandbox_preload_bundle_args = {binding}; | 
					
						
							| 
									
										
										
										
											2019-01-12 06:30:43 +05:30
										 |  |  | 
 | 
					
						
							|  |  |  |   node::per_process::native_module_loader.CompileAndCall( | 
					
						
							| 
									
										
										
										
											2019-04-17 17:18:03 -04:00
										 |  |  |       isolate->GetCurrentContext(), "electron/js2c/sandbox_bundle", | 
					
						
							|  |  |  |       &sandbox_preload_bundle_params, &sandbox_preload_bundle_args, nullptr); | 
					
						
							| 
									
										
										
										
											2019-04-04 20:35:06 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |   v8::HandleScope handle_scope(isolate); | 
					
						
							|  |  |  |   v8::Context::Scope context_scope(context); | 
					
						
							|  |  |  |   InvokeHiddenCallback(context, kLifecycleKey, "onLoaded"); | 
					
						
							| 
									
										
										
										
											2016-08-21 07:30:21 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-22 02:08:16 +01:00
										 |  |  | void AtomSandboxedRendererClient::SetupMainWorldOverrides( | 
					
						
							|  |  |  |     v8::Handle<v8::Context> context, | 
					
						
							|  |  |  |     content::RenderFrame* render_frame) { | 
					
						
							|  |  |  |   // Setup window overrides in the main world context
 | 
					
						
							|  |  |  |   // Wrap the bundle into a function that receives the isolatedWorld as
 | 
					
						
							|  |  |  |   // an argument.
 | 
					
						
							|  |  |  |   auto* isolate = context->GetIsolate(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   mate::Dictionary process = mate::Dictionary::CreateEmpty(isolate); | 
					
						
							| 
									
										
										
										
											2019-04-26 18:55:12 +09:00
										 |  |  |   process.SetMethod("_linkedBinding", GetBinding); | 
					
						
							| 
									
										
										
										
											2019-01-22 02:08:16 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |   std::vector<v8::Local<v8::String>> isolated_bundle_params = { | 
					
						
							|  |  |  |       node::FIXED_ONE_BYTE_STRING(isolate, "nodeProcess"), | 
					
						
							|  |  |  |       node::FIXED_ONE_BYTE_STRING(isolate, "isolatedWorld")}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   std::vector<v8::Local<v8::Value>> isolated_bundle_args = { | 
					
						
							|  |  |  |       process.GetHandle(), | 
					
						
							|  |  |  |       GetContext(render_frame->GetWebFrame(), isolate)->Global()}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   node::per_process::native_module_loader.CompileAndCall( | 
					
						
							|  |  |  |       context, "electron/js2c/isolated_bundle", &isolated_bundle_params, | 
					
						
							|  |  |  |       &isolated_bundle_args, nullptr); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-11 19:27:57 -04:00
										 |  |  | void AtomSandboxedRendererClient::SetupExtensionWorldOverrides( | 
					
						
							|  |  |  |     v8::Handle<v8::Context> context, | 
					
						
							|  |  |  |     content::RenderFrame* render_frame, | 
					
						
							|  |  |  |     int world_id) { | 
					
						
							|  |  |  |   auto* isolate = context->GetIsolate(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   mate::Dictionary process = mate::Dictionary::CreateEmpty(isolate); | 
					
						
							| 
									
										
										
										
											2019-04-26 18:55:12 +09:00
										 |  |  |   process.SetMethod("_linkedBinding", GetBinding); | 
					
						
							| 
									
										
										
										
											2019-03-11 19:27:57 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |   std::vector<v8::Local<v8::String>> isolated_bundle_params = { | 
					
						
							|  |  |  |       node::FIXED_ONE_BYTE_STRING(isolate, "nodeProcess"), | 
					
						
							|  |  |  |       node::FIXED_ONE_BYTE_STRING(isolate, "isolatedWorld"), | 
					
						
							|  |  |  |       node::FIXED_ONE_BYTE_STRING(isolate, "worldId")}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   std::vector<v8::Local<v8::Value>> isolated_bundle_args = { | 
					
						
							|  |  |  |       process.GetHandle(), | 
					
						
							|  |  |  |       GetContext(render_frame->GetWebFrame(), isolate)->Global(), | 
					
						
							|  |  |  |       v8::Integer::New(isolate, world_id)}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   node::per_process::native_module_loader.CompileAndCall( | 
					
						
							|  |  |  |       context, "electron/js2c/content_script_bundle", &isolated_bundle_params, | 
					
						
							|  |  |  |       &isolated_bundle_args, nullptr); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-21 07:30:21 -03:00
										 |  |  | void AtomSandboxedRendererClient::WillReleaseScriptContext( | 
					
						
							| 
									
										
										
										
											2018-04-17 21:55:30 -04:00
										 |  |  |     v8::Handle<v8::Context> context, | 
					
						
							|  |  |  |     content::RenderFrame* render_frame) { | 
					
						
							| 
									
										
										
										
											2019-03-07 19:00:28 -05:00
										 |  |  |   if (injected_frames_.find(render_frame) == injected_frames_.end()) | 
					
						
							| 
									
										
										
										
											2017-11-23 07:25:16 +01:00
										 |  |  |     return; | 
					
						
							| 
									
										
										
										
											2019-03-07 19:00:28 -05:00
										 |  |  |   injected_frames_.erase(render_frame); | 
					
						
							| 
									
										
										
										
											2017-11-23 07:25:16 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-17 15:41:47 -07:00
										 |  |  |   auto* isolate = context->GetIsolate(); | 
					
						
							| 
									
										
										
										
											2016-08-21 07:30:21 -03:00
										 |  |  |   v8::HandleScope handle_scope(isolate); | 
					
						
							|  |  |  |   v8::Context::Scope context_scope(context); | 
					
						
							| 
									
										
										
										
											2019-04-02 15:38:16 -07:00
										 |  |  |   InvokeHiddenCallback(context, kLifecycleKey, "onExit"); | 
					
						
							| 
									
										
										
										
											2016-08-21 07:30:21 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-19 08:47:32 -03:00
										 |  |  | }  // namespace atom
 |