1 // Copyright 2014 PDFium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 6 7 #include "xfa/fxfa/parser/cscript_eventpseudomodel.h" 8 9 #include "fxjs/cfxjse_arguments.h" 10 #include "xfa/fxfa/app/xfa_ffnotify.h" 11 #include "xfa/fxfa/cxfa_eventparam.h" 12 #include "xfa/fxfa/parser/cxfa_document.h" 13 #include "xfa/fxfa/parser/cxfa_scriptcontext.h" 14 #include "xfa/fxfa/parser/xfa_localemgr.h" 15 #include "xfa/fxfa/parser/xfa_object.h" 16 #include "xfa/fxfa/parser/xfa_utils.h" 17 #include "xfa/fxfa/xfa_ffwidgethandler.h" 18 19 namespace { 20 21 void StringProperty(CFXJSE_Value* pValue, 22 CFX_WideString& wsValue, 23 bool bSetting) { 24 if (bSetting) { 25 wsValue = pValue->ToWideString(); 26 return; 27 } 28 pValue->SetString(wsValue.UTF8Encode().AsStringC()); 29 } 30 31 void InterProperty(CFXJSE_Value* pValue, int32_t& iValue, bool bSetting) { 32 if (bSetting) { 33 iValue = pValue->ToInteger(); 34 return; 35 } 36 pValue->SetInteger(iValue); 37 } 38 39 void BooleanProperty(CFXJSE_Value* pValue, bool& bValue, bool bSetting) { 40 if (bSetting) { 41 bValue = pValue->ToBoolean(); 42 return; 43 } 44 pValue->SetBoolean(bValue); 45 } 46 47 } // namespace 48 49 CScript_EventPseudoModel::CScript_EventPseudoModel(CXFA_Document* pDocument) 50 : CXFA_Object(pDocument, 51 XFA_ObjectType::Object, 52 XFA_Element::EventPseudoModel, 53 CFX_WideStringC(L"eventPseudoModel")) {} 54 55 CScript_EventPseudoModel::~CScript_EventPseudoModel() {} 56 57 void CScript_EventPseudoModel::Property(CFXJSE_Value* pValue, 58 XFA_Event dwFlag, 59 bool bSetting) { 60 CXFA_ScriptContext* pScriptContext = m_pDocument->GetScriptContext(); 61 if (!pScriptContext) 62 return; 63 64 CXFA_EventParam* pEventParam = pScriptContext->GetEventParam(); 65 if (!pEventParam) 66 return; 67 68 switch (dwFlag) { 69 case XFA_Event::CancelAction: 70 BooleanProperty(pValue, pEventParam->m_bCancelAction, bSetting); 71 break; 72 case XFA_Event::Change: 73 StringProperty(pValue, pEventParam->m_wsChange, bSetting); 74 break; 75 case XFA_Event::CommitKey: 76 InterProperty(pValue, pEventParam->m_iCommitKey, bSetting); 77 break; 78 case XFA_Event::FullText: 79 StringProperty(pValue, pEventParam->m_wsFullText, bSetting); 80 break; 81 case XFA_Event::Keydown: 82 BooleanProperty(pValue, pEventParam->m_bKeyDown, bSetting); 83 break; 84 case XFA_Event::Modifier: 85 BooleanProperty(pValue, pEventParam->m_bModifier, bSetting); 86 break; 87 case XFA_Event::NewContentType: 88 StringProperty(pValue, pEventParam->m_wsNewContentType, bSetting); 89 break; 90 case XFA_Event::NewText: 91 StringProperty(pValue, pEventParam->m_wsNewText, bSetting); 92 break; 93 case XFA_Event::PreviousContentType: 94 StringProperty(pValue, pEventParam->m_wsPrevContentType, bSetting); 95 break; 96 case XFA_Event::PreviousText: 97 StringProperty(pValue, pEventParam->m_wsPrevText, bSetting); 98 break; 99 case XFA_Event::Reenter: 100 BooleanProperty(pValue, pEventParam->m_bReenter, bSetting); 101 break; 102 case XFA_Event::SelectionEnd: 103 InterProperty(pValue, pEventParam->m_iSelEnd, bSetting); 104 break; 105 case XFA_Event::SelectionStart: 106 InterProperty(pValue, pEventParam->m_iSelStart, bSetting); 107 break; 108 case XFA_Event::Shift: 109 BooleanProperty(pValue, pEventParam->m_bShift, bSetting); 110 break; 111 case XFA_Event::SoapFaultCode: 112 StringProperty(pValue, pEventParam->m_wsSoapFaultCode, bSetting); 113 break; 114 case XFA_Event::SoapFaultString: 115 StringProperty(pValue, pEventParam->m_wsSoapFaultString, bSetting); 116 break; 117 case XFA_Event::Target: 118 break; 119 default: 120 break; 121 } 122 } 123 void CScript_EventPseudoModel::Change(CFXJSE_Value* pValue, 124 bool bSetting, 125 XFA_ATTRIBUTE eAttribute) { 126 Property(pValue, XFA_Event::Change, bSetting); 127 } 128 void CScript_EventPseudoModel::CommitKey(CFXJSE_Value* pValue, 129 bool bSetting, 130 XFA_ATTRIBUTE eAttribute) { 131 Property(pValue, XFA_Event::CommitKey, bSetting); 132 } 133 void CScript_EventPseudoModel::FullText(CFXJSE_Value* pValue, 134 bool bSetting, 135 XFA_ATTRIBUTE eAttribute) { 136 Property(pValue, XFA_Event::FullText, bSetting); 137 } 138 void CScript_EventPseudoModel::KeyDown(CFXJSE_Value* pValue, 139 bool bSetting, 140 XFA_ATTRIBUTE eAttribute) { 141 Property(pValue, XFA_Event::Keydown, bSetting); 142 } 143 void CScript_EventPseudoModel::Modifier(CFXJSE_Value* pValue, 144 bool bSetting, 145 XFA_ATTRIBUTE eAttribute) { 146 Property(pValue, XFA_Event::Modifier, bSetting); 147 } 148 void CScript_EventPseudoModel::NewContentType(CFXJSE_Value* pValue, 149 bool bSetting, 150 XFA_ATTRIBUTE eAttribute) { 151 Property(pValue, XFA_Event::NewContentType, bSetting); 152 } 153 void CScript_EventPseudoModel::NewText(CFXJSE_Value* pValue, 154 bool bSetting, 155 XFA_ATTRIBUTE eAttribute) { 156 Property(pValue, XFA_Event::NewText, bSetting); 157 } 158 void CScript_EventPseudoModel::PrevContentType(CFXJSE_Value* pValue, 159 bool bSetting, 160 XFA_ATTRIBUTE eAttribute) { 161 Property(pValue, XFA_Event::PreviousContentType, bSetting); 162 } 163 void CScript_EventPseudoModel::PrevText(CFXJSE_Value* pValue, 164 bool bSetting, 165 XFA_ATTRIBUTE eAttribute) { 166 Property(pValue, XFA_Event::PreviousText, bSetting); 167 } 168 void CScript_EventPseudoModel::Reenter(CFXJSE_Value* pValue, 169 bool bSetting, 170 XFA_ATTRIBUTE eAttribute) { 171 Property(pValue, XFA_Event::Reenter, bSetting); 172 } 173 void CScript_EventPseudoModel::SelEnd(CFXJSE_Value* pValue, 174 bool bSetting, 175 XFA_ATTRIBUTE eAttribute) { 176 Property(pValue, XFA_Event::SelectionEnd, bSetting); 177 } 178 void CScript_EventPseudoModel::SelStart(CFXJSE_Value* pValue, 179 bool bSetting, 180 XFA_ATTRIBUTE eAttribute) { 181 Property(pValue, XFA_Event::SelectionStart, bSetting); 182 } 183 void CScript_EventPseudoModel::Shift(CFXJSE_Value* pValue, 184 bool bSetting, 185 XFA_ATTRIBUTE eAttribute) { 186 Property(pValue, XFA_Event::Shift, bSetting); 187 } 188 void CScript_EventPseudoModel::SoapFaultCode(CFXJSE_Value* pValue, 189 bool bSetting, 190 XFA_ATTRIBUTE eAttribute) { 191 Property(pValue, XFA_Event::SoapFaultCode, bSetting); 192 } 193 void CScript_EventPseudoModel::SoapFaultString(CFXJSE_Value* pValue, 194 bool bSetting, 195 XFA_ATTRIBUTE eAttribute) { 196 Property(pValue, XFA_Event::SoapFaultString, bSetting); 197 } 198 void CScript_EventPseudoModel::Target(CFXJSE_Value* pValue, 199 bool bSetting, 200 XFA_ATTRIBUTE eAttribute) { 201 Property(pValue, XFA_Event::Target, bSetting); 202 } 203 void CScript_EventPseudoModel::Emit(CFXJSE_Arguments* pArguments) { 204 CXFA_ScriptContext* pScriptContext = m_pDocument->GetScriptContext(); 205 if (!pScriptContext) { 206 return; 207 } 208 CXFA_EventParam* pEventParam = pScriptContext->GetEventParam(); 209 if (!pEventParam) { 210 return; 211 } 212 CXFA_FFNotify* pNotify = m_pDocument->GetNotify(); 213 if (!pNotify) { 214 return; 215 } 216 CXFA_FFWidgetHandler* pWidgetHandler = pNotify->GetWidgetHandler(); 217 if (!pWidgetHandler) { 218 return; 219 } 220 pWidgetHandler->ProcessEvent(pEventParam->m_pTarget, pEventParam); 221 } 222 void CScript_EventPseudoModel::Reset(CFXJSE_Arguments* pArguments) { 223 CXFA_ScriptContext* pScriptContext = m_pDocument->GetScriptContext(); 224 if (!pScriptContext) { 225 return; 226 } 227 CXFA_EventParam* pEventParam = pScriptContext->GetEventParam(); 228 if (!pEventParam) { 229 return; 230 } 231 pEventParam->Reset(); 232 } 233