diff options
Diffstat (limited to 'toolkit/mozapps/webextensions/test/browser/browser_metadataTimeout.js')
-rw-r--r-- | toolkit/mozapps/webextensions/test/browser/browser_metadataTimeout.js | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/toolkit/mozapps/webextensions/test/browser/browser_metadataTimeout.js b/toolkit/mozapps/webextensions/test/browser/browser_metadataTimeout.js new file mode 100644 index 000000000..98be4b7f8 --- /dev/null +++ b/toolkit/mozapps/webextensions/test/browser/browser_metadataTimeout.js @@ -0,0 +1,114 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ + */ + +// Test how update window behaves when metadata ping times out +// bug 965788 + +const URI_EXTENSION_UPDATE_DIALOG = "chrome://mozapps/content/extensions/update.xul"; + +const PREF_GETADDONS_BYIDS = "extensions.getAddons.get.url"; +const PREF_MIN_PLATFORM_COMPAT = "extensions.minCompatiblePlatformVersion"; +const PREF_METADATA_LASTUPDATE = "extensions.getAddons.cache.lastUpdate"; + +Components.utils.import("resource://gre/modules/Promise.jsm"); + +var repo = {}; +var ARContext = Components.utils.import("resource://gre/modules/addons/AddonRepository.jsm", repo); + +// Mock out the XMLHttpRequest factory for AddonRepository so +// we can reply with a timeout +var pXHRStarted = Promise.defer(); +var oldXHRConstructor = ARContext.ServiceRequest; +ARContext.ServiceRequest = function() { + this._handlers = new Map(); + this.mozBackgroundRequest = false; + this.timeout = undefined; + this.open = function(aMethod, aURI, aAsync) { + this.method = aMethod; + this.uri = aURI; + this.async = aAsync; + info("Opened XHR for " + aMethod + " " + aURI); + }; + this.overrideMimeType = function(aMimeType) { + this.mimeType = aMimeType; + }; + this.addEventListener = function(aEvent, aHandler, aCapture) { + this._handlers.set(aEvent, aHandler); + }; + this.send = function(aBody) { + info("Send XHR for " + this.method + " " + this.uri + " handlers: " + [this._handlers.keys()].join(", ")); + pXHRStarted.resolve(this); + } +}; + + +// Returns promise{window}, resolves with a handle to the compatibility +// check window +function promise_open_compatibility_window(aInactiveAddonIds) { + let deferred = Promise.defer(); + // This will reset the longer timeout multiplier to 2 which will give each + // test that calls open_compatibility_window a minimum of 60 seconds to + // complete. + requestLongerTimeout(2); + + var variant = Cc["@mozilla.org/variant;1"]. + createInstance(Ci.nsIWritableVariant); + variant.setFromVariant(aInactiveAddonIds); + + // Cannot be modal as we want to interract with it, shouldn't cause problems + // with testing though. + var features = "chrome,centerscreen,dialog,titlebar"; + var ww = Cc["@mozilla.org/embedcomp/window-watcher;1"]. + getService(Ci.nsIWindowWatcher); + var win = ww.openWindow(null, URI_EXTENSION_UPDATE_DIALOG, "", features, variant); + + win.addEventListener("load", function() { + function page_shown(aEvent) { + if (aEvent.target.pageid) + info("Page " + aEvent.target.pageid + " shown"); + } + + win.removeEventListener("load", arguments.callee, false); + + info("Compatibility dialog opened"); + + win.addEventListener("pageshow", page_shown, false); + win.addEventListener("unload", function() { + win.removeEventListener("unload", arguments.callee, false); + win.removeEventListener("pageshow", page_shown, false); + dump("Compatibility dialog closed\n"); + }, false); + + deferred.resolve(win); + }, false); + return deferred.promise; +} + +function promise_window_close(aWindow) { + let deferred = Promise.defer(); + aWindow.addEventListener("unload", function() { + aWindow.removeEventListener("unload", arguments.callee, false); + deferred.resolve(aWindow); + }, false); + return deferred.promise; +} + +// Start the compatibility update dialog, but use the mock XHR to respond with +// a timeout +add_task(function* amo_ping_timeout() { + Services.prefs.setBoolPref(PREF_GETADDONS_CACHE_ENABLED, true); + Services.prefs.clearUserPref(PREF_METADATA_LASTUPDATE); + let compatWindow = yield promise_open_compatibility_window([]); + + let xhr = yield pXHRStarted.promise; + is(xhr.timeout, 30000, "XHR request should have 30 second timeout"); + ok(xhr._handlers.has("timeout"), "Timeout handler set on XHR"); + // call back the timeout handler + xhr._handlers.get("timeout")(); + + // Put the old XHR constructor back + ARContext.ServiceRequest = oldXHRConstructor; + // The window should close without further interaction + yield promise_window_close(compatWindow); +}); |