~ubuntu-branches/ubuntu/utopic/ubufox/utopic-security

« back to all changes in this revision

Viewing changes to debian/patches/06_firefox-4.patch

  • Committer: Bazaar Package Importer
  • Author(s): Chris Coulson
  • Date: 2011-04-09 00:08:51 UTC
  • mfrom: (1.1.21 upstream)
  • Revision ID: james.westby@ubuntu.com-20110409000851-5wd2d1p8cws3y3u8
Tags: 0.9-0ubuntu1
* New upstream release v0.9
* All patches are merged in to the upstream branch now

* Fix LP: #750305 - Please update links and configs for Natty release.
  Rather than doing this manually for every release, we add a dist.js with
  distro information (populated at build time with lsb_release) and just
  do all this automatically.
* Fix LP: #752364 - Plugin Finder Service never finds anything. Use the
  release info in dist.js to construct the URL, now that this got dropped
  from Firefox
* Fix LP: #728826 - Update icons to new versions.
* Drop the pluginGlue.js module. This didn't work, as we can no longer
  use a modules registerSelf method to use nsICategoryManager at startup,
  due to the XPCOM registration changes in Firefox 4. Instead, add
  category entries with the chrome.manifest
* Fix LP: #709125 - User agent doesn't include Ubuntu in it so
  apt.ubuntu.com doesn't work. We add an extra X-Ubuntu HTTP header in
  requests to apt.ubuntu.com, rather than send this information out in
  every request in the UA string

* Add build-depend on lsb-release so we can create dist.js

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
--- a/chrome.manifest
2
 
+++ b/chrome.manifest
3
 
@@ -28,8 +28,9 @@ locale        ubufox  zh-CN   locale/zh-CN/
4
 
 skin   ubufox  classic/1.0     skin/
5
 
 overlay        chrome://browser/content/browser.xul    chrome://ubufox/content/ubuntuHelpMenuOverlay.xul
6
 
 overlay        chrome://browser/content/browser.xul    chrome://ubufox/content/updateRestart.xul
7
 
-overlay chrome://mozapps/content/extensions/extensions.xul chrome://ubufox/content/ubuntuAddonsOverlay.xul appversion>=3.0b3
8
 
-overlay chrome://mozapps/content/extensions/extensions.xul chrome://ubufox/content/ubuntuAddonsOverlay.ffox2.xul appversion<2.0.0.*
9
 
-overlay chrome://browser/content/browser.xul chrome://ubufox/content/ubuntuAltpluginsOverlay.xul
10
 
+overlay chrome://browser/content/browser.xul   chrome://ubufox/content/ubuntuAltpluginsOverlay.xul
11
 
 
12
 
 override chrome://mozapps/content/plugins/pluginInstallerWizard.xul chrome://ubufox/content/pluginInstallerWizard.xul
13
 
+
14
 
+component {7a2a7a56-827f-4b38-bdac-31aa7ec2971d} components/aboutStartpage.js
15
 
+contract @mozilla.org/network/protocol/about;1?what=startpage {7a2a7a56-827f-4b38-bdac-31aa7ec2971d}
16
 
--- a/components/aboutHome.js
17
 
+++ /dev/null
18
 
@@ -1,141 +0,0 @@
19
 
-/* ***** BEGIN LICENSE BLOCK *****
20
 
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
21
 
- *
22
 
- * The contents of this file are subject to the Mozilla Public License Version
23
 
- * 1.1 (the "License"); you may not use this file except in compliance with
24
 
- * the License. You may obtain a copy of the License at
25
 
- * http://www.mozilla.org/MPL/
26
 
- *
27
 
- * Software distributed under the License is distributed on an "AS IS" basis,
28
 
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
29
 
- * for the specific language governing rights and limitations under the
30
 
- * License.
31
 
- *
32
 
- * The Original Code is about:robots
33
 
- *
34
 
- * The Initial Developer of the Original Code is Mozilla Foundation.
35
 
- * Portions created by the Initial Developer are Copyright (C) 2008
36
 
- * the Initial Developer. All Rights Reserved.
37
 
- *
38
 
- * Contributor(s):
39
 
- *   Ryan Flint <rflint@mozilla.com>
40
 
- *   Justin Dolske <dolske@mozilla.com>
41
 
- *   Johnathan Nightingale <johnath@mozilla.com>
42
 
- *
43
 
- * Alternatively, the contents of this file may be used under the terms of
44
 
- * either the GNU General Public License Version 2 or later (the "GPL"), or
45
 
- * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
46
 
- * in which case the provisions of the GPL or the LGPL are applicable instead
47
 
- * of those above. If you wish to allow use of your version of this file only
48
 
- * under the terms of either the GPL or the LGPL, and not to allow others to
49
 
- * use your version of this file under the terms of the MPL, indicate your
50
 
- * decision by deleting the provisions above and replace them with the notice
51
 
- * and other provisions required by the GPL or the LGPL. If you do not delete
52
 
- * the provisions above, a recipient may use your version of this file under
53
 
- * the terms of any one of the MPL, the GPL or the LGPL.
54
 
- *
55
 
- * ***** END LICENSE BLOCK ***** */
56
 
-const Cc = Components.classes;
57
 
-const Ci = Components.interfaces;
58
 
-
59
 
-Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
60
 
-
61
 
-var HOMEPAGE_OFFLINE = "file:///usr/share/ubuntu-artwork/home/index.html";
62
 
-var HOMEPAGE_OFFLINE_TMPL = "/usr/share/ubuntu-artwork/home/locales/index-"
63
 
-
64
 
-var HOMEPAGE_ONLINE_PREFIX = "http://start.ubuntu.com/10.10";
65
 
-
66
 
-function getIsOffline() {
67
 
-  var ios = Cc["@mozilla.org/network/io-service;1"]
68
 
-            .getService(Ci.nsIIOService);
69
 
-  return ios.offline;
70
 
-}
71
 
-
72
 
-function getUALocale() {
73
 
-  var prefs = Cc["@mozilla.org/preferences-service;1"]
74
 
-             .getService(Ci.nsIPrefBranch);
75
 
-
76
 
-  var userAgentLocale = null;
77
 
-  try {
78
 
-    var userAgentLocaleLocalized = null;
79
 
-
80
 
-    try {
81
 
-      userAgentLocaleLocalized = prefs.getComplexValue("general.useragent.locale",
82
 
-                                                       Ci.nsIPrefLocalizedString);
83
 
-    } catch (e) {}
84
 
-
85
 
-    if (userAgentLocaleLocalized) {
86
 
-        userAgentLocale = userAgentLocaleLocalized.toString();
87
 
-    } else {
88
 
-        userAgentLocale = prefs.getCharPref("general.useragent.locale");
89
 
-    }
90
 
-  } catch (e) { userAgentLocale = "en-US";}
91
 
-
92
 
-  return userAgentLocale;
93
 
-}
94
 
-
95
 
-function get_valid_offlinehomepage() {
96
 
-   var userAgentLocale = getUALocale();
97
 
-   var canonicalLangCode = userAgentLocale.replace("-","_");
98
 
-
99
 
-   var preferredHomepage = HOMEPAGE_OFFLINE_TMPL + canonicalLangCode + ".html";
100
 
-
101
 
-   var file = Components.classes['@mozilla.org/file/local;1']
102
 
-              .createInstance(Components.interfaces.nsILocalFile);
103
 
-
104
 
-   file.initWithPath(preferredHomepage);
105
 
-
106
 
-   if (!file.exists())
107
 
-     return HOMEPAGE_OFFLINE;
108
 
-
109
 
-   return "file://" + preferredHomepage;
110
 
-   return preferredHomepage;
111
 
-}
112
 
-
113
 
-function getCurrentSearchEngineName () {
114
 
-  var searchService = Cc["@mozilla.org/browser/search-service;1"]
115
 
-                      .getService (Ci.nsIBrowserSearchService);
116
 
-  var defaultEngine = searchService.currentEngine;
117
 
-  return defaultEngine.name;
118
 
-}
119
 
-
120
 
-function AboutHome() {}
121
 
-AboutHome.prototype = {
122
 
-  classDescription: "About Home",
123
 
-  contractID: "@mozilla.org/network/protocol/about;1?what=home",
124
 
-  classID: Components.ID("{7a2a7a56-827f-4b38-bdac-31aa7ec2971d}"),
125
 
-  QueryInterface: XPCOMUtils.generateQI([Ci.nsIAboutModule]),
126
 
127
 
-  getURIFlags: function(aURI) {
128
 
-    return (Ci.nsIAboutModule.ALLOW_SCRIPT |
129
 
-            Ci.nsIAboutModule.URI_SAFE_FOR_UNTRUSTED_CONTENT);
130
 
-  },
131
 
-
132
 
-  newChannel: function(aURI) {
133
 
-    var ios = Cc["@mozilla.org/network/io-service;1"].
134
 
-              getService(Ci.nsIIOService);
135
 
-
136
 
-    var secMan = Cc["@mozilla.org/scriptsecuritymanager;1"].
137
 
-                 getService(Ci.nsIScriptSecurityManager);
138
 
-    var principal = secMan.getCodebasePrincipal(aURI);
139
 
-
140
 
-    if (!getIsOffline()) {
141
 
-      let searchEngineName = getCurrentSearchEngineName();
142
 
-      let uri = HOMEPAGE_ONLINE_PREFIX + "/" + searchEngineName + "/";
143
 
-      let channel = ios.newChannel(uri, null, null);
144
 
-      channel.originalURI = aURI;
145
 
-      channel.owner = principal;
146
 
-      return channel;
147
 
-    }
148
 
-
149
 
-    let channel = ios.newChannel(HOMEPAGE_OFFLINE, null, null);
150
 
-//    channel.originalURI = aURI;
151
 
-    channel.owner = principal;
152
 
-    return channel;
153
 
-  }
154
 
-};
155
 
-
156
 
-function NSGetModule(compMgr, fileSpec) {
157
 
-  return XPCOMUtils.generateModule([AboutHome]);
158
 
-}
159
 
-
160
 
--- /dev/null
161
 
+++ b/components/aboutStartpage.js
162
 
@@ -0,0 +1,144 @@
163
 
+/* ***** BEGIN LICENSE BLOCK *****
164
 
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
165
 
+ *
166
 
+ * The contents of this file are subject to the Mozilla Public License Version
167
 
+ * 1.1 (the "License"); you may not use this file except in compliance with
168
 
+ * the License. You may obtain a copy of the License at
169
 
+ * http://www.mozilla.org/MPL/
170
 
+ *
171
 
+ * Software distributed under the License is distributed on an "AS IS" basis,
172
 
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
173
 
+ * for the specific language governing rights and limitations under the
174
 
+ * License.
175
 
+ *
176
 
+ * The Original Code is about:robots
177
 
+ *
178
 
+ * The Initial Developer of the Original Code is Mozilla Foundation.
179
 
+ * Portions created by the Initial Developer are Copyright (C) 2008
180
 
+ * the Initial Developer. All Rights Reserved.
181
 
+ *
182
 
+ * Contributor(s):
183
 
+ *   Ryan Flint <rflint@mozilla.com>
184
 
+ *   Justin Dolske <dolske@mozilla.com>
185
 
+ *   Johnathan Nightingale <johnath@mozilla.com>
186
 
+ *
187
 
+ * Alternatively, the contents of this file may be used under the terms of
188
 
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
189
 
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
190
 
+ * in which case the provisions of the GPL or the LGPL are applicable instead
191
 
+ * of those above. If you wish to allow use of your version of this file only
192
 
+ * under the terms of either the GPL or the LGPL, and not to allow others to
193
 
+ * use your version of this file under the terms of the MPL, indicate your
194
 
+ * decision by deleting the provisions above and replace them with the notice
195
 
+ * and other provisions required by the GPL or the LGPL. If you do not delete
196
 
+ * the provisions above, a recipient may use your version of this file under
197
 
+ * the terms of any one of the MPL, the GPL or the LGPL.
198
 
+ *
199
 
+ * ***** END LICENSE BLOCK ***** */
200
 
+const Cc = Components.classes;
201
 
+const Ci = Components.interfaces;
202
 
+
203
 
+Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
204
 
+
205
 
+var HOMEPAGE_OFFLINE = "file:///usr/share/ubuntu-artwork/home/index.html";
206
 
+var HOMEPAGE_OFFLINE_TMPL = "/usr/share/ubuntu-artwork/home/locales/index-"
207
 
+
208
 
+var HOMEPAGE_ONLINE_PREFIX = "http://start.ubuntu.com/10.10";
209
 
+
210
 
+function getIsOffline() {
211
 
+  var ios = Cc["@mozilla.org/network/io-service;1"]
212
 
+            .getService(Ci.nsIIOService);
213
 
+  return ios.offline;
214
 
+}
215
 
+
216
 
+function getUALocale() {
217
 
+  var prefs = Cc["@mozilla.org/preferences-service;1"]
218
 
+             .getService(Ci.nsIPrefBranch);
219
 
+
220
 
+  var userAgentLocale = null;
221
 
+  try {
222
 
+    var userAgentLocaleLocalized = null;
223
 
+
224
 
+    try {
225
 
+      userAgentLocaleLocalized = prefs.getComplexValue("general.useragent.locale",
226
 
+                                                       Ci.nsIPrefLocalizedString);
227
 
+    } catch (e) {}
228
 
+
229
 
+    if (userAgentLocaleLocalized) {
230
 
+        userAgentLocale = userAgentLocaleLocalized.toString();
231
 
+    } else {
232
 
+        userAgentLocale = prefs.getCharPref("general.useragent.locale");
233
 
+    }
234
 
+  } catch (e) { userAgentLocale = "en-US";}
235
 
+
236
 
+  return userAgentLocale;
237
 
+}
238
 
+
239
 
+function get_valid_offlinehomepage() {
240
 
+   var userAgentLocale = getUALocale();
241
 
+   var canonicalLangCode = userAgentLocale.replace("-","_");
242
 
+
243
 
+   var preferredHomepage = HOMEPAGE_OFFLINE_TMPL + canonicalLangCode + ".html";
244
 
+
245
 
+   var file = Components.classes['@mozilla.org/file/local;1']
246
 
+              .createInstance(Components.interfaces.nsILocalFile);
247
 
+
248
 
+   file.initWithPath(preferredHomepage);
249
 
+
250
 
+   if (!file.exists())
251
 
+     return HOMEPAGE_OFFLINE;
252
 
+
253
 
+   return "file://" + preferredHomepage;
254
 
+   return preferredHomepage;
255
 
+}
256
 
+
257
 
+function getCurrentSearchEngineName () {
258
 
+  var searchService = Cc["@mozilla.org/browser/search-service;1"]
259
 
+                      .getService (Ci.nsIBrowserSearchService);
260
 
+  var defaultEngine = searchService.currentEngine;
261
 
+  return defaultEngine.name;
262
 
+}
263
 
+
264
 
+function AboutStartpage() {}
265
 
+AboutStartpage.prototype = {
266
 
+  classDescription: "About Startpage",
267
 
+  contractID: "@mozilla.org/network/protocol/about;1?what=startpage",
268
 
+  classID: Components.ID("{7a2a7a56-827f-4b38-bdac-31aa7ec2971d}"),
269
 
+  QueryInterface: XPCOMUtils.generateQI([Ci.nsIAboutModule]),
270
 
271
 
+  getURIFlags: function(aURI) {
272
 
+    return (Ci.nsIAboutModule.ALLOW_SCRIPT |
273
 
+            Ci.nsIAboutModule.URI_SAFE_FOR_UNTRUSTED_CONTENT);
274
 
+  },
275
 
+
276
 
+  newChannel: function(aURI) {
277
 
+    var ios = Cc["@mozilla.org/network/io-service;1"].
278
 
+              getService(Ci.nsIIOService);
279
 
+
280
 
+    var secMan = Cc["@mozilla.org/scriptsecuritymanager;1"].
281
 
+                 getService(Ci.nsIScriptSecurityManager);
282
 
+    var principal = secMan.getCodebasePrincipal(aURI);
283
 
+
284
 
+    if (!getIsOffline()) {
285
 
+      let searchEngineName = getCurrentSearchEngineName();
286
 
+      let uri = HOMEPAGE_ONLINE_PREFIX + "/" + searchEngineName + "/";
287
 
+      let channel = ios.newChannel(uri, null, null);
288
 
+      channel.originalURI = aURI;
289
 
+      channel.owner = principal;
290
 
+      return channel;
291
 
+    }
292
 
+
293
 
+    let channel = ios.newChannel(HOMEPAGE_OFFLINE, null, null);
294
 
+//    channel.originalURI = aURI;
295
 
+    channel.owner = principal;
296
 
+    return channel;
297
 
+  }
298
 
+};
299
 
+
300
 
+function NSGetModule(compMgr, fileSpec) {
301
 
+  return XPCOMUtils.generateModule([AboutStartpage]);
302
 
+}
303
 
+
304
 
+if (typeof XPCOMUtils.generateNSGetFactory == "function") {
305
 
+  const NSGetFactory = XPCOMUtils.generateNSGetFactory([AboutStartpage]);
306
 
+}
307
 
--- a/content/overlay.js
308
 
+++ b/content/overlay.js
309
 
@@ -65,86 +65,6 @@ function getSourcePackageName ()
310
 
   return sourcePackageName;
311
 
 }
312
 
 
313
 
-var ubufox = {
314
 
-  onAddonsLoad: function () {
315
 
-    this.isffox3 = false;
316
 
-    var labelGetUbuntu = document.getElementById("getUbuntu"); // ffox 2
317
 
-    var extensions = document.getElementById("extensions-view");
318
 
-    this.strings = document.getElementById("ubufox-strings");
319
 
-
320
 
-    if (!labelGetUbuntu) {
321
 
-      labelGetUbuntu = document.getElementById("getUbuntu3");
322
 
-      this.isffox3 = true;
323
 
-    }
324
 
-    this.initialized = true;
325
 
-
326
 
-    if (!ubufoxCheckExecutable("/usr/bin/gnome-app-install"))
327
 
-      labelGetUbuntu.setAttribute("hidden", "true");
328
 
-    else if (!this.isffox3) {
329
 
-      // this is ffox2 only because ffox3 uses a distinct overlay anchor
330
 
-      if (extensions.getAttribute("selected") != "true") {
331
 
-        labelGetUbuntu.setAttribute("hidden", "true");
332
 
-      }
333
 
-      if (extensions.getAttribute("selected") == "true") {
334
 
-        labelGetUbuntu.setAttribute("hidden", "false");
335
 
-      }
336
 
-      extensions.addEventListener("DOMAttrModified", function (e) { ubufox.onAttrModified(e); }, false);
337
 
-    }
338
 
-  },
339
 
-  onMenuItemCommand: function(e) {
340
 
-    var promptService = Components.classes["@mozilla.org/embedcomp/prompt-service;1"]
341
 
-                                  .getService(Components.interfaces.nsIPromptService);
342
 
-    promptService.alert(window, this.strings.getString("helloMessageTitle"),
343
 
-                                this.strings.getString("helloMessage"));
344
 
-  },
345
 
-  onAttrModified: function(e) {
346
 
-    var labelGetUbuntu = document.getElementById("getUbuntu");
347
 
-    var extensions = document.getElementById("extensions-view");
348
 
-
349
 
-    if (!ubufoxCheckExecutable("/usr/bin/gnome-app-install")) {
350
 
-      labelGetUbuntu.setAttribute("hidden", "true");
351
 
-      return;
352
 
-    }
353
 
-    if (extensions.getAttribute("selected") != "true") {
354
 
-      labelGetUbuntu.setAttribute("hidden", "true");
355
 
-    }
356
 
-    if (extensions.getAttribute("selected") == "true") {
357
 
-      labelGetUbuntu.setAttribute("hidden", "false");
358
 
-    }
359
 
-  },
360
 
-};
361
 
-window.addEventListener("load", function(e) { ubufox.onAddonsLoad(e); }, false);
362
 
-
363
 
-function startUbuntuAddonsWizard(ev)
364
 
-{
365
 
-  var executable =
366
 
-      Components.classes['@mozilla.org/file/local;1']
367
 
-      .createInstance(Components.interfaces.nsILocalFile);
368
 
-
369
 
-  executable.initWithPath("/usr/bin/gnome-app-install");
370
 
-
371
 
-  if(!executable.exists() || !executable.isExecutable())
372
 
-         alert('Unexpected error!');
373
 
-
374
 
-  var procUtil =
375
 
-      Components.classes['@mozilla.org/process/util;1']
376
 
-      .createInstance(Components.interfaces.nsIProcess);
377
 
-
378
 
-  var nsFile = executable.QueryInterface(Components.interfaces.nsIFile);
379
 
-
380
 
-  procUtil.init(executable);
381
 
-
382
 
-  var args = new Array("--xul-extensions=firefox");
383
 
-  // we care for firefox 2 and use a special mime type to document
384
 
-  // compatibility of extensions with it
385
 
-  if (!ubufox.isffox3) {
386
 
-    args = new Array("--xul-extensions=firefox-2");
387
 
-  }
388
 
-  var res = procUtil.run(false, args, args.length);
389
 
-
390
 
-  return true;
391
 
-}
392
 
-
393
 
 function ubufoxReportBug(event) {
394
 
 
395
 
   var executable =
396
 
@@ -182,14 +102,3 @@ function ubufoxHelpTranslateLaunchpad(ev
397
 
   var translateUrl = "https://launchpad.net/distros/ubuntu/maverick/+sources/" + getSourcePackageName() + "/+translate";
398
 
   openUILink(translateUrl, event, false, true);
399
 
 }
400
 
-
401
 
-function ubufoxCheckExecutable(filename)
402
 
-{
403
 
-  var executable =
404
 
-      Components.classes['@mozilla.org/file/local;1']
405
 
-      .createInstance(Components.interfaces.nsILocalFile);
406
 
-
407
 
-  executable.initWithPath(filename);
408
 
-  return executable.exists();
409
 
-}
410
 
-
411
 
--- a/content/pluginInstallerDatasource.js
412
 
+++ b/content/pluginInstallerDatasource.js
413
 
@@ -39,9 +39,9 @@
414
 
 const RDF_NS = "http://www.w3.org/1999/02/22-rdf-syntax-ns#";
415
 
 const PFS_NS = "http://www.mozilla.org/2004/pfs-rdf#";
416
 
 
417
 
-function nsRDFItemUpdater(aClientOS, aChromeLocale){
418
 
+function nsRDFItemUpdater(aClientOS, aChromeLocale) {
419
 
   this._rdfService = Components.classes["@mozilla.org/rdf/rdf-service;1"]
420
 
-                        .getService(Components.interfaces.nsIRDFService);
421
 
+                               .getService(Components.interfaces.nsIRDFService);
422
 
   this._os = Components.classes["@mozilla.org/observer-service;1"]
423
 
                        .getService(Components.interfaces.nsIObserverService);
424
 
 
425
 
@@ -49,6 +49,7 @@ function nsRDFItemUpdater(aClientOS, aCh
426
 
                       .getService(Components.interfaces.nsIXULAppInfo);
427
 
   this.appID = app.ID;
428
 
   this.buildID = app.platformBuildID;
429
 
+  this.appRelease = app.version;
430
 
 
431
 
   this.clientOS = aClientOS;
432
 
   this.chromeLocale = aChromeLocale;
433
 
@@ -56,17 +57,20 @@ function nsRDFItemUpdater(aClientOS, aCh
434
 
   var prefBranch = Components.classes["@mozilla.org/preferences-service;1"]
435
 
                              .getService(Components.interfaces.nsIPrefBranch);
436
 
   this.dsURI = prefBranch.getCharPref("pfs.datasource.url");
437
 
+  this.distID = prefBranch.getCharPref("general.useragent.vendorSub");
438
 
 }
439
 
 
440
 
 nsRDFItemUpdater.prototype = {
441
 
-  checkForPlugin: function (aPluginRequestItem){
442
 
+  checkForPlugin: function (aPluginRequestItem) {
443
 
     var dsURI = this.dsURI;
444
 
     // escape the mimetype as mimetypes can contain '+', which will break pfs.
445
 
     dsURI = dsURI.replace(/%PLUGIN_MIMETYPE%/g, encodeURIComponent(aPluginRequestItem.mimetype));
446
 
     dsURI = dsURI.replace(/%APP_ID%/g, this.appID);
447
 
     dsURI = dsURI.replace(/%APP_VERSION%/g, this.buildID);
448
 
+    dsURI = dsURI.replace(/%APP_RELEASE%/g, this.appRelease);
449
 
     dsURI = dsURI.replace(/%CLIENT_OS%/g, this.clientOS);
450
 
     dsURI = dsURI.replace(/%CHROME_LOCALE%/g, this.chromeLocale);
451
 
+    dsURI = dsURI.replace(/%DIST_ID%/g, this.distID);
452
 
 
453
 
     var ds = this._rdfService.GetDataSource(dsURI);
454
 
     var rds = ds.QueryInterface(Components.interfaces.nsIRDFRemoteDataSource)
455
 
@@ -78,14 +82,13 @@ nsRDFItemUpdater.prototype = {
456
 
     }
457
 
   },
458
 
 
459
 
-  onDatasourceLoaded: function pfs_onDatasourceLoaded (aDatasource, aPluginRequestItem){
460
 
-    var container = Components.classes["@mozilla.org/rdf/container;1"].
461
 
-                  createInstance(Components.interfaces.nsIRDFContainer);
462
 
+  onDatasourceLoaded: function pfs_onDatasourceLoaded (aDatasource, aPluginRequestItem) {
463
 
+    var container = Components.classes["@mozilla.org/rdf/container;1"]
464
 
+                              .createInstance(Components.interfaces.nsIRDFContainer);
465
 
     var resultRes = this._rdfService.GetResource("urn:mozilla:plugin-results:" + aPluginRequestItem.mimetype);
466
 
     var pluginList = aDatasource.GetTarget(resultRes, this._rdfService.GetResource(PFS_NS+"plugins"), true);
467
 
     var pluginInfos = new Array();
468
 
-  
469
 
-    container = Components.classes["@mozilla.org/rdf/container;1"].createInstance(Components.interfaces.nsIRDFContainer);
470
 
+
471
 
     try {
472
 
       container.Init(aDatasource, pluginList);
473
 
 
474
 
@@ -95,7 +98,7 @@ nsRDFItemUpdater.prototype = {
475
 
 
476
 
        var target;
477
 
        var child = children.getNext();
478
 
-       if (child instanceof Components.interfaces.nsIRDFResource){
479
 
+       if (child instanceof Components.interfaces.nsIRDFResource) {
480
 
          var name = this._rdfService.GetResource("http://www.mozilla.org/2004/pfs-rdf#updates");
481
 
          target = aDatasource.GetTarget(child, name, true);
482
 
        }
483
 
@@ -107,13 +110,13 @@ nsRDFItemUpdater.prototype = {
484
 
 
485
 
          while (children2.hasMoreElements()) {
486
 
            var child2 = children2.getNext();
487
 
-           if (child2 instanceof Components.interfaces.nsIRDFResource){
488
 
+           if (child2 instanceof Components.interfaces.nsIRDFResource) {
489
 
              target2 = child2;
490
 
            }
491
 
 
492
 
            var rdfs = this._rdfService;
493
 
 
494
 
-           function getPFSValueFromRDF(aValue){
495
 
+           function getPFSValueFromRDF(aValue) {
496
 
              var rv = null;
497
 
 
498
 
              var myTarget = aDatasource.GetTarget(target2, rdfs.GetResource(PFS_NS + aValue), true);
499
 
@@ -128,6 +131,7 @@ nsRDFItemUpdater.prototype = {
500
 
              pid: getPFSValueFromRDF("guid"),
501
 
              version: getPFSValueFromRDF("version"),
502
 
              IconUrl: getPFSValueFromRDF("IconUrl"),
503
 
+              InstallerLocation: getPFSValueFromRDF("InstallerLocation"),
504
 
              desc: getPFSValueFromRDF("description"), 
505
 
              homepage: getPFSValueFromRDF("homepage"),
506
 
              XPILocation: getPFSValueFromRDF("XPILocation"),
507
 
@@ -140,24 +144,32 @@ nsRDFItemUpdater.prototype = {
508
 
              fileHint: getPFSValueFromRDF("filehint")
509
 
            };
510
 
 
511
 
+        // no license provided, make it accepted
512
 
+        pluginInfo.licenseAccepted = pluginInfo.licenseURL ? false : true;
513
 
+
514
 
            pluginInfos.push(pluginInfo);
515
 
          }
516
 
        }
517
 
-       catch (ex){}
518
 
+       catch (ex) {
519
 
+          Components.utils.reportError(ex);
520
 
+        }
521
 
       }
522
 
     }
523
 
-    catch (ex){}
524
 
+    catch (ex) {
525
 
+      Components.utils.reportError(ex);
526
 
+    }
527
 
     
528
 
-    gPluginInstaller.pluginInfoReceived(pluginInfos);
529
 
+    gPluginInstaller.pluginInfoReceived(aPluginRequestItem, pluginInfos);
530
 
   },
531
 
 
532
 
-  onDatasourceError: function pfs_onDatasourceError (aPluginRequestItem, aError){
533
 
+  onDatasourceError: function pfs_onDatasourceError (aPluginRequestItem, aError) {
534
 
     this._os.notifyObservers(aPluginRequestItem, "error", aError);
535
 
-    gPluginInstaller.pluginInfoReceived(null);
536
 
-  },
537
 
+    Components.utils.reportError(aError);
538
 
+    gPluginInstaller.pluginInfoReceived(aPluginRequestItem, null);
539
 
+  }
540
 
 };
541
 
 
542
 
-function nsPluginXMLRDFDSObserver(aUpdater, aPluginRequestItem){
543
 
+function nsPluginXMLRDFDSObserver(aUpdater, aPluginRequestItem) {
544
 
   this._updater = aUpdater;
545
 
   this._item    = aPluginRequestItem;
546
 
 }
547
 
@@ -168,17 +180,17 @@ nsPluginXMLRDFDSObserver.prototype =
548
 
   _item     : null,
549
 
 
550
 
   // nsIRDFXMLSinkObserver
551
 
-  onBeginLoad: function(aSink){},
552
 
-  onInterrupt: function(aSink){},
553
 
-  onResume: function(aSink){},
554
 
-  onEndLoad: function(aSink){
555
 
+  onBeginLoad: function(aSink) {},
556
 
+  onInterrupt: function(aSink) {},
557
 
+  onResume: function(aSink) {},
558
 
+  onEndLoad: function(aSink) {
559
 
     aSink.removeXMLSinkObserver(this);
560
 
     
561
 
     var ds = aSink.QueryInterface(Components.interfaces.nsIRDFDataSource);
562
 
     this._updater.onDatasourceLoaded(ds, this._item);
563
 
   },
564
 
   
565
 
-  onError: function(aSink, aStatus, aErrorMsg){  
566
 
+  onError: function(aSink, aStatus, aErrorMsg) {  
567
 
     aSink.removeXMLSinkObserver(this);   
568
 
     this._updater.onDatasourceError(this._item, aStatus.toString());
569
 
   }
570
 
--- a/content/pluginInstallerService.js
571
 
+++ b/content/pluginInstallerService.js
572
 
@@ -36,54 +36,299 @@
573
 
  *
574
 
  * ***** END LICENSE BLOCK ***** */
575
 
 
576
 
-var PluginXPIInstallService = {
577
 
-  
578
 
-  init: function () 
579
 
+Components.utils.import("resource://gre/modules/AddonManager.jsm");
580
 
+
581
 
+const DOWNLOAD_STARTED = 0;
582
 
+const DOWNLOAD_FINISHED = 1;
583
 
+const INSTALL_STARTED = 2;
584
 
+const INSTALL_FINISHED = 3;
585
 
+const INSTALLS_COMPLETE = 4;
586
 
+
587
 
+function getLocalizedError(key)
588
 
+{
589
 
+  return document.getElementById("xpinstallStrings").getString(key);
590
 
+}
591
 
+
592
 
+function binaryToHex(input)
593
 
+{
594
 
+  return [('0' + input.charCodeAt(i).toString(16)).slice(-2)
595
 
+          for (i in input)].join('');
596
 
+}
597
 
+
598
 
+function verifyHash(aFile, aHash)
599
 
+{
600
 
+  try {
601
 
+    var [, method, hash] = /^([A-Za-z0-9]+):(.*)$/.exec(aHash);
602
 
+
603
 
+    var fis = Components.classes['@mozilla.org/network/file-input-stream;1'].
604
 
+      createInstance(Components.interfaces.nsIFileInputStream);
605
 
+    fis.init(aFile, -1, -1, 0);
606
 
+
607
 
+    var hasher = Components.classes['@mozilla.org/security/hash;1'].
608
 
+      createInstance(Components.interfaces.nsICryptoHash);
609
 
+    hasher.initWithString(method);
610
 
+    hasher.updateFromStream(fis, -1);
611
 
+    dlhash = binaryToHex(hasher.finish(false));
612
 
+    return dlhash == hash;
613
 
+  }
614
 
+  catch (e) {
615
 
+    Components.utils.reportError(e);
616
 
+    return false;
617
 
+  }
618
 
+}
619
 
+
620
 
+function InstallerObserver(aPlugin)
621
 
+{
622
 
+  this._plugin = aPlugin;
623
 
+  this._init();
624
 
+}
625
 
+
626
 
+InstallerObserver.prototype = {
627
 
+  _init: function()
628
 
   {
629
 
+    try {
630
 
+      var ios = Components.classes["@mozilla.org/network/io-service;1"].
631
 
+        getService(Components.interfaces.nsIIOService);
632
 
+      var uri = ios.newURI(this._plugin.InstallerLocation, null, null);
633
 
+      uri.QueryInterface(Components.interfaces.nsIURL);
634
 
+
635
 
+      // Use a local filename appropriate for the OS
636
 
+      var leafName = uri.fileName;
637
 
+      var os = Components.classes["@mozilla.org/xre/app-info;1"]
638
 
+                         .getService(Components.interfaces.nsIXULRuntime)
639
 
+                         .OS;
640
 
+      if (os == "WINNT" && leafName.indexOf(".") < 0)
641
 
+        leafName += ".exe";
642
 
+
643
 
+      var dirs = Components.classes["@mozilla.org/file/directory_service;1"].
644
 
+        getService(Components.interfaces.nsIProperties);
645
 
+
646
 
+      var resultFile = dirs.get("TmpD", Components.interfaces.nsIFile);
647
 
+      resultFile.append(leafName);
648
 
+      resultFile.createUnique(Components.interfaces.nsIFile.NORMAL_FILE_TYPE,
649
 
+                              0770);
650
 
+
651
 
+      var channel = ios.newChannelFromURI(uri);
652
 
+      this._downloader =
653
 
+        Components.classes["@mozilla.org/network/downloader;1"].
654
 
+          createInstance(Components.interfaces.nsIDownloader);
655
 
+      this._downloader.init(this, resultFile);
656
 
+      channel.notificationCallbacks = this;
657
 
+
658
 
+      this._fireNotification(DOWNLOAD_STARTED, null);
659
 
+
660
 
+      channel.asyncOpen(this._downloader, null);
661
 
+    }
662
 
+    catch (e) {
663
 
+      Components.utils.reportError(e);
664
 
+      this._fireNotification(INSTALL_FINISHED, getLocalizedError("error-228"));
665
 
+      if (resultFile && resultFile.exists())
666
 
+        resultfile.remove(false);
667
 
+    }
668
 
   },
669
 
 
670
 
-  pluginPidArray: null,
671
 
+  /**
672
 
+   * Inform the gPluginInstaller about what's going on.
673
 
+   */
674
 
+  _fireNotification: function(aStatus, aErrorMsg)
675
 
+  {
676
 
+    gPluginInstaller.pluginXPIInstallationProgress(this._plugin.pid,
677
 
+                                                   aStatus, aErrorMsg);
678
 
 
679
 
-  startPluginInstallation: function (aPluginXPIUrlsArray,
680
 
-                                    aPluginHashes,
681
 
-                                    aPluginPidArray) {
682
 
-     this.pluginPidArray = aPluginPidArray;
683
 
-
684
 
-     var xpiManager = Components.classes["@mozilla.org/xpinstall/install-manager;1"]
685
 
-                                .createInstance(Components.interfaces.nsIXPInstallManager);
686
 
-     xpiManager.initManagerWithHashes(aPluginXPIUrlsArray, aPluginHashes,
687
 
-                                      aPluginXPIUrlsArray.length, this);
688
 
-  },
689
 
-
690
 
-  // XPI progress listener stuff
691
 
-  onStateChange: function (aIndex, aState, aValue)
692
 
-  {
693
 
-    // get the pid to return to the wizard
694
 
-    var pid = this.pluginPidArray[aIndex];
695
 
-    var errorMsg;
696
 
-
697
 
-    if (aState == Components.interfaces.nsIXPIProgressDialog.INSTALL_DONE) {
698
 
-      if (aValue != 0) {
699
 
-        var xpinstallStrings = document.getElementById("xpinstallStrings");
700
 
-        try {
701
 
-          errorMsg = xpinstallStrings.getString("error" + aValue);
702
 
-        }
703
 
-        catch (e) {
704
 
-          errorMsg = xpinstallStrings.getFormattedString("unknown.error", [aValue]);
705
 
+    if (aStatus == INSTALL_FINISHED) {
706
 
+      --PluginInstallService._installersPending;
707
 
+      PluginInstallService._fireFinishedNotification();
708
 
+    }
709
 
+  },
710
 
+
711
 
+  QueryInterface: function(iid)
712
 
+  {
713
 
+    if (iid.equals(Components.interfaces.nsISupports) ||
714
 
+        iid.equals(Components.interfaces.nsIInterfaceRequestor) ||
715
 
+        iid.equals(Components.interfaces.nsIDownloadObserver) ||
716
 
+        iid.equals(Components.interfaces.nsIProgressEventSink))
717
 
+      return this;
718
 
+
719
 
+    throw Components.results.NS_ERROR_NO_INTERFACE;
720
 
+  },
721
 
+
722
 
+  getInterface: function(iid)
723
 
+  {
724
 
+    if (iid.equals(Components.interfaces.nsIProgressEventSink))
725
 
+      return this;
726
 
+
727
 
+    return null;
728
 
+  },
729
 
+
730
 
+  onDownloadComplete: function(downloader, request, ctxt, status, result)
731
 
+  {
732
 
+    if (!Components.isSuccessCode(status)) {
733
 
+      // xpinstall error 228 is "Download Error"
734
 
+      this._fireNotification(INSTALL_FINISHED, getLocalizedError("error-228"));
735
 
+      result.remove(false);
736
 
+      return;
737
 
+    }
738
 
+
739
 
+    this._fireNotification(DOWNLOAD_FINISHED);
740
 
+
741
 
+    if (this._plugin.InstallerHash &&
742
 
+        !verifyHash(result, this._plugin.InstallerHash)) {
743
 
+      // xpinstall error 261 is "Invalid file hash..."
744
 
+      this._fireNotification(INSTALL_FINISHED, getLocalizedError("error-261"));
745
 
+      result.remove(false);
746
 
+      return;
747
 
+    }
748
 
+
749
 
+    this._fireNotification(INSTALL_STARTED);
750
 
+
751
 
+    result.QueryInterface(Components.interfaces.nsILocalFile);
752
 
+    try {
753
 
+      // Make sure the file is executable
754
 
+      result.permissions = 0770;
755
 
+      var process = Components.classes["@mozilla.org/process/util;1"]
756
 
+                              .createInstance(Components.interfaces.nsIProcess);
757
 
+      process.init(result);
758
 
+      var self = this;
759
 
+      process.runAsync([], 0, {
760
 
+        observe: function(subject, topic, data) {
761
 
+          if (topic != "process-finished") {
762
 
+            Components.utils.reportError("Failed to launch installer");
763
 
+            self._fireNotification(INSTALL_FINISHED,
764
 
+                                   getLocalizedError("error-207"));
765
 
+          }
766
 
+          else if (process.exitValue != 0) {
767
 
+            Components.utils.reportError("Installer returned exit code " + process.exitValue);
768
 
+            self._fireNotification(INSTALL_FINISHED,
769
 
+                                   getLocalizedError("error-203"));
770
 
+          }
771
 
+          else {
772
 
+            self._fireNotification(INSTALL_FINISHED, null);
773
 
+          }
774
 
+          result.remove(false);
775
 
         }
776
 
-      }
777
 
+      });
778
 
+    }
779
 
+    catch (e) {
780
 
+      Components.utils.reportError(e);
781
 
+      this._fireNotification(INSTALL_FINISHED, getLocalizedError("error-207"));
782
 
+      result.remove(false);
783
 
     }
784
 
+  },
785
 
 
786
 
-    gPluginInstaller.pluginXPIInstallationProgress(pid, aState, errorMsg);
787
 
+  onProgress: function(aRequest, aContext, aProgress, aProgressMax)
788
 
+  {
789
 
+    gPluginInstaller.pluginInstallationProgressMeter(this._plugin.pid,
790
 
+                                                     aProgress,
791
 
+                                                     aProgressMax);
792
 
+  },
793
 
 
794
 
+  onStatus: function(aRequest, aContext, aStatus, aStatusArg)
795
 
+  {
796
 
+    /* pass */
797
 
+  }
798
 
+};
799
 
+
800
 
+var PluginInstallService = {
801
 
+
802
 
+  /**
803
 
+   * Start installation of installers and XPI plugins.
804
 
+   * @param aInstallerPlugins An array of objects which should have the
805
 
+   *                          properties "pid", "InstallerLocation",
806
 
+   *                          and "InstallerHash"
807
 
+   * @param aXPIPlugins       An array of objects which should have the
808
 
+   *                          properties "pid", "XPILocation",
809
 
+   *                          and "XPIHash"
810
 
+   */
811
 
+  startPluginInstallation: function (aInstallerPlugins,
812
 
+                                     aXPIPlugins)
813
 
+  {
814
 
+    this._xpiPlugins = aXPIPlugins;
815
 
+    this._xpisPending = aXPIPlugins.length;
816
 
+
817
 
+    aXPIPlugins.forEach(function(plugin) {
818
 
+      AddonManager.getInstallForURL(plugin.XPILocation, function(install) {
819
 
+        install.addListener(PluginInstallService);
820
 
+        install.install();
821
 
+      }, "application/x-xpinstall", plugin.XPIHash);
822
 
+    });
823
 
+
824
 
+    // InstallerObserver may finish immediately so we must initialise the
825
 
+    // installers after setting the number of installers and xpis pending
826
 
+    this._installersPending = aInstallerPlugins.length;
827
 
+    this._installerPlugins = [new InstallerObserver(plugin)
828
 
+                              for each (plugin in aInstallerPlugins)];
829
 
   },
830
 
 
831
 
-  onProgress: function (aIndex, aValue, aMaxValue)
832
 
+  _fireFinishedNotification: function()
833
 
   {
834
 
-    // get the pid to return to the wizard
835
 
-    var pid = this.pluginPidArray[aIndex];
836
 
+    if (this._installersPending == 0 && this._xpisPending == 0)
837
 
+      gPluginInstaller.pluginXPIInstallationProgress(null, INSTALLS_COMPLETE, null);
838
 
+  },
839
 
+
840
 
+  getPidForInstall: function(install) {
841
 
+    for (let i = 0; i < this._xpiPlugins.length; i++) {
842
 
+      if (install.sourceURI.spec == this._xpiPlugins[i].XPILocation)
843
 
+        return this._xpiPlugins[i].pid;
844
 
+    }
845
 
+    return -1;
846
 
+  },
847
 
+
848
 
+  // InstallListener interface
849
 
+  onDownloadStarted: function(install) {
850
 
+    var pid = this.getPidForInstall(install);
851
 
+    gPluginInstaller.pluginXPIInstallationProgress(pid, DOWNLOAD_STARTED, null);
852
 
+  },
853
 
+
854
 
+  onDownloadProgress: function(install) {
855
 
+    var pid = this.getPidForInstall(install);
856
 
+    gPluginInstaller.pluginXPIInstallationProgressMeter(pid, install.progress,
857
 
+                                                     install.maxProgress);
858
 
+  },
859
 
+
860
 
+  onDownloadEnded: function(install) {
861
 
+    var pid = this.getPidForInstall(install);
862
 
+    gPluginInstaller.pluginXPIInstallationProgress(pid, DOWNLOAD_FINISHED, null);
863
 
+  },
864
 
+
865
 
+  onDownloadFailed: function(install) {
866
 
+    var pid = this.getPidForInstall(install);
867
 
+    switch (install.error) {
868
 
+    case AddonManager.ERROR_NETWORK_FAILURE:
869
 
+      var errorMsg = getLocalizedError("error-228");
870
 
+      break;
871
 
+    case AddonManager.ERROR_INCORRECT_HASH:
872
 
+      var errorMsg = getLocalizedError("error-261");
873
 
+      break;
874
 
+    case AddonManager.ERROR_CORRUPT_FILE:
875
 
+      var errorMsg = getLocalizedError("error-207");
876
 
+      break;
877
 
+    }
878
 
+    gPluginInstaller.pluginXPIInstallationProgress(pid, INSTALL_FINISHED, errorMsg);
879
 
+
880
 
+    this._xpisPending--;
881
 
+    this._fireFinishedNotification();
882
 
+  },
883
 
+
884
 
+  onInstallStarted: function(install) {
885
 
+    var pid = this.getPidForInstall(install);
886
 
+    gPluginInstaller.pluginXPIInstallationProgress(pid, INSTALL_STARTED, null);
887
 
+  },
888
 
+
889
 
+  onInstallEnded: function(install, addon) {
890
 
+    var pid = this.getPidForInstall(install);
891
 
+    gPluginInstaller.pluginXPIInstallationProgress(pid, INSTALL_FINISHED, null);
892
 
+
893
 
+    this._xpisPending--;
894
 
+    this._fireFinishedNotification();
895
 
+  },
896
 
+
897
 
+  onInstallFailed: function(install) {
898
 
+    var pid = this.getPidForInstall(install);
899
 
+    gPluginInstaller.pluginXPIInstallationProgress(pid, INSTALL_FINISHED,
900
 
+                                                   getLocalizedError("error-203"));
901
 
 
902
 
-    gPluginInstaller.pluginXPIInstallationProgressMeter(pid, aValue, aMaxValue);
903
 
+    this._xpisPending--;
904
 
+    this._fireFinishedNotification();
905
 
   }
906
 
 }
907
 
 
908
 
@@ -95,13 +340,11 @@ var AptInstaller = {
909
 
   mAptPidArray: null,
910
 
   mRunning: false,
911
 
 
912
 
-  install: function(aAptUrlArray,
913
 
-                   aAptPidArray,
914
 
+  install: function(aAptPlugins,
915
 
                    aAptInstallerService) {
916
 
 
917
 
     this.mAptInstallerService = aAptInstallerService;
918
 
-    this.mAptUrlArray = aAptUrlArray;
919
 
-    this.mAptPidArray = aAptPidArray;
920
 
+    this.mAptPlugins = aAptPlugins;
921
 
     this.mRunning = true;
922
 
 
923
 
     //    var thread = Components.classes["@mozilla.org/thread;1"]
924
 
@@ -112,9 +355,9 @@ var AptInstaller = {
925
 
 
926
 
   run: function()
927
 
   {
928
 
-    for (var i = 0; i < this.mAptUrlArray.length; i++) {
929
 
-      var aptUrl = this.mAptUrlArray[i];
930
 
-      var aptPid = this.mAptPidArray[i];
931
 
+    for (var i = 0; i < this.mAptPlugins.length; i++) {
932
 
+      var aptUrl = this.mAptPlugins[i].XPILocation;
933
 
+      var aptPid = this.mAptPlugins[i].pid;
934
 
       this.mAptInstallerService.onNotifyStart(aptUrl, aptPid);
935
 
 
936
 
       var executable =
937
 
@@ -125,7 +368,7 @@ var AptInstaller = {
938
 
 
939
 
       if(!executable.exists() || !executable.isExecutable()) {
940
 
         window.alert('Unexpected error!');
941
 
-        this.mAptInstallerService.onNotifyResult(aptUrl, aptPid, -1 );
942
 
+        this.mAptInstallerService.onNotifyResult(aptUrl, aptPid, -1);
943
 
         continue;
944
 
       }
945
 
 
946
 
@@ -181,9 +424,8 @@ var PluginAPTInstallService = {
947
 
 
948
 
   pluginPidArray: null,
949
 
 
950
 
-  startPluginInstallation: function (aPluginAptUrlsArray,
951
 
-                                    aPluginPidArray) {
952
 
-    AptInstaller.install(aPluginAptUrlsArray, aPluginPidArray, this);
953
 
+  startPluginInstallation: function (aAptPlugins) {
954
 
+    AptInstaller.install(aAptPlugins, this);
955
 
   },
956
 
 
957
 
   onNotifyStart: function (aptUrl, aptPid) {
958
 
--- a/content/pluginInstallerWizard.js
959
 
+++ b/content/pluginInstallerWizard.js
960
 
@@ -64,14 +64,15 @@ function nsPluginInstallerWizard(){
961
 
   // how many plugins are to be installed
962
 
   this.pluginsToInstallNum = 0;
963
 
 
964
 
-  this.mTab = null;
965
 
   this.mBrowser = null;
966
 
   this.mSuccessfullPluginInstallation = 0;
967
 
+  this.mNeedsRestart = false;
968
 
 
969
 
   this.mPluginPidArray = new Object();
970
 
   // arguments[0] is an array that contains two items:
971
 
   //     an array of mimetypes that are missing
972
 
-  //     a reference to the tab that needs them, so we can reload it
973
 
+  //     a reference to the browser that needs them, 
974
 
+  //        so we can notify which browser can be reloaded.
975
 
 
976
 
   if ("arguments" in window) {
977
 
     for (var item in window.arguments[0].plugins){
978
 
@@ -81,8 +82,7 @@ function nsPluginInstallerWizard(){
979
 
       this.mPluginRequestArrayLength++;
980
 
     }
981
 
 
982
 
-    this.mBrowser = window.arguments[0].browser; // ffox 3
983
 
-    this.mTab = window.arguments[0].tab; // ffox 2
984
 
+    this.mBrowser = window.arguments[0].browser;
985
 
   }
986
 
 
987
 
   this.WSPluginCounter = 0;
988
 
@@ -100,14 +100,14 @@ nsPluginInstallerWizard.prototype.getPlu
989
 
   // initiate the datasource call
990
 
   var rdfUpdater = new nsRDFItemUpdater(this.getOS(), this.getChromeLocale());
991
 
 
992
 
-  for (item in this.mPluginRequestArray) {
993
 
+  for (var item in this.mPluginRequestArray) {
994
 
     rdfUpdater.checkForPlugin(this.mPluginRequestArray[item]);
995
 
   }
996
 
 }
997
 
 
998
 
 // aPluginInfo is null if the datasource call failed, and pid is -1 if
999
 
 // no matching plugin was found.
1000
 
-nsPluginInstallerWizard.prototype.pluginInfoReceived = function (aPluginInfos){
1001
 
+nsPluginInstallerWizard.prototype.pluginInfoReceived = function (aPluginRequestItem, aPluginInfos){
1002
 
   this.WSPluginCounter++;
1003
 
 
1004
 
   if (aPluginInfos ) {
1005
 
@@ -121,7 +121,7 @@ nsPluginInstallerWizard.prototype.plugin
1006
 
       aPluginInfo = aPluginInfos[i];
1007
 
       resultSetMimeType = aPluginInfo.requestedMimetype;
1008
 
       if (aPluginInfo && aPluginInfo.pid != -1 &&
1009
 
-         ( aPluginInfo.XPILocation || aPluginInfo.manualInstallationURL )) {
1010
 
+         ( aPluginInfo.XPILocation || aPluginInfo.manualInstallationURL || aPluginInfo.InstallerLocation)) {
1011
 
        hasResults = true;
1012
 
        filteredPluginInfoSet.push(aPluginInfo);
1013
 
        this.mPluginPidArray[aPluginInfo.pid] = aPluginInfo;
1014
 
@@ -130,10 +130,10 @@ nsPluginInstallerWizard.prototype.plugin
1015
 
 
1016
 
     if(filteredPluginInfoSet.length > 0)
1017
 
     {
1018
 
-      this.mPluginInfoArray[resultSetMimeType] = filteredPluginInfoSet;
1019
 
+      this.mPluginInfoArray[aPluginRequestItem.mimetype] = filteredPluginInfoSet;
1020
 
       this.mPluginInfoArrayLength++;
1021
 
     } else {
1022
 
-      this.mPluginNotFoundArray[resultSetMimeType] = filteredPluginInfoSet;
1023
 
+      this.mPluginNotFoundArray[aPluginRequestItem.mimetype] = aPluginRequestItem;
1024
 
       this.mPluginNotFoundArrayLength++;
1025
 
     }
1026
 
   }
1027
 
@@ -148,18 +148,18 @@ nsPluginInstallerWizard.prototype.plugin
1028
 
 
1029
 
   if (this.WSPluginCounter == this.mPluginRequestArrayLength) {
1030
 
     // check if no plugins were found
1031
 
-    if (this.mPluginInfoArrayLength == 0 && this.mPluginInfoAptArrayLength == 0) {
1032
 
-      this.advancePage("lastpage", true, false, false);
1033
 
+    if (this.mPluginInfoArrayLength == 0) {
1034
 
+      this.advancePage("lastpage");
1035
 
     } else {
1036
 
       // we want to allow user to cancel
1037
 
-      this.advancePage(null, true, false, true);
1038
 
+      this.advancePage(null);
1039
 
     }
1040
 
   } else {
1041
 
     // process more.
1042
 
   }
1043
 
 }
1044
 
 
1045
 
-nsPluginInstallerWizard.prototype.createPluginSetGroupBox = function () {
1046
 
+nsPluginInstallerWizard.prototype.createPluginSetGroupBox = function (mimetype) {
1047
 
 
1048
 
   var stringBundle = document.getElementById("ubufoxPluginWizardString");
1049
 
   var gbox = document.createElement("vbox");
1050
 
@@ -193,11 +193,11 @@ nsPluginInstallerWizard.prototype.showPl
1051
 
   var groupBox = null;
1052
 
   var lastSibling = null;
1053
 
 
1054
 
-  for (mimetype in this.mPluginInfoArray){
1055
 
+  for (var mimetype in this.mPluginInfoArray){
1056
 
     // [plugin image] [Plugin_Name Plugin_Version]
1057
 
     var pluginInfoSet = this.mPluginInfoArray[mimetype];
1058
 
     var firstPluginSet = (groupBox == null);
1059
 
-    groupBox = this.createPluginSetGroupBox(document, mimetype, pluginInfoSet);
1060
 
+    groupBox = this.createPluginSetGroupBox(mimetype);
1061
 
 
1062
 
     if(firstPluginSet) {
1063
 
       this.mPluginPlaceHolder = document.getElementById("pluginselection-placeholder");
1064
 
@@ -275,6 +275,7 @@ nsPluginInstallerWizard.prototype.showPl
1065
 
     if (pluginInfo.InstallerShowsUI == "true")
1066
 
       hasPluginWithInstallerUI = true;
1067
 
 
1068
 
+    // keep a running count of plugins the user wants to install
1069
 
     this.pluginsToInstallNum++;
1070
 
   }
1071
 
 
1072
 
@@ -290,14 +291,14 @@ nsPluginInstallerWizard.prototype.toggle
1073
 
   var mime = selectedItem._ubufoxPluginInfoMimeType;
1074
 
   this.mMimeTypePluginSelections[mime] = selectedItem._ubufoxPluginInfo.pid;
1075
 
 
1076
 
-  let count  = 0;
1077
 
-  for (mime in this.mMimeTypePluginSelections) {
1078
 
+  this.pluginsToInstallNum = 0;
1079
 
+  for (var mime in this.mMimeTypePluginSelections) {
1080
 
     if(this.mMimeTypePluginSelections[mime] && this.mMimeTypePluginSelections[mime] != "-1")
1081
 
-      count++;
1082
 
+      this.pluginsToInstallNum++;
1083
 
   }
1084
 
  
1085
 
   // if no plugins are checked, don't allow to advance
1086
 
-  if (count > 0)
1087
 
+  if (this.pluginsToInstallNum > 0)
1088
 
     this.canAdvance(true);
1089
 
   else
1090
 
     this.canAdvance(false);
1091
 
@@ -321,7 +322,7 @@ nsPluginInstallerWizard.prototype.showLi
1092
 
 
1093
 
   // only add if a license is provided and the plugin was selected to
1094
 
   // be installed
1095
 
-  for (mimetype in this.mMimeTypePluginSelections){
1096
 
+  for (var mimetype in this.mMimeTypePluginSelections){
1097
 
     var pid = this.mMimeTypePluginSelections[mimetype];
1098
 
     var pluginInfo = this.mPluginPidArray[pid];
1099
 
     if (pluginInfo && pluginInfo.licenseURL && (pluginInfo.licenseURL != "")) {
1100
 
@@ -331,7 +332,7 @@ nsPluginInstallerWizard.prototype.showLi
1101
 
 
1102
 
   if (this.mPluginLicenseArray.length == 0) {
1103
 
     // no plugins require licenses
1104
 
-    this.advancePage(null, true, false, false);
1105
 
+    this.advancePage(null);
1106
 
   } else {
1107
 
     this.licenseAcceptCounter = 0;
1108
 
 
1109
 
@@ -389,7 +390,7 @@ nsPluginInstallerWizard.prototype.showLi
1110
 
 
1111
 
   this.canAdvance(false);
1112
 
 
1113
 
-  loadFlags = Components.interfaces.nsIWebNavigation.LOAD_FLAGS_NONE;
1114
 
+  var loadFlags = Components.interfaces.nsIWebNavigation.LOAD_FLAGS_NONE;
1115
 
 
1116
 
   document.getElementById("licenseIFrame").webNavigation.loadURI(pluginInfo.licenseURL, loadFlags, null, null, null);
1117
 
 
1118
 
@@ -447,60 +448,46 @@ nsPluginInstallerWizard.prototype.licens
1119
 
     this.canAdvance(aAccepted);
1120
 
 }
1121
 
 
1122
 
-nsPluginInstallerWizard.prototype.advancePage = function (aPageId, aCanAdvance, aCanRewind, aCanCancel){
1123
 
+nsPluginInstallerWizard.prototype.advancePage = function (aPageId){
1124
 
   this.canAdvance(true);
1125
 
   document.getElementById("plugin-installer-wizard").advance(aPageId);
1126
 
-
1127
 
-  this.canAdvance(aCanAdvance);
1128
 
-  this.canRewind(aCanRewind);
1129
 
-  this.canCancel(aCanCancel);
1130
 
 }
1131
 
 
1132
 
 nsPluginInstallerWizard.prototype.startPluginInstallation = function (){
1133
 
   this.canAdvance(false);
1134
 
   this.canRewind(false);
1135
 
 
1136
 
-  // since the user can choose what plugins to install, we need to store
1137
 
-  // which ones were choosen, as nsIXPInstallManager returns an index and not the
1138
 
-  // mimetype.  So store the pids.
1139
 
-
1140
 
-  // for ubutfox we deal with multiple cases: first case is XPIInstall, which will
1141
 
+  // for ubufox we deal with multiple cases: first case is XPIInstall, which will
1142
 
   // run the "normal" XPIInstall process; second case is XPIInstall url contains
1143
 
   // and apt: protocol url ... this will run apt protocol handler 
1144
 
-  var pluginURLArray = new Array();
1145
 
-  var pluginHashArray = new Array();
1146
 
-  var pluginPidArray = new Array();
1147
 
-  this.mAptPluginURLArray = new Array();
1148
 
-  this.mAptPluginPidArray = new Array();
1149
 
-
1150
 
-  for (mime in this.mMimeTypePluginSelections) {
1151
 
-    var pluginPid = this.mMimeTypePluginSelections[mime];
1152
 
-    var pluginItem = this.mPluginPidArray[pluginPid];
1153
 
-
1154
 
-    // only push to the array if it has an XPILocation, else nsIXPInstallManager
1155
 
-    // will complain.
1156
 
-    if (pluginItem && pluginItem.XPILocation && pluginItem.XPILocation.indexOf("apt:") != 0 && pluginItem.licenseAccepted) {
1157
 
-      pluginURLArray.push(pluginItem.XPILocation);
1158
 
-      pluginHashArray.push(pluginItem.XPIHash);
1159
 
-      pluginPidArray.push(pluginItem.pid);
1160
 
-    } else if (pluginItem && pluginItem.XPILocation && pluginItem.XPILocation.indexOf("apt:") == 0) {
1161
 
-      this.mAptPluginURLArray.push(pluginItem.XPILocation);
1162
 
-      this.mAptPluginPidArray.push(pluginPid);
1163
 
-    } else {
1164
 
-      window.alert("Unhandled mime install flavour (supported: vendor, apt)");
1165
 
-      continue;
1166
 
+  var installerPlugins = [];
1167
 
+  var xpiPlugins = [];
1168
 
+  this.aptPlugins = [];
1169
 
+
1170
 
+  for (var mime in this.mMimeTypePluginSelections) {
1171
 
+    var pluginItem = this.mPluginPidArray[this.mMimeTypePluginSelections[mime]];
1172
 
+
1173
 
+    if (pluginItem && pluginItem.licenseAccepted) {
1174
 
+      if (pluginItem.InstallerLocation)
1175
 
+        installerPlugins.push(pluginItem);
1176
 
+      else if (pluginItem.XPILocation && pluginItem.XPILocation.indexOf("apt:") != 0)
1177
 
+        xpiPlugins.push(pluginItem);
1178
 
+      else if (pluginItem.XPILocation && pluginItem.XPILocation.indexOf("apt:") == 0)
1179
 
+        this.aptPlugins.push(pluginItem);
1180
 
+      else {
1181
 
+        window.alert("Unhandled mime install flavour (supported: vendor, apt)");
1182
 
+        continue;
1183
 
+      }
1184
 
     }
1185
 
   }
1186
 
 
1187
 
-  if (pluginURLArray.length > 0)
1188
 
-    PluginXPIInstallService.startPluginInstallation(pluginURLArray,
1189
 
-                                                   pluginHashArray,
1190
 
-                                                   pluginPidArray);
1191
 
-  else if (this.mAptPluginURLArray.length > 0)
1192
 
-    PluginAPTInstallService.startPluginInstallation(this.mAptPluginURLArray,
1193
 
-                                                   this.mAptPluginPidArray);
1194
 
+  if (installerPlugins.length > 0 || xpiPlugins.length > 0)
1195
 
+    PluginXPIInstallService.startPluginInstallation(installerPlugins,
1196
 
+                                                   xpiPlugins);
1197
 
+  else if (this.aptPlugins.length > 0)
1198
 
+    PluginAPTInstallService.startPluginInstallation(this.aptPlugins);
1199
 
   else
1200
 
-    this.advancePage(null, true, false, false);
1201
 
+    this.advancePage(null);
1202
 
 }
1203
 
 
1204
 
 /*
1205
 
@@ -530,6 +517,8 @@ nsPluginInstallerWizard.prototype.plugin
1206
 
 
1207
 
     case 2:
1208
 
       statMsg = this.getFormattedString("pluginInstallation.install.start", [pluginInfo.name]);
1209
 
+      var progressElm = document.getElementById("plugin_install_progress");
1210
 
+      progressElm.setAttribute("mode", "undetermined");
1211
 
       break;
1212
 
     case 6:
1213
 
       statMsg = "APT - " + this.getFormattedString("pluginInstallation.install.start", [pluginInfo.name]);
1214
 
@@ -555,11 +544,10 @@ nsPluginInstallerWizard.prototype.plugin
1215
 
       break;
1216
 
 
1217
 
     case 4:
1218
 
-      PluginAPTInstallService.startPluginInstallation(this.mAptPluginURLArray,
1219
 
-                                                     this.mAptPluginPidArray);
1220
 
+      PluginAPTInstallService.startPluginInstallation(this.aptPlugins);
1221
 
       break;
1222
 
     case 8:
1223
 
-      this.advancePage(null, true, false, false);
1224
 
+      this.advancePage(null);
1225
 
       statMsg = this.getString("pluginInstallation.complete");
1226
 
       break;
1227
 
     default:
1228
 
@@ -630,15 +618,12 @@ nsPluginInstallerWizard.prototype.showPl
1229
 
   var notInstalledList = "?action=missingplugins";
1230
 
   var myRows = document.getElementById("pluginResultList");
1231
 
 
1232
 
-  this.mNeedsRestart = false;
1233
 
-
1234
 
   // clear children
1235
 
   for (var run = myRows.childNodes.length; run--; run > 0)
1236
 
     myRows.removeChild(myRows.childNodes.item(run));
1237
 
 
1238
 
-  for (mimetype in this.mMimeTypePluginSelections) {
1239
 
-    var pid = this.mMimeTypePluginSelections[mimetype];
1240
 
-    var pluginInfoItem = this.mPluginPidArray[pid];
1241
 
+  for (var mimetype in this.mMimeTypePluginSelections) {
1242
 
+    var pluginInfoItem = this.mPluginPidArray[this.mMimeTypePluginSelections[mimetype]];
1243
 
     // [plugin image] [Plugin_Name Plugin_Version] [Success/Failed] [Manual Install (if Failed)]
1244
 
 
1245
 
     var myPluginItem = pluginInfoItem; //this.mPluginInfoArray[pluginInfoItem];
1246
 
@@ -651,7 +636,7 @@ nsPluginInstallerWizard.prototype.showPl
1247
 
       notInstalledList += "&mimetype=" + pluginInfoItem;
1248
 
     } else if (myPluginItem.licenseURL && !myPluginItem.licenseAccepted) {
1249
 
       statusMsg = this.getString("pluginInstallationSummary.licenseNotAccepted");
1250
 
-    } else if (!myPluginItem.XPILocation) {
1251
 
+    } else if (!myPluginItem.XPILocation && !myPluginItem.InstallerLocation) {
1252
 
       statusMsg = this.getString("pluginInstallationSummary.notAvailable");
1253
 
       notInstalledList += "&mimetype=" + pluginInfoItem;
1254
 
     } else {
1255
 
@@ -660,12 +645,12 @@ nsPluginInstallerWizard.prototype.showPl
1256
 
 
1257
 
       // only check needsRestart if the plugin was successfully installed.
1258
 
       if (myPluginItem.needsRestart)
1259
 
-       this.mNeedsRestart = false;
1260
 
+       this.mNeedsRestart = true;
1261
 
     }
1262
 
 
1263
 
     // manual url - either returned from the webservice or the pluginspage attribute
1264
 
     var manualUrl;
1265
 
-    if ((myPluginItem.error || !myPluginItem.XPILocation) && (myPluginItem.manualInstallationURL || this.mPluginRequestArray[myPluginItem.requestedMimetype].pluginsPage)){
1266
 
+    if ((myPluginItem.error || (!myPluginItem.XPILocation && !myPluginItem.InstallerLocation)) && (myPluginItem.manualInstallationURL || this.mPluginRequestArray[myPluginItem.requestedMimetype].pluginsPage)){
1267
 
       manualUrl = myPluginItem.manualInstallationURL ? myPluginItem.manualInstallationURL : this.mPluginRequestArray[myPluginItem.requestedMimetype].pluginsPage;
1268
 
     }
1269
 
 
1270
 
@@ -680,10 +665,10 @@ nsPluginInstallerWizard.prototype.showPl
1271
 
 
1272
 
   // handle plugins we couldn't find
1273
 
   for (pluginInfoItem in this.mPluginNotFoundArray){
1274
 
-    var pluginRequest = this.mPluginRequestArray[pluginInfoItem];
1275
 
+    var pluginRequest = this.mPluginNotFoundArray[pluginInfoItem];
1276
 
 
1277
 
     // if there is a pluginspage, show UI
1278
 
-    if (pluginRequest) {
1279
 
+    if (pluginRequest.pluginsPage) {
1280
 
       this.addPluginResultRow(
1281
 
           "",
1282
 
           this.getFormattedString("pluginInstallation.unknownPlugin", [pluginInfoItem]),
1283
 
@@ -716,28 +701,43 @@ nsPluginInstallerWizard.prototype.showPl
1284
 
     "&appID=" + app.ID +
1285
 
     "&appVersion=" + app.platformBuildID +
1286
 
     "&clientOS=" + this.getOS() +
1287
 
-    "&chromeLocale=" + this.getChromeLocale();
1288
 
+    "&chromeLocale=" + this.getChromeLocale() +
1289
 
+    "&appRelease=" + app.version;
1290
 
 
1291
 
   document.getElementById("moreInfoLink").addEventListener("click", function() { gPluginInstaller.loadURL("https://pfs.mozilla.org/plugins/" + notInstalledList) }, false);
1292
 
 
1293
 
+  if (this.mNeedsRestart) {
1294
 
+    var cancel = document.getElementById("plugin-installer-wizard").getButton("cancel");
1295
 
+    cancel.label = this.getString("pluginInstallation.close.label");
1296
 
+    cancel.accessKey = this.getString("pluginInstallation.close.accesskey");
1297
 
+    var finish = document.getElementById("plugin-installer-wizard").getButton("finish");
1298
 
+    finish.label = this.getFormattedString("pluginInstallation.restart.label", [app.name]);
1299
 
+    finish.accessKey = this.getString("pluginInstallation.restart.accesskey");
1300
 
+    this.canCancel(true);
1301
 
+  }
1302
 
+  else {
1303
 
+    this.canCancel(false);
1304
 
+  }
1305
 
+
1306
 
   this.canAdvance(true);
1307
 
   this.canRewind(false);
1308
 
-  this.canCancel(false);
1309
 
 }
1310
 
 
1311
 
 nsPluginInstallerWizard.prototype.loadURL = function (aUrl){
1312
 
   // Check if the page where the plugin came from can load aUrl before
1313
 
-  // loading it, and do *not* allow loading javascript: or data: URIs.
1314
 
-  var pluginPage = window.opener.content.location.href;
1315
 
+  // loading it, and do *not* allow loading URIs that would inherit our
1316
 
+  // principal.
1317
 
+  
1318
 
+  var pluginPagePrincipal =
1319
 
+    window.opener.content.document.nodePrincipal;
1320
 
 
1321
 
   const nsIScriptSecurityManager =
1322
 
     Components.interfaces.nsIScriptSecurityManager;
1323
 
-  var secMan =
1324
 
-    Components.classes["@mozilla.org/scriptsecuritymanager;1"]
1325
 
-    .getService(nsIScriptSecurityManager);
1326
 
+  var secMan = Components.classes["@mozilla.org/scriptsecuritymanager;1"]
1327
 
+                         .getService(nsIScriptSecurityManager);
1328
 
 
1329
 
-  secMan.checkLoadURIStr(pluginPage, aUrl,
1330
 
-                         nsIScriptSecurityManager.DISALLOW_SCRIPT_OR_DATA);
1331
 
+  secMan.checkLoadURIStrWithPrincipal(pluginPagePrincipal, aUrl,
1332
 
+    nsIScriptSecurityManager.DISALLOW_INHERIT_PRINCIPAL);
1333
 
 
1334
 
   window.opener.open(aUrl);
1335
 
 }
1336
 
@@ -792,6 +792,8 @@ function PluginInfo(aResult) {
1337
 
   this.pid = aResult.pid;
1338
 
   this.version = aResult.version;
1339
 
   this.IconUrl = aResult.IconUrl;
1340
 
+  this.InstallerLocation = aResult.InstallerLocation;
1341
 
+  this.InstallerHash = aResult.InstallerHash;
1342
 
   this.XPILocation = aResult.XPILocation;
1343
 
   this.XPIHash = aResult.XPIHash;
1344
 
   this.InstallerShowsUI = aResult.InstallerShowsUI;
1345
 
@@ -816,7 +818,6 @@ function wizardInit(){
1346
 
 }
1347
 
 
1348
 
 function wizardFinish(){
1349
 
-  // we restart if we have no choice ...
1350
 
   if (gPluginInstaller.mNeedsRestart) {
1351
 
     // Notify all windows that an application quit has been requested.
1352
 
     var os = Components.classes["@mozilla.org/observer-service;1"]
1353
 
@@ -835,21 +836,26 @@ function wizardFinish(){
1354
 
     }
1355
 
   }
1356
 
 
1357
 
-  if (gPluginInstaller.mBrowser) { // ffox 3 code can autoscan ...
1358
 
-    // always refresh
1359
 
-    var event = document.createEvent("Events");
1360
 
-    event.initEvent("NewPluginInstalled", true, true);
1361
 
-    var dispatched = gPluginInstaller.mBrowser.dispatchEvent(event);
1362
 
-  }
1363
 
-  else if (gPluginInstaller.mTab) { // ffox 2 code can autoscan ...
1364
 
-    if ((gPluginInstaller.mSuccessfullPluginInstallation > 0) &&
1365
 
-       (gPluginInstaller.mPluginInfoArrayLength != 0)) {
1366
 
-      // clear the tab's plugin list only if we installed at least one plugin
1367
 
-      gPluginInstaller.mTab.missingPlugins = null;
1368
 
-      // reset UI
1369
 
-      window.opener.gMissingPluginInstaller.closeNotification();
1370
 
-      // reload the browser to make the new plugin show
1371
 
-      window.opener.getBrowser().reloadTab(gPluginInstaller.mTab);
1372
 
+  // don't refresh if no plugins were found or installed
1373
 
+  if ((gPluginInstaller.mSuccessfullPluginInstallation > 0) &&
1374
 
+      (gPluginInstaller.mPluginInfoArray.length != 0)) {
1375
 
+
1376
 
+    // reload plugins so JS detection works immediately
1377
 
+    try {
1378
 
+      var ph = Components.classes["@mozilla.org/plugin/host;1"]
1379
 
+                         .getService(Components.interfaces.nsIPluginHost);
1380
 
+      ph.reloadPlugins(false);
1381
 
+    }
1382
 
+    catch (e) {
1383
 
+      // reloadPlugins throws an exception if there were no plugins to load
1384
 
+    }
1385
 
+
1386
 
+    if (gPluginInstaller.mBrowser) {
1387
 
+      // notify listeners that a plugin is installed,
1388
 
+      // so that they can reset the UI and update the browser.
1389
 
+      var event = document.createEvent("Events");
1390
 
+      event.initEvent("NewPluginInstalled", true, true);
1391
 
+      gPluginInstaller.mBrowser.dispatchEvent(event);
1392
 
     }
1393
 
   }
1394
 
 
1395
 
--- a/content/pluginInstallerWizard.xul
1396
 
+++ b/content/pluginInstallerWizard.xul
1397
 
@@ -55,9 +55,9 @@
1398
 
         onload="wizardInit()"
1399
 
         onwizardfinish="return wizardFinish();">
1400
 
 
1401
 
-  <script type="application/x-javascript" src="chrome://ubufox/content/pluginInstallerWizard.js"/>
1402
 
-  <script type="application/x-javascript" src="chrome://ubufox/content/pluginInstallerDatasource.js"/>
1403
 
-  <script type="application/x-javascript" src="chrome://ubufox/content/pluginInstallerService.js"/>
1404
 
+  <script type="application/javascript" src="chrome://ubufox/content/pluginInstallerWizard.js"/>
1405
 
+  <script type="application/javascript" src="chrome://ubufox/content/pluginInstallerDatasource.js"/>
1406
 
+  <script type="application/javascript" src="chrome://ubufox/content/pluginInstallerService.js"/>
1407
 
 
1408
 
   <stringbundleset id="pluginSet">
1409
 
     <stringbundle id="brandStrings" src="chrome://branding/locale/brand.properties"/>
1410
 
--- a/content/ubuntuAddonsOverlay.ffox2.xul
1411
 
+++ /dev/null
1412
 
@@ -1,53 +0,0 @@
1413
 
-<?xml version="1.0" encoding="UTF-8"?>
1414
 
-<!-- ***** BEGIN LICENSE BLOCK *****
1415
 
-  -   Version: MPL 1.1/GPL 2.0/LGPL 2.1
1416
 
-  -
1417
 
-  - The contents of this file are subject to the Mozilla Public License Version
1418
 
-  - 1.1 (the "License"); you may not use this file except in compliance with
1419
 
-  - the License. You may obtain a copy of the License at
1420
 
-  - http://www.mozilla.org/MPL/
1421
 
-  - 
1422
 
-  - Software distributed under the License is distributed on an "AS IS" basis,
1423
 
-  - WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
1424
 
-  - for the specific language governing rights and limitations under the
1425
 
-  - License.
1426
 
-  -
1427
 
-  - The Original Code is distro-mods.
1428
 
-  -
1429
 
-  - The Initial Developer of the Original Code is
1430
 
-  - Canonical Ltd.
1431
 
-  - Portions created by the Initial Developer are Copyright (C) 2007
1432
 
-  - the Initial Developer. All Rights Reserved.
1433
 
-  -
1434
 
-  - Contributor(s):
1435
 
-  -
1436
 
-  - Alternatively, the contents of this file may be used under the terms of
1437
 
-  - either the GNU General Public License Version 2 or later (the "GPL"), or
1438
 
-  - the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
1439
 
-  - in which case the provisions of the GPL or the LGPL are applicable instead
1440
 
-  - of those above. If you wish to allow use of your version of this file only
1441
 
-  - under the terms of either the GPL or the LGPL, and not to allow others to
1442
 
-  - use your version of this file under the terms of the MPL, indicate your
1443
 
-  - decision by deleting the provisions above and replace them with the notice
1444
 
-  - and other provisions required by the GPL or the LGPL. If you do not delete
1445
 
-  - the provisions above, a recipient may use your version of this file under
1446
 
-  - the terms of any one of the MPL, the GPL or the LGPL.
1447
 
-  - 
1448
 
-  - ***** END LICENSE BLOCK ***** -->
1449
 
-
1450
 
-<?xml-stylesheet href="chrome://ubufox/skin/overlay.css" type="text/css"?>
1451
 
-<!DOCTYPE overlay SYSTEM "chrome://ubufox/locale/ubufox.dtd">
1452
 
-<overlay id="ubufox-overlay"
1453
 
-         xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
1454
 
-  <script src="overlay.js"/>
1455
 
-  <stringbundleset id="stringbundleset">
1456
 
-    <stringbundle id="ubufox-strings" src="chrome://ubufox/locale/ubufox.properties"/>
1457
 
-  </stringbundleset>
1458
 
-
1459
 
-  <hbox id="commandBarBottom">
1460
 
-    <label id="getUbuntu" getMoreURL="http://www.google.com" class="text-link" 
1461
 
-           onclick="return startUbuntuAddonsWizard(event);"
1462
 
-           onload="ubufoxCheckExecutable();"
1463
 
-           value="&ubufox.getubuntuextension;"/>
1464
 
-  </hbox>
1465
 
-</overlay>
1466
 
--- a/content/ubuntuAddonsOverlay.xul
1467
 
+++ /dev/null
1468
 
@@ -1,53 +0,0 @@
1469
 
-<?xml version="1.0" encoding="UTF-8"?>
1470
 
-<!-- ***** BEGIN LICENSE BLOCK *****
1471
 
-  -   Version: MPL 1.1/GPL 2.0/LGPL 2.1
1472
 
-  -
1473
 
-  - The contents of this file are subject to the Mozilla Public License Version
1474
 
-  - 1.1 (the "License"); you may not use this file except in compliance with
1475
 
-  - the License. You may obtain a copy of the License at
1476
 
-  - http://www.mozilla.org/MPL/
1477
 
-  - 
1478
 
-  - Software distributed under the License is distributed on an "AS IS" basis,
1479
 
-  - WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
1480
 
-  - for the specific language governing rights and limitations under the
1481
 
-  - License.
1482
 
-  -
1483
 
-  - The Original Code is distro-mods.
1484
 
-  -
1485
 
-  - The Initial Developer of the Original Code is
1486
 
-  - Canonical Ltd.
1487
 
-  - Portions created by the Initial Developer are Copyright (C) 2007
1488
 
-  - the Initial Developer. All Rights Reserved.
1489
 
-  -
1490
 
-  - Contributor(s):
1491
 
-  -
1492
 
-  - Alternatively, the contents of this file may be used under the terms of
1493
 
-  - either the GNU General Public License Version 2 or later (the "GPL"), or
1494
 
-  - the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
1495
 
-  - in which case the provisions of the GPL or the LGPL are applicable instead
1496
 
-  - of those above. If you wish to allow use of your version of this file only
1497
 
-  - under the terms of either the GPL or the LGPL, and not to allow others to
1498
 
-  - use your version of this file under the terms of the MPL, indicate your
1499
 
-  - decision by deleting the provisions above and replace them with the notice
1500
 
-  - and other provisions required by the GPL or the LGPL. If you do not delete
1501
 
-  - the provisions above, a recipient may use your version of this file under
1502
 
-  - the terms of any one of the MPL, the GPL or the LGPL.
1503
 
-  - 
1504
 
-  - ***** END LICENSE BLOCK ***** -->
1505
 
-
1506
 
-<?xml-stylesheet href="chrome://ubufox/skin/overlay.css" type="text/css"?>
1507
 
-<!DOCTYPE overlay SYSTEM "chrome://ubufox/locale/ubufox.dtd">
1508
 
-<overlay id="ubufox-overlay"
1509
 
-         xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
1510
 
-  <script src="overlay.js"/>
1511
 
-  <stringbundleset id="stringbundleset">
1512
 
-    <stringbundle id="ubufox-strings" src="chrome://ubufox/locale/ubufox.properties"/>
1513
 
-  </stringbundleset>
1514
 
-
1515
 
-  <hbox id="searchPanel">
1516
 
-    <label id="getUbuntu3" getMoreURL="http://www.google.com" class="text-link" 
1517
 
-           onclick="return startUbuntuAddonsWizard(event);"
1518
 
-           onload="ubufoxCheckExecutable();"
1519
 
-           value="&ubufox.getubuntuextension;" />
1520
 
-  </hbox>
1521
 
-</overlay>
1522
 
--- a/content/updateRestart.js
1523
 
+++ b/content/updateRestart.js
1524
 
@@ -78,23 +78,20 @@ function String_startsWith (base, str)
1525
 
 function checkUpdate()
1526
 
 {
1527
 
   var resReqFile = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
1528
 
-  var versionString = null;
1529
 
-  try {
1530
 
-    versionString = Components.classes["@mozilla.org/fuel/application;1"].getService(Components.interfaces.extIApplication).version;
1531
 
-  } catch (e) {
1532
 
-  }
1533
 
-  if (versionString != null && String_startsWith (versionString, "3.0"))
1534
 
-    resReqFile.initWithPath("/var/lib/update-notifier/user.d/firefox-3.0-restart-required");
1535
 
-  else if (versionString != null && String_startsWith (versionString, "3.5"))
1536
 
-    resReqFile.initWithPath("/var/lib/update-notifier/user.d/firefox-3.5-restart-required");
1537
 
-  else if (versionString != null && String_startsWith (versionString, "3.6"))
1538
 
-    resReqFile.initWithPath("/var/lib/update-notifier/user.d/firefox-3.6-restart-required");
1539
 
-  else if (versionString != null && String_startsWith (versionString, "3.7"))
1540
 
-    resReqFile.initWithPath("/var/lib/update-notifier/user.d/firefox-3.7-restart-required");
1541
 
-  else { // not supported version - skip restart notification
1542
 
+  var launcher = Components.classes["@mozilla.org/process/environment;1"].getService(Components.interfaces.nsIEnvironment).get("MOZ_APP_LAUNCHER");
1543
 
+  if(launcher == null) {
1544
 
     return;
1545
 
   }
1546
 
 
1547
 
+  try {
1548
 
+    // If the launcher is a full path, just get the basename
1549
 
+    resReqFile.initWithPath(launcher);
1550
 
+    launcher = resReqFile.leafName;
1551
 
+  } catch (e) { // initWithPath will throw if the path is relative
1552
 
+  }
1553
 
+
1554
 
+  resReqFile.initWithPath("/var/run/" + launcher + "-restart-required");
1555
 
+
1556
 
   if(resReqFile.exists())
1557
 
   {
1558
 
     var dateResReq = resReqFile.lastModifiedTime;
1559
 
--- a/defaults/preferences/ubufox-pfs.js
1560
 
+++ b/defaults/preferences/ubufox-pfs.js
1561
 
@@ -1,5 +1,5 @@
1562
 
 
1563
 
 // use ubuntu plugin finder service
1564
 
-pref ("pfs.datasource.url", "https://mozilla-pfs.ubuntu.com/plugin-finder?mimetype=%PLUGIN_MIMETYPE%&appID=%APP_ID%&appVersion=%APP_VERSION%&clientOS=%CLIENT_OS%&chromeLocale=%CHROME_LOCALE%&distributionID=10.04");
1565
 
+pref ("pfs.datasource.url", "https://mozilla-pfs.ubuntu.com/plugin-finder?mimetype=%PLUGIN_MIMETYPE%&appID=%APP_ID%&appVersion=%APP_VERSION%&clientOS=%CLIENT_OS%&chromeLocale=%CHROME_LOCALE%&distributionID=%DIST_ID%");
1566
 
 pref ("pfs.filehint.url", "https://mozilla-pfs.ubuntu.com/plugin-finder?op=filehint2name&distributionID=10.04");
1567
 
 
1568
 
--- a/install.rdf
1569
 
+++ b/install.rdf
1570
 
@@ -3,6 +3,7 @@
1571
 
  xmlns:em="http://www.mozilla.org/2004/em-rdf#">
1572
 
   <Description about="urn:mozilla:install-manifest">
1573
 
     <em:id>ubufox@ubuntu.com</em:id>
1574
 
+    <em:unpack>true</em:unpack>
1575
 
     <em:name>Ubuntu Firefox Modifications</em:name>
1576
 
     <em:version>0.9rc2</em:version>
1577
 
     <em:creator>Canonical Ltd.</em:creator>
1578
 
@@ -16,8 +17,8 @@
1579
 
     <em:targetApplication>
1580
 
       <Description>
1581
 
         <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id> <!-- firefox -->
1582
 
-        <em:minVersion>1.5</em:minVersion>
1583
 
-        <em:maxVersion>3.7.*</em:maxVersion>
1584
 
+        <em:minVersion>4.0b6</em:minVersion>
1585
 
+        <em:maxVersion>4.0.*</em:maxVersion>
1586
 
       </Description>
1587
 
     </em:targetApplication>
1588
 
   </Description>
1589
 
--- a/locale/af-ZA/ubufox.properties
1590
 
+++ b/locale/af-ZA/ubufox.properties
1591
 
@@ -4,7 +4,7 @@ prefMessage=Int Voork Waarde: %d
1592
 
 extensions.ubufox@ubuntu.com.description=Ubuntu Firefox Pak
1593
 
 ubufox.pluginWizard.availablePluginsPage.description.label=Kies bykomstighede vir media tipe
1594
 
 app.releaseNotesURL=http://www.ubuntu.com/getubuntu/releasenotes/1010
1595
 
-browser.startup.homepage=about:home
1596
 
+browser.startup.homepage=about:startpage
1597
 
 browser.throbber.url=file:///usr/share/ubuntu-artwork/home/index.html
1598
 
 app.update.url.details=file:///usr/share/ubuntu-artwork/home/index.html
1599
 
 startup.homepage_override_url=about:blank
1600
 
--- a/locale/ar/ubufox.properties
1601
 
+++ b/locale/ar/ubufox.properties
1602
 
@@ -4,7 +4,7 @@ prefMessage=قيمة التفضيل ال
1603
 
 extensions.ubufox@ubuntu.com.description=حزمة فايرفوكس من أوبونتو.
1604
 
 ubufox.pluginWizard.availablePluginsPage.description.label=اختر ملحقة لنوع الوسائط
1605
 
 app.releaseNotesURL=http://www.ubuntu.com/getubuntu/releasenotes/1010
1606
 
-browser.startup.homepage=about:home
1607
 
+browser.startup.homepage=about:startpage
1608
 
 browser.throbber.url=file:///usr/share/ubuntu-artwork/home/index.html
1609
 
 app.update.url.details=file:///usr/share/ubuntu-artwork/home/index.html
1610
 
 startup.homepage_override_url=about:blank
1611
 
--- a/locale/bg/ubufox.properties
1612
 
+++ b/locale/bg/ubufox.properties
1613
 
@@ -4,7 +4,7 @@ prefMessage=Int Pref Value: %d
1614
 
 extensions.ubufox@ubuntu.com.description=Ubuntu Firefox Pack.
1615
 
 ubufox.pluginWizard.availablePluginsPage.description.label=Избор на приставка за тип медия
1616
 
 app.releaseNotesURL=http://www.ubuntu.com/getubuntu/releasenotes/1010
1617
 
-browser.startup.homepage=about:home
1618
 
+browser.startup.homepage=about:startpage
1619
 
 browser.throbber.url=file:///usr/share/ubuntu-artwork/home/index.html
1620
 
 app.update.url.details=file:///usr/share/ubuntu-artwork/home/index.html
1621
 
 startup.homepage_override_url=about:blank
1622
 
--- a/locale/ca/ubufox.properties
1623
 
+++ b/locale/ca/ubufox.properties
1624
 
@@ -4,7 +4,7 @@ prefMessage=Valor pref int: %d
1625
 
 extensions.ubufox@ubuntu.com.description=Paquet del Firefox de l'Ubuntu.
1626
 
 ubufox.pluginWizard.availablePluginsPage.description.label=Trieu un connector per al tipus multimèdia
1627
 
 app.releaseNotesURL=http://www.ubuntu.com/getubuntu/releasenotes/1010
1628
 
-browser.startup.homepage=about:home
1629
 
+browser.startup.homepage=about:startpage
1630
 
 browser.throbber.url=file:///usr/share/ubuntu-artwork/home/index.html
1631
 
 app.update.url.details=file:///usr/share/ubuntu-artwork/home/index.html
1632
 
 startup.homepage_override_url=about:blank
1633
 
--- a/locale/cs-CZ/ubufox.properties
1634
 
+++ b/locale/cs-CZ/ubufox.properties
1635
 
@@ -4,7 +4,7 @@ prefMessage=Int Pref Value: %d
1636
 
 extensions.ubufox@ubuntu.com.description=Ubuntu rozšíření pro Firefox.
1637
 
 ubufox.pluginWizard.availablePluginsPage.description.label=Zvolte zásuvný modul pro daný typ média
1638
 
 app.releaseNotesURL=http://www.ubuntu.com/getubuntu/releasenotes/1010
1639
 
-browser.startup.homepage=about:home
1640
 
+browser.startup.homepage=about:startpage
1641
 
 browser.throbber.url=file:///usr/share/ubuntu-artwork/home/index.html
1642
 
 app.update.url.details=file:///usr/share/ubuntu-artwork/home/index.html
1643
 
 startup.homepage_override_url=about:blank
1644
 
--- a/locale/de-DE/ubufox.properties
1645
 
+++ b/locale/de-DE/ubufox.properties
1646
 
@@ -3,7 +3,7 @@ helloMessageTitle=Hello
1647
 
 extensions.ubufox@ubuntu.com.description=Ubuntu Firefox Paket.
1648
 
 ubufox.pluginWizard.availablePluginsPage.description.label=Wähle ein plugin für Medien Typ
1649
 
 app.releaseNotesURL=http://www.ubuntu.com/getubuntu/releasenotes/1010
1650
 
-browser.startup.homepage=about:home
1651
 
+browser.startup.homepage=about:startpage
1652
 
 browser.throbber.url=file:///usr/share/ubuntu-artwork/home/index.html
1653
 
 app.update.url.details=file:///usr/share/ubuntu-artwork/home/index.html
1654
 
 startup.homepage_override_url=about:blank
1655
 
--- a/locale/el-GR/ubufox.properties
1656
 
+++ b/locale/el-GR/ubufox.properties
1657
 
@@ -4,7 +4,7 @@ prefMessage=Int Pref Value: %d
1658
 
 extensions.ubufox@ubuntu.com.description=Πακέτο του Ubuntu για το Firefox.
1659
 
 ubufox.pluginWizard.availablePluginsPage.description.label=Επιλέξτε ένα πρόσθετο για τη μορφή του πολυμέσου
1660
 
 app.releaseNotesURL=http://www.ubuntu.com/getubuntu/releasenotes/1010
1661
 
-browser.startup.homepage=about:home
1662
 
+browser.startup.homepage=about:startpage
1663
 
 browser.throbber.url=file:///usr/share/ubuntu-artwork/home/index.html
1664
 
 app.update.url.details=file:///usr/share/ubuntu-artwork/home/index.html
1665
 
 startup.homepage_override_url=about:blank
1666
 
--- a/locale/en-US/ubufox.properties
1667
 
+++ b/locale/en-US/ubufox.properties
1668
 
@@ -4,7 +4,7 @@ prefMessage=Int Pref Value: %d
1669
 
 extensions.ubufox@ubuntu.com.description=Ubuntu Firefox Pack.
1670
 
 ubufox.pluginWizard.availablePluginsPage.description.label=Choose a plugin for media type
1671
 
 app.releaseNotesURL=http://www.ubuntu.com/getubuntu/releasenotes/1010
1672
 
-browser.startup.homepage=about:home
1673
 
+browser.startup.homepage=about:startpage
1674
 
 browser.throbber.url=file:///usr/share/ubuntu-artwork/home/index.html
1675
 
 app.update.url.details=file:///usr/share/ubuntu-artwork/home/index.html
1676
 
 startup.homepage_override_url=about:blank
1677
 
--- a/locale/es/ubufox.properties
1678
 
+++ b/locale/es/ubufox.properties
1679
 
@@ -4,7 +4,7 @@ prefMessage=Valor de Pref Int: %d
1680
 
 extensions.ubufox@ubuntu.com.description=Paquete de Ubuntu para Firefox.
1681
 
 ubufox.pluginWizard.availablePluginsPage.description.label=Seleccione un complemento para el tipo de medio
1682
 
 app.releaseNotesURL=http://www.ubuntu.com/getubuntu/releasenotes/1010
1683
 
-browser.startup.homepage=about:home
1684
 
+browser.startup.homepage=about:startpage
1685
 
 browser.throbber.url=file:///usr/share/ubuntu-artwork/home/index.html
1686
 
 app.update.url.details=file:///usr/share/ubuntu-artwork/home/index.html
1687
 
 startup.homepage_override_url=about:blank
1688
 
--- a/locale/eu/ubufox.properties
1689
 
+++ b/locale/eu/ubufox.properties
1690
 
@@ -5,7 +5,7 @@ extensions.ubufox@ubuntu.com.description
1691
 
 ubufox.pluginWizard.availablePluginsPage.description.label=Multimedia mota horrentzako plugina hautatu
1692
 
 
1693
 
 app.releaseNotesURL=http://www.ubuntu.com/getubuntu/releasenotes/1010
1694
 
-browser.startup.homepage=about:home
1695
 
+browser.startup.homepage=about:startpage
1696
 
 browser.throbber.url=file:///usr/share/ubuntu-artwork/home/index.html
1697
 
 app.update.url.details=file:///usr/share/ubuntu-artwork/home/index.html
1698
 
 startup.homepage_override_url=about:blank
1699
 
--- a/locale/fi-FI/ubufox.properties
1700
 
+++ b/locale/fi-FI/ubufox.properties
1701
 
@@ -4,7 +4,7 @@ prefMessage=Int Pref Value: %d
1702
 
 extensions.ubufox@ubuntu.com.description=Ubuntun Firefox-paketti
1703
 
 ubufox.pluginWizard.availablePluginsPage.description.label=Valitse mediatyypille sopiva liit\u00e4nn\u00e4inen
1704
 
 app.releaseNotesURL=http://www.ubuntu.com/getubuntu/releasenotes/1010
1705
 
-browser.startup.homepage=about:home
1706
 
+browser.startup.homepage=about:startpage
1707
 
 browser.throbber.url=file:///usr/share/ubuntu-artwork/home/index.html
1708
 
 app.update.url.details=file:///usr/share/ubuntu-artwork/home/index.html
1709
 
 startup.homepage_override_url=about:blank
1710
 
--- a/locale/fr/ubufox.properties
1711
 
+++ b/locale/fr/ubufox.properties
1712
 
@@ -4,7 +4,7 @@ prefMessage=Int Pref Value: %d
1713
 
 extensions.ubufox@ubuntu.com.description=Paquet Firefox Pour Ubuntu.
1714
 
 ubufox.pluginWizard.availablePluginsPage.description.label=Sélectionnez un plugin pour le type de média
1715
 
 app.releaseNotesURL=http://www.ubuntu.com/getubuntu/releasenotes/1010
1716
 
-browser.startup.homepage=about:home
1717
 
+browser.startup.homepage=about:startpage
1718
 
 browser.throbber.url=file:///usr/share/ubuntu-artwork/home/index.html
1719
 
 app.update.url.details=file:///usr/share/ubuntu-artwork/home/index.html
1720
 
 startup.homepage_override_url=about:blank
1721
 
--- a/locale/gl-ES/ubufox.properties
1722
 
+++ b/locale/gl-ES/ubufox.properties
1723
 
@@ -4,7 +4,7 @@ prefMessage=Int Pref Value: %d
1724
 
 extensions.ubufox@ubuntu.com.description=Paquete de Ubuntu para Firefox.
1725
 
 ubufox.pluginWizard.availablePluginsPage.description.label=Escoller un plugin para o tipo de contido
1726
 
 app.releaseNotesURL=http://www.ubuntu.com/getubuntu/releasenotes/1010
1727
 
-browser.startup.homepage=about:home
1728
 
+browser.startup.homepage=about:startpage
1729
 
 browser.throbber.url=file:///usr/share/ubuntu-artwork/home/index.html
1730
 
 app.update.url.details=file:///usr/share/ubuntu-artwork/home/index.html
1731
 
 startup.homepage_override_url=about:blank
1732
 
--- a/locale/hu-HU/ubufox.properties
1733
 
+++ b/locale/hu-HU/ubufox.properties
1734
 
@@ -4,7 +4,7 @@ prefMessage=Egész tulajdonságérték:
1735
 
 extensions.ubufox@ubuntu.com.description=Ubuntu Firefox csomag
1736
 
 ubufox.pluginWizard.availablePluginsPage.description.label=Válasszon egy bővítményt a médiatípushoz
1737
 
 app.releaseNotesURL=http://www.ubuntu.com/getubuntu/releasenotes/1010
1738
 
-browser.startup.homepage=about:home
1739
 
+browser.startup.homepage=about:startpage
1740
 
 browser.throbber.url=file:///usr/share/ubuntu-artwork/home/index.html
1741
 
 app.update.url.details=file:///usr/share/ubuntu-artwork/home/index.html
1742
 
 startup.homepage_override_url=about:blank
1743
 
--- a/locale/it-IT/ubufox.properties
1744
 
+++ b/locale/it-IT/ubufox.properties
1745
 
@@ -4,7 +4,7 @@ prefMessage=Int Pref Value: %d
1746
 
 extensions.ubufox@ubuntu.com.description=Pacchetto Firefox Ubuntu.
1747
 
 ubufox.pluginWizard.availablePluginsPage.description.label=Scegliere un plugin per il tipo di media
1748
 
 app.releaseNotesURL=http://www.ubuntu.com/getubuntu/releasenotes/1010
1749
 
-browser.startup.homepage=about:home
1750
 
+browser.startup.homepage=about:startpage
1751
 
 browser.throbber.url=file:///usr/share/ubuntu-artwork/home/index.html
1752
 
 app.update.url.details=file:///usr/share/ubuntu-artwork/home/index.html
1753
 
 startup.homepage_override_url=about:blank
1754
 
--- a/locale/ja/ubufox.properties
1755
 
+++ b/locale/ja/ubufox.properties
1756
 
@@ -4,7 +4,7 @@ prefMessage=Int Pref Value: %d
1757
 
 extensions.ubufox@ubuntu.com.description=Ubuntu Firefox Pack.
1758
 
 ubufox.pluginWizard.availablePluginsPage.description.label=メディアの種類でプラグインを選択する
1759
 
 app.releaseNotesURL=http://www.ubuntu.com/getubuntu/releasenotes/1010
1760
 
-browser.startup.homepage=about:home
1761
 
+browser.startup.homepage=about:startpage
1762
 
 browser.throbber.url=file:///usr/share/ubuntu-artwork/home/index.html
1763
 
 app.update.url.details=file:///usr/share/ubuntu-artwork/home/index.html
1764
 
 startup.homepage_override_url=about:blank
1765
 
--- a/locale/lt-LT/ubufox.properties
1766
 
+++ b/locale/lt-LT/ubufox.properties
1767
 
@@ -4,7 +4,7 @@ prefMessage=Int parinkties reikšmė: %d
1768
 
 extensions.ubufox@ubuntu.com.description=Ubuntu Firefox paketas
1769
 
 ubufox.pluginWizard.availablePluginsPage.description.label=Pasirinkite įskiepį failo tipui
1770
 
 app.releaseNotesURL=http://www.ubuntu.com/getubuntu/releasenotes/1010
1771
 
-browser.startup.homepage=about:home
1772
 
+browser.startup.homepage=about:startpage
1773
 
 browser.throbber.url=file:///usr/share/ubuntu-artwork/home/index.html
1774
 
 app.update.url.details=file:///usr/share/ubuntu-artwork/home/index.html
1775
 
 startup.homepage_override_url=about:blank
1776
 
--- a/locale/nl-NL/ubufox.properties
1777
 
+++ b/locale/nl-NL/ubufox.properties
1778
 
@@ -4,7 +4,7 @@ prefMessage=Int Pref Value: %d
1779
 
 extensions.ubufox@ubuntu.com.description=Ubuntu Firefox-pakket.
1780
 
 ubufox.pluginWizard.availablePluginsPage.description.label=Kies een plug-in voor het mediatype
1781
 
 app.releaseNotesURL=http://www.ubuntu.com/getubuntu/releasenotes/1010
1782
 
-browser.startup.homepage=about:home
1783
 
+browser.startup.homepage=about:startpage
1784
 
 browser.throbber.url=file:///usr/share/ubuntu-artwork/home/locales/index-nl.html
1785
 
 app.update.url.details=file:///usr/share/ubuntu-artwork/home/locales/index-nl.html
1786
 
 startup.homepage_override_url=about:blank
1787
 
--- a/locale/pl-PL/ubufox.properties
1788
 
+++ b/locale/pl-PL/ubufox.properties
1789
 
@@ -4,7 +4,7 @@ prefMessage=Int Pref Value: %d
1790
 
 extensions.ubufox@ubuntu.com.description=Pakiet Ubuntu Firefox.
1791
 
 ubufox.pluginWizard.availablePluginsPage.description.label=Wybór wtyczki dla typu pliku
1792
 
 app.releaseNotesURL=http://www.ubuntu.com/getubuntu/releasenotes/1010
1793
 
-browser.startup.homepage=about:home
1794
 
+browser.startup.homepage=about:startpage
1795
 
 browser.throbber.url=file:///usr/share/ubuntu-artwork/home/index.html
1796
 
 app.update.url.details=file:///usr/share/ubuntu-artwork/home/index.html
1797
 
 startup.homepage_override_url=about:blank
1798
 
--- a/locale/pt-BR/ubufox.properties
1799
 
+++ b/locale/pt-BR/ubufox.properties
1800
 
@@ -4,7 +4,7 @@ prefMessage=Int Pref Value: %d
1801
 
 extensions.ubufox@ubuntu.com.description=Ubuntu Firefox Pacocte
1802
 
 ubufox.pluginWizard.availablePluginsPage.description.label=Escolha um plug-in para o tipo de mídia
1803
 
 app.releaseNotesURL=http://www.ubuntu.com/getubuntu/releasenotes/1010
1804
 
-browser.startup.homepage=about:home
1805
 
+browser.startup.homepage=about:startpage
1806
 
 browser.throbber.url=file:///usr/share/ubuntu-artwork/home/index.html
1807
 
 app.update.url.details=file:///usr/share/ubuntu-artwork/home/index.html
1808
 
 startup.homepage_override_url=about:blank
1809
 
--- a/locale/ro/ubufox.properties
1810
 
+++ b/locale/ro/ubufox.properties
1811
 
@@ -4,7 +4,7 @@ prefMessage=Int Pref Value: %d
1812
 
 extensions.ubufox@ubuntu.com.description=Pachetul Ubuntu Firefox.
1813
 
 ubufox.pluginWizard.availablePluginsPage.description.label=Alegeți un modul pentru acest tip media
1814
 
 app.releaseNotesURL=http://www.ubuntu.com/getubuntu/releasenotes/1010
1815
 
-browser.startup.homepage=about:home
1816
 
+browser.startup.homepage=about:startpage
1817
 
 browser.throbber.url=file:///usr/share/ubuntu-artwork/home/index.html
1818
 
 app.update.url.details=file:///usr/share/ubuntu-artwork/home/index.html
1819
 
 startup.homepage_override_url=about:blank
1820
 
--- a/locale/ru-RU/ubufox.properties
1821
 
+++ b/locale/ru-RU/ubufox.properties
1822
 
@@ -4,7 +4,7 @@ prefMessage=Int Pref Value: %d
1823
 
 extensions.ubufox@ubuntu.com.description=Расширения Firefox для Ubuntu
1824
 
 ubufox.pluginWizard.availablePluginsPage.description.label=Выберите плагин для типа содержимого
1825
 
 app.releaseNotesURL=http://www.ubuntu.com/getubuntu/releasenotes/1010
1826
 
-browser.startup.homepage=about:home
1827
 
+browser.startup.homepage=about:startpage
1828
 
 browser.throbber.url=file:///usr/share/ubuntu-artwork/home/index.html
1829
 
 app.update.url.details=file:///usr/share/ubuntu-artwork/home/index.html
1830
 
 startup.homepage_override_url=about:blank
1831
 
--- a/locale/sl-SI/ubufox.properties
1832
 
+++ b/locale/sl-SI/ubufox.properties
1833
 
@@ -4,7 +4,7 @@ prefMessage=Int Pref Value: %d
1834
 
 extensions.ubufox@ubuntu.com.description=Ubuntu razširitve za Firefox.
1835
 
 ubufox.pluginWizard.availablePluginsPage.description.label=Izberite vtičnik za vrsto datoteke
1836
 
 app.releaseNotesURL=http://www.ubuntu.com/getubuntu/releasenotes/1010
1837
 
-browser.startup.homepage=about:home
1838
 
+browser.startup.homepage=about:startpage
1839
 
 browser.throbber.url=file:///usr/share/ubuntu-artwork/home/index.html
1840
 
 app.update.url.details=file:///usr/share/ubuntu-artwork/home/index.html
1841
 
 startup.homepage_override_url=about:blank
1842
 
--- a/locale/sv-SE/ubufox.properties
1843
 
+++ b/locale/sv-SE/ubufox.properties
1844
 
@@ -4,7 +4,7 @@ prefMessage=Int Pref Value: %d
1845
 
 extensions.ubufox@ubuntu.com.description=Ubuntu-paket för Firefox.
1846
 
 ubufox.pluginWizard.availablePluginsPage.description.label=Välj ett instick för mediatypen
1847
 
 app.releaseNotesURL=http://www.ubuntu.com/getubuntu/releasenotes/1010
1848
 
-browser.startup.homepage=about:home
1849
 
+browser.startup.homepage=about:startpage
1850
 
 browser.throbber.url=file:///usr/share/ubuntu-artwork/home/index.html
1851
 
 app.update.url.details=file:///usr/share/ubuntu-artwork/home/index.html
1852
 
 startup.homepage_override_url=about:blank
1853
 
--- a/locale/uk/ubufox.properties
1854
 
+++ b/locale/uk/ubufox.properties
1855
 
@@ -4,7 +4,7 @@ prefMessage=Int Pref Value: %d
1856
 
 extensions.ubufox@ubuntu.com.description=Убунтівські доповнення до Firefox.
1857
 
 ubufox.pluginWizard.availablePluginsPage.description.label=Оберіть модуль для цього типу файлів
1858
 
 app.releaseNotesURL=http://www.ubuntu.com/getubuntu/releasenotes/1010
1859
 
-browser.startup.homepage=about:home
1860
 
+browser.startup.homepage=about:startpage
1861
 
 browser.throbber.url=file:///usr/share/ubuntu-artwork/home/index.html
1862
 
 app.update.url.details=file:///usr/share/ubuntu-artwork/home/index.html
1863
 
 startup.homepage_override_url=about:blank
1864
 
--- a/locale/zh-CN/ubufox.properties
1865
 
+++ b/locale/zh-CN/ubufox.properties
1866
 
@@ -4,7 +4,7 @@ prefMessage=整数偏好值: %d
1867
 
 extensions.ubufox@ubuntu.com.description=Ubuntu 火狐扩展包.
1868
 
 ubufox.pluginWizard.availablePluginsPage.description.label=选择打开媒体的插件
1869
 
 app.releaseNotesURL=http://www.ubuntu.com/getubuntu/releasenotes/1010
1870
 
-browser.startup.homepage=about:home
1871
 
+browser.startup.homepage=about:startpage
1872
 
 browser.throbber.url=file:///usr/share/ubuntu-artwork/home/index.html
1873
 
 app.update.url.details=file:///usr/share/ubuntu-artwork/home/index.html
1874
 
 startup.homepage_override_url=about:blank
1875
 
--- /dev/null
1876
 
+++ b/pfs/db/sources.list.10.10
1877
 
@@ -0,0 +1,2 @@
1878
 
+deb http://archive.ubuntu.com/ubuntu/ maverick main restricted universe multiverse
1879
 
+
1880
 
--- /dev/null
1881
 
+++ b/pfs/db/sources.list.11.04
1882
 
@@ -0,0 +1,2 @@
1883
 
+deb http://archive.ubuntu.com/ubuntu/ natty main restricted universe multiverse
1884
 
+