summaryrefslogtreecommitdiffstats
path: root/dom/tests/mochitest/ajax/offline/test_updatingManifest.html
diff options
context:
space:
mode:
Diffstat (limited to 'dom/tests/mochitest/ajax/offline/test_updatingManifest.html')
-rw-r--r--dom/tests/mochitest/ajax/offline/test_updatingManifest.html346
1 files changed, 346 insertions, 0 deletions
diff --git a/dom/tests/mochitest/ajax/offline/test_updatingManifest.html b/dom/tests/mochitest/ajax/offline/test_updatingManifest.html
new file mode 100644
index 000000000..6d573a926
--- /dev/null
+++ b/dom/tests/mochitest/ajax/offline/test_updatingManifest.html
@@ -0,0 +1,346 @@
+<html xmlns="http://www.w3.org/1999/xhtml" manifest="http://mochi.test:8888/tests/dom/tests/mochitest/ajax/offline/updatingManifest.sjs">
+<head>
+<title>Cache update test</title>
+
+<script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+<script type="text/javascript" src="/tests/dom/tests/mochitest/ajax/offline/offlineTests.js"></script>
+<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+
+<script class="testbody" type="text/javascript">
+
+/**
+ * This test loads manifest and checks presence of all items.
+ * Then it modifies the manifest and updates the cache again.
+ * Then test presence of items according to the spec and also
+ * if the cache associated with the document is still the old
+ * one. Then again modifies the manifest, checks items and finally
+ * swaps cache for this document, reloads and checks document state.
+ */
+
+const NAMESPACE_BYPASS = SpecialPowers.Ci.nsIApplicationCacheNamespace.NAMESPACE_BYPASS;
+const NAMESPACE_FALLBACK = SpecialPowers.Ci.nsIApplicationCacheNamespace.NAMESPACE_FALLBACK;
+
+var gStep = 0;
+var gGotFrameVersion = 0;
+var gCallOnUpdatingFrameLoad = null;
+
+// Helpers
+
+function reloadLocations(frames)
+{
+ for (frame in frames)
+ frames[frame].location.reload();
+}
+
+function waitForLocations(frames, doneFunc)
+{
+ frame = frames.shift();
+ if (frame)
+ // toString() might cause problems when this test will
+ // completely be changed to test IDN behavior.
+ OfflineTest.waitForAdd(frame, function()
+ {
+ waitForLocations(frames, doneFunc);
+ }
+ );
+ else
+ {
+ doneFunc();
+ }
+}
+
+function checkFallbackAndWhitelisting(key, fallback, onwhitelist)
+{
+ // Get matching namespace for the key
+ var matchingNamespace = OfflineTest.getActiveCache()
+ .getMatchingNamespace(key);
+
+ // If we are not expecting the key is to be on white list or
+ // has been assigned a fallback check there is not any matching
+ // namespace found and exit
+ if (!fallback && !onwhitelist) {
+ is(matchingNamespace, null, "No namespace found for "+key);
+ return;
+ }
+
+ // We expect this entry is on the white list or has a fallback
+ // entry assigned, check we found a matching namespace
+ ok(matchingNamespace, "We have a namespace for "+key);
+ if (!matchingNamespace)
+ return;
+
+ // We expect the key be assigned a fallback URI, check the namespace
+ // type is of fallback type
+ OfflineTest.is(!!(matchingNamespace.itemType & NAMESPACE_FALLBACK), !!fallback,
+ (fallback ? "Namespace type is fallback for " : "Namespace type is not fallback for ")+key);
+
+ // We expect the key be assigned a fallback URI, check the URI is
+ // equal to expected one
+ OfflineTest.is(matchingNamespace.data, fallback,
+ (fallback ? "Expected correct fallback for " : "No fallback for ")+key);
+
+ // We expect the key be on the white list, check the namespace type
+ // is of bypass type
+ OfflineTest.is(!!(matchingNamespace.itemType & NAMESPACE_BYPASS), onwhitelist,
+ (onwhitelist ? "On white list " : "Not on white list ")+key);
+}
+
+// Events
+
+function frameLoad(version)
+{
+ gGotFrameVersion = version;
+ if (gCallOnUpdatingFrameLoad)
+ {
+ var call = gCallOnUpdatingFrameLoad;
+ gCallOnUpdatingFrameLoad = null;
+ SimpleTest.executeSoon(OfflineTest.priv(call));
+ }
+}
+
+function whitelistOnLoad(version)
+{
+ // Whitelisting is not tested by this test...
+}
+
+
+// Start of the test function chain
+// ================================
+
+function manifestCached()
+{
+ OfflineTest.is(gStep, 0, "Got manifestCached in step 0, gStep=" + gStep);
+
+ reloadLocations([fallbackFrame1, fallbackFrame2]);
+ waitForLocations(
+ ["http://mochi.test:8888/tests/dom/tests/mochitest/ajax/offline/fallback.html"],
+ fallbackLoaded
+ );
+}
+
+function fallbackLoaded()
+{
+ dump("in fallbackLoaded\n");
+ applicationCache.mozAdd("http://mochi.test:8888/tests/SimpleTest/EventUtils.js");
+ OfflineTest.waitForAdd("http://mochi.test:8888/tests/SimpleTest/EventUtils.js",
+ dynamicLoaded);
+}
+
+function dynamicLoaded()
+{
+ window.open("http://mochi.test:8888/tests/dom/tests/mochitest/ajax/offline/updatingImplicit.html");
+ // window.applicationCache.noupdate invokes implicitLoaded()
+}
+
+function implicitLoaded(aWindow, errorOccured)
+{
+ aWindow.close();
+
+ OfflineTest.ok(!errorOccured, "No error on new implicit page manifest update");
+
+ OfflineTest.waitForAdd("http://mochi.test:8888/tests/dom/tests/mochitest/ajax/offline/updatingImplicit.html",
+ implicitCached);
+}
+
+function implicitCached()
+{
+ // Checking first version of the manifest + another implict page caching
+
+ // Whitelist entries
+ checkFallbackAndWhitelisting("http://mochi.test:8888/tests/dom/tests/mochitest/ajax/offline/onwhitelist.html", "", true);
+
+ // Fallback URI selection check
+ checkFallbackAndWhitelisting("http://mochi.test:8888/tests/dom/tests/mochitest/ajax/offline/namespace1/opp.html",
+ "http://mochi.test:8888/tests/dom/tests/mochitest/ajax/offline/fallback.html", false);
+ checkFallbackAndWhitelisting("http://mochi.test:8888/tests/dom/tests/mochitest/ajax/offline/namespace1/sub/opp.html",
+ "http://mochi.test:8888/tests/dom/tests/mochitest/ajax/offline/fallback.html", false);
+
+ // Cache object status
+ OfflineTest.is(applicationCache.status, SpecialPowers.Ci.nsIDOMOfflineResourceList.IDLE,
+ "we have associated application cache (1)");
+
+ OfflineTest.is(gGotFrameVersion, 1, "IFrame version 1");
+
+ var entries = [
+ // Explicit entries
+ ["http://mochi.test:8888/tests/SimpleTest/SimpleTest.js", false],
+ ["http://mochi.test:8888/tests/dom/tests/mochitest/ajax/offline/offlineTests.js", true],
+
+ // Fallback entries
+ ["http://mochi.test:8888/tests/dom/tests/mochitest/ajax/offline/fallback.html", true],
+ ["http://mochi.test:8888/tests/dom/tests/mochitest/ajax/offline/fallback2.html", false],
+
+ // Whitelist entries
+ ["http://mochi.test:8888/tests/dom/tests/mochitest/ajax/offline/onwhitelist.html", false],
+
+ // Implicit entries
+ ["http://mochi.test:8888/tests/dom/tests/mochitest/ajax/offline/updatingImplicit.html", true],
+
+ // Dynamic entries
+ ["http://mochi.test:8888/tests/SimpleTest/EventUtils.js", true]
+ ];
+ OfflineTest.checkCacheEntries(
+ entries,
+ function() {
+ ++gStep;
+
+ OfflineTest.setSJSState("http://mochi.test:8888/tests/dom/tests/mochitest/ajax/offline/updatingManifest.sjs", "second");
+
+ applicationCache.update();
+ // Invokes manifestUpdated()
+ });
+}
+
+function manifestUpdated()
+{
+ OfflineTest.ok(gStep == 1 || gStep == 2, "Got manifestUpdated in step 1 or 2, gStep=" + gStep);
+
+ switch (gStep)
+ {
+ case 1:
+ // Processing second version of the manifest.
+
+ // Whitelist entries
+ checkFallbackAndWhitelisting("http://mochi.test:8888/tests/dom/tests/mochitest/ajax/offline/onwhitelist.html", "", false);
+
+ // Fallback URI selection check
+ checkFallbackAndWhitelisting("http://mochi.test:8888/tests/dom/tests/mochitest/ajax/offline/namespace1/opp.html",
+ "http://mochi.test:8888/tests/dom/tests/mochitest/ajax/offline/fallback.html", false);
+ checkFallbackAndWhitelisting("http://mochi.test:8888/tests/dom/tests/mochitest/ajax/offline/namespace1/sub/opp.html",
+ "http://mochi.test:8888/tests/dom/tests/mochitest/ajax/offline/fallback2.html", false);
+
+ // Cache object status
+ OfflineTest.is(applicationCache.status, SpecialPowers.Ci.nsIDOMOfflineResourceList.UPDATEREADY,
+ "we have associated application cache and update is pending (2)");
+
+ var entries = [
+ // Explicit entries
+ ["http://mochi.test:8888/tests/SimpleTest/SimpleTest.js", true],
+ ["http://mochi.test:8888/tests/dom/tests/mochitest/ajax/offline/offlineTests.js", true],
+
+ // Fallback entries
+ ["http://mochi.test:8888/tests/dom/tests/mochitest/ajax/offline/fallback.html", true],
+ ["http://mochi.test:8888/tests/dom/tests/mochitest/ajax/offline/fallback2.html", true],
+
+ // Whitelist entries
+ ["http://mochi.test:8888/tests/dom/tests/mochitest/ajax/offline/onwhitelist.html", false],
+
+ // Implicit entries
+ ["http://mochi.test:8888/tests/dom/tests/mochitest/ajax/offline/updatingImplicit.html", true],
+
+ // Dynamic entries
+ ["http://mochi.test:8888/tests/SimpleTest/EventUtils.js", true]
+ ];
+ OfflineTest.checkCacheEntries(
+ entries,
+ function() {
+ ++gStep;
+
+ OfflineTest.setSJSState("http://mochi.test:8888/tests/dom/tests/mochitest/ajax/offline/updatingManifest.sjs", "third");
+ OfflineTest.setSJSState("http://mochi.test:8888/tests/dom/tests/mochitest/ajax/offline/updatingIframe.sjs", "second");
+
+ gGotFrameVersion = 0;
+ updatingFrame.location.reload();
+ // Since the frame is offline-cached, reload of it invokes update
+ });
+
+ break;
+
+ case 2:
+ // Processing third version of the manifest.
+
+ // Whitelist entries
+ checkFallbackAndWhitelisting("http://mochi.test:8888/tests/dom/tests/mochitest/ajax/offline/onwhitelist.html", "", true);
+
+ // Fallback URI selection check
+ checkFallbackAndWhitelisting("http://mochi.test:8888/tests/dom/tests/mochitest/ajax/offline/namespace1/opp.html",
+ "", false);
+ checkFallbackAndWhitelisting("http://mochi.test:8888/tests/dom/tests/mochitest/ajax/offline/namespace1/sub/opp.html",
+ "http://mochi.test:8888/tests/dom/tests/mochitest/ajax/offline/fallback2.html", false);
+
+ // Cache object status
+ OfflineTest.is(applicationCache.status, SpecialPowers.Ci.nsIDOMOfflineResourceList.UPDATEREADY,
+ "we have associated application cache and update is pending (3)");
+
+ OfflineTest.is(gGotFrameVersion, 1, "IFrame version 1 because cache was not swapped");
+
+ var entries = [
+ // Explicit entries
+ ["http://mochi.test:8888/tests/SimpleTest/SimpleTest.js", false],
+ ["http://mochi.test:8888/tests/dom/tests/mochitest/ajax/offline/offlineTests.js", true],
+
+ // Fallback entries
+ ["http://mochi.test:8888/tests/dom/tests/mochitest/ajax/offline/fallback.html", false],
+ ["http://mochi.test:8888/tests/dom/tests/mochitest/ajax/offline/fallback2.html", true],
+
+ // Whitelist entries
+ ["http://mochi.test:8888/tests/dom/tests/mochitest/ajax/offline/onwhitelist.html", false],
+
+ // Implicit entries
+ ["http://mochi.test:8888/tests/dom/tests/mochitest/ajax/offline/updatingImplicit.html", true],
+
+ // Dynamic entries
+ ["http://mochi.test:8888/tests/SimpleTest/EventUtils.js", true]
+ ];
+ OfflineTest.checkCacheEntries(
+ entries,
+ function() {
+ ++gStep;
+
+ applicationCache.onnoupdate = OfflineTest.priv(manifestNoUpdate);
+ applicationCache.update();
+ // Invokes manifestNoUpdate()
+ });
+
+ break;
+ }
+}
+
+function manifestNoUpdate()
+{
+ applicationCache.onnoupdate = null;
+
+ OfflineTest.ok(gStep == 3, "Got manifestNoUpdate in step 3, gStep=" + gStep);
+ ++gStep;
+
+ OfflineTest.is(applicationCache.status, SpecialPowers.Ci.nsIDOMOfflineResourceList.UPDATEREADY,
+ "we have associated application cache and update is pending (4)");
+ applicationCache.swapCache();
+ OfflineTest.is(applicationCache.status, SpecialPowers.Ci.nsIDOMOfflineResourceList.IDLE,
+ "we have associated application cache (4)");
+
+ gGotFrameVersion = 0;
+ gCallOnUpdatingFrameLoad = checkNewVersionOfIFrame;
+ updatingFrame.location.reload();
+}
+
+function checkNewVersionOfIFrame()
+{
+ OfflineTest.is(gGotFrameVersion, 2, "IFrame version 2");
+
+ OfflineTest.teardownAndFinish();
+}
+
+// End of the test function chain
+// ==============================
+
+SimpleTest.waitForExplicitFinish();
+SimpleTest.requestFlakyTimeout("untriaged");
+
+if (OfflineTest.setup()) {
+ applicationCache.onerror = OfflineTest.failEvent;
+ applicationCache.onupdateready = OfflineTest.priv(manifestUpdated);
+ applicationCache.oncached = OfflineTest.priv(manifestCached);
+}
+
+</script>
+
+</head>
+
+<body>
+ <iframe name="updatingFrame" src="http://mochi.test:8888/tests/dom/tests/mochitest/ajax/offline/updatingIframe.sjs"></iframe>
+ <iframe name="fallbackFrame1" src="http://mochi.test:8888/tests/dom/tests/mochitest/ajax/offline/namespace1/opp.html"></iframe>
+ <iframe name="fallbackFrame2" src="http://mochi.test:8888/tests/dom/tests/mochitest/ajax/offline/namespace1/sub/opp.html"></iframe>
+ <iframe name="whitelistFrame" src="http://mochi.test:8888/tests/dom/tests/mochitest/ajax/offline/onwhitelist.html"></iframe>
+</body>
+</html>