Add Deleter and Scoper for FPDF_PAGELINK.

Change-Id: Ie997bfa5437d4222a381be3fc2b4334d6c8e2d5b
Reviewed-on: https://pdfium-review.googlesource.com/38190
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/fpdfsdk/fpdf_text_embeddertest.cpp b/fpdfsdk/fpdf_text_embeddertest.cpp
index 112991f..eafe1a2 100644
--- a/fpdfsdk/fpdf_text_embeddertest.cpp
+++ b/fpdfsdk/fpdf_text_embeddertest.cpp
@@ -7,6 +7,7 @@
 #include <utility>
 
 #include "core/fxcrt/fx_memory.h"
+#include "public/cpp/fpdf_scopers.h"
 #include "public/fpdf_text.h"
 #include "public/fpdf_transformpage.h"
 #include "public/fpdfview.h"
@@ -321,17 +322,22 @@
   FPDF_TEXTPAGE textpage = FPDFText_LoadPage(page);
   ASSERT_TRUE(textpage);
 
+  {
+    ScopedFPDFPageLink pagelink(FPDFLink_LoadWebLinks(textpage));
+    EXPECT_TRUE(pagelink);
+
+    // Page contains two HTTP-style URLs.
+    EXPECT_EQ(2, FPDFLink_CountWebLinks(pagelink.get()));
+
+    // Only a terminating NUL required for bogus links.
+    EXPECT_EQ(1, FPDFLink_GetURL(pagelink.get(), 2, nullptr, 0));
+    EXPECT_EQ(1, FPDFLink_GetURL(pagelink.get(), 1400, nullptr, 0));
+    EXPECT_EQ(1, FPDFLink_GetURL(pagelink.get(), -1, nullptr, 0));
+  }
+
   FPDF_PAGELINK pagelink = FPDFLink_LoadWebLinks(textpage);
   EXPECT_TRUE(pagelink);
 
-  // Page contains two HTTP-style URLs.
-  EXPECT_EQ(2, FPDFLink_CountWebLinks(pagelink));
-
-  // Only a terminating NUL required for bogus links.
-  EXPECT_EQ(1, FPDFLink_GetURL(pagelink, 2, nullptr, 0));
-  EXPECT_EQ(1, FPDFLink_GetURL(pagelink, 1400, nullptr, 0));
-  EXPECT_EQ(1, FPDFLink_GetURL(pagelink, -1, nullptr, 0));
-
   // Query the number of characters required for each link (incl NUL).
   EXPECT_EQ(25, FPDFLink_GetURL(pagelink, 0, nullptr, 0));
   EXPECT_EQ(26, FPDFLink_GetURL(pagelink, 1, nullptr, 0));
diff --git a/public/cpp/fpdf_deleters.h b/public/cpp/fpdf_deleters.h
index 51e7cba..d9d95cd 100644
--- a/public/cpp/fpdf_deleters.h
+++ b/public/cpp/fpdf_deleters.h
@@ -45,6 +45,12 @@
   inline void operator()(FPDF_PAGE page) { FPDF_ClosePage(page); }
 };
 
+struct FPDFPageLinkDeleter {
+  inline void operator()(FPDF_PAGELINK pagelink) {
+    FPDFLink_CloseWebLinks(pagelink);
+  }
+};
+
 struct FPDFStructTreeDeleter {
   inline void operator()(FPDF_STRUCTTREE tree) { FPDF_StructTree_Close(tree); }
 };
diff --git a/public/cpp/fpdf_scopers.h b/public/cpp/fpdf_scopers.h
index 1898ac8..3601f47 100644
--- a/public/cpp/fpdf_scopers.h
+++ b/public/cpp/fpdf_scopers.h
@@ -44,6 +44,10 @@
 using ScopedFPDFPage =
     std::unique_ptr<std::remove_pointer<FPDF_PAGE>::type, FPDFPageDeleter>;
 
+using ScopedFPDFPageLink =
+    std::unique_ptr<std::remove_pointer<FPDF_PAGELINK>::type,
+                    FPDFPageLinkDeleter>;
+
 using ScopedFPDFStructTree =
     std::unique_ptr<std::remove_pointer<FPDF_STRUCTTREE>::type,
                     FPDFStructTreeDeleter>;