Chromium Code Reviews| Index: chrome/test/data/prerender/prerender_events_common.js |
| diff --git a/chrome/test/data/prerender/prerender_events_common.js b/chrome/test/data/prerender/prerender_events_common.js |
| index 74fb184ef637c2605e71bd89deee638f019141ca..56783c51151693c4272ac04c240c273611fef2e8 100644 |
| --- a/chrome/test/data/prerender/prerender_events_common.js |
| +++ b/chrome/test/data/prerender/prerender_events_common.js |
| @@ -10,51 +10,73 @@ |
| // Currently only errors with the ordering of Prerender events are caught. |
| var hadPrerenderEventErrors = false; |
| -var receivedPrerenderStartEvents = []; |
| -var receivedPrerenderLoadEvents = []; |
| -var receivedPrerenderStopEvents = []; |
| - |
| -function PrerenderStartHandler(index) { |
| - if (receivedPrerenderStartEvents[index] || |
| - receivedPrerenderLoadEvents[index] || |
| - receivedPrerenderStopEvents[index]) { |
| - hadPrerenderEventErrors = true; |
| - return; |
| - } |
| - receivedPrerenderStartEvents[index] = true; |
| +var receivedPrerenderEvents = { |
| + 'webkitprerenderstart': [], |
| + 'webkitprerenderload': [], |
| + 'webkitprerenderstop': [], |
| } |
| +var prerenderEventCallbacks = []; |
| -function PrerenderLoadHandler(index) { |
| - if (!receivedPrerenderStartEvents[index] || |
| - receivedPrerenderStopEvents[index]) { |
| - hadPrerenderEventErrors = true; |
| - return; |
| - } |
| - if (!receivedPrerenderLoadEvents[index]) |
| - receivedPrerenderLoadEvents[index] = 0; |
| - receivedPrerenderLoadEvents[index]++; |
| +function GetPrerenderEventCount(index, type) { |
| + return receivedPrerenderEvents[type][index] || 0; |
| } |
| -function PrerenderStopHandler(index) { |
| - if (!receivedPrerenderStartEvents[index] || |
| - receivedPrerenderStopEvents[index]) { |
| - hadPrerenderEventErrors = true; |
| - return; |
| +function PrerenderEventHandler(index, ev) { |
| + // Check for errors. |
| + if (ev.type == 'webkitprerenderstart') { |
| + if (GetPrerenderEventCount(index, 'webkitprerenderstart') || |
| + GetPrerenderEventCount(index, 'webkitprerenderload') || |
| + GetPrerenderEventCount(index, 'webkitprerenderstop')) { |
| + hadPrerenderEventErrors = true; |
| + } |
| + } else if (ev.type == 'webkitprerenderload') { |
| + if (!GetPrerenderEventCount(index, 'webkitprerenderstart') || |
| + GetPrerenderEventCount(index, 'webkitprerenderstop')) { |
|
mmenke
2014/02/13 16:34:33
Can we get multiple load events? I guess if a pag
davidben
2014/02/14 01:01:13
Done. Yeah, multiple loads are possible.
|
| + hadPrerenderEventErrors = true; |
|
mmenke
2014/02/14 17:33:01
Why did you delete this block?
davidben
2014/02/14 19:18:26
The check for all the events other than webkitprer
mmenke
2014/02/14 19:25:44
Good point.
|
| + } |
| + } else if (ev.type == 'webkitprerenderstop') { |
| + if (!GetPrerenderEventCount(index, 'webkitprerenderstart') || |
| + GetPrerenderEventCount(index, 'webkitprerenderstop')) { |
|
mmenke
2014/02/13 16:34:33
Think it's worth commenting that there may or may
davidben
2014/02/14 01:01:13
Done.
|
| + hadPrerenderEventErrors = true; |
| + } |
| } |
| - receivedPrerenderStopEvents[index] = true; |
| + |
| + // Update count. |
| + receivedPrerenderEvents[ev.type][index] = |
| + (receivedPrerenderEvents[ev.type][index] || 0) + 1; |
|
mmenke
2014/02/13 16:34:33
nit: +2 indent.
davidben
2014/02/14 01:01:13
Done.
|
| + |
| + // Run all callbacks. Remove the ones that are done. |
|
mmenke
2014/02/13 16:34:33
There's no documentation of how these callbacks sh
davidben
2014/02/14 01:01:13
Done.
|
| + prerenderEventCallbacks = prerenderEventCallbacks.filter(function(cb) { |
|
mmenke
2014/02/13 16:34:33
nit: "cb" is more often writen out.
davidben
2014/02/14 01:01:13
Done.
|
| + return !cb(); |
| + }); |
| +} |
| + |
| +// Calls |callback| when at least |count| instances of event |type| have been |
| +// observed for prerender |index|. |
| +function WaitForPrerenderEventCount(index, type, count, callback) { |
| + var checkCount = function() { |
| + if (GetPrerenderEventCount(index, type) >= count) { |
| + callback(); |
| + return true; |
| + } |
| + return false; |
| + }; |
| + if (!checkCount()) |
| + prerenderEventCallbacks.push(checkCount); |
| } |
| function AddEventHandlersToLinkElement(link, index) { |
| link.addEventListener('webkitprerenderstart', |
| - PrerenderStartHandler.bind(null, index), false); |
| + PrerenderEventHandler.bind(null, index), false); |
| link.addEventListener('webkitprerenderload', |
| - PrerenderLoadHandler.bind(null, index), false); |
| + PrerenderEventHandler.bind(null, index), false); |
| link.addEventListener('webkitprerenderstop', |
| - PrerenderStopHandler.bind(null, index), false); |
| + PrerenderEventHandler.bind(null, index), false); |
| } |
| function AddPrerender(url, index) { |
| var link = document.createElement('link'); |
| + link.id = 'prerenderElement' + index; |
| link.rel = 'prerender'; |
| link.href = url; |
| AddEventHandlersToLinkElement(link, index); |
| @@ -62,6 +84,19 @@ function AddPrerender(url, index) { |
| return link; |
| } |
| +function RemoveLinkElement(index) { |
| + var link = document.getElementById('prerenderElement' + index); |
| + link.parentElement.removeChild(link); |
| +} |
| + |
| +function ExtractGetParameterBadlyAndInsecurely(param, defaultValue) { |
| + var re = RegExp('[&?]' + param + '=([^&?#]*)'); |
| + var result = re.exec(document.location); |
| + if (result) |
| + return result[1]; |
| + return defaultValue; |
| +} |
| + |
| function AddAnchor(href, target) { |
| var a = document.createElement('a'); |
| a.href = href; |