summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Sepez <tsepez@chromium.org>2017-04-13 13:41:24 -0700
committerChromium commit bot <commit-bot@chromium.org>2017-04-13 22:06:11 +0000
commit3cfff70244e31f48068c32cbc4c070468f4c3e85 (patch)
tree331dc0766a512ac5854c4deba76a6174942cdc02
parent7b7c6532310eeeabadae7b34fdf86f4a890951e8 (diff)
downloadpdfium-3cfff70244e31f48068c32cbc4c070468f4c3e85.tar.xz
Add ability to make StringCs from std::vector<>s.
Pre-cursor to using more std::vector<uint8_t> as byte buffers. The widestring test case is more complicated, where we're not sure of having any particular uint*_t type to match wchar_t. Change-Id: Ic27980f16cdbc61fac7c11f39a85eea58d19bacb Reviewed-on: https://pdfium-review.googlesource.com/4153 Reviewed-by: dsinclair <dsinclair@chromium.org> Reviewed-by: Lei Zhang <thestig@chromium.org> Commit-Queue: Tom Sepez <tsepez@chromium.org>
-rw-r--r--core/fxcrt/cfx_bytestring_unittest.cpp13
-rw-r--r--core/fxcrt/cfx_string_c_template.h8
-rw-r--r--core/fxcrt/cfx_widestring_unittest.cpp14
-rw-r--r--xfa/fxfa/fm2js/xfa_fm2jscontext.cpp6
4 files changed, 38 insertions, 3 deletions
diff --git a/core/fxcrt/cfx_bytestring_unittest.cpp b/core/fxcrt/cfx_bytestring_unittest.cpp
index 3b679a086c..9cfc773fad 100644
--- a/core/fxcrt/cfx_bytestring_unittest.cpp
+++ b/core/fxcrt/cfx_bytestring_unittest.cpp
@@ -4,6 +4,8 @@
#include "core/fxcrt/cfx_bytestring.h"
+#include <vector>
+
#include "testing/fx_string_testhelpers.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -773,6 +775,17 @@ TEST(fxcrt, ByteStringCFromChar) {
EXPECT_NE(longer_string, lower_a_string_from_char);
}
+TEST(fxcrt, ByteStringCFromVector) {
+ std::vector<uint8_t> null_vec;
+ CFX_ByteStringC null_string(null_vec);
+ EXPECT_EQ(0, null_string.GetLength());
+
+ std::vector<uint8_t> lower_a_vec(10, static_cast<uint8_t>('a'));
+ CFX_ByteStringC lower_a_string(lower_a_vec);
+ EXPECT_EQ(10, lower_a_string.GetLength());
+ EXPECT_EQ("aaaaaaaaaa", lower_a_string);
+}
+
TEST(fxcrt, ByteStringCGetID) {
CFX_ByteStringC null_string;
EXPECT_EQ(0u, null_string.GetID());
diff --git a/core/fxcrt/cfx_string_c_template.h b/core/fxcrt/cfx_string_c_template.h
index b52817d790..4aba2cd4b9 100644
--- a/core/fxcrt/cfx_string_c_template.h
+++ b/core/fxcrt/cfx_string_c_template.h
@@ -9,8 +9,10 @@
#include <algorithm>
#include <type_traits>
+#include <vector>
#include "core/fxcrt/fx_system.h"
+#include "third_party/base/stl_util.h"
// An immutable string with caller-provided storage which must outlive the
// string itself. These are not necessarily nul-terminated, so that substring
@@ -53,6 +55,12 @@ class CFX_StringCTemplate {
m_Length = src.m_Length;
}
+ // Any changes to |vec| invalidate the string.
+ explicit CFX_StringCTemplate(const std::vector<UnsignedType>& vec) {
+ m_Ptr = vec.data();
+ m_Length = pdfium::CollectionSize<FX_STRSIZE>(vec);
+ }
+
CFX_StringCTemplate& operator=(const CharType* src) {
m_Ptr = reinterpret_cast<const UnsignedType*>(src);
m_Length = src ? FXSYS_len(src) : 0;
diff --git a/core/fxcrt/cfx_widestring_unittest.cpp b/core/fxcrt/cfx_widestring_unittest.cpp
index dd44cb70af..498b4f0b6a 100644
--- a/core/fxcrt/cfx_widestring_unittest.cpp
+++ b/core/fxcrt/cfx_widestring_unittest.cpp
@@ -4,6 +4,8 @@
#include "core/fxcrt/cfx_widestring.h"
+#include <vector>
+
#include "testing/fx_string_testhelpers.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -689,6 +691,18 @@ TEST(fxcrt, WideStringUTF16LE_Encode) {
}
}
+TEST(fxcrt, WideStringCFromVector) {
+ std::vector<CFX_WideStringC::UnsignedType> null_vec;
+ CFX_WideStringC null_string(null_vec);
+ EXPECT_EQ(0, null_string.GetLength());
+
+ std::vector<CFX_WideStringC::UnsignedType> lower_a_vec(
+ 10, static_cast<CFX_WideStringC::UnsignedType>(L'a'));
+ CFX_WideStringC lower_a_string(lower_a_vec);
+ EXPECT_EQ(10, lower_a_string.GetLength());
+ EXPECT_EQ(L"aaaaaaaaaa", lower_a_string);
+}
+
TEST(fxcrt, WideStringCOperatorSubscript) {
// CFX_WideStringC includes the NUL terminator for non-empty strings.
CFX_WideStringC abc(L"abc");
diff --git a/xfa/fxfa/fm2js/xfa_fm2jscontext.cpp b/xfa/fxfa/fm2js/xfa_fm2jscontext.cpp
index 56a99157d3..ead2a7dbe3 100644
--- a/xfa/fxfa/fm2js/xfa_fm2jscontext.cpp
+++ b/xfa/fxfa/fm2js/xfa_fm2jscontext.cpp
@@ -4642,9 +4642,9 @@ void CXFA_FM2JSContext::Get(CFXJSE_Value* pThis,
return;
int32_t size = pFile->GetSize();
- std::vector<uint8_t> pData(size);
- pFile->ReadBlock(pData.data(), size);
- args.GetReturnValue()->SetString(CFX_ByteStringC(pData.data(), size));
+ std::vector<uint8_t> dataBuf(size);
+ pFile->ReadBlock(dataBuf.data(), size);
+ args.GetReturnValue()->SetString(CFX_ByteStringC(dataBuf));
}
// static