Bug 1385991 - Provide a chrome side notification informing the user about an incompatible version of JAWS screen reader. r=felipe
authorJim Mathies <jmathies@mozilla.com>
Fri, 08 Sep 2017 16:05:06 -0500
changeset 379882 94b2d9b60f8cdfa110a50ca81ec81297e871b29e
parent 379881 4622489f9872d8a5771ef9601103c7503f71014d
child 379883 8a870bdf3aa0282d516d6184ebe81edf87dffa85
push id32464
push userarchaeopteryx@coole-files.de
push dateSat, 09 Sep 2017 09:45:04 +0000
treeherdermozilla-central@c71b01e99351 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersfelipe
bugs1385991
milestone57.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1385991 - Provide a chrome side notification informing the user about an incompatible version of JAWS screen reader. r=felipe
browser/components/nsBrowserGlue.js
browser/locales/en-US/chrome/browser/browser.properties
browser/themes/linux/jar.mn
browser/themes/osx/jar.mn
browser/themes/shared/e10s-64@2x.png
browser/themes/windows/jar.mn
toolkit/xre/nsAppRunner.cpp
xpcom/system/nsIXULRuntime.idl
--- a/browser/components/nsBrowserGlue.js
+++ b/browser/components/nsBrowserGlue.js
@@ -523,16 +523,19 @@ BrowserGlue.prototype = {
     os.addObserver(this, "restart-in-safe-mode");
     os.addObserver(this, "flash-plugin-hang");
     os.addObserver(this, "xpi-signature-changed");
     os.addObserver(this, "sync-ui-state:update");
     os.addObserver(this, "handlersvc-store-initialized");
 
     this._flashHangCount = 0;
     this._firstWindowReady = new Promise(resolve => this._firstWindowLoaded = resolve);
+    if (AppConstants.platform == "win") {
+      JawsScreenReaderVersionCheck.init();
+    }
   },
 
   // cleanup (called on application shutdown)
   _dispose: function BG__dispose() {
     let os = Services.obs;
     os.removeObserver(this, "notifications-open-settings");
     os.removeObserver(this, "prefservice:after-app-defaults");
     os.removeObserver(this, "final-ui-startup");
@@ -1094,16 +1097,22 @@ BrowserGlue.prototype = {
       }, STARTUP_CRASHES_END_DELAY_MS);
     });
 
     Services.tm.idleDispatchToMainThread(() => {
       let handlerService = Cc["@mozilla.org/uriloader/handler-service;1"].
                            getService(Ci.nsIHandlerService);
       handlerService.asyncInit();
     });
+
+    if (AppConstants.platform == "win") {
+      Services.tm.idleDispatchToMainThread(() => {
+        JawsScreenReaderVersionCheck.onWindowsRestored();
+      });
+    }
   },
 
   /**
    * Use this function as an entry point to schedule tasks that need
    * to run once per session, at any arbitrary point in time.
    * This function will be called from an idle observer. Check the value of
    * LATE_TASKS_IDLE_TIME_SEC to see the current value for this idle
    * observer.
@@ -2785,16 +2794,93 @@ var DefaultBrowserCheck = {
       let popup = doc.getElementById(this.OPTIONPOPUP);
       popup.removeEventListener("command", this);
       popup.remove();
       delete this._notification;
     }
   },
 };
 
+/*
+ * Prompts users who have an outdated JAWS screen reader informing
+ * them they need to update JAWS or switch to esr. Can be removed
+ * 12/31/2018.
+ */
+var JawsScreenReaderVersionCheck = {
+  _prompted: false,
+
+  init() {
+    Services.obs.addObserver(this, "a11y-init-or-shutdown", true);
+  },
+
+  QueryInterface: XPCOMUtils.generateQI([Ci.nsIObserver, Ci.nsISupportsWeakReference]),
+
+  observe(subject, topic, data) {
+    if (topic == "a11y-init-or-shutdown" && data == "1") {
+      Services.tm.dispatchToMainThread(() => this._checkVersionAndPrompt());
+    }
+  },
+
+  onWindowsRestored() {
+    Services.tm.dispatchToMainThread(() => this._checkVersionAndPrompt());
+  },
+
+  _checkVersionAndPrompt() {
+    // This executes a JAWS version check.
+    if (!Services.appinfo.shouldBlockIncompatJaws) {
+      return;
+    }
+
+    let win = RecentWindow.getMostRecentBrowserWindow();
+    if (!win || !win.gBrowser || !win.gBrowser.selectedBrowser) {
+      Services.console.logStringMessage(
+          "Content access support for older versions of JAWS is disabled " +
+          "due to compatibility issues with this version of Firefox.");
+      this._prompted = false;
+      return;
+    }
+
+    // Only prompt once per session
+    if (this._prompted) {
+      return;
+    }
+    this._prompted = true;
+
+    let browser = win.gBrowser.selectedBrowser;
+
+    // Prompt JAWS users to let them know they need to update
+    let promptMessage = win.gNavigatorBundle.getFormattedString(
+                          "e10s.accessibilityNotice.jawsMessage",
+                          [gBrandBundle.GetStringFromName("brandShortName")]
+                        );
+    let notification;
+    // main option: an Ok button, keeps running with content accessibility disabled
+    let mainAction = {
+      label: win.gNavigatorBundle.getString("e10s.accessibilityNotice.acceptButton.label"),
+      accessKey: win.gNavigatorBundle.getString("e10s.accessibilityNotice.acceptButton.accesskey"),
+      callback() {
+        // If the user invoked the button option remove the notification,
+        // otherwise keep the alert icon around in the address bar.
+        notification.remove();
+      }
+    };
+    let options = {
+      popupIconURL: "chrome://browser/skin/e10s-64@2x.png",
+      persistWhileVisible: true,
+      persistent: true,
+      persistence: 100
+    };
+
+    notification =
+      win.PopupNotifications.show(browser, "e10s_enabled_with_incompat_jaws",
+                                  promptMessage, null, mainAction,
+                                  null, options);
+  },
+};
+
 var components = [BrowserGlue, ContentPermissionPrompt];
 this.NSGetFactory = XPCOMUtils.generateNSGetFactory(components);
 
 // Listen for UITour messages.
 // Do it here instead of the UITour module itself so that the UITour module is lazy loaded
 // when the first message is received.
 var globalMM = Cc["@mozilla.org/globalmessagemanager;1"].getService(Ci.nsIMessageListenerManager);
 globalMM.addMessageListener("UITour:onPageEvent", function(aMessage) {
--- a/browser/locales/en-US/chrome/browser/browser.properties
+++ b/browser/locales/en-US/chrome/browser/browser.properties
@@ -796,16 +796,19 @@ appMenuRemoteTabs.mobilePromo.ios = Fire
 # beta starting from version 41, so it's still useful to have these strings properly localized.
 # %S is brandShortName
 e10s.accessibilityNotice.mainMessage2 = Accessibility support is partially disabled due to compatibility issues with new %S features.
 e10s.accessibilityNotice.acceptButton.label = OK
 e10s.accessibilityNotice.acceptButton.accesskey = O
 e10s.accessibilityNotice.enableAndRestart.label = Enable (Requires Restart)
 e10s.accessibilityNotice.enableAndRestart.accesskey = E
 
+# LOCALIZATION NOTE (e10s.accessibilityNotice.jawsMessage): %S is brandShortName
+e10s.accessibilityNotice.jawsMessage = Display of tab content is disabled due to incompatibility between %S and your accessibility software. Please update your screen reader or switch to Firefox Extended Support Release.
+
 # LOCALIZATION NOTE (userContextPersonal.label,
 #                    userContextWork.label,
 #                    userContextShopping.label,
 #                    userContextBanking.label,
 #                    userContextNone.label):
 # These strings specify the four predefined contexts included in support of the
 # Contextual Identity / Containers project. Each context is meant to represent
 # the context that the user is in when interacting with the site. Different
--- a/browser/themes/linux/jar.mn
+++ b/browser/themes/linux/jar.mn
@@ -58,14 +58,15 @@ browser.jar:
   skin/classic/browser/preferences/preferences.css    (preferences/preferences.css)
 * skin/classic/browser/preferences/in-content/preferences.css (preferences/in-content/preferences.css)
 * skin/classic/browser/preferences/in-content/dialog.css      (preferences/in-content/dialog.css)
   skin/classic/browser/preferences/applications.css   (preferences/applications.css)
   skin/classic/browser/tabbrowser/tabDragIndicator.png      (tabbrowser/tabDragIndicator.png)
 
   skin/classic/browser/sync-desktopIcon.svg  (../shared/sync-desktopIcon.svg)
   skin/classic/browser/sync-mobileIcon.svg  (../shared/sync-mobileIcon.svg)
+  skin/classic/browser/e10s-64@2x.png (../shared/e10s-64@2x.png)
 
 [extensions/{972ce4c6-7e08-4474-a285-3208198ce6fd}] chrome.jar:
 % override chrome://browser/skin/feeds/audioFeedIcon.png              chrome://browser/skin/feeds/feedIcon.png
 % override chrome://browser/skin/feeds/audioFeedIcon16.png            chrome://browser/skin/feeds/feedIcon16.png
 % override chrome://browser/skin/feeds/videoFeedIcon.png              chrome://browser/skin/feeds/feedIcon.png
 % override chrome://browser/skin/feeds/videoFeedIcon16.png            chrome://browser/skin/feeds/feedIcon16.png
--- a/browser/themes/osx/jar.mn
+++ b/browser/themes/osx/jar.mn
@@ -82,16 +82,17 @@ browser.jar:
   skin/classic/browser/sync-desktopIcon.svg  (../shared/sync-desktopIcon.svg)
   skin/classic/browser/sync-mobileIcon.svg  (../shared/sync-mobileIcon.svg)
   skin/classic/browser/yosemite/menuPanel-customize.png                (menuPanel-customize-yosemite.png)
   skin/classic/browser/yosemite/menuPanel-customize@2x.png             (menuPanel-customize-yosemite@2x.png)
   skin/classic/browser/yosemite/menuPanel-exit.png                     (menuPanel-exit-yosemite.png)
   skin/classic/browser/yosemite/menuPanel-exit@2x.png                  (menuPanel-exit-yosemite@2x.png)
   skin/classic/browser/yosemite/menuPanel-help.png                     (menuPanel-help-yosemite.png)
   skin/classic/browser/yosemite/menuPanel-help@2x.png                  (menuPanel-help-yosemite@2x.png)
+  skin/classic/browser/e10s-64@2x.png                                  (../shared/e10s-64@2x.png)
 
 [extensions/{972ce4c6-7e08-4474-a285-3208198ce6fd}] chrome.jar:
 % override chrome://browser/skin/feeds/audioFeedIcon.png                   chrome://browser/skin/feeds/feedIcon.png
 % override chrome://browser/skin/feeds/audioFeedIcon16.png                 chrome://browser/skin/feeds/feedIcon16.png
 % override chrome://browser/skin/feeds/videoFeedIcon.png                   chrome://browser/skin/feeds/feedIcon.png
 % override chrome://browser/skin/feeds/videoFeedIcon16.png                 chrome://browser/skin/feeds/feedIcon16.png
 % override chrome://browser/skin/notification-icons/geo-detailed.svg       chrome://browser/skin/notification-icons/geo.svg
 
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..1dc243865cfb412f03aa372d30fa769fd3fd5eac
GIT binary patch
literal 20737
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
--- a/browser/themes/windows/jar.mn
+++ b/browser/themes/windows/jar.mn
@@ -77,16 +77,17 @@ browser.jar:
   skin/classic/browser/window-controls/maximize-highcontrast.svg (window-controls/maximize-highcontrast.svg)
   skin/classic/browser/window-controls/maximize-themes.svg       (window-controls/maximize-themes.svg)
   skin/classic/browser/window-controls/minimize.svg              (window-controls/minimize.svg)
   skin/classic/browser/window-controls/minimize-highcontrast.svg (window-controls/minimize-highcontrast.svg)
   skin/classic/browser/window-controls/minimize-themes.svg       (window-controls/minimize-themes.svg)
   skin/classic/browser/window-controls/restore.svg               (window-controls/restore.svg)
   skin/classic/browser/window-controls/restore-highcontrast.svg  (window-controls/restore-highcontrast.svg)
   skin/classic/browser/window-controls/restore-themes.svg        (window-controls/restore-themes.svg)
+  skin/classic/browser/e10s-64@2x.png                            (../shared/e10s-64@2x.png)
 
 [extensions/{972ce4c6-7e08-4474-a285-3208198ce6fd}] chrome.jar:
 % override chrome://browser/skin/page-livemarks.png                   chrome://browser/skin/feeds/feedIcon16.png
 % override chrome://browser/skin/feeds/audioFeedIcon.png              chrome://browser/skin/feeds/feedIcon.png
 % override chrome://browser/skin/feeds/audioFeedIcon16.png            chrome://browser/skin/feeds/feedIcon16.png
 % override chrome://browser/skin/feeds/videoFeedIcon.png              chrome://browser/skin/feeds/feedIcon.png
 % override chrome://browser/skin/feeds/videoFeedIcon16.png            chrome://browser/skin/feeds/feedIcon16.png
 
--- a/toolkit/xre/nsAppRunner.cpp
+++ b/toolkit/xre/nsAppRunner.cpp
@@ -993,16 +993,26 @@ nsXULAppInfo::GetAccessibilityInstantiat
   aInstantiator.Append(oopClientInfo);
 #else
   aInstantiator = NS_LITERAL_STRING("");
 #endif
   return NS_OK;
 }
 
 NS_IMETHODIMP
+nsXULAppInfo::GetShouldBlockIncompatJaws(bool* aResult)
+{
+  *aResult = false;
+#if defined(ACCESSIBILITY) && defined(XP_WIN)
+  *aResult = mozilla::a11y::Compatibility::IsOldJAWS();
+#endif
+  return NS_OK;
+}
+
+NS_IMETHODIMP
 nsXULAppInfo::GetIs64Bit(bool* aResult)
 {
 #ifdef HAVE_64BIT_BUILD
   *aResult = true;
 #else
   *aResult = false;
 #endif
   return NS_OK;
--- a/xpcom/system/nsIXULRuntime.idl
+++ b/xpcom/system/nsIXULRuntime.idl
@@ -137,16 +137,22 @@ interface nsIXULRuntime : nsISupports
   readonly attribute boolean accessibleHandlerUsed;
 
   /**
    * Executable of Windows service that activated accessibility.
    */
   readonly attribute DOMString accessibilityInstantiator;
 
   /**
+   * Temporary, do not use. Indicates if an incompat version of JAWS
+   * screen reader software is loaded in our process space.
+   */
+  readonly attribute boolean shouldBlockIncompatJaws;
+
+  /**
    * Indicates whether the current Firefox build is 64-bit.
    */
   readonly attribute boolean is64Bit;
 
   /**
    * Signal the apprunner to invalidate caches on the next restart.
    * This will cause components to be autoregistered and all
    * fastload data to be re-created.