From f5c8a1596de89f2f3010186b03cc2378d23254ae Mon Sep 17 00:00:00 2001 From: "finnur@chromium.org" Date: Tue, 29 Sep 2009 23:12:35 +0000 Subject: The RSS extension now renders the RSS HTML preview inside an IFRAME. BUG=None TEST=See browser tests. Review URL: http://codereview.chromium.org/242055 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@27562 0039d316-1c4b-4281-b951-d872f2087c98 --- .../extensions/extension_browsertests_misc.cc | 28 +++- .../samples/subscribe_page_action/style.css | 26 ++++ .../samples/subscribe_page_action/subscribe.html | 152 ++++++++++----------- chrome/test/data/feeds/feed3.xml | 17 +++ chrome/test/data/feeds/feed_script.xml | 10 ++ 5 files changed, 148 insertions(+), 85 deletions(-) create mode 100644 chrome/test/data/extensions/samples/subscribe_page_action/style.css create mode 100644 chrome/test/data/feeds/feed3.xml create mode 100644 chrome/test/data/feeds/feed_script.xml (limited to 'chrome') diff --git a/chrome/browser/extensions/extension_browsertests_misc.cc b/chrome/browser/extensions/extension_browsertests_misc.cc index 153d0a1..5d4ecdc 100644 --- a/chrome/browser/extensions/extension_browsertests_misc.cc +++ b/chrome/browser/extensions/extension_browsertests_misc.cc @@ -295,16 +295,20 @@ void GetParsedFeedData(Browser* browser, std::string* feed_title, std::string* item_title, std::string* item_desc, std::string* error) { ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractString( - browser->GetSelectedTabContents()->render_view_host(), L"", + browser->GetSelectedTabContents()->render_view_host(), + L"", // Title is on the main page, all the rest is in the IFRAME. jscript_feed_title, feed_title)); ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractString( - browser->GetSelectedTabContents()->render_view_host(), L"", + browser->GetSelectedTabContents()->render_view_host(), + L"//html/body/div/iframe[1]", jscript_anchor, item_title)); ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractString( - browser->GetSelectedTabContents()->render_view_host(), L"", + browser->GetSelectedTabContents()->render_view_host(), + L"//html/body/div/iframe[1]", jscript_desc, item_desc)); ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractString( - browser->GetSelectedTabContents()->render_view_host(), L"", + browser->GetSelectedTabContents()->render_view_host(), + L"//html/body/div/iframe[1]", jscript_error, error)); } @@ -329,6 +333,13 @@ IN_PROC_BROWSER_TEST_F(ExtensionBrowserTest, ParseFeed) { EXPECT_STREQ("This is a summary.", item_desc.c_str()); EXPECT_STREQ("No error", error.c_str()); + ui_test_utils::NavigateToURL(browser(), GetFeedUrl("feed3.xml")); + GetParsedFeedData(browser(), &feed_title, &item_title, &item_desc, &error); + EXPECT_STREQ("Feed for 'Google Code buglist rss feed'", feed_title.c_str()); + EXPECT_STREQ("My dear title", item_title.c_str()); + EXPECT_STREQ("My dear content", item_desc.c_str()); + EXPECT_STREQ("No error", error.c_str()); + // Try a feed that doesn't exist. ui_test_utils::NavigateToURL(browser(), GetFeedUrl("feed_nonexistant.xml")); GetParsedFeedData(browser(), &feed_title, &item_title, &item_desc, &error); @@ -352,6 +363,15 @@ IN_PROC_BROWSER_TEST_F(ExtensionBrowserTest, ParseFeed) { EXPECT_STREQ("element 'anchor_0' not found", item_title.c_str()); EXPECT_STREQ("element 'desc_0' not found", item_desc.c_str()); EXPECT_STREQ("Not a valid feed", error.c_str()); + + // Try a feed with a link with an onclick handler (before r27440 this would + // trigger a NOTREACHED). + ui_test_utils::NavigateToURL(browser(), GetFeedUrl("feed_script.xml")); + GetParsedFeedData(browser(), &feed_title, &item_title, &item_desc, &error); + EXPECT_STREQ("Feed for 'MyFeedTitle'", feed_title.c_str()); + EXPECT_STREQ("Title 1", item_title.c_str()); + EXPECT_STREQ("Desc VIDEO", item_desc.c_str()); + EXPECT_STREQ("No error", error.c_str()); } #if defined(OS_WIN) // TODO(port) - enable. diff --git a/chrome/test/data/extensions/samples/subscribe_page_action/style.css b/chrome/test/data/extensions/samples/subscribe_page_action/style.css new file mode 100644 index 0000000..036a334 --- /dev/null +++ b/chrome/test/data/extensions/samples/subscribe_page_action/style.css @@ -0,0 +1,26 @@ +body { + font-family: arial, sans-serif; + font-size: 11px; +} +a { + color: #2244D2; + font-weight:bold; + text-decoration: none; +} +a:hover { + font-weight:bold; + text-decoration: underline; +} +.splitter { + padding: 2px 8px 2px 5px; + border-top: solid 1px #9CC2EF; + background: #EBEFF9; + font-size: 13px; + font-weight:bold; +} +.item_title { + font-size: 12px; +} +.item_desc { + font-size: 12px; +} diff --git a/chrome/test/data/extensions/samples/subscribe_page_action/subscribe.html b/chrome/test/data/extensions/samples/subscribe_page_action/subscribe.html index 7a40fad..195bb75 100644 --- a/chrome/test/data/extensions/samples/subscribe_page_action/subscribe.html +++ b/chrome/test/data/extensions/samples/subscribe_page_action/subscribe.html @@ -9,13 +9,14 @@ // The feed URL is the first component and always present. var feedUrl = decodeURIComponent(queryString[0]); - + // We allow synchronous requests for testing. This component is only present // if true. var synchronousRequest = queryString[1] == "synchronous"; - + // The XMLHttpRequest object that tries to load and parse the feed. var req; + var reqStylesheet; // What to show when we cannot parse the feed name. var unknownName = "Unknown feed name"; @@ -26,8 +27,8 @@ // The maximum number of characters to show in the feed item title. var maxTitleCount = 64; - // The maximum number of characters to show for the feed item description. - var maxDescCount = 1024; + // The style sheet we use for both the subscribe page and the IFRAME. + var style_sheet = ""; // Populated later using a XMLHttpRequest. // Navigates to the reader of the user's choice (for subscribing to the feed). function navigate() { @@ -36,6 +37,19 @@ document.location = url; } + function loadStylesheet() { + reqStylesheet = new XMLHttpRequest(); + reqStylesheet.onload = handleCssLoaded; + reqStylesheet.onerror = loadFeed; // I ain't got no style, lets do without. + reqStylesheet.open("GET", "style.css", true); + reqStylesheet.send(null); + } + + function handleCssLoaded() { + style_sheet = reqStylesheet.responseText; + loadFeed(); + } + // Parses the feed specified. We will either end up in handleResponse or // handleError from here. function loadFeed() { @@ -62,29 +76,27 @@ function handleFeedParsingFailed(error) { setFeedTitle(unknownName); - // First part of the error message. - var spanErrorPrefix = document.createElement('span'); - spanErrorPrefix.setAttribute('class', 'item_desc'); - spanErrorPrefix.appendChild( - document.createTextNode("Unable to show feed preview (")); - - // The actual error. - var spanError = document.createElement('span'); - spanError.id = 'error'; - spanError.setAttribute('class', 'item_desc'); - spanError.appendChild(document.createTextNode(error)); - - // Closing braces, etc. - var spanErrorSuffix = document.createElement('span'); - spanErrorSuffix.setAttribute('class', 'item_desc'); - spanErrorSuffix.appendChild( - document.createTextNode(").")); - - // Add the error message. + // The tests always expect an IFRAME, so add an one showing the error. + var html = "" + error + + ""; + + embedAsIframe(html); + } + + function embedAsIframe(html) { var itemsTag = document.getElementById('items'); - itemsTag.appendChild(spanErrorPrefix); - itemsTag.appendChild(spanError); - itemsTag.appendChild(spanErrorSuffix); + html = html.replace(/"/g, "%22"); + + iframe = document.createElement('iframe'); + iframe.src = "data:text/html;charset=utf-8," + html; + iframe.id = "rss"; + iframe.height = "100%"; + iframe.width = "100%"; + iframe.scrolling = "auto"; + iframe.frameBorder = "0"; + iframe.marginWidth = "0"; + iframe.noResize = "noresize"; + itemsTag.appendChild(iframe); } // Handles parsing the feed data we got back from XMLHttpRequest. @@ -108,6 +120,21 @@ else setFeedTitle(unknownName); + // Obtain the base url so that we can show images using relative path. + var base_url = ""; + var slash = feedUrl.lastIndexOf("/"); + if (slash > -1) + base_url = feedUrl.substring(0, slash + 1); + else + base_url = feedUrl; + base_url = ""; + + // Start building the part we render inside an IFRAME. We use a table to + // ensure that items are separated vertically from each other. + var items_html = "" + base_url + + "" + "" + + ""; + // Now parse the rest. Some use for each feed item, others use // . var entries = doc.getElementsByTagName('entry'); @@ -132,16 +159,14 @@ var itemDesc = item.getElementsByTagName('description')[0]; if (!itemDesc) itemDesc = item.getElementsByTagName('summary')[0]; + if (!itemDesc) + itemDesc = item.getElementsByTagName('content')[0]; if (itemDesc) itemDesc = itemDesc.textContent; else itemDesc = ""; - // Ensure max length for description. - if (itemDesc.length > maxDescCount) - itemDesc = itemDesc.substring(0, maxDescCount) + "..."; - // Grab the link URL. var itemLink = item.getElementsByTagName('link'); var link = itemLink[0].childNodes[0]; @@ -150,62 +175,27 @@ else link = itemLink[0].getAttribute('href'); - // Create an anchor node for showing the title. - var anchorTitle = document.createElement('a'); - anchorTitle.id = 'anchor_' + String(i); - anchorTitle.setAttribute('class', 'item_title'); - anchorTitle.setAttribute('href', link); - anchorTitle.setAttribute('target', '_blank'); - anchorTitle.appendChild(document.createTextNode(itemTitle)); - - // Create a description node. - var spanDesc = document.createElement('span'); - spanDesc.id = 'desc_' + String(i); - spanDesc.setAttribute('class', 'item_desc'); - spanDesc.appendChild(document.createTextNode(itemDesc)); - - // Add this to the document. - itemsTag.appendChild(anchorTitle); - itemsTag.appendChild(document.createElement('br')); - itemsTag.appendChild(spanDesc); - itemsTag.appendChild(document.createElement('br')); - itemsTag.appendChild(document.createElement('br')); + items_html = items_html + + ""; } + items_html = items_html + "
" + + "" + + itemTitle + "
"; + + items_html = items_html + "" + + itemDesc + "

" + + "
"; + + // Add an IFRAME with the html contents. + embedAsIframe(items_html); } - - + - +
diff --git a/chrome/test/data/feeds/feed3.xml b/chrome/test/data/feeds/feed3.xml new file mode 100644 index 0000000..f8f5227 --- /dev/null +++ b/chrome/test/data/feeds/feed3.xml @@ -0,0 +1,17 @@ + + + 2009-09-29T17:51:01Z + http://code.google.com/feeds/p/chromium/issueupdates/basic + Google Code buglist rss feed + + + 2009-09-29T17:51:01Z + http://code.google.com/feeds/p/chromium/issueupdates/basic/22699/9 + + My dear title + + figarofigarofigaro@chrooooooooomium.org + + My dear content + + \ No newline at end of file diff --git a/chrome/test/data/feeds/feed_script.xml b/chrome/test/data/feeds/feed_script.xml new file mode 100644 index 0000000..da59879 --- /dev/null +++ b/chrome/test/data/feeds/feed_script.xml @@ -0,0 +1,10 @@ + + + MyFeedTitle + + Title 1 + http://www.google.com + Desc VIDEO + + + \ No newline at end of file -- cgit v1.1