Move PDFiumEngine::LoadDocumentMetadata() impl into standalone function
Refactor existing code buried inside PDFiumEngine into a standalone GetPDFiumDocumentMetadata() function that returns a struct DocumentMetadata. This makes it possible for PDFiumEngineExports to call it in a follow-up CL without having to repeat some of the same code. This also reduces the amount of code in PDFiumEngine, and makes the code that was in LoadDocumentMetadata() easier to unit test. To make the code compile, change DocumentMetadata to be movable. Bug: 40864319 Change-Id: Ib43151725465264cea43ae414ddd02f41bfc7f88 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5319146 Reviewed-by: Ben Wagner <bungeman@chromium.org> Commit-Queue: Lei Zhang <thestig@chromium.org> Cr-Commit-Position: refs/heads/main@{#1264643}
This commit is contained in:

committed by
Chromium LUCI CQ

parent
cad8149a0a
commit
7c06a66611
@ -104,6 +104,8 @@ if (enable_pdf) {
|
||||
"pdfium/pdfium_api_string_buffer_adapter.h",
|
||||
"pdfium/pdfium_document.cc",
|
||||
"pdfium/pdfium_document.h",
|
||||
"pdfium/pdfium_document_metadata.cc",
|
||||
"pdfium/pdfium_document_metadata.h",
|
||||
"pdfium/pdfium_engine.cc",
|
||||
"pdfium/pdfium_engine.h",
|
||||
"pdfium/pdfium_engine_exports.cc",
|
||||
|
@ -8,6 +8,11 @@ namespace chrome_pdf {
|
||||
|
||||
DocumentMetadata::DocumentMetadata() = default;
|
||||
|
||||
DocumentMetadata::DocumentMetadata(DocumentMetadata&&) noexcept = default;
|
||||
|
||||
DocumentMetadata& DocumentMetadata::operator=(
|
||||
DocumentMetadata&& other) noexcept = default;
|
||||
|
||||
DocumentMetadata::~DocumentMetadata() = default;
|
||||
|
||||
} // namespace chrome_pdf
|
||||
|
@ -43,8 +43,8 @@ enum class FormType {
|
||||
// 32000-1:2008 spec).
|
||||
struct DocumentMetadata {
|
||||
DocumentMetadata();
|
||||
DocumentMetadata(const DocumentMetadata&) = delete;
|
||||
DocumentMetadata& operator=(const DocumentMetadata&) = delete;
|
||||
DocumentMetadata(DocumentMetadata&&) noexcept;
|
||||
DocumentMetadata& operator=(DocumentMetadata&& other) noexcept;
|
||||
~DocumentMetadata();
|
||||
|
||||
// Version of the document.
|
||||
|
107
pdf/pdfium/pdfium_document_metadata.cc
Normal file
107
pdf/pdfium/pdfium_document_metadata.cc
Normal file
@ -0,0 +1,107 @@
|
||||
// Copyright 2024 The Chromium Authors
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#include "pdf/pdfium/pdfium_document_metadata.h"
|
||||
|
||||
#include <stddef.h>
|
||||
|
||||
#include <string>
|
||||
|
||||
#include "base/check.h"
|
||||
#include "base/functional/bind.h"
|
||||
#include "base/strings/string_util.h"
|
||||
#include "base/strings/utf_string_conversions.h"
|
||||
#include "pdf/document_metadata.h"
|
||||
#include "pdf/pdf_utils/dates.h"
|
||||
#include "pdf/pdfium/pdfium_api_string_buffer_adapter.h"
|
||||
#include "third_party/pdfium/public/fpdf_doc.h"
|
||||
#include "third_party/pdfium/public/fpdf_formfill.h"
|
||||
#include "third_party/pdfium/public/fpdfview.h"
|
||||
|
||||
namespace chrome_pdf {
|
||||
|
||||
namespace {
|
||||
|
||||
// Retrieves the value of `field` in the document information dictionary.
|
||||
// Trims whitespace characters from the retrieved value.
|
||||
std::string GetTrimmedMetadataByField(FPDF_DOCUMENT doc,
|
||||
FPDF_BYTESTRING field) {
|
||||
CHECK(doc);
|
||||
|
||||
std::u16string metadata = CallPDFiumWideStringBufferApi(
|
||||
base::BindRepeating(&FPDF_GetMetaText, doc, field),
|
||||
/*check_expected_size=*/false);
|
||||
|
||||
return base::UTF16ToUTF8(base::TrimWhitespace(metadata, base::TRIM_ALL));
|
||||
}
|
||||
|
||||
// Retrieves the version of the PDF (e.g. 1.4 or 2.0) as an enum.
|
||||
PdfVersion GetDocumentVersion(FPDF_DOCUMENT doc) {
|
||||
CHECK(doc);
|
||||
|
||||
int version;
|
||||
if (!FPDF_GetFileVersion(doc, &version)) {
|
||||
return PdfVersion::kUnknown;
|
||||
}
|
||||
|
||||
switch (version) {
|
||||
case 10:
|
||||
return PdfVersion::k1_0;
|
||||
case 11:
|
||||
return PdfVersion::k1_1;
|
||||
case 12:
|
||||
return PdfVersion::k1_2;
|
||||
case 13:
|
||||
return PdfVersion::k1_3;
|
||||
case 14:
|
||||
return PdfVersion::k1_4;
|
||||
case 15:
|
||||
return PdfVersion::k1_5;
|
||||
case 16:
|
||||
return PdfVersion::k1_6;
|
||||
case 17:
|
||||
return PdfVersion::k1_7;
|
||||
case 18:
|
||||
return PdfVersion::k1_8;
|
||||
case 20:
|
||||
return PdfVersion::k2_0;
|
||||
default:
|
||||
return PdfVersion::kUnknown;
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
DocumentMetadata GetPDFiumDocumentMetadata(FPDF_DOCUMENT doc,
|
||||
size_t size_bytes,
|
||||
size_t page_count,
|
||||
bool linearized,
|
||||
bool has_attachments) {
|
||||
CHECK(doc);
|
||||
|
||||
DocumentMetadata doc_metadata;
|
||||
|
||||
doc_metadata.version = GetDocumentVersion(doc);
|
||||
doc_metadata.size_bytes = size_bytes;
|
||||
doc_metadata.page_count = page_count;
|
||||
doc_metadata.linearized = linearized;
|
||||
doc_metadata.has_attachments = has_attachments;
|
||||
doc_metadata.form_type = static_cast<FormType>(FPDF_GetFormType(doc));
|
||||
|
||||
// Document information dictionary entries
|
||||
doc_metadata.title = GetTrimmedMetadataByField(doc, "Title");
|
||||
doc_metadata.author = GetTrimmedMetadataByField(doc, "Author");
|
||||
doc_metadata.subject = GetTrimmedMetadataByField(doc, "Subject");
|
||||
doc_metadata.keywords = GetTrimmedMetadataByField(doc, "Keywords");
|
||||
doc_metadata.creator = GetTrimmedMetadataByField(doc, "Creator");
|
||||
doc_metadata.producer = GetTrimmedMetadataByField(doc, "Producer");
|
||||
doc_metadata.creation_date =
|
||||
ParsePdfDate(GetTrimmedMetadataByField(doc, "CreationDate"));
|
||||
doc_metadata.mod_date =
|
||||
ParsePdfDate(GetTrimmedMetadataByField(doc, "ModDate"));
|
||||
|
||||
return doc_metadata;
|
||||
}
|
||||
|
||||
} // namespace chrome_pdf
|
25
pdf/pdfium/pdfium_document_metadata.h
Normal file
25
pdf/pdfium/pdfium_document_metadata.h
Normal file
@ -0,0 +1,25 @@
|
||||
// Copyright 2024 The Chromium Authors
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#ifndef PDF_PDFIUM_PDFIUM_DOCUMENT_METADATA_H_
|
||||
#define PDF_PDFIUM_PDFIUM_DOCUMENT_METADATA_H_
|
||||
|
||||
#include <stddef.h>
|
||||
|
||||
#include "pdf/document_metadata.h"
|
||||
#include "third_party/pdfium/public/fpdfview.h"
|
||||
|
||||
namespace chrome_pdf {
|
||||
|
||||
// Creates a `DocumentMetadata` struct based on the input parameters. `doc` must
|
||||
// be non-null.
|
||||
DocumentMetadata GetPDFiumDocumentMetadata(FPDF_DOCUMENT doc,
|
||||
size_t size_bytes,
|
||||
size_t page_count,
|
||||
bool linearized,
|
||||
bool has_attachments);
|
||||
|
||||
} // namespace chrome_pdf
|
||||
|
||||
#endif // PDF_PDFIUM_PDFIUM_DOCUMENT_METADATA_H_
|
@ -45,9 +45,9 @@
|
||||
#include "pdf/loader/url_loader_wrapper_impl.h"
|
||||
#include "pdf/pdf_features.h"
|
||||
#include "pdf/pdf_transform.h"
|
||||
#include "pdf/pdf_utils/dates.h"
|
||||
#include "pdf/pdfium/pdfium_api_string_buffer_adapter.h"
|
||||
#include "pdf/pdfium/pdfium_document.h"
|
||||
#include "pdf/pdfium/pdfium_document_metadata.h"
|
||||
#include "pdf/pdfium/pdfium_mem_buffer_file_write.h"
|
||||
#include "pdf/pdfium/pdfium_permissions.h"
|
||||
#include "pdf/pdfium/pdfium_unsupported_features.h"
|
||||
@ -4143,69 +4143,14 @@ void PDFiumEngine::LoadDocumentAttachmentInfoList() {
|
||||
}
|
||||
|
||||
void PDFiumEngine::LoadDocumentMetadata() {
|
||||
DCHECK(document_loaded_);
|
||||
CHECK(document_loaded_);
|
||||
|
||||
doc_metadata_.version = GetDocumentVersion();
|
||||
doc_metadata_.size_bytes = GetLoadedByteSize();
|
||||
doc_metadata_.page_count = pages_.size();
|
||||
doc_metadata_.linearized = IsLinearized();
|
||||
doc_metadata_.has_attachments = !doc_attachment_info_list_.empty();
|
||||
doc_metadata_.form_type = static_cast<FormType>(FPDF_GetFormType(doc()));
|
||||
|
||||
// Document information dictionary entries
|
||||
doc_metadata_.title = GetTrimmedMetadataByField("Title");
|
||||
doc_metadata_.author = GetTrimmedMetadataByField("Author");
|
||||
doc_metadata_.subject = GetTrimmedMetadataByField("Subject");
|
||||
doc_metadata_.keywords = GetTrimmedMetadataByField("Keywords");
|
||||
doc_metadata_.creator = GetTrimmedMetadataByField("Creator");
|
||||
doc_metadata_.producer = GetTrimmedMetadataByField("Producer");
|
||||
doc_metadata_.creation_date =
|
||||
ParsePdfDate(GetTrimmedMetadataByField("CreationDate"));
|
||||
doc_metadata_.mod_date = ParsePdfDate(GetTrimmedMetadataByField("ModDate"));
|
||||
}
|
||||
|
||||
std::string PDFiumEngine::GetTrimmedMetadataByField(
|
||||
FPDF_BYTESTRING field) const {
|
||||
DCHECK(doc());
|
||||
|
||||
std::u16string metadata = CallPDFiumWideStringBufferApi(
|
||||
base::BindRepeating(&FPDF_GetMetaText, doc(), field),
|
||||
/*check_expected_size=*/false);
|
||||
|
||||
return base::UTF16ToUTF8(base::TrimWhitespace(metadata, base::TRIM_ALL));
|
||||
}
|
||||
|
||||
PdfVersion PDFiumEngine::GetDocumentVersion() const {
|
||||
DCHECK(doc());
|
||||
|
||||
int version;
|
||||
if (!FPDF_GetFileVersion(doc(), &version))
|
||||
return PdfVersion::kUnknown;
|
||||
|
||||
switch (version) {
|
||||
case 10:
|
||||
return PdfVersion::k1_0;
|
||||
case 11:
|
||||
return PdfVersion::k1_1;
|
||||
case 12:
|
||||
return PdfVersion::k1_2;
|
||||
case 13:
|
||||
return PdfVersion::k1_3;
|
||||
case 14:
|
||||
return PdfVersion::k1_4;
|
||||
case 15:
|
||||
return PdfVersion::k1_5;
|
||||
case 16:
|
||||
return PdfVersion::k1_6;
|
||||
case 17:
|
||||
return PdfVersion::k1_7;
|
||||
case 18:
|
||||
return PdfVersion::k1_8;
|
||||
case 20:
|
||||
return PdfVersion::k2_0;
|
||||
default:
|
||||
return PdfVersion::kUnknown;
|
||||
}
|
||||
doc_metadata_ = GetPDFiumDocumentMetadata(
|
||||
doc(),
|
||||
/*size_bytes=*/GetLoadedByteSize(),
|
||||
/*page_count=*/pages_.size(),
|
||||
/*linearized=*/IsLinearized(),
|
||||
/*has_attachments=*/!doc_attachment_info_list_.empty());
|
||||
}
|
||||
|
||||
bool PDFiumEngine::HandleTabEvent(int modifiers) {
|
||||
|
@ -10,10 +10,10 @@
|
||||
|
||||
#include <map>
|
||||
#include <memory>
|
||||
#include <optional>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include <optional>
|
||||
#include "base/check.h"
|
||||
#include "base/containers/flat_map.h"
|
||||
#include "base/containers/span.h"
|
||||
@ -639,13 +639,6 @@ class PDFiumEngine : public PDFEngine,
|
||||
// document is loaded.
|
||||
void LoadDocumentMetadata();
|
||||
|
||||
// Retrieves the value of `field` in the document information dictionary.
|
||||
// Trims whitespace characters from the retrieved value.
|
||||
std::string GetTrimmedMetadataByField(FPDF_BYTESTRING field) const;
|
||||
|
||||
// Retrieves the version of the PDF (e.g. 1.4 or 2.0) as an enum.
|
||||
PdfVersion GetDocumentVersion() const;
|
||||
|
||||
// This is a layer between OnKeyDown() and actual tab handling to facilitate
|
||||
// testing.
|
||||
bool HandleTabEvent(int modifiers);
|
||||
|
Reference in New Issue
Block a user