From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Samuel Attard <samuel.r.attard@gmail.com>
Date: Thu, 18 Oct 2018 17:07:27 -0700
Subject: isolate_holder.patch

Pass pre allocated isolate for initialization, node platform
needs to register on an isolate so that it can be used later
down in the initialization process of an isolate.

Specifically, v8::Isolate::Initialize ends up calling
NodePlatform::GetForegroundTaskRunner, which requires that the
isolate has previously been registered with NodePlatform::RegisterIsolate.
However, if we let gin allocate the isolate, there's no opportunity
for us to register the isolate in between Isolate::Allocate and
Isolate::Initialize.

diff --git a/gin/isolate_holder.cc b/gin/isolate_holder.cc
index 15904644aa5451c6cb0fc2a46a67678824cd0bec..64edf6fe78d2478cb9e12e8767a09e2b6c7c6ad2 100644
--- a/gin/isolate_holder.cc
+++ b/gin/isolate_holder.cc
@@ -81,7 +81,8 @@ IsolateHolder::IsolateHolder(
     v8::AddHistogramSampleCallback add_histogram_sample_callback,
     scoped_refptr<base::SingleThreadTaskRunner> user_visible_task_runner,
     scoped_refptr<base::SingleThreadTaskRunner> best_effort_task_runner,
-    std::unique_ptr<v8::CppHeap> cpp_heap)
+    std::unique_ptr<v8::CppHeap> cpp_heap,
+    v8::Isolate* isolate)
     : IsolateHolder(std::move(task_runner),
                     access_mode,
                     isolate_type,
@@ -92,7 +93,8 @@ IsolateHolder::IsolateHolder(
                                              std::move(cpp_heap)),
                     isolate_creation_mode,
                     std::move(user_visible_task_runner),
-                    std::move(best_effort_task_runner)) {}
+                    std::move(best_effort_task_runner),
+                    isolate) {}
 
 IsolateHolder::IsolateHolder(
     scoped_refptr<base::SingleThreadTaskRunner> task_runner,
@@ -101,7 +103,8 @@ IsolateHolder::IsolateHolder(
     std::unique_ptr<v8::Isolate::CreateParams> params,
     IsolateCreationMode isolate_creation_mode,
     scoped_refptr<base::SingleThreadTaskRunner> user_visible_task_runner,
-    scoped_refptr<base::SingleThreadTaskRunner> best_effort_task_runner)
+    scoped_refptr<base::SingleThreadTaskRunner> best_effort_task_runner,
+    v8::Isolate* isolate)
     : access_mode_(access_mode), isolate_type_(isolate_type) {
   CHECK(Initialized())
       << "You need to invoke gin::IsolateHolder::Initialize first";
@@ -112,7 +115,7 @@ IsolateHolder::IsolateHolder(
   v8::ArrayBuffer::Allocator* allocator = params->array_buffer_allocator;
   DCHECK(allocator);
 
-  isolate_ = v8::Isolate::Allocate();
+  isolate_ = isolate ? isolate : v8::Isolate::Allocate();
   isolate_data_ = std::make_unique<PerIsolateData>(
       isolate_, allocator, access_mode_, task_runner,
       std::move(user_visible_task_runner), std::move(best_effort_task_runner));
diff --git a/gin/public/isolate_holder.h b/gin/public/isolate_holder.h
index a57b92f02085d6392e6d9d0cc037df6b972f3c31..902ad13dad8df57325f6c74ee3da9ec3148751cb 100644
--- a/gin/public/isolate_holder.h
+++ b/gin/public/isolate_holder.h
@@ -89,7 +89,8 @@ class GIN_EXPORT IsolateHolder {
           nullptr,
       scoped_refptr<base::SingleThreadTaskRunner> best_effort_task_runner =
           nullptr,
-      std::unique_ptr<v8::CppHeap> cpp_heap = {});
+      std::unique_ptr<v8::CppHeap> cpp_heap = {},
+      v8::Isolate* isolate = nullptr);
   IsolateHolder(
       scoped_refptr<base::SingleThreadTaskRunner> task_runner,
       AccessMode access_mode,
@@ -99,7 +100,8 @@ class GIN_EXPORT IsolateHolder {
       scoped_refptr<base::SingleThreadTaskRunner> user_visible_task_runner =
           nullptr,
       scoped_refptr<base::SingleThreadTaskRunner> best_effort_task_runner =
-          nullptr);
+          nullptr,
+      v8::Isolate* isolate = nullptr);
   IsolateHolder(const IsolateHolder&) = delete;
   IsolateHolder& operator=(const IsolateHolder&) = delete;
   ~IsolateHolder();
