)]}'
{
  "commit": "7c9b2b33ac5759b0443d8f6e01f07432ff034c12",
  "tree": "dc17a6e598cc1fa6a8b2846152ebd151b0e0dade",
  "parents": [
    "a066864b6e4f48f013204605bbb52dfcc28d0ee6"
  ],
  "author": {
    "name": "Lei Zhang",
    "email": "thestig@chromium.org",
    "time": "Mon Apr 17 23:28:55 2023 +0000"
  },
  "committer": {
    "name": "Lei Zhang",
    "email": "thestig@chromium.org",
    "time": "Mon Apr 17 23:28:55 2023 +0000"
  },
  "message": "Cherry-pick code to improve PDF object tracking\n\nThis cherry-picks the following CLs and squashes them into a single CL\nfor easier merging:\n\nAdd RemoveTextObjectWithTwoPagesSharingContentStreamAndResources test\n\nChange-Id: I5fc0f0888d71368c0dd257931e4a1013301f639f\nReviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/105212\n(cherry picked from commit 7bfe65fa528d99232031ac203b2e56da44643db3)\n\nAdd RemoveTextObjectWithTwoPagesSharingContentArrayAndResources test\n\nChange-Id: I396d1cf0a9d3da88337c459aa7ef6f6ec189bb1d\nReviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/105491\n(cherry picked from commit f3d0f929f461effa86ac27716bd304ba7d534445)\n\nSwitch CPDF_PageContentManager to have a CPDF_Document pointer\n\nChange-Id: Iebc74c98071241ea220a185d43937749b9885c76\nReviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/105531\n(cherry picked from commit 0a111609332bb25f78e7485778f3457648954493)\n\nFix nits in cpdf_pagecontentmanager.h\n\nChange-Id: I512e5b3d5b976a2485196ae765dd8c1c98275e67\nReviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/105472\n(cherry picked from commit 4e8a0feaafffd19f747e373bd9f98927ddd3a61f)\n\nEncapsulate more in CPDF_PageContentManager\n\nChange-Id: I198bcd4972603989123b01ff53bd455395f26d5b\nReviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/105530\n(cherry picked from commit 06a0689d429fde72152dc6c9c2245b86c045ee8a)\n\nAdd some using statements in fpdf_save_embeddertest.cpp\n\nChange-Id: If1b9064532740e5de7074f747c23cc0de878ca0c\nReviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/105552\n(cherry picked from commit 5018240ebf009a67fc9b2613a6f3f8bda1e80c03)\n\nTest trailer generation in FPDFSaveEmbedderTest.SaveLinearizedDoc\n\nChange-Id: I3dfc67b5839af85f73c15555cf23f2fe9b9c687a\nReviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/105533\n(cherry picked from commit 1f4904f680cd7a63d96f072a371ef20ce939cd7a)\n\nCheck for removed resources in saved output in RemoveTextObject test\n\nChange-Id: Ia934158b5fd72a42fba0125aa1637d1c980bda3c\nReviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/105570\n(cherry picked from commit 4d48929e3ffc3d43f2b72383a761d3df6e859e57)\n\nAdd RemoveTextObjectWithTwoPagesSharingResources test\n\nChange-Id: If14cb333430a5bb11e50fbb6fd86f1898cf5f29a\nReviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/105590\n(cherry picked from commit 01ea024b74dc8fcc16001792ef5b20b53f3959f0)\n\nSave the trailer\u0027s object number when parsing\n\nChange-Id: I86f980a09d2214c50412ce65a905dd92ebc85a6a\nReviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/105610\n(cherry picked from commit 1e5dee361ee112e2b152ae7890a0fef567ccc4e9)\n\nAdd object tree traversal utility functions\n\nChange-Id: I28817068d50c79f36d12bd50c1910937241194a5\nReviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/105611\n(cherry picked from commit 01b85b79a2bba7e895a18a32dbee840eae81eb31)\n\nAvoid generating PDFs with unreferenced objects\n\nChange-Id: I4c9d447ab745732909c4f7b5c6061886428a92dd\nReviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/105612\n(cherry picked from commit 28f8db4c040f33c1d0955747e2aef11d3803f321)\n\nKeep track of Font and XObject resources\n\nChange-Id: I510e6c51eda28535ed00e87b6e10971f7178122c\nReviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/105613\n(cherry picked from commit 69703b37cc02aceac37b504d34b50f1c3c24302a)\n\nKeep track of ExtGState resources\n\nChange-Id: I786a515b4ddcfa9ea2dccb94d3d7ad6a189ec7ce\nReviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/105614\n(cherry picked from commit 9b9bf7539e7795c44a2b9985232a8cda652b53f0)\n\nRemove a duplicate FPDFEditEmbedderTest test case\n\nChange-Id: Ieb0806520af652501930ad10fcdbfd33b5952c9d\nReviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/105710\n(cherry picked from commit 02516521c768c4a07ffeef6f1f32ad72cfd7c1d1)\n\nAdd RemoveTextObjectWithTwoPagesSharingResourcesDict test case\n\nChange-Id: I30d4f35e41c5be78568aab118eb90d460d1c030e\nReviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/105730\n(cherry picked from commit 6c3577ca2ff7f3e6dc498f1b61be384f29db18d3)\n\nSplit CPDF_PageContentGenerator::UpdateContentStreams()\n\nChange-Id: I9a688fd486bb851dceedca633856bbe5471b9b71\nReviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/105732\n(cherry picked from commit 31f23b9263ab8de97b6884bca23dc30a3c520e1a)\n\nDo copy-on-write in CPDF_PageContentGenerator\n\nChange-Id: I9e5659421ee6e6d8b7807bc4159fe086f70982ef\nReviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/105733\n(cherry picked from commit 692f0719e4cd4387daca51fb3a0151929648aa11)\n\nDo copy-on-write in CPDF_PageContentManager\n\nChange-Id: I4b52894ab44889bae0df9415542f018c91436c1a\nReviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/105630\n(cherry picked from commit ef30200275bbfdea90782f1a1d62c0474aab0e74)\n\nBug: chromium:1428724,pdfium:2012\nChange-Id: I7148a4d6c30666792ea0c8cc6ae5186495afb343\nReviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/106190\nReviewed-by: Tom Sepez \u003ctsepez@chromium.org\u003e\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "3c9675e425b28e6567fe707bd7c9f2479ac7cad3",
      "old_mode": 33188,
      "old_path": "core/fpdfapi/edit/cpdf_creator.cpp",
      "new_id": "9a2b88b98519b950396340cc2a960e0e116ef171",
      "new_mode": 33188,
      "new_path": "core/fpdfapi/edit/cpdf_creator.cpp"
    },
    {
      "type": "modify",
      "old_id": "734a717d8e68df71a8e298d0da7bd9b4665a3020",
      "old_mode": 33188,
      "old_path": "core/fpdfapi/edit/cpdf_pagecontentgenerator.cpp",
      "new_id": "87170284364857c471f2567ff91a31d24fe78f2e",
      "new_mode": 33188,
      "new_path": "core/fpdfapi/edit/cpdf_pagecontentgenerator.cpp"
    },
    {
      "type": "modify",
      "old_id": "45894f3dfb44a4e37c7957bc1610bf88dd8b7deb",
      "old_mode": 33188,
      "old_path": "core/fpdfapi/edit/cpdf_pagecontentgenerator.h",
      "new_id": "06bb239c2791d05b09e07cbb86979468ab6e62ec",
      "new_mode": 33188,
      "new_path": "core/fpdfapi/edit/cpdf_pagecontentgenerator.h"
    },
    {
      "type": "modify",
      "old_id": "de977c9b82a650118cc48a860820e6ad07a4a390",
      "old_mode": 33188,
      "old_path": "core/fpdfapi/edit/cpdf_pagecontentmanager.cpp",
      "new_id": "4be22e61fe07628196c13286f69c80351eac6c95",
      "new_mode": 33188,
      "new_path": "core/fpdfapi/edit/cpdf_pagecontentmanager.cpp"
    },
    {
      "type": "modify",
      "old_id": "301384a6ffcaa797823eeb29748dedba057c8b4b",
      "old_mode": 33188,
      "old_path": "core/fpdfapi/edit/cpdf_pagecontentmanager.h",
      "new_id": "5785fc3baa3c59db2089f0474a7162b4fe57f9f7",
      "new_mode": 33188,
      "new_path": "core/fpdfapi/edit/cpdf_pagecontentmanager.h"
    },
    {
      "type": "modify",
      "old_id": "dee1724fd4e1198f42d07c25fa582978abcc9d8d",
      "old_mode": 33188,
      "old_path": "core/fpdfapi/font/cpdf_font.h",
      "new_id": "a74cba9acab977cfb4a7aed98f033e4e7500e0c3",
      "new_mode": 33188,
      "new_path": "core/fpdfapi/font/cpdf_font.h"
    },
    {
      "type": "modify",
      "old_id": "07d4c4ff5d53285d21ae25ec77e5c3febbe19731",
      "old_mode": 33188,
      "old_path": "core/fpdfapi/page/cpdf_allstates.cpp",
      "new_id": "a4330db1ed3c4c83f5d11b5ab16eaf50c46563f4",
      "new_mode": 33188,
      "new_path": "core/fpdfapi/page/cpdf_allstates.cpp"
    },
    {
      "type": "modify",
      "old_id": "0ae2802a5a26918f38d4a8f4c4965deaab616ba3",
      "old_mode": 33188,
      "old_path": "core/fpdfapi/page/cpdf_allstates.h",
      "new_id": "63eb5272257db0554c33bb7469c176d23f20b56d",
      "new_mode": 33188,
      "new_path": "core/fpdfapi/page/cpdf_allstates.h"
    },
    {
      "type": "modify",
      "old_id": "b5f5e3fbc37ee1444c767d778b74fca671882754",
      "old_mode": 33188,
      "old_path": "core/fpdfapi/page/cpdf_pageobject.h",
      "new_id": "7d9d0158312e28532ead9e8946b87606f9df8795",
      "new_mode": 33188,
      "new_path": "core/fpdfapi/page/cpdf_pageobject.h"
    },
    {
      "type": "modify",
      "old_id": "c7c29117c6aa64a36c6d8599e3e67ee2d326a2e8",
      "old_mode": 33188,
      "old_path": "core/fpdfapi/page/cpdf_streamcontentparser.cpp",
      "new_id": "3bb3471fb666eb121bc10a0aa0214aae722867b2",
      "new_mode": 33188,
      "new_path": "core/fpdfapi/page/cpdf_streamcontentparser.cpp"
    },
    {
      "type": "modify",
      "old_id": "86da47d4d278b6cd12e5e799bdc3038be8af81e1",
      "old_mode": 33188,
      "old_path": "core/fpdfapi/page/cpdf_streamcontentparser.h",
      "new_id": "276dc729208c5368aebf5142d0626be6feb4f3ab",
      "new_mode": 33188,
      "new_path": "core/fpdfapi/page/cpdf_streamcontentparser.h"
    },
    {
      "type": "modify",
      "old_id": "bdc2e862eb8be35e566dbc781176877de56a825f",
      "old_mode": 33188,
      "old_path": "core/fpdfapi/parser/BUILD.gn",
      "new_id": "e3152d86a0366bd5366aa44f40fc9d4b42927a52",
      "new_mode": 33188,
      "new_path": "core/fpdfapi/parser/BUILD.gn"
    },
    {
      "type": "modify",
      "old_id": "2474931665dc8cb00358555b2ac312d8338a7924",
      "old_mode": 33188,
      "old_path": "core/fpdfapi/parser/cpdf_cross_ref_table.cpp",
      "new_id": "0bb5bb69c74394670fe09a03a31f1c4948d2afe2",
      "new_mode": 33188,
      "new_path": "core/fpdfapi/parser/cpdf_cross_ref_table.cpp"
    },
    {
      "type": "modify",
      "old_id": "c1d639f82d749210f33eecccea9400b1746eaefc",
      "old_mode": 33188,
      "old_path": "core/fpdfapi/parser/cpdf_cross_ref_table.h",
      "new_id": "246e12974c28015738dca43878ce46d9958a6905",
      "new_mode": 33188,
      "new_path": "core/fpdfapi/parser/cpdf_cross_ref_table.h"
    },
    {
      "type": "modify",
      "old_id": "e2bbfbf0c6edd499749bda77877f1c58b4297232",
      "old_mode": 33188,
      "old_path": "core/fpdfapi/parser/cpdf_parser.cpp",
      "new_id": "302aec1a1494d48958fc0be11d4ac4cde3073c29",
      "new_mode": 33188,
      "new_path": "core/fpdfapi/parser/cpdf_parser.cpp"
    },
    {
      "type": "modify",
      "old_id": "5d036a2894e8a9939b4ef0abcc613f722b3d856b",
      "old_mode": 33188,
      "old_path": "core/fpdfapi/parser/cpdf_parser.h",
      "new_id": "21dd8aaa1cfde09e66c8b452c6dc939c3d5446cb",
      "new_mode": 33188,
      "new_path": "core/fpdfapi/parser/cpdf_parser.h"
    },
    {
      "type": "modify",
      "old_id": "da686412c6c706c015c16bc63b77366d33c8015f",
      "old_mode": 33188,
      "old_path": "core/fpdfapi/parser/cpdf_parser_unittest.cpp",
      "new_id": "efde90eb81a49622b58988be6da3dc3f88a23e6a",
      "new_mode": 33188,
      "new_path": "core/fpdfapi/parser/cpdf_parser_unittest.cpp"
    },
    {
      "type": "modify",
      "old_id": "df244588bcca8b6f60a5bce371bba7aa8f98aca9",
      "old_mode": 33188,
      "old_path": "core/fpdfapi/parser/cpdf_reference.h",
      "new_id": "241b398df4cfeaed6204062777bcb610e2a67993",
      "new_mode": 33188,
      "new_path": "core/fpdfapi/parser/cpdf_reference.h"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "e1a0d52d0f5246e7778fed056e1aef3e49e9b917",
      "new_mode": 33188,
      "new_path": "core/fpdfapi/parser/object_tree_traversal_util.cpp"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "e9db96dce94d32498af6451948c6f94cdc97e853",
      "new_mode": 33188,
      "new_path": "core/fpdfapi/parser/object_tree_traversal_util.h"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "c90c77e41b722abce3414f79dc791852fe8cb18e",
      "new_mode": 33188,
      "new_path": "core/fpdfapi/parser/object_tree_traversal_util_embeddertest.cpp"
    },
    {
      "type": "modify",
      "old_id": "ce462d469c67ebdd6c2e59772ff073b25c05ff0a",
      "old_mode": 33188,
      "old_path": "fpdfsdk/fpdf_edit_embeddertest.cpp",
      "new_id": "91b9d6b4edd24da9d05ef2f9b28ef9a2f64ab876",
      "new_mode": 33188,
      "new_path": "fpdfsdk/fpdf_edit_embeddertest.cpp"
    },
    {
      "type": "modify",
      "old_id": "413bd91efaf5172e9982d695cd5a4bf74abf12c7",
      "old_mode": 33188,
      "old_path": "fpdfsdk/fpdf_save_embeddertest.cpp",
      "new_id": "3f5efd8b8ccfa0b53f101983d507c328d6aaac65",
      "new_mode": 33188,
      "new_path": "fpdfsdk/fpdf_save_embeddertest.cpp"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "ec333541b9edd7ec357dab211a7af9dbb364679b",
      "new_mode": 33188,
      "new_path": "testing/resources/hello_world_2_pages.in"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "4942e3a0067e771d1dda491c831c17a8d13f120a",
      "new_mode": 33188,
      "new_path": "testing/resources/hello_world_2_pages.pdf"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "9c307804c906ce45731ba1ca0eee7508fb5f71c8",
      "new_mode": 33188,
      "new_path": "testing/resources/hello_world_2_pages_shared_resources_dict.in"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "06b253166356d4aedac065025d86abd59b3bd2ea",
      "new_mode": 33188,
      "new_path": "testing/resources/hello_world_2_pages_shared_resources_dict.pdf"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "ef68f5c6b272a2f519fb206870bfe792a1ab17c5",
      "new_mode": 33188,
      "new_path": "testing/resources/hello_world_2_pages_split_streams.in"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "3ac829fcb0e31f63af94caddcfd35af261d21590",
      "new_mode": 33188,
      "new_path": "testing/resources/hello_world_2_pages_split_streams.pdf"
    }
  ]
}
