This would be a nice addition... seems like an event plus a read-only property on the &#39;window&#39; object could work.<div><br></div><div>window.idleState;</div><div>window.onidlestatechange = function(e) {...}</div><div>
<br></div><div><br></div><div><div class="gmail_quote">On Fri, Aug 28, 2009 at 3:40 PM, Jonas Sicking <span dir="ltr">&lt;jonas@sicking.cc&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div><div></div><div class="h5">On Fri, Aug 28, 2009 at 2:47 PM, David Bennett&lt;<a href="mailto:ddt@google.com">ddt@google.com</a>&gt; wrote:<br>
&gt; SUMMARY<br>
&gt;<br>
&gt; There currently is no way to detect the system idle state in the browser.<br>
&gt; This makes it difficult to deal with any sort of chat room or instant<br>
&gt; messaging client inside the browser since the idle will always be incorrect.<br>
&gt;<br>
&gt; USE CASE<br>
&gt;<br>
&gt; Any instant messaging client, or any client that requires user presence,<br>
&gt; will use this to keep track of the users idle state.  Currently the idle<br>
&gt; state of a user inside a browser tell tend to be incorrect, and this leads<br>
&gt; to problems with people being unable to rely on the available status of a<br>
&gt; user.  Without this information it is difficult to do a full featured and<br>
&gt; reliable instant messaging client inside the browser since this makes the<br>
&gt; users&#39; status somewhat unreliable.<br>
&gt;<br>
&gt; Lots of social networking sites and other sites centered around user<br>
&gt; interactions on the net keep track of the users idle state for enabling<br>
&gt; interactions with people that are currently online, this would be especially<br>
&gt; useful for interactive online gaming.<br>
&gt;<br>
&gt; A process that would like to do some heavy duty processing, like seti@home,<br>
&gt; could use the system idle detection to enable the processing only when the<br>
&gt; user is idle and enable it to not interfere with or degrade their normal<br>
&gt; browsing experience.<br>
&gt;<br>
&gt; WORK AROUNDS<br>
&gt;<br>
&gt; The idle state of the user is currently detected by looking at the brower<br>
&gt; window and detecting the last activity time for the window.  This is<br>
&gt; inaccurate since if the user is not looking at the page the state will be<br>
&gt; incorrect and means that the idle time is set to longer than would be<br>
&gt; desirable so there is also a window in which the user is actually idle but<br>
&gt; it has not yet been detected.<br>
&gt;<br>
&gt; PROPOSAL<br>
&gt; I propose an api which takes in a timeout for idle, the user agent calls the<br>
&gt; callback when the state changes.  Active-&gt;idle, Active-&gt;away, idle-&gt;away,<br>
&gt; idle-&gt;active, away-&gt;active.<br>
&gt;<br>
&gt; The idle times are all specified in seconds, the handler will be called when<br>
&gt; the idle state changes with two arguments and then any user specified<br>
&gt; arguments.  The two arguments are the idle state and the idle time, the idle<br>
&gt; time should be the length of time the system is currently idle for and the<br>
&gt; state should be one of idle, active or locked (screen saver).  The handler<br>
&gt; can be specified as a handler or as a string.<br>
&gt;<br>
&gt; Not explicitly specified, and thus intentionally left to the UA, include:<br>
&gt; * The minimum time the system must be idle before the UA will report it [1]<br>
&gt; * Any jitter intentionally added to the idle times reported [1]<br>
&gt; * The granularity of the times reported (e.g. a UA may round them to<br>
&gt; multiples of 15 seconds)<br>
&gt; [NoInterfaceObject, ImplementedOn=Window] interface WindowTimers {<br>
&gt; // timers<br>
&gt; long setSystemIdleCallback(in TimeoutHandler handler, in long<br>
&gt; idleTimeoutSec);<br>
&gt; long setSystemIdleCallback(in TimeoutHandler handler, in<br>
&gt; long idleTimeoutSec, arguments...);<br>
&gt; long setSystemIdleCallback(in DOMString code, in long idleTimeoutSec);<br>
&gt; long setSystemIdleCallback(in DOMString code, in long idleTimeoutSec, in<br>
&gt; DOMString language);<br>
&gt; void clearSystemIdleCallback(in long handle);<br>
&gt; // Returns the current system idle state.<br>
&gt; int systemIdleState();<br>
&gt;<br>
&gt; [Callback=FunctionOnly, NoInterfaceObject]<br>
&gt; interface TimeoutHandler {<br>
&gt; void handleEvent(idleState, idleTime, [Variadic] in any args);<br>
&gt; };<br>
&gt;<br>
&gt; Where idleState is one of:<br>
&gt;   idleState : active = 1, idle = 2, away = 3<br>
&gt;<br>
&gt; Away is defined as locked/screen saver enabled or any other system mechanism<br>
&gt; that is defined as away.<br>
&gt;<br>
&gt; This is based on the setTimeout api at <a href="http://www.w3.org/TR/html5/no.html" target="_blank">http://www.w3.org/TR/html5/no.html</a><br>
&gt;<br>
&gt; ALTERNATIVES<br>
&gt;<br>
&gt; This could be made simple an event listener, where the browser itself keeps<br>
&gt; track of the length of time that is considered idle and fires an event when<br>
&gt; the state changes.<br>
&gt;<br>
&gt; setSystemIdleCallback(in IdleHandler handler)<br>
&gt; The downside to this is that it would mean all components on the browser<br>
&gt; would share the same idle time, which would reduce the ability of components<br>
&gt; to choose the most efficent idle time for their use case.  Some IM clients<br>
&gt; might require the user to be there within a very short of period of time to<br>
&gt; increase the likelyhood of finding a person.  It would also not let the<br>
&gt; components let the user choose their idle time.<br>
&gt;<br>
&gt; The upside to this proposal is it would be a lot simpler.<br>
&gt;<br>
&gt; REFERENCES<br>
&gt;<br>
&gt; 1] There is research showing that it is possible to detemine a users key<br>
&gt; strokes and which keys they are actually typeing by using millisecond<br>
&gt; accuracy idle time information.  This is the reason this spec emphasises the<br>
&gt; jitter and granularity aspects of the idle detection.<br>
&gt; <a href="http://portal.acm.org/citation.cfm?id=1267637" target="_blank">http://portal.acm.org/citation.cfm?id=1267637</a><br>
&gt;<br>
&gt; Questions, Comments, etc.<br>
&gt;<br>
&gt; What do others think of this addition? Does anyone have an idea for a better<br>
&gt; API?<br>
<br>
</div></div>Seems like an event would be a better solution. For example fire a<br>
&#39;idlestatechange&#39; event with the following API:<br>
<br>
interface IdleStateChangeEvent : Event<br>
{<br>
  const unsigned short AWAY;<br>
  const unsigned short ACTIVE;<br>
  const unsigned short IDLE;<br>
<br>
  readonly attribute unsigned short idleState;<br>
};<br>
<font color="#888888"><br>
/ Jonas<br>
</font></blockquote></div><br></div>