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..6d125e1e0a20ef9ee82fe263d2b282db2c47c048 100644 |
--- a/chrome/test/data/prerender/prerender_events_common.js |
+++ b/chrome/test/data/prerender/prerender_events_common.js |
@@ -10,66 +10,80 @@ |
// 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 and be called on future events. These are used to implement |
+// WaitForPrerenderEventCount. |
+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 +91,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; |