blob: 592cec668baa5d886d79db6ab79c02323dec3e14 [file] [log] [blame]
[email protected]fad73672012-06-15 23:26:061// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Sebastien Marchandf1349f52019-01-25 03:16:415#include "base/bind.h"
[email protected]fad73672012-06-15 23:26:066#include "chrome/browser/extensions/extension_browsertest.h"
7#include "chrome/browser/ui/browser.h"
[email protected]617ee962013-01-29 20:49:128#include "chrome/browser/ui/tabs/tab_strip_model.h"
[email protected]fad73672012-06-15 23:26:069#include "chrome/common/url_constants.h"
10#include "chrome/test/base/ui_test_utils.h"
11#include "content/public/browser/web_contents.h"
[email protected]7d478cb2012-07-24 17:19:4212#include "content/public/test/browser_test_utils.h"
[email protected]885c0e92012-11-13 20:27:4213#include "extensions/common/constants.h"
[email protected]e4452d32013-11-15 23:07:4114#include "extensions/common/extension.h"
svaldeza01f7d92015-11-18 17:47:5615#include "net/test/embedded_test_server/embedded_test_server.h"
[email protected]fad73672012-06-15 23:26:0616
17using content::WebContents;
Devlin Cronin836f545d2018-05-09 00:25:0518
19namespace extensions {
[email protected]fad73672012-06-15 23:26:0620
21namespace {
22
[email protected]06bc5d92013-01-02 22:44:1323const char kSubscribePage[] = "/subscribe.html";
svaldeza01f7d92015-11-18 17:47:5624const char kFeedPageMultiRel[] = "/feeds/feed_multi_rel.html";
25const char kValidFeedNoLinks[] = "/feeds/feed_nolinks.xml";
26const char kValidFeed0[] = "/feeds/feed_script.xml";
27const char kValidFeed1[] = "/feeds/feed1.xml";
28const char kValidFeed2[] = "/feeds/feed2.xml";
29const char kValidFeed3[] = "/feeds/feed3.xml";
30const char kValidFeed4[] = "/feeds/feed4.xml";
31const char kValidFeed5[] = "/feeds/feed5.xml";
32const char kValidFeed6[] = "/feeds/feed6.xml";
33const char kInvalidFeed1[] = "/feeds/feed_invalid1.xml";
34const char kInvalidFeed2[] = "/feeds/feed_invalid2.xml";
[email protected]fad73672012-06-15 23:26:0635// We need a triple encoded string to prove that we are not decoding twice in
36// subscribe.js because one layer is also stripped off when subscribe.js passes
37// it to the XMLHttpRequest object.
svaldeza01f7d92015-11-18 17:47:5638const char kFeedTripleEncoded[] = "/feeds/url%25255Fdecoding.html";
[email protected]fad73672012-06-15 23:26:0639
[email protected]06bc5d92013-01-02 22:44:1340static const char kScriptFeedTitle[] =
41 "window.domAutomationController.send("
42 " document.getElementById('title') ? "
43 " document.getElementById('title').textContent : "
44 " \"element 'title' not found\""
45 ");";
46static const char kScriptAnchor[] =
47 "window.domAutomationController.send("
48 " document.getElementById('anchor_0') ? "
49 " document.getElementById('anchor_0').textContent : "
50 " \"element 'anchor_0' not found\""
51 ");";
52static const char kScriptDesc[] =
53 "window.domAutomationController.send("
54 " document.getElementById('desc_0') ? "
55 " document.getElementById('desc_0').textContent : "
56 " \"element 'desc_0' not found\""
57 ");";
58static const char kScriptError[] =
59 "window.domAutomationController.send("
60 " document.getElementById('error') ? "
61 " document.getElementById('error').textContent : "
62 " \"No error\""
63 ");";
[email protected]fad73672012-06-15 23:26:0664
svaldeza01f7d92015-11-18 17:47:5665GURL GetFeedUrl(net::EmbeddedTestServer* server,
66 const std::string& feed_page,
67 bool direct_url,
68 std::string extension_id) {
[email protected]fad73672012-06-15 23:26:0669 GURL feed_url = server->GetURL(feed_page);
70 if (direct_url) {
71 // We navigate directly to the subscribe page for feeds where the feed
72 // sniffing won't work, in other words, as is the case for malformed feeds.
Devlin Cronin836f545d2018-05-09 00:25:0573 return GURL(std::string(kExtensionScheme) + url::kStandardSchemeSeparator +
74 extension_id + std::string(kSubscribePage) + std::string("?") +
75 feed_url.spec() + std::string("&synchronous"));
[email protected]fad73672012-06-15 23:26:0676 } else {
77 // Navigate to the feed content (which will cause the extension to try to
78 // sniff the type and display the subscribe page in another tab.
79 return GURL(feed_url.spec());
80 }
81}
82
[email protected]b27c3622014-03-22 00:26:5583bool ValidatePageElement(content::RenderFrameHost* frame,
[email protected]06bc5d92013-01-02 22:44:1384 const std::string& javascript,
[email protected]fad73672012-06-15 23:26:0685 const std::string& expected_value) {
86 std::string returned_value;
[email protected]fad73672012-06-15 23:26:0687
[email protected]b27c3622014-03-22 00:26:5588 if (!content::ExecuteScriptAndExtractString(frame,
89 javascript,
90 &returned_value))
[email protected]fad73672012-06-15 23:26:0691 return false;
92
93 EXPECT_STREQ(expected_value.c_str(), returned_value.c_str());
94 return expected_value == returned_value;
95}
96
97// Navigates to a feed page and, if |sniff_xml_type| is set, wait for the
98// extension to kick in, detect the feed and redirect to a feed preview page.
99// |sniff_xml_type| is generally set to true if the feed is sniffable and false
100// for invalid feeds.
svaldeza01f7d92015-11-18 17:47:56101void NavigateToFeedAndValidate(net::EmbeddedTestServer* server,
[email protected]fad73672012-06-15 23:26:06102 const std::string& url,
103 Browser* browser,
104 std::string extension_id,
105 bool sniff_xml_type,
106 const std::string& expected_feed_title,
107 const std::string& expected_item_title,
108 const std::string& expected_item_desc,
109 const std::string& expected_error) {
110 if (sniff_xml_type) {
111 // TODO(finnur): Implement this is a non-flaky way.
112 }
113
114 // Navigate to the subscribe page directly.
115 ui_test_utils::NavigateToURL(browser,
116 GetFeedUrl(server, url, true, extension_id));
117
[email protected]617ee962013-01-29 20:49:12118 WebContents* tab = browser->tab_strip_model()->GetActiveWebContents();
[email protected]b27c3622014-03-22 00:26:55119 content::RenderFrameHost* frame = content::FrameMatchingPredicate(
120 tab, base::Bind(&content::FrameIsChildOfMainFrame));
[email protected]007b3f82013-04-09 08:46:45121 ASSERT_TRUE(ValidatePageElement(
[email protected]b27c3622014-03-22 00:26:55122 tab->GetMainFrame(), kScriptFeedTitle, expected_feed_title));
123 ASSERT_TRUE(ValidatePageElement(frame, kScriptAnchor, expected_item_title));
124 ASSERT_TRUE(ValidatePageElement(frame, kScriptDesc, expected_item_desc));
125 ASSERT_TRUE(ValidatePageElement(frame, kScriptError, expected_error));
[email protected]fad73672012-06-15 23:26:06126}
127
128} // namespace
129
130// Makes sure that the RSS detects RSS feed links, even when rel tag contains
131// more than just "alternate".
132IN_PROC_BROWSER_TEST_F(ExtensionBrowserTest, RSSMultiRelLink) {
svaldeza01f7d92015-11-18 17:47:56133 ASSERT_TRUE(embedded_test_server()->Start());
[email protected]fad73672012-06-15 23:26:06134
135 ASSERT_TRUE(LoadExtension(
136 test_data_dir_.AppendASCII("subscribe_page_action")));
137
138 ASSERT_TRUE(WaitForPageActionVisibilityChangeTo(0));
139
140 // Navigate to the feed page.
svaldeza01f7d92015-11-18 17:47:56141 GURL feed_url = embedded_test_server()->GetURL(kFeedPageMultiRel);
[email protected]fad73672012-06-15 23:26:06142 ui_test_utils::NavigateToURL(browser(), feed_url);
143 // We should now have one page action ready to go in the LocationBar.
144 ASSERT_TRUE(WaitForPageActionVisibilityChangeTo(1));
145}
146
[email protected]b1258c82014-02-03 20:32:11147// This test is flaky on all platforms; see http://crbug.com/340354
148IN_PROC_BROWSER_TEST_F(ExtensionBrowserTest, DISABLED_RSSParseFeedValidFeed1) {
svaldeza01f7d92015-11-18 17:47:56149 ASSERT_TRUE(embedded_test_server()->Start());
[email protected]fad73672012-06-15 23:26:06150
151 const Extension* extension = LoadExtension(
152 test_data_dir_.AppendASCII("subscribe_page_action"));
153 ASSERT_TRUE(extension);
154 std::string id = extension->id();
155
svaldeza01f7d92015-11-18 17:47:56156 NavigateToFeedAndValidate(embedded_test_server(), kValidFeed1, browser(), id,
157 true, "Feed for MyFeedTitle", "Title 1", "Desc",
[email protected]fad73672012-06-15 23:26:06158 "No error");
159}
160
Mattias Nisslerd3cba302015-03-20 09:07:44161// This test is flaky on all platforms; see http://crbug.com/340354
162IN_PROC_BROWSER_TEST_F(ExtensionBrowserTest, DISABLED_RSSParseFeedValidFeed2) {
svaldeza01f7d92015-11-18 17:47:56163 ASSERT_TRUE(embedded_test_server()->Start());
[email protected]fad73672012-06-15 23:26:06164
165 const Extension* extension = LoadExtension(
166 test_data_dir_.AppendASCII("subscribe_page_action"));
167 ASSERT_TRUE(extension);
168 std::string id = extension->id();
169
svaldeza01f7d92015-11-18 17:47:56170 NavigateToFeedAndValidate(embedded_test_server(), kValidFeed2, browser(), id,
171 true, "Feed for MyFeed2", "My item title1",
172 "This is a summary.", "No error");
[email protected]fad73672012-06-15 23:26:06173}
174
Mattias Nisslerd3cba302015-03-20 09:07:44175// This test is flaky on all platforms; see http://crbug.com/340354
176IN_PROC_BROWSER_TEST_F(ExtensionBrowserTest, DISABLED_RSSParseFeedValidFeed3) {
svaldeza01f7d92015-11-18 17:47:56177 ASSERT_TRUE(embedded_test_server()->Start());
[email protected]fad73672012-06-15 23:26:06178
179 const Extension* extension = LoadExtension(
180 test_data_dir_.AppendASCII("subscribe_page_action"));
181 ASSERT_TRUE(extension);
182 std::string id = extension->id();
183
svaldeza01f7d92015-11-18 17:47:56184 NavigateToFeedAndValidate(embedded_test_server(), kValidFeed3, browser(), id,
185 true, "Feed for Google Code buglist rss feed",
186 "My dear title", "My dear content", "No error");
[email protected]fad73672012-06-15 23:26:06187}
188
Mattias Nisslerd3cba302015-03-20 09:07:44189// This test is flaky on all platforms; see http://crbug.com/340354
190IN_PROC_BROWSER_TEST_F(ExtensionBrowserTest, DISABLED_RSSParseFeedValidFeed4) {
svaldeza01f7d92015-11-18 17:47:56191 ASSERT_TRUE(embedded_test_server()->Start());
[email protected]fad73672012-06-15 23:26:06192
193 const Extension* extension = LoadExtension(
194 test_data_dir_.AppendASCII("subscribe_page_action"));
195 ASSERT_TRUE(extension);
196 std::string id = extension->id();
197
svaldeza01f7d92015-11-18 17:47:56198 NavigateToFeedAndValidate(embedded_test_server(), kValidFeed4, browser(), id,
199 true, "Feed for Title chars <script> %23 stop",
200 "Title chars %23 stop", "My dear content %23 stop",
[email protected]fad73672012-06-15 23:26:06201 "No error");
202}
203
Mattias Nisslerd3cba302015-03-20 09:07:44204// This test is flaky on all platforms; see http://crbug.com/340354
205IN_PROC_BROWSER_TEST_F(ExtensionBrowserTest, DISABLED_RSSParseFeedValidFeed0) {
svaldeza01f7d92015-11-18 17:47:56206 ASSERT_TRUE(embedded_test_server()->Start());
[email protected]fad73672012-06-15 23:26:06207
208 const Extension* extension = LoadExtension(
209 test_data_dir_.AppendASCII("subscribe_page_action"));
210 ASSERT_TRUE(extension);
211 std::string id = extension->id();
212
213 // Try a feed with a link with an onclick handler (before r27440 this would
214 // trigger a NOTREACHED).
svaldeza01f7d92015-11-18 17:47:56215 NavigateToFeedAndValidate(embedded_test_server(), kValidFeed0, browser(), id,
216 true, "Feed for MyFeedTitle", "Title 1",
217 "Desc VIDEO", "No error");
[email protected]fad73672012-06-15 23:26:06218}
219
Mattias Nisslerd3cba302015-03-20 09:07:44220// This test is flaky on all platforms; see http://crbug.com/340354
221IN_PROC_BROWSER_TEST_F(ExtensionBrowserTest, DISABLED_RSSParseFeedValidFeed5) {
svaldeza01f7d92015-11-18 17:47:56222 ASSERT_TRUE(embedded_test_server()->Start());
[email protected]fad73672012-06-15 23:26:06223
224 const Extension* extension = LoadExtension(
225 test_data_dir_.AppendASCII("subscribe_page_action"));
226 ASSERT_TRUE(extension);
227 std::string id = extension->id();
228
229 // Feed with valid but mostly empty xml.
svaldeza01f7d92015-11-18 17:47:56230 NavigateToFeedAndValidate(
231 embedded_test_server(), kValidFeed5, browser(), id, true,
232 "Feed for Unknown feed name", "element 'anchor_0' not found",
233 "element 'desc_0' not found", "This feed contains no entries.");
[email protected]fad73672012-06-15 23:26:06234}
235
Mattias Nisslerd3cba302015-03-20 09:07:44236// This test is flaky on all platforms; see http://crbug.com/340354
237IN_PROC_BROWSER_TEST_F(ExtensionBrowserTest, DISABLED_RSSParseFeedValidFeed6) {
svaldeza01f7d92015-11-18 17:47:56238 ASSERT_TRUE(embedded_test_server()->Start());
[email protected]fad73672012-06-15 23:26:06239
240 const Extension* extension = LoadExtension(
241 test_data_dir_.AppendASCII("subscribe_page_action"));
242 ASSERT_TRUE(extension);
243 std::string id = extension->id();
244
245 // Feed that is technically invalid but still parseable.
svaldeza01f7d92015-11-18 17:47:56246 NavigateToFeedAndValidate(embedded_test_server(), kValidFeed6, browser(), id,
247 true, "Feed for MyFeedTitle", "Title 1", "Desc",
[email protected]fad73672012-06-15 23:26:06248 "No error");
249}
250
[email protected]efe5ba22014-01-07 13:23:27251IN_PROC_BROWSER_TEST_F(ExtensionBrowserTest, RSSParseFeedInvalidFeed1) {
svaldeza01f7d92015-11-18 17:47:56252 ASSERT_TRUE(embedded_test_server()->Start());
[email protected]fad73672012-06-15 23:26:06253
254 const Extension* extension = LoadExtension(
255 test_data_dir_.AppendASCII("subscribe_page_action"));
256 ASSERT_TRUE(extension);
257 std::string id = extension->id();
258
259 // Try an empty feed.
svaldeza01f7d92015-11-18 17:47:56260 NavigateToFeedAndValidate(
261 embedded_test_server(), kInvalidFeed1, browser(), id, false,
262 "Feed for Unknown feed name", "element 'anchor_0' not found",
263 "element 'desc_0' not found", "This feed contains no entries.");
[email protected]fad73672012-06-15 23:26:06264}
265
[email protected]efe5ba22014-01-07 13:23:27266IN_PROC_BROWSER_TEST_F(ExtensionBrowserTest, RSSParseFeedInvalidFeed2) {
svaldeza01f7d92015-11-18 17:47:56267 ASSERT_TRUE(embedded_test_server()->Start());
[email protected]fad73672012-06-15 23:26:06268
269 const Extension* extension = LoadExtension(
270 test_data_dir_.AppendASCII("subscribe_page_action"));
271 ASSERT_TRUE(extension);
272 std::string id = extension->id();
273
274 // Try a garbage feed.
svaldeza01f7d92015-11-18 17:47:56275 NavigateToFeedAndValidate(
276 embedded_test_server(), kInvalidFeed2, browser(), id, false,
277 "Feed for Unknown feed name", "element 'anchor_0' not found",
278 "element 'desc_0' not found", "This feed contains no entries.");
[email protected]fad73672012-06-15 23:26:06279}
280
[email protected]efe5ba22014-01-07 13:23:27281IN_PROC_BROWSER_TEST_F(ExtensionBrowserTest, RSSParseFeedInvalidFeed3) {
svaldeza01f7d92015-11-18 17:47:56282 ASSERT_TRUE(embedded_test_server()->Start());
[email protected]fad73672012-06-15 23:26:06283
284 const Extension* extension = LoadExtension(
285 test_data_dir_.AppendASCII("subscribe_page_action"));
286 ASSERT_TRUE(extension);
287 std::string id = extension->id();
288
289 // Try a feed that doesn't exist.
svaldeza01f7d92015-11-18 17:47:56290 NavigateToFeedAndValidate(
291 embedded_test_server(), "/foo.xml", browser(), id, false,
292 "Feed for Unknown feed name", "element 'anchor_0' not found",
293 "element 'desc_0' not found", "This feed contains no entries.");
[email protected]fad73672012-06-15 23:26:06294}
295
[email protected]efe5ba22014-01-07 13:23:27296IN_PROC_BROWSER_TEST_F(ExtensionBrowserTest, RSSParseFeedInvalidFeed4) {
svaldeza01f7d92015-11-18 17:47:56297 ASSERT_TRUE(embedded_test_server()->Start());
[email protected]fad73672012-06-15 23:26:06298
299 const Extension* extension = LoadExtension(
300 test_data_dir_.AppendASCII("subscribe_page_action"));
301 ASSERT_TRUE(extension);
302 std::string id = extension->id();
303
304 // subscribe.js shouldn't double-decode the URL passed in. Otherwise feed
305 // links such as http://search.twitter.com/search.atom?lang=en&q=%23chrome
306 // will result in no feed being downloaded because %23 gets decoded to # and
307 // therefore #chrome is not treated as part of the Twitter query. This test
308 // uses an underscore instead of a hash, but the principle is the same. If
309 // we start erroneously double decoding again, the path (and the feed) will
310 // become valid resulting in a failure for this test.
311 NavigateToFeedAndValidate(
svaldeza01f7d92015-11-18 17:47:56312 embedded_test_server(), kFeedTripleEncoded, browser(), id, true,
313 "Feed for Unknown feed name", "element 'anchor_0' not found",
314 "element 'desc_0' not found", "This feed contains no entries.");
[email protected]fad73672012-06-15 23:26:06315}
316
Mattias Nisslerd3cba302015-03-20 09:07:44317// This test is flaky on all platforms; see http://crbug.com/340354
318IN_PROC_BROWSER_TEST_F(ExtensionBrowserTest,
319 DISABLED_RSSParseFeedValidFeedNoLinks) {
svaldeza01f7d92015-11-18 17:47:56320 ASSERT_TRUE(embedded_test_server()->Start());
[email protected]fad73672012-06-15 23:26:06321
322 const Extension* extension = LoadExtension(
323 test_data_dir_.AppendASCII("subscribe_page_action"));
324 ASSERT_TRUE(extension);
325 std::string id = extension->id();
326
327 // Valid feed but containing no links.
svaldeza01f7d92015-11-18 17:47:56328 NavigateToFeedAndValidate(embedded_test_server(), kValidFeedNoLinks,
329 browser(), id, true, "Feed for MyFeedTitle",
330 "Title with no link", "Desc", "No error");
[email protected]fad73672012-06-15 23:26:06331}
Devlin Cronin836f545d2018-05-09 00:25:05332
333} // namespace extensions