Fix mark not saved if there are no other changes in the same object.

Bug: pdfium:1037
Change-Id: Ifcb0a4330d077895c5f02395588150f29a5466aa
Reviewed-on: https://pdfium-review.googlesource.com/37731
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Henrique Nakashima <hnakashima@chromium.org>
diff --git a/fpdfsdk/fpdf_edit_embeddertest.cpp b/fpdfsdk/fpdf_edit_embeddertest.cpp
index e47f3db..1ba227f 100644
--- a/fpdfsdk/fpdf_edit_embeddertest.cpp
+++ b/fpdfsdk/fpdf_edit_embeddertest.cpp
@@ -579,19 +579,25 @@
             GetPlatformWString(reinterpret_cast<unsigned short*>(buffer));
         EXPECT_EQ(L"Position", key);
 
-        // Should be the last object.
-        EXPECT_EQ(object_count - 1, i);
-
         EXPECT_EQ(FPDF_OBJECT_STRING,
                   FPDFPageObjMark_GetParamValueType(mark, "Position"));
         unsigned long length;
         EXPECT_TRUE(FPDFPageObjMark_GetParamStringValue(mark, "Position",
                                                         buffer, 256, &length));
         ASSERT_GT(length, 0u);
-        EXPECT_EQ((4u + 1u) * 2u, length);
         std::wstring value =
             GetPlatformWString(reinterpret_cast<unsigned short*>(buffer));
-        EXPECT_EQ(L"Last", value);
+
+        // "Position" can be "First" or "Last".
+        if (i == 0) {
+          EXPECT_EQ((5u + 1u) * 2u, length);
+          EXPECT_EQ(L"First", value);
+        } else if (i == object_count - 1) {
+          EXPECT_EQ((4u + 1u) * 2u, length);
+          EXPECT_EQ(L"Last", value);
+        } else {
+          FAIL();
+        }
       } else {
         FAIL();
       }
@@ -2138,6 +2144,39 @@
   VerifySavedDocument(612, 792, md5);
 }
 
+TEST_F(FPDFEditEmbeddertest, AddMark) {
+  // Load document with some text.
+  EXPECT_TRUE(OpenDocument("text_in_page_marked.pdf"));
+  FPDF_PAGE page = LoadPage(0);
+  ASSERT_TRUE(page);
+
+  constexpr int kExpectedObjectCount = 19;
+  CheckMarkCounts(page, 1, kExpectedObjectCount, 8, 4, 9, 1);
+
+  // Add to the first page object a "Bounds" mark with "Position": "First".
+  FPDF_PAGEOBJECT page_object = FPDFPage_GetObject(page, 0);
+  FPDF_PAGEOBJECTMARK mark = FPDFPageObj_AddMark(page_object, "Bounds");
+  EXPECT_TRUE(mark);
+  EXPECT_TRUE(
+      FPDFPageObjMark_SetStringParam(document(), mark, "Position", "First"));
+
+  CheckMarkCounts(page, 1, kExpectedObjectCount, 8, 4, 9, 2);
+
+  // Save the file
+  EXPECT_TRUE(FPDFPage_GenerateContent(page));
+  EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0));
+  UnloadPage(page);
+
+  // Re-open the file and check the new mark is present.
+  OpenSavedDocument();
+  FPDF_PAGE saved_page = LoadSavedPage(0);
+
+  CheckMarkCounts(saved_page, 1, kExpectedObjectCount, 8, 4, 9, 2);
+
+  CloseSavedPage(saved_page);
+  CloseSavedDocument();
+}
+
 TEST_F(FPDFEditEmbeddertest, AddMarkedText) {
   // Start with a blank page.
   FPDF_PAGE page = FPDFPage_New(CreateNewDocument(), 0, 612, 792);
diff --git a/fpdfsdk/fpdf_editpage.cpp b/fpdfsdk/fpdf_editpage.cpp
index 02c07d1..dbf9124 100644
--- a/fpdfsdk/fpdf_editpage.cpp
+++ b/fpdfsdk/fpdf_editpage.cpp
@@ -306,13 +306,16 @@
 
 FPDF_EXPORT FPDF_PAGEOBJECTMARK FPDF_CALLCONV
 FPDFPageObj_AddMark(FPDF_PAGEOBJECT page_object, FPDF_BYTESTRING name) {
-  if (!page_object)
+  CPDF_PageObject* pPageObj = CPDFPageObjectFromFPDFPageObject(page_object);
+  if (!pPageObj)
     return nullptr;
 
-  auto* mark = &CPDFPageObjectFromFPDFPageObject(page_object)->m_ContentMark;
+  auto* mark = &pPageObj->m_ContentMark;
   mark->AddMark(name);
   unsigned long index = mark->CountItems() - 1;
 
+  pPageObj->SetDirty(true);
+
   return FPDFPageObjectMarkFromCPDFContentMarkItem(mark->GetItem(index));
 }