From 8953baf1e0a47d7b1ad2008e8e14ecc74269416a Mon Sep 17 00:00:00 2001 From: Tom Sepez Date: Thu, 18 Oct 2018 21:42:20 +0000 Subject: Expand CJS_Document::mail{Doc,Form}() parameters Use ExpandKeywordParams() rather than ad-hoc processing. Add test case for {} argument. Change-Id: I1f60a87b3995d62f4bead79245a1f58fd31b102e Reviewed-on: https://pdfium-review.googlesource.com/c/44290 Commit-Queue: Tom Sepez Reviewed-by: Lei Zhang --- fxjs/cjs_document.cpp | 95 +++++++++++++--------- testing/resources/javascript/document_methods.in | 16 +++- .../javascript/document_methods_expected.txt | 12 ++- 3 files changed, 80 insertions(+), 43 deletions(-) diff --git a/fxjs/cjs_document.cpp b/fxjs/cjs_document.cpp index a0dd2ece91..8f60d13826 100644 --- a/fxjs/cjs_document.cpp +++ b/fxjs/cjs_document.cpp @@ -377,42 +377,40 @@ CJS_Result CJS_Document::importTextData( CJS_Result CJS_Document::mailDoc( CJS_Runtime* pRuntime, const std::vector>& params) { - // TODO(tsepez): Check maximum number of allowed params. - size_t nLength = params.size(); + if (!m_pFormFillEnv) + return CJS_Result::Failure(JSMessage::kBadObjectError); + + std::vector> newParams = + ExpandKeywordParams(pRuntime, params, 6, L"bUI", L"cTo", L"cCc", L"cBcc", + L"cSubject", L"cMsg"); + bool bUI = true; + if (IsExpandedParamKnown(newParams[0])) + bUI = pRuntime->ToBoolean(newParams[0]); + WideString cTo; + if (IsExpandedParamKnown(newParams[1])) + cTo = pRuntime->ToWideString(newParams[1]); + WideString cCc; + if (IsExpandedParamKnown(newParams[2])) + cCc = pRuntime->ToWideString(newParams[2]); + WideString cBcc; + if (IsExpandedParamKnown(newParams[3])) + cBcc = pRuntime->ToWideString(newParams[3]); + WideString cSubject; - WideString cMsg; + if (IsExpandedParamKnown(newParams[4])) + cSubject = pRuntime->ToWideString(newParams[4]); - if (nLength > 0 && params[0]->IsObject()) { - v8::Local pObj = pRuntime->ToObject(params[0]); - bUI = pRuntime->ToBoolean(pRuntime->GetObjectProperty(pObj, L"bUI")); - cTo = pRuntime->ToWideString(pRuntime->GetObjectProperty(pObj, L"cTo")); - cCc = pRuntime->ToWideString(pRuntime->GetObjectProperty(pObj, L"cCc")); - cBcc = pRuntime->ToWideString(pRuntime->GetObjectProperty(pObj, L"cBcc")); - cSubject = - pRuntime->ToWideString(pRuntime->GetObjectProperty(pObj, L"cSubject")); - cMsg = pRuntime->ToWideString(pRuntime->GetObjectProperty(pObj, L"cMsg")); - } else { - if (nLength > 0) - bUI = pRuntime->ToBoolean(params[0]); - if (nLength > 1) - cTo = pRuntime->ToWideString(params[1]); - if (nLength > 2) - cCc = pRuntime->ToWideString(params[2]); - if (nLength > 3) - cBcc = pRuntime->ToWideString(params[3]); - if (nLength > 4) - cSubject = pRuntime->ToWideString(params[4]); - if (nLength > 5) - cMsg = pRuntime->ToWideString(params[5]); - } + WideString cMsg; + if (IsExpandedParamKnown(newParams[5])) + cMsg = pRuntime->ToWideString(newParams[5]); pRuntime->BeginBlock(); - CPDFSDK_FormFillEnvironment* pFormFillEnv = pRuntime->GetFormFillEnv(); - pFormFillEnv->JS_docmailForm(nullptr, 0, bUI, cTo, cSubject, cCc, cBcc, cMsg); + m_pFormFillEnv->JS_docmailForm(nullptr, 0, bUI, cTo, cSubject, cCc, cBcc, + cMsg); pRuntime->EndBlock(); return CJS_Result::Success(); } @@ -433,19 +431,38 @@ CJS_Result CJS_Document::mailForm( if (sTextBuf.GetLength() == 0) return CJS_Result::Failure(L"Bad FDF format."); - size_t nLength = params.size(); - bool bUI = nLength > 0 ? pRuntime->ToBoolean(params[0]) : true; - WideString cTo = nLength > 1 ? pRuntime->ToWideString(params[1]) : L""; - WideString cCc = nLength > 2 ? pRuntime->ToWideString(params[2]) : L""; - WideString cBcc = nLength > 3 ? pRuntime->ToWideString(params[3]) : L""; - WideString cSubject = nLength > 4 ? pRuntime->ToWideString(params[4]) : L""; - WideString cMsg = nLength > 5 ? pRuntime->ToWideString(params[5]) : L""; - std::vector mutable_buf(sTextBuf.begin(), sTextBuf.end()); + std::vector> newParams = + ExpandKeywordParams(pRuntime, params, 6, L"bUI", L"cTo", L"cCc", L"cBcc", + L"cSubject", L"cMsg"); + bool bUI = true; + if (IsExpandedParamKnown(newParams[0])) + bUI = pRuntime->ToBoolean(newParams[0]); + + WideString cTo; + if (IsExpandedParamKnown(newParams[1])) + cTo = pRuntime->ToWideString(newParams[1]); + + WideString cCc; + if (IsExpandedParamKnown(newParams[2])) + cCc = pRuntime->ToWideString(newParams[2]); + + WideString cBcc; + if (IsExpandedParamKnown(newParams[3])) + cBcc = pRuntime->ToWideString(newParams[3]); + + WideString cSubject; + if (IsExpandedParamKnown(newParams[4])) + cSubject = pRuntime->ToWideString(newParams[4]); + + WideString cMsg; + if (IsExpandedParamKnown(newParams[5])) + cMsg = pRuntime->ToWideString(newParams[5]); + + std::vector mutable_buf(sTextBuf.begin(), sTextBuf.end()); pRuntime->BeginBlock(); - CPDFSDK_FormFillEnvironment* pFormFillEnv = pRuntime->GetFormFillEnv(); - pFormFillEnv->JS_docmailForm(mutable_buf.data(), mutable_buf.size(), bUI, cTo, - cSubject, cCc, cBcc, cMsg); + m_pFormFillEnv->JS_docmailForm(mutable_buf.data(), mutable_buf.size(), bUI, + cTo, cSubject, cCc, cBcc, cMsg); pRuntime->EndBlock(); return CJS_Result::Success(); } diff --git a/testing/resources/javascript/document_methods.in b/testing/resources/javascript/document_methods.in index bb7af748d8..be4bf63b64 100644 --- a/testing/resources/javascript/document_methods.in +++ b/testing/resources/javascript/document_methods.in @@ -260,10 +260,16 @@ function testMailDoc() { // TODO(tsepez): test with no permissions. // Success cases. - expect('this.mailDoc(true)', undefined); + expect('this.mailDoc()', undefined); expect('this.mailDoc(false, "user@example.com", "cc@example.com", ' + '"bcc@example.com", "Lottery Winner", "You won the lottery!")', undefined); + expect('this.mailDoc({})', undefined); + expect('this.mailDoc({"bUI": false, "cTo": "user@example.com", ' + + '"cCc": "cc@example.com", "cBcc": "bcc@example.com", ' + + '"cSubject": "LotteryWinner", "cMsg": "You won the lottery!", ' + + '"bogus": "yes"})', + undefined); } function testMailForm() { @@ -273,10 +279,16 @@ function testMailForm() { // TODO(tsepez): test with no permissions. // Success cases. - expect('this.mailForm(true)', undefined); + expect('this.mailForm()', undefined); expect('this.mailForm(false, "user@example.com", "cc@example.com", ' + '"bcc@example.com", "Lottery Winner", "You won the lottery!")', undefined); + expect('this.mailForm({})', undefined); + expect('this.mailForm({"bUI": false, "cTo": "user@example.com", ' + + '"cCc": "cc@example.com", "cBcc": "bcc@example.com", ' + + '"cSubject": "LotteryWinner", "cMsg": "You won the lottery!", ' + + '"bogus": "yes"})', + undefined); } function testPrint() { diff --git a/testing/resources/javascript/document_methods_expected.txt b/testing/resources/javascript/document_methods_expected.txt index e39690ba45..d4daf995c4 100644 --- a/testing/resources/javascript/document_methods_expected.txt +++ b/testing/resources/javascript/document_methods_expected.txt @@ -109,14 +109,22 @@ Alert: PASS: this.gotoNamedDest(1, 2) threw error Document.gotoNamedDest: Incorr Alert: PASS: this.gotoNamedDest("chicago") threw error Document.gotoNamedDest: Object no longer exists. Alert: PASS: typeof this.mailDoc = function Mail Msg: 1, to=, cc=, bcc=, subject=, body= -Alert: PASS: this.mailDoc(true) = undefined +Alert: PASS: this.mailDoc() = undefined Mail Msg: 0, to=user@example.com, cc=cc@example.com, bcc=bcc@example.com, subject=Lottery Winner, body=You won the lottery! Alert: PASS: this.mailDoc(false, "user@example.com", "cc@example.com", "bcc@example.com", "Lottery Winner", "You won the lottery!") = undefined +Mail Msg: 1, to=, cc=, bcc=, subject=, body= +Alert: PASS: this.mailDoc({}) = undefined +Mail Msg: 0, to=user@example.com, cc=cc@example.com, bcc=bcc@example.com, subject=LotteryWinner, body=You won the lottery! +Alert: PASS: this.mailDoc({"bUI": false, "cTo": "user@example.com", "cCc": "cc@example.com", "cBcc": "bcc@example.com", "cSubject": "LotteryWinner", "cMsg": "You won the lottery!", "bogus": "yes"}) = undefined Alert: PASS: typeof this.mailForm = function Mail Msg: 1, to=, cc=, bcc=, subject=, body= -Alert: PASS: this.mailForm(true) = undefined +Alert: PASS: this.mailForm() = undefined Mail Msg: 0, to=user@example.com, cc=cc@example.com, bcc=bcc@example.com, subject=Lottery Winner, body=You won the lottery! Alert: PASS: this.mailForm(false, "user@example.com", "cc@example.com", "bcc@example.com", "Lottery Winner", "You won the lottery!") = undefined +Mail Msg: 1, to=, cc=, bcc=, subject=, body= +Alert: PASS: this.mailForm({}) = undefined +Mail Msg: 0, to=user@example.com, cc=cc@example.com, bcc=bcc@example.com, subject=LotteryWinner, body=You won the lottery! +Alert: PASS: this.mailForm({"bUI": false, "cTo": "user@example.com", "cCc": "cc@example.com", "cBcc": "bcc@example.com", "cSubject": "LotteryWinner", "cMsg": "You won the lottery!", "bogus": "yes"}) = undefined Alert: PASS: typeof this.print = function Doc Print: 1, 0, 0, 0, 0, 0, 0, 0 Alert: PASS: this.print() = undefined -- cgit v1.2.3