<span class="Apple-style-span" style="font-family: 'Times New Roman'; font-size: 16px; "><div style="margin-top: 6px; margin-right: 6px; margin-bottom: 6px; margin-left: 6px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Verdana; font-size: 10pt; background-color: rgb(255, 255, 255); min-height: 1100px; counter-reset: __goog_page__ 0; line-height: normal; ">
SUMMARY<br><div class="im" style="margin-top: 0px; margin-bottom: 0px; color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); "><br>There currently is no way to detect the system idle state in the browser.  This makes it difficult to deal with any sort of chat room or instant messaging client inside the browser since the idle will always be incorrect.<br>
<br>USE CASE<br><br>Any instant messaging client, or any client that requires user presence, will use this to keep track of the users idle state.  Currently the idle state of a user inside a browser tell tend to be incorrect, and this leads to problems with people being unable to rely on the available status of a user.  Without this information it is difficult to do a full featured and reliable instant messaging client inside the browser since this makes the users' status somewhat unreliable.<br>
<br>Lots of social networking sites and other sites centered around user interactions on the net keep track of the users idle state for enabling interactions with people that are currently online, this would be especially useful for interactive online gaming.<br>
<br>A process that would like to do some heavy duty processing, like seti@home, could use the system idle detection to enable the processing only when the user is idle and enable it to not interfere with or degrade their normal browsing experience.<br>
<br>WORK AROUNDS<br><br>The idle state of the user is currently detected by looking at the brower window and detecting the last activity time for the window.  This is inaccurate since if the user is not looking at the page the state will be incorrect and means that the idle time is set to longer than would be desirable so there is also a window in which the user is actually idle but it has not yet been detected.<br>
<br>PROPOSAL</div><br style="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); "><span style="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); ">I propose an api which takes in a timeout for idle, the user agent calls the callback when the state changes.  Active->idle, Active->away, idle->away, idle->active, away->active.</span><br style="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); ">
<div class="im" style="margin-top: 0px; margin-bottom: 0px; color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); "><br>The idle times are all specified in seconds, the handler will be called when the idle state changes with two arguments and then any user specified arguments.  The two arguments are the idle state and the idle time, the idle time should be the length of time the system is currently idle for and the state should be one of idle, active or locked (screen saver).  The handler can be specified as a handler or as a string.<br>
<br><div style="margin-top: 0px; margin-bottom: 0px; ">Not explicitly specified, and thus intentionally left to the UA, include:</div><div style="margin-top: 0px; margin-bottom: 0px; ">* The minimum time the system must be idle before the UA will report it [1]<br>
</div><div style="margin-top: 0px; margin-bottom: 0px; ">* Any jitter intentionally added to the idle times reported [1]<br></div><div style="margin-top: 0px; margin-bottom: 0px; ">* The granularity of the times reported (e.g. a UA may round them to multiples of 15 seconds)</div>
</div><div class="im" style="margin-top: 0px; margin-bottom: 0px; color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); "><div style="margin-top: 0px; margin-bottom: 0px; "><br><font face="Courier New">[NoInterfaceObject, ImplementedOn=<a href="http://www.w3.org/TR/html5/browsers.html#window">Window</a>] interface WindowTimers {<br>
// timers<br>long <a href="http://www.w3.org/TR/html5/no.html#dom-windowtimers-settimeout" title="dom-windowtimers-setTimeout">setSystemIdleCallback</a>(in <a href="http://www.w3.org/TR/html5/no.html#timeouthandler">TimeoutHandler</a> handler, in long idleTimeoutSec);<br>
long <font face="Courier New"><a href="http://www.w3.org/TR/html5/no.html#dom-windowtimers-settimeout" title="dom-windowtimers-setTimeout">setSystemIdleCallback</a></font>(in <a href="http://www.w3.org/TR/html5/no.html#timeouthandler">TimeoutHandler</a> handler, in long <font face="Courier New">idleTimeout</font>Sec, arguments...);<br>
long <font face="Courier New"><a href="http://www.w3.org/TR/html5/no.html#dom-windowtimers-settimeout" title="dom-windowtimers-setTimeout">setSystemIdleCallback</a></font>(in DOMString code, in long <font face="Courier New">idleTimeout</font>Sec);<br>
long <font face="Courier New"><a href="http://www.w3.org/TR/html5/no.html#dom-windowtimers-settimeout" title="dom-windowtimers-setTimeout">setSystemIdleCallback</a></font>(in DOMString code, in long <font face="Courier New">idleTimeout</font>Sec, in DOMString language);<br>
void <a href="http://www.w3.org/TR/html5/no.html#dom-windowtimers-cleartimeout" title="dom-windowtimers-clearTimeout">clearSystemIdleCallback</a>(in long handle);<br>// Returns the current system idle state.<br>int systemIdleState();<br>
<br>[Callback=FunctionOnly, NoInterfaceObject]<br>interface TimeoutHandler {<br>void <span title="dom-TimeoutHandler-handleEvent">handleEvent</span>(idleState, idleTime, [Variadic] in any args);<br>};</font><br></div><br>
Where idleState is one of:<br>  idleState : active = 1, idle = 2, away = 3<br><br>Away is defined as locked/screen saver enabled or any other system mechanism that is defined as away.<br><br></div><span style="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); ">This is based on the setTimeout api at <a href="http://www.w3.org/TR/html5/no.html">http://www.w3.org/TR/html5/no.html</a><br>
<br>ALTERNATIVES<br><br>This could be made simple an event listener, where the browser itself keeps track of the length of time that is considered idle and fires an event when the state changes.<br><br><div style="margin-top: 0px; margin-bottom: 0px; ">
setSystemIdleCallback(<font size="2">in <a href="http://www.w3.org/TR/html5/no.html#timeouthandler" target="_blank" style="color: rgb(0, 84, 136); ">IdleHandler</a> handler)</font></div><br>The downside to this is that it would mean all components on the browser would share the same idle time, which would reduce the ability of components to choose the most efficent idle time for their use case.  Some IM clients might require the user to be there within a very short of period of time to increase the likelyhood of finding a person.  It would also not let the components let the user choose their idle time.<br>
<br>The upside to this proposal is it would be a lot simpler.<br></span><br>REFERENCES<br><br>1] There is research showing that it is possible to detemine a users key strokes and which keys they are actually typeing by using millisecond accuracy idle time information.  This is the reason this spec emphasises the jitter and granularity aspects of the idle detection.<br>
<a href="http://portal.acm.org/citation.cfm?id=1267637" target="_blank">http://portal.acm.org/citation.cfm?id=1267637</a><br><div style="margin-top: 0px; margin-bottom: 0px; color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); ">
 </div><span style="font-family: Times; color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); "><font size="3"><font face="arial, helvetica, sans-serif">Questions, Comments, etc.</font></font><div style="margin-top: 0px; margin-bottom: 0px; ">
<font size="3"> </font></div><font size="3"><font face="arial, helvetica, sans-serif">What do others think of this addition? Does anyone have an idea for a better API?</font></font></span><br style="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); ">
</div></span>