Bug 1184950 - Use goBack to leave the reader view when possible, r=margaret, r=gijs
MozReview-Commit-ID: G9wn4OyUL5q
--- a/browser/base/content/tab-content.js
+++ b/browser/base/content/tab-content.js
@@ -246,25 +246,42 @@ var AboutReaderListener = {
_articlePromise: null,
init: function() {
addEventListener("AboutReaderContentLoaded", this, false, true);
addEventListener("DOMContentLoaded", this, false);
addEventListener("pageshow", this, false);
addEventListener("pagehide", this, false);
- addMessageListener("Reader:ParseDocument", this);
+ addMessageListener("Reader:ToggleReaderMode", this);
addMessageListener("Reader:PushState", this);
},
receiveMessage: function(message) {
switch (message.name) {
- case "Reader:ParseDocument":
- this._articlePromise = ReaderMode.parseDocument(content.document).catch(Cu.reportError);
- content.document.location = "about:reader?url=" + encodeURIComponent(message.data.url);
+ case "Reader:ToggleReaderMode":
+ let url = content.document.location.href;
+ if (!this.isAboutReader) {
+ this._articlePromise = ReaderMode.parseDocument(content.document).catch(Cu.reportError);
+ content.document.location = "about:reader?url=" + encodeURIComponent(url);
+ } else {
+ let originalURL = ReaderMode.getOriginalUrl(url);
+ let webNav = docShell.QueryInterface(Ci.nsIWebNavigation);
+ let sh = webNav.sessionHistory;
+ if (webNav.canGoBack) {
+ let prevEntry = sh.getEntryAtIndex(sh.index - 1, false);
+ let prevURL = prevEntry.URI.spec;
+ if (prevURL && (prevURL == originalURL || !originalURL)) {
+ webNav.goBack();
+ break;
+ }
+ }
+
+ content.document.location = originalURL;
+ }
break;
case "Reader:PushState":
this.updateReaderButton(!!(message.data && message.data.isArticle));
break;
}
},
--- a/browser/base/content/test/general/browser_bug1124271_readerModePinnedTab.js
+++ b/browser/base/content/test/general/browser_bug1124271_readerModePinnedTab.js
@@ -33,15 +33,15 @@ add_task(function* () {
readerButton.click();
yield promiseTabLoadEvent(tab);
// Ensure no new tabs are opened when exiting reader mode in a pinned tab
is(gBrowser.tabs.length, initialTabsCount, "No additional tabs were opened.");
readerButton.click();
- yield promiseTabLoadEvent(tab);
+ yield BrowserTestUtils.waitForContentEvent(tab.linkedBrowser, "pageshow");
// Ensure no new tabs are opened when exiting reader mode in a pinned tab
is(gBrowser.tabs.length, initialTabsCount, "No additional tabs were opened.");
gBrowser.removeCurrentTab();
});
--- a/browser/base/content/test/general/browser_readerMode.js
+++ b/browser/base/content/test/general/browser_readerMode.js
@@ -66,19 +66,21 @@ add_task(function* test_reader_button()
gURLBar.focus();
gURLBar.select();
goDoCommand("cmd_copy");
}, resolve, reject);
});
// Switch page back out of reader mode.
readerButton.click();
- yield promiseTabLoadEvent(tab);
+ yield BrowserTestUtils.waitForContentEvent(tab.linkedBrowser, "pageshow");
is(gBrowser.selectedBrowser.currentURI.spec, url,
- "Original page loaded after clicking active reader mode button");
+ "Back to the original page after clicking active reader mode button");
+ ok(gBrowser.selectedBrowser.canGoForward,
+ "Moved one step back in the session history.");
// Load a new tab that is NOT reader-able.
let newTab = gBrowser.selectedTab = gBrowser.addTab();
yield promiseTabLoadEvent(newTab, "about:robots");
yield promiseWaitForCondition(() => readerButton.hidden);
is_element_hidden(readerButton, "Reader mode button is not present on a non-reader-able page");
// Switch back to the original tab to make sure reader mode button is still visible.
--- a/browser/base/content/test/general/head.js
+++ b/browser/base/content/test/general/head.js
@@ -597,18 +597,16 @@ var FullZoomHelper = {
/**
* Waits for a load (or custom) event to finish in a given tab. If provided
* load an uri into the tab.
*
* @param tab
* The tab to load into.
* @param [optional] url
* The url to load, or the current url.
- * @param [optional] event
- * The load event type to wait for. Defaults to "load".
* @return {Promise} resolved when the event is handled.
* @resolves to the received event
* @rejects if a valid load event is not received within a meaningful interval
*/
function promiseTabLoadEvent(tab, url)
{
let deferred = Promise.defer();
info("Wait tab event: load");
--- a/browser/modules/ReaderParent.jsm
+++ b/browser/modules/ReaderParent.jsm
@@ -128,28 +128,17 @@ var ReaderParent = {
return;
}
this.toggleReaderMode(event);
},
toggleReaderMode: function(event) {
let win = event.target.ownerDocument.defaultView;
let browser = win.gBrowser.selectedBrowser;
- let url = browser.currentURI.spec;
-
- if (url.startsWith("about:reader")) {
- let originalURL = ReaderMode.getOriginalUrl(url);
- if (!originalURL) {
- Cu.reportError("Error finding original URL for about:reader URL: " + url);
- } else {
- win.openUILinkIn(originalURL, "current", {"allowPinnedTabHostChange": true});
- }
- } else {
- browser.messageManager.sendAsyncMessage("Reader:ParseDocument", { url: url });
- }
+ browser.messageManager.sendAsyncMessage("Reader:ToggleReaderMode");
},
/**
* Shows an info panel from the UITour for Reader Mode.
*
* @param browser The <browser> that the tour should be started for.
*/
showReaderModeInfoPanel(browser) {