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
|
/* 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/. */
"use strict";
var EXPORTED_SYMBOLS = ["Addon", "STATE_ENABLED", "STATE_DISABLED"];
const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
Cu.import("resource://gre/modules/AddonManager.jsm");
Cu.import("resource://gre/modules/addons/AddonRepository.jsm");
Cu.import("resource://gre/modules/NetUtil.jsm");
Cu.import("resource://services-common/async.js");
Cu.import("resource://services-sync/addonutils.js");
Cu.import("resource://services-sync/util.js");
Cu.import("resource://tps/logger.jsm");
const ADDONSGETURL = "http://127.0.0.1:4567/";
const STATE_ENABLED = 1;
const STATE_DISABLED = 2;
function GetFileAsText(file) {
let channel = NetUtil.newChannel({
uri: file,
loadUsingSystemPrincipal: true
});
let inputStream = channel.open2();
if (channel instanceof Ci.nsIHttpChannel &&
channel.responseStatus != 200) {
return "";
}
let streamBuf = "";
let sis = Cc["@mozilla.org/scriptableinputstream;1"]
.createInstance(Ci.nsIScriptableInputStream);
sis.init(inputStream);
let available;
while ((available = sis.available()) != 0) {
streamBuf += sis.read(available);
}
inputStream.close();
return streamBuf;
}
function Addon(TPS, id) {
this.TPS = TPS;
this.id = id;
}
Addon.prototype = {
addon: null,
uninstall: function uninstall() {
// find our addon locally
let cb = Async.makeSyncCallback();
AddonManager.getAddonByID(this.id, cb);
let addon = Async.waitForSyncCallback(cb);
Logger.AssertTrue(!!addon, 'could not find addon ' + this.id + ' to uninstall');
cb = Async.makeSpinningCallback();
AddonUtils.uninstallAddon(addon, cb);
cb.wait();
},
find: function find(state) {
let cb = Async.makeSyncCallback();
AddonManager.getAddonByID(this.id, cb);
let addon = Async.waitForSyncCallback(cb);
if (!addon) {
Logger.logInfo("Could not find add-on with ID: " + this.id);
return false;
}
this.addon = addon;
Logger.logInfo("add-on found: " + addon.id + ", enabled: " +
!addon.userDisabled);
if (state == STATE_ENABLED) {
Logger.AssertFalse(addon.userDisabled, "add-on is disabled: " + addon.id);
return true;
} else if (state == STATE_DISABLED) {
Logger.AssertTrue(addon.userDisabled, "add-on is enabled: " + addon.id);
return true;
} else if (state) {
throw new Error("Don't know how to handle state: " + state);
} else {
// No state, so just checking that it exists.
return true;
}
},
install: function install() {
// For Install, the id parameter initially passed is really the filename
// for the addon's install .xml; we'll read the actual id from the .xml.
let cb = Async.makeSpinningCallback();
AddonUtils.installAddons([{id: this.id, requireSecureURI: false}], cb);
let result = cb.wait();
Logger.AssertEqual(1, result.installedIDs.length, "Exactly 1 add-on was installed.");
Logger.AssertEqual(this.id, result.installedIDs[0],
"Add-on was installed successfully: " + this.id);
},
setEnabled: function setEnabled(flag) {
Logger.AssertTrue(this.find(), "Add-on is available.");
let userDisabled;
if (flag == STATE_ENABLED) {
userDisabled = false;
} else if (flag == STATE_DISABLED) {
userDisabled = true;
} else {
throw new Error("Unknown flag to setEnabled: " + flag);
}
let cb = Async.makeSpinningCallback();
AddonUtils.updateUserDisabled(this.addon, userDisabled, cb);
cb.wait();
return true;
}
};
|