wicket-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Ernesto Reinaldo Barreiro <reier...@gmail.com>
Subject Re: Ajax timer not counting when tab doesn't have focus?
Date Tue, 13 May 2014 05:59:11 GMT
Martin,

Thanks for pointing out this. The exact JavaScript enabling this feature
can be found here

https://github.com/reiern70/antilia-bits/blob/master/client-sign-out-parent/client-sign-out/src/main/java/com/antilia/signout/InactivitySignOutPanel.js

Maybe there is a memory leak in here as well... but I do not see the
relation with WICKET-5570 as I do not use any of the AJAX timer behavior,
see

https://github.com/reiern70/antilia-bits/blob/master/client-sign-out-parent/client-sign-out/src/main/java/com/antilia/signout/InactivitySignOutPanel.java

As Bruce describes the problem it sounds like if by switching to other tab
browser give less "priority" to the execution of JavaScript in inactive
tabs.



On Mon, May 12, 2014 at 9:28 PM, Martin Grigorov <mgrigorov@apache.org>wrote:

> It could be that https://issues.apache.org/jira/browse/WICKET-5570 is the
> issue.
> Please try with 6.16.0-SNAPSHOT if you can.
>
> Martin Grigorov
> Wicket Training and Consulting
>
>
> On Mon, May 12, 2014 at 8:02 PM, Bruce Lombardi <brlombar@gmail.com>
> wrote:
>
> > Thanks Ernesto.
> >
> > Yes, I do mean another browser tab. I have some new information. The
> timer
> > seems to slow way down, but not stop counting down when the user switches
> > focus to another tab, either opening a new tab, or just clicking on
> another
> > tab. This is happening in both Chrome and Firefox.
> >
> > I thought that my code was never timing out, but further experimentation
> > with a shorter timeout period shows that it is doing the same thing as
> the
> > demo. That is, timing out in about 10 second when you stay on the tab,
> but
> > taking 3 minutes or longer to timeout when if you change focus to a
> > different tab.
> >
> > I would appreciate it if you could look at your demo and see the behavior
> > and then see if you have any ideas.
> >
> > As for my code, I really feel they difference with your code are
> > insignificant especially now that I know the behavior is the same.
> >
> > See below for the differences.
> >
> > Thanks again,
> >
> > Bruce
> >
> >
> > Code.
> >
> > I have your InactivitySignOutPanel.java, InactivitySignOutPanel.html and
> > InactivitySignOutPanel.js from the GitHub site with one slight
> modification
> > in InactivitySignOutPanel.java (see below).
> >
> >  I setup my panel in  a base class that serves as a superclass for all
> the
> > Web pages in the application (extends WebPage)  I have a method that is
> > called to setup the timeout. Here is the method.
> >
> >         public void setupTimeout() {
> >
> >                 // Change the following value to change the session
> > timeout.
> >                 int numberOfMinutesUntilTimeout = 15;
> >
> >                 int secondsPerMinute = 60;
> >                 int secondsToTimeout =numberOfMinutesUntilTimeout *
> > secondsPerMinute;
> >
> >                 add(new InactivitySignOutPanel("timeout",
> > Duration.seconds(secondsToTimeout)) {
> >
> >                 private static final long serialVersionUID = 1L;
> >
> >                         protected String getOnTimeChangedFunction() {
> >                 return "function(timeRemaining){if(!window.countDown) {
> > window.countDown = $('#countDown'); }
> >  $(window.countDown).html(timeRemaining);}";
> >             }
> >         });
> >
> >         add( new AjaxLink<Void>("link") {
> >
> >                         private static final long serialVersionUID = 1L;
> >
> >                         @Override
> >             public void onClick(AjaxRequestTarget target) {
> >                 // do nothing
> >             }
> >         });
> >         }
> >
> > Here is the core code in InactivitySignOutPanel I have just modified the
> > respond method to call
> >
> >  ((WebDocsSession)WebSession.get()).processLogoutorSessionExpiration();
> >
> >
> setResponsePage(WebApplication.get().getApplicationSettings().getPageExpiredErrorPage());
> >
> > so that the application does the right thing. Note: a break point shows
> > that this method is never call when the user is on another tab.
> >
> >
> >   public InactivitySignOutPanel(String id, Duration duration) {
> >         this(id, Model.of(duration));
> >     }
> >
> >     public InactivitySignOutPanel(String id, IModel<Duration> model) {
> >         super(id, model);
> >         setRenderBodyOnly(true);
> >         add(ajaxBehavior = new AbstractDefaultAjaxBehavior() {
> >
> >                         private static final long serialVersionUID = 1L;
> >
> >                         @Override
> >             protected void respond(AjaxRequestTarget target) {
> >                 beforeSignOut(target);
> >
> > ((WebDocsSession)WebSession.get()).processLogoutOrSessionExpiration();
> >
> >
> setResponsePage(WebApplication.get().getApplicationSettings().getPageExpiredErrorPage());
> >             }
> >
> >             @Override
> >             protected void onBind() {
> >                 // panel will not be repainted, no need to markup markup
> > id.
> >             }
> >
> >             @Override
> >             public void renderHead(Component component, IHeaderResponse
> > response) {
> >                 super.renderHead(component, response);
> >                 response.render(JavaScriptHeaderItem.forReference(JS));
> >             }
> >         });
> >     }
> >
> > -----Original Message-----
> > From: Ernesto Reinaldo Barreiro [mailto:reiern70@gmail.com]
> > Sent: Monday, May 12, 2014 11:39 AM
> > To: users@wicket.apache.org
> > Subject: Re: Ajax timer not counting when tab doesn't have focus?
> >
> > Hi Bruce,
> >
> >
> > On Mon, May 12, 2014 at 4:52 PM, Bruce Lombardi <brlombar@gmail.com>
> > wrote:
> >
> > > This message  is related to an original thread "Link to Wicket page
> > > from Javascript" but the focus is changed so much  that I though a new
> > > title would be better.  In the earlier thread I asked about linking to
> > > a Wicket page, but the real need was for help in implementing a
> > > session timeout that would send the user to a timeout page after a
> > > period of inactivity and would reset whenever a user clicked any
> > > button on the page.
> > >
> > >
> > >
> > > Ernesto Reinaldo Barreiro sent me links(see below) to a working demo
> > > that did exactly what I required. I used  that code and everything
> > > seemed to work perfectly. However, I have since discovered that my
> > > timer does not seem to function correctly if the user goes to another
> > > tab. It seems like the timer stops timing down or slows way down until
> > > the user comes back to the original tab.
> > >
> > > Do you mean another browser tab?
> >
> > >
> > >
> > > I checked Ernesto's demo. If I go to the demo  page and stay there it
> > > times out after roughly the defined 10 second timeout period,  but if
> > > I go to the demo page, then click on another tab, it eventually times
> > > out, but after more than 3 minutes. My code, however,  never seems to
> > > seem to timeout the page if I go to another tab.
> > >
> > > Does this happens in a all browsers? Or in particular one?
> >
> > Mind that this is just a quick "something" I build to illustrate the
> > idea... So, it might not be bullet proof.
> >
> >
> > >
> > > I really need this to work to  fulfill a requirement and it is
> > > preventing the launch of our software.  It all works fine except if
> > > the user goes to a different tab.
> > >
> > >
> > >
> > > Ernesto, or anyone, do you know why this is happening. Is the ajax
> > > timer stopping when the tab is not selected? Why is the demo
> > > eventually timing out while application is not (can't see any real
> > > difference in the code)?
> > >
> >
> > Without seeing your code or a quick-start app illustrating  the problem
> it
> > might be difficult to point out what's going on.
> >
> > >
> > > Is there any way to get a better handle on this (e.g., firebug)? If
> > > the ajax timer is stopping, could something be done, perhaps using
> > > absolute elapsed time, to expire the session immediately if the user
> > > goes back to the tab?
> > > The latter is not ideal but might be acceptable.
> > >
> > >
> > >
> > > (Note: My session timeout in web.xml is 30 minutes, client timeout is
> > > 15 minutes, but for testing I set it to 10 seconds).
> > >
> > >
> > >
> > >
> > >
> > > // Links
> > >
> > >
> > >
> > > Demo of Example
> > >
> > >
> > >
> > > http://107.170.4.97:9080/client-sign-out-demo/?0
> > >
> > >
> > >
> > >
> > >
> > > Code that sets up example
> > >
> > >
> > >
> > > https://github.com/reiern70/antilia-bits/blob/master/client-sign-out-p
> > > aren
> > >
> > > t/client-sign-out-demo/src/main/java/com/antilia/HomePage.java
> > >
> > >
> > >
> > >
> > >
> > > Code that provides the implementation (We have this code in  package
> > >
> > > com.xyzco.web.docs.presentation.helpers.timeout)
> > >
> > >
> > >
> > >
> > >
> > > https://github.com/reiern70/antilia-bits/tree/master/client-sign-out-p
> > > aren
> > >
> > > t/client-sign-out-demo/src/main/java/com/antilia
> > >
> > >
> > >
> > > Thanks,
> > >
> > > Bruce
> > >
> > >
> > >
> > >
> > >
> > >
> > >
> > > -----Original Message-----
> > >
> > > From: Bruce Lombardi [mailto:brlombar@gmail.com]
> > >
> > > Sent: Monday, March 17, 2014 8:24 AM
> > >
> > > To: users@wicket.apache.org
> > >
> > > Subject: Re: Link to Wicket page from Javascript
> > >
> > >
> > >
> > > Thanks, this is very helpful.
> > >
> > >
> > >
> > > Bruce
> > >
> > >
> > >
> > > Sent from my iPad
> > >
> > >
> > >
> > > > On Mar 17, 2014, at 4:52 AM, Ernesto Reinaldo Barreiro
> > >
> > > <reiern70@gmail.com> wrote:
> > >
> > > >
> > >
> > > > You can see it at work here
> > >
> > > >
> > >
> > > > http://107.170.4.97:9080/client-sign-out-demo/
> > >
> > > >
> > >
> > > >
> > >
> > > > On Mon, Mar 17, 2014 at 9:18 AM, Ernesto Reinaldo Barreiro <
> > >
> > > > reiern70@gmail.com> wrote:
> > >
> > > >
> > >
> > > >> Martin,
> > >
> > > >>
> > >
> > > >> What I mean is something that triggers the sign out before serve
> > > >> side
> > >
> > > >> session expires... and trigger this expire event.
> > >
> > > >>
> > >
> > > >>
> > >
> > > >> https://github.com/reiern70/antilia-bits/blob/master/client-sign-ou
> > > >> t-
> > >
> > > >> parent/client-sign-out/src/main/java/com/antilia/signout/Inactivity
> > > >> Si
> > >
> > > >> gnOutPanel.java
> > >
> > > >>
> > >
> > > >> https://github.com/reiern70/antilia-bits/blob/master/client-sign-ou
> > > >> t-
> > >
> > > >> parent/client-sign-out/src/main/java/com/antilia/signout/Inactivity
> > > >> Si
> > >
> > > >> gnOutPanel.js
> > >
> > > >>
> > >
> > > >> The above seem to work. You use it as in
> > >
> > > >>
> > >
> > > >>
> > >
> > > >> https://github.com/reiern70/antilia-bits/blob/master/client-sign-ou
> > > >> t-
> > >
> > > >> parent/client-sign-out-demo/src/main/java/com/antilia/HomePage.java
> > >
> > > >>
> > >
> > > >>
> > >
> > > >>
> > >
> > > >>
> > >
> > > >> On Mon, Mar 17, 2014 at 9:11 AM, Martin Grigorov
> > >
> > > < <mailto:mgrigorov@apache.org> mgrigorov@apache.org>wrote:
> > >
> > > >>
> > >
> > > >>> Hi,
> > >
> > > >>>
> > >
> > > >>> On Fri, Mar 14, 2014 at 9:25 PM, Ernesto Reinaldo Barreiro <
> > >
> > > >>> reiern70@gmail.com> wrote:
> > >
> > > >>>
> > >
> > > >>>> Hi,
> > >
> > > >>>>
> > >
> > > >>>> I would implement this as..
> > >
> > > >>>>
> > >
> > > >>>> 1- A JS function that counts how much time has passed since
last
> > >
> > > >>>> AJAX request. Once a certain threshold is passed an AJAX request
> > > >>>> is
> > >
> > > >>>> sent to
> > >
> > > >>> the
> > >
> > > >>>> page.
> > >
> > > >>>> 2- An AbstractAjaxBehavior that is added to the page. I would
use
> > >
> > > >>>> it as context for AJAX request on 1).
> > >
> > > >>>
> > >
> > > >>> at that time the session should be already expired.
> > >
> > > >>>
> > >
> > > >>> But this can be used to do what is needed here - Wicket will
> > >
> > > >>> redirect to the configured PageExpiredErrorPage.
> > >
> > > >>>
> > >
> > > >>>
> > >
> > > >>>> 3- On the respond of AJAXBehavior you redirect to
> > >
> > > >>>> SessionTimeoutPage
> > >
> > > >>> and
> > >
> > > >>>> invalidate the session.
> > >
> > > >>>>
> > >
> > > >>>>
> > >
> > > >>>>
> > >
> > > >>>> On Fri, Mar 14, 2014 at 8:07 PM, Bruce Lombardi
> > >
> > > >>>> <brlombar@gmail.com>
> > >
> > > >>>> wrote:
> > >
> > > >>>>
> > >
> > > >>>>> Hi,
> > >
> > > >>>>>
> > >
> > > >>>>>
> > >
> > > >>>>>
> > >
> > > >>>>> An earlier question I asked about session timeouts was
answered
> > > >>>>> by
> > >
> > > >>> Martin
> > >
> > > >>>>> Grigorov. I am implementing his suggestion and have a
JQuery
> > >
> > > >>>>> script
> > >
> > > >>> what
> > >
> > > >>>>> sets a timer that times out after a certain period of
inactivity.
> > >
> > > >>>>> The timeout triggers a function call.  Currently,  for
a quick
> > >
> > > >>>>> test,  I
> > >
> > > >>> have
> > >
> > > >>>>> that function use location.href to go to an arbitrary
static web
> > >
> > > >>>>> page
> > >
> > > >>>> like
> > >
> > > >>>>> this:
> > >
> > > >>>>>
> > >
> > > >>>>>
> > >
> > > >>>>>
> > >
> > > >>>>> function whenUserIdle(){
> > >
> > > >>>>>
> > >
> > > >>>>>                location.href =
> > >
> > > >>>>> 'http://www.natural-environment.com';
> > >
> > > >>>>>
> > >
> > > >>>>> }
> > >
> > > >>>>>
> > >
> > > >>>>>
> > >
> > > >>>>>
> > >
> > > >>>>> That works fine, but now I need to make it go to a Wicket
page
> > > >>>>> in
> > >
> > > >>>>> my application, similar to what would happen if I had
an anchor
> > >
> > > >>>>> tag
> > >
> > > like:
> > >
> > > >>>>>
> > >
> > > >>>>>
> > >
> > > >>>>>
> > >
> > > >>>>> <a wicket:id=" SessionTimeoutPage"
> > > >>>>> href="#">SessionTimeoutPage</a>
> > >
> > > >>>>>
> > >
> > > >>>>>
> > >
> > > >>>>>
> > >
> > > >>>>> But I can't figure out how to do this in the javascript
function.
> > >
> > > >>>>> Can anyone tell me how to call the Wicket page from the
> > > >>>>> javascript
> > >
> > > >>>>> function?
> > >
> > > >>>
> > >
> > > >>> You can use <script wicket:id="expirationUrl"></script>
and a
> > >
> > > >>> Label("expirationUrl", "window.expirePageUrl ='" +
> > >
> > > >>> urlFor(SessionTimeoutPage.class) + "';"); Then use it with:
> > >
> > > >>> location.href = window.expirePageUrl';
> > >
> > > >>>
> > >
> > > >>>
> > >
> > > >>>>>
> > >
> > > >>>>>
> > >
> > > >>>>>
> > >
> > > >>>>> Thanks,
> > >
> > > >>>>>
> > >
> > > >>>>>
> > >
> > > >>>>>
> > >
> > > >>>>> Bruce
> > >
> > > >>>>
> > >
> > > >>>>
> > >
> > > >>>> --
> > >
> > > >>>> Regards - Ernesto Reinaldo Barreiro
> > >
> > > >>
> > >
> > > >>
> > >
> > > >>
> > >
> > > >> --
> > >
> > > >> Regards - Ernesto Reinaldo Barreiro
> > >
> > > >
> > >
> > > >
> > >
> > > >
> > >
> > > > --
> > >
> > > > Regards - Ernesto Reinaldo Barreiro
> > >
> > >
> > >
> > >
> >
> >
> > --
> > Regards - Ernesto Reinaldo Barreiro
> >
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
> > For additional commands, e-mail: users-help@wicket.apache.org
> >
> >
>



-- 
Regards - Ernesto Reinaldo Barreiro

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message