Avoid CHECK() in CFDE_TextEditEngine.
Maintain invariant that the text length does not exceed the
character limit, even when toggling on/off limits and inserting
text in-between. Take the conservative approach of not truncating
pre-existing input when the limits are toggled back and forth.
Bug: pdfium:1458
Change-Id: Id064d9f54929d91dea5027a024fcaab40e4c55e4
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/65290
Commit-Queue: Tom Sepez <tsepez@chromium.org>
Reviewed-by: Lei Zhang <thestig@chromium.org>
diff --git a/xfa/fde/cfde_texteditengine.cpp b/xfa/fde/cfde_texteditengine.cpp
index b13699e..66c24d1 100644
--- a/xfa/fde/cfde_texteditengine.cpp
+++ b/xfa/fde/cfde_texteditengine.cpp
@@ -644,6 +644,7 @@
return;
has_character_limit_ = limit;
+ character_limit_ = std::max(character_limit_, text_length_);
if (is_comb_text_)
SetCombTextWidth();
@@ -656,7 +657,7 @@
ClearOperationRecords();
- character_limit_ = limit;
+ character_limit_ = std::max(limit, text_length_);
if (is_comb_text_)
SetCombTextWidth();
diff --git a/xfa/fde/cfde_texteditengine_unittest.cpp b/xfa/fde/cfde_texteditengine_unittest.cpp
index 87e29aa..2089dff 100644
--- a/xfa/fde/cfde_texteditengine_unittest.cpp
+++ b/xfa/fde/cfde_texteditengine_unittest.cpp
@@ -161,6 +161,20 @@
engine()->SetDelegate(nullptr);
}
+TEST_F(CFDE_TextEditEngineTest, InsertToggleLimit) {
+ engine()->SetHasCharacterLimit(true);
+ engine()->Insert(0, L"Hello World");
+ engine()->SetCharacterLimit(5);
+ engine()->Insert(0, L"Not Inserted before ");
+ EXPECT_STREQ(L"Hello World", engine()->GetText().c_str());
+
+ engine()->SetHasCharacterLimit(false);
+ engine()->Insert(0, L"Inserted before ");
+ engine()->SetHasCharacterLimit(true);
+ engine()->Insert(0, L"Not Inserted before ");
+ EXPECT_STREQ(L"Inserted before Hello World", engine()->GetText().c_str());
+}
+
TEST_F(CFDE_TextEditEngineTest, InsertSkipNotify) {
engine()->SetHasCharacterLimit(true);
engine()->SetCharacterLimit(8);