Bug 601143: Add loading and error states to the get add-ons view. r=Unfocused, a=blocks-betaN
authorDave Townsend <dtownsend@oxymoronical.com>
Tue, 21 Dec 2010 10:06:40 -0800
changeset 59595 33ef0dc2082473e1a43eb2851235fc9c88086239
parent 59592 a1a25bdf629b045326972552c0abefb920fc00bb
child 59596 19df7ba36bc46be1eff734e269df84d1d64a3712
push id1
push usershaver@mozilla.com
push dateTue, 04 Jan 2011 17:58:04 +0000
reviewersUnfocused, blocks-betaN
bugs601143
milestone2.0b9pre
Bug 601143: Add loading and error states to the get add-ons view. r=Unfocused, a=blocks-betaN try: -b do -p linux,linux64,macosx,macosx64,win32 -u xpcshell,mochitest-o -t none
toolkit/mozapps/extensions/content/extensions.js
toolkit/mozapps/extensions/content/extensions.xul
toolkit/mozapps/extensions/test/browser/Makefile.in
toolkit/mozapps/extensions/test/browser/browser_discovery.js
toolkit/mozapps/extensions/test/browser/discovery.html
toolkit/mozapps/extensions/test/browser/head.js
toolkit/themes/gnomestripe/mozapps/extensions/discover-logo.png
toolkit/themes/gnomestripe/mozapps/extensions/extensions.css
toolkit/themes/gnomestripe/mozapps/jar.mn
toolkit/themes/pinstripe/mozapps/extensions/discover-logo.png
toolkit/themes/pinstripe/mozapps/extensions/extensions.css
toolkit/themes/pinstripe/mozapps/jar.mn
toolkit/themes/winstripe/mozapps/extensions/discover-logo.png
toolkit/themes/winstripe/mozapps/extensions/extensions.css
toolkit/themes/winstripe/mozapps/jar.mn
--- a/toolkit/mozapps/extensions/content/extensions.js
+++ b/toolkit/mozapps/extensions/content/extensions.js
@@ -492,16 +492,18 @@ var gViewController = {
         try {
           view.shutdown();
         } catch(e) {
           // this shouldn't be fatal
           Cu.reportError(e);
         }
       }
     }
+
+    window.controllers.removeController(this);
   },
 
   statePopped: function(e) {
     // If this is a navigation to a previous state then load that state
     if (e.state) {
       this.loadViewInternal(e.state.view, e.state.previousView);
       return;
     }
@@ -1479,35 +1481,60 @@ var gHeader = {
 
 var gDiscoverView = {
   node: null,
   enabled: true,
   // Set to true after the view is first shown. If initialization completes
   // after this then it must also load the discover homepage
   loaded: false,
   _browser: null,
+  _loading: null,
+  _error: null,
+  homepageURL: null,
+  _loadListeners: [],
 
   initialize: function() {
     if (Services.prefs.getPrefType(PREF_DISCOVERURL) == Services.prefs.PREF_INVALID) {
       this.enabled = false;
       gCategories.get("addons://discover/").hidden = true;
       return;
     }
 
     this.node = document.getElementById("discover-view");
+    this._loading = document.getElementById("discover-loading");
+    this._error = document.getElementById("discover-error");
     this._browser = document.getElementById("discover-browser");
 
     var url = Cc["@mozilla.org/toolkit/URLFormatterService;1"]
                 .getService(Ci.nsIURLFormatter)
                 .formatURLPref(PREF_DISCOVERURL);
 
-    var browser = gDiscoverView._browser;
+    var self = this;
+
+    function setURL(aURL) {
+      try {
+        self.homepageURL = Services.io.newURI(aURL, null, null);
+      } catch (e) {
+        self.showError();
+        notifyInitialized();
+        return;
+      }
+
+      self._browser.homePage = self.homepageURL.spec;
+      self._browser.addProgressListener(self, Ci.nsIWebProgress.NOTIFY_ALL |
+                                              Ci.nsIWebProgress.NOTIFY_STATE_ALL);
+
+      if (self.loaded)
+        self._loadBrowser(notifyInitialized);
+      else
+        notifyInitialized();
+    }
 
     if (Services.prefs.getBoolPref(PREF_BACKGROUND_UPDATE) == false) {
-      browser.homePage = url;
+      setURL(url);
       return;
     }
 
     gPendingInitializations++;
     AddonManager.getAllAddons(function(aAddons) {
       var list = {};
       aAddons.forEach(function(aAddon) {
         list[aAddon.id] = {
@@ -1515,49 +1542,132 @@ var gDiscoverView = {
           version: aAddon.version,
           type: aAddon.type,
           userDisabled: aAddon.userDisabled,
           isCompatible: aAddon.isCompatible,
           isBlocklisted: aAddon.blocklistState == Ci.nsIBlocklistService.STATE_BLOCKED
         }
       });
 
-      browser.homePage = url + "#" + JSON.stringify(list);
-
-      if (gDiscoverView.loaded) {
-        browser.addEventListener("load", function() {
-          browser.removeEventListener("load", arguments.callee, true);
-          notifyInitialized();
-        }, true);
-        browser.goHome();
-      } else {
-        notifyInitialized();
-      }
+      setURL(url + "#" + JSON.stringify(list));
     });
   },
 
   show: function() {
-    if (!this.loaded) {
-      this.loaded = true;
-
-      var browser = gDiscoverView._browser;
-      browser.addEventListener("load", function() {
-        browser.removeEventListener("load", arguments.callee, true);
-        gViewController.updateCommands();
-        gViewController.notifyViewChanged();
-      }, true);
-      browser.goHome();
-    } else {
+    // If the view has loaded before and the error page is not visible then
+    // there is nothing else to do
+    if (this.loaded && this.node.selectedPanel != this._error) {
       gViewController.updateCommands();
       gViewController.notifyViewChanged();
+      return;
     }
+
+    this.loaded = true;
+
+    // No homepage means initialization isn't complete, the browser will get
+    // loaded once initialization is complete
+    if (!this.homepageURL) {
+      this._loadListeners.push(gViewController.notifyViewChanged.bind(gViewController));
+      return;
+    }
+
+    this._loadBrowser(gViewController.notifyViewChanged.bind(gViewController));
   },
 
   hide: function() { },
 
+  showError: function() {
+    this.node.selectedPanel = this._error;
+  },
+
+  _loadBrowser: function(aCallback) {
+    this.node.selectedPanel = this._loading;
+
+    if (aCallback)
+      this._loadListeners.push(aCallback);
+
+    if (this._browser.currentURI.equals(this.homepageURL))
+      this._browser.reload();
+    else
+      this._browser.goHome();
+  },
+
+  onLocationChange: function(aWebProgress, aRequest, aLocation) {
+    // Ignore the about:blank load
+    if (aLocation.spec == "about:blank")
+      return;
+
+    // If the hostname is the same as the new location's host and either the
+    // default scheme is insecure or the new location is secure then continue
+    // with the load
+    if (aLocation.host == this.homepageURL.host &&
+        (!this.homepageURL.schemeIs("https") || aLocation.schemeIs("https")))
+      return;
+
+    // Canceling the request will send an error to onStateChange which will show
+    // the error page
+    aRequest.cancel(Components.results.NS_BINDING_ABORTED);
+  },
+
+  onSecurityChange: function(aWebProgress, aRequest, aState) {
+    // Don't care about security if the page is not https
+    if (!this.homepageURL.schemeIs("https"))
+      return;
+
+    // If the request was secure then it is ok
+    if (aState & Ci.nsIWebProgressListener.STATE_IS_SECURE)
+      return;
+
+    // Canceling the request will send an error to onStateChange which will show
+    // the error page
+    aRequest.cancel(Components.results.NS_BINDING_ABORTED);
+  },
+
+  onStateChange: function(aWebProgress, aRequest, aStateFlags, aStatus) {
+    // Only care about the network stop status events
+    if (!(aStateFlags & (Ci.nsIWebProgressListener.STATE_IS_NETWORK)) ||
+        !(aStateFlags & (Ci.nsIWebProgressListener.STATE_STOP)))
+      return;
+
+    // Sometimes we stop getting onLocationChange events so we must redo the
+    // url tests here (bug 602256)
+    var location = this._browser.currentURI;
+
+    // Consider the successful load of about:blank as still loading
+    if (Components.isSuccessCode(aStatus) && location && location.spec == "about:blank")
+      return;
+
+    // If there was an error loading the page or the new hostname is not the
+    // same as the default hostname or the default scheme is secure and the new
+    // scheme is insecure then show the error page
+    if (!Components.isSuccessCode(aStatus) ||
+        (aRequest && aRequest instanceof Ci.nsIHttpChannel && !aRequest.requestSucceeded) ||
+        location.host != this.homepageURL.host ||
+        (this.homepageURL.schemeIs("https") && !location.schemeIs("https"))) {
+      this.showError();
+    } else {
+      // Got a successful load, make sure the browser is visible
+      this.node.selectedPanel = this._browser;
+      gViewController.updateCommands();
+    }
+
+    var listeners = this._loadListeners;
+    this._loadListeners = [];
+
+    listeners.forEach(function(aListener) {
+      aListener();
+    });
+  },
+
+  onProgressChange: function() { },
+  onStatusChange: function() { },
+
+  QueryInterface: XPCOMUtils.generateQI([Ci.nsIWebProgressListener,
+                                         Ci.nsISupportsWeakReference]),
+
   getSelectedAddon: function() null
 };
 
 
 var gCachedAddons = {};
 
 var gSearchView = {
   node: null,
--- a/toolkit/mozapps/extensions/content/extensions.xul
+++ b/toolkit/mozapps/extensions/content/extensions.xul
@@ -37,16 +37,18 @@
    -
    - ***** END LICENSE BLOCK ***** -->
 
 <?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
 <?xml-stylesheet href="chrome://mozapps/content/extensions/extensions.css"?>
 <?xml-stylesheet href="chrome://mozapps/skin/extensions/extensions.css"?>
 
 <!DOCTYPE page [
+<!ENTITY % brandDTD SYSTEM "chrome://branding/locale/brand.dtd" >
+%brandDTD;
 <!ENTITY % extensionsDTD SYSTEM "chrome://mozapps/locale/extensions/extensions.dtd">
 %extensionsDTD;
 ]>
 
 <page xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
       xmlns:xhtml="http://www.w3.org/1999/xhtml"
       id="addons-page" title="&addons.windowTitle;" disablechrome="true"
       role="application" windowtype="Addons:Manager"
@@ -247,20 +249,44 @@
     </richlistbox>
 
     <box id="view-port-container" flex="1">
 
       <!-- view port -->
       <deck id="view-port" flex="1">
 
         <!-- discover view -->
-        <vbox id="discover-view" flex="1" class="view-pane">
+        <deck id="discover-view" flex="1" class="view-pane">
+          <vbox id="discover-loading" align="center" pack="stretch" flex="1" class="alert-container">
+            <spacer class="alert-spacer-before"/>
+            <hbox class="alert loading" align="center">
+              <image/>
+              <label value="&loading.label;"/>
+            </hbox>
+            <spacer class="alert-spacer-after"/>
+          </vbox>
+          <vbox id="discover-error" align="center" pack="stretch" flex="1" class="alert-container">
+            <spacer class="alert-spacer-before"/>
+            <hbox>
+              <spacer class="discover-spacer-before"/>
+              <hbox class="alert" align="center">
+                <image class="discover-logo"/>
+                <vbox flex="1" align="stretch">
+                  <label class="discover-title">&discover.title;</label>
+                  <description class="discover-description">&discover.description2;</description>
+                  <description class="discover-footer">&discover.footer;</description>
+                </vbox>
+              </hbox>
+              <spacer class="discover-spacer-after"/>
+            </hbox>
+            <spacer class="alert-spacer-after"/>
+          </vbox>
           <browser id="discover-browser" type="content" flex="1"
                    disablehistory="true" homepage="about:blank"/>
-        </vbox>
+        </deck>
 
         <!-- search view -->
         <vbox id="search-view" flex="1" class="view-pane">
           <hbox class="view-header global-warning-container" align="center">
             <!-- global warnings -->
             <hbox class="global-warning" flex="1">
               <hbox class="global-warning-safemode" flex="1" align="center"
                     tooltiptext="&warning.safemode.label;">
--- a/toolkit/mozapps/extensions/test/browser/Makefile.in
+++ b/toolkit/mozapps/extensions/test/browser/Makefile.in
@@ -93,16 +93,17 @@ include $(DEPTH)/config/autoconf.mk
   browser_bug591465.xml \
   browser_searching.xml \
   browser_searching_empty.xml \
   browser_updatessl.rdf \
   browser_install.rdf \
   browser_install.xml \
   browser_install1_3.xpi \
   browser_eula.xml \
+  discovery.html \
   redirect.sjs \
   releaseNotes.xhtml \
   $(NULL)
 
 # Disabled browser_bug586574.js due to bug 596174
 
 include $(topsrcdir)/config/rules.mk
 
--- a/toolkit/mozapps/extensions/test/browser/browser_discovery.js
+++ b/toolkit/mozapps/extensions/test/browser/browser_discovery.js
@@ -1,23 +1,47 @@
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/
  */
 
 // Tests that the discovery view loads properly
 
 const PREF_BACKGROUND_UPDATE = "extensions.update.enabled";
+const MAIN_URL = "https://example.com/" + RELATIVE_DIR + "discovery.html";
 
 var gManagerWindow;
 var gCategoryUtilities;
 var gProvider;
 
+var gLoadCompleteCallback = null;
+
+var gProgressListener = {
+  onStateChange: function(aWebProgress, aRequest, aStateFlags, aStatus) {
+    // Only care about the network stop status events
+    if (!(aStateFlags & (Ci.nsIWebProgressListener.STATE_IS_NETWORK)) ||
+        !(aStateFlags & (Ci.nsIWebProgressListener.STATE_STOP)))
+      return;
+
+    if (gLoadCompleteCallback)
+      executeSoon(gLoadCompleteCallback);
+    gLoadCompleteCallback = null;
+  },
+
+  onLocationChange: function() { },
+  onSecurityChange: function() { },
+  onProgressChange: function() { },
+  onStatusChange: function() { },
+
+  QueryInterface: XPCOMUtils.generateQI([Ci.nsIWebProgressListener,
+                                         Ci.nsISupportsWeakReference]),
+};
+
 function test() {
   // Switch to a known url
-  Services.prefs.setCharPref(PREF_DISCOVERURL, TESTROOT + "releaseNotes.xhtml");
+  Services.prefs.setCharPref(PREF_DISCOVERURL, MAIN_URL);
 
   waitForExplicitFinish();
 
   gProvider = new MockProvider();
 
   gProvider.createAddons([{
     id: "addon1@tests.mozilla.org",
     name: "Test add-on 1",
@@ -47,24 +71,32 @@ function test() {
   run_next_test();
 }
 
 function end_test() {
   finish();
 }
 
 function getURL(aBrowser) {
+  if (gManagerWindow.document.getElementById("discover-view").selectedPanel !=
+      aBrowser)
+    return null;
+
   var url = aBrowser.currentURI.spec;
   var pos = url.indexOf("#");
   if (pos != -1)
     return url.substring(0, pos);
   return url;
 }
 
 function getHash(aBrowser) {
+  if (gManagerWindow.document.getElementById("discover-view").selectedPanel !=
+      aBrowser)
+    return null;
+
   var url = aBrowser.currentURI.spec;
   var pos = url.indexOf("#");
   if (pos != -1)
     return decodeURIComponent(url.substring(pos + 1));
   return null;
 }
 
 function testHash(aBrowser, aCallback) {
@@ -102,69 +134,98 @@ function testHash(aBrowser, aCallback) {
       is(addonData.isBlocklisted, aAddon.blocklistState == Ci.nsIBlocklistService.STATE_BLOCKED, "blocklisted should be correct");
       is(addonData.isCompatible, aAddon.isCompatible, "isCompatible should be correct");
     });
 
     aCallback();
   });
 }
 
+function isLoading() {
+  return gManagerWindow.document.getElementById("discover-view").selectedPanel ==
+         gManagerWindow.document.getElementById("discover-loading");
+}
+
+function isError() {
+  return gManagerWindow.document.getElementById("discover-view").selectedPanel ==
+         gManagerWindow.document.getElementById("discover-error");
+}
+
+function clickLink(aId, aCallback) {
+  var browser = gManagerWindow.document.getElementById("discover-browser");
+  browser.addProgressListener(gProgressListener);
+
+  gLoadCompleteCallback = function() {
+    browser.removeProgressListener(gProgressListener);
+    aCallback();
+  };
+
+  var link = browser.contentDocument.getElementById(aId);
+  EventUtils.sendMouseEvent({type: "click"}, link);
+}
+
 // Tests that switching to the discovery view displays the right url
 add_test(function() {
   open_manager("addons://list/extension", function(aWindow) {
     gManagerWindow = aWindow;
     gCategoryUtilities = new CategoryUtilities(gManagerWindow);
 
     gCategoryUtilities.openType("discover", function() {
       var browser = gManagerWindow.document.getElementById("discover-browser");
-      is(getURL(browser), TESTROOT + "releaseNotes.xhtml", "Should have loaded the right url");
+      is(getURL(browser), MAIN_URL, "Should have loaded the right url");
 
       testHash(browser, function() {
         close_manager(gManagerWindow, run_next_test);
       });
     });
+
+    ok(isLoading(), "Should be loading at first");
   });
 });
 
 // Tests that loading the add-ons manager with the discovery view as the last
 // selected view displays the right url
 add_test(function() {
   open_manager(null, function(aWindow) {
-    gManagerWindow = aWindow;
     gCategoryUtilities = new CategoryUtilities(gManagerWindow);
     is(gCategoryUtilities.selectedCategory, "discover", "Should have loaded the right view");
 
     var browser = gManagerWindow.document.getElementById("discover-browser");
-    is(getURL(browser), TESTROOT + "releaseNotes.xhtml", "Should have loaded the right url");
+    is(getURL(browser), MAIN_URL, "Should have loaded the right url");
 
     testHash(browser, function() {
       close_manager(gManagerWindow, run_next_test);
     });
+  }, function(aWindow) {
+    gManagerWindow = aWindow;
+    ok(isLoading(), "Should be loading at first");
   });
 });
 
 // Tests that loading the add-ons manager with the discovery view as the initial
 // view displays the right url
 add_test(function() {
   open_manager(null, function(aWindow) {
     gManagerWindow = aWindow;
     gCategoryUtilities = new CategoryUtilities(gManagerWindow);
     gCategoryUtilities.openType("extension", function() {
       close_manager(gManagerWindow, function() {
         open_manager("addons://discover/", function(aWindow) {
-          gManagerWindow = aWindow;
           gCategoryUtilities = new CategoryUtilities(gManagerWindow);
           is(gCategoryUtilities.selectedCategory, "discover", "Should have loaded the right view");
 
           var browser = gManagerWindow.document.getElementById("discover-browser");
-          is(getURL(browser), TESTROOT + "releaseNotes.xhtml", "Should have loaded the right url");
+          is(getURL(browser), MAIN_URL, "Should have loaded the right url");
 
           testHash(browser, function() {
             close_manager(gManagerWindow, run_next_test);
           });
+        }, function(aWindow) {
+          gManagerWindow = aWindow;
+          ok(isLoading(), "Should be loading at first");
         });
       });
     });
   });
 });
 
 // Tests that switching to the discovery view displays the right url
 add_test(function() {
@@ -175,34 +236,34 @@ add_test(function() {
   });
 
   open_manager("addons://list/extension", function(aWindow) {
     gManagerWindow = aWindow;
     gCategoryUtilities = new CategoryUtilities(gManagerWindow);
 
     gCategoryUtilities.openType("discover", function() {
       var browser = gManagerWindow.document.getElementById("discover-browser");
-      is(getURL(browser), TESTROOT + "releaseNotes.xhtml", "Should have loaded the right url");
+      is(getURL(browser), MAIN_URL, "Should have loaded the right url");
 
       is(getHash(browser), null, "Hash should not have been passed");
       close_manager(gManagerWindow, run_next_test);
     });
   });
 });
 
 // Tests that loading the add-ons manager with the discovery view as the last
 // selected view displays the right url
 add_test(function() {
   open_manager(null, function(aWindow) {
     gManagerWindow = aWindow;
     gCategoryUtilities = new CategoryUtilities(gManagerWindow);
     is(gCategoryUtilities.selectedCategory, "discover", "Should have loaded the right view");
 
     var browser = gManagerWindow.document.getElementById("discover-browser");
-    is(getURL(browser), TESTROOT + "releaseNotes.xhtml", "Should have loaded the right url");
+    is(getURL(browser), MAIN_URL, "Should have loaded the right url");
 
     is(getHash(browser), null, "Hash should not have been passed");
     close_manager(gManagerWindow, run_next_test);
   });
 });
 
 // Tests that loading the add-ons manager with the discovery view as the initial
 // view displays the right url
@@ -213,17 +274,216 @@ add_test(function() {
     gCategoryUtilities.openType("extension", function() {
       close_manager(gManagerWindow, function() {
         open_manager("addons://discover/", function(aWindow) {
           gManagerWindow = aWindow;
           gCategoryUtilities = new CategoryUtilities(gManagerWindow);
           is(gCategoryUtilities.selectedCategory, "discover", "Should have loaded the right view");
 
           var browser = gManagerWindow.document.getElementById("discover-browser");
-          is(getURL(browser), TESTROOT + "releaseNotes.xhtml", "Should have loaded the right url");
+          is(getURL(browser), MAIN_URL, "Should have loaded the right url");
 
           is(getHash(browser), null, "Hash should not have been passed");
           close_manager(gManagerWindow, run_next_test);
         });
       });
     });
   });
 });
+
+// Tests that navigating to an insecure page fails
+add_test(function() {
+  open_manager("addons://discover/", function(aWindow) {
+    gManagerWindow = aWindow;
+    gCategoryUtilities = new CategoryUtilities(gManagerWindow);
+
+    var browser = gManagerWindow.document.getElementById("discover-browser");
+    is(getURL(browser), MAIN_URL, "Should have loaded the right url");
+
+    clickLink("link-http", function() {
+      ok(isError(), "Should have shown the error page");
+
+      gCategoryUtilities.openType("extension", function() {
+        gCategoryUtilities.openType("discover", function() {
+          is(getURL(browser), MAIN_URL, "Should have loaded the right url");
+
+          close_manager(gManagerWindow, run_next_test);
+        });
+        ok(isLoading(), "Should start loading again");
+      });
+    });
+  });
+});
+
+// Tests that navigating to a different domain fails
+add_test(function() {
+  open_manager("addons://discover/", function(aWindow) {
+    gManagerWindow = aWindow;
+    gCategoryUtilities = new CategoryUtilities(gManagerWindow);
+
+    var browser = gManagerWindow.document.getElementById("discover-browser");
+    is(getURL(browser), MAIN_URL, "Should have loaded the right url");
+
+    clickLink("link-domain", function() {
+      ok(isError(), "Should have shown the error page");
+
+      gCategoryUtilities.openType("extension", function() {
+        gCategoryUtilities.openType("discover", function() {
+          is(getURL(browser), MAIN_URL, "Should have loaded the right url");
+
+          close_manager(gManagerWindow, run_next_test);
+        });
+        ok(isLoading(), "Should start loading again");
+      });
+    });
+  });
+});
+
+// Tests that navigating to a missing page fails
+add_test(function() {
+  open_manager("addons://discover/", function(aWindow) {
+    gManagerWindow = aWindow;
+    gCategoryUtilities = new CategoryUtilities(gManagerWindow);
+
+    var browser = gManagerWindow.document.getElementById("discover-browser");
+    is(getURL(browser), MAIN_URL, "Should have loaded the right url");
+
+    clickLink("link-bad", function() {
+      ok(isError(), "Should have shown the error page");
+
+      gCategoryUtilities.openType("extension", function() {
+        gCategoryUtilities.openType("discover", function() {
+          is(getURL(browser), MAIN_URL, "Should have loaded the right url");
+
+          close_manager(gManagerWindow, run_next_test);
+        });
+        ok(isLoading(), "Should start loading again");
+      });
+    });
+  });
+});
+
+// Tests that navigating to a page on the same domain works
+add_test(function() {
+  open_manager("addons://discover/", function(aWindow) {
+    gManagerWindow = aWindow;
+    gCategoryUtilities = new CategoryUtilities(gManagerWindow);
+
+    var browser = gManagerWindow.document.getElementById("discover-browser");
+    is(getURL(browser), MAIN_URL, "Should have loaded the right url");
+
+    clickLink("link-good", function() {
+      is(getURL(browser), "https://example.com/" + RELATIVE_DIR + "releaseNotes.xhtml", "Should have loaded the right url");
+
+      gCategoryUtilities.openType("extension", function() {
+        gCategoryUtilities.openType("discover", function() {
+          is(getURL(browser), "https://example.com/" + RELATIVE_DIR + "releaseNotes.xhtml", "Should have loaded the right url");
+
+          close_manager(gManagerWindow, run_next_test);
+        });
+      });
+    });
+  });
+});
+
+// Tests repeated navigation to the same page followed by a navigation to a
+// different domain
+add_test(function() {
+  open_manager("addons://discover/", function(aWindow) {
+    gManagerWindow = aWindow;
+    gCategoryUtilities = new CategoryUtilities(gManagerWindow);
+
+    var browser = gManagerWindow.document.getElementById("discover-browser");
+    is(getURL(browser), MAIN_URL, "Should have loaded the right url");
+
+    var count = 10;
+    function clickAgain(aCallback) {
+      if (count-- == 0)
+        aCallback();
+      else
+        clickLink("link-normal", clickAgain.bind(null, aCallback));
+    }
+
+    clickAgain(function() {
+      is(getURL(browser), MAIN_URL, "Should have loaded the right url");
+
+      clickLink("link-domain", function() {
+        ok(isError(), "Should have shown the error page");
+
+        gCategoryUtilities.openType("extension", function() {
+          gCategoryUtilities.openType("discover", function() {
+            is(getURL(browser), MAIN_URL, "Should have loaded the right url");
+
+            close_manager(gManagerWindow, run_next_test);
+          });
+          ok(isLoading(), "Should start loading again");
+        });
+      });
+    });
+  });
+});
+
+// Loading an insecure main page should work if that is what the prefs say, should
+// also be able to navigate to a https page and back again
+add_test(function() {
+  Services.prefs.setCharPref(PREF_DISCOVERURL, TESTROOT + "discovery.html");
+
+  open_manager("addons://discover/", function(aWindow) {
+    gManagerWindow = aWindow;
+    gCategoryUtilities = new CategoryUtilities(gManagerWindow);
+
+    var browser = gManagerWindow.document.getElementById("discover-browser");
+    is(getURL(browser), TESTROOT + "discovery.html", "Should have loaded the right url");
+
+    clickLink("link-normal", function() {
+      is(getURL(browser), MAIN_URL, "Should have loaded the right url");
+
+      clickLink("link-http", function() {
+        is(getURL(browser), TESTROOT + "discovery.html", "Should have loaded the right url");
+
+        close_manager(gManagerWindow, run_next_test);
+      });
+    });
+  });
+});
+
+// Stopping the initial load should display the error page and then correctly
+// reload when switching away and back again
+add_test(function() {
+  Services.prefs.setCharPref(PREF_DISCOVERURL, MAIN_URL);
+
+  open_manager("addons://list/extension", function(aWindow) {
+    gManagerWindow = aWindow;
+    gCategoryUtilities = new CategoryUtilities(gManagerWindow);
+
+    var browser = gManagerWindow.document.getElementById("discover-browser");
+
+    EventUtils.synthesizeMouse(gCategoryUtilities.get("discover"), 2, 2, { }, gManagerWindow);
+
+    wait_for_view_load(gManagerWindow, function() {
+      ok(isError(), "Should have shown the error page");
+
+      gCategoryUtilities.openType("extension", function() {
+        EventUtils.synthesizeMouse(gCategoryUtilities.get("discover"), 2, 2, { }, gManagerWindow);
+
+        wait_for_view_load(gManagerWindow, function() {
+          ok(isError(), "Should have shown the error page");
+
+          gCategoryUtilities.openType("extension", function() {
+            gCategoryUtilities.openType("discover", function() {
+              is(getURL(browser), MAIN_URL, "Should have loaded the right url");
+
+              close_manager(gManagerWindow, run_next_test);
+            });
+          });
+        });
+
+        ok(isLoading(), "Should be loading");
+        // This will stop the real page load
+        browser.stop();
+      });
+    });
+
+    ok(isLoading(), "Should be loading");
+    // This will actually stop the about:blank load
+    browser.stop();
+  });
+});
new file mode 100644
--- /dev/null
+++ b/toolkit/mozapps/extensions/test/browser/discovery.html
@@ -0,0 +1,10 @@
+<html>
+<body>
+  <h1>Test page for the discovery pane</h1>
+  <p><a id="link-normal" href="https://example.com/browser/toolkit/mozapps/extensions/test/browser/discovery.html">Load normal</a></p>
+  <p><a id="link-http" href="http://example.com/browser/toolkit/mozapps/extensions/test/browser/discovery.html">Load insecure</a></p>
+  <p><a id="link-domain" href="https://test1.example.com/browser/toolkit/mozapps/extensions/test/browser/discovery.html">Load other domain</a></p>
+  <p><a id="link-bad" href="https://example.com/browser/toolkit/mozapps/extensions/test/browser/foo.html">Load missing page</a></p>
+  <p><a id="link-good" href="https://example.com/browser/toolkit/mozapps/extensions/test/browser/releaseNotes.xhtml">Load other page</a></p>
+</body>
+</html>
--- a/toolkit/mozapps/extensions/test/browser/head.js
+++ b/toolkit/mozapps/extensions/test/browser/head.js
@@ -76,16 +76,27 @@ registerCleanupFunction(function() {
         return;
 
       ok(false, "Should not have seen an install of " + aInstall.sourceURI.spec + " in state " + aInstall.state);
       aInstall.cancel();
     });
   });
 });
 
+function log_exceptions(aCallback) {
+  try {
+    var args = Array.slice(arguments, 1);
+    return aCallback.apply(null, args);
+  }
+  catch (e) {
+    info("Exception thrown: " + e);
+    throw e;
+  }
+}
+
 function add_test(test) {
   gPendingTests.push(test);
 }
 
 function run_next_test() {
   if (gTestsRun > 0)
     info("Test " + gTestsRun + " took " + (Date.now() - gTestStart) + "ms");
 
@@ -97,17 +108,17 @@ function run_next_test() {
   gTestsRun++;
   var test = gPendingTests.shift();
   if (test.name)
     info("Running test " + gTestsRun + " (" + test.name + ")");
   else
     info("Running test " + gTestsRun);
 
   gTestStart = Date.now();
-  test();
+  log_exceptions(test);
 }
 
 function get_addon_file_url(aFilename) {
   try {
     var cr = Cc["@mozilla.org/chrome/chrome-registry;1"].
              getService(Ci.nsIChromeRegistry);
     var fileurl = cr.convertChromeURL(makeURI(CHROMEROOT + "addons/" + aFilename));
     return fileurl.QueryInterface(Ci.nsIFileURL);
@@ -188,43 +199,43 @@ function get_addon_element(aManager, aId
   }
   return null;
 }
 
 function wait_for_view_load(aManagerWindow, aCallback, aForceWait, aLongerTimeout) {
   requestLongerTimeout(aLongerTimeout ? aLongerTimeout : 2);
 
   if (!aForceWait && !aManagerWindow.gViewController.isLoading) {
-    aCallback(aManagerWindow);
+    log_exceptions(aCallback, aManagerWindow);
     return;
   }
 
   aManagerWindow.document.addEventListener("ViewChanged", function() {
     aManagerWindow.document.removeEventListener("ViewChanged", arguments.callee, false);
-    aCallback(aManagerWindow);
+    log_exceptions(aCallback, aManagerWindow);
   }, false);
 }
 
 function wait_for_manager_load(aManagerWindow, aCallback) {
   if (!aManagerWindow.gIsInitializing) {
-    aCallback(aManagerWindow);
+    log_exceptions(aCallback, aManagerWindow);
     return;
   }
 
   info("Waiting for initialization");
   aManagerWindow.document.addEventListener("Initialized", function() {
     aManagerWindow.document.removeEventListener("Initialized", arguments.callee, false);
-    aCallback(aManagerWindow);
+    log_exceptions(aCallback, aManagerWindow);
   }, false);
 }
 
 function open_manager(aView, aCallback, aLoadCallback, aLongerTimeout) {
   function setup_manager(aManagerWindow) {
     if (aLoadCallback)
-      aLoadCallback(aManagerWindow);
+      log_exceptions(aLoadCallback, aManagerWindow);
 
     if (aView)
       aManagerWindow.loadView(aView);
 
     ok(aManagerWindow != null, "Should have an add-ons manager window");
     is(aManagerWindow.location, MANAGER_URI, "Should be displaying the correct UI");
 
     wait_for_manager_load(aManagerWindow, function() {
@@ -249,17 +260,17 @@ function open_manager(aView, aCallback, 
 function close_manager(aManagerWindow, aCallback, aLongerTimeout) {
   requestLongerTimeout(aLongerTimeout ? aLongerTimeout : 2);
 
   ok(aManagerWindow != null, "Should have an add-ons manager window to close");
   is(aManagerWindow.location, MANAGER_URI, "Should be closing window with correct URI");
 
   aManagerWindow.addEventListener("unload", function() {
     this.removeEventListener("unload", arguments.callee, false);
-    aCallback();
+    log_exceptions(aCallback);
   }, false);
 
   aManagerWindow.close();
 }
 
 function restart_manager(aManagerWindow, aView, aCallback, aLoadCallback) {
   if (!aManagerWindow) {
     open_manager(aView, aCallback, aLoadCallback);
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..cd50735a8943c0b63d42b33064c9411fe2900d5f
GIT binary patch
literal 12007
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
FV1jUgd3gW;
--- a/toolkit/themes/gnomestripe/mozapps/extensions/extensions.css
+++ b/toolkit/themes/gnomestripe/mozapps/extensions/extensions.css
@@ -353,16 +353,50 @@
 }
 
 .sorter[checkState="2"] .button-icon {
   display: -moz-box;
   list-style-image: url("moz-icon://stock/gtk-sort-ascending?size=16");
 }
 
 
+/*** discover view ***/
+
+.discover-spacer-before,
+.discover-spacer-after {
+  -moz-box-flex: 1;
+}
+
+#discover-error .alert {
+  max-width: 45em;
+  -moz-box-flex: 1;
+}
+
+.discover-logo {
+  list-style-image: url("chrome://mozapps/skin/extensions/discover-logo.png");
+  -moz-margin-end: 15px;
+}
+
+.discover-title {
+  font-weight: bold;
+  font-size: 24px;
+  font-family: MetaWebPro-Book, "Trebuchet MS", sans-serif;
+  margin: 0 0 15px 0;
+}
+
+.discover-description {
+  text-align: justify;
+  margin: 0 0 15px 0;
+}
+
+.discover-footer {
+  text-align: justify;
+}
+
+
 /*** list ***/
 
 .list {
   -moz-appearance: none;
   margin: 0;
   border: none;
   background-color: transparent;
 }
--- a/toolkit/themes/gnomestripe/mozapps/jar.mn
+++ b/toolkit/themes/gnomestripe/mozapps/jar.mn
@@ -8,16 +8,17 @@ toolkit.jar:
 + skin/classic/mozapps/extensions/category-discover.png    (extensions/category-discover.png)
 + skin/classic/mozapps/extensions/category-languages.png   (extensions/category-languages.png)
 + skin/classic/mozapps/extensions/category-searchengines.png (extensions/category-searchengines.png)
 + skin/classic/mozapps/extensions/category-extensions.png  (extensions/category-extensions.png)
 + skin/classic/mozapps/extensions/category-themes.png      (extensions/category-themes.png)
 + skin/classic/mozapps/extensions/category-plugins.png     (extensions/category-plugins.png)
 + skin/classic/mozapps/extensions/category-recent.png      (extensions/category-recent.png)
 + skin/classic/mozapps/extensions/category-available.png   (extensions/category-available.png)
++ skin/classic/mozapps/extensions/discover-logo.png        (extensions/discover-logo.png)
 + skin/classic/mozapps/extensions/extensionGeneric.png     (extensions/extensionGeneric.png)
 + skin/classic/mozapps/extensions/extensionGeneric-16.png  (extensions/extensionGeneric-16.png)
 + skin/classic/mozapps/extensions/themeGeneric.png         (extensions/themeGeneric.png)
 + skin/classic/mozapps/extensions/themeGeneric-16.png      (extensions/themeGeneric-16.png)
 + skin/classic/mozapps/extensions/localeGeneric.png        (extensions/localeGeneric.png)
 + skin/classic/mozapps/extensions/rating-won.png           (extensions/rating-won.png)
 + skin/classic/mozapps/extensions/rating-not-won.png       (extensions/rating-not-won.png)
 + skin/classic/mozapps/extensions/cancel.png               (extensions/cancel.png)
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..cd50735a8943c0b63d42b33064c9411fe2900d5f
GIT binary patch
literal 12007
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
FV1jUgd3gW;
--- a/toolkit/themes/pinstripe/mozapps/extensions/extensions.css
+++ b/toolkit/themes/pinstripe/mozapps/extensions/extensions.css
@@ -170,17 +170,17 @@
   margin-bottom: 15px;
 }
 
 .alert .addon-control {
   margin: 1em 2em;
 }
 
 .loading {
- list-style-image: url("chrome://global/skin/icons/loading_16.png");
+  list-style-image: url("chrome://global/skin/icons/loading_16.png");
   padding-left: 20px;
   padding-right: 20px;
 }
 
 
 
 /*** category selector ***/
 
@@ -383,16 +383,50 @@
   list-style-image: url("chrome://global/skin/arrow/arrow-up.gif");
 }
 
 .sorter .button-icon {
   -moz-margin-start: 4px;
 }
 
 
+/*** discover view ***/
+
+.discover-spacer-before,
+.discover-spacer-after {
+  -moz-box-flex: 1;
+}
+
+#discover-error .alert {
+  max-width: 45em;
+  -moz-box-flex: 1;
+}
+
+.discover-logo {
+  list-style-image: url("chrome://mozapps/skin/extensions/discover-logo.png");
+  -moz-margin-end: 15px;
+}
+
+.discover-title {
+  font-weight: bold;
+  font-size: 24px;
+  font-family: MetaWebPro-Book, "Trebuchet MS", sans-serif;
+  margin: 0 0 15px 0;
+}
+
+.discover-description {
+  text-align: justify;
+  margin: 0 0 15px 0;
+}
+
+.discover-footer {
+  text-align: justify;
+}
+
+
 /*** list ***/
 
 .list {
   -moz-appearance: none;
   margin: 0;
   border: none;
   background-color: transparent;
 }
--- a/toolkit/themes/pinstripe/mozapps/jar.mn
+++ b/toolkit/themes/pinstripe/mozapps/jar.mn
@@ -9,16 +9,17 @@ toolkit.jar:
   skin/classic/mozapps/extensions/category-discover.png           (extensions/category-discover.png)
   skin/classic/mozapps/extensions/category-languages.png          (extensions/category-languages.png)
   skin/classic/mozapps/extensions/category-searchengines.png      (extensions/category-searchengines.png)
   skin/classic/mozapps/extensions/category-extensions.png         (extensions/category-extensions.png)
   skin/classic/mozapps/extensions/category-themes.png             (extensions/category-themes.png)
   skin/classic/mozapps/extensions/category-plugins.png            (extensions/category-plugins.png)
   skin/classic/mozapps/extensions/category-recent.png             (extensions/category-recent.png)
   skin/classic/mozapps/extensions/category-available.png          (extensions/category-available.png)
+  skin/classic/mozapps/extensions/discover-logo.png               (extensions/discover-logo.png)
   skin/classic/mozapps/extensions/extensionGeneric.png            (extensions/extensionGeneric.png)
   skin/classic/mozapps/extensions/extensionGeneric-16.png         (extensions/extensionGeneric-16.png)
   skin/classic/mozapps/extensions/themeGeneric.png                (extensions/themeGeneric.png)
   skin/classic/mozapps/extensions/themeGeneric-16.png             (extensions/themeGeneric-16.png)
   skin/classic/mozapps/extensions/localeGeneric.png               (extensions/localeGeneric.png)
   skin/classic/mozapps/extensions/rating-won.png                  (extensions/rating-won.png)
   skin/classic/mozapps/extensions/rating-not-won.png              (extensions/rating-not-won.png)
   skin/classic/mozapps/extensions/cancel.png                      (extensions/cancel.png)
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..cd50735a8943c0b63d42b33064c9411fe2900d5f
GIT binary patch
literal 12007
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
FV1jUgd3gW;
--- a/toolkit/themes/winstripe/mozapps/extensions/extensions.css
+++ b/toolkit/themes/winstripe/mozapps/extensions/extensions.css
@@ -440,16 +440,50 @@
   list-style-image: url("chrome://global/skin/arrow/arrow-up.gif");
 }
 
 .sorter .button-icon {
   -moz-margin-start: 4px;
 }
 
 
+/*** discover view ***/
+
+.discover-spacer-before,
+.discover-spacer-after {
+  -moz-box-flex: 1;
+}
+
+#discover-error .alert {
+  max-width: 45em;
+  -moz-box-flex: 1;
+}
+
+.discover-logo {
+  list-style-image: url("chrome://mozapps/skin/extensions/discover-logo.png");
+  -moz-margin-end: 15px;
+}
+
+.discover-title {
+  font-weight: bold;
+  font-size: 24px;
+  font-family: MetaWebPro-Book, "Trebuchet MS", sans-serif;
+  margin: 0 0 15px 0;
+}
+
+.discover-description {
+  text-align: justify;
+  margin: 0 0 15px 0;
+}
+
+.discover-footer {
+  text-align: justify;
+}
+
+
 /*** list ***/
 
 .list {
   -moz-appearance: none;
   margin: 0;
   border: none;
   background-color: transparent;
 }
--- a/toolkit/themes/winstripe/mozapps/jar.mn
+++ b/toolkit/themes/winstripe/mozapps/jar.mn
@@ -16,16 +16,17 @@ toolkit.jar:
         skin/classic/mozapps/extensions/category-discover.png      (extensions/category-discover.png)
         skin/classic/mozapps/extensions/category-languages.png     (extensions/category-languages.png)
         skin/classic/mozapps/extensions/category-searchengines.png (extensions/category-searchengines.png)
         skin/classic/mozapps/extensions/category-extensions.png    (extensions/category-extensions.png)
         skin/classic/mozapps/extensions/category-themes.png        (extensions/category-themes.png)
         skin/classic/mozapps/extensions/category-plugins.png       (extensions/category-plugins.png)
         skin/classic/mozapps/extensions/category-recent.png        (extensions/category-recent.png)
         skin/classic/mozapps/extensions/category-available.png     (extensions/category-available.png)
+        skin/classic/mozapps/extensions/discover-logo.png          (extensions/discover-logo.png)
         skin/classic/mozapps/extensions/extensionGeneric.png       (extensions/extensionGeneric.png)
         skin/classic/mozapps/extensions/extensionGeneric-16.png    (extensions/extensionGeneric-16.png)
         skin/classic/mozapps/extensions/themeGeneric.png           (extensions/themeGeneric.png)
         skin/classic/mozapps/extensions/themeGeneric-16.png        (extensions/themeGeneric-16.png)
         skin/classic/mozapps/extensions/localeGeneric.png          (extensions/localeGeneric.png)
         skin/classic/mozapps/extensions/rating-won.png             (extensions/rating-won.png)
         skin/classic/mozapps/extensions/rating-not-won.png         (extensions/rating-not-won.png)
         skin/classic/mozapps/extensions/cancel.png                 (extensions/cancel.png)
@@ -91,16 +92,17 @@ toolkit.jar:
         skin/classic/aero/mozapps/extensions/category-discover.png         (extensions/category-discover-aero.png)
         skin/classic/aero/mozapps/extensions/category-languages.png        (extensions/category-languages-aero.png)
         skin/classic/aero/mozapps/extensions/category-searchengines.png    (extensions/category-searchengines.png)
         skin/classic/aero/mozapps/extensions/category-extensions.png       (extensions/category-extensions-aero.png)
         skin/classic/aero/mozapps/extensions/category-themes.png           (extensions/category-themes-aero.png)
         skin/classic/aero/mozapps/extensions/category-plugins.png          (extensions/category-plugins-aero.png)
         skin/classic/aero/mozapps/extensions/category-recent.png           (extensions/category-recent-aero.png)
         skin/classic/aero/mozapps/extensions/category-available.png        (extensions/category-available-aero.png)
+        skin/classic/aero/mozapps/extensions/discover-logo.png             (extensions/discover-logo.png)
         skin/classic/aero/mozapps/extensions/extensionGeneric.png          (extensions/extensionGeneric-aero.png)
         skin/classic/aero/mozapps/extensions/extensionGeneric-16.png       (extensions/extensionGeneric-16-aero.png)
         skin/classic/aero/mozapps/extensions/themeGeneric.png              (extensions/themeGeneric-aero.png)
         skin/classic/aero/mozapps/extensions/themeGeneric-16.png           (extensions/themeGeneric-16-aero.png)
         skin/classic/aero/mozapps/extensions/localeGeneric.png             (extensions/localeGeneric-aero.png)
         skin/classic/aero/mozapps/extensions/rating-won.png                (extensions/rating-won.png)
         skin/classic/aero/mozapps/extensions/rating-not-won.png            (extensions/rating-not-won.png)
         skin/classic/aero/mozapps/extensions/cancel.png                    (extensions/cancel.png)