| Index: fpdfsdk/javascript/PublicMethods.cpp
|
| diff --git a/fpdfsdk/javascript/PublicMethods.cpp b/fpdfsdk/javascript/PublicMethods.cpp
|
| index a84c0935bc96db014cc348389cf0626276be5930..2b14b772aad8ff36875902fc644e1fb61ddd8ab9 100644
|
| --- a/fpdfsdk/javascript/PublicMethods.cpp
|
| +++ b/fpdfsdk/javascript/PublicMethods.cpp
|
| @@ -7,7 +7,6 @@
|
| #include "fpdfsdk/javascript/PublicMethods.h"
|
|
|
| #include <algorithm>
|
| -#include <string>
|
| #include <vector>
|
|
|
| #include "core/fxcrt/include/fx_ext.h"
|
| @@ -739,7 +738,7 @@ FX_BOOL CJS_PublicMethods::AFNumber_Format(IJS_Context* cc,
|
| int iSepStyle = params[1].ToInt();
|
| int iNegStyle = params[2].ToInt();
|
| // params[3] is iCurrStyle, it's not used.
|
| - std::wstring wstrCurrency(params[4].ToCFXWideString().c_str());
|
| + CFX_WideString wstrCurrency = params[4].ToCFXWideString();
|
| FX_BOOL bCurrencyPrepend = params[5].ToBool();
|
|
|
| if (iDec < 0)
|
| @@ -812,21 +811,18 @@ FX_BOOL CJS_PublicMethods::AFNumber_Format(IJS_Context* cc,
|
|
|
| // for processing currency string
|
| Value = CFX_WideString::FromLocal(strValue.AsStringC());
|
| - std::wstring strValue2 = Value.c_str();
|
|
|
| if (bCurrencyPrepend)
|
| - strValue2 = wstrCurrency + strValue2;
|
| + Value = wstrCurrency + Value;
|
| else
|
| - strValue2 = strValue2 + wstrCurrency;
|
| + Value = Value + wstrCurrency;
|
|
|
| // for processing negative style
|
| if (iNegative) {
|
| if (iNegStyle == 0) {
|
| - strValue2.insert(0, L"-");
|
| - }
|
| - if (iNegStyle == 2 || iNegStyle == 3) {
|
| - strValue2.insert(0, L"(");
|
| - strValue2.insert(strValue2.length(), L")");
|
| + Value = L"-" + Value;
|
| + } else if (iNegStyle == 2 || iNegStyle == 3) {
|
| + Value = L"(" + Value + L")";
|
| }
|
| if (iNegStyle == 1 || iNegStyle == 3) {
|
| if (Field* fTarget = pEvent->Target_Field()) {
|
| @@ -882,7 +878,6 @@ FX_BOOL CJS_PublicMethods::AFNumber_Format(IJS_Context* cc,
|
| }
|
| }
|
| }
|
| - Value = strValue2.c_str();
|
| #endif
|
| return TRUE;
|
| }
|
| @@ -899,19 +894,16 @@ FX_BOOL CJS_PublicMethods::AFNumber_Keystroke(
|
|
|
| if (params.size() < 2)
|
| return FALSE;
|
| - int iSepStyle = params[1].ToInt();
|
|
|
| - if (iSepStyle < 0 || iSepStyle > 3)
|
| - iSepStyle = 0;
|
| if (!pEvent->m_pValue)
|
| return FALSE;
|
| +
|
| CFX_WideString& val = pEvent->Value();
|
| - CFX_WideString& w_strChange = pEvent->Change();
|
| - CFX_WideString w_strValue = val;
|
| + CFX_WideString& wstrChange = pEvent->Change();
|
| + CFX_WideString wstrValue = val;
|
|
|
| if (pEvent->WillCommit()) {
|
| - CFX_WideString wstrChange = w_strChange;
|
| - CFX_WideString wstrValue = StrTrim(w_strValue);
|
| + CFX_WideString wstrValue = StrTrim(wstrValue);
|
| if (wstrValue.IsEmpty())
|
| return TRUE;
|
|
|
| @@ -921,19 +913,17 @@ FX_BOOL CJS_PublicMethods::AFNumber_Keystroke(
|
| pEvent->Rc() = FALSE;
|
| sError = JSGetStringFromID(pContext, IDS_STRING_JSAFNUMBER_KEYSTROKE);
|
| Alert(pContext, sError.c_str());
|
| - return TRUE;
|
| }
|
| return TRUE; // it happens after the last keystroke and before validating,
|
| }
|
|
|
| - std::wstring w_strValue2 = w_strValue.c_str();
|
| - std::wstring w_strChange2 = w_strChange.c_str();
|
| - std::wstring w_strSelected;
|
| - if (-1 != pEvent->SelStart())
|
| - w_strSelected = w_strValue2.substr(pEvent->SelStart(),
|
| - (pEvent->SelEnd() - pEvent->SelStart()));
|
| - bool bHasSign = (w_strValue2.find('-') != std::wstring::npos) &&
|
| - (w_strSelected.find('-') == std::wstring::npos);
|
| + CFX_WideString wstrSelected;
|
| + if (pEvent->SelStart() != -1) {
|
| + wstrSelected = wstrValue.Mid(pEvent->SelStart(),
|
| + pEvent->SelEnd() - pEvent->SelStart());
|
| + }
|
| +
|
| + bool bHasSign = wstrValue.Find(L'-') != -1 && wstrSelected.Find(L'-') == -1;
|
| if (bHasSign) {
|
| // can't insert "change" in front to sign postion.
|
| if (pEvent->SelStart() == 0) {
|
| @@ -943,23 +933,14 @@ FX_BOOL CJS_PublicMethods::AFNumber_Keystroke(
|
| }
|
| }
|
|
|
| - char cSep = L'.';
|
| -
|
| - switch (iSepStyle) {
|
| - case 0:
|
| - case 1:
|
| - cSep = L'.';
|
| - break;
|
| - case 2:
|
| - case 3:
|
| - cSep = L',';
|
| - break;
|
| - }
|
| + int iSepStyle = params[1].ToInt();
|
| + if (iSepStyle < 0 || iSepStyle > 3)
|
| + iSepStyle = 0;
|
| + const FX_WCHAR cSep = iSepStyle < 2 ? L'.' : L',';
|
|
|
| - bool bHasSep = (w_strValue2.find(cSep) != std::wstring::npos);
|
| - for (std::wstring::iterator it = w_strChange2.begin();
|
| - it != w_strChange2.end(); it++) {
|
| - if (*it == cSep) {
|
| + bool bHasSep = wstrValue.Find(cSep) != -1;
|
| + for (FX_STRSIZE i = 0; i < wstrChange.GetLength(); ++i) {
|
| + if (wstrChange[i] == cSep) {
|
| if (bHasSep) {
|
| FX_BOOL& bRc = pEvent->Rc();
|
| bRc = FALSE;
|
| @@ -968,14 +949,14 @@ FX_BOOL CJS_PublicMethods::AFNumber_Keystroke(
|
| bHasSep = TRUE;
|
| continue;
|
| }
|
| - if (*it == L'-') {
|
| + if (wstrChange[i] == L'-') {
|
| if (bHasSign) {
|
| FX_BOOL& bRc = pEvent->Rc();
|
| bRc = FALSE;
|
| return TRUE;
|
| }
|
| // sign's position is not correct
|
| - if (it != w_strChange2.begin()) {
|
| + if (i != 0) {
|
| FX_BOOL& bRc = pEvent->Rc();
|
| bRc = FALSE;
|
| return TRUE;
|
| @@ -989,20 +970,18 @@ FX_BOOL CJS_PublicMethods::AFNumber_Keystroke(
|
| continue;
|
| }
|
|
|
| - if (!FXSYS_iswdigit(*it)) {
|
| + if (!FXSYS_iswdigit(wstrChange[i])) {
|
| FX_BOOL& bRc = pEvent->Rc();
|
| bRc = FALSE;
|
| return TRUE;
|
| }
|
| }
|
|
|
| - std::wstring w_prefix = w_strValue2.substr(0, pEvent->SelStart());
|
| - std::wstring w_postfix;
|
| - if (pEvent->SelEnd() < (int)w_strValue2.length())
|
| - w_postfix = w_strValue2.substr(pEvent->SelEnd());
|
| - w_strValue2 = w_prefix + w_strChange2 + w_postfix;
|
| - w_strValue = w_strValue2.c_str();
|
| - val = w_strValue;
|
| + CFX_WideString wprefix = wstrValue.Mid(0, pEvent->SelStart());
|
| + CFX_WideString wpostfix;
|
| + if (pEvent->SelEnd() < wstrValue.GetLength())
|
| + wpostfix = wstrValue.Mid(pEvent->SelEnd());
|
| + val = wprefix + wstrChange + wpostfix;
|
| return TRUE;
|
| }
|
|
|
| @@ -1440,21 +1419,18 @@ FX_BOOL CJS_PublicMethods::AFSpecial_KeystrokeEx(
|
| if (wstrMask.IsEmpty())
|
| return TRUE;
|
|
|
| - const size_t wstrMaskLen = wstrMask.GetLength();
|
| - const std::wstring wstrValue = valEvent.c_str();
|
| -
|
| if (pEvent->WillCommit()) {
|
| - if (wstrValue.empty())
|
| + if (valEvent.IsEmpty())
|
| return TRUE;
|
| - size_t iIndexMask = 0;
|
| - for (const auto& w_Value : wstrValue) {
|
| - if (!maskSatisfied(w_Value, wstrMask[iIndexMask]))
|
| +
|
| + FX_STRSIZE iIndexMask = 0;
|
| + for (; iIndexMask < valEvent.GetLength(); ++iIndexMask) {
|
| + if (!maskSatisfied(valEvent[iIndexMask], wstrMask[iIndexMask]))
|
| break;
|
| - iIndexMask++;
|
| }
|
|
|
| - if (iIndexMask != wstrMaskLen ||
|
| - (iIndexMask != wstrValue.size() && wstrMaskLen != 0)) {
|
| + if (iIndexMask != wstrMask.GetLength() ||
|
| + (iIndexMask != valEvent.GetLength() && wstrMask.GetLength() != 0)) {
|
| Alert(
|
| pContext,
|
| JSGetStringFromID(pContext, IDS_STRING_JSAFNUMBER_KEYSTROKE).c_str());
|
| @@ -1464,48 +1440,45 @@ FX_BOOL CJS_PublicMethods::AFSpecial_KeystrokeEx(
|
| }
|
|
|
| CFX_WideString& wideChange = pEvent->Change();
|
| - std::wstring wChange = wideChange.c_str();
|
| - if (wChange.empty())
|
| + if (wideChange.IsEmpty())
|
| return TRUE;
|
|
|
| - size_t iIndexMask = pEvent->SelStart();
|
| -
|
| - size_t combined_len = wstrValue.length() + wChange.length() -
|
| - (pEvent->SelEnd() - pEvent->SelStart());
|
| - if (combined_len > wstrMaskLen) {
|
| + CFX_WideString wChange = wideChange;
|
| + FX_STRSIZE iIndexMask = pEvent->SelStart();
|
| + FX_STRSIZE combined_len = valEvent.GetLength() + wChange.GetLength() +
|
| + pEvent->SelStart() - pEvent->SelEnd();
|
| + if (combined_len > wstrMask.GetLength()) {
|
| Alert(pContext,
|
| JSGetStringFromID(pContext, IDS_STRING_JSPARAM_TOOLONG).c_str());
|
| pEvent->Rc() = FALSE;
|
| return TRUE;
|
| }
|
|
|
| - if (iIndexMask >= wstrMaskLen && (!wChange.empty())) {
|
| + if (iIndexMask >= wstrMask.GetLength() && !wChange.IsEmpty()) {
|
| Alert(pContext,
|
| JSGetStringFromID(pContext, IDS_STRING_JSPARAM_TOOLONG).c_str());
|
| pEvent->Rc() = FALSE;
|
| return TRUE;
|
| }
|
|
|
| - for (std::wstring::iterator it = wChange.begin(); it != wChange.end(); it++) {
|
| - if (iIndexMask >= wstrMaskLen) {
|
| + for (FX_STRSIZE i = 0; i < wChange.GetLength(); ++i) {
|
| + if (iIndexMask >= wstrMask.GetLength()) {
|
| Alert(pContext,
|
| JSGetStringFromID(pContext, IDS_STRING_JSPARAM_TOOLONG).c_str());
|
| pEvent->Rc() = FALSE;
|
| return TRUE;
|
| }
|
| - wchar_t w_Mask = wstrMask[iIndexMask];
|
| - if (!isReservedMaskChar(w_Mask)) {
|
| - *it = w_Mask;
|
| - }
|
| - wchar_t w_Change = *it;
|
| - if (!maskSatisfied(w_Change, w_Mask)) {
|
| + FX_WCHAR wMask = wstrMask[iIndexMask];
|
| + if (!isReservedMaskChar(wMask))
|
| + wChange.SetAt(i, wMask);
|
| +
|
| + if (!maskSatisfied(wChange[i], wMask)) {
|
| pEvent->Rc() = FALSE;
|
| return TRUE;
|
| }
|
| iIndexMask++;
|
| }
|
| -
|
| - wideChange = wChange.c_str();
|
| + wideChange = wChange;
|
| return TRUE;
|
| }
|
|
|
| @@ -1525,13 +1498,8 @@ FX_BOOL CJS_PublicMethods::AFSpecial_Keystroke(
|
| if (!pEvent->m_pValue)
|
| return FALSE;
|
|
|
| - std::string cFormat;
|
| - int iIndex = params[0].ToInt();
|
| - CFX_WideString& val = pEvent->Value();
|
| - std::string strSrc = CFX_ByteString::FromUnicode(val).c_str();
|
| - std::wstring wstrChange = pEvent->Change().c_str();
|
| -
|
| - switch (iIndex) {
|
| + const char* cFormat = "";
|
| + switch (params[0].ToInt()) {
|
| case 0:
|
| cFormat = "99999";
|
| break;
|
| @@ -1539,7 +1507,7 @@ FX_BOOL CJS_PublicMethods::AFSpecial_Keystroke(
|
| cFormat = "999999999";
|
| break;
|
| case 2:
|
| - if (strSrc.length() + wstrChange.length() > 7)
|
| + if (pEvent->Value().GetLength() + pEvent->Change().GetLength() > 7)
|
| cFormat = "9999999999";
|
| else
|
| cFormat = "9999999";
|
| @@ -1550,7 +1518,7 @@ FX_BOOL CJS_PublicMethods::AFSpecial_Keystroke(
|
| }
|
|
|
| std::vector<CJS_Value> params2;
|
| - params2.push_back(CJS_Value(CJS_Runtime::FromContext(cc), cFormat.c_str()));
|
| + params2.push_back(CJS_Value(CJS_Runtime::FromContext(cc), cFormat));
|
| return AFSpecial_KeystrokeEx(cc, params2, vRet, sError);
|
| }
|
|
|
|
|