From ec2687680b0d033c3634e8dd0f8d8586c13494f6 Mon Sep 17 00:00:00 2001 From: tonikitoo Date: Wed, 10 Aug 2016 12:29:28 -0700 Subject: Make Document's 'info' property readonly As per the PDF specification in [1], page 103, the 'info' property of the Document object is readonly. [1] http://partners.adobe.com/public/developer/en/acrobat/sdk/5186AcroJS.pdf Review-Url: https://codereview.chromium.org/2235883003 --- fpdfsdk/javascript/Document.cpp | 62 ++++++++++++++++++++++------------------- 1 file changed, 33 insertions(+), 29 deletions(-) (limited to 'fpdfsdk') diff --git a/fpdfsdk/javascript/Document.cpp b/fpdfsdk/javascript/Document.cpp index 40e1312530..ea77e1cfad 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(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 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 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; } -- cgit v1.2.3