K. Moon | 832a694 | 2022-10-31 20:11:31 +0000 | [diff] [blame] | 1 | // Copyright 2018 The PDFium Authors |
Tom Sepez | eccfe0e | 2018-11-01 16:34:52 +0000 | [diff] [blame] | 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
| 4 | |
| 5 | #include "fxjs/cfx_globaldata.h" |
| 6 | |
Lei Zhang | 2810c83 | 2022-08-16 18:45:22 +0000 | [diff] [blame] | 7 | #include <stdint.h> |
| 8 | |
Tom Sepez | bf2ef78 | 2018-11-07 20:03:30 +0000 | [diff] [blame] | 9 | #include <utility> |
Tom Sepez | eccfe0e | 2018-11-01 16:34:52 +0000 | [diff] [blame] | 10 | #include <vector> |
| 11 | |
Lei Zhang | 2810c83 | 2022-08-16 18:45:22 +0000 | [diff] [blame] | 12 | #include "core/fxcrt/data_vector.h" |
Tom Sepez | eccfe0e | 2018-11-01 16:34:52 +0000 | [diff] [blame] | 13 | #include "testing/gtest/include/gtest/gtest.h" |
Tom Sepez | eccfe0e | 2018-11-01 16:34:52 +0000 | [diff] [blame] | 14 | |
| 15 | namespace { |
| 16 | |
| 17 | class TestDelegate : public CFX_GlobalData::Delegate { |
| 18 | public: |
Tom Sepez | bf2ef78 | 2018-11-07 20:03:30 +0000 | [diff] [blame] | 19 | TestDelegate() = default; |
Lei Zhang | 511d49d | 2021-04-01 05:13:22 +0000 | [diff] [blame] | 20 | ~TestDelegate() override = default; |
Tom Sepez | eccfe0e | 2018-11-01 16:34:52 +0000 | [diff] [blame] | 21 | |
| 22 | bool StoreBuffer(pdfium::span<const uint8_t> buffer) override { |
Lei Zhang | 2810c83 | 2022-08-16 18:45:22 +0000 | [diff] [blame] | 23 | last_buffer_ = DataVector<uint8_t>(buffer.begin(), buffer.end()); |
Tom Sepez | eccfe0e | 2018-11-01 16:34:52 +0000 | [diff] [blame] | 24 | return true; |
| 25 | } |
Lei Zhang | 2c49530 | 2021-10-07 23:13:30 +0000 | [diff] [blame] | 26 | absl::optional<pdfium::span<uint8_t>> LoadBuffer() override { |
Tom Sepez | eccfe0e | 2018-11-01 16:34:52 +0000 | [diff] [blame] | 27 | return pdfium::span<uint8_t>(last_buffer_); |
| 28 | } |
| 29 | void BufferDone() override { |
Tom Sepez | a52ce90 | 2020-04-06 23:37:54 +0000 | [diff] [blame] | 30 | // Catch misuse after done. |
Lei Zhang | 2810c83 | 2022-08-16 18:45:22 +0000 | [diff] [blame] | 31 | last_buffer_ = DataVector<uint8_t>(); |
Tom Sepez | eccfe0e | 2018-11-01 16:34:52 +0000 | [diff] [blame] | 32 | } |
| 33 | |
Lei Zhang | 2810c83 | 2022-08-16 18:45:22 +0000 | [diff] [blame] | 34 | DataVector<uint8_t> last_buffer_; |
Tom Sepez | eccfe0e | 2018-11-01 16:34:52 +0000 | [diff] [blame] | 35 | }; |
| 36 | |
| 37 | } // namespace |
| 38 | |
Tom Sepez | bf2ef78 | 2018-11-07 20:03:30 +0000 | [diff] [blame] | 39 | TEST(CFXGlobalData, GetSafety) { |
| 40 | CFX_GlobalData* pInstance = CFX_GlobalData::GetRetainedInstance(nullptr); |
Tom Sepez | 9e61a72 | 2022-06-08 16:54:30 +0000 | [diff] [blame] | 41 | EXPECT_FALSE(pInstance->GetGlobalVariable("nonesuch")); |
| 42 | EXPECT_FALSE(pInstance->GetAt(-1)); |
| 43 | EXPECT_FALSE(pInstance->GetAt(0)); |
| 44 | EXPECT_FALSE(pInstance->GetAt(1)); |
Tom Sepez | bf2ef78 | 2018-11-07 20:03:30 +0000 | [diff] [blame] | 45 | |
| 46 | pInstance->SetGlobalVariableNumber("double", 2.0); |
| 47 | pInstance->SetGlobalVariableString("string", "clams"); |
| 48 | |
Tom Sepez | 9e61a72 | 2022-06-08 16:54:30 +0000 | [diff] [blame] | 49 | EXPECT_FALSE(pInstance->GetGlobalVariable("nonesuch")); |
| 50 | EXPECT_FALSE(pInstance->GetAt(-1)); |
Tom Sepez | bf2ef78 | 2018-11-07 20:03:30 +0000 | [diff] [blame] | 51 | EXPECT_EQ(pInstance->GetGlobalVariable("double"), pInstance->GetAt(0)); |
| 52 | EXPECT_EQ(pInstance->GetGlobalVariable("string"), pInstance->GetAt(1)); |
Tom Sepez | 9e61a72 | 2022-06-08 16:54:30 +0000 | [diff] [blame] | 53 | EXPECT_FALSE(pInstance->GetAt(2)); |
Tom Sepez | bf2ef78 | 2018-11-07 20:03:30 +0000 | [diff] [blame] | 54 | |
| 55 | ASSERT_TRUE(pInstance->Release()); |
| 56 | } |
| 57 | |
Tom Sepez | eccfe0e | 2018-11-01 16:34:52 +0000 | [diff] [blame] | 58 | TEST(CFXGlobalData, StoreReload) { |
| 59 | TestDelegate delegate; |
Tom Sepez | 574ee37 | 2020-01-29 17:25:43 +0000 | [diff] [blame] | 60 | std::vector<std::unique_ptr<CFX_KeyValue>> array; |
Tom Sepez | eccfe0e | 2018-11-01 16:34:52 +0000 | [diff] [blame] | 61 | CFX_GlobalData* pInstance = CFX_GlobalData::GetRetainedInstance(&delegate); |
| 62 | pInstance->SetGlobalVariableNumber("double", 2.0); |
| 63 | pInstance->SetGlobalVariableString("string", "clams"); |
Tom Sepez | bf2ef78 | 2018-11-07 20:03:30 +0000 | [diff] [blame] | 64 | pInstance->SetGlobalVariableBoolean("boolean", true); |
| 65 | pInstance->SetGlobalVariableNull("null"); |
| 66 | pInstance->SetGlobalVariableObject("array", std::move(array)); |
Tom Sepez | eccfe0e | 2018-11-01 16:34:52 +0000 | [diff] [blame] | 67 | pInstance->SetGlobalVariablePersistent("double", true); |
| 68 | pInstance->SetGlobalVariablePersistent("string", true); |
Tom Sepez | bf2ef78 | 2018-11-07 20:03:30 +0000 | [diff] [blame] | 69 | pInstance->SetGlobalVariablePersistent("boolean", true); |
| 70 | pInstance->SetGlobalVariablePersistent("null", true); |
| 71 | pInstance->SetGlobalVariablePersistent("array", true); |
Tom Sepez | eccfe0e | 2018-11-01 16:34:52 +0000 | [diff] [blame] | 72 | ASSERT_TRUE(pInstance->Release()); |
| 73 | |
| 74 | pInstance = CFX_GlobalData::GetRetainedInstance(&delegate); |
| 75 | auto* element = pInstance->GetAt(0); |
| 76 | ASSERT_TRUE(element); |
| 77 | EXPECT_EQ("double", element->data.sKey); |
Lei Zhang | 4709fa2 | 2020-06-02 20:02:26 +0000 | [diff] [blame] | 78 | EXPECT_EQ(CFX_Value::DataType::kNumber, element->data.nType); |
Tom Sepez | eccfe0e | 2018-11-01 16:34:52 +0000 | [diff] [blame] | 79 | EXPECT_EQ(2.0, element->data.dData); |
| 80 | |
| 81 | element = pInstance->GetAt(1); |
| 82 | ASSERT_TRUE(element); |
| 83 | EXPECT_EQ("string", element->data.sKey); |
Lei Zhang | 4709fa2 | 2020-06-02 20:02:26 +0000 | [diff] [blame] | 84 | EXPECT_EQ(CFX_Value::DataType::kString, element->data.nType); |
Tom Sepez | eccfe0e | 2018-11-01 16:34:52 +0000 | [diff] [blame] | 85 | EXPECT_EQ("clams", element->data.sData); |
Tom Sepez | bf2ef78 | 2018-11-07 20:03:30 +0000 | [diff] [blame] | 86 | |
| 87 | element = pInstance->GetAt(2); |
| 88 | ASSERT_TRUE(element); |
| 89 | EXPECT_EQ("boolean", element->data.sKey); |
Lei Zhang | 4709fa2 | 2020-06-02 20:02:26 +0000 | [diff] [blame] | 90 | EXPECT_EQ(CFX_Value::DataType::kBoolean, element->data.nType); |
Tom Sepez | bf2ef78 | 2018-11-07 20:03:30 +0000 | [diff] [blame] | 91 | EXPECT_EQ(true, element->data.bData); |
| 92 | |
| 93 | element = pInstance->GetAt(3); |
| 94 | ASSERT_TRUE(element); |
| 95 | EXPECT_EQ("null", element->data.sKey); |
Lei Zhang | 4709fa2 | 2020-06-02 20:02:26 +0000 | [diff] [blame] | 96 | EXPECT_EQ(CFX_Value::DataType::kNull, element->data.nType); |
Tom Sepez | bf2ef78 | 2018-11-07 20:03:30 +0000 | [diff] [blame] | 97 | |
Tom Sepez | 3eaad18 | 2018-11-07 21:52:21 +0000 | [diff] [blame] | 98 | // Arrays don't get persisted. |
Tom Sepez | bf2ef78 | 2018-11-07 20:03:30 +0000 | [diff] [blame] | 99 | element = pInstance->GetAt(4); |
| 100 | ASSERT_FALSE(element); |
| 101 | |
| 102 | ASSERT_TRUE(pInstance->Release()); |
| 103 | } |
| 104 | |
| 105 | TEST(CFXGlobalData, ResetValues) { |
| 106 | CFX_GlobalData* pInstance = CFX_GlobalData::GetRetainedInstance(nullptr); |
| 107 | pInstance->SetGlobalVariableString("double", "bogus!!!"); |
| 108 | pInstance->SetGlobalVariableString("string", "bogus!!!"); |
| 109 | pInstance->SetGlobalVariableString("boolean", "bogus!!!"); |
| 110 | pInstance->SetGlobalVariableString("null", "bogus!!!"); |
| 111 | |
| 112 | pInstance->SetGlobalVariableNumber("double", 2.0); |
| 113 | pInstance->SetGlobalVariableString("string", "clams"); |
| 114 | pInstance->SetGlobalVariableBoolean("boolean", true); |
| 115 | pInstance->SetGlobalVariableNull("null"); |
| 116 | |
| 117 | auto* element = pInstance->GetAt(0); |
| 118 | ASSERT_TRUE(element); |
| 119 | EXPECT_EQ("double", element->data.sKey); |
Lei Zhang | 4709fa2 | 2020-06-02 20:02:26 +0000 | [diff] [blame] | 120 | EXPECT_EQ(CFX_Value::DataType::kNumber, element->data.nType); |
Tom Sepez | bf2ef78 | 2018-11-07 20:03:30 +0000 | [diff] [blame] | 121 | EXPECT_EQ(2.0, element->data.dData); |
| 122 | |
| 123 | element = pInstance->GetAt(1); |
| 124 | ASSERT_TRUE(element); |
| 125 | EXPECT_EQ("string", element->data.sKey); |
Lei Zhang | 4709fa2 | 2020-06-02 20:02:26 +0000 | [diff] [blame] | 126 | EXPECT_EQ(CFX_Value::DataType::kString, element->data.nType); |
Tom Sepez | bf2ef78 | 2018-11-07 20:03:30 +0000 | [diff] [blame] | 127 | EXPECT_EQ("clams", element->data.sData); |
| 128 | |
| 129 | element = pInstance->GetAt(2); |
| 130 | ASSERT_TRUE(element); |
| 131 | EXPECT_EQ("boolean", element->data.sKey); |
Lei Zhang | 4709fa2 | 2020-06-02 20:02:26 +0000 | [diff] [blame] | 132 | EXPECT_EQ(CFX_Value::DataType::kBoolean, element->data.nType); |
Tom Sepez | bf2ef78 | 2018-11-07 20:03:30 +0000 | [diff] [blame] | 133 | EXPECT_EQ(true, element->data.bData); |
| 134 | |
| 135 | element = pInstance->GetAt(3); |
| 136 | ASSERT_TRUE(element); |
| 137 | EXPECT_EQ("null", element->data.sKey); |
Lei Zhang | 4709fa2 | 2020-06-02 20:02:26 +0000 | [diff] [blame] | 138 | EXPECT_EQ(CFX_Value::DataType::kNull, element->data.nType); |
Tom Sepez | bf2ef78 | 2018-11-07 20:03:30 +0000 | [diff] [blame] | 139 | |
| 140 | ASSERT_TRUE(pInstance->Release()); |
| 141 | } |
| 142 | |
| 143 | TEST(CFXGlobalData, DeleteValues) { |
| 144 | CFX_GlobalData* pInstance = CFX_GlobalData::GetRetainedInstance(nullptr); |
| 145 | pInstance->SetGlobalVariableNumber("double", 2.0); |
| 146 | pInstance->SetGlobalVariableString("string", "clams"); |
| 147 | pInstance->SetGlobalVariableBoolean("boolean", true); |
| 148 | pInstance->SetGlobalVariableNull("null"); |
| 149 | EXPECT_EQ(4, pInstance->GetSize()); |
| 150 | |
| 151 | pInstance->DeleteGlobalVariable("nonesuch"); |
| 152 | EXPECT_EQ(4, pInstance->GetSize()); |
| 153 | |
| 154 | pInstance->DeleteGlobalVariable("boolean"); |
| 155 | EXPECT_EQ(3, pInstance->GetSize()); |
| 156 | |
| 157 | pInstance->DeleteGlobalVariable("string"); |
| 158 | EXPECT_EQ(2, pInstance->GetSize()); |
| 159 | |
| 160 | pInstance->DeleteGlobalVariable("double"); |
| 161 | EXPECT_EQ(1, pInstance->GetSize()); |
| 162 | |
| 163 | pInstance->DeleteGlobalVariable("null"); |
| 164 | EXPECT_EQ(0, pInstance->GetSize()); |
| 165 | |
Tom Sepez | eccfe0e | 2018-11-01 16:34:52 +0000 | [diff] [blame] | 166 | ASSERT_TRUE(pInstance->Release()); |
| 167 | } |