summaryrefslogtreecommitdiff
path: root/fpdfsdk/javascript/Document.cpp
diff options
context:
space:
mode:
authortonikitoo <tonikitoo@igalia.com>2016-08-08 16:14:05 -0700
committerCommit bot <commit-bot@chromium.org>2016-08-08 16:14:05 -0700
commit1c836753bb86b3eb0e130f1d92868a273bb26ab8 (patch)
tree35a4cc074fc56bd53112492b48dece10e1519470 /fpdfsdk/javascript/Document.cpp
parent727da4f329956406b936ba9c0bc49ab2d32db67e (diff)
downloadpdfium-1c836753bb86b3eb0e130f1d92868a273bb26ab8.tar.xz
Add support to Document::gotoNamedDest method.
Patch implements the Document's API gotoNamedDest, which is part of the PDF specification [1], page 129, with the following (short) description: "Use this method to go to a named destination within the PDF document". [1] http://partners.adobe.com/public/developer/en/acrobat/sdk/5186AcroJS.pdf "Named destination" is a common concept in the PDF world. It can be used together with PDF's Links, Annotations, Bookmarks and OpenActions, as well as an action per se, in case "this.gotoNamedDest" is called directly. Note that the implementation makes use of the existing hook CPDFDoc_Environment::FFI_DoGoToAction, which ends up calling out the embedder to actually handle it. In case of Chromium, for instance, it calls PDFiumEngine::Form_DoGoToAction which only handles for now the "page" property of the "destination". Other properties, including zoom level, and scroll position are ignored for the moment. BUG=pdfium:492 Review-Url: https://codereview.chromium.org/2221823003
Diffstat (limited to 'fpdfsdk/javascript/Document.cpp')
-rw-r--r--fpdfsdk/javascript/Document.cpp49
1 files changed, 49 insertions, 0 deletions
diff --git a/fpdfsdk/javascript/Document.cpp b/fpdfsdk/javascript/Document.cpp
index 161a5d09e9..8175fba697 100644
--- a/fpdfsdk/javascript/Document.cpp
+++ b/fpdfsdk/javascript/Document.cpp
@@ -10,9 +10,11 @@
#include "core/fpdfapi/fpdf_font/include/cpdf_font.h"
#include "core/fpdfapi/fpdf_page/include/cpdf_page.h"
+#include "core/fpdfapi/fpdf_parser/include/cpdf_array.h"
#include "core/fpdfapi/fpdf_parser/include/cpdf_document.h"
#include "core/fpdfapi/fpdf_parser/include/fpdf_parser_decode.h"
#include "core/fpdfdoc/include/cpdf_interform.h"
+#include "core/fpdfdoc/include/cpdf_nametree.h"
#include "fpdfsdk/include/fsdk_mgr.h"
#include "fpdfsdk/javascript/Field.h"
#include "fpdfsdk/javascript/Icon.h"
@@ -124,6 +126,7 @@ JS_STATIC_METHOD_ENTRY(getPageNthWordQuads)
JS_STATIC_METHOD_ENTRY(getPageNumWords)
JS_STATIC_METHOD_ENTRY(getPrintParams)
JS_STATIC_METHOD_ENTRY(getURL)
+JS_STATIC_METHOD_ENTRY(gotoNamedDest)
JS_STATIC_METHOD_ENTRY(importAnFDF)
JS_STATIC_METHOD_ENTRY(importAnXFDF)
JS_STATIC_METHOD_ENTRY(importTextData)
@@ -1466,6 +1469,52 @@ FX_BOOL Document::getURL(IJS_Context* cc,
return TRUE;
}
+FX_BOOL Document::gotoNamedDest(IJS_Context* cc,
+ const std::vector<CJS_Value>& params,
+ CJS_Value& vRet,
+ CFX_WideString& sError) {
+ CJS_Context* context = (CJS_Context*)cc;
+ if (params.size() != 1) {
+ sError = JSGetStringFromID(context, IDS_STRING_JSPARAMERROR);
+ return FALSE;
+ }
+
+ CPDF_Document* pDocument = m_pDocument->GetPDFDocument();
+ if (!pDocument)
+ return FALSE;
+
+ CFX_WideString wideName = params[0].ToCFXWideString();
+ CFX_ByteString utf8Name = wideName.UTF8Encode();
+
+ CPDF_NameTree nameTree(pDocument, "Dests");
+ CPDF_Array* destArray = nameTree.LookupNamedDest(pDocument, utf8Name);
+ if (!destArray)
+ return FALSE;
+
+ CPDF_Dest dest(destArray);
+ const CPDF_Array* arrayObject = ToArray(dest.GetObject());
+
+ std::unique_ptr<float[]> scrollPositionArray;
+ int scrollPositionArraySize = 0;
+
+ if (arrayObject) {
+ scrollPositionArray.reset(new float[arrayObject->GetCount()]);
+ int j = 0;
+ for (size_t i = 2; i < arrayObject->GetCount(); i++)
+ scrollPositionArray[j++] = arrayObject->GetFloatAt(i);
+ scrollPositionArraySize = j;
+ }
+
+ CJS_Runtime* runtime = context->GetJSRuntime();
+ runtime->BeginBlock();
+ CPDFDoc_Environment* pApp = m_pDocument->GetEnv();
+ pApp->FFI_DoGoToAction(dest.GetPageIndex(pDocument), dest.GetZoomMode(),
+ scrollPositionArray.get(), scrollPositionArraySize);
+ runtime->EndBlock();
+
+ return TRUE;
+}
+
void Document::AddDelayData(CJS_DelayData* pData) {
m_DelayData.push_back(std::unique_ptr<CJS_DelayData>(pData));
}