Bug 1134501 - UITour: Force page into Reader View automatically whenever the ReaderView/ReadingList tour page is loaded. r=gijs, a=dolske
authorJared Wein <jwein@mozilla.com>
Wed, 15 Apr 2015 23:45:50 -0400
changeset 258530 e5d6dc48f6de
parent 258529 899ee022ed4c
child 258531 4a98323f8e68
push id4690
push userryanvm@gmail.com
push date2015-04-20 16:04 +0000
treeherdermozilla-beta@eb5e2063637b [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersgijs, dolske
bugs1134501
milestone38.0
Bug 1134501 - UITour: Force page into Reader View automatically whenever the ReaderView/ReadingList tour page is loaded. r=gijs, a=dolske
browser/app/profile/firefox.js
browser/base/content/browser.js
browser/components/uitour/UITour-lib.js
browser/components/uitour/UITour.jsm
browser/components/uitour/test/browser.ini
browser/components/uitour/test/browser_UITour_availableTargets.js
browser/components/uitour/test/browser_UITour_toggleReaderMode.js
browser/modules/ReaderParent.jsm
browser/themes/linux/jar.mn
browser/themes/osx/jar.mn
browser/themes/shared/reader/reader-tour.png
browser/themes/windows/jar.mn
--- a/browser/app/profile/firefox.js
+++ b/browser/app/profile/firefox.js
@@ -244,16 +244,18 @@ pref("lightweightThemes.recommendedTheme
 pref("browser.eme.ui.enabled", false);
 
 // UI tour experience.
 pref("browser.uitour.enabled", true);
 pref("browser.uitour.loglevel", "Error");
 pref("browser.uitour.requireSecure", true);
 pref("browser.uitour.themeOrigin", "https://addons.mozilla.org/%LOCALE%/firefox/themes/");
 pref("browser.uitour.url", "https://www.mozilla.org/%LOCALE%/firefox/%VERSION%/tour/");
+// This is used as a regexp match against the page's URL.
+pref("browser.uitour.readerViewTrigger", "^https:\/\/www\.mozilla\.org\/[^\/]+\/firefox\/reading\/start");
 
 pref("browser.customizemode.tip0.shown", false);
 pref("browser.customizemode.tip0.learnMoreUrl", "https://support.mozilla.org/1/firefox/%VERSION%/%OS%/%LOCALE%/customize");
 
 pref("keyword.enabled", true);
 pref("browser.fixup.domainwhitelist.localhost", true);
 
 pref("general.useragent.locale", "@AB_CD@");
--- a/browser/base/content/browser.js
+++ b/browser/base/content/browser.js
@@ -4185,16 +4185,17 @@ var XULBrowserWindow = {
         this.reloadCommand.removeAttribute("disabled");
       }
 
       if (gURLBar) {
         URLBarSetURI(aLocationURI);
 
         BookmarkingUI.onLocationChange();
         SocialUI.updateState(location);
+        UITour.onLocationChange(location);
       }
 
       // Utility functions for disabling find
       var shouldDisableFind = function shouldDisableFind(aDocument) {
         let docElt = aDocument.documentElement;
         return docElt && docElt.getAttribute("disablefastfind") == "true";
       }
 
--- a/browser/components/uitour/UITour-lib.js
+++ b/browser/components/uitour/UITour-lib.js
@@ -276,14 +276,18 @@ if (typeof Mozilla == 'undefined') {
 	};
 
 	Mozilla.UITour.openSearchPanel = function(callback) {
 		_sendEvent('openSearchPanel', {
 			callbackID: _waitForCallback(callback)
 		});
 	};
 
+	Mozilla.UITour.toggleReaderMode = function(feature) {
+		_sendEvent('toggleReaderMode');
+	};
+
 })();
 
 // Make this library Require-able.
 if (typeof module !== 'undefined' && module.exports) {
-  module.exports = Mozilla.UITour;
+  module.exports = Mozilla.UITour;
 }
--- a/browser/components/uitour/UITour.jsm
+++ b/browser/components/uitour/UITour.jsm
@@ -22,20 +22,23 @@ XPCOMUtils.defineLazyModuleGetter(this, 
 XPCOMUtils.defineLazyModuleGetter(this, "CustomizableUI",
   "resource:///modules/CustomizableUI.jsm");
 XPCOMUtils.defineLazyModuleGetter(this, "UITelemetry",
   "resource://gre/modules/UITelemetry.jsm");
 XPCOMUtils.defineLazyModuleGetter(this, "BrowserUITelemetry",
   "resource:///modules/BrowserUITelemetry.jsm");
 XPCOMUtils.defineLazyModuleGetter(this, "Metrics",
   "resource://gre/modules/Metrics.jsm");
+XPCOMUtils.defineLazyModuleGetter(this, "ReaderMode",
+  "resource://gre/modules/ReaderMode.jsm");
 
 // See LOG_LEVELS in Console.jsm. Common examples: "All", "Info", "Warn", & "Error".
 const PREF_LOG_LEVEL      = "browser.uitour.loglevel";
 const PREF_SEENPAGEIDS    = "browser.uitour.seenPageIDs";
+const PREF_READERVIEW_TRIGGER = "browser.uitour.readerViewTrigger";
 
 const BACKGROUND_PAGE_ACTIONS_ALLOWED = new Set([
   "endUrlbarCapture",
   "getConfiguration",
   "getTreatmentTag",
   "hideHighlight",
   "hideInfo",
   "hideMenu",
@@ -182,16 +185,17 @@ this.UITour = {
         if (!loopBrowser) {
           return null;
         }
         return loopBrowser.contentDocument.querySelector(".signin-link");
       },
     }],
     ["privateWindow",  {query: "#privatebrowsing-button"}],
     ["quit",        {query: "#PanelUI-quit"}],
+    ["readerMode-urlBar", {query: "#reader-mode-button"}],
     ["search",      {
       infoPanelOffsetX: 18,
       infoPanelPosition: "after_start",
       query: "#searchbar",
       widgetName: "search-container",
     }],
     ["searchProvider", {
       query: (aDocument) => {
@@ -336,16 +340,32 @@ this.UITour = {
       Services.prefs.clearUserPref(PREF_SEENPAGEIDS);
       return;
     }
 
     Services.prefs.setCharPref(PREF_SEENPAGEIDS,
                                JSON.stringify([...this.seenPageIDs]));
   },
 
+  get _readerViewTriggerRegEx() {
+    delete this._readerViewTriggerRegEx;
+    let readerViewUITourTrigger = Services.prefs.getCharPref(PREF_READERVIEW_TRIGGER);
+    return this._readerViewTriggerRegEx = new RegExp(readerViewUITourTrigger, "i");
+  },
+
+  onLocationChange: function(aLocation) {
+    // The ReadingList/ReaderView tour page is expected to run in Reader View,
+    // which disables JavaScript on the page. To get around that, we
+    // automatically start a pre-defined tour on page load.
+    let originalUrl = ReaderMode.getOriginalUrl(aLocation);
+    if (this._readerViewTriggerRegEx.test(originalUrl)) {
+      this.startSubTour("readinglist");
+    }
+  },
+
   onPageEvent: function(aMessage, aEvent) {
     let browser = aMessage.target;
     let window = browser.ownerDocument.defaultView;
 
     // Does the window have tabs? We need to make sure since windowless browsers do
     // not have tabs.
     if (!window.gBrowser) {
       // When using windowless browsers we don't have a valid |window|. If that's the case,
@@ -672,16 +692,23 @@ this.UITour = {
         break;
       }
 
       case "ping": {
         if (typeof data.callbackID == "string")
           this.sendPageCallback(messageManager, data.callbackID);
         break;
       }
+
+      case "toggleReaderMode": {
+        let targetPromise = this.getTarget(window, "readerMode-urlBar");
+        targetPromise.then(target => {
+          ReaderParent.toggleReaderMode({target: target.node});
+        });
+      }
     }
 
     if (!this.tourBrowsersByWindow.has(window)) {
       this.tourBrowsersByWindow.set(window, new Set());
     }
     this.tourBrowsersByWindow.get(window).add(browser);
 
     Services.obs.addObserver(this, "message-manager-disconnect", false);
@@ -1707,16 +1734,30 @@ this.UITour = {
     }.bind(this)).catch(err => {
       log.error(err);
       this.sendPageCallback(aMessageManager, aCallbackID, {
         targets: [],
       });
     });
   },
 
+  startSubTour: function (aFeature) {
+    if (aFeature != "string") {
+      log.error("startSubTour: No feature option specified");
+      return;
+    }
+
+    if (aFeature == "readinglist") {
+      ReaderParent.showReaderModeInfoPanel(browser);
+    } else {
+      log.error("startSubTour: Unknown feature option specified");
+      return;
+    }
+  },
+
   addNavBarWidget: function (aTarget, aMessageManager, aCallbackID) {
     if (aTarget.node) {
       log.error("addNavBarWidget: can't add a widget already present:", aTarget);
       return;
     }
     if (!aTarget.allowAdd) {
       log.error("addNavBarWidget: not allowed to add this widget:", aTarget);
       return;
--- a/browser/components/uitour/test/browser.ini
+++ b/browser/components/uitour/test/browser.ini
@@ -4,34 +4,34 @@ support-files =
   image.png
   uitour.html
   ../UITour-lib.js
 
 [browser_no_tabs.js]
 [browser_UITour.js]
 skip-if = os == "linux" || e10s # Intermittent failures, bug 951965
 [browser_UITour2.js]
-skip-if = e10s # Bug 941428 - UITour.jsm not e10s friendly
+skip-if = e10s # Bug 1073247 - UITour.jsm not e10s friendly
 # [browser_UITour3.js] Bug 1113038
-# skip-if = os == "linux" || e10s # Linux: Bug 986760, Bug 989101; e10s: Bug 941428 - UITour.jsm not e10s friendly
+# skip-if = os == "linux" || e10s # Linux: Bug 986760, Bug 989101; e10s: Bug 1073247 - UITour.jsm not e10s friendly
 [browser_UITour_availableTargets.js]
-skip-if = e10s # Bug 941428 - UITour.jsm not e10s friendly
+skip-if = e10s # Bug 1073247 - UITour.jsm not e10s friendly
 [browser_UITour_detach_tab.js]
-skip-if = e10s # Bug 941428 - UITour.jsm not e10s friendly
+skip-if = e10s # Bug 1073247 - UITour.jsm not e10s friendly
 [browser_UITour_annotation_size_attributes.js]
-skip-if = e10s # Bug 941428 - UITour.jsm not e10s friendly.
+skip-if = e10s # Bug 1073247 - UITour.jsm not e10s friendly.
 [browser_UITour_heartbeat.js]
-skip-if = e10s # Bug 941428 - UITour.jsm not e10s friendly.
+skip-if = e10s # Bug 1073247 - UITour.jsm not e10s friendly.
 [browser_UITour_loop.js]
-skip-if = os == "linux" || e10s # Bug 941428 - UITour.jsm not e10s friendly.
+skip-if = os == "linux" || e10s # Bug 1073247 - UITour.jsm not e10s friendly.
 [browser_UITour_modalDialog.js]
 run-if = os == "mac" # modal dialog disabling only working on OS X
-skip-if = e10s # Bug 941428 - UITour.jsm not e10s friendly
+skip-if = e10s # Bug 1073247 - UITour.jsm not e10s friendly
 [browser_UITour_observe.js]
-skip-if = e10s # Bug 941428 - UITour.jsm not e10s friendly.
+skip-if = e10s # Bug 1073247 - UITour.jsm not e10s friendly.
 [browser_UITour_panel_close_annotation.js]
 skip-if = true # Disabled due to frequent failures, bugs 1026310 and 1032137
 [browser_UITour_registerPageID.js]
-skip-if = e10s # Bug 941428 - UITour.jsm not e10s friendly
+skip-if = e10s # Bug 1073247 - UITour.jsm not e10s friendly
 [browser_UITour_sync.js]
-skip-if = e10s # Bug 941428 - UITour.jsm not e10s friendly
+skip-if = e10s # Bug 1073247 - UITour.jsm not e10s friendly
 [browser_UITour_resetProfile.js]
-skip-if = e10s # Bug 941428 - UITour.jsm not e10s friendly
+skip-if = e10s # Bug 1073247 - UITour.jsm not e10s friendly
--- a/browser/components/uitour/test/browser_UITour_availableTargets.js
+++ b/browser/components/uitour/test/browser_UITour_availableTargets.js
@@ -34,16 +34,17 @@ let tests = [
         "bookmarks",
         "customize",
         "help",
         "home",
         "loop",
         "devtools",
         "privateWindow",
         "quit",
+        "readerMode-urlBar",
         "search",
         "searchIcon",
         "urlbar",
         ...searchEngineTargets(),
         ...(hasWebIDE ? ["webide"] : [])
       ]);
 
       ok(UITour.availableTargetsCache.has(window),
@@ -64,16 +65,17 @@ let tests = [
         "backForward",
         "customize",
         "help",
         "loop",
         "devtools",
         "home",
         "privateWindow",
         "quit",
+        "readerMode-urlBar",
         "search",
         "searchIcon",
         "urlbar",
         ...searchEngineTargets(),
         ...(hasWebIDE ? ["webide"] : [])
       ]);
 
       ok(UITour.availableTargetsCache.has(window),
@@ -99,16 +101,17 @@ let tests = [
         "bookmarks",
         "customize",
         "help",
         "home",
         "loop",
         "devtools",
         "privateWindow",
         "quit",
+        "readerMode-urlBar",
         "urlbar",
         ...(hasWebIDE ? ["webide"] : [])
       ]);
 
       CustomizableUI.reset();
       done();
     });
   },
new file mode 100644
--- /dev/null
+++ b/browser/components/uitour/test/browser_UITour_toggleReaderMode.js
@@ -0,0 +1,20 @@
+"use strict";
+
+let gTestTab;
+let gContentAPI;
+let gContentWindow;
+
+Components.utils.import("resource:///modules/UITour.jsm");
+
+function test() {
+  UITourTest();
+}
+
+let tests = [
+  taskify(function*() {
+    ok(!gBrowser.selectedBrowser.currentURI.spec.startsWith("about:reader"), "Should not be in reader mode at start of test.");
+    gContentAPI.toggleReaderMode();
+    yield waitForConditionPromise(() => gBrowser.selectedBrowser.currentURI.spec.startsWith("about:reader"));
+    ok(gBrowser.selectedBrowser.currentURI.spec.startsWith("about:reader"), "Should be in reader mode now.");
+  })
+];
--- a/browser/modules/ReaderParent.jsm
+++ b/browser/modules/ReaderParent.jsm
@@ -11,16 +11,17 @@ this.EXPORTED_SYMBOLS = [ "ReaderParent"
 
 Cu.import("resource://gre/modules/XPCOMUtils.jsm");
 Cu.import("resource://gre/modules/Services.jsm");
 Cu.import("resource://gre/modules/Task.jsm");
 
 XPCOMUtils.defineLazyModuleGetter(this, "PlacesUtils","resource://gre/modules/PlacesUtils.jsm");
 XPCOMUtils.defineLazyModuleGetter(this, "ReaderMode", "resource://gre/modules/ReaderMode.jsm");
 XPCOMUtils.defineLazyModuleGetter(this, "ReadingList", "resource:///modules/readinglist/ReadingList.jsm");
+XPCOMUtils.defineLazyModuleGetter(this, "UITour", "resource:///modules/UITour.jsm");
 
 const gStringBundle = Services.strings.createBundle("chrome://global/locale/aboutReader.properties");
 
 let ReaderParent = {
 
   MESSAGES: [
     "Reader:AddToList",
     "Reader:ArticleGet",
@@ -177,16 +178,33 @@ let ReaderParent = {
         win.openUILinkIn(originalURL, "current", {"allowPinnedTabHostChange": true});
       }
     } else {
       browser.messageManager.sendAsyncMessage("Reader:ParseDocument", { url: url });
     }
   },
 
   /**
+   * Shows an info panel from the UITour for Reader Mode.
+   *
+   * @param browser The <browser> that the tour should be started for.
+   */
+  showReaderModeInfoPanel(browser) {
+    let win = browser.ownerDocument.defaultView;
+    let targetPromise = UITour.getTarget(win, "readerMode-urlBar");
+    targetPromise.then(target => {
+      let browserBundle = Services.strings.createBundle("chrome://browser/locale/browser.properties");
+      UITour.showInfo(win, browser.messageManager, target,
+                      browserBundle.GetStringFromName("readerView.promo.firstDetectedArticle.title"),
+                      browserBundle.GetStringFromName("readerView.promo.firstDetectedArticle.body"),
+                      "chrome://browser/skin/reader-tour.png");
+    });
+  },
+
+  /**
    * Gets an article for a given URL. This method will download and parse a document.
    *
    * @param url The article URL.
    * @param browser The browser where the article is currently loaded.
    * @return {Promise}
    * @resolves JS object representing the article, or null if no article is found.
    */
   _getArticle: Task.async(function* (url, browser) {
--- a/browser/themes/linux/jar.mn
+++ b/browser/themes/linux/jar.mn
@@ -86,16 +86,17 @@ browser.jar:
   skin/classic/browser/Toolbar-inverted.png
   skin/classic/browser/Toolbar-small.png
   skin/classic/browser/undoCloseTab.png                        (../shared/undoCloseTab.png)
   skin/classic/browser/update-badge.svg                        (../shared/update-badge.svg)
   skin/classic/browser/urlbar-arrow.png
   skin/classic/browser/session-restore.svg                  (../shared/incontent-icons/session-restore.svg)
   skin/classic/browser/tab-crashed.svg                      (../shared/incontent-icons/tab-crashed.svg)
   skin/classic/browser/welcome-back.svg                     (../shared/incontent-icons/welcome-back.svg)
+  skin/classic/browser/reader-tour.png                      (../shared/reader/reader-tour.png)
   skin/classic/browser/readerMode.svg                       (../shared/reader/readerMode.svg)
   skin/classic/browser/readinglist/icons.svg          (../shared/readinglist/icons.svg)
   skin/classic/browser/readinglist/readinglist-icon.svg (../shared/readinglist/readinglist-icon.svg)
 * skin/classic/browser/readinglist/sidebar.css        (readinglist/sidebar.css)
   skin/classic/browser/webRTC-shareDevice-16.png
   skin/classic/browser/webRTC-shareDevice-64.png
   skin/classic/browser/webRTC-sharingDevice-16.png    (../shared/webrtc/webRTC-sharingDevice-16.png)
   skin/classic/browser/webRTC-shareMicrophone-16.png
--- a/browser/themes/osx/jar.mn
+++ b/browser/themes/osx/jar.mn
@@ -136,16 +136,17 @@ browser.jar:
   skin/classic/browser/urlbar-history-dropmarker@2x.png
   skin/classic/browser/urlbar-arrow.png
   skin/classic/browser/urlbar-arrow@2x.png
   skin/classic/browser/urlbar-popup-blocked.png
   skin/classic/browser/urlbar-popup-blocked@2x.png
   skin/classic/browser/session-restore.svg            (../shared/incontent-icons/session-restore.svg)
   skin/classic/browser/tab-crashed.svg                (../shared/incontent-icons/tab-crashed.svg)
   skin/classic/browser/welcome-back.svg               (../shared/incontent-icons/welcome-back.svg)
+  skin/classic/browser/reader-tour.png                (../shared/reader/reader-tour.png)
   skin/classic/browser/readerMode.svg                 (../shared/reader/readerMode.svg)
   skin/classic/browser/readinglist/icons.svg          (../shared/readinglist/icons.svg)
   skin/classic/browser/readinglist/readinglist-icon.svg (../shared/readinglist/readinglist-icon.svg)
 * skin/classic/browser/readinglist/sidebar.css        (readinglist/sidebar.css)
   skin/classic/browser/webRTC-shareDevice-16.png
   skin/classic/browser/webRTC-shareDevice-16@2x.png
   skin/classic/browser/webRTC-shareDevice-64.png
   skin/classic/browser/webRTC-shareDevice-64@2x.png
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..8e557e03821219211c19f65a90ca03d2f0b3b03f
GIT binary patch
literal 12172
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
O0000<MNUMnLSTaO$<s3c
--- a/browser/themes/windows/jar.mn
+++ b/browser/themes/windows/jar.mn
@@ -105,16 +105,17 @@ browser.jar:
         skin/classic/browser/undoCloseTab@2x.png                     (../shared/undoCloseTab@2x.png)
         skin/classic/browser/update-badge.svg                        (../shared/update-badge.svg)
         skin/classic/browser/urlbar-arrow.png
         skin/classic/browser/urlbar-popup-blocked.png
         skin/classic/browser/urlbar-history-dropmarker.png
         skin/classic/browser/session-restore.svg                     (../shared/incontent-icons/session-restore.svg)
         skin/classic/browser/tab-crashed.svg                         (../shared/incontent-icons/tab-crashed.svg)
         skin/classic/browser/welcome-back.svg                        (../shared/incontent-icons/welcome-back.svg)
+        skin/classic/browser/reader-tour.png                         (../shared/reader/reader-tour.png)
         skin/classic/browser/readerMode.svg                          (../shared/reader/readerMode.svg)
         skin/classic/browser/readinglist/icons.svg                   (../shared/readinglist/icons.svg)
         skin/classic/browser/readinglist/readinglist-icon.svg        (../shared/readinglist/readinglist-icon.svg)
 *       skin/classic/browser/readinglist/sidebar.css                 (readinglist/sidebar.css)
         skin/classic/browser/notification-pluginNormal.png           (../shared/plugins/notification-pluginNormal.png)
         skin/classic/browser/notification-pluginAlert.png            (../shared/plugins/notification-pluginAlert.png)
         skin/classic/browser/notification-pluginBlocked.png          (../shared/plugins/notification-pluginBlocked.png)
         skin/classic/browser/webRTC-shareDevice-16.png