Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(380)

Unified Diff: webkit/glue/webframe_impl.cc

Issue 46055: RSS feed support (part 1), 2nd attempt (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 11 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « webkit/glue/webframe_impl.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: webkit/glue/webframe_impl.cc
===================================================================
--- webkit/glue/webframe_impl.cc (revision 11648)
+++ webkit/glue/webframe_impl.cc (working copy)
@@ -135,6 +135,7 @@
#include "webkit/glue/alt_error_page_resource_fetcher.h"
#include "webkit/glue/dom_operations.h"
#include "webkit/glue/dom_operations_private.h"
+#include "webkit/glue/feed.h"
#include "webkit/glue/glue_serialize.h"
#include "webkit/glue/glue_util.h"
#include "webkit/glue/webdatasource_impl.h"
@@ -485,6 +486,68 @@
return GURL();
}
+scoped_refptr<FeedList> WebFrameImpl::GetFeedList() const {
+ scoped_refptr<FeedList> feedlist = new FeedList();
+
+ WebCore::FrameLoader* frame_loader = frame_->loader();
+ if (frame_loader->state() != WebCore::FrameStateComplete ||
+ !frame_->document() ||
+ !frame_->document()->head() ||
+ frame_->tree()->parent())
+ return feedlist;
+
+ // We only consider HTML documents with <head> tags.
+ // (Interestingly, isHTMLDocument() returns false for some pages --
+ // perhaps an XHTML thing? It doesn't really matter because head() is
+ // a method on Documents anyway.)
+ WebCore::HTMLHeadElement* head = frame_->document()->head();
+ if (!head)
+ return feedlist;
+
+ // Iterate through all children of the <head>, looking for feed links.
+ for (WebCore::Node* node = head->firstChild();
+ node; node = node->nextSibling()) {
+ // Skip over all nodes except <link ...>.
+ if (!node->isHTMLElement())
+ continue;
+ if (!static_cast<WebCore::Element*>(node)->hasLocalName("link"))
+ continue;
+
+ const WebCore::HTMLLinkElement* link =
+ static_cast<WebCore::HTMLLinkElement*>(node);
+
+ // Look at the 'rel' tag and see if we have a feed.
+ std::wstring rel = webkit_glue::StringToStdWString(link->rel());
+ bool is_feed = false;
+ if (LowerCaseEqualsASCII(rel, "feed") ||
+ LowerCaseEqualsASCII(rel, "feed alternate")) {
+ // rel="feed" or rel="alternate feed" always means this is a feed.
+ is_feed = true;
+ } else if (LowerCaseEqualsASCII(rel, "alternate")) {
+ // Otherwise, rel="alternate" may mean a feed if it has a certain mime
+ // type.
+ std::wstring link_type = webkit_glue::StringToStdWString(link->type());
+ TrimWhitespace(link_type, TRIM_ALL, &link_type);
+ if (LowerCaseEqualsASCII(link_type, "application/atom+xml") ||
+ LowerCaseEqualsASCII(link_type, "application/rss+xml")) {
+ is_feed = true;
+ }
+ }
+
+ if (is_feed) {
+ FeedItem feedItem;
+ feedItem.title = webkit_glue::StringToStdWString(link->title());
+ TrimWhitespace(feedItem.title, TRIM_ALL, &feedItem.title);
+ feedItem.type = webkit_glue::StringToStdWString(link->type());
+ TrimWhitespace(feedItem.type, TRIM_ALL, &feedItem.type);
+ feedItem.url = webkit_glue::KURLToGURL(link->href());
+ feedlist->Add(feedItem);
+ }
+ }
+
+ return feedlist;
+}
+
bool WebFrameImpl::GetPreviousHistoryState(std::string* history_state) const {
// We use the previous item here because documentState (filled-out forms)
// only get saved to history when it becomes the previous item. The caller
« no previous file with comments | « webkit/glue/webframe_impl.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698