Release Notes for LPS 3.0
OpenLaszlo release 3.0 marks a major milestone both in terms of the capabilities of the platform and also of the Laszlo open source process.
This release has been qualified against the testing suite and is believed to be stable.
These release notes summarize platform changes since Laszlo Presentation Server release 2.2:
LPS 3.0 introduces several new features:
- SOLO deployment
- Smaller file sizes (using internal gzip compression)
- Dynamic libraries
- Unicode support
- Optimized for Flash Player versions 6 and 7
- Settable timeouts
- Drawing API
- Client fonts
- Resizeable canvas
- Integration with browser JavaScript
- Support for browser back button
- Support for ("right click") context menu
- Support for mouse wheel
- Text maxlength and restriction
- Debugging improvements
- Performance enhancements
- Separate Designer and Deployer guides
- The name of the product is now "OpenLaszlo"
Most of the new features are described in the product documentation. For others (timeouts, fonts) these notes constitute the primary documentation.
SOLO Deployment
Laszlo applications can be made available on the web, or deployed in either of two ways:
- Deploy SOLO (Standalone OpenLaszlo Output) from any HTTP Web server
- Deploy with OpenLaszlo Server
With SOLO deployment, the LZX source is pre-compiled into a stand-alone SWF
file that can be placed within the HTML docs directory of a common HTTP Web
Server (such as Apache or IIS). SOLO deployments are simple to manage, and
supported by nearly any Web hosting service.
With SOLO deployment, the OpenLaszlo Server is not required for operation of the application (although the Server is
required for developing the application).
With OpenLaszlo Server deployment, the LZX source is placed within the
Web-apps directory of the OpenLaszlo Server, and is dynamically compiled.
OpenLaszlo Server deployment requires a Java Application Server or servlet
container. It provides additional capabilities dependent on the server,
including support for SOAP, XML-RPC, Java-RPC and persistent connections.
The OpenLaszlo Server is also required for applications that use some media formats that are not
natively supported by the Flash player. The OpenLaszlo sever transcodes these media files "on the fly"
into formats supported by the Flash player.
See the "Proxied and Solo Applications" chapter of the Developer's Guide for more information.
Internal compression
The compiler now employs internal gzip compression. This results in substantially smaller object file sizes.
Dynamic Libraries
A dynamic library is a portion of a program that can be loaded after the main application execution file has loaded. The goal for dynamic
libraries is to reduce the initial download size of a Laszlo application. This is important because initial download size (including all
requests that precede initial user interaction) is used to evaluate web applications. Reducing the initial download size has
the additional benefits of reducing the time to first interaction (although there are other ways of doing this), and of reducing
bandwidth costs in the case where an optional feature of the application is not used.
See the Program Structure chapter of the Software Developer's Guide for details.
Unicode
Unicode fonts such as CJK fonts are now supported in <text> and <inputtext> fields. Unicode is supported:
- In Laszlo source files. The text in a
<text> and <inputtext> tag and within string literals in JavaScript code may be unicode
- In the user interface. Text and Inputtext views can display unicode text, and take unicode input.
- In the data compiler. XML data that is compiled into an application, or request at runtime, may contain unicode text, if the XML source file uses the
encoding attribute to the XML processing directive (below).
The Laszlo components, such as <button>, do not work with unicode fonts. (They are fixed-height, and the default height is incorrect for most fonts.) Only the core classes, <text> and <inputtext>, are automatically sized for unicode fonts.
Encoding
By default, LZX now expects text to be UTF-8. You can specify a different
encoding within an <?xml?> processing directive at the beginning of an application source file or an XML data file:
<?xml encoding="UTF-16"?>
<canvas>…</canvas>
<?xml encoding="ISO-8859-1"?>
<data>…</data>
Swf6 and Swf7 support
The compiler now outputs, and has been optimized for, swf6 and swf7 binaries. Swf6 is the default;the swf7 target is available as an option.
Swf5 format is no longer supported.
Settable Timeouts
Settable Timeouts is a mechanism for setting the timeout of a request. There are global settings for data request and media request
timeouts, and per-dataset requests.
API
New canvas attributes:
| name | type | default | description |
dataloadtimeout |
number |
30000 (30s) |
timeout time in milliseconds for data requests |
medialoadtimeout |
number |
30000 (30s) |
timeout time in milliseconds for media requests |
dataloadtimeout is the defaults for newly created datasets.
Changing it doesn't have an effect on dataasets that already exist.
New dataset attribute:
| name | type | default | description |
dataloadtimeout |
number |
30000 (30s) |
timeout time in milliseconds for this dataset |
The timeout time can be changed at runtime, and that will affect any subsequent requests made on behalf of the dataset.
Drawing API
LZX now includes a subset of the WHAT-WG graphics API .
A new class DrawView extends LzView. See the LZX Reference Manual for description of this class.
Client fonts
A client font is a font that is located on the client machine. Text that uses client fonts is faster, and avoids the size penalty of an embedded
font (a font that is compiled into the application). This is particularly important with CJK fonts, which are many megabytes.
Previous versions of OpenLaszlo could only use embedded fonts. This release can also use client fonts:
The value of the font attribute is the name of a font. This may be the name of an embedded font
(one that has been declared with the <font> tag), or a client font (one that is available on the client operating system).
There are three always-defined client fonts, which can be accessed by special names. (These names will probably change prior to the final release.)
sans-serif
serif
monospace
There are also two Japanese fonts, the
equivalent of _sans and _serif, whose names can
only be written in Unicode.
Resizable Canvas
The canvas width and height can be specified as a percentage (e.g. <canvas width="50%">).
When the canvas dimension are a percentage value, the application is scaled according to the size of the HTML page.
In this, onheight and onwidth events on the canvas are generated when embedding HTML page is resized.
Communication with browser JavaScript
A new service LzHistory(), and a new JavaScript function LzSetCanvasAttribute(), allow two-way communication between the a Laszlo
application and the browser's Javascript engine.
You can access the javascript engine in the browser using the loadJS method on LzBrowser:
LzBrowser.loadJS(js, target)
| argument | value |
js |
JavaScript string to execute |
target |
Optionally specifies a named frame in which to execute the JavaScript expression. |
By default, the JavasSript expression specified in js is executed in the current browser frame.
See the Browser Integration chapter of the Software Developer's Guide for more information and examples.
Browser Back Button support
The LzHistory mechanism makes it possible for Laslzo applications to capture program states and move among them using the browswer's "back" button.
See the "Browser Integration" chapter of the Developer's Guide for details.
Performance Improvements
Several architectural changes have been made to improve performance:
- Register allocation
- The compiler now uses registers. The user-visible effect of this is a significant speed-up in the generated code.
- Clipped views are faster
- Clipping uses swf6 primitives. The user-visible effect is better performance for clipped views.
- Faster compiler
- Assembler now implemented in Java rather than Python. The user-visible effect is that Laszlo apps compile faster.
- Internal file compression
- Application files are compressed internally, regardless of http encoding.
This results in smaller transfer sizes on clients that don't accept the gzip encoding, as well as a smaller application size
in the browser cache.
- Client fonts
- Text fields that use client fonts are significantly faster than those that use embedded fonts.
- Inlined classes.
- An inlined class is a class that is applied to an instance when an application is compiled, rather than when the application is instantiated. An inlined class has the same semantics as a regular class, except that the class cannot be instantiated or otherwise referred to by name in script code.
An inlined class is similar to an inline function, or a macro, in other languages.
Text maxlength and restrictions
Text fields have new attributes
maxlength: max number of chars you can add to an text field
pattern: whitelist or blacklist of chars that can be added to a text field
which follow the same semantics as the Flash TextField object fields of the same names
Debugging improvements
Inspecting objects is more robust and readable.
The size of a string or array is now included as part of its type. This can be useful when deciding whether
to inspect a string or array that has been abbreviated (i.e., if you inspect a gigantic string, the debugger
will print the full string, which may take a long time.)
ECMAScript changes
When it can, the compiler will warn about mis-matched case for JavaScript tokens. This is in anticipation of full ECMAScript compatibility
which enforces case-sensitivity.
Support for ("right click") context menu
The right click "context" menu is now supported. Documentation forthcoming in the next release. Here is a sample
program that demonstrates the API:
<canvas debug="true" width="1800" height="800">
<method event="oninit">
Debug.showInternalProperties = true;
</method>
<debug x="200" fontsize="14" width="600" height="400"/>
<script>
function rightclick_handler (obj, menuobj) {
Debug.write("rightclick context menu", obj, menuobj);
}
function my_itemhandler(obj, item) {
Debug.write("menu item selected", obj, item);
}
var cm1 = new ContextMenu(rightclick_handler);
cm1.hideBuiltInItems();
cm1.addItem(new ContextMenuItem("LZX Canvas Custom Item!", my_itemhandler));
canvas.setContextMenu(cm1);
var cm2 = new ContextMenu(rightclick_handler);
cm2.hideBuiltInItems();
cm2.addItem(new ContextMenuItem("View Custom Item 1", my_itemhandler));
cm2.addItem(new ContextMenuItem("View Custom Item 2", my_itemhandler));
cm2.addItem(new ContextMenuItem("View Custom Item 3", my_itemhandler));
var cm3 = new ContextMenu(rightclick_handler);
cm3.hideBuiltInItems();
cm3.addItem(new ContextMenuItem("Text Custom Item 1", my_itemhandler));
cm3.addItem(new ContextMenuItem("Text Custom Item 2", my_itemhandler));
</script>
<simplelayout/>
<text id="foo" fontsize="26"
oninit="setContextMenu(cm3)">FOOBAR</text>
<view id="pp"
width="200" height="200" bgcolor="blue"
oninit="setContextMenu(cm2)"/>
</canvas>
Mouse wheel Support
OL 3.0 has an event called LzKeys.onmousewheeldelta. See the Reference Manual.
Documentation restructuring
The Developer's Guide ("Guide to Designing, Developing and Deploying Laszlo Applications") has been trifurcated into Developer's, Designer's and Deployer's Guides
in order to
tailor information to different audiences.
Name Change: Goodbye "Laszlo Presentation Server", hello "OpenLaszlo Server"
With this release the Laszlo Presentation Server ("LPS") has been renamed the OpenLaszlo Server. Accordingly the
"Start Laszlo Presentation Server" menu item and alias has been renamed to "Start OpenLaszlo Server", and similarly for "Stop".
The Laszlo Explorer and documentation have been edited to reflect this change, although their are many places where the old
nomenclature persists. Over time the documentation and user-visible artifacts will be transitioned to OpenLaszlo, although
in the code the LPS terminology is likely to persist indefinitely (for example, in directory names).
Significant Bug Fixes since LPS 2.2
Since 2.2 many bugs have been remedied. Among the more significant:
- XML Data from non-English locales no longer generate "unparseable date" errors.
- Drawing API LzDrawview (added in 3.0b2) is now in the LZX Reference.
See below for a cumulative list.
New functionality in OpenLaszlo 3.0 has necessitated a few backwards-incompatible changes from prior releases.
- Default font is client font, not embedded font
- The default font is now the client font "verdana". Client fonts cannot be rotated and their opacity cannot be
varied. You can change the default by using a <font> on the canvas.
- Change in behavior of <font> tag
- You cannot mix embedded fonts and device fonts in the same text object. It must be one or the other. This fact subtly changes the behavior of the
<font> tag.
For example the following program works correctly in earlier releases, but does not in 3.0:
<canvas height="70">
<font name="helmet" src="helmetr.ttf"/>
<font name="arioso" src="ariosor.ttf"/>
<text fontsize="20">
<font face="helmet">helmet</font>
<font face="arioso">arioso</font>
</text>
</canvas>
The "embedfonts" argument to a textfield will specify whether it uses embedded fonts or not.
It will also be calculated automatically based on the font in effect on the text object, so for example
<text fontsize="20" font="helmet">
<font face="helmet">helmet</font>
<font face="arioso">arioso</font>
</text>
Would work because it would set set the embed flag implicitly.
In the original example, the text clip thinks it is using a device font, because that is what is the "current font" is when it is instantiated.
It doesn't look inside and see the embedded fonts used in the HTML, and even if it did, you cannot mix device and embedded fonts in the same text object.
To get the expected (2.2) behavior, use
<text embedfonts="true"> .
..
- Case Sensitivity
- Arrays that had been null are now empty
When a view is built, subviews[] is initialized to an empty array. In releases before OpenLaszlo 3.0 it was null. If your program
depended on testing for null, you will need to modify it --for example, by testing for subviews.length == 0.
- Error message no longer thrown for TTF fonts missing TTF name table.
- Compiler now correctly recognizes LZX files named with numbers as their first
character in the filename.
- LPS Error log now includes WARN messages if cache directories are not writable.
- Windows installer includes more information when it fails to detect an installed
JDK
- LPS is now compatible with ATG Dynamo
- LZX Reference now includes grid, basegrid, and related components.
- Two defects in lzo serving were fixed. The first could cause lzo serving to use
unnecessary server cpu. The second was a race condition that could cause the
server to introduce corruption into the lzo file.
- Denied requests are now logged.
- LPS no longer holds an HTTP socket open when the backend uses http-keepalive and
the response was an error condition.
- LPS no longer requires that the xalan jar be in Java's endorsed directory list.
LPS installation and initialization issues with Java 1.4.2 and/or Tomcat 5.0
are repaired.
- http.maxUsers property in lps.properties works correctly.
- Visible gets set to false when opacity is set to 0 if visibility hasn't been
explicitly declared. This may cause some unexpected behavior with regards to
layouts and constraints.
- Setting the visible property on a view which has a datapath may have
unpredictable results, since the datapath uses setVisible to control whether the
view is visible due to the presence or absence of mapped data. To work around,
either be sure to set the visible after the ondata event or wrap the data-mapped
view in an extra view.
- lps now has the ability to force compilation when compmgrdependencyoption = never
- LPS now includes a sample deployment configuration with recommended parameters
set for live deployment. See $LPS_HOME/WEB-INF/lps/config-deploy.
- comboboxes and menus can be closed by pressing the 'ESC' key
- In order to see the logging done by the httpclient library on behalf of the
LPS running inside Tomcat 5, you need to copy
$LPS_HOME/WEB-INF/lib/commons-logging.jar and
$LPS_HOME/WEB-INF/lib/log4j.jar
to $TOMCAT_HOME/common/lib
and restart tomcat5. The copy of Tomcat5 that comes with LPS already contains
these jars installed in the correct location.
- Disabled editext now displays its contents
<edittext width="100" name="txt" text="foobar" enabled="false"/>
works as expected
- javadatasource has been completely deprecated and removed
- WSDLs are now correctly fetched over HTTPs
- Attributes used as an 'lvalue' (the target of an assignment) in a
method body may now be referred to as simply <attribute>. Explicitly using
this.<attribute> or this["<attribute>"] is no longer required.
- ^M in CDATA no longer results in blank text.
- The Tree component now works with scrollbar when built with remote data.
- Resizable canvas: the canvas width and height may now be expressed as a
proportion of the browser window dimensions. The canvas will send onwidth and
onheight events. Views may be constrained to the width and height of the canvas.
For example:
<canvas width="100%" height="100%">
<view width="${parent.width}" height="${parent.height/4}" ...
- The API for specifying Client Fonts has been finalized.
- This release adds a dialog box that allows the developer to set debugger
options. This dialog box is available under both the swf5 and swf6 targets,
but most of the options only have an effect in a swf6 target.
- The size profiler and the size summary at the bottom of the app console has been
updated to properly support swf6 and the internal compression.
- This release creates applications that require version 6.0r79 or greater of the
Flash Player. The HTML
pages that the server generates force an update from Flash Player 5. This
means that if you view the
default HTML pages on a browser with Flash Player 5 installed, the application
will generate an update dialog. This is currently only implemented for Internet
Explorer on Windows
- Applications no longer display unexplained compiler warnings.
- In previous releases, the default font was an embedded font called "Verity". in
this release the default font is a client font whose appearance is dependant on
the installed font in your environment. The default font is currently "Verdana".
Some systems do not include this font and may have an undesirable appearance.
This will change in a future release.
- In previous releases, the default font was an embedded font called "Verity". in
this release the default font is a client font whose appearance is dependant on
the installed font in your environment. The default font is currently "Verdana".
Some systems do not include this font and may have an undesirable appearance. A
font fallback mechanism is in place which attempts to select the best font
available.
- Multiline text no longer has a default width of 0.
- The KRANK feature is now implemented for the swf6 target. Kranked swf6
applications are fully functional.
- Compilation Manager
- If you compile a file that includes a font, resource, or library in the
components directory, and you then create a file with the same name as the
included file in your application directory, LPS will not recompile the
application. You will need to make a gratuitous edit to the application source
to force it to recompile.
- Compiler
- A resource whose origin is not a 0,0 may appear to have the wrong width and height.
- Default clickable interacts poorly with classes.
<class name="myclass" clickable="false"/>
<myclass id="bob" onclick="f()"/>
Creates a bob that is clickable. That is, setting the onclick="f()" value
overrides the setting in the class definition. If this isn't what you want, the
workaround is to write an explicit clickable on the subclass or instance:
<class name="myclass" clickable="false"/>
<myclass id="bob" onclick="f()" clickable="false"/>
- The DTD that is shipped with 2.0 doesn't work. Check back on the Developer Zone of the web site for updates.
- When specifying a resource with a constraint expression, you must use either a
resource name (instead of a literal path) or an http URL. The following two
examples work:
<node id="globals">
<attribute name="BRAND"
value="http:logo.swf"
type="string"/>
</node>
<view id="a" x="0" y="0" resource="${globals.BRAND}"/>
or
<resource name="logo" value="logo.swf"/>
<node id="globals">
<attribute name="BRAND"
value="logo"
type="string"/>
</node>
<view id="a" x="0" y="0" resource="${globals.BRAND}"/>
- All canvas attributes need to be declared within the <canvas> tag, rather than
using an <attribute/> tag.
- The LPS compiler expects .lzx files should be authored using the UTF-8
character set encoding (per the XML document standard), unless you specify
another encoding explicitly in the XML declaration at the start of the file,
e.g.,
<?xml version="1.0" encoding="ISO-8859-1" ?>
Any illegal UTF-8 character sequences will signal an error under JDK 1.3, but
may not signal an error under JDK 1.4.
- LPS supports tomcat 5.0 as a development environment. It has not yet been fully
tested for deployment. If you use the Tomcat as provided by Laszlo, the memory
parameters will be configured correctly. If you use your own version of Tomcat 5,
however, it may fail (due to insufficient memory) after about 35 compilations.
- Kranking an application with a request parameter (e.g., ?foo=bar) will cause that parameter (e.g., foo)
to be serialized and reconstituted. If you try to supply a different request parameter to the kranked
app, Flash's 'security mechanism' will ignore the new parameter (because there is already a variable of
that name (e.g., foo)).
There are two suggested workarounds:
1) Do not supply the request parameters when kranking your application. This implies your application
must be able to initialize with the request parameters not set.
2) Use LzBrowser.getLoadUrlAsLzUrl().query to parse the request parameters and set them in your
application at initialization time.
- Compiler - Schema
- The "from" and "to" attributes of an animator must be numeric literals
such as "1000" or "25.8", or live expressions such as "${parent.x}". If the
animated
attribute has a boolean type, use the live expression syntax:
<animator attribute="visible" to="${false}"/>
(or, for greater efficiency,
<animator attribute="visible" to="$immediately{false}"/>)
- Declaring an "onload" event as an attribute of the tag generates a compiler error:
<class name="resourceloader">
<view name="media" onload="parent.gotLoad(this);" visible="false"/>
As a work around, use
<method event="onload" . . .>
- The id attribute typed wrong for datapath. A workaround is to declare the
attribute with a type:
<datapath>
<attribute name="id" value="dp" type="string"/>
</datapath>
- Combining the attribute properties when="once" and type="number" will cause a
compilation error
for non-constant values. Use value="$once{...}" to avoid this error.
- Compiler - Warnings
- Creating an attribute named "options" or "id" on a class or view will cause
conflicts with internal methods. Giving a view a "name" or "id" with the same
name as a user-defined class will also cause conflicts. No warning is currently
issued in this case, so it can be hard to identify this situation.
- Forward references to classes are not permitted. The class definition must occur
lexically before the first instance of that class is created. The compiler will
not warn about this situation. For example, the following will not work:
<canvas>
<foo/>
<class name="foo">
<text>Hello!</text>
</class>
</canvas>
However no warning is issued by the compiler in this case.
- The following unmatched cases can cause compiler errors with misleading
line numbers:
<view x="${/*}"/>
<view x="$immediate{/*}"/>
<view oninit="/*"/>
<method name="f" args="/*"/>
<method name="f">/*</method>
<script>/*</script>
- Text that follows <method> or <attribute> in a component class (any tag
defined using the <class> tag) will cause a compilation warning, even if the
component is declared to accept text or html. For example:
<inputtextbox>
<method name="foo">
debug.write('xxx');
</method>
mytext
</inputtextbox>
The correct syntax is to place the text after any <method> or <attribute> children:
<inputtextbox>mytext
<method name="foo">
debug.write('xxx');
</method>
</inputtextbox>
- You cannot reliably use constraints to set the fontsize or font name
of an inputtext field.
For example, this will probably not display properly, but will not signal an
error at compile time.
<canvas>
<class name="tester">
<inputtext fontsize="${canvas.height}">hello </inputtext>
</class>
<tester />
</canvas>
- If a resource referenced in a <splash> view is not present, an odd error message --
the single word "undefined" -- with half of the "u" chopped off-- appears.
<canvas>
<splash>
<view resource="images/logo.png"/>
</splash>
</canvas>
- Components - LZ
- <tabview> doesn't respect view "visible" property.
- Arrow keys switch focus away from radiogroup in Flash 5
- You must explicitly set a menu's width. It does not automatically calculate the
max menuitem and use that as a reference.
The height of a menu , however, does grow if menuitems are added and deleted.
- <edittext> does not automatically size to the size of the font; it is always 22
pixels high.
- If you set a datapath as a child of tabpane for replication, you need to set its
datacontrolsvisibility attribute to false or the wrong tabpane will be
displayed. For example:
<tabs>
<tabpane>
<datapath xpath="[mydatapath]">
<attribute name="datacontrolsvisibility" value="false"/>
</datapath>
</tabpane>
</tabs>
- <button> face stretches when its parent view has a resource that stretches.
- In some cases, the "onselect" element for a combobox is sent when the combobox
is initialized -- not when it is selected by the user. A workaround is to
include this in the combobox tag:
<attribute name="isFirstOnselectFired" value="false" />
<method event="onselect" args="d">
if ( !isFirstOnselectFired ) {
this.setAttribute( 'isFirstOnselectFired', true );
return false;
}
// Do whatever you were going to do onselect here.
</method>
- Replicated trees with open attributes will not display correctly.
- Menubar has wrong placement in windows by default.
A <menubar/> is not placed in the 'menubar area' of a <window/> by default, so
the work around is the following:
<window
<menubar ... placement="menubar" />
</window>
- Because the gridcolumn is a basecomponent (and is styleable) fonts set on a grid
will not cascade to its contents. Set the font on each individual column to
control fonts within a grid.
- The user can't tab out of the grid from the last record or shift-tab out from
the first record.
- At this release, <tree> does not support changes to the underlying
dataset. So if you have a dataset, and make a change to it, the tree won't update.
- <combobox> doesn't send keycode with key events as expected.
- Using 'onvalue' event on a combobox will not allow making something modal. For
example, the following code will not work as expected:
<canvas>
<combobox defaulttext="Default">
<method event="onvalue">
if ( this.value == null ) return;
gAlert.open();
</method>
<textlistitem>A</textlistitem>
<textlistitem>B</textlistitem>
<textlistitem>C</textlistitem>
</combobox>
<alert id="gAlert">Hi</alert>
</canvas>
Workaround: If you use 'onselect' the mode will be released appropriately.
- The z order of basewindows is not well defined.
- Components - LZUnit
- lzunit relies on the debugger to detect errors in code. If not run in debug
mode, erroneous code
will silently fail, giving the appearance of a successful test. Therefore,
always run lzunit tests with
either the canvas attribute debug="true" or with the url query ?debug=true.
- Debugger
- Declaring an attribute does not assign it a value. Use of an attribute with no
value will throw a debugger warning.
- Debugger warnings
- You will not see a debugger warning if the argument to the new operator is not a function.
If new xxx() has no effect, verify that xxx is defined. This can come up with components such as window,
which are automatically included if they are used as tag names, but not if they are used only in JavaScript code.
- ECMAScript libraries
- Math.Log2E evaluates incorrectly in Flash 5.
- Fonts
- The Verity font has a slightly different baseline than other fonts. Be sure to
visually inspect your application carefully when switching from or to the Verity
font.
-
- HTML Wrappers
- The size profiler is not accurate for the debug version of an application. It ignores the size of the
debugger. It does not in any case make sense to profile the size of the debug version of an application;
you should only profile the size of the non-debug version.
- Installer
- The installer and LPS may fail to function properly in Windows if Java is moved
from the location where it was originally installed.
- In order to change the port number that LPS runs on you need to edit
both $TOMCAT_HOME/conf/server.xml and $LPS_WEBAPP_HOMElz-utils/startup.var
and change any instance of 8080 to something else.
Also, if you have another instance of tomcat up and running, you may
want to change the shutdown port in server.xml to something other than default
of 8009.
- JGenerator
- The LPS compiler uses routines from AWT. This sometimes requires that the target
deployment server installs X Windows.
- Using a swf asset as a resource in the splash tag can cause strange problems if
the asset has an embedded font and the font name collides with an the name used
for an embedded font in the LZX app.
- Krank
-
There is a new bug in the KRANK feature in OpenLaszlo 3.0. that is a regression from LPS 2.2. It was probably present in LPS 3.0b2.
For some applications, if the application is KRANKed using an OpenLaszlo development server and a browser that are running on the same machine
(this is the typical configuration), it may only work when it deployed to a browser on the same machine as the server.
Conversely, an application that is KRANKed from a separate client will only work when deployed to a browser that is not running on the server machine.
There are two implications of this.
- The KRANK feature when used in the standard configuration will not produce a deployable application. The workaround is to use a second
machine to KRANK from.
- Some of the demos that are distributed in the SDK (portions of dashboard, chat, calendar) will not work when viewed from a second machine.
This is a rare use case (especially since the demos are present on the web site, and since firewalls disallow access by default anyway),
so this is less serious.
- When running the optimizer, the source directory of the application being
optimized must be writable by the web server. If the server cannot write to the
directory, an error message will be written to the lps log.
- Laszlo Foundation Classes
- The contents of a view with clip=true may not display properly when the size of
the view is changed. The contents may be stretched by one pixel. All text is
clip=true, and small clipped resized text may be drawn slightly blurry.
- When operating under heavy processing loads, Laszlo applications may send spurious
global mouseup and mousedown events. When this happens, the warning
WARNING: Sent extra global mouse event
will print in the debugger.
- A constraint that depends on a.b.c is only updated if the value of a.b.c
changes, not if a.b changes.
For example:
<attribute name="dec" type="number" value="0"/>
<attribute name="hexString" type="string" value="${'0x'+dec.toString(16)}"/>
hexString will not be updated when setAttribute() is called on dec. As a
workaround, create your own event handler for the base value:
<attribute name="dec" type="number" value="0"/>
<attribute name="hexString" type="string" />
<method event="ondec">
hexString = '0x'+dec.toString(16);
</method>
- Use the audio API on LzView instead of the LzAudio service
- Classes with attributes that use a setter to overload an identifier (an example
of this is "start" for animators, which is both an attribute and a method)
cannot have these methods extended. Examples of this are "start" for animators
and "apply" for states, but a user-defined class that did this would have the
same problem.
- Align and valign cannot be modified once they are set initially. To work around
this issue use a state with an explicit constraint (rather than align or valign)
- <animatorgroup> attributes not settable after init. To workaround, set the
individual attributes of the individual animators in the group.
- A view which uses align or valign may affect its parent's size before the
alignment is applied. This means that using alignment in a view which is sized
to its content will not work reliably.
- Overriding a superclass's attribute that has a literal value with a constraint is perfectly fine practice, but if that attribute has a setter, then the attribute will be set twice: once to the value defined by the superclass, and then to the value of the constraint. This usually works in practice -- it just sets the attribute an extra time.
- A subclass's views are placed in the defaultplacement of its superclass. However, a subclass's states are placed in the final defaultplacement in the inheritance chain no matter where they appear in the inheritance hierarchy.
- Destroying an LzNode before it has init'd will leak memory. This problem can be triggered by repeatedly reloading a large dataset which is tied to a replication that does not use pooling.
- LzView.getMouse() doesn't work properly when stretches is enabled. To
workaround, getMouse relative to a an unstretched view.
- Undocumented/unreserved globals may exist. This causes a collision with the id
of some nodes and views. Views and nodes with an id of o, or s will
eventually get overwritten.
- Using LzView.bringToFront() and LzView.sendToBack() will not work properly on
views which whose parent is the canvas in an application which has a <splash>.
- Applying an attribute with a state does not remove a constraint on that attribute. Use two states to model this behavior and remove the first constraint before applying the second.
- The LzView.getCurrentTime() and LzView.getTotalTime() APIs assume that a view's resource is playing at 30 fps. This is true as long as the resource is not a swf that has sound.
- A multiframe swf resource that has no sound will be played at 30 fps, regardless of its specified framerate.
- Most private LFC attributes begin with __LZ. However, some of them do not. In
general, if an attribute does not appear in the documentation, it should be
considered private, regardless of its name.
- LzView.getAttributeRelative() hangs Flash player when called with null second
argument.
- The canvas does not send an onconstruct event.
- Laszlo Foundation Classes - Data
- Laszlo Foundation Classes - Text
- The dash at the end of a word does not force a wrap if the width is less than
the width at the dash but greater than the width at the last character before
the dash.
- Single words in an input text field that are too long for the line will be clipped.
- Input text fields do not wrap on dashes -- only on spaces.
- Using the fgcolor property of the inputtext element changes the selection color
to the same color as the text color
- There is currently no way to center or right-align multiline text in Laszlo. If
this is absolutely necessary, use a series of single line text fields and right
align them.
- A laszlo text field may not display correctly if it is given an extremely long
line and it is multiline=false
- <p>text</p> does not display unless multiline=true
- The fontsize attribute doesn't cascade to children when reset at runtime.
Although font information set on a parent will cascade to its children at
construct-time, the binding is not active. Changing the parent's font after
construction (say, at constraint resolution time) will not change the child's font.
- very long strings in singleline inputtext cause display problems
- <text> and <inputtext> views are not designed to have subviews.
- A <text> which uses the <font...> tag will not automatically size its height
properly.
- fgcolor attribute has no effect on inputtext
- Mouse events are not reported by <edittext>. They are reported by <inputtext>.
- This doesn't work when something else has been focused:
this.editbox.setSelection(0);
This did work:
LzFocus.setFocus(this.editbox);
this.editbox.setSelection(0);
- setfontstyle('bold') or setattribute('fontstyle','bold') require that you also
update the text.
- LFC Object System
- super.<member> is not supported and will produce a compilation error
- "meth" is a reserved word previously undocumented. Creating nodes with this name
or id causes unpredictable behavior in lzbrowser.loadurl() and other calls.
- RPC - SOAP
- If you get a NullPointerException reported when writing SOAP based apps, look in
the lps.log to find debugging information. Type mismatches in document style
messages can throw NullPointerExceptions.
- Server data transport
- LPS may maintain stale DNS mappings between hosts and IP addresses.
Restarting LPS will cause it to drop any such stale mappings.
- When redirects are disallowed, backend 302 is reported as timeout instead of
datasource error.
- The Persistent Connection manager can, in some cases, hold open sockets when the
window is closed. As stated in the documentation, the persistent connection
feature is provisional and should not be used in production software.
- Server globals
- LPS does not gracefully handle syntax errors in the lps.properties file. A
file with unexpected values for certain properties can cause the server to fail
its initialization.
- Server media
- An audio resource which is included at compile time will not play. For example,
this: <view resource="myaudio.mpg"/> won't work. To work around, load the media
at runtime (like this: <view resource="http:myaudio.mpg"/>) or use the LzAudio APIs.
- LPS may fail to proxy images and data from remote web sites that block
proxies. Such requests will come back from the remote web sites marked as
Forbidden.
- Server misc.
- LPS does not work in the Turkish locale. The workaround is to add a
-Duser.language=en to the JAVA_OPTS in your servlet container startup.
- The LZX source viewer does not display component resources
- Server SWF Generation
- LPS doesn't currently support the inclusion of Flash assets which are SWF 6 or
higher. If you are using Flash MX or above, export for Flash Player 5.
Starting with OpenLaszlo 3.0 the bug database is available for your inspection at OpenLaszlo.org.
This is the best way for you to keep informed about known bugs, fixes, and workarounds.
© Copyright 2002-2005 Laszlo Systems, Inc. All rights reserved. Unauthorized use, duplication or distribution is strictly prohibited.