summaryrefslogtreecommitdiffstats
path: root/toolkit/mozapps/update/content
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/mozapps/update/content')
-rw-r--r--toolkit/mozapps/update/content/history.js96
-rw-r--r--toolkit/mozapps/update/content/history.xhtml41
-rw-r--r--toolkit/mozapps/update/content/updateElevation.js138
-rw-r--r--toolkit/mozapps/update/content/updateElevation.xhtml80
4 files changed, 355 insertions, 0 deletions
diff --git a/toolkit/mozapps/update/content/history.js b/toolkit/mozapps/update/content/history.js
new file mode 100644
index 0000000000..51de669af3
--- /dev/null
+++ b/toolkit/mozapps/update/content/history.js
@@ -0,0 +1,96 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+var gUpdateHistory = {
+ _view: null,
+
+ /**
+ * Initialize the User Interface
+ */
+ onLoad() {
+ this._view = document.getElementById("historyItems");
+
+ var um = Cc["@mozilla.org/updates/update-manager;1"].getService(
+ Ci.nsIUpdateManager
+ );
+ var uc = um.getUpdateCount();
+ if (uc) {
+ while (this._view.hasChildNodes()) {
+ this._view.firstChild.remove();
+ }
+
+ for (var i = 0; i < uc; ++i) {
+ var update = um.getUpdateAt(i);
+
+ if (!update || !update.name) {
+ continue;
+ }
+
+ // Don't display updates that are downloading since they don't have
+ // valid statusText for the UI (bug 485493).
+ if (!update.statusText) {
+ continue;
+ }
+
+ var element = document.createXULElement("richlistitem");
+ element.className = "update";
+
+ const topLine = document.createXULElement("hbox");
+ const nameLabel = document.createXULElement("label");
+ nameLabel.className = "update-name";
+ document.l10n.setAttributes(nameLabel, "update-full-build-name", {
+ name: update.name,
+ buildID: update.buildID,
+ });
+ topLine.appendChild(nameLabel);
+
+ if (update.detailsURL) {
+ const detailsLink = document.createXULElement("label", {
+ is: "text-link",
+ });
+ detailsLink.href = update.detailsURL;
+ document.l10n.setAttributes(detailsLink, "update-details");
+ topLine.appendChild(detailsLink);
+ }
+
+ const installedOnLabel = document.createXULElement("label");
+ installedOnLabel.className = "update-installedOn-label";
+ document.l10n.setAttributes(installedOnLabel, "update-installed-on", {
+ date: this._formatDate(update.installDate),
+ });
+
+ const statusLabel = document.createXULElement("label");
+ statusLabel.className = "update-status-label";
+ document.l10n.setAttributes(statusLabel, "update-status", {
+ status: update.statusText,
+ });
+
+ element.append(topLine, installedOnLabel, statusLabel);
+ this._view.appendChild(element);
+ }
+ }
+ var cancelbutton = document.getElementById("history").getButton("cancel");
+ cancelbutton.focus();
+ },
+
+ /**
+ * Formats a date into human readable form
+ * @param seconds
+ * A date in seconds since 1970 epoch
+ * @returns A human readable date string
+ */
+ _formatDate(seconds) {
+ var date = new Date(seconds);
+ const dtOptions = {
+ year: "numeric",
+ month: "long",
+ day: "numeric",
+ hour: "numeric",
+ minute: "numeric",
+ second: "numeric",
+ };
+ return date.toLocaleString(undefined, dtOptions);
+ },
+};
diff --git a/toolkit/mozapps/update/content/history.xhtml b/toolkit/mozapps/update/content/history.xhtml
new file mode 100644
index 0000000000..25aa35fad4
--- /dev/null
+++ b/toolkit/mozapps/update/content/history.xhtml
@@ -0,0 +1,41 @@
+<?xml version="1.0"?>
+
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<!DOCTYPE window>
+
+<?xml-stylesheet href="chrome://global/skin/global.css"?>
+<?xml-stylesheet href="chrome://mozapps/skin/update/updates.css"?>
+
+<window
+ windowtype="Update:History"
+ xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
+ xmlns:html="http://www.w3.org/1999/xhtml"
+ style="min-width: 35em"
+ data-l10n-id="close-button-label"
+ data-l10n-attrs="title"
+ onload="gUpdateHistory.onLoad();"
+>
+ <dialog
+ id="history"
+ buttons="cancel"
+ defaultButton="cancel"
+ data-l10n-id="close-button-label"
+ data-l10n-attrs="buttonlabelcancel"
+ >
+ <linkset>
+ <html:link rel="localization" href="toolkit/updates/history.ftl" />
+ </linkset>
+
+ <script src="chrome://mozapps/content/update/history.js" />
+
+ <label data-l10n-id="history-intro"></label>
+ <separator class="thin" />
+ <richlistbox id="historyItems">
+ <label data-l10n-id="no-updates-label"></label>
+ </richlistbox>
+ <separator class="thin" />
+ </dialog>
+</window>
diff --git a/toolkit/mozapps/update/content/updateElevation.js b/toolkit/mozapps/update/content/updateElevation.js
new file mode 100644
index 0000000000..251a4b5618
--- /dev/null
+++ b/toolkit/mozapps/update/content/updateElevation.js
@@ -0,0 +1,138 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*-
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/* This is temporary until bug 1521632 is fixed */
+
+"use strict";
+
+/* import-globals-from /toolkit/content/contentAreaUtils.js */
+
+const gUpdateElevationDialog = {
+ openUpdateURL(event) {
+ if (event.button == 0) {
+ openURL(event.target.getAttribute("url"));
+ }
+ },
+ getAUSString(key, strings) {
+ if (strings) {
+ return this.strings.getFormattedString(key, strings);
+ }
+ return this.strings.getString(key);
+ },
+ _setButton(button, string) {
+ var label = this.getAUSString(string);
+ if (label.includes("%S")) {
+ label = label.replace(/%S/, this.brandName);
+ }
+ button.label = label;
+ button.setAttribute("accesskey", this.getAUSString(string + ".accesskey"));
+ },
+ onLoad() {
+ this.strings = document.getElementById("updateStrings");
+ this.brandName = document
+ .getElementById("brandStrings")
+ .getString("brandShortName");
+
+ let um = Cc["@mozilla.org/updates/update-manager;1"].getService(
+ Ci.nsIUpdateManager
+ );
+ let update = um.readyUpdate;
+ let updateFinishedName = document.getElementById("updateFinishedName");
+ updateFinishedName.value = update.name;
+
+ let link = document.getElementById("detailsLinkLabel");
+ if (update.detailsURL) {
+ link.setAttribute("url", update.detailsURL);
+ // The details link is stealing focus so it is disabled by default and
+ // should only be enabled after onPageShow has been called.
+ link.disabled = false;
+ } else {
+ link.hidden = true;
+ }
+
+ let manualLinkLabel = document.getElementById("manualLinkLabel");
+ let manualURL = Services.urlFormatter.formatURLPref(
+ "app.update.url.manual"
+ );
+ manualLinkLabel.value = manualURL;
+ manualLinkLabel.setAttribute("url", manualURL);
+
+ let button = document.getElementById("elevateExtra2");
+ this._setButton(button, "restartLaterButton");
+ button = document.getElementById("elevateExtra1");
+ this._setButton(button, "noThanksButton");
+ button = document.getElementById("elevateAccept");
+ this._setButton(button, "restartNowButton");
+ button.focus();
+ },
+ onRestartLater() {
+ window.close();
+ },
+ onNoThanks() {
+ Services.obs.notifyObservers(null, "update-canceled");
+ let um = Cc["@mozilla.org/updates/update-manager;1"].getService(
+ Ci.nsIUpdateManager
+ );
+ let update = um.readyUpdate;
+ um.cleanupReadyUpdate();
+ // Since the user has clicked "No Thanks", we should not prompt them to update to
+ // this version again unless they manually select "Check for Updates..."
+ // which will clear app.update.elevate.never preference.
+ let aus = Cc["@mozilla.org/updates/update-service;1"].getService(
+ Ci.nsIApplicationUpdateService
+ );
+ if (aus.elevationRequired && update) {
+ Services.prefs.setCharPref("app.update.elevate.never", update.appVersion);
+ }
+ window.close();
+ },
+ onRestartNow() {
+ // disable the "finish" (Restart) and "extra1" (Later) buttons
+ // because the Software Update wizard is still up at the point,
+ // and will remain up until we return and we close the
+ // window with a |window.close()| in wizard.xml
+ // (it was the firing the "wizardfinish" event that got us here.)
+ // This prevents the user from switching back
+ // to the Software Update dialog and clicking "Restart" or "Later"
+ // when dealing with the "confirm close" prompts.
+ // See bug #350299 for more details.
+ document.getElementById("elevateExtra2").disabled = true;
+ document.getElementById("elevateExtra1").disabled = true;
+ document.getElementById("elevateAccept").disabled = true;
+
+ // This dialog was shown because elevation was required so there is no need
+ // to check if elevation is required again.
+ let um = Cc["@mozilla.org/updates/update-manager;1"].getService(
+ Ci.nsIUpdateManager
+ );
+ um.elevationOptedIn();
+
+ // Notify all windows that an application quit has been requested.
+ let cancelQuit = Cc["@mozilla.org/supports-PRBool;1"].createInstance(
+ Ci.nsISupportsPRBool
+ );
+ Services.obs.notifyObservers(
+ cancelQuit,
+ "quit-application-requested",
+ "restart"
+ );
+
+ // Something aborted the quit process.
+ if (cancelQuit.data) {
+ return;
+ }
+
+ // If already in safe mode restart in safe mode (bug 327119)
+ if (Services.appinfo.inSafeMode) {
+ Services.env.set("MOZ_SAFE_MODE_RESTART", "1");
+ }
+
+ // Restart the application
+ Services.startup.quit(
+ Ci.nsIAppStartup.eAttemptQuit | Ci.nsIAppStartup.eRestart
+ );
+ },
+};
diff --git a/toolkit/mozapps/update/content/updateElevation.xhtml b/toolkit/mozapps/update/content/updateElevation.xhtml
new file mode 100644
index 0000000000..815bfec6de
--- /dev/null
+++ b/toolkit/mozapps/update/content/updateElevation.xhtml
@@ -0,0 +1,80 @@
+<?xml version="1.0"?>
+
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<!-- This is temporary until bug 1521632 is fixed -->
+
+<?xml-stylesheet href="chrome://global/skin/global.css"?>
+<?xml-stylesheet href="chrome://mozapps/skin/update/updates.css"?>
+
+<window windowtype="Update:Elevation"
+ type="child"
+ xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
+ xmlns:html="http://www.w3.org/1999/xhtml"
+ data-l10n-id="elevation-update-wizard"
+ data-l10n-attrs="title"
+ style="width: auto; height: auto"
+ onload="gUpdateElevationDialog.onLoad();">
+<dialog id="updates"
+ buttons="extra2,extra1,accept">
+
+ <script src="chrome://global/content/contentAreaUtils.js"/>
+ <script src="chrome://global/content/globalOverlay.js"/>
+ <script src="chrome://global/content/editMenuOverlay.js"/>
+ <script src="chrome://mozapps/content/update/updateElevation.js"/>
+
+<linkset>
+ <html:link rel="localization" href="branding/brand.ftl"/>
+ <html:link rel="localization" href="toolkit/updates/elevation.ftl"/>
+</linkset>
+
+#if defined(XP_MACOSX) && MOZ_BUILD_APP == browser
+#include ../../../../browser/base/content/macWindow.inc.xhtml
+#endif
+
+ <stringbundleset id="updateSet">
+ <stringbundle id="brandStrings" src="chrome://branding/locale/brand.properties"/>
+ <stringbundle id="updateStrings" src="chrome://mozapps/locale/update/updates.properties"/>
+ </stringbundleset>
+
+ <vbox id="elevationBox">
+ <hbox class="update-header" flex="1">
+ <vbox class="update-header-box-1">
+ <vbox class="update-header-box-text">
+ <label class="update-header-label" data-l10n-id="elevation-finished-page"/>
+ </vbox>
+ </vbox>
+ </hbox>
+ <vbox class="update-content" flex="1">
+ <label data-l10n-id="elevation-finished-background-page"/>
+ <separator/>
+ <hbox align="center">
+ <label data-l10n-id="elevation-finished-background"/>
+ <label id="updateFinishedName" flex="1" crop="end" value=""/>
+ <label id="detailsLinkLabel" disabled="true" is="text-link"
+ data-l10n-id="elevation-details-link-label"
+ onclick="gUpdateElevationDialog.openUpdateURL(event);"/>
+ </hbox>
+ <spacer flex="1"/>
+ <label id="finishedBackgroundMoreElevated" data-l10n-id="elevation-more-elevated"/>
+ <label data-l10n-id="elevation-error-manual"/>
+ <hbox>
+ <label id="manualLinkLabel" is="text-link" value=""
+ onclick="gUpdateElevationDialog.openUpdateURL(event);"/>
+ </hbox>
+ </vbox>
+ </vbox>
+ <separator class="groove update-buttons-separator"/>
+ <hbox id="update-button-box" pack="end">
+ <button id="elevateExtra2" dlgtype="extra2" label="" class="dialog-button"
+ oncommand="gUpdateElevationDialog.onRestartLater();" />
+ <button id="elevateExtra1" dlgtype="extra1" label="" class="dialog-button"
+ oncommand="gUpdateElevationDialog.onNoThanks();" />
+ <spacer flex="1"/>
+ <button id="elevateAccept" dlgtype="accept" label="" class="dialog-button"
+ oncommand="gUpdateElevationDialog.onRestartNow();" default="true"/>
+ </hbox>
+</dialog>
+</window>