// Copyright 2014 PDFium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com #include "fpdfsdk/javascript/event.h" #include "fpdfsdk/javascript/Field.h" #include "fpdfsdk/javascript/JS_Define.h" #include "fpdfsdk/javascript/JS_EventHandler.h" #include "fpdfsdk/javascript/JS_Object.h" #include "fpdfsdk/javascript/JS_Value.h" #include "fpdfsdk/javascript/cjs_context.h" BEGIN_JS_STATIC_CONST(CJS_Event) END_JS_STATIC_CONST() BEGIN_JS_STATIC_PROP(CJS_Event) JS_STATIC_PROP_ENTRY(change) JS_STATIC_PROP_ENTRY(changeEx) JS_STATIC_PROP_ENTRY(commitKey) JS_STATIC_PROP_ENTRY(fieldFull) JS_STATIC_PROP_ENTRY(keyDown) JS_STATIC_PROP_ENTRY(modifier) JS_STATIC_PROP_ENTRY(name) JS_STATIC_PROP_ENTRY(rc) JS_STATIC_PROP_ENTRY(richChange) JS_STATIC_PROP_ENTRY(richChangeEx) JS_STATIC_PROP_ENTRY(richValue) JS_STATIC_PROP_ENTRY(selEnd) JS_STATIC_PROP_ENTRY(selStart) JS_STATIC_PROP_ENTRY(shift) JS_STATIC_PROP_ENTRY(source) JS_STATIC_PROP_ENTRY(target) JS_STATIC_PROP_ENTRY(targetName) JS_STATIC_PROP_ENTRY(type) JS_STATIC_PROP_ENTRY(value) JS_STATIC_PROP_ENTRY(willCommit) END_JS_STATIC_PROP() BEGIN_JS_STATIC_METHOD(CJS_Event) END_JS_STATIC_METHOD() IMPLEMENT_JS_CLASS(CJS_Event, event) event::event(CJS_Object* pJsObject) : CJS_EmbedObj(pJsObject) {} event::~event() {} bool event::change(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError) { CJS_Context* pContext = (CJS_Context*)cc; CJS_EventHandler* pEvent = pContext->GetEventHandler(); CFX_WideString& wChange = pEvent->Change(); if (vp.IsSetting()) { if (vp.GetJSValue()->GetType() == CJS_Value::VT_string) vp >> wChange; } else { vp << wChange; } return true; } bool event::changeEx(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError) { if (!vp.IsGetting()) return false; CJS_Context* pContext = (CJS_Context*)cc; CJS_EventHandler* pEvent = pContext->GetEventHandler(); vp << pEvent->ChangeEx(); return true; } bool event::commitKey(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError) { if (!vp.IsGetting()) return false; CJS_Context* pContext = (CJS_Context*)cc; CJS_EventHandler* pEvent = pContext->GetEventHandler(); vp << pEvent->CommitKey(); return true; } bool event::fieldFull(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError) { CJS_Context* pContext = (CJS_Context*)cc; CJS_EventHandler* pEvent = pContext->GetEventHandler(); if (!vp.IsGetting() && wcscmp((const wchar_t*)pEvent->Name(), L"Keystroke") != 0) return false; if (pEvent->FieldFull()) vp << true; else vp << false; return true; } bool event::keyDown(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError) { if (!vp.IsGetting()) return false; CJS_Context* pContext = (CJS_Context*)cc; CJS_EventHandler* pEvent = pContext->GetEventHandler(); if (pEvent->KeyDown()) vp << true; else vp << false; return true; } bool event::modifier(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError) { if (!vp.IsGetting()) return false; CJS_Context* pContext = (CJS_Context*)cc; CJS_EventHandler* pEvent = pContext->GetEventHandler(); if (pEvent->Modifier()) vp << true; else vp << false; return true; } bool event::name(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError) { if (!vp.IsGetting()) return false; CJS_Context* pContext = (CJS_Context*)cc; CJS_EventHandler* pEvent = pContext->GetEventHandler(); vp << pEvent->Name(); return true; } bool event::rc(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError) { CJS_Context* pContext = (CJS_Context*)cc; CJS_EventHandler* pEvent = pContext->GetEventHandler(); bool& bRc = pEvent->Rc(); if (vp.IsSetting()) { vp >> bRc; } else { vp << bRc; } return true; } bool event::richChange(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError) { return true; } bool event::richChangeEx(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError) { return true; } bool event::richValue(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError) { return true; } bool event::selEnd(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError) { CJS_Context* pContext = (CJS_Context*)cc; CJS_EventHandler* pEvent = pContext->GetEventHandler(); if (wcscmp((const wchar_t*)pEvent->Name(), L"Keystroke") != 0) { return true; } int& iSelEnd = pEvent->SelEnd(); if (vp.IsSetting()) { vp >> iSelEnd; } else { vp << iSelEnd; } return true; } bool event::selStart(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError) { CJS_Context* pContext = (CJS_Context*)cc; CJS_EventHandler* pEvent = pContext->GetEventHandler(); if (wcscmp((const wchar_t*)pEvent->Name(), L"Keystroke") != 0) { return true; } int& iSelStart = pEvent->SelStart(); if (vp.IsSetting()) { vp >> iSelStart; } else { vp << iSelStart; } return true; } bool event::shift(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError) { if (!vp.IsGetting()) return false; CJS_Context* pContext = (CJS_Context*)cc; CJS_EventHandler* pEvent = pContext->GetEventHandler(); if (pEvent->Shift()) vp << true; else vp << false; return true; } bool event::source(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError) { if (!vp.IsGetting()) return false; CJS_Context* pContext = (CJS_Context*)cc; CJS_EventHandler* pEvent = pContext->GetEventHandler(); vp << pEvent->Source()->GetJSObject(); return true; } bool event::target(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError) { if (!vp.IsGetting()) return false; CJS_Context* pContext = (CJS_Context*)cc; CJS_EventHandler* pEvent = pContext->GetEventHandler(); vp << pEvent->Target_Field()->GetJSObject(); return true; } bool event::targetName(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError) { if (!vp.IsGetting()) return false; CJS_Context* pContext = (CJS_Context*)cc; CJS_EventHandler* pEvent = pContext->GetEventHandler(); vp << pEvent->TargetName(); return true; } bool event::type(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError) { if (!vp.IsGetting()) return false; CJS_Context* pContext = (CJS_Context*)cc; CJS_EventHandler* pEvent = pContext->GetEventHandler(); vp << pEvent->Type(); return true; } bool event::value(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError) { CJS_Context* pContext = (CJS_Context*)cc; CJS_EventHandler* pEvent = pContext->GetEventHandler(); if (wcscmp((const wchar_t*)pEvent->Type(), L"Field") != 0) return false; if (!pEvent->m_pValue) return false; CFX_WideString& val = pEvent->Value(); if (vp.IsSetting()) { vp >> val; } else { vp << val; } return true; } bool event::willCommit(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError) { if (!vp.IsGetting()) return false; CJS_Context* pContext = (CJS_Context*)cc; CJS_EventHandler* pEvent = pContext->GetEventHandler(); if (pEvent->WillCommit()) vp << true; else vp << false; return true; }