Home | History | Annotate | Download | only in javascript
      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 "../../include/javascript/JavaScript.h"
      8 #include "../../include/javascript/IJavaScript.h"
      9 //#include "../../include/javascript/JS_ResMgr.h"
     10 #include "../../include/javascript/JS_Context.h"
     11 #include "../../include/javascript/JS_EventHandler.h"
     12 #include "../../include/javascript/JS_Runtime.h"
     13 #include "../../include/javascript/resource.h"
     14 
     15 /* -------------------------- CJS_Context -------------------------- */
     16 
     17 CJS_Context::CJS_Context(CJS_Runtime* pRuntime) :
     18 	m_pRuntime(pRuntime),
     19 	m_bBusy(FALSE),
     20 	m_bMsgBoxEnable(TRUE)
     21 {
     22 	m_pEventHandler = new CJS_EventHandler(this);
     23 }
     24 
     25 CJS_Context::~CJS_Context(void)
     26 {
     27 	if (m_pEventHandler)
     28 	{
     29 		delete m_pEventHandler;
     30 		m_pEventHandler = NULL;
     31 	}
     32 }
     33 
     34 CPDFSDK_Document* CJS_Context::GetReaderDocument()
     35 {
     36 	ASSERT(m_pRuntime != NULL);
     37 
     38 	return m_pRuntime->GetReaderDocument();
     39 }
     40 
     41 CPDFDoc_Environment* CJS_Context::GetReaderApp()
     42 {
     43 	ASSERT(m_pRuntime != NULL);
     44 
     45 	return m_pRuntime->GetReaderApp();
     46 }
     47 
     48 FX_BOOL CJS_Context::DoJob(int nMode, const CFX_WideString& script, CFX_WideString& info)
     49 {
     50 	if (m_bBusy)
     51 	{
     52 		info = JSGetStringFromID(this, IDS_STRING_JSBUSY);
     53 		return FALSE;
     54 	}
     55 
     56 	m_bBusy = TRUE;
     57 
     58 	ASSERT(m_pRuntime != NULL);
     59 	ASSERT(m_pEventHandler != NULL);
     60 	ASSERT(m_pEventHandler->IsValid());
     61 
     62 	if (!m_pRuntime->AddEventToLoop(m_pEventHandler->TargetName(), m_pEventHandler->EventType()))
     63 	{
     64 		info = JSGetStringFromID(this, IDS_STRING_JSEVENT);
     65 		return FALSE;
     66 	}
     67 
     68 	FXJSErr error ={NULL,NULL, 0};
     69 	int nRet = 0;
     70 
     71 	try
     72 	{
     73 		if (script.GetLength() > 0)
     74 		{
     75 			if (nMode == 0)
     76 			{
     77 				nRet = JS_Execute(*m_pRuntime, this, script, script.GetLength(), &error);
     78 			}
     79 			else
     80 			{
     81 				nRet = JS_Parse(*m_pRuntime, this, script, script.GetLength(), &error);
     82 			}
     83 		}
     84 
     85 		if (nRet < 0)
     86 		{
     87 			CFX_WideString sLine;
     88 			sLine.Format((FX_LPCWSTR)L"[ Line: %05d { %s } ] : %s",error.linnum-1,error.srcline,error.message);
     89 
     90 //			TRACE(L"/* -------------- JS Error -------------- */\n");
     91 //			TRACE(sLine);
     92 //			TRACE(L"\n");
     93 			//CFX_ByteString sTemp = CFX_ByteString::FromUnicode(error.message);
     94 			info += sLine;
     95 		}
     96 		else
     97 		{
     98 			info = JSGetStringFromID(this, IDS_STRING_RUN);
     99 		}
    100 
    101 	}
    102 	catch (...)
    103 	{
    104 		info = JSGetStringFromID(this, IDS_STRING_UNHANDLED);
    105 		nRet = -1;
    106 	}
    107 
    108 	m_pRuntime->RemoveEventInLoop(m_pEventHandler->TargetName(), m_pEventHandler->EventType());
    109 
    110 	m_pEventHandler->Destroy();
    111 	m_bBusy = FALSE;
    112 
    113 	return nRet >= 0;
    114 }
    115 
    116 FX_BOOL CJS_Context::RunScript(const CFX_WideString& script, CFX_WideString& info)
    117 {
    118 	v8::Isolate::Scope isolate_scope(m_pRuntime->GetIsolate());
    119 	v8::HandleScope handle_scope(m_pRuntime->GetIsolate());
    120 	v8::Local<v8::Context> context = m_pRuntime->NewJSContext();
    121 	v8::Context::Scope context_scope(context);
    122 
    123 	return DoJob(0, script, info);
    124 }
    125 
    126 FX_BOOL CJS_Context::Compile(const CFX_WideString& script, CFX_WideString& info)
    127 {
    128 	v8::Isolate::Scope isolate_scope(m_pRuntime->GetIsolate());
    129 	v8::HandleScope handle_scope(m_pRuntime->GetIsolate());
    130 	v8::Local<v8::Context> context = m_pRuntime->NewJSContext();
    131 	v8::Context::Scope context_scope(context);
    132 
    133 	return DoJob(1, script, info);
    134 }
    135 
    136 void CJS_Context::OnApp_Init()
    137 {
    138 	ASSERT(m_pEventHandler != NULL);
    139 	m_pEventHandler->OnApp_Init();
    140 }
    141 
    142 void CJS_Context::OnDoc_Open(CPDFSDK_Document* pDoc, const CFX_WideString &strTargetName)
    143 {
    144 	ASSERT(m_pEventHandler != NULL);
    145 	m_pEventHandler->OnDoc_Open(pDoc,strTargetName);
    146 }
    147 
    148 void CJS_Context::OnDoc_WillPrint(CPDFSDK_Document* pDoc)
    149 {
    150 	ASSERT(m_pEventHandler != NULL);
    151 	m_pEventHandler->OnDoc_WillPrint(pDoc);
    152 }
    153 
    154 void CJS_Context::OnDoc_DidPrint(CPDFSDK_Document* pDoc)
    155 {
    156 	ASSERT(m_pEventHandler != NULL);
    157 	m_pEventHandler->OnDoc_DidPrint(pDoc);
    158 }
    159 
    160 void CJS_Context::OnDoc_WillSave(CPDFSDK_Document* pDoc)
    161 {
    162 	ASSERT(m_pEventHandler != NULL);
    163 	m_pEventHandler->OnDoc_WillSave(pDoc);
    164 }
    165 
    166 void CJS_Context::OnDoc_DidSave(CPDFSDK_Document* pDoc)
    167 {
    168 	ASSERT(m_pEventHandler != NULL);
    169 	m_pEventHandler->OnDoc_DidSave(pDoc);
    170 }
    171 
    172 void CJS_Context::OnDoc_WillClose(CPDFSDK_Document* pDoc)
    173 {
    174 	ASSERT(m_pEventHandler != NULL);
    175 	m_pEventHandler->OnDoc_WillClose(pDoc);
    176 }
    177 
    178 void CJS_Context::OnPage_Open(CPDFSDK_Document* pTarget)
    179 {
    180 	ASSERT(m_pEventHandler != NULL);
    181 	m_pEventHandler->OnPage_Open(pTarget);
    182 }
    183 
    184 void CJS_Context::OnPage_Close(CPDFSDK_Document* pTarget)
    185 {
    186 	ASSERT(m_pEventHandler != NULL);
    187 	m_pEventHandler->OnPage_Close(pTarget);
    188 }
    189 
    190 void CJS_Context::OnPage_InView(CPDFSDK_Document* pTarget)
    191 {
    192 	ASSERT(m_pEventHandler != NULL);
    193 	m_pEventHandler->OnPage_InView(pTarget);
    194 }
    195 
    196 void CJS_Context::OnPage_OutView(CPDFSDK_Document* pTarget)
    197 {
    198 	ASSERT(m_pEventHandler != NULL);
    199 	m_pEventHandler->OnPage_OutView(pTarget);
    200 }
    201 
    202 void CJS_Context::OnField_MouseDown(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField *pTarget)
    203 {
    204 	ASSERT(m_pEventHandler != NULL);
    205 	m_pEventHandler->OnField_MouseDown(bModifier, bShift, pTarget);
    206 }
    207 
    208 void CJS_Context::OnField_MouseEnter(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField *pTarget)
    209 {
    210 	ASSERT(m_pEventHandler != NULL);
    211 	m_pEventHandler->OnField_MouseEnter(bModifier, bShift, pTarget);
    212 }
    213 
    214 void CJS_Context::OnField_MouseExit(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField *pTarget)
    215 {
    216 	ASSERT(m_pEventHandler != NULL);
    217 	m_pEventHandler->OnField_MouseExit(bModifier, bShift, pTarget);
    218 }
    219 
    220 void CJS_Context::OnField_MouseUp(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField *pTarget)
    221 {
    222 	ASSERT(m_pEventHandler != NULL);
    223 	m_pEventHandler->OnField_MouseUp(bModifier, bShift, pTarget);
    224 }
    225 
    226 void CJS_Context::OnField_Focus(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField* pTarget, const CFX_WideString& Value)
    227 {
    228 	ASSERT(m_pEventHandler != NULL);
    229 	m_pEventHandler->OnField_Focus(bModifier, bShift, pTarget, Value);
    230 }
    231 
    232 void CJS_Context::OnField_Blur(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField* pTarget, const CFX_WideString& Value)
    233 {
    234 	ASSERT(m_pEventHandler != NULL);
    235 	m_pEventHandler->OnField_Blur(bModifier, bShift, pTarget, Value);
    236 }
    237 
    238 void CJS_Context::OnField_Calculate(CPDF_FormField* pSource, CPDF_FormField* pTarget, CFX_WideString& Value, FX_BOOL& bRc)
    239 {
    240 	ASSERT(m_pEventHandler != NULL);
    241 	m_pEventHandler->OnField_Calculate(pSource, pTarget, Value, bRc);
    242 }
    243 
    244 void CJS_Context::OnField_Format(int nCommitKey, CPDF_FormField* pTarget, CFX_WideString& Value, FX_BOOL bWillCommit)
    245 {
    246 	ASSERT(m_pEventHandler != NULL);
    247 	m_pEventHandler->OnField_Format(nCommitKey, pTarget, Value, bWillCommit);
    248 }
    249 
    250 
    251 void CJS_Context::OnField_Keystroke(int nCommitKey, CFX_WideString& strChange, const CFX_WideString& strChangeEx,
    252 									FX_BOOL bKeyDown, FX_BOOL bModifier, int &nSelEnd,int &nSelStart,
    253 									FX_BOOL bShift, CPDF_FormField* pTarget, CFX_WideString& Value,
    254 									FX_BOOL bWillCommit, FX_BOOL bFieldFull, FX_BOOL& bRc)
    255 {
    256 	ASSERT(m_pEventHandler != NULL);
    257 	m_pEventHandler->OnField_Keystroke(nCommitKey, strChange, strChangeEx, bKeyDown,
    258 		bModifier, nSelEnd, nSelStart, bShift, pTarget, Value, bWillCommit, bFieldFull, bRc);
    259 }
    260 
    261 void CJS_Context::OnField_Validate(CFX_WideString& strChange,const CFX_WideString& strChangeEx,
    262 								   FX_BOOL bKeyDown, FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField* pTarget,
    263 								   CFX_WideString& Value, FX_BOOL& bRc)
    264 {
    265 	ASSERT(m_pEventHandler != NULL);
    266 	m_pEventHandler->OnField_Validate(strChange, strChangeEx, bKeyDown, bModifier, bShift, pTarget, Value, bRc);
    267 }
    268 
    269 void CJS_Context::OnScreen_Focus(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen)
    270 {
    271 	ASSERT(m_pEventHandler != NULL);
    272 	m_pEventHandler->OnScreen_Focus(bModifier, bShift, pScreen);
    273 }
    274 
    275 void CJS_Context::OnScreen_Blur(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen)
    276 {
    277 	ASSERT(m_pEventHandler != NULL);
    278 	m_pEventHandler->OnScreen_Blur(bModifier, bShift, pScreen);
    279 }
    280 
    281 void CJS_Context::OnScreen_Open(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen)
    282 {
    283 	ASSERT(m_pEventHandler != NULL);
    284 	m_pEventHandler->OnScreen_Open(bModifier, bShift, pScreen);
    285 }
    286 
    287 void CJS_Context::OnScreen_Close(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen)
    288 {
    289 	ASSERT(m_pEventHandler != NULL);
    290 	m_pEventHandler->OnScreen_Close(bModifier, bShift, pScreen);
    291 }
    292 
    293 void CJS_Context::OnScreen_MouseDown(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen)
    294 {
    295 	ASSERT(m_pEventHandler != NULL);
    296 	m_pEventHandler->OnScreen_MouseDown(bModifier, bShift, pScreen);
    297 }
    298 
    299 void CJS_Context::OnScreen_MouseUp(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen)
    300 {
    301 	ASSERT(m_pEventHandler != NULL);
    302 	m_pEventHandler->OnScreen_MouseUp(bModifier, bShift, pScreen);
    303 }
    304 
    305 void CJS_Context::OnScreen_MouseEnter(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen)
    306 {
    307 	ASSERT(m_pEventHandler != NULL);
    308 	m_pEventHandler->OnScreen_MouseEnter(bModifier, bShift, pScreen);
    309 }
    310 
    311 void CJS_Context::OnScreen_MouseExit(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen)
    312 {
    313 	ASSERT(m_pEventHandler != NULL);
    314 	m_pEventHandler->OnScreen_MouseExit(bModifier, bShift, pScreen);
    315 }
    316 
    317 void CJS_Context::OnScreen_InView(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen)
    318 {
    319 	ASSERT(m_pEventHandler != NULL);
    320 	m_pEventHandler->OnScreen_InView(bModifier, bShift, pScreen);
    321 }
    322 
    323 void CJS_Context::OnScreen_OutView(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen)
    324 {
    325 	ASSERT(m_pEventHandler != NULL);
    326 	m_pEventHandler->OnScreen_OutView(bModifier, bShift, pScreen);
    327 }
    328 
    329 void CJS_Context::OnBookmark_MouseUp(CPDF_Bookmark* pBookMark)
    330 {
    331 	ASSERT(m_pEventHandler != NULL);
    332 	m_pEventHandler->OnBookmark_MouseUp(pBookMark);
    333 }
    334 
    335 void CJS_Context::OnLink_MouseUp(CPDFSDK_Document* pTarget)
    336 {
    337 	ASSERT(m_pEventHandler != NULL);
    338 	m_pEventHandler->OnLink_MouseUp(pTarget);
    339 }
    340 
    341 void CJS_Context::OnConsole_Exec()
    342 {
    343 	ASSERT(m_pEventHandler != NULL);
    344 	m_pEventHandler->OnConsole_Exec();
    345 }
    346 
    347 void CJS_Context::OnExternal_Exec()
    348 {
    349 	ASSERT(m_pEventHandler != NULL);
    350 	m_pEventHandler->OnExternal_Exec();
    351 }
    352 
    353 void CJS_Context::OnBatchExec(CPDFSDK_Document* pTarget)
    354 {
    355 	ASSERT(m_pEventHandler != NULL);
    356 	m_pEventHandler->OnBatchExec(pTarget);
    357 }
    358 
    359 void CJS_Context::OnMenu_Exec(CPDFSDK_Document* pTarget,const CFX_WideString& strTargetName)
    360 {
    361 	ASSERT(m_pEventHandler != NULL);
    362 	m_pEventHandler->OnMenu_Exec(pTarget, strTargetName);
    363 }
    364 
    365