JSFL bugs and gotchas
Overview
Summary
This page is a drop-box of JSFL bugs and gotchas, gathered from xJSFL development, a well as round the web.
They pretty much all concern vanilla JSFL, and have been worked-around where possible in the framework. Where they haven't they may be in future releases. Not all errors have been checked for validity, nor have they been checked against all CS versions.
For your information:
- Bugs refer to actual Flash bugs - features that are broken or don't work correctly
- Gotchas refer to features that might not work the way you expect, but they do work
- Tips provide clever ways to do things that might not otherwise be possible
Information about what's new in each CS version can be found below:
Contents
Stage
Bugs
Shape selection bug
- https://forums.adobe.com/message/2707510#2707510
- https://www.coldhardflash.com/phpbb/viewtopic.php?f=19&t=4480
- https://www.actionscript.org/forums/archive/index.php3/t-235329.html
Shape deletion bug:
Seems impossible to properly set the matrix of a bitmap fill:
Gotchas
Selection is always ordered in reverse!
document.selection
adds to, instead of replacing the current selection
isGroup property is available for any type of stage Element, not only for shapes:
Distribute to Layers moves elements unless snap to pixels is turned off:
Tips
You can set the element.selected
property to add and remove items from the current selection
Update stage after any script operation using: fl.getDocumentDOM().livePreview = true
Create individual movieclips for layers / shapes by using distribute to layers first: fl.getDocumentDOM().distributeToLayers();
Setting element widths and heights using a matrix:
Set stroke to none:
Timeline
Bugs
setSelectedLayers(index, replace)
– setting replace = false actually TOGGLES the layer selection
setSelectedFrames(start, end, replace)
– setting replace = false actually TOGGLES the frame selection
timeline.setSelectedFrames() does not always work:
Tips
To find out if a frame is a keyframe, compare the frame's startFrame against the frame index you want to check against: keyframe = frame.startFrame == index
Library
Bugs
library.addItemToDocument()
resets the current library selection, but doesn't update the Library UI. The workaround is to grab the selection before adding items, then reset it afterwards.
library.selectItem()
randomly doesn't work per session - the items remain unselected
library.updateItem()
crashes Flash CS3
Bitmap linkage names do not update when changed:
Gotchas
library.findItemIndex()
returns an empty Array (should be a Number) if the item is not found
Library items are listed in creation order. They needed to be sorted by comparing item.name.toLowerCase()
first. Renames or moves are not carried across for subsequent operations
Tips
Import bitmaps and sound using JSFL: https://www.bit-101.com/blog/?p=547
fl.openFileDialog();
fl.getDocumentDOM().selectAll();
fl.getDocumentDOM().clipCopy();
fl.getDocumentDOM().close(false);
fl.documents[0].clipPaste();
File
Bugs
Relative file URIs are only relative to the current fla - NOT the currently-running JSFL script (although, often, this won't work either)
FLfile.browseForFolderURL() returns the name of the Mac hard drive, which causes files to have the wrong URL:
This post says that scripts can be run relatively, but that doesn't seem to be the case in CS4+
Gochas
fl.runScript()
needs a fully encoded string including %20
for spaces
FLfile.write uses ANSI not UTF-8:
- https://www.stevensacks.net/2009/01/01/jsfl-bug-flfilewrite-uses-ansi-not-utf-8/
- https://www.stevensacks.net/2009/01/02/update-workaround-to-jsfl-flfilewrite-ansi-bug/
- https://www.actionscript.org/forums/archive/index.php3/t-80434.html
Tips
Execute commands from the command line:
FLfile.runCommandLine('"path/to/file.xml"') // PC
FLfile.runCommandLine('exec "path/to/file.xml"') // Mac
Copy directories with JSFL
Possibly use String.fromCharCode(13,10)
to write \r\n
newlines
JSFL
Bugs
Any syntax errors inside scripts run with runScript()
will fail silently, even with try/catch inside or outside. See the support section on Debugging for more information and workarounds.
Gotchas
Persistence
- Scripts executed from the Commands menu makes are persistent – per document only.
- Scripts executed externally, or via
fl.runScript()
oreval()
are available only while the calling script executes - Running an open JSFL script in Flash IDE is the same as running it externally
Scope
- Each document and panel runs in its own scope
Using var
or function
makes values local in external scripts. The workaround (especially for classes) is to state the variable or function name globally:
// bad
var test = 1;
function Test(){ }
// good
test = 1;
Test = function(){ }
var test = new Test(); // is remembered
// notes
// Note that Test = function seems to return a self-executing function as the constructor source: "(function () {})"
// function Test() will return "function Test()"
Note that const
s cannot be redeclared, or an error is thrown, so it's easier not to use them in development.
Tips
Disable long script running time warning: use fl.showIdleMessage(false)
XUL
Bugs
Can't empty a form field by setting it to ""
Can't check checkboxes / radios using JSFL
Seems to be an issue when getting the value of one colorchip in a change/create handler. Other colorchips are then deleted.
It seems impossible to write JSFL (i.e. if(x && x.y){ ... }
) in a XUL script tag unless you use a CDATA section, but it seems to stop alert()
running. Needed to use oncreate="" to work around it
Opening a XUL dialog from a script seems to have some kind of hidden time limit that will cause the calling script to fail silently if the dialog is not accepted in an arbitrary time (seems to be about 20 seconds or so)
Gotchas
XUL panels fail to instantiate if they can't find the XUL file with the error "xmlPanel: Argument number 1 is invalid"
Tips
Communicating between XUL and AS
SWFPanels
Gotchas
ActionScript trace()
will NOT trace to the output panel when running live in an SWF panel ! You should instead use:
MMExecute("fl.trace('" + value + '")");
Tips
To reload a panel, the easiest thing is to set a shortcut key to the current panel – CTRL + ` is a quick one when developing
Misc
Arrays
Array.sort()
doesn't sort numbers! Which includes timeline.getSelectedLayers()
that returns an array of selected layer indices. Use Utils.sort()
to sort arrays, or the xJSFL object extension timeline.selectedLayers
to get selected layers (as layers, and in order).
Events
Events are pretty crappy in JSFL. See the Events page for more information
fl.createDocument()
does not dispatch a "documentCreated" event
fl.saveDocument()
does not dispatch a "documentSaved" event
XML
Use XML to build multiline strings, rather than concatenate lots of '\n'
strings:
var text = <text>
This is
some multiline
text. Yay!
</text>
trace(String(text));
E4X
SpiderMonkey does not support E4X filtering
- https://stackoverflow.com/questions/2906907/filtering-in-e4x
- https://stackoverflow.com/questions/6318747/does-spidermonkey-understand-e4x-filtering
You can also use (doesn't work with delete):
var b = a.*.(function::attribute("id") == 'b');
API
Mac: fl.saveDocumentAs()
Can't change publish profiles
Commands
Bug in JSFL fl.findObjectInDocByType in Flash CS3
ObjectFindandSelect
Components
Exporting Components / SWC – single .fla but multiple .swc - set all to NOT export in the first frame!
Skinning the Flash CS3 components
Export multiple swc using JSFL
Export swc from FlashDevelop
IK
Extending native objects causes an IK error in CS4. For example, something as basic as this will cause the output panel to fill up with randomly produced IK Tool errors any time you click or interact with the stage
Object.prototype.prop = 1;
I suspect that internally to the IK tool, the developer is iterating over an object using a for..in loop, and either not checking using hasOwnProperty()
, or should be using a for loop.
My solution is to disable the IK tool by removing it from various folders in the installation:
- In both the following folders...
F:\Users\<user>\AppData\Local\Adobe\Flash CS4\en\Configuration\Tools C:\Program Files (x86)\Design\Adobe Flash CS4\Common\First Run\Tools
- ...move IK, IKBridgeLink.jsfl and Rig.jsfl to a new subfolder called "disabled".
- In the user folder, comment-out the node in IK toolConfig.xml
- Finally, restart Flash
The real solution is to either get Adobe to patch the offending script, or to provide a JSFL script to update the files in each user's installation.
BUT... in all honestly, you shouldn't be extending native objects anyway :)
this summary has been very helpful, thank you.
Not being able to sort an array of numbers is very annoying, I had to convert the numbers to strings, then I was able to sort. After turning the strings back into numbers I was good to go.
Arrays are sorted by string by default in JavaScript. Use Utils.sort() to get around this: https://xjsfl.vercel.app/support/api/utils/utils#sort
This is really great, thanks for the effort putting it together