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 7903b3eddd9cb69bdf70d35beee5e208a9e1d90d..0a3ab70359a74592738ada756108d5d309744e74 100644 |
| --- a/chrome/test/data/prerender/prerender_events_common.js |
| +++ b/chrome/test/data/prerender/prerender_events_common.js |
| @@ -10,66 +10,79 @@ |
| // Currently only errors with the ordering of Prerender events are caught. |
| var hadPrerenderEventErrors = false; |
| -var receivedPrerenderStartEvents = []; |
| -var receivedPrerenderLoadEvents = []; |
| -var receivedPrerenderDomContentLoadedEvents = []; |
| -var receivedPrerenderStopEvents = []; |
| - |
| -function PrerenderStartHandler(index) { |
| - if (receivedPrerenderStartEvents[index] || |
| - receivedPrerenderLoadEvents[index] || |
| - receivedPrerenderStopEvents[index]) { |
| - hadPrerenderEventErrors = true; |
| - return; |
| +var receivedPrerenderEvents = { |
| + 'webkitprerenderstart': [], |
| + 'webkitprerenderdomcontentloaded': [], |
| + 'webkitprerenderload': [], |
| + 'webkitprerenderstop': [], |
| +} |
| +// A list of callbacks to be called on every prerender event. Each callback |
| +// returns true if it should never be called again, or false to remain in the |
| +// list. These are used to implement WaitForPrerenderEventCount. |
|
mmenke
2014/02/14 19:25:44
Maybe "... to remain in the list and be called on
davidben
2014/02/14 19:38:13
Done.
|
| +var prerenderEventCallbacks = []; |
| + |
| +function GetPrerenderEventCount(index, type) { |
| + return receivedPrerenderEvents[type][index] || 0; |
| +} |
| + |
| +function PrerenderEventHandler(index, ev) { |
| + // Check for errors. |
| + if (ev.type == 'webkitprerenderstart') { |
| + // No event may preceed start. |
| + if (GetPrerenderEventCount(index, 'webkitprerenderstart') || |
| + GetPrerenderEventCount(index, 'webkitprerenderdomcontentloaded') || |
| + GetPrerenderEventCount(index, 'webkitprerenderload') || |
| + GetPrerenderEventCount(index, 'webkitprerenderstop')) { |
| + hadPrerenderEventErrors = true; |
| + } |
| + } else { |
| + // There may be multiple load or domcontentloaded events, but they must not |
| + // come after start and must come before stop. And there may be at most one |
| + // start. Note that stop may be delivered without any load events. |
| + if (!GetPrerenderEventCount(index, 'webkitprerenderstart') || |
| + GetPrerenderEventCount(index, 'webkitprerenderstop')) { |
| + hadPrerenderEventErrors = true; |
| + } |
| } |
| - receivedPrerenderStartEvents[index] = true; |
| -} |
| -function PrerenderLoadHandler(index) { |
| - if (!receivedPrerenderStartEvents[index] || |
| - receivedPrerenderStopEvents[index]) { |
| - hadPrerenderEventErrors = true; |
| - return; |
| - } |
| - if (!receivedPrerenderLoadEvents[index]) |
| - receivedPrerenderLoadEvents[index] = 0; |
| - receivedPrerenderLoadEvents[index]++; |
| -} |
| + // Update count. |
| + receivedPrerenderEvents[ev.type][index] = |
| + (receivedPrerenderEvents[ev.type][index] || 0) + 1; |
| -function PrerenderDomContentLoadedHandler(index) { |
| - if (!receivedPrerenderStartEvents[index] || |
| - receivedPrerenderStopEvents[index]) { |
| - hadPrerenderEventErrors = true; |
| - return; |
| - } |
| - if (!receivedPrerenderDomContentLoadedEvents[index]) |
| - receivedPrerenderDomContentLoadedEvents[index] = 0; |
| - receivedPrerenderDomContentLoadedEvents[index]++; |
| + // Run all callbacks. Remove the ones that are done. |
| + prerenderEventCallbacks = prerenderEventCallbacks.filter(function(callback) { |
| + return !callback(); |
| + }); |
| } |
| -function PrerenderStopHandler(index) { |
| - if (!receivedPrerenderStartEvents[index] || |
| - receivedPrerenderStopEvents[index]) { |
| - hadPrerenderEventErrors = true; |
| - return; |
| - } |
| - receivedPrerenderStopEvents[index] = true; |
| +// 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); |
| - link.addEventListener('webkitprerenderload', |
| - PrerenderLoadHandler.bind(null, index), false); |
| + PrerenderEventHandler.bind(null, index), false); |
| link.addEventListener('webkitprerenderdomcontentloaded', |
| - PrerenderDomContentLoadedHandler.bind(null, index), |
| - false); |
| + PrerenderEventHandler.bind(null, index), false); |
| + link.addEventListener('webkitprerenderload', |
| + 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); |
| @@ -77,6 +90,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; |