- From: Kyle Simpson <getify@gmail.com>
- Date: Wed, 15 Jun 2011 12:11:47 -0500
- To: <public-web-perf@w3.org>
I've already expressed in previous threads my concerns with PageVisibility:
1. confusions of the various conditions under which a window goes through
visible (and partially visible) states in various OS's and devices
2. It lacks the "de-bouncing" inherently required to effectively work with
it as a "throttling" trigger for various activities (meaning we'll have to
manually author setTimeout type de-bouncing every time).
3. That this interface basically looks like a half-attempt at a PageIdle
API, which would serve all use-cases of PageVisibility adequately, except
for the "prerender" use-case (for Chrome only, currently). Implementing an
API as a standard so that only one browser can experiment seems premature
and unhealthy.
-----------------
However, I want to add to that discussion some more concerns I have,
specifically with how PageVisibility will necessarily be used in the
Chrome-prerendering (officially announced now) functionality:
1. How will PageVisibility affect (or not) certain functionality that
"automatically" happens on a page, such as "autoplay" on a video element, or
"autofocus" on a <input> box (and there are others which are not JavaScript
based)? In those cases, it might be quite desirable to have them not happen
until the page is actually rendered/visible (for the input autofocus, it
might be an animation that occurs on the focus event, or it might be
analytics gathering on the focus event, etc).
It's quite unclear how PV could/should interact or affect (delay?) such
behaviors? Does even the question of such overlap between JavaScript and
automatic markup-driven events open a pandora's box of potential
complications?
2. It's obvious that PageVisibility was originally intended as a broader
concern than just the prerendering, but it's also clear that the
prerendering is (now) a major reason why it's being kept (despite my
previous concerns), instead of my proposal to simplify to just the PageIdle
approach (which doesn't address the prerendering use-case). Since the two
are so closely related, I think it's fair to combine concerns of
prerendering as a feature with concerns of PageVisibility itself as an
approach.
Based on that, it should be pointed out (spelled out explicity in Chrome's
blog post, btw) that my page could be forced into working not in the way I
intended (that is, rendering before being visible) if any other author on
the web lists my URL in their <link rel=prerender> tag, and then presents a
link with that URL which a user follows. That user could end up on my page
"too late", in that they miss out on important earlier rendering.
So, I as a web author am now forced into dealing with PageVisibility if I
have anything on my pages which I really want my users to see when they
first arrive. This is rather hostile to say the least.
3. It's fair to say that there's a lot of code on web pages that authors
would like to have execute invisibly to the user (to prevent FUOC/FUBC and
other undesirable UX, etc). So, on the surface, this prerender functionality
seems quite useful.
But, there's also a non-trivial amount of code on the web that authors
probably *want* the user to see, like visual effects/animations, etc. So
authors will now have to segment out their code to what they "want" to
happen invisibly during prerendering, and what they "want" to have happen
visibly while the user is seeing the page. Existing pages which do not take
this into account could, rather suddenly (as Chrome rolls out prerendering),
start seeing less than desired behavior.
Which then leads to the question, how easy is it for a page to adjust to
take PV/prerendering into account?
The nature of code on web pages today is that code already has to dance a
somewhat less-than-ideal tango where it straddles on, between, or after
DOMready and window.onload events. But the `visibilitychange` (VC) event
will now introduce a third event to factor into this, which by its nature
will complicate things significantly.
Since the VC event can come before, between, or after window.onload, it
means that a more complicated "event gate" system must be employed, to make
sure that your code runs at the proper time, and not too early. Consider
this code (which only deals with DOMready and PV, ignoring onload for now):
function doThisWhenDOMIsReadyAndPageIsVisible() {
// ...
}
(function(){
var events_fired = {
domready: document.readyState == "complete"
visible: document.visibilityState == "visible"
}
;
function check_events() {
if (events_fired["domready"] && events_fired["visible"]) {
doThisWhenDOMIsReadyAndPageIsVisible();
}
}
if (!events_fired["domready"]) {
document.addEventListener("DOMContentLoaded", function() {
events_fired["domready"] = true;
check_events();
}, false);
}
if (!events_fired["visible"]) {
document.addEventListener("visibilitychange", function VC() {
document.removeEventListener("visibilitychange", VC);
events_fired["visible"] = true;
check_events();
}, false);
}
check_events();
})();
Add in code that needs to wait for window.onload, and this code gets even
more messy. Nevertheless, that type of complicated event handling is, I
think, a deal breaker in terms of me ever wanting to use such a feature.
For instance, we *could* have considered simply making the first "page is
visible" event delay the window.onload, so that existing event handling
wouldn't need nearly as much extra complexity. `window.onload` is already
guaranteed to run after DOMContentLoaded, so the event-gating is unecessary.
PV being able to run at any time means that it requires more sophisticated
and brittle event handling logic. Considering code like the above, I think
the onus is too much on web authors.
Bottom line: I'm quite un-thrilled that I may be "forced" into dealing with
this complication (if there's indeed no effective "opt-out" to prevent a
<link rel=prerender> on some other page I don't control from triggering
pre-rendering of my pages).
--Kyle
Received on Wednesday, 15 June 2011 17:12:29 UTC