| Index: fpdfsdk/javascript/Document.cpp
 | 
| diff --git a/fpdfsdk/javascript/Document.cpp b/fpdfsdk/javascript/Document.cpp
 | 
| index 40e13125300627163b261402160b98226a4903ef..ea77e1cfad46fb660f450c43b88d73d477a7a6cb 100644
 | 
| --- a/fpdfsdk/javascript/Document.cpp
 | 
| +++ b/fpdfsdk/javascript/Document.cpp
 | 
| @@ -749,6 +749,12 @@ FX_BOOL Document::author(IJS_Context* cc,
 | 
|  FX_BOOL Document::info(IJS_Context* cc,
 | 
|                         CJS_PropValue& vp,
 | 
|                         CFX_WideString& sError) {
 | 
| +  if (vp.IsSetting()) {
 | 
| +    CJS_Context* pContext = static_cast<CJS_Context*>(cc);
 | 
| +    sError = JSGetStringFromID(pContext, IDS_STRING_JSREADONLY);
 | 
| +    return FALSE;
 | 
| +  }
 | 
| +
 | 
|    CPDF_Dictionary* pDictionary = m_pDocument->GetPDFDocument()->GetInfo();
 | 
|    if (!pDictionary)
 | 
|      return FALSE;
 | 
| @@ -763,38 +769,36 @@ FX_BOOL Document::info(IJS_Context* cc,
 | 
|    CFX_WideString cwModDate = pDictionary->GetUnicodeTextBy("ModDate");
 | 
|    CFX_WideString cwTrapped = pDictionary->GetUnicodeTextBy("Trapped");
 | 
|  
 | 
| +  CJS_Context* pContext = (CJS_Context*)cc;
 | 
| +  CJS_Runtime* pRuntime = pContext->GetJSRuntime();
 | 
| +  v8::Local<v8::Object> pObj =
 | 
| +      FXJS_NewFxDynamicObj(pRuntime->GetIsolate(), pRuntime, -1);
 | 
| +
 | 
|    v8::Isolate* isolate = GetIsolate(cc);
 | 
| -  if (vp.IsGetting()) {
 | 
| -    CJS_Context* pContext = (CJS_Context*)cc;
 | 
| -    CJS_Runtime* pRuntime = pContext->GetJSRuntime();
 | 
| -    v8::Local<v8::Object> pObj =
 | 
| -        FXJS_NewFxDynamicObj(pRuntime->GetIsolate(), pRuntime, -1);
 | 
| -    FXJS_PutObjectString(isolate, pObj, L"Author", cwAuthor);
 | 
| -    FXJS_PutObjectString(isolate, pObj, L"Title", cwTitle);
 | 
| -    FXJS_PutObjectString(isolate, pObj, L"Subject", cwSubject);
 | 
| -    FXJS_PutObjectString(isolate, pObj, L"Keywords", cwKeywords);
 | 
| -    FXJS_PutObjectString(isolate, pObj, L"Creator", cwCreator);
 | 
| -    FXJS_PutObjectString(isolate, pObj, L"Producer", cwProducer);
 | 
| -    FXJS_PutObjectString(isolate, pObj, L"CreationDate", cwCreationDate);
 | 
| -    FXJS_PutObjectString(isolate, pObj, L"ModDate", cwModDate);
 | 
| -    FXJS_PutObjectString(isolate, pObj, L"Trapped", cwTrapped);
 | 
| -
 | 
| -    // It's to be compatible to non-standard info dictionary.
 | 
| -    for (const auto& it : *pDictionary) {
 | 
| -      const CFX_ByteString& bsKey = it.first;
 | 
| -      CPDF_Object* pValueObj = it.second;
 | 
| -      CFX_WideString wsKey = CFX_WideString::FromUTF8(bsKey.AsStringC());
 | 
| -      if (pValueObj->IsString() || pValueObj->IsName()) {
 | 
| -        FXJS_PutObjectString(isolate, pObj, wsKey, pValueObj->GetUnicodeText());
 | 
| -      } else if (pValueObj->IsNumber()) {
 | 
| -        FXJS_PutObjectNumber(isolate, pObj, wsKey,
 | 
| -                             (float)pValueObj->GetNumber());
 | 
| -      } else if (pValueObj->IsBoolean()) {
 | 
| -        FXJS_PutObjectBoolean(isolate, pObj, wsKey, !!pValueObj->GetInteger());
 | 
| -      }
 | 
| +  FXJS_PutObjectString(isolate, pObj, L"Author", cwAuthor);
 | 
| +  FXJS_PutObjectString(isolate, pObj, L"Title", cwTitle);
 | 
| +  FXJS_PutObjectString(isolate, pObj, L"Subject", cwSubject);
 | 
| +  FXJS_PutObjectString(isolate, pObj, L"Keywords", cwKeywords);
 | 
| +  FXJS_PutObjectString(isolate, pObj, L"Creator", cwCreator);
 | 
| +  FXJS_PutObjectString(isolate, pObj, L"Producer", cwProducer);
 | 
| +  FXJS_PutObjectString(isolate, pObj, L"CreationDate", cwCreationDate);
 | 
| +  FXJS_PutObjectString(isolate, pObj, L"ModDate", cwModDate);
 | 
| +  FXJS_PutObjectString(isolate, pObj, L"Trapped", cwTrapped);
 | 
| +
 | 
| +  // It's to be compatible to non-standard info dictionary.
 | 
| +  for (const auto& it : *pDictionary) {
 | 
| +    const CFX_ByteString& bsKey = it.first;
 | 
| +    CPDF_Object* pValueObj = it.second;
 | 
| +    CFX_WideString wsKey = CFX_WideString::FromUTF8(bsKey.AsStringC());
 | 
| +    if (pValueObj->IsString() || pValueObj->IsName()) {
 | 
| +      FXJS_PutObjectString(isolate, pObj, wsKey, pValueObj->GetUnicodeText());
 | 
| +    } else if (pValueObj->IsNumber()) {
 | 
| +      FXJS_PutObjectNumber(isolate, pObj, wsKey, (float)pValueObj->GetNumber());
 | 
| +    } else if (pValueObj->IsBoolean()) {
 | 
| +      FXJS_PutObjectBoolean(isolate, pObj, wsKey, !!pValueObj->GetInteger());
 | 
|      }
 | 
| -    vp << pObj;
 | 
|    }
 | 
| +  vp << pObj;
 | 
|    return TRUE;
 | 
|  }
 | 
|  
 | 
| 
 |