This repository has been archived by the owner on Aug 4, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathWebappRT.jsm
143 lines (114 loc) · 4.31 KB
/
WebappRT.jsm
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
131
132
133
134
135
136
137
138
139
140
141
142
143
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
this.EXPORTED_SYMBOLS = ["WebappRT"];
const Cc = Components.classes;
const Ci = Components.interfaces;
const Cu = Components.utils;
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
Cu.import("resource://gre/modules/Services.jsm");
Cu.import("resource://gre/modules/Promise.jsm");
Cu.import("resource://gre/modules/AppsUtils.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "OS",
"resource://gre/modules/osfile.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "Task",
"resource://gre/modules/Task.jsm");
XPCOMUtils.defineLazyModuleGetter(this, 'NativeApp',
'resource://gre/modules/NativeApp.jsm');
XPCOMUtils.defineLazyServiceGetter(this, "appsService",
"@mozilla.org/AppsService;1",
"nsIAppsService");
this.WebappRT = {
_configPromise: null,
get configPromise() {
if (!this._configPromise) {
this._configPromise = Task.spawn(function*() {
let webappJson = OS.Path.join(Services.dirsvc.get("AppRegD", Ci.nsIFile).path,
"webapp.json");
WebappRT.config = yield AppsUtils.loadJSONAsync(webappJson);
});
}
return this._configPromise;
},
get launchURI() {
return this.localeManifest.fullLaunchPath();
},
get localeManifest() {
return new ManifestHelper(this.config.app.manifest,
this.config.app.origin,
this.config.app.manifestURL);
},
get appID() {
let manifestURL = this.config.app.manifestURL;
if (!manifestURL) {
return Ci.nsIScriptSecurityManager.NO_APP_ID;
}
return appsService.getAppLocalIdByManifestURL(manifestURL);
},
isUpdatePending: Task.async(function*() {
let webappJson = OS.Path.join(Services.dirsvc.get("AppRegD", Ci.nsIFile).path,
"update", "webapp.json");
if (!(yield OS.File.exists(webappJson))) {
return false;
}
return true;
}),
applyUpdate: Task.async(function*() {
let webappJson = OS.Path.join(Services.dirsvc.get("AppRegD", Ci.nsIFile).path,
"update", "webapp.json");
let config = yield AppsUtils.loadJSONAsync(webappJson);
let nativeApp = new NativeApp(config.app, config.app.manifest,
config.app.categories,
config.registryDir);
try {
yield nativeApp.applyUpdate(config.app);
} catch (ex) {
return false;
}
// The update has been applied successfully, the new config file
// is the config file that was in the update directory.
this.config = config;
this._configPromise = Promise.resolve();
return true;
}),
startUpdateService: function() {
let manifestURL = this.config.app.manifestURL;
// We used to install apps without storing their manifest URL.
// Now we can't update them.
if (!manifestURL) {
return;
}
// Check for updates once a day.
let timerManager = Cc["@mozilla.org/updates/timer-manager;1"].
getService(Ci.nsIUpdateTimerManager);
timerManager.registerTimer("updateTimer", () => {
let window = Services.wm.getMostRecentWindow("webapprt:webapp");
window.navigator.mozApps.mgmt.getAll().onsuccess = function() {
let thisApp = null;
for (let app of this.result) {
if (app.manifestURL == manifestURL) {
thisApp = app;
break;
}
}
// This shouldn't happen if the app is installed.
if (!thisApp) {
Cu.reportError("Couldn't find the app in the webapps registry");
return;
}
thisApp.ondownloadavailable = () => {
// Download available, download it!
thisApp.download();
};
thisApp.ondownloadsuccess = () => {
// Update downloaded, apply it!
window.navigator.mozApps.mgmt.applyDownload(thisApp);
};
thisApp.ondownloadapplied = () => {
// Application updated, nothing to do.
};
thisApp.checkForUpdate();
}
}, Services.prefs.getIntPref("webapprt.app_update_interval"));
},
};