Bug 1471243 - Do not prerender ActivityStream for about:welcome draft
authorahillier <ahillier@mozilla.com>
Mon, 09 Jul 2018 15:11:03 -0700
changeset 816234 8a715925f21a59416f4131e0328ed7b012586608
parent 814904 fa376bf17cc95539f5e37186977d760296fb5093
push id115785
push userahillier@mozilla.com
push dateTue, 10 Jul 2018 20:08:27 +0000
bugs1471243
milestone63.0a1
Bug 1471243 - Do not prerender ActivityStream for about:welcome MozReview-Commit-ID: IDyWGnuMndy
browser/components/about/AboutRedirector.cpp
browser/components/newtab/aboutNewTabService.js
browser/components/newtab/nsIAboutNewTabService.idl
browser/components/newtab/tests/xpcshell/test_AboutNewTabService.js
--- a/browser/components/about/AboutRedirector.cpp
+++ b/browser/components/about/AboutRedirector.cpp
@@ -160,25 +160,32 @@ AboutRedirector::NewChannel(nsIURI* aURI
 
   for (auto & redir : kRedirMap) {
     if (!strcmp(path.get(), redir.id)) {
       nsAutoCString url;
 
       // Let the aboutNewTabService decide where to redirect for about:home and
       // enabled about:newtab. Disabledx about:newtab page uses fallback.
       if (path.EqualsLiteral("home") ||
-          (sNewTabPageEnabled && path.EqualsLiteral("newtab")) ||
-          path.EqualsLiteral("welcome")) {
+          (sNewTabPageEnabled && path.EqualsLiteral("newtab"))) {
         nsCOMPtr<nsIAboutNewTabService> aboutNewTabService =
           do_GetService("@mozilla.org/browser/aboutnewtab-service;1", &rv);
         NS_ENSURE_SUCCESS(rv, rv);
         rv = aboutNewTabService->GetDefaultURL(url);
         NS_ENSURE_SUCCESS(rv, rv);
       }
 
+      if (path.EqualsLiteral("welcome")) {
+        nsCOMPtr<nsIAboutNewTabService> aboutNewTabService =
+          do_GetService("@mozilla.org/browser/aboutnewtab-service;1", &rv);
+        NS_ENSURE_SUCCESS(rv, rv);
+        rv = aboutNewTabService->GetWelcomeURL(url);
+        NS_ENSURE_SUCCESS(rv, rv);
+      }
+
       if (sNewCertErrorPageEnabled && path.EqualsLiteral("certerror")) {
         url.AssignASCII("chrome://browser/content/aboutNetError-new.xhtml");
       }
 
       // fall back to the specified url in the map
       if (url.IsEmpty()) {
         url.AssignASCII(redir.url);
       }
--- a/browser/components/newtab/aboutNewTabService.js
+++ b/browser/components/newtab/aboutNewTabService.js
@@ -181,16 +181,30 @@ AboutNewTabService.prototype = {
       this._activityStreamPath,
       "activity-stream",
       this._activityStreamPrerender ? "-prerendered" : "",
       this._activityStreamDebug ? "-debug" : "",
       ".html"
     ].join("");
   },
 
+  /*
+   * Returns the about:welcome URL
+   *
+   * This is calculated in the same way the default URL is, except that we don't
+   * allow prerendering.
+   */
+  get welcomeURL() {
+    const prerenderEnabled = this._activityStreamPrerender;
+    this._activityStreamPrerender = false;
+    const url = this.defaultURL;
+    this._activityStreamPrerender = prerenderEnabled;
+    return url;
+  },
+
   get newTabURL() {
     return this._newTabURL;
   },
 
   set newTabURL(aNewTabURL) {
     aNewTabURL = aNewTabURL.trim();
     if (aNewTabURL === ABOUT_URL) {
       // avoid infinite redirects in case one sets the URL to about:newtab
--- a/browser/components/newtab/nsIAboutNewTabService.idl
+++ b/browser/components/newtab/nsIAboutNewTabService.idl
@@ -19,16 +19,21 @@ interface nsIAboutNewTabService : nsISup
   attribute ACString newTabURL;
 
   /**
    * Returns the default URL (local or activity stream depending on pref)
    */
   attribute ACString defaultURL;
 
   /**
+   * Returns the about:welcome URL.
+   */
+  attribute ACString welcomeURL;
+
+  /**
    * Returns true if opening the New Tab page will notify the user of a change.
    */
   attribute bool willNotifyUser;
 
   /**
    * Returns true if the default resource got overridden.
    */
   readonly attribute bool overridden;
--- a/browser/components/newtab/tests/xpcshell/test_AboutNewTabService.js
+++ b/browser/components/newtab/tests/xpcshell/test_AboutNewTabService.js
@@ -124,16 +124,43 @@ add_task(async function test_default_url
   }
 
   Assert.equal(aboutNewTabService.defaultURL, ACTIVITY_STREAM_URL,
     "Newtab defaultURL set to un-prerendered AS if prerender is false and debug is false");
 
   cleanup();
 });
 
+add_task(async function test_welcome_url() {
+  await setupASPrerendered();
+
+  Assert.equal(aboutNewTabService.activityStreamPrerender, true,
+    "Prerendering is enabled by default.");
+  Assert.equal(aboutNewTabService.welcomeURL, ACTIVITY_STREAM_URL,
+    "Newtab welcomeURL set to un-prerendered AS when prerendering enabled and debug disabled.");
+  await setBoolPrefAndWaitForChange(ACTIVITY_STREAM_PRERENDER_PREF, false,
+    "A notification occurs after changing the prerender pref to false.");
+  Assert.equal(aboutNewTabService.welcomeURL, aboutNewTabService.defaultURL,
+    "Newtab welcomeURL is equal to defaultURL when prerendering disabled and debug disabled.");
+
+  // Only debug variants aren't available on release/beta
+  if (!IS_RELEASE_OR_BETA) {
+    await setBoolPrefAndWaitForChange(ACTIVITY_STREAM_DEBUG_PREF, true,
+      "A notification occurs after changing the debug pref to true.");
+    Assert.equal(aboutNewTabService.welcomeURL, aboutNewTabService.welcomeURL,
+      "Newtab welcomeURL is equal to defaultURL when prerendering disabled and debug enabled.");
+    await setBoolPrefAndWaitForChange(ACTIVITY_STREAM_PRERENDER_PREF, true,
+      "A notification occurs after changing the prerender pref to true.");
+    Assert.equal(aboutNewTabService.welcomeURL, ACTIVITY_STREAM_DEBUG_URL,
+      "Newtab welcomeURL set to un-prerendered debug AS when prerendering enabled and debug enabled");
+  }
+
+  cleanup();
+});
+
 add_task(function test_locale() {
   Assert.equal(aboutNewTabService.activityStreamLocale, "en-US",
     "The locale for testing should be en-US");
 });
 
 /**
  * Tests reponse to updates to prefs
  */