1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
|
"use strict";
const { HttpServer } = ChromeUtils.import("resource://testing-common/httpd.js");
var httpServer = null;
// Need to randomize, because apparently no one clears our cache
var randomPath = "/redirect/" + Math.random();
XPCOMUtils.defineLazyGetter(this, "randomURI", function() {
return "http://localhost:" + httpServer.identity.primaryPort + randomPath;
});
var cacheUpdateObserver = null;
function make_channel(url, callback, ctx) {
return NetUtil.newChannel({ uri: url, loadUsingSystemPrincipal: true });
}
function make_uri(url) {
var ios = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService);
return ios.newURI(url);
}
var responseBody = "Content body";
// start the test with loading this master entry referencing the manifest
function masterEntryHandler(metadata, response) {
var masterEntryContent = "<html manifest='/manifest'></html>";
response.setHeader("Content-Type", "text/html");
response.bodyOutputStream.write(
masterEntryContent,
masterEntryContent.length
);
}
// manifest defines fallback namespace from any /redirect path to /content
function manifestHandler(metadata, response) {
var manifestContent = "CACHE MANIFEST\nFALLBACK:\nredirect /content\n";
response.setHeader("Content-Type", "text/cache-manifest");
response.bodyOutputStream.write(manifestContent, manifestContent.length);
}
// content handler correctly returns some plain text data
function contentHandler(metadata, response) {
response.setHeader("Content-Type", "text/plain");
response.bodyOutputStream.write(responseBody, responseBody.length);
}
// finally check we got fallback content
function finish_test(request, buffer) {
Assert.equal(buffer, responseBody);
httpServer.stop(do_test_finished);
}
function run_test() {
httpServer = new HttpServer();
httpServer.registerPathHandler("/masterEntry", masterEntryHandler);
httpServer.registerPathHandler("/manifest", manifestHandler);
httpServer.registerPathHandler("/content", contentHandler);
httpServer.start(-1);
var pm = Cc["@mozilla.org/permissionmanager;1"].getService(
Ci.nsIPermissionManager
);
var ssm = Cc["@mozilla.org/scriptsecuritymanager;1"].getService(
Ci.nsIScriptSecurityManager
);
var uri = make_uri("http://localhost:" + httpServer.identity.primaryPort);
var principal = ssm.createContentPrincipal(uri, {});
if (pm.testPermissionFromPrincipal(principal, "offline-app") != 0) {
dump(
"Previous test failed to clear offline-app permission! Expect failures.\n"
);
}
pm.addFromPrincipal(
principal,
"offline-app",
Ci.nsIPermissionManager.ALLOW_ACTION
);
var ps = Cc["@mozilla.org/preferences-service;1"].getService(
Ci.nsIPrefBranch
);
dump(ps.getBoolPref("browser.cache.offline.enable"));
ps.setBoolPref("browser.cache.offline.enable", true);
ps.setBoolPref("browser.cache.offline.storage.enable", true);
ps.setComplexValue(
"browser.cache.offline.parent_directory",
Ci.nsIFile,
do_get_profile()
);
cacheUpdateObserver = {
observe() {
dump("got offline-cache-update-completed\n");
// offline cache update completed.
// In this test the randomURI doesn't exists
var chan = make_channel(randomURI);
chan.loadFlags =
Ci.nsIRequest.INHIBIT_CACHING |
Ci.nsIRequest.LOAD_FROM_CACHE |
Ci.nsICachingChannel.LOAD_ONLY_FROM_CACHE;
var chanac = chan.QueryInterface(Ci.nsIApplicationCacheChannel);
chanac.chooseApplicationCache = true;
chan.asyncOpen(new ChannelListener(finish_test));
},
};
var os = Cc["@mozilla.org/observer-service;1"].getService(
Ci.nsIObserverService
);
os.addObserver(cacheUpdateObserver, "offline-cache-update-completed");
var us = Cc["@mozilla.org/offlinecacheupdate-service;1"].getService(
Ci.nsIOfflineCacheUpdateService
);
us.scheduleUpdate(
make_uri(
"http://localhost:" + httpServer.identity.primaryPort + "/manifest"
),
make_uri(
"http://localhost:" + httpServer.identity.primaryPort + "/masterEntry"
),
Services.scriptSecurityManager.getSystemPrincipal(),
null
);
do_test_pending();
}
|