From 080e6a9cdc0b6318645fd1c791cf48151ca9efd9 Mon Sep 17 00:00:00 2001 From: "beng%bengoodger.com" Date: Fri, 28 Apr 2006 18:05:34 +0000 Subject: [PATCH] 333751- more tweaking of feed handler, client apps and live bookmark support NOT PART OF BUILD --- browser/components/feeds/content/subscribe.js | 18 ++-- .../feeds/public/nsIFeedResultService.idl | 8 ++ browser/components/feeds/src/FeedConverter.js | 87 ++++++++++++++++--- 3 files changed, 92 insertions(+), 21 deletions(-) diff --git a/browser/components/feeds/content/subscribe.js b/browser/components/feeds/content/subscribe.js index 05650037e11..68ac3eae1cd 100644 --- a/browser/components/feeds/content/subscribe.js +++ b/browser/components/feeds/content/subscribe.js @@ -110,6 +110,7 @@ var SubscribeHandler = { this._setContentText("feedTitleText", container.title); this._setContentText("feedSubtitleText", this._getPropertyAsString(container, "description")); + document.title = container.title; // Set up the displayed handler this._initSelectedHandler(); @@ -218,7 +219,6 @@ var SubscribeHandler = { Cc["@mozilla.org/web-content-handler-registrar;1"]. getService(Ci.nsIWebContentConverterRegistrar); var title ="Unknown"; - LOG("WEBURI: " + webURI); var handler = wccr.getWebContentHandlerByURI(TYPE_MAYBE_FEED, webURI); if (handler) @@ -264,11 +264,7 @@ var SubscribeHandler = { Cc["@mozilla.org/preferences-service;1"]. getService(Ci.nsIPrefBranch); var handler = prefs.getCharPref(PREF_SELECTED_HANDLER); - switch (handler) { - case "client": - LOG("Load with client app"); - break; - case "web": + if (handler == "web") { var webURI = prefs.getCharPref(PREF_SELECTED_WEB); var wccr = Cc["@mozilla.org/web-content-handler-registrar;1"]. @@ -276,10 +272,12 @@ var SubscribeHandler = { var handler = wccr.getWebContentHandlerByURI(TYPE_MAYBE_FEED, webURI); window.location.href = handler.getHandlerURI(window.location.href); - break; - case "bookmarks": - LOG("Add Live Bookmark"); - break; + } + else { + var feedService = + Cc["@mozilla.org/browser/feeds/result-service;1"]. + getService(Ci.nsIFeedResultService); + feedService.addToClientReader(window.location.href); } }, }; diff --git a/browser/components/feeds/public/nsIFeedResultService.idl b/browser/components/feeds/public/nsIFeedResultService.idl index 9acd474900a..2603a3f39be 100644 --- a/browser/components/feeds/public/nsIFeedResultService.idl +++ b/browser/components/feeds/public/nsIFeedResultService.idl @@ -53,6 +53,14 @@ interface nsIFeedResultService : nsISupports */ attribute boolean forcePreviewPage; + /** + * Adds a URI to the user's specified external feed handler, or live + * bookmarks. + * @param uri + * The uri of the feed to add. + */ + void addToClientReader(in AString uri); + /** * Registers a Feed Result object with a globally accessible service * so that it can be accessed by a singleton method outside the usual diff --git a/browser/components/feeds/src/FeedConverter.js b/browser/components/feeds/src/FeedConverter.js index a0d85351be9..1853cbb7a82 100644 --- a/browser/components/feeds/src/FeedConverter.js +++ b/browser/components/feeds/src/FeedConverter.js @@ -63,6 +63,11 @@ const TYPE_ANY = "*/*"; const FEEDHANDLER_URI = "chrome://browser/content/feeds/subscribe.xhtml"; +const PREF_SELECTED_APP = "browser.feeds.handlers.application"; +const PREF_SELECTED_WEB = "browser.feeds.handlers.webservice"; +const PREF_SELECTED_HANDLER = "browser.feeds.handler"; +const PREF_SKIP_PREVIEW_PAGE = "browser.feeds.skip_preview_page"; + function FeedConverter() { } FeedConverter.prototype = { @@ -101,6 +106,11 @@ FeedConverter.prototype = { this._listener = listener; }, + /** + * Whether or not the preview page is being forced. + */ + _forcePreviewPage: false, + /** * See nsIFeedResultListener.idl */ @@ -138,19 +148,30 @@ FeedConverter.prototype = { var feedService = Cc["@mozilla.org/browser/feeds/result-service;1"]. getService(Ci.nsIFeedResultService); - if (!feedService.forcePreviewPage) { - var wccr = - Cc["@mozilla.org/web-content-handler-registrar;1"]. - getService(Ci.nsIWebContentConverterRegistrar); - var feed = result.doc.QueryInterface(Ci.nsIFeed); - if (feed.type == Ci.nsIFeed.TYPE_FEED && - wccr.getAutoHandler(TYPE_MAYBE_FEED)) { - wccr.loadPreferredHandler(this._request); - return; + if (!this._forcePreviewPage) { + var prefs = + Cc["@mozilla.org/preferences-service;1"]. + getService(Ci.nsIPrefBranch); + var skipPreview = prefs.getBoolPref(PREF_SKIP_PREVIEW_PAGE); + if (skipPreview) { + var handler = prefs.getCharPref(PREF_SELECTED_HANDLER); + if (handler == "web") { + var wccr = + Cc["@mozilla.org/web-content-handler-registrar;1"]. + getService(Ci.nsIWebContentConverterRegistrar); + 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(result.uri.spec); + return; + } } } - // Reset the forced state bit here. - feedService.forcePreviewPage = false; // 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... @@ -184,6 +205,15 @@ FeedConverter.prototype = { onStartRequest: function FC_onStartRequest(request, context) { var channel = request.QueryInterface(Ci.nsIChannel); this._request = request; + + // Save and reset the forced state bit early, in case there's some kind of + // error. + var feedService = + Cc["@mozilla.org/browser/feeds/result-service;1"]. + getService(Ci.nsIFeedResultService); + this._forcePreviewPage = feedService.forcePreviewPage; + feedService.forcePreviewPage = false; + // Parse feed data as it comes in this._processor = @@ -242,8 +272,43 @@ var FeedResultService = { */ _results: { }, + /** + * See nsIFeedService.idl + */ forcePreviewPage: false, + /** + * See nsIFeedService.idl + */ + addToClientReader: function FRS_addToClientReader(uri) { + var prefs = + Cc["@mozilla.org/preferences-service;1"]. + getService(Ci.nsIPrefBranch); + var handler = prefs.getCharPref(PREF_SELECTED_HANDLER); + switch (handler) { + case "client": + var clientApp = + prefs.getComplexValue(PREF_SELECTED_APP, Ci.nsILocalFile); + var process = + Cc["@mozilla.org/process/util;1"]. + createInstance(Ci.nsIProcess); + process.init(clientApp); + process.run(false, [uri], 1); + break; + case "bookmarks": + var wm = + Cc["@mozilla.org/appshell/window-mediator;1"]. + getService(Ci.nsIWindowMediator); + var topWindow = wm.getMostRecentWindow("navigator:browser"); +#ifdef MOZ_PLACES + topWindow.PlacesCommandHook.addLiveBookmark(uri); +#else + topWindow.FeedHandler.addLiveBookmark(uri); +#endif + break; + } + }, + /** * See nsIFeedService.idl */