pdfium_test_base.cc 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. // Copyright 2018 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "pdf/pdfium/pdfium_test_base.h"
  5. #include <stdint.h>
  6. #include <memory>
  7. #include <string>
  8. #include <utility>
  9. #include "base/check_op.h"
  10. #include "base/memory/scoped_refptr.h"
  11. #include "build/build_config.h"
  12. #include "pdf/loader/url_loader.h"
  13. #include "pdf/pdfium/pdfium_engine.h"
  14. #include "pdf/pdfium/pdfium_form_filler.h"
  15. #include "pdf/test/test_client.h"
  16. #include "pdf/test/test_document_loader.h"
  17. #include "testing/gtest/include/gtest/gtest.h"
  18. #include "ui/gfx/geometry/size.h"
  19. #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
  20. #include "base/environment.h"
  21. #endif
  22. namespace chrome_pdf {
  23. namespace {
  24. #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
  25. base::FilePath GetTestFontsDir() {
  26. // base::TestSuite::Initialize() should have already set this.
  27. std::unique_ptr<base::Environment> env(base::Environment::Create());
  28. std::string fontconfig_sysroot;
  29. CHECK(env->GetVar("FONTCONFIG_SYSROOT", &fontconfig_sysroot));
  30. return base::FilePath(fontconfig_sysroot).AppendASCII("test_fonts");
  31. }
  32. #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
  33. } // namespace
  34. PDFiumTestBase::PDFiumTestBase() = default;
  35. PDFiumTestBase::~PDFiumTestBase() = default;
  36. // static
  37. bool PDFiumTestBase::UsingTestFonts() {
  38. #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
  39. return true;
  40. #else
  41. return false;
  42. #endif
  43. }
  44. void PDFiumTestBase::SetUp() {
  45. InitializePDFium();
  46. }
  47. void PDFiumTestBase::TearDown() {
  48. FPDF_DestroyLibrary();
  49. }
  50. std::unique_ptr<PDFiumEngine> PDFiumTestBase::InitializeEngine(
  51. TestClient* client,
  52. const base::FilePath::CharType* pdf_name) {
  53. InitializeEngineResult result =
  54. InitializeEngineWithoutLoading(client, pdf_name);
  55. if (result.engine) {
  56. // Simulate initializing plugin geometry.
  57. result.engine->PluginSizeUpdated({});
  58. // Incrementally read the PDF. To detect linearized PDFs, the first read
  59. // should be at least 1024 bytes.
  60. while (result.document_loader->SimulateLoadData(1024))
  61. continue;
  62. }
  63. return std::move(result.engine);
  64. }
  65. PDFiumTestBase::InitializeEngineResult
  66. PDFiumTestBase::InitializeEngineWithoutLoading(
  67. TestClient* client,
  68. const base::FilePath::CharType* pdf_name) {
  69. InitializeEngineResult result;
  70. result.engine = std::make_unique<PDFiumEngine>(
  71. client, PDFiumFormFiller::ScriptOption::kNoJavaScript);
  72. client->set_engine(result.engine.get());
  73. auto test_loader =
  74. std::make_unique<TestDocumentLoader>(result.engine.get(), pdf_name);
  75. result.document_loader = test_loader.get();
  76. result.engine->SetDocumentLoaderForTesting(std::move(test_loader));
  77. if (!result.engine->HandleDocumentLoad(nullptr,
  78. "https://chromium.org/dummy.pdf")) {
  79. client->set_engine(nullptr);
  80. result.engine = nullptr;
  81. result.document_loader = nullptr;
  82. }
  83. return result;
  84. }
  85. void PDFiumTestBase::InitializePDFium() {
  86. font_paths_.clear();
  87. #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
  88. test_fonts_path_ = GetTestFontsDir();
  89. font_paths_.push_back(test_fonts_path_.value().c_str());
  90. // When non-empty, `font_paths_` has to be terminated with a nullptr.
  91. font_paths_.push_back(nullptr);
  92. #endif
  93. FPDF_LIBRARY_CONFIG config;
  94. config.version = 3;
  95. config.m_pUserFontPaths = font_paths_.data();
  96. config.m_pIsolate = nullptr;
  97. config.m_v8EmbedderSlot = 0;
  98. config.m_pPlatform = nullptr;
  99. FPDF_InitLibraryWithConfig(&config);
  100. }
  101. const PDFiumPage& PDFiumTestBase::GetPDFiumPageForTest(
  102. const PDFiumEngine& engine,
  103. size_t page_index) {
  104. return GetPDFiumPageForTest(const_cast<PDFiumEngine&>(engine), page_index);
  105. }
  106. PDFiumPage& PDFiumTestBase::GetPDFiumPageForTest(PDFiumEngine& engine,
  107. size_t page_index) {
  108. DCHECK_LT(page_index, engine.pages_.size());
  109. PDFiumPage* page = engine.pages_[page_index].get();
  110. DCHECK(page);
  111. return *page;
  112. }
  113. PDFiumTestBase::InitializeEngineResult::InitializeEngineResult() = default;
  114. PDFiumTestBase::InitializeEngineResult::InitializeEngineResult(
  115. InitializeEngineResult&& other) noexcept = default;
  116. PDFiumTestBase::InitializeEngineResult&
  117. PDFiumTestBase::InitializeEngineResult::operator=(
  118. InitializeEngineResult&& other) noexcept = default;
  119. PDFiumTestBase::InitializeEngineResult::~InitializeEngineResult() = default;
  120. void PDFiumTestBase::InitializeEngineResult::FinishLoading() {
  121. ASSERT_TRUE(document_loader);
  122. while (document_loader->SimulateLoadData(UINT32_MAX))
  123. continue;
  124. }
  125. } // namespace chrome_pdf