| OLD | NEW | 
|    1 // Copyright 2014 PDFium Authors. All rights reserved. |    1 // Copyright 2014 PDFium Authors. All rights reserved. | 
|    2 // Use of this source code is governed by a BSD-style license that can be |    2 // Use of this source code is governed by a BSD-style license that can be | 
|    3 // found in the LICENSE file. |    3 // found in the LICENSE file. | 
|    4  |    4  | 
|    5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |    5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 
|    6  |    6  | 
|    7 #include "fpdfsdk/javascript/cjs_runtime.h" |    7 #include "fpdfsdk/javascript/cjs_runtime.h" | 
|    8  |    8  | 
|    9 #include <algorithm> |    9 #include <algorithm> | 
|   10  |   10  | 
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   49   return new CJS_Runtime(pEnv); |   49   return new CJS_Runtime(pEnv); | 
|   50 } |   50 } | 
|   51  |   51  | 
|   52 // static |   52 // static | 
|   53 CJS_Runtime* CJS_Runtime::FromContext(const IJS_Context* cc) { |   53 CJS_Runtime* CJS_Runtime::FromContext(const IJS_Context* cc) { | 
|   54   const CJS_Context* pContext = static_cast<const CJS_Context*>(cc); |   54   const CJS_Context* pContext = static_cast<const CJS_Context*>(cc); | 
|   55   return pContext->GetJSRuntime(); |   55   return pContext->GetJSRuntime(); | 
|   56 } |   56 } | 
|   57  |   57  | 
|   58 CJS_Runtime::CJS_Runtime(CPDFDoc_Environment* pApp) |   58 CJS_Runtime::CJS_Runtime(CPDFDoc_Environment* pApp) | 
|   59     : m_pApp(pApp), |   59     : m_pApp(pApp), m_pDocument(nullptr), m_bBlocking(FALSE) { | 
|   60       m_pDocument(nullptr), |  | 
|   61       m_bBlocking(FALSE), |  | 
|   62       m_isolate(nullptr), |  | 
|   63       m_isolateManaged(false) { |  | 
|   64 #ifndef PDF_ENABLE_XFA |   60 #ifndef PDF_ENABLE_XFA | 
|   65   IPDF_JSPLATFORM* pPlatform = m_pApp->GetFormFillInfo()->m_pJsPlatform; |   61   IPDF_JSPLATFORM* pPlatform = m_pApp->GetFormFillInfo()->m_pJsPlatform; | 
|   66   if (pPlatform->version <= 2) { |   62   if (pPlatform->version <= 2) { | 
|   67     unsigned int embedderDataSlot = 0; |   63     unsigned int embedderDataSlot = 0; | 
|   68     v8::Isolate* pExternalIsolate = nullptr; |   64     v8::Isolate* pExternalIsolate = nullptr; | 
|   69     if (pPlatform->version == 2) { |   65     if (pPlatform->version == 2) { | 
|   70       pExternalIsolate = reinterpret_cast<v8::Isolate*>(pPlatform->m_isolate); |   66       pExternalIsolate = reinterpret_cast<v8::Isolate*>(pPlatform->m_isolate); | 
|   71       embedderDataSlot = pPlatform->m_v8EmbedderSlot; |   67       embedderDataSlot = pPlatform->m_v8EmbedderSlot; | 
|   72     } |   68     } | 
|   73     FXJS_Initialize(embedderDataSlot, pExternalIsolate); |   69     FXJS_Initialize(embedderDataSlot, pExternalIsolate); | 
| (...skipping 15 matching lines...) Expand all  Loading... | 
|   89       FXJS_Initialize(embedderDataSlot, pExternalIsolate); |   85       FXJS_Initialize(embedderDataSlot, pExternalIsolate); | 
|   90     } |   86     } | 
|   91     m_isolateManaged = FXJS_GetIsolate(&m_isolate); |   87     m_isolateManaged = FXJS_GetIsolate(&m_isolate); | 
|   92   } |   88   } | 
|   93  |   89  | 
|   94   v8::Isolate* isolate = m_isolate; |   90   v8::Isolate* isolate = m_isolate; | 
|   95   v8::Isolate::Scope isolate_scope(isolate); |   91   v8::Isolate::Scope isolate_scope(isolate); | 
|   96   v8::HandleScope handle_scope(isolate); |   92   v8::HandleScope handle_scope(isolate); | 
|   97   if (CPDFXFA_App::GetInstance()->IsJavaScriptInitialized()) { |   93   if (CPDFXFA_App::GetInstance()->IsJavaScriptInitialized()) { | 
|   98     CJS_Context* pContext = (CJS_Context*)NewContext(); |   94     CJS_Context* pContext = (CJS_Context*)NewContext(); | 
|   99     FXJS_InitializeRuntime(GetIsolate(), this, &m_context, &m_StaticObjects); |   95     FXJS_InitializeEngine(GetIsolate(), this, &m_context, &m_StaticObjects); | 
|  100     ReleaseContext(pContext); |   96     ReleaseContext(pContext); | 
|  101     return; |   97     return; | 
|  102   } |   98   } | 
|  103 #endif |   99 #endif | 
|  104  |  100  | 
|  105   if (m_isolateManaged || FXJS_GlobalIsolateRefCount() == 0) |  101   if (m_isolateManaged || FXJS_GlobalIsolateRefCount() == 0) | 
|  106     DefineJSObjects(); |  102     DefineJSObjects(); | 
|  107  |  103  | 
|  108 #ifdef PDF_ENABLE_XFA |  104 #ifdef PDF_ENABLE_XFA | 
|  109   CPDFXFA_App::GetInstance()->SetJavaScriptInitialized(TRUE); |  105   CPDFXFA_App::GetInstance()->SetJavaScriptInitialized(TRUE); | 
|  110 #endif |  106 #endif | 
|  111  |  107  | 
|  112   CJS_Context* pContext = (CJS_Context*)NewContext(); |  108   CJS_Context* pContext = (CJS_Context*)NewContext(); | 
|  113   FXJS_InitializeRuntime(GetIsolate(), this, &m_context, &m_StaticObjects); |  109   FXJS_InitializeEngine(GetIsolate(), this, &m_context, &m_StaticObjects); | 
|  114   ReleaseContext(pContext); |  110   ReleaseContext(pContext); | 
|  115 } |  111 } | 
|  116  |  112  | 
|  117 CJS_Runtime::~CJS_Runtime() { |  113 CJS_Runtime::~CJS_Runtime() { | 
|  118   for (auto* obs : m_observers) |  114   for (auto* obs : m_observers) | 
|  119     obs->OnDestroyed(); |  115     obs->OnDestroyed(); | 
|  120  |  116  | 
|  121   m_ContextArray.clear(); |  117   m_ContextArray.clear(); | 
|  122   m_ConstArrays.clear(); |  118   m_ConstArrays.clear(); | 
|  123   FXJS_ReleaseRuntime(GetIsolate(), &m_context, &m_StaticObjects); |  119   FXJS_ReleaseEngine(GetIsolate(), &m_context, &m_StaticObjects); | 
|  124   m_context.Reset(); |  120   m_context.Reset(); | 
|  125   if (m_isolateManaged) |  121   if (m_isolateManaged) | 
|  126     m_isolate->Dispose(); |  122     m_isolate->Dispose(); | 
|  127 } |  123 } | 
|  128  |  124  | 
|  129 void CJS_Runtime::DefineJSObjects() { |  125 void CJS_Runtime::DefineJSObjects() { | 
|  130   v8::Isolate::Scope isolate_scope(GetIsolate()); |  126   v8::Isolate::Scope isolate_scope(GetIsolate()); | 
|  131   v8::HandleScope handle_scope(GetIsolate()); |  127   v8::HandleScope handle_scope(GetIsolate()); | 
|  132   v8::Local<v8::Context> context = v8::Context::New(GetIsolate()); |  128   v8::Local<v8::Context> context = v8::Context::New(GetIsolate()); | 
|  133   v8::Context::Scope context_scope(context); |  129   v8::Context::Scope context_scope(context); | 
| (...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  277       v8::Local<v8::Context>::New(GetIsolate(), m_context); |  273       v8::Local<v8::Context>::New(GetIsolate(), m_context); | 
|  278   v8::Context::Scope context_scope(context); |  274   v8::Context::Scope context_scope(context); | 
|  279  |  275  | 
|  280   // Caution: We're about to hand to XFA an object that in order to invoke |  276   // Caution: We're about to hand to XFA an object that in order to invoke | 
|  281   // methods will require that the current v8::Context always has a pointer |  277   // methods will require that the current v8::Context always has a pointer | 
|  282   // to a CJS_Runtime in its embedder data slot. Unfortunately, XFA creates |  278   // to a CJS_Runtime in its embedder data slot. Unfortunately, XFA creates | 
|  283   // its own v8::Context which has not initialized the embedder data slot. |  279   // its own v8::Context which has not initialized the embedder data slot. | 
|  284   // Do so now. |  280   // Do so now. | 
|  285   // TODO(tsepez): redesign PDF-side objects to not rely on v8::Context's |  281   // TODO(tsepez): redesign PDF-side objects to not rely on v8::Context's | 
|  286   // embedder data slots, and/or to always use the right context. |  282   // embedder data slots, and/or to always use the right context. | 
|  287   FXJS_SetRuntimeForV8Context(old_context, this); |  283   FXJS_SetEngineForV8Context(old_context, this); | 
|  288  |  284  | 
|  289   v8::Local<v8::Value> propvalue = |  285   v8::Local<v8::Value> propvalue = | 
|  290       context->Global()->Get(v8::String::NewFromUtf8( |  286       context->Global()->Get(v8::String::NewFromUtf8( | 
|  291           GetIsolate(), name, v8::String::kNormalString, utf8Name.GetLength())); |  287           GetIsolate(), name, v8::String::kNormalString, utf8Name.GetLength())); | 
|  292  |  288  | 
|  293   if (propvalue.IsEmpty()) { |  289   if (propvalue.IsEmpty()) { | 
|  294     pValue->SetUndefined(); |  290     pValue->SetUndefined(); | 
|  295     return FALSE; |  291     return FALSE; | 
|  296   } |  292   } | 
|  297   pValue->ForceSetValue(propvalue); |  293   pValue->ForceSetValue(propvalue); | 
| (...skipping 15 matching lines...) Expand all  Loading... | 
|  313   // v8::Local<v8::Context>::New(GetIsolate(), m_context); |  309   // v8::Local<v8::Context>::New(GetIsolate(), m_context); | 
|  314   v8::Local<v8::Value> propvalue = |  310   v8::Local<v8::Value> propvalue = | 
|  315       v8::Local<v8::Value>::New(GetIsolate(), pValue->DirectGetValue()); |  311       v8::Local<v8::Value>::New(GetIsolate(), pValue->DirectGetValue()); | 
|  316   context->Global()->Set( |  312   context->Global()->Set( | 
|  317       v8::String::NewFromUtf8(pIsolate, name, v8::String::kNormalString, |  313       v8::String::NewFromUtf8(pIsolate, name, v8::String::kNormalString, | 
|  318                               utf8Name.GetLength()), |  314                               utf8Name.GetLength()), | 
|  319       propvalue); |  315       propvalue); | 
|  320   return TRUE; |  316   return TRUE; | 
|  321 } |  317 } | 
|  322 #endif |  318 #endif | 
| OLD | NEW |