Details
-
Type: Task
-
Status: Closed
-
Priority: Minor
-
Resolution: Invalid
-
Affects Version/s: 1.6
-
Fix Version/s: None
-
Component/s: Bridge
-
Labels:None
-
Environment:Liferay Portal 4.3.x, ICEfaces portlets in async mode.
-
Affects:Compatibility/Configuration
-
Workaround Exists:Yes
-
Workaround Description:
Description
This can be reproduced fairly easily. It's an issue with running on Liferay because Liferay supports dynamically adding and removing portlets from the page. What I believe happens is this:
1) Add an ICEfaces portlet to an empty portal page - just one will do. This causes our JavaScript to be downloaded and executed and the heartbeat to start. Wait for the first successful ping/pong to ensure things are working correctly.
2) Remove the portlet from the page using the window's close icon (only available on Liferay). Again wait for the ping/pong. In Firebug, you'll see this message:
[window.0BnX#10.async-connection] receive broadcast failed TypeError: this.elementID.asElement() has no propertiesicefaces-d2d.js (line 1337)
Our JavaScript bridge + heartbeat is still running. It doesn't get unloaded when the portlet went away. Not even sure that we can detect this in a non-proprietary way.
This currently won't occur with most of the other portals (like JBoss or Pluto) because to add/remove portlets on those platforms requires you to go to an Admin page of some sort which unloads our page (stopping all the JS). JBoss doesn't give you the option of a close button as a window decoration. Once you're done with the Admin page and go back to the portal page, everything starts fresh so there's no "leftover" JavaScript running.
We need to discuss this with Liferay to determine the best course of action.
1) Add an ICEfaces portlet to an empty portal page - just one will do. This causes our JavaScript to be downloaded and executed and the heartbeat to start. Wait for the first successful ping/pong to ensure things are working correctly.
2) Remove the portlet from the page using the window's close icon (only available on Liferay). Again wait for the ping/pong. In Firebug, you'll see this message:
[window.0BnX#10.async-connection] receive broadcast failed TypeError: this.elementID.asElement() has no propertiesicefaces-d2d.js (line 1337)
Our JavaScript bridge + heartbeat is still running. It doesn't get unloaded when the portlet went away. Not even sure that we can detect this in a non-proprietary way.
This currently won't occur with most of the other portals (like JBoss or Pluto) because to add/remove portlets on those platforms requires you to go to an Admin page of some sort which unloads our page (stopping all the JS). JBoss doesn't give you the option of a close button as a window decoration. Once you're done with the Admin page and go back to the portal page, everything starts fresh so there's no "leftover" JavaScript running.
We need to discuss this with Liferay to determine the best course of action.
Issue Links
- depends on
-
ICE-3266 Provide a client side bridge API to dispose of a view
- Closed
I just tried to reproduce this problem with ICEfaces 1.7RC1 and Liferay 4.4.2 and did not see the JavaScript error in FireFox.
Is this still an issue?
If it is, then I thought it best to record here a summary of the IM discussion I had with Derek on this issue back on 1/22/2008:
Derek explained the problem a little further:
"If you close one, the bridge has no way of knowing and throws JavaScript errors. It's trying to maintain the portlet that went missing. It's the reverse problem of adding it dynamically."
Derek presented the following two ideas as potential solutions:
1. Force the page to reload when the portlet is removed from the page
2. Hook into the Liferay JavaScript API and receive notifications for when a portlet is removed from a page
Liferay doesn't have a means to do #1. Regarding #2, I got on IM with Liferay's Nate Cavanaugh, and he said that there is currently no mechanism in the Liferay javascript API to register a listener to hear when a portlet is removed from the page. However, he wrote that he has wanted to do that for a long time, and it would be super easy to do.
If this is still an issue then I'll get back with Nate and see if we can't get #2 implemented.