Commit 90f754cf authored by Sebastian Hengst's avatar Sebastian Hengst
Browse files

Backed out changeset ab66385c2fb5 (bug 1387507) for failing browser-chrome's...

Backed out changeset ab66385c2fb5 (bug 1387507) for failing browser-chrome's browser_all_files_referenced.js: unreferenced file e10s-64@2x.png. r=backout on a CLOSED TREE
parent f5c42118
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -675,6 +675,9 @@ pref("accessibility.typeaheadfind.timeout", 5000);
pref("accessibility.typeaheadfind.linksonly", false);
pref("accessibility.typeaheadfind.flashBar", 1);

// Tracks when accessibility is loaded into the previous session.
pref("accessibility.loadedInLastSession", false);

pref("plugins.click_to_play", true);
pref("plugins.testmode", false);

@@ -988,6 +991,9 @@ pref("toolkit.crashreporter.infoURL",
// base URL for web-based support pages
pref("app.support.baseURL", "https://support.mozilla.org/1/firefox/%VERSION%/%OS%/%LOCALE%/");

// a11y conflicts with e10s support page
pref("app.support.e10sAccessibilityUrl", "https://support.mozilla.org/1/firefox/%VERSION%/%OS%/%LOCALE%/accessibility-ppt");

// base url for web-based feedback pages
#ifdef MOZ_DEV_EDITION
pref("app.feedback.baseURL", "https://input.mozilla.org/%LOCALE%/feedback/firefoxdev/%VERSION%/");
+133 −0
Original line number Diff line number Diff line
@@ -532,6 +532,13 @@ BrowserGlue.prototype = {

    this._flashHangCount = 0;
    this._firstWindowReady = new Promise(resolve => this._firstWindowLoaded = resolve);

    if (AppConstants.platform == "macosx" ||
        (AppConstants.platform == "win" && AppConstants.RELEASE_OR_BETA)) {
      // Handles prompting to inform about incompatibilites when accessibility
      // and e10s are active together.
      E10SAccessibilityCheck.init();
    }
  },

  // cleanup (called on application shutdown)
@@ -1058,7 +1065,10 @@ BrowserGlue.prototype = {
    }

    this._sanitizer.onStartup();
    E10SAccessibilityCheck.onWindowsRestored();

    this._scheduleStartupIdleTasks();

    this._lateTasksIdleObserver = (idleService, topic, data) => {
      if (topic == "idle") {
        idleService.removeIdleObserver(this._lateTasksIdleObserver,
@@ -2825,9 +2835,132 @@ var DefaultBrowserCheck = {
  },
};

var E10SAccessibilityCheck = {
  // tracks when an a11y init observer fires prior to the
  // first window being opening.
  _wantsPrompt: false,

  init() {
    Services.obs.addObserver(this, "a11y-init-or-shutdown", true);
    Services.obs.addObserver(this, "quit-application-granted", true);
  },

  QueryInterface: XPCOMUtils.generateQI([Ci.nsIObserver, Ci.nsISupportsWeakReference]),

  get forcedOn() {
    try {
      return Services.prefs.getBoolPref("browser.tabs.remote.force-enable");
    } catch (e) {}
    return false;
  },

  observe(subject, topic, data) {
    switch (topic) {
      case "quit-application-granted":
        // Tag the profile with a11y load state. We use this in nsAppRunner
        // checks on the next start.
        Services.prefs.setBoolPref("accessibility.loadedInLastSession",
                                   Services.appinfo.accessibilityEnabled);
        break;
      case "a11y-init-or-shutdown":
        if (data == "1") {
          // Update this so users can check this while still running
          Services.prefs.setBoolPref("accessibility.loadedInLastSession", true);
          this._showE10sAccessibilityWarning();
        }
        break;
    }
  },

  onWindowsRestored() {
    if (this._wantsPrompt) {
      this._wantsPrompt = false;
      this._showE10sAccessibilityWarning();
    }
  },

  _warnedAboutAccessibility: false,

  _showE10sAccessibilityWarning() {
    // We don't prompt about a11y incompat if e10s is off.
    if (!Services.appinfo.browserTabsRemoteAutostart) {
      return;
    }

    // If the user set the forced pref and it's true, ignore a11y init.
    // If the pref doesn't exist or if it's false, prompt.
    if (this.forcedOn) {
      return;
    }

    // Only prompt once per session
    if (this._warnedAboutAccessibility) {
      return;
    }
    this._warnedAboutAccessibility = true;

    let win = RecentWindow.getMostRecentBrowserWindow();
    if (!win || !win.gBrowser || !win.gBrowser.selectedBrowser) {
      Services.console.logStringMessage(
          "Accessibility support is partially disabled due to compatibility issues with new features.");
      this._wantsPrompt = true;
      this._warnedAboutAccessibility = false;
      return;
    }
    let browser = win.gBrowser.selectedBrowser;

    // We disable a11y for content and prompt on the chrome side letting
    // a11y users know they need to disable e10s and restart.
    let promptMessage = win.gNavigatorBundle.getFormattedString(
                          "e10s.accessibilityNotice.mainMessage2",
                          [gBrandBundle.GetStringFromName("brandShortName")]
                        );
    let notification;
    let restartCallback  = function() {
      let cancelQuit = Cc["@mozilla.org/supports-PRBool;1"].createInstance(Ci.nsISupportsPRBool);
      Services.obs.notifyObservers(cancelQuit, "quit-application-requested", "restart");
      if (cancelQuit.data) {
        return; // somebody canceled our quit request
      }
      // Restart the browser
      Services.startup.quit(Services.startup.eAttemptQuit | Services.startup.eRestart);
    };
    // 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();
      },
      dismiss: true
    };
    // secondary option: a restart now button. When we restart e10s will be disabled due to
    // accessibility having been loaded in the previous session.
    let secondaryActions = [{
      label: win.gNavigatorBundle.getString("e10s.accessibilityNotice.enableAndRestart.label"),
      accessKey: win.gNavigatorBundle.getString("e10s.accessibilityNotice.enableAndRestart.accesskey"),
      callback: restartCallback,
    }];
    let options = {
      popupIconURL: "chrome://browser/skin/e10s-64@2x.png",
      learnMoreURL: Services.urlFormatter.formatURLPref("app.support.e10sAccessibilityUrl"),
      persistent: true,
      persistWhileVisible: true,
    };

    notification =
      win.PopupNotifications.show(browser, "a11y_enabled_with_e10s",
                                  promptMessage, null, mainAction,
                                  secondaryActions, 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.
+19 −4
Original line number Diff line number Diff line
@@ -267,6 +267,11 @@

static NS_DEFINE_CID(kCClipboardCID, NS_CLIPBOARD_CID);

#if defined(XP_WIN)
// e10s forced enable pref, defined in nsAppRunner.cpp
extern const char* kForceEnableE10sPref;
#endif

using base::ChildPrivileges;
using base::KillProcess;

@@ -1305,6 +1310,11 @@ ContentParent::Init()
  // process.
  if (nsIPresShell::IsAccessibilityActive()) {
#if defined(XP_WIN)
#if defined(RELEASE_OR_BETA)
    // On Windows we currently only enable a11y in the content process
    // for testing purposes.
    if (Preferences::GetBool(kForceEnableE10sPref, false))
#endif
      Unused << SendActivateA11y(::GetCurrentThreadId(),
                                 a11y::AccessibleWrap::GetContentProcessIdFor(ChildID()));
#else
@@ -2840,6 +2850,11 @@ ContentParent::Observe(nsISupports* aSubject,
      // Make sure accessibility is running in content process when
      // accessibility gets initiated in chrome process.
#if defined(XP_WIN)
#if defined(RELEASE_OR_BETA)
      // On Windows we currently only enable a11y in the content process
      // for testing purposes.
      if (Preferences::GetBool(kForceEnableE10sPref, false))
#endif
        Unused << SendActivateA11y(::GetCurrentThreadId(),
                                   a11y::AccessibleWrap::GetContentProcessIdFor(ChildID()));
#else
+47 −1
Original line number Diff line number Diff line
@@ -5049,7 +5049,7 @@ enum {
  kE10sEnabledByDefault = 1,
  kE10sDisabledByUser = 2,
  // kE10sDisabledInSafeMode = 3, was removed in bug 1172491.
  // kE10sDisabledForAccessibility = 4,
  kE10sDisabledForAccessibility = 4,
  // kE10sDisabledForMacGfx = 5, was removed in bug 1068674.
  // kE10sDisabledForBidi = 6, removed in bug 1309599
  kE10sDisabledForAddons = 7,
@@ -5058,6 +5058,18 @@ enum {
  // kE10sDisabledForOperatingSystem = 10, removed due to xp-eol
};

const char* kAccessibilityLastRunDatePref = "accessibility.lastLoadDate";
const char* kAccessibilityLoadedLastSessionPref = "accessibility.loadedInLastSession";

#if defined(XP_WIN)
static inline uint32_t
PRTimeToSeconds(PRTime t_usec)
{
  PRTime usec_per_sec = PR_USEC_PER_SEC;
  return uint32_t(t_usec /= usec_per_sec);
}
#endif

const char* kForceEnableE10sPref = "browser.tabs.remote.force-enable";
const char* kForceDisableE10sPref = "browser.tabs.remote.force-disable";

@@ -5085,6 +5097,40 @@ MultiprocessBlockPolicy()
    return kE10sDisabledForAddons;
  }

#if defined(XP_WIN) && defined(RELEASE_OR_BETA)
  bool disabledForA11y = false;
  /**
    * Avoids enabling e10s if accessibility has recently loaded. Performs the
    * following checks:
    * 1) Checks a pref indicating if a11y loaded in the last session. This pref
    * is set in nsBrowserGlue.js. If a11y was loaded in the last session we
    * do not enable e10s in this session.
    * 2) Accessibility stores a last run date (PR_IntervalNow) when it is
    * initialized (see nsBaseWidget.cpp). We check if this pref exists and
    * compare it to now. If a11y hasn't run in an extended period of time or
    * if the date pref does not exist we load e10s.
    */
  disabledForA11y = Preferences::GetBool(kAccessibilityLoadedLastSessionPref, false);
  if (!disabledForA11y  &&
      Preferences::HasUserValue(kAccessibilityLastRunDatePref)) {
    const uint32_t oneWeekInSeconds = 60 * 60 * 24 * 7;
    uint32_t a11yRunDate = Preferences::GetInt(kAccessibilityLastRunDatePref, 0);
    MOZ_ASSERT(0 != a11yRunDate);
    // If a11y hasn't run for a period of time, clear the pref and load e10s
    uint32_t now = PRTimeToSeconds(PR_Now());
    uint32_t difference = now - a11yRunDate;
    if (difference > oneWeekInSeconds || !a11yRunDate) {
      Preferences::ClearUser(kAccessibilityLastRunDatePref);
    } else {
      disabledForA11y = true;
    }
  }

  if (disabledForA11y) {
    return kE10sDisabledForAccessibility;
  }
#endif

  /*
   * None of the blocking policies matched, so e10s is allowed to run. Return
   * 0, indicating success.
+22 −0
Original line number Diff line number Diff line
@@ -171,6 +171,9 @@ nsBaseWidget::nsBaseWidget()
, mUseAttachedEvents(false)
, mIMEHasFocus(false)
, mIsFullyOccluded(false)
#if defined(XP_WIN) || defined(XP_MACOSX) || defined(MOZ_WIDGET_GTK)
, mAccessibilityInUseFlag(false)
#endif
{
#ifdef NOISY_WIDGET_LEAKS
  gNumWidgets++;
@@ -1883,6 +1886,18 @@ nsBaseWidget::ZoomToRect(const uint32_t& aPresShellId,

#ifdef ACCESSIBILITY

#if defined(XP_WIN) || defined(XP_MACOSX) || defined(MOZ_WIDGET_GTK)
// defined in nsAppRunner.cpp
extern const char* kAccessibilityLastRunDatePref;

static inline uint32_t
PRTimeToSeconds(PRTime t_usec)
{
  PRTime usec_per_sec = PR_USEC_PER_SEC;
  return uint32_t(t_usec /= usec_per_sec);
}
#endif

a11y::Accessible*
nsBaseWidget::GetRootAccessible()
{
@@ -1900,6 +1915,13 @@ nsBaseWidget::GetRootAccessible()
  // make sure it's not created at unsafe times.
  nsAccessibilityService* accService = GetOrCreateAccService();
  if (accService) {
#if defined(XP_WIN) || defined(XP_MACOSX) || defined(MOZ_WIDGET_GTK)
    if (!mAccessibilityInUseFlag) {
      mAccessibilityInUseFlag = true;
      uint32_t now = PRTimeToSeconds(PR_Now());
      Preferences::SetInt(kAccessibilityLastRunDatePref, now);
    }
#endif
    return accService->GetRootDocumentAccessible(presShell, nsContentUtils::IsSafeToRunScript());
  }

Loading