diff options
author | Tom Sepez <tsepez@chromium.org> | 2018-04-23 18:02:57 +0000 |
---|---|---|
committer | Chromium commit bot <commit-bot@chromium.org> | 2018-04-23 18:02:57 +0000 |
commit | 0784c7317e3aaa2c65d098cf2593b6b49986307d (patch) | |
tree | a264d06dcd9fd0d914324d5bd0a96430cc543b87 /testing | |
parent | 9f71afb882a9d1294f8a4392b8553e2c285f51c7 (diff) | |
download | pdfium-0784c7317e3aaa2c65d098cf2593b6b49986307d.tar.xz |
Disable JavaScript entirely if no JSPlatform passed by embedder.
Allows run-time selection of whether to permit JS inside PDF. Previously,
this was a link-time decision only. This requires a little more caution
before we decide that we have the CJS_Runtime, and not the CJS_RuntimeStub
in a few casts.
Adds a kDisableJavaScript option to the form fill embeddertests.
Adds a --disable-javascript flag to the pdfium_test executable.
Also adds a --disable-xfa flag while we're at it.
Change-Id: I8d8ac95f6474459cadba9a60572fbb342e984646
Reviewed-on: https://pdfium-review.googlesource.com/31090
Reviewed-by: dsinclair <dsinclair@chromium.org>
Commit-Queue: Tom Sepez <tsepez@chromium.org>
Diffstat (limited to 'testing')
-rw-r--r-- | testing/embedder_test.cpp | 54 | ||||
-rw-r--r-- | testing/embedder_test.h | 22 | ||||
-rw-r--r-- | testing/xfa_js_embedder_test.cpp | 19 | ||||
-rw-r--r-- | testing/xfa_js_embedder_test.h | 3 |
4 files changed, 67 insertions, 31 deletions
diff --git a/testing/embedder_test.cpp b/testing/embedder_test.cpp index c39539b3fb..fd53b52fdc 100644 --- a/testing/embedder_test.cpp +++ b/testing/embedder_test.cpp @@ -100,29 +100,44 @@ bool EmbedderTest::CreateEmptyDocument() { if (!document_) return false; - form_handle_ = SetupFormFillEnvironment(document_); + form_handle_ = + SetupFormFillEnvironment(document_, JavaScriptOption::kEnableJavaScript); return true; } bool EmbedderTest::OpenDocument(const std::string& filename) { - return OpenDocumentWithOptions(filename, nullptr, false); + return OpenDocumentWithOptions(filename, nullptr, + LinearizeOption::kDefaultLinearize, + JavaScriptOption::kEnableJavaScript); } bool EmbedderTest::OpenDocumentLinearized(const std::string& filename) { - return OpenDocumentWithOptions(filename, nullptr, true); + return OpenDocumentWithOptions(filename, nullptr, + LinearizeOption::kMustLinearize, + JavaScriptOption::kEnableJavaScript); } bool EmbedderTest::OpenDocumentWithPassword(const std::string& filename, const char* password) { - return OpenDocumentWithOptions(filename, password, false); + return OpenDocumentWithOptions(filename, password, + LinearizeOption::kDefaultLinearize, + JavaScriptOption::kEnableJavaScript); +} + +bool EmbedderTest::OpenDocumentWithoutJavaScript(const std::string& filename) { + return OpenDocumentWithOptions(filename, nullptr, + LinearizeOption::kDefaultLinearize, + JavaScriptOption::kDisableJavaScript); } bool EmbedderTest::OpenDocumentWithOptions(const std::string& filename, const char* password, - bool must_linearize) { + LinearizeOption linearize_option, + JavaScriptOption javascript_option) { std::string file_path; if (!PathService::GetTestFilePath(filename, &file_path)) return false; + file_contents_ = GetFileContents(file_path.c_str(), &file_length_); if (!file_contents_) return false; @@ -136,12 +151,14 @@ bool EmbedderTest::OpenDocumentWithOptions(const std::string& filename, file_access_.m_Param = loader_; fake_file_access_ = pdfium::MakeUnique<FakeFileAccess>(&file_access_); - return OpenDocumentHelper(password, must_linearize, fake_file_access_.get(), - &document_, &avail_, &form_handle_); + return OpenDocumentHelper(password, linearize_option, javascript_option, + fake_file_access_.get(), &document_, &avail_, + &form_handle_); } bool EmbedderTest::OpenDocumentHelper(const char* password, - bool must_linearize, + LinearizeOption linearize_option, + JavaScriptOption javascript_option, FakeFileAccess* network_simulator, FPDF_DOCUMENT* document, FPDF_AVAIL* avail, @@ -186,7 +203,7 @@ bool EmbedderTest::OpenDocumentHelper(const char* password, return false; } } else { - if (must_linearize) + if (linearize_option == LinearizeOption::kMustLinearize) return false; network_simulator->SetWholeFileAvailable(); *document = @@ -194,17 +211,21 @@ bool EmbedderTest::OpenDocumentHelper(const char* password, if (!*document) return false; } - *form_handle = SetupFormFillEnvironment(*document); + *form_handle = SetupFormFillEnvironment(*document, javascript_option); + #ifdef PDF_ENABLE_XFA int doc_type = FPDF_GetFormType(*document); if (doc_type == FORMTYPE_XFA_FULL || doc_type == FORMTYPE_XFA_FOREGROUND) FPDF_LoadXFA(*document); #endif // PDF_ENABLE_XFA + (void)FPDF_GetDocPermissions(*document); return true; } -FPDF_FORMHANDLE EmbedderTest::SetupFormFillEnvironment(FPDF_DOCUMENT doc) { +FPDF_FORMHANDLE EmbedderTest::SetupFormFillEnvironment( + FPDF_DOCUMENT doc, + JavaScriptOption javascript_option) { IPDF_JSPLATFORM* platform = static_cast<IPDF_JSPLATFORM*>(this); memset(platform, '\0', sizeof(IPDF_JSPLATFORM)); platform->version = 2; @@ -221,7 +242,9 @@ FPDF_FORMHANDLE EmbedderTest::SetupFormFillEnvironment(FPDF_DOCUMENT doc) { formfillinfo->FFI_SetTimer = SetTimerTrampoline; formfillinfo->FFI_KillTimer = KillTimerTrampoline; formfillinfo->FFI_GetPage = GetPageTrampoline; - formfillinfo->m_pJsPlatform = platform; + if (javascript_option == JavaScriptOption::kEnableJavaScript) + formfillinfo->m_pJsPlatform = platform; + FPDF_FORMHANDLE form_handle = FPDFDOC_InitFormFillEnvironment(doc, formfillinfo); FPDF_SetFormFieldHighlightColor(form_handle, FPDF_FORMFIELD_UNKNOWN, @@ -337,9 +360,10 @@ FPDF_DOCUMENT EmbedderTest::OpenSavedDocument(const char* password) { saved_fake_file_access_ = pdfium::MakeUnique<FakeFileAccess>(&saved_file_access_); - EXPECT_TRUE(OpenDocumentHelper(password, false, saved_fake_file_access_.get(), - &saved_document_, &saved_avail_, - &saved_form_handle_)); + EXPECT_TRUE(OpenDocumentHelper( + password, LinearizeOption::kDefaultLinearize, + JavaScriptOption::kEnableJavaScript, saved_fake_file_access_.get(), + &saved_document_, &saved_avail_, &saved_form_handle_)); return saved_document_; } diff --git a/testing/embedder_test.h b/testing/embedder_test.h index c1f1844eba..4923180c4a 100644 --- a/testing/embedder_test.h +++ b/testing/embedder_test.h @@ -33,6 +33,9 @@ class EmbedderTest : public ::testing::Test, public FPDF_FORMFILLINFO, public FPDF_FILEWRITE { public: + enum class LinearizeOption { kDefaultLinearize, kMustLinearize }; + enum class JavaScriptOption { kDisableJavaScript, kEnableJavaScript }; + class Delegate { public: virtual ~Delegate() {} @@ -85,19 +88,22 @@ class EmbedderTest : public ::testing::Test, bool CreateEmptyDocument(); // Open the document specified by |filename|, and create its form fill - // environment, or return false on failure. - // The filename is relative to the test data directory where we store all the - // test files. - // |password| can be nullptr if there is none. + // environment, or return false on failure. The |filename| is relative to + // the test data directory where we store all the test files. |password| can + // be nullptr if the file is not password protected. If |javascript_opts| + // is kDisableJavascript, then the document will be given stubs in place + // of the real JS engine. virtual bool OpenDocumentWithOptions(const std::string& filename, const char* password, - bool must_linearize); + LinearizeOption linearize_option, + JavaScriptOption javascript_option); // Variants provided for convenience. bool OpenDocument(const std::string& filename); bool OpenDocumentLinearized(const std::string& filename); bool OpenDocumentWithPassword(const std::string& filename, const char* password); + bool OpenDocumentWithoutJavaScript(const std::string& filename); // Perform JavaScript actions that are to run at document open time. void DoOpenActions(); @@ -154,13 +160,15 @@ class EmbedderTest : public ::testing::Test, using PageNumberToHandleMap = std::map<int, FPDF_PAGE>; bool OpenDocumentHelper(const char* password, - bool must_linearize, + LinearizeOption linearize_option, + JavaScriptOption javascript_option, FakeFileAccess* network_simulator, FPDF_DOCUMENT* document, FPDF_AVAIL* avail, FPDF_FORMHANDLE* form_handle); - FPDF_FORMHANDLE SetupFormFillEnvironment(FPDF_DOCUMENT doc); + FPDF_FORMHANDLE SetupFormFillEnvironment(FPDF_DOCUMENT doc, + JavaScriptOption javascript_option); // Return the hash of |bitmap|. static std::string HashBitmap(FPDF_BITMAP bitmap); diff --git a/testing/xfa_js_embedder_test.cpp b/testing/xfa_js_embedder_test.cpp index 0fe4b7a624..995c0ed1d5 100644 --- a/testing/xfa_js_embedder_test.cpp +++ b/testing/xfa_js_embedder_test.cpp @@ -47,21 +47,24 @@ CXFA_Document* XFAJSEmbedderTest::GetXFADocument() { return UnderlyingFromFPDFDocument(document())->GetXFADoc()->GetXFADoc(); } -bool XFAJSEmbedderTest::OpenDocumentWithOptions(const std::string& filename, - const char* password, - bool must_linearize) { - if (!EmbedderTest::OpenDocumentWithOptions(filename, password, - must_linearize)) +bool XFAJSEmbedderTest::OpenDocumentWithOptions( + const std::string& filename, + const char* password, + LinearizeOption linearize_option, + JavaScriptOption javascript_option) { + // JS required for XFA. + ASSERT(javascript_option == JavaScriptOption::kEnableJavaScript); + if (!EmbedderTest::OpenDocumentWithOptions( + filename, password, linearize_option, javascript_option)) { return false; - + } script_context_ = GetXFADocument()->GetScriptContext(); return true; } bool XFAJSEmbedderTest::Execute(const ByteStringView& input) { - if (ExecuteHelper(input)) { + if (ExecuteHelper(input)) return true; - } CFXJSE_Value msg(GetIsolate()); value_->GetObjectPropertyByIdx(1, &msg); diff --git a/testing/xfa_js_embedder_test.h b/testing/xfa_js_embedder_test.h index 0ddb02ce70..73487d27c8 100644 --- a/testing/xfa_js_embedder_test.h +++ b/testing/xfa_js_embedder_test.h @@ -27,7 +27,8 @@ class XFAJSEmbedderTest : public EmbedderTest { void TearDown() override; bool OpenDocumentWithOptions(const std::string& filename, const char* password, - bool must_linearize) override; + LinearizeOption linearize_option, + JavaScriptOption javascript_option) override; v8::Isolate* GetIsolate() const { return isolate_; } CXFA_Document* GetXFADocument(); |