Author: max
Date: 2007-09-27 22:30:20 -0700 (Thu, 27 Sep 2007)
New Revision: 6661
Modified:
openlaszlo/branches/wafflecone/WEB-INF/lps/lfc/kernel/dhtml/LzSprite.js
openlaszlo/branches/wafflecone/WEB-INF/lps/lfc/services/platform/dhtml/LzHistory.js
openlaszlo/branches/wafflecone/WEB-INF/lps/lfc/services/platform/swf/LzBrowser.as
openlaszlo/branches/wafflecone/WEB-INF/lps/lfc/services/platform/swf/LzHistory.as
openlaszlo/branches/wafflecone/WEB-INF/lps/lfc/views/LaszloCanvas.lzs
openlaszlo/branches/wafflecone/lps/includes/source/embednew.js
openlaszlo/branches/wafflecone/lps/includes/source/flash.js
openlaszlo/branches/wafflecone/lps/includes/source/lzhistory.js
Log:
Change 20070927-maxcarlson-6 by [EMAIL PROTECTED] on 2007-09-27 18:44:35 PDT
in /Users/maxcarlson/openlaszlo/wafflecone
for http://svn.openlaszlo.org/openlaszlo/branches/wafflecone
Summary: UPDATED: Fix history in swf7/8 and dhtml
New Features:
Bugs Fixed: LPP-4746 - Javascript errors when using the history mechanism in
swf7, LPP-4731 - reloading browser page causes history to trigger "back" action
Technical Reviewer: promanik
QA Reviewer: [EMAIL PROTECTED]
Doc Reviewer: (pending)
Documentation:
Release Notes:
Details: LzSprite.js - Do callback to _ready when canvas initializes.
LzHistory.as - Use correct syntax for LzBrowser.callJS(). Clear out old
__lzloading code.
LzBrowser.as - Reset __jscallback to null when there is no callback.
LzHistory.js - Clear out old __lzloading code.
LaszloCanvas.lzs - Rely on browser history event callbacks to initialize
history state instead of explicit call at canvas init time.
embednew.js - Hand merge changes related to onloaded from trunk.
lzhistory.js - Store and reset the document title in IE to keep the window
title from changing.
flash.js - Ensure callback methods are executed in the proper scope for flash <
8.
Tests: http://localhost:8080/trunk/test/history/history.lzx in dhtml, swf7 and
8 in Firefox mac, IE 6/7 and Safari 2. Also tested webtop and verified that
both bugs are fixed in future/lzmail/main.lzx - I used r11 of uicontroller.lzx
to bring back the history functionality.
Modified:
openlaszlo/branches/wafflecone/WEB-INF/lps/lfc/kernel/dhtml/LzSprite.js
===================================================================
--- openlaszlo/branches/wafflecone/WEB-INF/lps/lfc/kernel/dhtml/LzSprite.js
2007-09-28 05:26:45 UTC (rev 6660)
+++ openlaszlo/branches/wafflecone/WEB-INF/lps/lfc/kernel/dhtml/LzSprite.js
2007-09-28 05:30:20 UTC (rev 6661)
@@ -24,6 +24,9 @@
if (p.bgcolor) div.style.backgroundColor = p.bgcolor;
if (p.width) div.style.width = p.width;
if (p.height) div.style.height = p.height;
+ if (p.id) {
+ this._id = p.id;
+ }
if (this.quirks.canvas_div_cannot_be_clipped == false && p.width &&
p.width.indexOf('%') == -1 && p.height && p.height.indexOf('%') == -1 ) {
div.style.clip = 'rect(0px ' + p.width + ' ' + p.height + ' 0px)';
div.style.overflow = 'hidden';
@@ -358,6 +361,7 @@
var s = document.getElementById('lzsplash');
if (s) LzSprite.prototype.__discardElement(s);
+ if (this._id) Lz[this._id]._ready();
}
}
Modified:
openlaszlo/branches/wafflecone/WEB-INF/lps/lfc/services/platform/dhtml/LzHistory.js
===================================================================
---
openlaszlo/branches/wafflecone/WEB-INF/lps/lfc/services/platform/dhtml/LzHistory.js
2007-09-28 05:26:45 UTC (rev 6660)
+++
openlaszlo/branches/wafflecone/WEB-INF/lps/lfc/services/platform/dhtml/LzHistory.js
2007-09-28 05:30:20 UTC (rev 6661)
@@ -37,7 +37,6 @@
LzHistory.setHistory = function(s) {
//Debug.write('setHistory', s);
Lz.history.set(s);
- this.__lzloading = true;
}
/**
@@ -54,12 +53,6 @@
LzHistory.__lzhistq = [];
/** @access private */
LzHistory.__lzcurrstate = {};
-/** @access private */
-LzHistory.__lzloading = false;
-/** @access private */
-LzHistory.__lzloadcache = {};
-/** @access private */
-LzHistory.__loadcacheused = false;
DeclareEvent(LzHistory, 'onoffset' );
@@ -81,23 +74,6 @@
//Debug.write('restoring state ', global[o.c], o.c, o.n, o.v);
global[o.c].setAttribute(o.n, o.v);
}
-
-
- // copy values cached during load
- if (this.__loadcacheused) {
- var out = this.__lzhistq[this.offset];
- if (out == null) out = {};
- var u;
- for (u in this.__lzloadcache) {
- //Debug.write('restoring', o, this.__lzloadcache[u]);
- out[u] = this.__lzloadcache[u];
- }
- this.__lzhistq[this.offset] = out;
- this.__lzloadcache = {};
- this.__loadcacheused = false;
- }
-
- this.__lzloading = false;
}
/**
@@ -137,16 +113,9 @@
LzHistory.save = function(who, prop, val) {
// strip off __ so keys can be listed
if (val == null) val = global[who][prop];
- if (this.__lzloading) {
- //Debug.write('caching');
- // cache values until load finishes
- this.__lzloadcache[who] = {c: who, n: prop, v: val};
- this.__loadcacheused = true;
- } else {
- //Debug.write('set state of ',u,' to ', this.__lzcurrstate);
- this.__lzcurrstate[who] = {c: who, n: prop, v: val};
- this.__lzdirty = true;
- }
+ //Debug.write('set state of ',u,' to ', this.__lzcurrstate);
+ this.__lzcurrstate[who] = {c: who, n: prop, v: val};
+ this.__lzdirty = true;
}
/**
Modified:
openlaszlo/branches/wafflecone/WEB-INF/lps/lfc/services/platform/swf/LzBrowser.as
===================================================================
---
openlaszlo/branches/wafflecone/WEB-INF/lps/lfc/services/platform/swf/LzBrowser.as
2007-09-28 05:26:45 UTC (rev 6660)
+++
openlaszlo/branches/wafflecone/WEB-INF/lps/lfc/services/platform/swf/LzBrowser.as
2007-09-28 05:30:20 UTC (rev 6661)
@@ -87,6 +87,8 @@
if (typeof callback == 'function') {
this.__jscallback = callback;
+ } else {
+ this.__jscallback = null;
}
var args = [].slice.call(arguments, 2);
args.unshift(js, LzBrowser.callJSReturn);
Modified:
openlaszlo/branches/wafflecone/WEB-INF/lps/lfc/services/platform/swf/LzHistory.as
===================================================================
---
openlaszlo/branches/wafflecone/WEB-INF/lps/lfc/services/platform/swf/LzHistory.as
2007-09-28 05:26:45 UTC (rev 6660)
+++
openlaszlo/branches/wafflecone/WEB-INF/lps/lfc/services/platform/swf/LzHistory.as
2007-09-28 05:30:20 UTC (rev 6661)
@@ -37,8 +37,7 @@
LzHistory.__setHistory = function(s) {
//Debug.write('__setHistory', s);
LzBrowser._jsreset();
- LzBrowser.callJS('Lz.history.set("' + s + '")', false);
- this.__lzloading = true;
+ LzBrowser.callJS('Lz.history.set', null, s);
}
/**
@@ -58,50 +57,31 @@
LzHistory.__lzhistq = [];
/** @access private */
LzHistory.__lzcurrstate = {};
-/** @access private */
-LzHistory.__lzloading = false;
-/** @access private */
-LzHistory.__lzloadcache = {};
-/** @access private */
-LzHistory.__loadcacheused = false;
DeclareEvent(LzHistory, 'onoffset' );
-
/**
* @access private
*/
LzHistory.receiveHistory = function(o){
- //Debug.write('onhistory ', o, this.__lzhistq);
+ var l = this.__lzhistq.length;
o *= 1;
- if (! o) o = 0;
- if (o > this.__lzhistq.length - 1) o = this.__lzhistq.length;
- this.offset = o;
- if (this.onoffset.ready) this.onoffset.sendEvent(o);
-
+ if (! o) {
+ o = 0;
+ } else if (o > l - 1) {
+ o = l;
+ }
+
var h = this.__lzhistq[o];
for (var u in h) {
- var o = h[u];
- //Debug.write('restoring state ', global[o.c], o.c, o.n, o.v);
- global[o.c].setAttribute(o.n, o.v);
+ var obj = h[u];
+ //Debug.write('restoring state ', global[obj], obj, obj.n, obj.v);
+ global[u].setAttribute(obj.n, obj.v);
}
-
-
- // copy values cached during load
- if (this.__loadcacheused) {
- var out = this.__lzhistq[this.offset];
- if (out == null) out = {};
- var u;
- for (u in this.__lzloadcache) {
- //Debug.write('restoring', o, this.__lzloadcache[u]);
- out[u] = this.__lzloadcache[u];
- }
- this.__lzhistq[this.offset] = out;
- this.__lzloadcache = {};
- this.__loadcacheused = false;
- }
-
- this.__lzloading = false;
+
+ this.offset = o;
+ //Debug.write('onhistory ', o, this.__lzhistq);
+ if (this.onoffset.ready) this.onoffset.sendEvent(o);
}
/**
@@ -197,16 +177,9 @@
}
// strip off __ so keys can be listed
if (val == null) val = global[who][prop];
- if (this.__lzloading) {
- //Debug.write('caching');
- // cache values until load finishes
- this.__lzloadcache[who] = {c: who, n: prop, v: val};
- this.__loadcacheused = true;
- } else {
- this.__lzcurrstate[who] = {c: who, n: prop, v: val};
- this.__lzdirty = true;
- //Debug.write('set state of ',who,' to ', this.__lzcurrstate);
- }
+ this.__lzcurrstate[who] = {n: prop, v: val};
+ this.__lzdirty = true;
+ //Debug.write('set state of ',who,' to ', this.__lzcurrstate);
}
/**
@@ -268,12 +241,6 @@
this.move(-1);
}
-/** get history from local object
- * @access private
- */
-LzHistory.__restorehistory = function() {
- this.receiveHistory(this.offset);
-}
/** @access private */
LzHistory.__initPersist = function() {
if (this.persist) {
Modified: openlaszlo/branches/wafflecone/WEB-INF/lps/lfc/views/LaszloCanvas.lzs
===================================================================
--- openlaszlo/branches/wafflecone/WEB-INF/lps/lfc/views/LaszloCanvas.lzs
2007-09-28 05:26:45 UTC (rev 6660)
+++ openlaszlo/branches/wafflecone/WEB-INF/lps/lfc/views/LaszloCanvas.lzs
2007-09-28 05:30:20 UTC (rev 6661)
@@ -484,10 +484,6 @@
this.init();
this.sprite.init(true);
- if ($dhtml) {
- } else {
- LzHistory.__restorehistory();
- }
if (this.oninit.ready) this.oninit.sendEvent( this );
if (this.datapath && this.datapath.__LZApplyDataOnInit) {
this.datapath.__LZApplyDataOnInit();
Modified: openlaszlo/branches/wafflecone/lps/includes/source/embednew.js
===================================================================
--- openlaszlo/branches/wafflecone/lps/includes/source/embednew.js
2007-09-28 05:26:45 UTC (rev 6660)
+++ openlaszlo/branches/wafflecone/lps/includes/source/embednew.js
2007-09-28 05:30:20 UTC (rev 6661)
@@ -109,13 +109,15 @@
,setCanvasAttribute: Lz._setCanvasAttributeSWF
,getCanvasAttribute: Lz._getCanvasAttributeSWF
,callMethod: Lz._callMethodSWF
- ,_loaded: Lz._loaded
+ ,_ready: Lz._ready
+ ,loaded: false
,_setCanvasAttributeDequeue: Lz._setCanvasAttributeDequeue
}
+ // for callbacks onload
+ Lz._swfid = properties.id;
+ dojo.flash.addLoadedListener(Lz._loaded);
if (! Lz['setCanvasAttribute']) {
Lz.setCanvasAttribute = Lz[properties.id].setCanvasAttribute;
- // for queuing
- Lz._id = properties.id;
}
if (! Lz['getCanvasAttribute']) Lz.getCanvasAttribute =
Lz[properties.id].getCanvasAttribute;
if (! Lz['callMethod']) Lz.callMethod = Lz[properties.id].callMethod;
@@ -191,6 +193,8 @@
Lz[properties.id] = {
runtime: 'dhtml'
,_id: properties.id
+ ,_ready: Lz._ready
+ ,loaded: false
,setCanvasAttribute: Lz._setCanvasAttributeDHTML
,getCanvasAttribute: Lz._getCanvasAttributeDHTML
}
@@ -330,7 +334,7 @@
* @param hist:Boolean value - if true, add a history event.
*/
_setCanvasAttributeSWF: function (name, value, hist) {
- if (dojo.flash.ready) {
+ if (this.loaded) {
if (hist) {
Lz.history._store(name, value);
} else {
@@ -342,7 +346,6 @@
} else {
this._setCanvasAttributeQ.push([name, value, hist]);
}
- dojo.flash.addLoadedListener(this._loaded);
}
}
,/**
@@ -366,18 +369,29 @@
_loaded: function () {
if (dojo.flash.info.commVersion == 8) {
// wait a bit longer for Flash to init
- setTimeout('Lz["'+Lz._id +'"]._setCanvasAttributeDequeue()', 100);
+ setTimeout('Lz["'+Lz._swfid
+'"]._ready.call(Lz["'+Lz._swfid+'"])', 100);
} else {
- Lz[Lz._id]._setCanvasAttributeDequeue();
+ Lz[Lz._swfid]._ready.call(Lz[Lz._swfid]);
}
}
,/** @access private */
_setCanvasAttributeDequeue: function () {
- while (Lz._setCanvasAttributeQ.length > 0) {
- var a = Lz._setCanvasAttributeQ.pop();
- Lz.setCanvasAttribute(a[0], a[1], a[2]);
+ while (this._setCanvasAttributeQ.length > 0) {
+ var a = this._setCanvasAttributeQ.pop();
+ this.setCanvasAttribute(a[0], a[1], a[2]);
}
}
+ ,/** @access private */
+ _ready: function () {
+ this.loaded = true;
+ Lz.loaded = true;
+ if (this._setCanvasAttributeQ) {
+ this._setCanvasAttributeDequeue();
+ }
+ if (this.onload && typeof this.onload == 'function') {
+ this.onload();
+ }
+ }
,/**
* Reads an attribute from the canvas of an embedded SWF application and
@@ -386,10 +400,10 @@
* @param name:String name of the property to read
*/
_getCanvasAttributeSWF: function (name) {
- if (dojo.flash.ready) {
+ if (this.loaded) {
return dojo.flash.comm.getCanvasAttribute(name);
} else {
- alert('dojo.flash is not ready: getCanvasAttribute' + name);
+ alert('Flash is not ready: getCanvasAttribute' + name);
}
}
@@ -529,8 +543,13 @@
* @param js:String javascript to call in the form
'foo.bar.methodcall(arg1,arg2,...)'
*/
_callMethodSWF: function (js) {
- if (dojo.flash.comm) {
+ if (this.loaded) {
return dojo.flash.comm.callMethod(js);
+ } else {
+ this._lastjs = function() {
+ dojo.flash.comm.callMethod(js);
+ };
+ dojo.flash.addLoadedListener(this._lastjs);
}
}
,/** @access private */
Modified: openlaszlo/branches/wafflecone/lps/includes/source/flash.js
===================================================================
--- openlaszlo/branches/wafflecone/lps/includes/source/flash.js 2007-09-28
05:26:45 UTC (rev 6660)
+++ openlaszlo/branches/wafflecone/lps/includes/source/flash.js 2007-09-28
05:30:20 UTC (rev 6661)
@@ -1012,17 +1012,19 @@
// the method name has a dot in it, such as "dojo.flash.loaded", we
// eval it so that the method gets run against an instance
var runMe;
+ var scope = window;
if(functionName.indexOf(".") == -1){ // global function
runMe = window[functionName];
}else{
// instance function
runMe = eval(functionName);
+ scope = eval(functionName.substring(0,
functionName.lastIndexOf(".")));
}
// make the call and get the results
var results = null;
if(runMe != null){
- results = runMe.apply(null, flashArgs);
+ results = runMe.apply(scope, flashArgs);
}
results += '';
Modified: openlaszlo/branches/wafflecone/lps/includes/source/lzhistory.js
===================================================================
--- openlaszlo/branches/wafflecone/lps/includes/source/lzhistory.js
2007-09-28 05:26:45 UTC (rev 6660)
+++ openlaszlo/branches/wafflecone/lps/includes/source/lzhistory.js
2007-09-28 05:30:20 UTC (rev 6661)
@@ -9,25 +9,27 @@
Lz.history = {
_currentstate: null
,init: function() {
+ var _this = Lz.history;
+ _this._title = top.document.title;
Lz.__BrowserDetect.init();
- Lz.history._currentstate = Lz.history.get();
+ _this._currentstate = _this.get();
if (Lz.__BrowserDetect.isSafari) {
// must track state ourselves...
- Lz.history._historylength = history.length;
- Lz.history._history = [];
- for (var i = 1; i < Lz.history._historylength; i++) {
- Lz.history._history.push('');
+ _this._historylength = history.length;
+ _this._history = [];
+ for (var i = 1; i < _this._historylength; i++) {
+ _this._history.push('');
}
- Lz.history._history.push(Lz.history._currentstate);
+ _this._history.push(_this._currentstate);
var form = document.createElement('form');
form.method = 'get';
document.body.appendChild(form);
- Lz.history._form = form;
+ _this._form = form;
if (! top.document.location.lzaddr) {
top.document.location.lzaddr = {};
}
if (top.document.location.lzaddr.history) {
- Lz.history._history =
top.document.location.lzaddr.history.split(',');
+ _this._history =
top.document.location.lzaddr.history.split(',');
}
} else if (Lz.__BrowserDetect.isIE) {
// use an iframe;
@@ -38,25 +40,23 @@
i.style.position = 'absolute';
i.style.display = 'none';
i.style.left = '-1000px';
- Lz.history._iframe = document.getElementById('lzHistory');
- var doc = Lz.history._iframe.contentWindow.document;
+ _this._iframe = document.getElementById('lzHistory');
+ var doc = _this._iframe.contentWindow.document;
doc.open();
doc.close();
- if (Lz.history._currentstate != '') doc.location.hash = '#' +
Lz.history._currentstate;
+ if (_this._currentstate != '') doc.location.hash = '#' +
_this._currentstate;
}
- if (Lz.history._currentstate != '')
Lz.history._parse(Lz.history._currentstate)
+ if (_this._currentstate != '') _this._parse(_this._currentstate)
//alert('init');
setInterval('Lz.history._checklocationhash()', 100)
}
,/** @access private */
_historyEvent: function (value) {
- if (dojo.flash.ready) {
+ if (Lz.loaded) {
//alert(value);
dojo.flash.comm.receiveHistory(value + '');
return true;
- } else {
- //alert('dojo.flash is not ready: _historyEvent' + value);
}
}
@@ -65,7 +65,7 @@
if (dojo.flash && dojo.flash.info && dojo.flash.info.installing)
return;
if (Lz.__BrowserDetect.isSafari) {
var h = this._history[this._historylength - 1];
- if (h == '') h = '#0';
+ if (h == '' || h == '#') h = '#0';
if (!this._skip && this._historylength != history.length) {
this._historylength = history.length;
if (typeof h != 'undefined') {
@@ -88,6 +88,9 @@
this._currentstate = h;
this._parse(h);
}
+ if (top.document.title != this._title) {
+ top.document.title = this._title;
+ }
} else {
this._currentstate = h;
this._parse(h);
@@ -144,12 +147,12 @@
}
,/** @access private */
_parse: function(h) {
+ var _this = Lz.history;
// TODO: send events to all apps
- if (h.length == 0 || h == this._lasthash) return;
- //alert('_parse '+ h);
+ if (h.length == 0 || h == _this._lasthash) return;
if (h.indexOf('_lz') != -1) {
// TODO: use rison
- this._lasthash = h;
+ _this._lasthash = h;
h = h.substring(3);
var a = h.split(',');
for (var j = 0; j < a.length; j++) {
@@ -162,14 +165,15 @@
}
} else {
//history id
- if (Lz.history._historyEvent(h)) {
+ if (_this._historyEvent(h)) {
// if successful, don't send again
- this._lasthash = h;
+ _this._lasthash = h;
+ //alert('_parse '+ h + ', ' + _this._lasthash);
}
if (Lz.__dhtmlhistoryready && LzHistory &&
LzHistory['receiveHistory']) {
//alert(h);
LzHistory.receiveHistory(h);
- this._lasthash = h;
+ _this._lasthash = h;
}
}
}
_______________________________________________
Laszlo-checkins mailing list
[email protected]
http://www.openlaszlo.org/mailman/listinfo/laszlo-checkins