Bug 1260276 - Replace the dead reader page in history when we are being redirected, r=gijs
MozReview-Commit-ID: ChSCHuBKT1l
--- a/browser/modules/ReaderParent.jsm
+++ b/browser/modules/ReaderParent.jsm
@@ -40,17 +40,20 @@ var ReaderParent = {
case "Reader:ArticleGet":
this._getArticle(message.data.url, message.target).then((article) => {
// Make sure the target browser is still alive before trying to send data back.
if (message.target.messageManager) {
message.target.messageManager.sendAsyncMessage("Reader:ArticleData", { article: article });
}
}, e => {
if (e && e.newURL) {
- message.target.loadURI("about:reader?url=" + encodeURIComponent(e.newURL));
+ // Make sure the target browser is still alive before trying to send data back.
+ if (message.target.messageManager) {
+ message.target.messageManager.sendAsyncMessage("Reader:ArticleData", { newURL: e.newURL });
+ }
}
});
break;
case "Reader:FaviconRequest": {
if (message.target.messageManager) {
let faviconUrl = PlacesUtils.promiseFaviconLinkUrl(message.data.url);
faviconUrl.then(function onResolution(favicon) {
--- a/toolkit/components/reader/AboutReader.jsm
+++ b/toolkit/components/reader/AboutReader.jsm
@@ -609,39 +609,50 @@ AboutReader.prototype = {
_loadArticle: Task.async(function* () {
let url = this._getOriginalUrl();
this._showProgressDelayed();
let article;
if (this._articlePromise) {
article = yield this._articlePromise;
} else {
- article = yield this._getArticle(url);
+ try {
+ article = yield this._getArticle(url);
+ } catch (e) {
+ if (e && e.newURL) {
+ let readerURL = "about:reader?url=" + encodeURIComponent(e.newURL);
+ this._win.location.replace(readerURL);
+ return;
+ }
+ }
}
if (this._windowUnloaded) {
return;
}
- if (article) {
- this._showContent(article);
- } else if (this._articlePromise) {
- // If we were promised an article, show an error message if there's a failure.
+ // Replace the loading message with an error message if there's a failure.
+ // Users are supposed to navigate away by themselves (because we cannot
+ // remove ourselves from session history.)
+ if (!article) {
this._showError();
- } else {
- // Otherwise, just load the original URL. We can encounter this case when
- // loading an about:reader URL directly (e.g. opening a reading list item).
- this._win.location.href = url;
+ return;
}
+
+ this._showContent(article);
}),
_getArticle: function(url) {
return new Promise((resolve, reject) => {
let listener = (message) => {
this._mm.removeMessageListener("Reader:ArticleData", listener);
+ if (message.data.newURL) {
+ reject({ newURL: message.data.newURL });
+ return;
+ }
resolve(message.data.article);
};
this._mm.addMessageListener("Reader:ArticleData", listener);
this._mm.sendAsyncMessage("Reader:ArticleGet", { url: url });
});
},
_requestFavicon: function() {