Index: xfa/fxfa/parser/xfa_object_imp.cpp |
diff --git a/xfa/fxfa/parser/xfa_object_imp.cpp b/xfa/fxfa/parser/xfa_object_imp.cpp |
index 6a6303e64e2c3afe834e0e752edd3d0efc2074bb..1d1a5a2290a9eecb58bd1b87d4dbff84c72f7d97 100644 |
--- a/xfa/fxfa/parser/xfa_object_imp.cpp |
+++ b/xfa/fxfa/parser/xfa_object_imp.cpp |
@@ -902,6 +902,7 @@ void CXFA_Node::Script_NodeClass_GetElement(CFXJSE_Arguments* pArguments) { |
FXJSE_Value_Set(pArguments->GetReturnValue(), |
m_pDocument->GetScriptContext()->GetJSValueFromMap(pNode)); |
} |
+ |
void CXFA_Node::Script_NodeClass_IsPropertySpecified( |
CFXJSE_Arguments* pArguments) { |
int32_t iLength = pArguments->GetLength(); |
@@ -914,32 +915,35 @@ void CXFA_Node::Script_NodeClass_IsPropertySpecified( |
FX_BOOL bParent = TRUE; |
int32_t iIndex = 0; |
if (iLength >= 1) { |
- CFX_ByteString bsExpression = pArguments->GetUTF8String(0); |
- wsExpression = CFX_WideString::FromUTF8(bsExpression.AsStringC()); |
+ wsExpression = |
+ CFX_WideString::FromUTF8(pArguments->GetUTF8String(0).AsStringC()); |
} |
- if (iLength >= 2) { |
- bParent = pArguments->GetInt32(1) == 0 ? FALSE : TRUE; |
- } |
- if (iLength >= 3) { |
+ if (iLength >= 2) |
+ bParent = !!pArguments->GetInt32(1) ? TRUE : FALSE; |
+ if (iLength >= 3) |
iIndex = pArguments->GetInt32(2); |
- } |
FX_BOOL bHas = FALSE; |
const XFA_ATTRIBUTEINFO* pAttributeInfo = |
XFA_GetAttributeByName(wsExpression.AsStringC()); |
CFX_WideString wsValue; |
- if (pAttributeInfo) { |
+ if (pAttributeInfo) |
bHas = HasAttribute(pAttributeInfo->eName); |
- } |
if (!bHas) { |
const XFA_ELEMENTINFO* pElementInfo = |
XFA_GetElementByName(wsExpression.AsStringC()); |
- bHas = (GetProperty(iIndex, pElementInfo->eName) != NULL); |
+ bHas = !!GetProperty(iIndex, pElementInfo->eName); |
+ if (!bHas && bParent && m_pParent) { |
+ // Also check on the parent. |
+ bHas = m_pParent->HasAttribute(pAttributeInfo->eName); |
+ if (!bHas) |
+ bHas = !!m_pParent->GetProperty(iIndex, pElementInfo->eName); |
+ } |
} |
FXJSE_HVALUE hValue = pArguments->GetReturnValue(); |
- if (hValue) { |
+ if (hValue) |
FXJSE_Value_SetBoolean(hValue, bHas); |
- } |
} |
+ |
void CXFA_Node::Script_NodeClass_LoadXML(CFXJSE_Arguments* pArguments) { |
int32_t iLength = pArguments->GetLength(); |
if (iLength < 1 || iLength > 3) { |
@@ -1078,64 +1082,45 @@ void CXFA_Node::Script_NodeClass_SaveXML(CFXJSE_Arguments* pArguments) { |
} |
FX_BOOL bPrettyMode = FALSE; |
if (iLength == 1) { |
- CFX_ByteString bsPretty = pArguments->GetUTF8String(0); |
- if (bsPretty != "pretty") { |
+ if (pArguments->GetUTF8String(0) != "pretty") { |
ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH); |
return; |
} |
bPrettyMode = TRUE; |
} |
CFX_ByteStringC bsXMLHeader = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"; |
- if (GetPacketID() == XFA_XDPPACKET_Form) { |
- IFX_MemoryStream* pMemoryStream = FX_CreateMemoryStream(TRUE); |
- IFX_Stream* pStream = IFX_Stream::CreateStream( |
- (IFX_FileWrite*)pMemoryStream, |
- FX_STREAMACCESS_Text | FX_STREAMACCESS_Write | FX_STREAMACCESS_Append); |
+ if (GetPacketID() == XFA_XDPPACKET_Form || |
+ GetPacketID() == XFA_XDPPACKET_Datasets) { |
+ CFDE_XMLNode* pElement = nullptr; |
+ if (GetPacketID() == XFA_XDPPACKET_Datasets) { |
+ pElement = GetXMLMappingNode(); |
+ if (!pElement || pElement->GetType() != FDE_XMLNODE_Element) { |
+ FXJSE_Value_SetUTF8String(pArguments->GetReturnValue(), bsXMLHeader); |
+ return; |
+ } |
+ XFA_DataExporter_DealWithDataGroupNode(this); |
+ } |
+ std::unique_ptr<IFX_MemoryStream> pMemoryStream( |
+ FX_CreateMemoryStream(TRUE)); |
+ std::unique_ptr<IFX_Stream> pStream(IFX_Stream::CreateStream( |
+ (IFX_FileWrite*)pMemoryStream.get(), |
+ FX_STREAMACCESS_Text | FX_STREAMACCESS_Write | FX_STREAMACCESS_Append)); |
if (!pStream) { |
FXJSE_Value_SetUTF8String(pArguments->GetReturnValue(), bsXMLHeader); |
- pMemoryStream->Release(); |
- pMemoryStream = NULL; |
return; |
} |
pStream->SetCodePage(FX_CODEPAGE_UTF8); |
pStream->WriteData(bsXMLHeader.raw_str(), bsXMLHeader.GetLength()); |
- XFA_DataExporter_RegenerateFormFile(this, pStream, NULL, TRUE); |
+ if (GetPacketID() == XFA_XDPPACKET_Form) |
+ XFA_DataExporter_RegenerateFormFile(this, pStream.get(), NULL, TRUE); |
+ else |
+ pElement->SaveXMLNode(pStream.get()); |
+ // TODO(weili): Check whether we need to save pretty print XML, pdfium:501. |
+ // For now, just put it here to avoid unused variable warning. |
+ (void)bPrettyMode; |
FXJSE_Value_SetUTF8String( |
pArguments->GetReturnValue(), |
CFX_ByteStringC(pMemoryStream->GetBuffer(), pMemoryStream->GetSize())); |
- pStream->Release(); |
- pStream = NULL; |
- if (pMemoryStream) { |
- pMemoryStream->Release(); |
- pMemoryStream = NULL; |
- } |
- return; |
- } |
- if (GetPacketID() == XFA_XDPPACKET_Datasets) { |
- CFDE_XMLNode* pElement = GetXMLMappingNode(); |
- if (!pElement || pElement->GetType() != FDE_XMLNODE_Element) { |
- FXJSE_Value_SetUTF8String(pArguments->GetReturnValue(), bsXMLHeader); |
- return; |
- } |
- XFA_DataExporter_DealWithDataGroupNode(this); |
- IFX_MemoryStream* pMemoryStream = FX_CreateMemoryStream(TRUE); |
- IFX_Stream* pStream = IFX_Stream::CreateStream( |
- (IFX_FileWrite*)pMemoryStream, |
- FX_STREAMACCESS_Text | FX_STREAMACCESS_Write | FX_STREAMACCESS_Append); |
- if (pStream) { |
- pStream->SetCodePage(FX_CODEPAGE_UTF8); |
- pStream->WriteData(bsXMLHeader.raw_str(), bsXMLHeader.GetLength()); |
- pElement->SaveXMLNode(pStream); |
- FXJSE_Value_SetUTF8String(pArguments->GetReturnValue(), |
- CFX_ByteStringC(pMemoryStream->GetBuffer(), |
- pMemoryStream->GetSize())); |
- pStream->Release(); |
- pStream = NULL; |
- } |
- if (pMemoryStream) { |
- pMemoryStream->Release(); |
- pMemoryStream = NULL; |
- } |
return; |
} |
FXJSE_Value_SetUTF8String(pArguments->GetReturnValue(), ""); |