BUI logoDWC logoBBjWebManager::executeAsyncScript

Description

In BBj 22.14 and higher, this method executes the specified JavaScript in this web page and returns immediately. The return value is an integer index that will be included in a subsequent BBjExecuteScriptEvent.

Note:

In BBj 22.03 and higher, BBjWebManager is an alias for BBjBuiManager.

Syntax

Return Value Method
int executeAsyncScript(String script)

Parameters

Parameter Description
script JavaScript to be executed in this web page.
await In BBj 23.04 and higher, this optional boolean value specifies that the DWC client should execute this script using the JavaScript await operator. If not specified, the default is false (0).
event In BBj 24.11 and higher, this optional boolean value specifies that this script's result should be reported in a subsequent BBjExecuteScriptEvent. If not specified, the default is true (1).

Return Value

The return value is an integer index that will be included in a subsequent BBjExecuteScriptEvent.

Example

rem ' BBjWebManager::executeAsyncScript Example

rem ' BBjWebManager

declare BBjSysGui sysgui!
declare BBjWebManager bui!
declare BBjBusyIndicator busy!

sysgui = unt
open (sysgui)"X0"
sysgui! = bbjapi().getSysGui()

bui! = bbjapi().getWebManager()
bui!.setCallback(bui!.ON_BROWSER_CLOSE,"ON_BROWSER_CLOSE",err=*next)
bbjapi().getConfig().releaseOnLostConnection(0)
setesc ON_LOST_CONNECTION

url$ = "(Not BUI)"
url$ = bui!.getUrl(err=*next)

appName$ = " (Not BUI)"
appName$ = bui!.getApplicationName(err=*next)

title$ = "BBjWebManager: " + appName$
touch = 0
touch = bui!.isTouchSupported(err=*next)
if touch then title$ = title$ + " (Touch)" else title$ = title$ + " (Not Touch)"
window! = sysgui!.addWindow(25,25,450,600,title$,$00090083$)
window!.setCallback(window!.ON_CLOSE,"eoj")

status! = window!.addStatusBar(999)

window!.addStaticText(99,25,25,400,25,"URL: "+url$,$$)

window!.addGroupBox(100,25,75,400,125,"End Actions")
endApp! = window!.addRadioButton(101,30,100,75,25,"App",$0020$)
endUrl! = window!.addRadioButton(102,105,100,75,25,"URL",$0020$)
endMsg! = window!.addRadioButton(103,180,100,75,25,"Msg",$0020$)
endNone! = window!.addRadioButton(104,255,100,75,25,"None",$0020$)
endDefault! = window!.addRadioButton(105,330,100,75,25,"Default",$0020$)
endGroup! = window!.addRadioGroup()
endGroup!.add(endApp!)
endGroup!.add(endUrl!)
endGroup!.add(endMsg!)
endGroup!.add(endNone!)
endGroup!.add(endDefault!)
window!.addStaticText(106,30,150,60,25,"Value:",$8000$)
endValue! = window!.addEditBox(107,100,150,225,25,$$)
setEndAction! = window!.addButton(108,340,150,75,25,"Set",$$)
setEndAction!.setCallback(setEndAction!.ON_BUTTON_PUSH,"setEndAction")

window!.addGroupBox(200,25,225,400,125,"Err Actions")
errApp! = window!.addRadioButton(201,30,250,75,25,"App",$0020$)
errUrl! = window!.addRadioButton(202,105,250,75,25,"URL",$0020$)
errMsg! = window!.addRadioButton(203,180,250,75,25,"Msg",$0020$)
errNone! = window!.addRadioButton(204,255,250,75,25,"None",$0020$)
errDefault! = window!.addRadioButton(205,330,250,75,25,"Default",$0020$)
errGroup! = window!.addRadioGroup()
errGroup!.add(errApp!)
errGroup!.add(errUrl!)
errGroup!.add(errMsg!)
errGroup!.add(errNone!)
errGroup!.add(errDefault!)
window!.addStaticText(206,30,300,60,25,"Value:",$8000$)
errValue! = window!.addEditBox(207,100,300,225,25,$$)
setErrAction! = window!.addButton(208,340,300,75,25,"Set",$$)
setErrAction!.setCallback(setEndAction!.ON_BUTTON_PUSH,"setErrAction")

title$ = "Show Confirm Close Dialog"
confirm = 0
confirm = bui!.getShowConfirmCloseDialog(err=*next)
flags$ = iff(confirm,$0004$,$0000$)
setShowConfirmDialog! = window!.addCheckBox(209,25,375,300,25,title$,flags$)
setShowConfirmDialog!.setCallback(setShowConfirmDialog!.ON_CHECK_ON,"showConfirmDialogOn")
setShowConfirmDialog!.setCallback(setShowConfirmDialog!.ON_CHECK_OFF,"showConfirmDialogOff")

showBusy! = window!.addButton(1,25,425,100,25,"Busy",$$)
showBusy!.setCallback(showBusy!.ON_BUTTON_PUSH,"showBusy")
busyMessage! = window!.addEditBox(300,150,425,275,25,"Working...",$$)

gosub fetch

rem ' https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/Date
js$ = "function toISOString(date){try{return new Date(date).toISOString()}catch(e){return new String(e)}}"
sysgui!.injectScript(js$)
toISOString! = window!.addButton(2,25,475,100,25,"toISOString",$$)
toISOString!.setCallback(toISOString!.ON_BUTTON_PUSH,"toISOString")

text$ = "December 25, " + date(0:"%Yl")
text! = window!.addEditBox(400,150,475,275,25,text$,$$)

bui!.setCallback(bui!.ON_EXECUTE_SCRIPT,"executeScript",err=*next)

executeAsyncScript! = window!.addButton(3,150,525,275,25,"executeAsyncScript",$$)
executeAsyncScript!.setCallback(executeAsyncScript!.ON_BUTTON_PUSH,"samples")

process_events

eoj:
release

toISOString:
    text$ = text!.getText()
    js$ = "toISOString('"+text$+"')"
    t = tim
    if (info(3,6)="5" or info(3,6)="6") then
        ISOString! = bui!.executeScript(js$)
    else
        ISOString! = sysgui!.executeScript(js$)
    endif
    t = tim - t, t = t * 3600 * 1000
    msg$ = "executeScript " + js$ + " = " + str(ISOString!) + ": " + str(t) + " milliseconds."
    status!.setText(msg$)
return

samples:
    if web then body$ = "" else body$ = "document.body."
    js$ = "console.log('executeAsyncScript')"; gosub executeAsyncScript; rem ' undefined
    js$ = "Math.sqrt(100)"; gosub executeAsyncScript; rem ' Double or Integer 10
    js$ = "Math.sqrt(-1)"; gosub executeAsyncScript; rem ' Double NaN
    js$ = "null"; gosub executeAsyncScript; rem ' null
    js$ = "undefined"; gosub executeAsyncScript; rem ' null
    js$ = "document.hasFocus()"; gosub executeAsyncScript; rem ' Boolean false
    js$ = body$ + "style.backgroundColor"; gosub executeAsyncScript; rem ' String #ffff00
    js$ = "Math.PI"; gosub executeAsyncScript; rem ' Double 3.141592653589793
    js$ = "1/0"; gosub executeAsyncScript; rem ' Double Infinity
    js$ = "-1/0"; gosub executeAsyncScript; rem ' Double -Infinity
    js$ = "Number.MIN_SAFE_INTEGER"; gosub executeAsyncScript; rem '
    js$ = "Number.MAX_SAFE_INTEGER"; gosub executeAsyncScript; rem '
    js$ = "Number.MAX_VALUE"; gosub executeAsyncScript; rem '
    js$ = "0"; gosub executeAsyncScript; rem ' Integer
    js$ = "42"; gosub executeAsyncScript; rem ' Integer
    js$ = "2147483647"; gosub executeAsyncScript; rem ' Integer
    js$ = "2147483648"; gosub executeAsyncScript; rem ' Long
    js$ = """true"""; gosub executeAsyncScript; rem ' String
    js$ = """false"""; gosub executeAsyncScript; rem ' String
    js$ = """0"""; gosub executeAsyncScript; rem ' String
    js$ = """1"""; gosub executeAsyncScript; rem ' String
    js$ = """null"""; gosub executeAsyncScript; rem ' String
    js$ = "null"; gosub executeAsyncScript; rem ' null
    js$ = "undefined"; gosub executeAsyncScript; rem ' null
return

executeAsyncScript:
    t = tim
    if (info(3,6)="5" or info(3,6)="6") then
        index! = bui!.executeAsyncScript(js$)
    else
        index! = sysgui!.executeAsyncScript(js$)
    endif
    index = 0; if index!<>null() then index = num(index!)
    t = tim - t, t = t * 3600 * 1000
    System.err.println("executeAsyncScript " + str(index) + " " + js$ + ": " + str(t) + " milliseconds.")
return

executeScript:
    event! = sysgui!.getLastEvent()
    index = 0, index = event!.getIndex(err=*next)
    result! = event!.getResult()
    if result! = null() then result$ = "null" else result$ = result!.getClass().getName()+" "+result!.toString()
    msg$ = event!.getEventName()+" "+str(index)+" "+date(0:"%Hz:%mz:%sz.%tz %p")
    msg$ = msg$ + " result = " + result$ + " script = " + event!.getScript()
    print msg$
    System.err.println(msg$)
    i = msgbox(msg$,0,event!.getEventName())
return

fetch:
    endAction! = bui!.getEndAction(err=*return)
    switch endAction!.getActionType()
        case endAction!.ACTION_APP
            endApp!.setSelected(1)
            endValue!.setText(endAction!.getAppName())
            break
        case endAction!.ACTION_URL
            endUrl!.setSelected(1)
            endValue!.setText(endAction!.getUrl())
            break
        case endAction!.ACTION_MSG
            endMsg!.setSelected(1)
            endValue!.setText(endAction!.getMessage())
            break
        case endAction!.ACTION_NONE
            endNone!.setSelected(1)
            endValue!.setText("")
            break
        case endAction!.ACTION_DEFAULT
            endDefault!.setSelected(1)
            endValue!.setText("")
            break
    swend
    errAction! = bui!.getErrAction(err=*return)
    switch errAction!.getActionType()
        case errAction!.ACTION_APP
            errApp!.setSelected(1)
            errValue!.setText(errAction!.getAppName())
            break
        case errAction!.ACTION_URL
            errUrl!.setSelected(1)
            errValue!.setText(errAction!.getUrl())
            break
        case errAction!.ACTION_MSG
            errMsg!.setSelected(1)
            errValue!.setText(errAction!.getMessage())
            break
        case errAction!.ACTION_NONE
            errNone!.setSelected(1)
            errValue!.setText("")
            break
        case errAction!.ACTION_DEFAULT
            errDefault!.setSelected(1)
            errValue!.setText("")
            break
    swend
return

setEndAction:
    if endApp!.isSelected() then action! = bui!.appAction(endValue!.getText())
    if endUrl!.isSelected() then action! = bui!.urlAction(endValue!.getText())
    if endMsg!.isSelected() then action! = bui!.msgAction(endValue!.getText())
    if endNone!.isSelected() then action! = bui!.noneAction()
    if endDefault!.isSelected() then action! = bui!.defaultAction()
    bui!.setEndAction(action!,err=*return)
return

setErrAction:
    if errApp!.isSelected() then action! = bui!.appAction(errValue!.getText())
    if errUrl!.isSelected() then action! = bui!.urlAction(errValue!.getText())
    if errMsg!.isSelected() then action! = bui!.msgAction(errValue!.getText())
    if errNone!.isSelected() then action! = bui!.noneAction()
    if errDefault!.isSelected() then action! = bui!.defaultAction()
    bui!.setErrAction(action!,err=*return)
return

showConfirmDialogOn:
    bui!.setShowConfirmCloseDialog(1,err=*next)
return

showConfirmDialogOff:
    bui!.setShowConfirmCloseDialog(0,err=*next)
return

showBusy:
    busy! = bui!.getBusyIndicator(err=*return)

    rem ' BBjBusyIndicator::setAttribute BBj 22.02+ DWC
    busy!.setAttribute("spinner-clockwise","false",err=*next)
    busy!.setAttribute("spinner-speed","2000",err=*next)
    busy!.setAttribute("spinner-expanse","3xl",err=*next)
    busy!.setAttribute("spinner-theme","info",err=*next)
    busy!.setText(busyMessage!.getText())
    busy!.setVisible(1)
    wait 3
    busy!.setVisible(0)
return

on_lost_connection:
    event$ = "ON_LOST_CONNECTION"
    goto terminate

on_browser_close:
    event$ = "ON_BROWSER_CLOSE"
    goto terminate

terminate:
    seterr release
    System.err.println(pgm(-2)+" "+event$+" "+str(tcb(19)))
    filename$ = System.getProperty("user.home") + "/Desktop/" + event$ + ".txt"
    u = unt
    open (u,mode="o_create,o_trunk")filename$
    print (u)date(0:"%Hz:%mz:%sz.%tz ")+event$+" "+str(tcb(19))
    close (u)

release:
release -1

ClosedVersion History

  • BBj 24.11: Added an optional event argument.
  • BBj 23.04: Added an optional await argument.
  • BBj 22.14: BBjWebManager::executeAsyncScript added.

See Also

BBjAPI

BBjSysGui

See the BBj Object Diagram for an illustration of the relationship between BBj Objects.