History | Log In     View a printable version of the current page.  
Issue Details (XML | Word | Printable)

Key: LPP-4731
Type: Bug Bug
Status: Verified Verified
Resolution: Fixed
Priority: P1 P1
Assignee: Max Carlson
Reporter: Sarah Allen
Votes: 0
Watchers: 0
Operations

If you were logged in you would be able to see more operations.
OpenLaszlo

reloading browser page causes history to trigger "back" action

Created: 14/Sep/07 09:00 AM   Updated: 05/Oct/07 04:27 PM
Component/s: Browser Integration
Affects Version/s: 4.0.5WaffleCone
Fix Version/s: 4.0.6/Jujube

Time Tracking:
Not Specified

Severity: Major
Fixed in Change#: 6,661
Runtime: N/A
Fix in hand: False


 All   Comments   Work Log   Change History      Sort Order: Ascending order - Click to sort in descending order
Sarah Allen - 14/Sep/07 09:01 AM
Maybe Frisco could run some history test case to see if he can repro in isolation?

Max Carlson - 27/Sep/07 10:46 PM
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 maxcarlson@plastik 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: lhenrywilkins@laszlosystems.com
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
Laszlo-checkins@openlaszlo.org
http://www.openlaszlo.org/mailman/listinfo/laszlo-checkins

Steve O'Sullivan - 05/Oct/07 04:27 PM
This is verified as per Lorien Henry-Wilkins.