- From: Dominique Hazael-Massieux <dom@w3.org>
- Date: Wed, 28 May 2014 18:39:43 +0200
- To: Marcos Caceres <w3c@marcosc.com>
- Cc: Marcos <marcos@marcosc.com>, "public-device-apis@w3.org" <public-device-apis@w3.org>, Frederick Hirsch <w3c@fjhirsch.com>, "Kostiainen, Anssi" <anssi.kostiainen@intel.com>, Mats Wichmann <m.wichmann@samsung.com>
Le mercredi 28 mai 2014 à 12:15 -0400, Marcos Caceres a écrit : > > requestWakeLock makes it easy to forget to remove the lock; poke() makes > > it harder (the wake lock disappears as soon as you stop poking). > > Sure, but poke() has the uncertainty of not knowing when you last > poked and how long the poke lasts (5 seconds? 30 seconds? 1 min?). So > you still need to manage state or setInterval(). Thus, you still end > up with harmless, but useless, repetitive loop of method calls in > blind hope that it has an effect. If you need setInterval most of the times, I agree poke() is useless; but my take is that most of the times you don't (see below), and for cases where the model is basically to never release the wakelock, a simple declarative meta tag is better than an API. > > Another aspect where managing lock will trip people up: if several > > distinct libraries try to manage it, they have to carefully manage the > > state to avoid unlocking someone else's lock. > > That's author error, IMO. (the same way setInterval(navigator.poke,0) would be) > There are few use cases where you want anything but the most simple wake lock: > > 1. always on - e.g., a game > 2. on per request - e.g., a recipe website. But what's the benefit of an API for these? I think a meta tag (or a manifest declaration) would seem simpler. > Can you think of other use cases? * video playing: I don't need the screen to remain up when I pause the video or when it ends * speech controlled app: if I don't interact with it, I probably don't need it to keep the screen up (the same way I don't need it to stay up if I don't touch a touch-controlled app) > > > I just assume people will just do this: > > > //Poke it, because you must never sleep!!! > > > setInterval(poke, 0); > > > > That's certainly a risk. > > I don't think that is a risk: That seems fairly logical because that's > the only way to guarantee you will get what you mean with the API. Well, no; if you mean "something is happening the browser can't detect", setInterval(poke, 0) is absurd. > > That said I think the mental model of replacing > > user interaction with a poke is easier to grasp than managing locks and > > states in asynchronous environments. > > I'm biased, of course. But I find the other approach conceptually > easier to deal with without resulting to setInterval() or hooking into > event loops. We know that, for instance, hooking into onscroll and the > like has a noticeable performance penalty. > > In your proposal you have: > > document.querySelector("video").ontimeupdate = poke; > > Which will potentially generate hundreds, if not thousands, of > unnecessary event objects. To avoid that, you will still need to > manage state. Like using `onvideostart`, `onvideoend`, and having a > PokeManager written in JS that relies on setInterval, so to make sure > you don't flood the system with events (specially on highly > constrained environments... ok, I'm admittedly FUDing here, but > `onscroll` remains a real problem and this potentially introduces new > ones). If there is no way to optimize these events management, I agree that's not very practical; I was (optimistically) assuming there would be easy optimizations, but I'll easily concede that this is wishful thinking at this point :) > > I'm worried that poke() just makes it too easy to fall into traps like > the above - because it's the logical way to use it as your own > proposal's example shows. > > > > When what they want is: > > > screen.getWakeLock(); > > > > > > //If the use leaves and comes back... > > > window.onfocus = () => { > > > //if we've lost the lock > > > if(screen.wakeLockState === "unlocked"){ > > > screen.getWakeLock(); > > > } > > > } > > > > Hmm... My perspective was that losing focus on the tab would stop the > > screen wake lock implicitly (i.e. the screen would be free to dim / lock > > again), not that it would require the developer to re-request it. That > > seems like a recipe for bugs. > > True. So yeah, would be nice if you just keep it once requested (even > as you switch between tabs/windows/apps) - until one chooses to > releaseWakeLock(). > > I still don't think that forgetting to release the wake lock is that big a deal, tho. If it isn't, I'm not sure it's worth going through the trouble of declaring a wake lock API; we might as well just have a declarative toggle. Dom
Received on Wednesday, 28 May 2014 16:40:02 UTC