Jump to content
scintilla4evr

ChakraCore UDF - executing JavaScript in AutoIt

Recommended Posts

Chimp

looks interesting,

p.s.
(seems the answer to what I was wondering here.... )

thanks for sharing :)


small minds discuss people average minds discuss events great minds discuss ideas.... and use AutoIt....

Share this post


Link to post
Share on other sites
Chimp

Is there any way of instantiating the "chakra.dll" in the form of an object?
something similar to as described here (but for C#), where this command 'host = new ChakraHost();" is used to instantiate Chakra as an object, and then the dot notation syntax is used to call the methods 'host.CallFunction("commitFunction");'  ......?

Edited by Chimp

small minds discuss people average minds discuss events great minds discuss ideas.... and use AutoIt....

Share this post


Link to post
Share on other sites
scintilla4evr
3 hours ago, Chimp said:

 

Is there any way of instantiating the "chakra.dll" in the form of an object?

 

I think that would require wrapping the functions in some kind of COM object (AutoItObject for example), since ChakraCore.dll exposes only "flat API", i.e. exported DLL functions. ("Note that JSRT APIs are C++ APIs, this sample assumes a C# wrapper.", as it says on the Embedding ChakraCore page).

Edited by scintilla4evr

Share this post


Link to post
Share on other sites
Chimp

Hi @scintilla4evr, thanks for your answer

I was wondering if what says @guinness  in his topic here, could be used with this chakradll as well..?

anyway, back on your udf, could you show how to use it if, for example, I would like to use the functions from this 'moment' javascript library directly from AutoIt? (library found on this nice site)

any example is welcome

Thank You :)


small minds discuss people average minds discuss events great minds discuss ideas.... and use AutoIt....

Share this post


Link to post
Share on other sites
PifPaf

Help a poor newbie !

Congratulations, but

I can't find out what's wrong with chakracore.au3  when calling a quite basic execution on the example 1 mode :

(function() {
    var h = window.document.location.href ;
    return h ;
})();

Many thanks in advance.

 

test.au3

test.js

Share this post


Link to post
Share on other sites
junkew
Func _ChakraCore_Startup($sDllFile = "Chakra.dll")

I had to remove the core part from the dll name and then it works. Powefull extension

My output from the examples

  1. JavaScript Output: 5
  2. JavaScript Output: 13
  3. JavaScript Output: llo Wor
  4. JavaScript Output: Lorem ipsum dolor sit amet
  5. a: 320
    b: !dlroW olleH

 

 

 

Share this post


Link to post
Share on other sites
scintilla4evr
On 11/20/2016 at 4:04 PM, PifPaf said:

Help a poor newbie !

Congratulations, but

I can't find out what's wrong with chakracore.au3  when calling a quite basic execution on the example 1 mode :

(function() {
    var h = window.document.location.href ;
    return h ;
})();

Many thanks in advance.

 

test.au3

test.js

Sorry for such a GIGANTIC delay in answering this question.

You can't use window.document.<blah blah insert some object here> in ChakraCore, because the window object is exposed only by web browsers. This UDF only gives access to "raw" JavaScript, so there are no browser-specific objects - no window, navigator, DOM, etc.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • guinness
      By guinness
      Just trying out the latest version of AutoIt and thinking more functional
      #include <Array.au3> ; Example ; An example of filtering an array and reducing an array, using a function reference. ; This is similiar to how it would be done in the likes of JavaScript i.e. more functional (declarative) Local $aArray[] = [1, 2, 3, 50, 30, 40, 20, 30] Local $aFiltered = _ArrayFilter($aArray, GtrThan30) _ArrayDisplay($aFiltered, '_ArrayFilter::') Local $iSum = _ArrayReduce($aArray, SumValues) ConsoleWrite('_ArrayReduce::' & $iSum & @CRLF) Func SumValues($a, $b) Return $a + $b EndFunc ;==>SumValues Func GtrThan30($vValue) Return $vValue > 30 EndFunc ;==>GtrThan30 Func _ArrayFilter($aArray, $fFunc) If Not IsArray($aArray) Then ; Null is more appropriate than returning the likes of -1 or an empty array Return SetError(1, 0, Null) EndIf If Not IsFunc($fFunc) Then ; Null is more appropriate than returning the likes of -1 or an empty array Return SetError(2, 0, Null) EndIf Local Const $iLen = UBound($aArray) - 1 Local $aFiltered[$iLen] Local $iIndex = 0 For $i = 0 To $iLen Local $bIsFiltered = __ArrayCall($fFunc, $aArray[$i], $i) If @error Then Return SetError(@error, @extended, Null) ElseIf $bIsFiltered Then $aFiltered[$iIndex] = $aArray[$i] $iIndex += 1 EndIf Next ReDim $aFiltered[$iIndex] Return $aFiltered EndFunc ;==>_ArrayFilter Func _ArrayReduce($aArray, $fFunc, $vInitial = Default) If Not IsArray($aArray) Then ; Null is more appropriate than returning the likes of -1 or an empty array Return SetError(1, 0, Null) EndIf If Not IsFunc($fFunc) Then ; Null is more appropriate than returning the likes of -1 or an empty array Return SetError(2, 0, Null) EndIf Local $bHasInitial = @NumParams >= 3 For $i = 0 To UBound($aArray) - 1 If $bHasInitial Then $vInitial = __ArrayCall($fFunc, $vInitial, $aArray[$i], $i) If @error Then Return SetError(@error, @extended, Null) EndIf Else $bHasInitial = True $vInitial = $aArray[$i] EndIf Next Return $vInitial EndFunc ;==>_ArrayReduce Func __ArrayCall($fFunc, $vArg1 = Default, $vArg2 = Default, $vArg3 = Default) Local $vRetValue = Call($fFunc, $vArg1) If @error = 0xDEAD And @extended = 0xBEEF Then $vRetValue = Call($fFunc, $vArg1, $vArg2) If @error = 0xDEAD And @extended = 0xBEEF Then $vRetValue = Call($fFunc, $vArg1, $vArg2, $vArg3) If @error = 0xDEAD And @extended = 0xBEEF Then ; The function exists, but there is no appropriate function signature Return SetError(3, 0, Null) EndIf EndIf EndIf Return SetError(@error, @extended, $vRetValue) EndFunc ;==>__ArrayCall  
    • kcvinu
      By kcvinu
      Hi all,
      I am playing with _GUICtrlButton_Create function. How can i change this button's (or the entire form's) font ?. The in-built GUICtrlSetFont function is not working even when i convert the control handle to control ID with _WinAPI_GetDlgCtrlID ( ) function.  Do i need to use CreateFont api finction and send WM_SETFONT message ? Or is there any other easy and safe ways to do this ?. Thanks in advance.
      Note : This window is created by CreateWindowEx function, not by GUICreate function. 
    • okolaris
      By okolaris
      Hey everyone,
      I thought I might share my little Language UDF plus the more powerful SciTE Tool to ship Strings from SciTE into the xml file. While I haven't had the time to fully adapt the small UDF to one of the big XML-UDFs the so called "Language Transmitter" that basically writes the XML file for you runs mostly on "XML DOM wrapper (COM)" by eltorro. The Transmitter should work with other XML-Language-UDFs depending on their encoding.
       
      First let's start with the UDF, there are two functions of interest: _LangInit($sFilePath) and s($sString) As you will have guessed, _LangInit($sFilePath) is called once to initialize the UDF and s($sString) is used to receive the string to your key. Plain and simple.
      Now to the actual "new" part, the Language Transmitter. It basically allows you to transfer a selected String from SciTE into a xml file. While doing so it will scan for AutoIt variables, macros etc. and parse the string to fit StringFormat(). It then saves the formatted string in the xml file and returns the formatted call into SciTE. If the selected string is already defined it will directly parse the key into SciTE. To change the default output file, you can either edit the ini-file in the @ScriptDir of the LanguageTransmitter.exe or press Alt+A on empty space again and keep clicking cancel/no until the Transmitter let's you select the current output file. Standard output is strings.xml in the current opened AutoIt Script.
      Example:
      ; given the line: MsgBox(16, 'Error', 'Error message') ; select 'Error' run the Transmitter follow the instructions, repeat with 'Error message'. Outcome (e.g.): MsgBox(16, s('Error'), s('Error_msg')) ; Variables and Macro example: $sString = "Value: " & $iValue & @CRLF & 'Another value: '& $iValue2 ; Select the full string including all AutoIt variables and macros etc. in SciTE and press Alt+A (default) to run the LanguageTransmitter ; follow the instructions and it will then paste a formatted string like that into SciTE: $sVar = StringFormat(s('Key'), $iValue, $iValue2) ; the correlating xml entry should look like that: ; <string name="Key">Value: %s\r\nAnother value: %s</string> ; as you can see @CRLF has been replaced with \r\n as well. If you are working on a project and want to directly add a string to the xml file just start the Language Transmitter without selecting any text, enter your string and a key.
      SetUp/Installation
      Examples
      Since xml files are required all examples can be found in the zip file. There are two examples, one includes a language selection interface.
      Language File Checker
      I added a script to check whether the xml file contains all required strings or even unnecessary strings.
       
      Hope you like my little helper!
       
      UDF - LanguageSupport.zip
    • Chimp
      By Chimp
      An example on how to inject jQuery into a web page
      It can be useful to manage the page from AutoIt using jQuery.
      Idea from here: http://www.learningjquery.com/2009/04/better-stronger-safer-jquerify-bookmarklet
      Suggestions and improvements are welcome
      #include <ie.au3> Example() Func Example() Local $oIE = _IECreate("www.google.com") Local $jQuery = _jQuerify($oIE) MsgBox(0, "Version", "jQuery version: " & $jQuery.fn.jquery) MsgBox(0, "Example", "click ok to exit." & @CRLF & "Google logo will fade out by jQuery...") $jQuery('#hplogo').fadeOut(3000) ; jQuery will fade out the google logo EndFunc ;==>Example ; #FUNCTION# ==================================================================================================================== ; Name ..........: _jQuerify ; Description ...: ; Syntax ........: _jQuerify(Byref $oIE) ; Parameters ....: $oIE - Object variable of an InternetExplorer.Application. ; Return values .: an object variable pointing to the jQuery library ; Author ........: Chimp ; Modified ......: ; Remarks .......: ; Related .......: ; Link ..........: ; Example .......: ; =============================================================================================================================== Func _jQuerify(ByRef $oIE) Local $jsEval, $jQuery, $otherlib = False ; create a reference to the javascript eval() function $oIE.document.parentWindow.setTimeout('document.head.eval = eval', 0) Do Sleep(250) $jsEval = Execute('$oIE.Document.head.eval') Until IsObj($jsEval) ; if jQuery is not already loaded then load it If $jsEval("typeof jQuery=='undefined'") Then ; check if the '$' (dollar) name is already in use by other library If $jsEval("typeof $=='function'") Then $otherlib = True Local $oScript = $oIE.document.createElement('script'); $oScript.type = 'text/javascript' ; If you want to load jQuery from a disk file use the following statement ; where i.e. jquery-1.9.1.js is the file containing the jQuery source ; (or also use a string variable containing the whole jQuery listing) ;~ $oScript.TextContent = FileRead(@ScriptDir & "\jquery-1.9.1.js") ; <--- from a file ; If you want to download jQuery from the web use this statement $oScript.src = 'https://code.jquery.com/jquery-latest.min.js' ; <--- from an url $oIE.document.getElementsByTagName('head').item(0).appendChild($oScript) Do Sleep(250) Until $jsEval("typeof jQuery == 'function'") EndIf Do Sleep(250) $jQuery = $jsEval("jQuery") Until IsObj($jQuery) If $otherlib Then $jsEval('jQuery.noConflict();') Return $jQuery EndFunc ;==>_jQuerify  
    • XaelloNegative
      By XaelloNegative
      Hi there.
      Im having some kind of a coder block here, 
      <td class="treeview ctl00_CenterContent_objTreeView_2" style="white-space:nowrap;"> <input type="checkbox" name="ctl00_CenterContent_objTreeViewn1CheckBox" id="ctl00_CenterContent_objTreeViewn1CheckBox"> <span class="ctl00_CenterContent_objTreeView_0 treeview ctl00_CenterContent_objTreeView_1" id="ctl00_CenterContent_objTreeViewt1" style="border-style:none;font-size:1em;"> <i class="fa fa-file-code-o fa-fw"> </i> <span data-placement="bottom" data-toggle="tooltip" title="" data-original-title="Tool tip for said part">REFUNDS</span></span></td> this is a code directly from the website im working with. I was thinking of inserting a javascript that would get the "REFUNDS" part. Any ideas on how to do so?
      Any thoughts will be highly appreciated.
×

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.