Skip to content

Commit

Permalink
Refactor TextField to have a base struct FormField
Browse files Browse the repository at this point in the history
This CL refactors TextField struct to have a base struct FormField. This
change is needed so that other form fields can be populated in future.

Bug: 1030242
Change-Id: I4e6f45ca2bcb0e4a5e57de35622d12d29889c8c0
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2251615
Commit-Queue: Mansi Awasthi <maawas@microsoft.com>
Reviewed-by: Lei Zhang <thestig@chromium.org>
Reviewed-by: Ankit Kumar 🌪️ <ankk@microsoft.com>
Cr-Commit-Position: refs/heads/master@{#780853}
  • Loading branch information
maawas authored and Commit Bot committed Jun 22, 2020
1 parent 9208e56 commit cfc83f8
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 21 deletions.
57 changes: 42 additions & 15 deletions pdf/pdfium/pdfium_page.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1169,11 +1169,7 @@ void PDFiumPage::PopulateAnnotations() {
break;
}
case FPDF_ANNOT_WIDGET: {
// TODO(crbug.com/1030242): Populate other types of form fields too.
if (FPDFAnnot_GetFormFieldType(engine_->form(), annot.get()) ==
FPDF_FORMFIELD_TEXTFIELD) {
PopulateTextField(annot.get());
}
PopulateFormField(annot.get());
break;
}
default:
Expand Down Expand Up @@ -1234,23 +1230,48 @@ void PDFiumPage::PopulateTextField(FPDF_ANNOTATION annot) {
DCHECK_EQ(FPDFAnnot_GetFormFieldType(form_handle, annot),
FPDF_FORMFIELD_TEXTFIELD);

FS_RECTF rect;
if (!FPDFAnnot_GetRect(annot, &rect))
TextField text_field;
if (!PopulateFormFieldProperties(annot, &text_field))
return;

TextField text_field;
// We use the bounding box of the text field as the bounding rect.
text_field.bounding_rect =
PageToScreen(pp::Point(), 1.0, rect.left, rect.top, rect.right,
rect.bottom, PageOrientation::kOriginal);
text_field.value = base::UTF16ToUTF8(CallPDFiumWideStringBufferApi(
base::BindRepeating(&FPDFAnnot_GetFormFieldValue, form_handle, annot),
/*check_expected_size=*/true));
text_field.name = base::UTF16ToUTF8(CallPDFiumWideStringBufferApi(
text_fields_.push_back(std::move(text_field));
}

void PDFiumPage::PopulateFormField(FPDF_ANNOTATION annot) {
DCHECK_EQ(FPDFAnnot_GetSubtype(annot), FPDF_ANNOT_WIDGET);
int form_field_type = FPDFAnnot_GetFormFieldType(engine_->form(), annot);

// TODO(crbug.com/1030242): Populate other types of form fields too.
switch (form_field_type) {
case FPDF_FORMFIELD_TEXTFIELD: {
PopulateTextField(annot);
break;
}
default:
break;
}
}

bool PDFiumPage::PopulateFormFieldProperties(FPDF_ANNOTATION annot,
FormField* form_field) {
DCHECK(annot);
FS_RECTF rect;
if (!FPDFAnnot_GetRect(annot, &rect))
return false;

// We use the bounding box of the form field as the bounding rect.
form_field->bounding_rect =
PageToScreen(pp::Point(), 1.0, rect.left, rect.top, rect.right,
rect.bottom, PageOrientation::kOriginal);
FPDF_FORMHANDLE form_handle = engine_->form();
form_field->name = base::UTF16ToUTF8(CallPDFiumWideStringBufferApi(
base::BindRepeating(&FPDFAnnot_GetFormFieldName, form_handle, annot),
/*check_expected_size=*/true));
text_field.flags = FPDFAnnot_GetFormFieldFlags(form_handle, annot);
text_fields_.push_back(std::move(text_field));
form_field->flags = FPDFAnnot_GetFormFieldFlags(form_handle, annot);
return true;
}

bool PDFiumPage::GetUnderlyingTextRangeForRect(const pp::FloatRect& rect,
Expand Down Expand Up @@ -1382,6 +1403,12 @@ PDFiumPage::Highlight::Highlight(const Highlight& that) = default;

PDFiumPage::Highlight::~Highlight() = default;

PDFiumPage::FormField::FormField() = default;

PDFiumPage::FormField::FormField(const FormField& that) = default;

PDFiumPage::FormField::~FormField() = default;

PDFiumPage::TextField::TextField() = default;

PDFiumPage::TextField::TextField(const TextField& that) = default;
Expand Down
24 changes: 18 additions & 6 deletions pdf/pdfium/pdfium_page.h
Original file line number Diff line number Diff line change
Expand Up @@ -235,18 +235,26 @@ class PDFiumPage {
std::string note_text;
};

// Represents a form field within the page.
struct FormField {
FormField();
FormField(const FormField& other);
~FormField();

pp::Rect bounding_rect;
// Represents the name of form field as defined in the field dictionary.
std::string name;
// Represents the flags of form field as defined in the field dictionary.
int flags;
};

// Represents a text field within the page.
struct TextField {
struct TextField : FormField {
TextField();
TextField(const TextField& other);
~TextField();

// Represents the name of form field as defined in the field dictionary.
std::string name;
std::string value;
pp::Rect bounding_rect;
// Represents the flags of form field as defined in the field dictionary.
int flags;
};

// Returns a link index if the given character index is over a link, or -1
Expand All @@ -266,6 +274,8 @@ class PDFiumPage {
void PopulateHighlight(FPDF_ANNOTATION annot);
// Populate |text_fields_| with |annot|.
void PopulateTextField(FPDF_ANNOTATION annot);
// Populate form fields like text field on the page.
void PopulateFormField(FPDF_ANNOTATION annot);
// Returns link type and fills target associated with a destination. Returns
// NONSELECTABLE_AREA if detection failed.
Area GetDestinationTarget(FPDF_DEST destination, LinkTarget* target);
Expand Down Expand Up @@ -305,6 +315,8 @@ class PDFiumPage {
static uint32_t CountLinkHighlightOverlaps(
const std::vector<Link>& links,
const std::vector<Highlight>& highlights);
bool PopulateFormFieldProperties(FPDF_ANNOTATION annot,
FormField* form_field);

PDFiumEngine* engine_;
ScopedFPDFPage page_;
Expand Down

0 comments on commit cfc83f8

Please sign in to comment.