Make v8 embedder data slot configurable

Chrome already uses 0 and 1.

BUG=none
R=tsepez@chromium.org

Review URL: https://codereview.chromium.org/1235303003 .
diff --git a/fpdfsdk/include/jsapi/fxjs_v8.h b/fpdfsdk/include/jsapi/fxjs_v8.h
index f5d6992..b4dac71 100644
--- a/fpdfsdk/include/jsapi/fxjs_v8.h
+++ b/fpdfsdk/include/jsapi/fxjs_v8.h
@@ -63,7 +63,7 @@
 
 void							JS_InitialRuntime(IJS_Runtime* pJSRuntime,IFXJS_Runtime* pFXRuntime, IFXJS_Context* context, v8::Global<v8::Context>& v8PersistentContext);
 void							JS_ReleaseRuntime(IJS_Runtime* pJSRuntime, v8::Global<v8::Context>& v8PersistentContext);
-void							JS_Initial();
+void							JS_Initial(unsigned int embedderDataSlot);
 void							JS_Release();
 int								JS_Parse(IJS_Runtime* pJSRuntime, IFXJS_Context* pJSContext, const wchar_t* script, long length, FXJSErr* perror);
 int								JS_Execute(IJS_Runtime* pJSRuntime, IFXJS_Context* pJSContext, const wchar_t* script, long length, FXJSErr* perror);
diff --git a/fpdfsdk/src/javascript/JS_Runtime.cpp b/fpdfsdk/src/javascript/JS_Runtime.cpp
index b26f5a2..f21819a 100644
--- a/fpdfsdk/src/javascript/JS_Runtime.cpp
+++ b/fpdfsdk/src/javascript/JS_Runtime.cpp
@@ -35,7 +35,11 @@
 {
 	if (!m_bInit)
 	{
-		JS_Initial();
+		unsigned int embedderDataSlot = 0;
+		if (pApp->GetFormFillInfo()->m_pJsPlatform->version >= 2) {
+			embedderDataSlot = pApp->GetFormFillInfo()->m_pJsPlatform->m_v8EmbedderSlot;
+                }
+		JS_Initial(embedderDataSlot);
 		m_bInit = TRUE;
 	}
 	return new CJS_Runtime(pApp);
diff --git a/fpdfsdk/src/jsapi/fxjs_v8.cpp b/fpdfsdk/src/jsapi/fxjs_v8.cpp
index 7adfc26..feed779 100644
--- a/fpdfsdk/src/jsapi/fxjs_v8.cpp
+++ b/fpdfsdk/src/jsapi/fxjs_v8.cpp
@@ -26,6 +26,7 @@
 {
   return *(double*)g_nan;
 }
+static unsigned int g_embedderDataSlot = 0u;
 
 
 class CJS_PrivateData
@@ -79,11 +80,11 @@
 	v8::Isolate* isolate = (v8::Isolate*)pJSRuntime;
 	v8::Isolate::Scope isolate_scope(isolate);
 	v8::HandleScope handle_scope(isolate);
-	CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0);
+	CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(g_embedderDataSlot);
 	if(!pArray)
 	{
 		pArray = new CFX_PtrArray();
-		isolate->SetData(0, pArray);
+		isolate->SetData(g_embedderDataSlot, pArray);
 	}
 	CJS_ObjDefintion* pObjDef = new CJS_ObjDefintion(isolate, sObjName, eObjType, pConstructor, pDestructor, bApplyNew);
 	pArray->Add(pObjDef);
@@ -99,7 +100,7 @@
 	CFX_WideString ws = CFX_WideString(sMethodName);
 	CFX_ByteString bsMethodName = ws.UTF8Encode();
 
-	CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0);
+	CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(g_embedderDataSlot);
 	if(!pArray) return 0;
 
 	if(nObjDefnID<0 || nObjDefnID>= pArray->GetSize()) return 0;
@@ -119,7 +120,7 @@
 	CFX_WideString ws = CFX_WideString(sPropName);
 	CFX_ByteString bsPropertyName = ws.UTF8Encode();
 
-	CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0);
+	CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(g_embedderDataSlot);
 	if(!pArray) return 0;
 
 	if(nObjDefnID<0 || nObjDefnID>= pArray->GetSize()) return 0;
@@ -136,7 +137,7 @@
 	v8::Isolate::Scope isolate_scope(isolate);
 	v8::HandleScope handle_scope(isolate);
 
-	CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0);
+	CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(g_embedderDataSlot);
 	if(!pArray) return 0;
 
 	if(nObjDefnID<0 || nObjDefnID>= pArray->GetSize()) return 0;
@@ -153,7 +154,7 @@
 	v8::Isolate::Scope isolate_scope(isolate);
 	v8::HandleScope handle_scope(isolate);
 
-	CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0);
+	CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(g_embedderDataSlot);
 	if(!pArray) return 0;
 
 	CFX_WideString ws = CFX_WideString(sConstName);
@@ -173,7 +174,7 @@
 	v8::Isolate::Scope isolate_scope(isolate);
 	v8::HandleScope handle_scope(isolate);
 
-	CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0);
+	CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(g_embedderDataSlot);
 	ASSERT(pArray != NULL);
 	for(int i=0; i<pArray->GetSize(); i++)
 	{
@@ -246,7 +247,7 @@
 	v8::Local<v8::External> ptr = v8::External::New(isolate, pFXRuntime);
 	v8Context->SetEmbedderData(1, ptr);
 
-	CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0);
+	CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(g_embedderDataSlot);
 	if(!pArray) return;
 
 	for(int i=0; i<pArray->GetSize(); i++)
@@ -290,7 +291,7 @@
 	v8::Local<v8::Context> context = v8::Local<v8::Context>::New(isolate, v8PersistentContext);
 	v8::Context::Scope context_scope(context);
 
-	CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0);
+	CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(g_embedderDataSlot);
 	if(!pArray) return ;
 
 	for(int i=0; i<pArray->GetSize(); i++)
@@ -306,11 +307,12 @@
 		delete pObjDef;
 	}
 	delete pArray;
-	isolate->SetData(0,NULL);
+	isolate->SetData(g_embedderDataSlot,NULL);
 }
 
-void JS_Initial()
+void JS_Initial(unsigned int embedderDataSlot)
 {
+	g_embedderDataSlot = embedderDataSlot;
 }
 void JS_Release()
 {
@@ -372,7 +374,7 @@
                 return v8::Local<v8::Object>();
 	}
 
-	CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0);
+	CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(g_embedderDataSlot);
 	if(!pArray) return v8::Local<v8::Object>();
 
 
@@ -398,7 +400,7 @@
 	v8::Isolate* isolate = (v8::Isolate*)pJSRuntime;
 	v8::Isolate::Scope isolate_scope(isolate);
 
-	CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0);
+	CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(g_embedderDataSlot);
 	if(!pArray) return v8::Local<v8::Object>();
 
 	if(nObjDefnID<0 || nObjDefnID>= pArray->GetSize()) return v8::Local<v8::Object>();
@@ -417,7 +419,7 @@
 	v8::Isolate* isolate = (v8::Isolate*)pJSRuntime;
 	v8::Isolate::Scope isolate_scope(isolate);
 
-	CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0);
+	CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(g_embedderDataSlot);
 	if(!pArray) return v8::Local<v8::Object>();
 
 	v8::Local<v8::Context> context = isolate->GetCurrentContext();
@@ -446,7 +448,7 @@
 	v8::Isolate* isolate = (v8::Isolate*)pJSRuntime;
 	v8::Isolate::Scope isolate_scope(isolate);
 
-	CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0);
+	CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(g_embedderDataSlot);
 	if(!pArray) return -1;
 
 	for(int i=0; i<pArray->GetSize(); i++)
diff --git a/public/fpdf_formfill.h b/public/fpdf_formfill.h
index 1cc5551..22ebc61 100644
--- a/public/fpdf_formfill.h
+++ b/public/fpdf_formfill.h
@@ -231,6 +231,13 @@
     *   pointer to the v8::Isolate to use, or NULL to force PDFium to create one.
     **/
     void*   m_isolate;
+
+    /**
+     *   The embedder data slot to use in the v8::Isolate to store PDFium's
+     *   per-isolate data. The value needs to be between 0 and
+     *   v8::Internals::kNumIsolateDataLots (exclusive).
+     */
+    unsigned int m_v8EmbedderSlot;
 } IPDF_JSPLATFORM;
 
 // Flags for Cursor type