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:
@@ -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);
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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);
|
||||
});
|
||||
},
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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 |
BIN
browser/themes/shared/reader/reader-tour@2x.png
Normal file
BIN
browser/themes/shared/reader/reader-tour@2x.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 6.3 KiB |
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user