wicket-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Martin Grigorov <mgrigo...@apache.org>
Subject Re: Ajax timer not counting when tab doesn't have focus?
Date Mon, 12 May 2014 19:28:12 GMT
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
>
>

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