Bug 1134507 - Implement infopanel to promote Reader View when first available. r=Gijs, a=sledru

Based on a patch by Jared Wein (:jaws).
This commit is contained in:
Matthew Noorenberghe
2015-04-30 14:24:00 -04:00
parent 78a833e81d
commit faf188639f
10 changed files with 48 additions and 4 deletions

View File

@@ -1896,5 +1896,6 @@ pref("browser.readinglist.sidebarEverOpened", false);
pref("readinglist.scheduler.enabled", false);
pref("readinglist.server", "https://readinglist.services.mozilla.com/v1");
pref("browser.reader.detectedFirstArticle", false);
// Don't limit how many nodes we care about on desktop:
pref("reader.parse-node-limit", 0);

View File

@@ -32,19 +32,29 @@ add_task(function* test_reader_button() {
TEST_PREFS.forEach(([name, value]) => {
Services.prefs.setBoolPref(name, value);
});
Services.prefs.setBoolPref("browser.reader.detectedFirstArticle", false);
let tab = gBrowser.selectedTab = gBrowser.addTab();
is_element_hidden(readerButton, "Reader mode button is not present on a new tab");
ok(!UITour.isInfoOnTarget(window, "readerMode-urlBar"),
"Info panel shouldn't appear without the reader mode button");
ok(!Services.prefs.getBoolPref("browser.reader.detectedFirstArticle"),
"Shouldn't have detected the first article");
// Point tab to a test page that is reader-able.
let url = TEST_PATH + "readerModeArticle.html";
yield promiseTabLoadEvent(tab, url);
yield promiseWaitForCondition(() => !readerButton.hidden);
is_element_visible(readerButton, "Reader mode button is present on a reader-able page");
ok(UITour.isInfoOnTarget(window, "readerMode-urlBar"),
"Info panel should be anchored at the reader mode button");
ok(Services.prefs.getBoolPref("browser.reader.detectedFirstArticle"),
"Should have detected the first article");
// Switch page into reader mode.
readerButton.click();
yield promiseTabLoadEvent(tab);
ok(!UITour.isInfoOnTarget(window, "readerMode-urlBar"), "Info panel should have closed");
let readerUrl = gBrowser.selectedBrowser.currentURI.spec;
ok(readerUrl.startsWith("about:reader"), "about:reader loaded after clicking reader mode button");

View File

@@ -1460,6 +1460,12 @@ this.UITour = {
showInfoPanel.bind(this, this._correctAnchor(aAnchor.node)));
},
isInfoOnTarget(aChromeWindow, aTargetName) {
let document = aChromeWindow.document;
let tooltip = document.getElementById("UITourTooltip");
return tooltip.getAttribute("targetName") == aTargetName && tooltip.state != "closed";
},
hideInfo: function(aWindow) {
let document = aWindow.document;

View File

@@ -21,6 +21,7 @@ XPCOMUtils.defineLazyModuleGetter(this, "UITour", "resource:///modules/UITour.js
const gStringBundle = Services.strings.createBundle("chrome://global/locale/aboutReader.properties");
let ReaderParent = {
_readerModeInfoPanelOpen: false,
MESSAGES: [
"Reader:AddToList",
@@ -156,6 +157,20 @@ let ReaderParent = {
command.setAttribute("label", enterText);
command.setAttribute("hidden", !browser.isArticle);
}
let currentUriHost = browser.currentURI && browser.currentURI.asciiHost;
if (browser.isArticle &&
!Services.prefs.getBoolPref("browser.reader.detectedFirstArticle") &&
currentUriHost && !currentUriHost.endsWith("mozilla.org")) {
this.showReaderModeInfoPanel(browser);
Services.prefs.setBoolPref("browser.reader.detectedFirstArticle", true);
this._readerModeInfoPanelOpen = true;
} else if (this._readerModeInfoPanelOpen) {
if (UITour.isInfoOnTarget(win, "readerMode-urlBar")) {
UITour.hideInfo(win);
}
this._readerModeInfoPanelOpen = false;
}
},
buttonClick: function(event) {
@@ -192,10 +207,16 @@ let ReaderParent = {
let targetPromise = UITour.getTarget(win, "readerMode-urlBar");
targetPromise.then(target => {
let browserBundle = Services.strings.createBundle("chrome://browser/locale/browser.properties");
let icon = "chrome://browser/skin/";
if (win.devicePixelRatio > 1) {
icon += "reader-tour@2x.png";
} else {
icon += "reader-tour.png";
}
UITour.showInfo(win, browser.messageManager, target,
browserBundle.GetStringFromName("readerView.promo.firstDetectedArticle.title"),
browserBundle.GetStringFromName("readerView.promo.firstDetectedArticle.body"),
"chrome://browser/skin/reader-tour.png");
browserBundle.GetStringFromName("readingList.promo.firstUse.readerView.title"),
browserBundle.GetStringFromName("readingList.promo.firstUse.readerView.body"),
icon);
});
},

View File

@@ -92,6 +92,7 @@ browser.jar:
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/reader-tour@2x.png (../shared/reader/reader-tour@2x.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)

View File

@@ -142,6 +142,7 @@ browser.jar:
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/reader-tour@2x.png (../shared/reader/reader-tour@2x.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)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

View File

@@ -111,6 +111,7 @@ browser.jar:
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/reader-tour@2x.png (../shared/reader/reader-tour@2x.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)
@@ -580,6 +581,8 @@ browser.jar:
skin/classic/aero/browser/session-restore.svg (../shared/incontent-icons/session-restore.svg)
skin/classic/aero/browser/tab-crashed.svg (../shared/incontent-icons/tab-crashed.svg)
skin/classic/aero/browser/welcome-back.svg (../shared/incontent-icons/welcome-back.svg)
skin/classic/aero/browser/reader-tour.png (../shared/reader/reader-tour.png)
skin/classic/aero/browser/reader-tour@2x.png (../shared/reader/reader-tour@2x.png)
skin/classic/aero/browser/readerMode.svg (../shared/reader/readerMode.svg)
skin/classic/aero/browser/readinglist/icons.svg (../shared/readinglist/icons.svg)
skin/classic/aero/browser/readinglist/readinglist-icon.svg (../shared/readinglist/readinglist-icon.svg)

View File

@@ -298,5 +298,6 @@ user_pref("browser.tabs.remote.autostart.1", false);
// Don't forceably kill content processes after a timeout
user_pref("dom.ipc.tabs.shutdownTimeoutSecs", 0);
// Avoid performing Readinglist Intro during tests.
// Avoid performing Reading List and Reader Mode intros during tests.
user_pref("browser.readinglist.introShown", true);
user_pref("browser.reader.detectedFirstArticle", true);