Fix encoding problem in FPDFAnnot_SetAP(). BUG=pdfium:1212 Change-Id: I1266b04adc83179d453b6fc6c61f815cd7795cfe Reviewed-on: https://pdfium-review.googlesource.com/c/47710 Commit-Queue: Lei Zhang <thestig@chromium.org> Reviewed-by: Tom Sepez <tsepez@chromium.org>
diff --git a/fpdfsdk/fpdf_annot.cpp b/fpdfsdk/fpdf_annot.cpp index fa13c2c..8cd57f8 100644 --- a/fpdfsdk/fpdf_annot.cpp +++ b/fpdfsdk/fpdf_annot.cpp
@@ -785,7 +785,7 @@ if (!pApDict) pApDict = pAnnotDict->SetNewFor<CPDF_Dictionary>("AP"); - ByteString newValue = ByteStringFromFPDFWideString(value); + ByteString newValue = PDF_EncodeText(WideStringFromFPDFWideString(value)); auto pNewApStream = pdfium::MakeUnique<CPDF_Stream>(); pNewApStream->SetData(newValue.AsRawSpan()); pApDict->SetFor(modeKey, std::move(pNewApStream));
diff --git a/fpdfsdk/fpdf_annot_embeddertest.cpp b/fpdfsdk/fpdf_annot_embeddertest.cpp index 4c9a7f1..4e84d89 100644 --- a/fpdfsdk/fpdf_annot_embeddertest.cpp +++ b/fpdfsdk/fpdf_annot_embeddertest.cpp
@@ -1579,6 +1579,30 @@ EXPECT_STREQ(kData, BufferToWString(buf).c_str()); } + { + ScopedFPDFAnnotation annot(FPDFPage_CreateAnnot(page, FPDF_ANNOT_STAMP)); + ASSERT_TRUE(annot); + EXPECT_EQ(2, FPDFPage_GetAnnotCount(page)); + EXPECT_EQ(FPDF_ANNOT_STAMP, FPDFAnnot_GetSubtype(annot.get())); + // Also do the same test for its appearance string. + std::fill(buf.begin(), buf.end(), 'x'); + ASSERT_EQ(2u, + FPDFAnnot_GetAP(annot.get(), FPDF_ANNOT_APPEARANCEMODE_ROLLOVER, + buf.data(), buf.size())); + EXPECT_STREQ(L"", BufferToWString(buf).c_str()); + + std::unique_ptr<unsigned short, pdfium::FreeDeleter> text = + GetFPDFWideString(kData); + EXPECT_TRUE(FPDFAnnot_SetAP(annot.get(), FPDF_ANNOT_APPEARANCEMODE_ROLLOVER, + text.get())); + + std::fill(buf.begin(), buf.end(), 'x'); + ASSERT_EQ(6u, + FPDFAnnot_GetAP(annot.get(), FPDF_ANNOT_APPEARANCEMODE_ROLLOVER, + buf.data(), buf.size())); + EXPECT_STREQ(kData, BufferToWString(buf).c_str()); + } + UnloadPage(page); { @@ -1589,7 +1613,7 @@ FPDF_PAGE saved_page = LoadSavedPage(0); ASSERT_TRUE(saved_page); - EXPECT_EQ(1, FPDFPage_GetAnnotCount(saved_page)); + EXPECT_EQ(2, FPDFPage_GetAnnotCount(saved_page)); { ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(saved_page, 0)); ASSERT_TRUE(annot); @@ -1601,6 +1625,18 @@ EXPECT_STREQ(kData, BufferToWString(buf).c_str()); } + { + ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(saved_page, 0)); + ASSERT_TRUE(annot); + // TODO(thestig): This return FPDF_ANNOT_UNKNOWN for some reason. + // EXPECT_EQ(FPDF_ANNOT_TEXT, FPDFAnnot_GetSubtype(annot.get())); + + std::fill(buf.begin(), buf.end(), 'x'); + ASSERT_EQ(6u, FPDFAnnot_GetStringValue(annot.get(), kTestKey, buf.data(), + buf.size())); + EXPECT_STREQ(kData, BufferToWString(buf).c_str()); + } + CloseSavedPage(saved_page); CloseSavedDocument(); }