Revert "Merge to master: Take Jun's UTF16LE patches."

Broke chrome bindings.

This reverts commit c3e4ae5fe5067723b58a2029a95c6411c92bed15.

R=thestig@chromium.org, tsepez@chromium.org
BUG=567485

Review URL: https://codereview.chromium.org/1511773002 .
diff --git a/core/src/fxcrt/fx_basic_wstring.cpp b/core/src/fxcrt/fx_basic_wstring.cpp
index 7ea7e8e..220ffbd 100644
--- a/core/src/fxcrt/fx_basic_wstring.cpp
+++ b/core/src/fxcrt/fx_basic_wstring.cpp
@@ -287,17 +287,19 @@
   return FX_UTF8Encode(*this);
 }
 CFX_ByteString CFX_WideString::UTF16LE_Encode() const {
-  CFX_ByteString result;
-  if (!m_pData) {
-    return result;
+  if (m_pData == NULL) {
+    return CFX_ByteString(FX_BSTRC("\0\0"));
   }
   int len = m_pData->m_nDataLength;
-  FX_CHAR* buffer = result.GetBuffer(len * 2);
-  for (int i = 0; i < len; ++i) {
+  CFX_ByteString result;
+  FX_CHAR* buffer = result.GetBuffer(len * 2 + 2);
+  for (int i = 0; i < len; i++) {
     buffer[i * 2] = m_pData->m_String[i] & 0xff;
     buffer[i * 2 + 1] = m_pData->m_String[i] >> 8;
   }
-  result.ReleaseBuffer(len * 2);
+  buffer[len * 2] = 0;
+  buffer[len * 2 + 1] = 0;
+  result.ReleaseBuffer(len * 2 + 2);
   return result;
 }
 void CFX_WideString::ConvertFrom(const CFX_ByteString& str,
diff --git a/core/src/fxcrt/fx_basic_wstring_unittest.cpp b/core/src/fxcrt/fx_basic_wstring_unittest.cpp
index 22f42d7..74410dd 100644
--- a/core/src/fxcrt/fx_basic_wstring_unittest.cpp
+++ b/core/src/fxcrt/fx_basic_wstring_unittest.cpp
@@ -283,12 +283,12 @@
     CFX_WideString ws;
     CFX_ByteString bs;
   } utf16le_encode_cases[] = {
-      {L"", ByteStringLiteral("")},
-      {L"abc", ByteStringLiteral("a\0b\0c\0")},
-      {L"abcdef", ByteStringLiteral("a\0b\0c\0d\0e\0f\0")},
-      {L"abc\0def", ByteStringLiteral("a\0b\0c\0")},
-      {L"\xaabb\xccdd", ByteStringLiteral("\xbb\xaa\xdd\xcc")},
-      {L"\x3132\x6162", ByteStringLiteral("\x32\x31\x62\x61")},
+      {L"", ByteStringLiteral("\0\0")},
+      {L"abc", ByteStringLiteral("a\0b\0c\0\0\0")},
+      {L"abcdef", ByteStringLiteral("a\0b\0c\0d\0e\0f\0\0\0")},
+      {L"abc\0def", ByteStringLiteral("a\0b\0c\0\0\0")},
+      {L"\xaabb\xccdd", ByteStringLiteral("\xbb\xaa\xdd\xcc\0\0")},
+      {L"\x3132\x6162", ByteStringLiteral("\x32\x31\x62\x61\0\0")},
   };
 
   for (size_t i = 0; i < FX_ArraySize(utf16le_encode_cases); ++i) {
diff --git a/fpdfsdk/src/fpdfdoc_embeddertest.cpp b/fpdfsdk/src/fpdfdoc_embeddertest.cpp
index 221e4da..6435704 100644
--- a/fpdfsdk/src/fpdfdoc_embeddertest.cpp
+++ b/fpdfsdk/src/fpdfdoc_embeddertest.cpp
@@ -85,7 +85,7 @@
 
   FPDF_BOOKMARK child = FPDFBookmark_GetFirstChild(document(), nullptr);
   EXPECT_NE(nullptr, child);
-  EXPECT_EQ(32, FPDFBookmark_GetTitle(child, buf, sizeof(buf)));
+  EXPECT_EQ(34, FPDFBookmark_GetTitle(child, buf, sizeof(buf)));
   EXPECT_EQ(CFX_WideString(L"A Good Beginning"),
             CFX_WideString::FromUTF16LE(buf, 16));
 
@@ -93,7 +93,7 @@
 
   FPDF_BOOKMARK sibling = FPDFBookmark_GetNextSibling(document(), child);
   EXPECT_NE(nullptr, sibling);
-  EXPECT_EQ(26, FPDFBookmark_GetTitle(sibling, buf, sizeof(buf)));
+  EXPECT_EQ(28, FPDFBookmark_GetTitle(sibling, buf, sizeof(buf)));
   EXPECT_EQ(CFX_WideString(L"A Good Ending"),
             CFX_WideString::FromUTF16LE(buf, 13));
 
diff --git a/fpdfsdk/src/fpdftext_embeddertest.cpp b/fpdfsdk/src/fpdftext_embeddertest.cpp
index 50eef87..6c1ae4c 100644
--- a/fpdfsdk/src/fpdftext_embeddertest.cpp
+++ b/fpdfsdk/src/fpdftext_embeddertest.cpp
@@ -42,9 +42,8 @@
   // Check includes the terminating NUL that is provided.
   int num_chars = FPDFText_GetText(textpage, 0, 128, fixed_buffer);
   ASSERT_GE(num_chars, 0);
-  EXPECT_EQ(sizeof(expected) - 1, static_cast<size_t>(num_chars));
-  EXPECT_TRUE(
-      check_unsigned_shorts(expected, fixed_buffer, sizeof(expected) - 1));
+  EXPECT_EQ(sizeof(expected), static_cast<size_t>(num_chars));
+  EXPECT_TRUE(check_unsigned_shorts(expected, fixed_buffer, sizeof(expected)));
 
   // Count does not include the terminating NUL in the string literal.
   EXPECT_EQ(sizeof(expected) - 1, FPDFText_CountChars(textpage));
@@ -126,10 +125,11 @@
   EXPECT_EQ(0xbdbd, fixed_buffer[9]);
 
   memset(fixed_buffer, 0xbd, sizeof(fixed_buffer));
-  EXPECT_EQ(9, FPDFText_GetBoundedText(textpage, 41.0, 56.0, 82.0, 48.0,
-                                       fixed_buffer, 128));
+  EXPECT_EQ(10, FPDFText_GetBoundedText(textpage, 41.0, 56.0, 82.0, 48.0,
+                                        fixed_buffer, 128));
   EXPECT_TRUE(check_unsigned_shorts(expected + 4, fixed_buffer, 9));
-  EXPECT_EQ(0xbdbd, fixed_buffer[9]);
+  EXPECT_EQ(0u, fixed_buffer[9]);
+  EXPECT_EQ(0xbdbd, fixed_buffer[10]);
 
   FPDFText_ClosePage(textpage);
   UnloadPage(page);
@@ -269,13 +269,14 @@
   // Page contains two HTTP-style URLs.
   EXPECT_EQ(2, FPDFLink_CountWebLinks(pagelink));
 
-  EXPECT_EQ(0, FPDFLink_GetURL(pagelink, 2, nullptr, 0));
-  EXPECT_EQ(0, FPDFLink_GetURL(pagelink, 1400, nullptr, 0));
-  EXPECT_EQ(0, FPDFLink_GetURL(pagelink, -1, nullptr, 0));
+  // 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(24, FPDFLink_GetURL(pagelink, 0, nullptr, 0));
-  EXPECT_EQ(25, FPDFLink_GetURL(pagelink, 1, nullptr, 0));
+  EXPECT_EQ(25, FPDFLink_GetURL(pagelink, 0, nullptr, 0));
+  EXPECT_EQ(26, FPDFLink_GetURL(pagelink, 1, nullptr, 0));
 
   static const char expected_url[] = "http://example.com?q=foo";
   unsigned short fixed_buffer[128];
@@ -299,19 +300,21 @@
 
   // Retreive link with exactly-sized buffer.
   memset(fixed_buffer, 0xbd, sizeof(fixed_buffer));
-  EXPECT_EQ(sizeof(expected_url) - 1,
+  EXPECT_EQ(sizeof(expected_url),
             FPDFLink_GetURL(pagelink, 0, fixed_buffer, sizeof(expected_url)));
-  EXPECT_TRUE(check_unsigned_shorts(expected_url, fixed_buffer,
-                                    sizeof(expected_url) - 1));
-  EXPECT_EQ(0xbdbd, fixed_buffer[sizeof(expected_url) - 1]);
+  EXPECT_TRUE(
+      check_unsigned_shorts(expected_url, fixed_buffer, sizeof(expected_url)));
+  EXPECT_EQ(0u, fixed_buffer[sizeof(expected_url) - 1]);
+  EXPECT_EQ(0xbdbd, fixed_buffer[sizeof(expected_url)]);
 
   // Retreive link with ample-sized-buffer.
   memset(fixed_buffer, 0xbd, sizeof(fixed_buffer));
-  EXPECT_EQ(sizeof(expected_url) - 1,
+  EXPECT_EQ(sizeof(expected_url),
             FPDFLink_GetURL(pagelink, 0, fixed_buffer, 128));
-  EXPECT_TRUE(check_unsigned_shorts(expected_url, fixed_buffer,
-                                    sizeof(expected_url) - 1));
-  EXPECT_EQ(0xbdbd, fixed_buffer[sizeof(expected_url) - 1]);
+  EXPECT_TRUE(
+      check_unsigned_shorts(expected_url, fixed_buffer, sizeof(expected_url)));
+  EXPECT_EQ(0u, fixed_buffer[sizeof(expected_url) - 1]);
+  EXPECT_EQ(0xbdbd, fixed_buffer[sizeof(expected_url)]);
 
   // Each link rendered in a single rect in this test page.
   EXPECT_EQ(1, FPDFLink_CountRects(pagelink, 0));
diff --git a/fpdfsdk/src/fpdfview_embeddertest.cpp b/fpdfsdk/src/fpdfview_embeddertest.cpp
index 2606dc7..35da9b6 100644
--- a/fpdfsdk/src/fpdfview_embeddertest.cpp
+++ b/fpdfsdk/src/fpdfview_embeddertest.cpp
@@ -56,10 +56,10 @@
   buffer_size = 2000000;  // Absurdly large, check not used for this case.
   dest = FPDF_GetNamedDest(document(), 0, nullptr, &buffer_size);
   EXPECT_NE(nullptr, dest);
-  EXPECT_EQ(10u, buffer_size);
+  EXPECT_EQ(12u, buffer_size);
 
   // Try to retrieve the first item with too small a buffer.
-  buffer_size = 8;
+  buffer_size = 10;
   dest = FPDF_GetNamedDest(document(), 0, fixed_buffer, &buffer_size);
   EXPECT_NE(nullptr, dest);
   EXPECT_EQ(-1, buffer_size);
@@ -69,8 +69,8 @@
   buffer_size = 12;
   dest = FPDF_GetNamedDest(document(), 0, fixed_buffer, &buffer_size);
   EXPECT_NE(nullptr, dest);
-  EXPECT_EQ(10u, buffer_size);
-  EXPECT_EQ(std::string("F\0i\0r\0s\0t\0", 10),
+  EXPECT_EQ(12u, buffer_size);
+  EXPECT_EQ(std::string("F\0i\0r\0s\0t\0\0\0", 12),
             std::string(fixed_buffer, buffer_size));
 
   // Try to retrieve the second item with ample buffer. Item is taken
@@ -78,8 +78,8 @@
   buffer_size = sizeof(fixed_buffer);
   dest = FPDF_GetNamedDest(document(), 1, fixed_buffer, &buffer_size);
   EXPECT_NE(nullptr, dest);
-  EXPECT_EQ(8u, buffer_size);
-  EXPECT_EQ(std::string("N\0e\0x\0t\0", 8),
+  EXPECT_EQ(10u, buffer_size);
+  EXPECT_EQ(std::string("N\0e\0x\0t\0\0\0", 10),
             std::string(fixed_buffer, buffer_size));
 
   // Try to retrieve third item with ample buffer. Item is taken
@@ -102,8 +102,8 @@
   buffer_size = sizeof(fixed_buffer);
   dest = FPDF_GetNamedDest(document(), 4, fixed_buffer, &buffer_size);
   EXPECT_NE(nullptr, dest);
-  EXPECT_EQ(28u, buffer_size);
-  EXPECT_EQ(std::string("F\0i\0r\0s\0t\0A\0l\0t\0e\0r\0n\0a\0t\0e\0", 28),
+  EXPECT_EQ(30u, buffer_size);
+  EXPECT_EQ(std::string("F\0i\0r\0s\0t\0A\0l\0t\0e\0r\0n\0a\0t\0e\0\0\0", 30),
             std::string(fixed_buffer, buffer_size));
 
   // Try to retrieve sixth item with ample buffer. Item istaken from the
@@ -112,8 +112,8 @@
   buffer_size = sizeof(fixed_buffer);
   dest = FPDF_GetNamedDest(document(), 5, fixed_buffer, &buffer_size);
   EXPECT_NE(nullptr, dest);
-  EXPECT_EQ(26u, buffer_size);
-  EXPECT_EQ(std::string("L\0a\0s\0t\0A\0l\0t\0e\0r\0n\0a\0t\0e\0", 26),
+  EXPECT_EQ(28u, buffer_size);
+  EXPECT_EQ(std::string("L\0a\0s\0t\0A\0l\0t\0e\0r\0n\0a\0t\0e\0\0\0", 28),
             std::string(fixed_buffer, buffer_size));
 
   // Try to retrieve non-existent item with ample buffer.