341407 - reload web page after user subscribes to a feed when an auto-handler is set so that the browser's cached feed list, which is cleared on startDocumentLoad, is regenerated so that subsequent subscription attempts work. r=darin
git-svn-id: svn://10.0.0.236/trunk@203256 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
@@ -38,13 +38,14 @@
|
||||
|
||||
#include "nsISupports.idl"
|
||||
interface nsIURI;
|
||||
interface nsIRequest;
|
||||
interface nsIFeedResult;
|
||||
|
||||
/**
|
||||
* nsIFeedResultService provides a globally-accessible object for retreiving
|
||||
* the results of feed processing.
|
||||
*/
|
||||
[scriptable, uuid(76d751fa-ad21-4a21-bc0b-405abbaf3fa1)]
|
||||
[scriptable, uuid(96dadf57-6a1d-44d3-83fa-6af22f6cae31)]
|
||||
interface nsIFeedResultService : nsISupports
|
||||
{
|
||||
/**
|
||||
@@ -56,10 +57,12 @@ interface nsIFeedResultService : nsISupports
|
||||
/**
|
||||
* Adds a URI to the user's specified external feed handler, or live
|
||||
* bookmarks.
|
||||
* @param request
|
||||
* The request for the feed document
|
||||
* @param uri
|
||||
* The uri of the feed to add.
|
||||
*/
|
||||
void addToClientReader(in AString uri);
|
||||
void addToClientReader(in nsIRequest request, in AString uri);
|
||||
|
||||
/**
|
||||
* Registers a Feed Result object with a globally accessible service
|
||||
|
||||
@@ -135,6 +135,14 @@ FeedConverter.prototype = {
|
||||
*/
|
||||
_forcePreviewPage: false,
|
||||
|
||||
/**
|
||||
* Release our references to various things once we're done using them.
|
||||
*/
|
||||
_releaseHandles: function FC__releaseHandles() {
|
||||
this._listener = null;
|
||||
this._request = null;
|
||||
},
|
||||
|
||||
/**
|
||||
* See nsIFeedResultListener.idl
|
||||
*/
|
||||
@@ -169,46 +177,51 @@ FeedConverter.prototype = {
|
||||
//
|
||||
// If this is just a feed, not some kind of specialized application, then
|
||||
// auto-handlers can be set and we should obey them.
|
||||
var feedService =
|
||||
Cc["@mozilla.org/browser/feeds/result-service;1"].
|
||||
getService(Ci.nsIFeedResultService);
|
||||
if (!this._forcePreviewPage) {
|
||||
var skipPreview = safeGetBoolPref(PREF_SKIP_PREVIEW_PAGE, false);
|
||||
if (skipPreview) {
|
||||
var handler = safeGetCharPref(PREF_SELECTED_HANDLER, "bookmarks");
|
||||
if (handler == "web") {
|
||||
var wccr =
|
||||
Cc["@mozilla.org/embeddor.implemented/web-content-handler-registrar;1"].
|
||||
getService(Ci.nsIWebContentConverterService);
|
||||
var feed = result.doc.QueryInterface(Ci.nsIFeed);
|
||||
if (feed.type == Ci.nsIFeed.TYPE_FEED &&
|
||||
wccr.getAutoHandler(TYPE_MAYBE_FEED)) {
|
||||
wccr.loadPreferredHandler(this._request);
|
||||
try {
|
||||
var feedService =
|
||||
Cc["@mozilla.org/browser/feeds/result-service;1"].
|
||||
getService(Ci.nsIFeedResultService);
|
||||
if (!this._forcePreviewPage) {
|
||||
var skipPreview = safeGetBoolPref(PREF_SKIP_PREVIEW_PAGE, false);
|
||||
if (skipPreview) {
|
||||
var handler = safeGetCharPref(PREF_SELECTED_HANDLER, "bookmarks");
|
||||
if (handler == "web") {
|
||||
var wccr =
|
||||
Cc["@mozilla.org/embeddor.implemented/web-content-handler-registrar;1"].
|
||||
getService(Ci.nsIWebContentConverterService);
|
||||
var feed = result.doc.QueryInterface(Ci.nsIFeed);
|
||||
if (feed.type == Ci.nsIFeed.TYPE_FEED &&
|
||||
wccr.getAutoHandler(TYPE_MAYBE_FEED)) {
|
||||
wccr.loadPreferredHandler(this._request);
|
||||
return;
|
||||
}
|
||||
}
|
||||
else {
|
||||
feedService.addToClientReader(this._request, result.uri.spec);
|
||||
return;
|
||||
}
|
||||
}
|
||||
else {
|
||||
feedService.addToClientReader(result.uri.spec);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// If there was no automatic handler, or this was a podcast, photostream or
|
||||
// some other kind of application, we must always show the preview page...
|
||||
|
||||
// Store the result in the result service so that the display page can
|
||||
// access it.
|
||||
feedService.addFeedResult(result);
|
||||
|
||||
// If there was no automatic handler, or this was a podcast, photostream or
|
||||
// some other kind of application, we must always show the preview page...
|
||||
|
||||
// Now load the actual XUL document.
|
||||
var ios =
|
||||
Cc["@mozilla.org/network/io-service;1"].
|
||||
getService(Ci.nsIIOService);
|
||||
var chromeURI = ios.newURI(FEEDHANDLER_URI, null, null);
|
||||
var chromeChannel = ios.newChannelFromURI(chromeURI, null);
|
||||
chromeChannel.originalURI = result.uri;
|
||||
chromeChannel.asyncOpen(this._listener, null);
|
||||
// Store the result in the result service so that the display page can
|
||||
// access it.
|
||||
feedService.addFeedResult(result);
|
||||
|
||||
// Now load the actual XUL document.
|
||||
var ios =
|
||||
Cc["@mozilla.org/network/io-service;1"].
|
||||
getService(Ci.nsIIOService);
|
||||
var chromeURI = ios.newURI(FEEDHANDLER_URI, null, null);
|
||||
var chromeChannel = ios.newChannelFromURI(chromeURI, null);
|
||||
chromeChannel.originalURI = result.uri;
|
||||
chromeChannel.asyncOpen(this._listener, null);
|
||||
}
|
||||
finally {
|
||||
this._releaseHandles();
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
@@ -301,7 +314,7 @@ var FeedResultService = {
|
||||
/**
|
||||
* See nsIFeedService.idl
|
||||
*/
|
||||
addToClientReader: function FRS_addToClientReader(spec) {
|
||||
addToClientReader: function FRS_addToClientReader(request, spec) {
|
||||
var prefs =
|
||||
Cc["@mozilla.org/preferences-service;1"].
|
||||
getService(Ci.nsIPrefBranch);
|
||||
@@ -353,6 +366,25 @@ var FeedResultService = {
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
|
||||
// We need to reload the current page to cause the feed list to get
|
||||
// regenerated. If we don't do this, the startDocumentLoad notification
|
||||
// the browser receives for the initiation of the load of the feed
|
||||
// preview page will reset the list of feeds maintained by that browser,
|
||||
// so that subsequent clicks to the subscribe icon (unlikely, but possible)
|
||||
// will do nothing, even if the user wants to choose another option.
|
||||
// See bug #341407
|
||||
request.cancel(Cr.NS_ERROR_FAILURE);
|
||||
var channel = request.QueryInterface(Ci.nsIChannel);
|
||||
try {
|
||||
var webNavigation =
|
||||
channel.notificationCallbacks.getInterface(Ci.nsIWebNavigation);
|
||||
webNavigation.reload(Ci.nsIWebNavigation.LOAD_FLAGS_NONE);
|
||||
}
|
||||
catch (e) {
|
||||
// .notificationCallbacks is not guaranteed to provide a web-navigation.
|
||||
// Just fail silently in this case, since it's not the end of the world.
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user