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

Side by Side Diff: chrome/browser/safe_browsing/safe_browsing_navigation_observer_browsertest.cc

Issue 2302913003: Add SafeBrowsingNavigationObserver to listen to navigation events (Closed)
Patch Set: address creis's comments Created 4 years, 2 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 unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2016 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
5 #include "base/strings/stringprintf.h"
6 #include "chrome/browser/chrome_notification_types.h"
7 #include "chrome/browser/download/download_prefs.h"
8 #include "chrome/browser/profiles/profile.h"
9 #include "chrome/browser/safe_browsing/safe_browsing_navigation_observer.h"
10 #include "chrome/browser/safe_browsing/safe_browsing_navigation_observer_manager .h"
11 #include "chrome/browser/sessions/session_tab_helper.h"
12 #include "chrome/browser/ui/browser.h"
13 #include "chrome/browser/ui/tabs/tab_strip_model.h"
14 #include "chrome/common/pref_names.h"
15 #include "chrome/test/base/in_process_browser_test.h"
16 #include "chrome/test/base/ui_test_utils.h"
17 #include "components/prefs/pref_service.h"
18 #include "content/public/browser/browser_context.h"
19 #include "content/public/browser/download_item.h"
20 #include "content/public/browser/download_manager.h"
21 #include "content/public/browser/notification_service.h"
22 #include "content/public/test/browser_test_utils.h"
23 #include "content/public/test/test_utils.h"
24 #include "net/dns/mock_host_resolver.h"
25 #include "net/test/embedded_test_server/embedded_test_server.h"
26 #include "url/gurl.h"
27 #include "url/url_canon.h"
28
29 namespace safe_browsing {
30
31 const char kSingleFrameTestURL[] =
32 "/safe_browsing/download_protection/navigation_observer/"
33 "navigation_observer_tests.html";
34 const char kMultiFrameTestURL[] =
35 "/safe_browsing/download_protection/navigation_observer/"
36 "navigation_observer_multi_frame_tests.html";
37 const char kRedirectURL[] =
38 "/safe_browsing/download_protection/navigation_observer/redirect.html";
39 const char kDownloadDataURL[] =
40 "data:application/octet-stream;base64,a2poYWxrc2hkbGtoYXNka2xoYXNsa2RoYWxra"
41 "GtoYWxza2hka2xzamFoZGxramhhc2xka2hhc2xrZGgKYXNrZGpoa2FzZGpoYWtzaGRrYXNoZGt"
42 "oYXNrZGhhc2tkaGthc2hka2Foc2RraGFrc2hka2FzaGRraGFzCmFza2pkaGFrc2hkbSxjbmtza"
43 "mFoZGtoYXNrZGhhc2tka2hrYXNkCjg3MzQ2ODEyNzQ2OGtqc2hka2FoZHNrZGhraApha3NqZGt"
44 "hc2Roa3NkaGthc2hka2FzaGtkaAohISomXkAqJl4qYWhpZGFzeWRpeWlhc1xcb1wKa2Fqc2Roa"
45 "2FzaGRrYXNoZGsKYWtzamRoc2tkaAplbmQK";
46 const char kIframeDirectDownloadURL[] =
47 "/safe_browsing/download_protection/navigation_observer/iframe.html";
48 const char kIframeRetargetingURL[] =
49 "/safe_browsing/download_protection/navigation_observer/"
50 "iframe_retargeting.html";
51 const char kDownloadItemURL[] = "/safe_browsing/download_protection/signed.exe";
52
53 // Test class to help create SafeBrowsingNavigationObservers for each
54 // WebContents before they are actually installed through AttachTabHelper.
55 class TestNavigationObserverManager
56 : public SafeBrowsingNavigationObserverManager {
57 public:
58 TestNavigationObserverManager() : SafeBrowsingNavigationObserverManager() {
59 registrar_.Add(this, chrome::NOTIFICATION_TAB_ADDED,
60 content::NotificationService::AllSources());
61 }
62
63 void Observe(int type,
64 const content::NotificationSource& source,
65 const content::NotificationDetails& details) override {
66 if (type == chrome::NOTIFICATION_TAB_ADDED) {
67 content::WebContents* dest_content =
68 content::Details<content::WebContents>(details).ptr();
69 DCHECK(dest_content);
70 auto observer = new SafeBrowsingNavigationObserver(dest_content, this);
71 DCHECK(observer);
72 } else if (type == chrome::NOTIFICATION_RETARGETING) {
73 RecordRetargeting(details);
74 }
75 }
76
77 protected:
78 ~TestNavigationObserverManager() override {}
79 };
80
81 class SBNavigationObserverBrowserTest : public InProcessBrowserTest {
82 public:
83 SBNavigationObserverBrowserTest() {}
84
85 void SetUpOnMainThread() override {
86 ASSERT_TRUE(embedded_test_server()->Start());
87 host_resolver()->AddRule("*", "127.0.0.1");
88 // Navigate to test page.
89 ui_test_utils::NavigateToURL(
90 browser(), embedded_test_server()->GetURL(kSingleFrameTestURL));
91 observer_manager_ = new TestNavigationObserverManager();
92 observer_ = new SafeBrowsingNavigationObserver(
93 browser()->tab_strip_model()->GetActiveWebContents(),
94 observer_manager_);
95 ASSERT_TRUE(observer_);
96 ASSERT_TRUE(InitialSetup());
97 }
98
99 bool InitialSetup() {
100 if (!browser())
101 return false;
102
103 if (!downloads_directory_.CreateUniqueTempDir())
104 return false;
105
106 // Set up default download path.
107 browser()->profile()->GetPrefs()->SetFilePath(
108 prefs::kDownloadDefaultDirectory, downloads_directory_.path());
109 browser()->profile()->GetPrefs()->SetFilePath(
110 prefs::kSaveFileDefaultDirectory, downloads_directory_.path());
111 browser()->profile()->GetPrefs()->SetBoolean(prefs::kPromptForDownload,
112 false);
113 content::DownloadManager* manager =
114 content::BrowserContext::GetDownloadManager(browser()->profile());
115 DownloadPrefs::FromDownloadManager(manager)->ResetAutoOpen();
116 manager->RemoveAllDownloads();
117
118 return true;
119 }
120
121 void TearDownOnMainThread() override { delete observer_; }
122
123 // Most test cases will trigger downloads, though we don't really care if
124 // download completed or not. So we cancel downloads as soon as we record
125 // all the navigation event we need.
126 void CancelDownloads() {
127 std::vector<content::DownloadItem*> download_items;
128 content::DownloadManager* manager =
129 content::BrowserContext::GetDownloadManager(browser()->profile());
130 manager->GetAllDownloads(&download_items);
131 for (auto item : download_items)
132 item->Cancel(true);
133 }
134
135 // This function needs javascript support, only works on
136 // navigation_observer_tests.html and
137 // navigation_observer_multi_frame_tests.html.
138 void ClickTestLink(const char* test_name, int navigation_count) {
139 content::WebContents* main_web_contents =
140 browser()->tab_strip_model()->GetActiveWebContents();
141 std::string script = base::StringPrintf("clickLink('%s')", test_name);
142 EXPECT_TRUE(content::ExecuteScript(main_web_contents, script));
143 // Wait until all the navigation completes.
144 for (int i = 0; i < navigation_count; i++) {
145 content::WebContents* active_contents =
146 browser()->tab_strip_model()->GetActiveWebContents();
147 content::WaitForLoadStopWithoutSuccessCheck(active_contents);
148 }
149 CancelDownloads();
150 }
151
152 void VerifyNavigationEvent(const GURL& expected_source_url,
153 const GURL& expected_target_url,
154 const GURL& expected_main_frame_url,
155 bool expected_is_user_initiated,
156 bool expected_has_committed,
157 bool expected_has_server_redirect,
158 const GURL& expected_redirect_url,
159 const NavigationEvent& actual_nav_event) {
160 EXPECT_EQ(expected_source_url, actual_nav_event.source_url);
161 EXPECT_EQ(expected_target_url, actual_nav_event.target_url);
162 EXPECT_EQ(expected_main_frame_url, actual_nav_event.main_frame_url);
163 EXPECT_EQ(expected_is_user_initiated, actual_nav_event.is_user_initiated);
164 EXPECT_EQ(expected_has_committed, actual_nav_event.has_committed);
165 EXPECT_EQ(expected_has_server_redirect,
166 actual_nav_event.has_server_redirect);
167 EXPECT_EQ(expected_redirect_url, actual_nav_event.server_redirect_url);
168 }
169
170 SafeBrowsingNavigationObserverManager::NavigationMap* navigation_map() {
171 return observer_manager_->navigation_map();
172 }
173
174 protected:
175 SafeBrowsingNavigationObserverManager* observer_manager_;
176 SafeBrowsingNavigationObserver* observer_;
177
178 private:
179 base::ScopedTempDir downloads_directory_;
180 };
181
182 // Click on a link and start download on the same page.
183 IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, DirectDownload) {
184 ClickTestLink("direct_download", 1);
185 GURL initial_url = embedded_test_server()->GetURL(kSingleFrameTestURL);
186 GURL download_url = embedded_test_server()->GetURL(kDownloadItemURL);
187 SafeBrowsingNavigationObserverManager::NavigationMap* nav_map =
188 navigation_map();
189 ASSERT_TRUE(nav_map);
190 ASSERT_EQ(std::size_t(1), nav_map->size());
191 ASSERT_EQ(std::size_t(1), nav_map->at(download_url).size());
192 // Since this test uses java script to mimic clicking on a link, there is no
193 // actual user gesture, therefore is_user_initiated is false.
194 VerifyNavigationEvent(initial_url, // source_url
195 download_url, // target_url
196 initial_url, // source's main_frame_url
197 false, // is_user_initiated,
198 false, // has_committed
199 false, // has_server_redirect
200 GURL(), // redirect_url
201 nav_map->at(download_url).at(0));
202 }
203
204 // Click on a link with rel="noreferrer" attribute, and start download on the
205 // same page.
206 IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest,
207 DirectDownloadNoReferrer) {
208 ClickTestLink("direct_download_noreferrer", 1);
209 GURL initial_url = embedded_test_server()->GetURL(kSingleFrameTestURL);
210 GURL download_url = embedded_test_server()->GetURL(kDownloadItemURL);
211 SafeBrowsingNavigationObserverManager::NavigationMap* nav_map =
212 navigation_map();
213 ASSERT_TRUE(nav_map);
214 ASSERT_EQ(std::size_t(1), nav_map->size());
215 ASSERT_EQ(std::size_t(1), nav_map->at(download_url).size());
216 VerifyNavigationEvent(initial_url, download_url, initial_url, false, false,
217 false, GURL(), nav_map->at(download_url).at(0));
218 }
219
220 // Click on a link with rel="noreferrer" attribute, and start download in a
221 // new tab using target=_blank.
222 IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest,
223 DirectDownloadNoReferrerTargetBlank) {
224 ClickTestLink("direct_download_noreferrer_target_blank", 2);
225 GURL initial_url = embedded_test_server()->GetURL(kSingleFrameTestURL);
226 GURL download_url = embedded_test_server()->GetURL(kDownloadItemURL);
227 SafeBrowsingNavigationObserverManager::NavigationMap* nav_map =
228 navigation_map();
229 ASSERT_TRUE(nav_map);
230 ASSERT_EQ(std::size_t(1), nav_map->size());
231 ASSERT_EQ(std::size_t(2), nav_map->at(download_url).size());
232 VerifyNavigationEvent(initial_url, download_url, initial_url, false, false,
233 false, GURL(), nav_map->at(download_url).at(0));
234 VerifyNavigationEvent(download_url, download_url, download_url, false, false,
235 false, GURL(), nav_map->at(download_url).at(1));
236 }
237
238 // Click on a link which navigates to a page then redirect to download using
239 // META HTTP-EQUIV="refresh". All transitions happen in the same tab.
240 IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest,
241 SingleMetaRefreshRedirect) {
242 ClickTestLink("single_meta_refresh_redirect", 2);
243 GURL initial_url = embedded_test_server()->GetURL(kSingleFrameTestURL);
244 GURL redirect_url = embedded_test_server()->GetURL(kRedirectURL);
245 GURL download_url = embedded_test_server()->GetURL(kDownloadItemURL);
246 SafeBrowsingNavigationObserverManager::NavigationMap* nav_map =
247 navigation_map();
248 ASSERT_TRUE(nav_map);
249 ASSERT_EQ(std::size_t(2), nav_map->size());
250 ASSERT_EQ(std::size_t(1), nav_map->at(redirect_url).size());
251 ASSERT_EQ(std::size_t(1), nav_map->at(download_url).size());
252 VerifyNavigationEvent(initial_url, redirect_url, initial_url, false, true,
253 false, GURL(), nav_map->at(redirect_url).at(0));
254 VerifyNavigationEvent(redirect_url, download_url, redirect_url, false, false,
255 false, GURL(), nav_map->at(download_url).at(0));
256 }
257
258 // Click on a link which navigates to a page then redirect to download using
259 // META HTTP-EQUIV="refresh". First navigation happens in target blank.
260 IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest,
261 SingleMetaRefreshRedirectTargetBlank) {
262 ClickTestLink("single_meta_refresh_redirect_target_blank", 3);
263 GURL initial_url = embedded_test_server()->GetURL(kSingleFrameTestURL);
264 GURL redirect_url = embedded_test_server()->GetURL(kRedirectURL);
265 GURL download_url = embedded_test_server()->GetURL(kDownloadItemURL);
266 SafeBrowsingNavigationObserverManager::NavigationMap* nav_map =
267 navigation_map();
268 ASSERT_TRUE(nav_map);
269 ASSERT_EQ(std::size_t(2), nav_map->size());
270 ASSERT_EQ(std::size_t(2), nav_map->at(redirect_url).size());
271 ASSERT_EQ(std::size_t(1), nav_map->at(download_url).size());
272 VerifyNavigationEvent(initial_url, redirect_url, initial_url, false, false,
273 false, GURL(), nav_map->at(redirect_url).at(0));
274 VerifyNavigationEvent(redirect_url, redirect_url, redirect_url, false, true,
275 false, GURL(), nav_map->at(redirect_url).at(1));
276 VerifyNavigationEvent(redirect_url, download_url, redirect_url, false, false,
277 false, GURL(), nav_map->at(download_url).at(0));
278 }
279
280 // Click on a link which redirects twice before reaching download using
281 // META HTTP-EQUIV="refresh". All transitions happen in the same tab.
282 IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest,
283 MultiMetaRefreshRedirects) {
284 ClickTestLink("multiple_meta_refresh_redirects", 3);
285 GURL initial_url = embedded_test_server()->GetURL(kSingleFrameTestURL);
286 GURL first_redirect_url = embedded_test_server()->GetURL(
287 "/safe_browsing/download_protection/navigation_observer/"
288 "double_redirect.html");
289 GURL second_redirect_url = embedded_test_server()->GetURL(kRedirectURL);
290 GURL download_url = embedded_test_server()->GetURL(kDownloadItemURL);
291 SafeBrowsingNavigationObserverManager::NavigationMap* nav_map =
292 navigation_map();
293 ASSERT_TRUE(nav_map);
294 ASSERT_EQ(std::size_t(3), nav_map->size());
295 ASSERT_EQ(std::size_t(1), nav_map->at(first_redirect_url).size());
296 ASSERT_EQ(std::size_t(1), nav_map->at(second_redirect_url).size());
297 ASSERT_EQ(std::size_t(1), nav_map->at(download_url).size());
298 VerifyNavigationEvent(initial_url, first_redirect_url, initial_url, false,
299 true, false, GURL(),
300 nav_map->at(first_redirect_url).at(0));
301 VerifyNavigationEvent(first_redirect_url, second_redirect_url,
302 first_redirect_url, false, true, false, GURL(),
303 nav_map->at(second_redirect_url).at(0));
304 VerifyNavigationEvent(second_redirect_url, download_url, second_redirect_url,
305 false, false, false, GURL(),
306 nav_map->at(download_url).at(0));
307 }
308
309 // Click on a link which redirects to download using window.location.href.
310 // All transitions happen in the same tab.
311 IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest,
312 WindowLocationHrefRedirect) {
313 ClickTestLink("window_location_href_redirect", 2);
314 GURL initial_url = embedded_test_server()->GetURL(kSingleFrameTestURL);
315 GURL download_url = embedded_test_server()->GetURL(kDownloadItemURL);
316 SafeBrowsingNavigationObserverManager::NavigationMap* nav_map =
317 navigation_map();
318 ASSERT_TRUE(nav_map);
319 ASSERT_EQ(std::size_t(2), nav_map->size());
320 ASSERT_EQ(std::size_t(1), nav_map->at(initial_url).size());
321 ASSERT_EQ(std::size_t(1), nav_map->at(download_url).size());
322 VerifyNavigationEvent(initial_url, initial_url, initial_url, false, true,
323 false, GURL(), nav_map->at(initial_url).at(0));
324 VerifyNavigationEvent(initial_url, download_url, initial_url, false, false,
325 false, GURL(), nav_map->at(download_url).at(0));
326 }
327
328 // Click on a link which redirect twice until reaches download using a mixture
329 // of meta refresh and window.location.href. All transitions happen in the same
330 // tab.
331 IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, MixRedirects) {
332 ClickTestLink("mix_redirects", 3);
333 GURL redirect_url = embedded_test_server()->GetURL(kRedirectURL);
334 GURL initial_url = embedded_test_server()->GetURL(kSingleFrameTestURL);
335 GURL download_url = embedded_test_server()->GetURL(kDownloadItemURL);
336 SafeBrowsingNavigationObserverManager::NavigationMap* nav_map =
337 navigation_map();
338 ASSERT_TRUE(nav_map);
339 ASSERT_EQ(std::size_t(3), nav_map->size());
340 ASSERT_EQ(std::size_t(1), nav_map->at(initial_url).size());
341 ASSERT_EQ(std::size_t(1), nav_map->at(redirect_url).size());
342 ASSERT_EQ(std::size_t(1), nav_map->at(download_url).size());
343 VerifyNavigationEvent(initial_url, initial_url, initial_url, false, true,
344 false, GURL(), nav_map->at(initial_url).at(0));
345 VerifyNavigationEvent(initial_url, redirect_url, initial_url, false, true,
346 false, GURL(), nav_map->at(redirect_url).at(0));
347 VerifyNavigationEvent(redirect_url, download_url, redirect_url, false, false,
348 false, GURL(), nav_map->at(download_url).at(0));
349 }
350
351 // Use javascript to open download in a new tab.
352 IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, NewTabDownload) {
353 ClickTestLink("new_tab_download", 4);
354 GURL initial_url = embedded_test_server()->GetURL(kSingleFrameTestURL);
355 GURL download_url = embedded_test_server()->GetURL(kDownloadItemURL);
356 GURL blank_url = GURL("about:blank");
357 SafeBrowsingNavigationObserverManager::NavigationMap* nav_map =
358 navigation_map();
359 ASSERT_TRUE(nav_map);
360 ASSERT_EQ(std::size_t(3), nav_map->size());
361 ASSERT_EQ(std::size_t(1), nav_map->at(initial_url).size());
362 ASSERT_EQ(std::size_t(2), nav_map->at(blank_url).size());
363 ASSERT_EQ(std::size_t(1), nav_map->at(download_url).size());
364 VerifyNavigationEvent(initial_url, initial_url, initial_url, false, true,
365 false, GURL(), nav_map->at(initial_url).at(0));
366 VerifyNavigationEvent(initial_url, blank_url, initial_url, false, false,
367 false, GURL(), nav_map->at(blank_url).at(0));
368 // Source and target are at different tabs.
369 EXPECT_FALSE(nav_map->at(blank_url).at(0).source_tab_id ==
370 nav_map->at(blank_url).at(0).target_tab_id);
371 VerifyNavigationEvent(blank_url, blank_url, blank_url, false, false, false,
372 GURL(), nav_map->at(blank_url).at(1));
373 EXPECT_TRUE(nav_map->at(blank_url).at(1).source_tab_id ==
374 nav_map->at(blank_url).at(1).target_tab_id);
375 VerifyNavigationEvent(blank_url, download_url, blank_url, false, false, false,
376 GURL(), nav_map->at(download_url).at(0));
377 EXPECT_TRUE(nav_map->at(download_url).at(0).source_tab_id ==
378 nav_map->at(download_url).at(0).target_tab_id);
379 }
380
381 // Use javascript to open download in a new tab and download has a data url.
382 IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest,
383 NewTabDownloadWithDataURL) {
384 ClickTestLink("new_tab_download_with_data_url", 4);
385 GURL initial_url = embedded_test_server()->GetURL(kSingleFrameTestURL);
386 GURL download_url = GURL(kDownloadDataURL);
387 GURL blank_url = GURL("about:blank");
388 SafeBrowsingNavigationObserverManager::NavigationMap* nav_map =
389 navigation_map();
390 ASSERT_TRUE(nav_map);
391 ASSERT_EQ(std::size_t(3), nav_map->size());
392 ASSERT_EQ(std::size_t(1), nav_map->at(initial_url).size());
393 ASSERT_EQ(std::size_t(2), nav_map->at(blank_url).size());
394 ASSERT_EQ(std::size_t(1), nav_map->at(download_url).size());
395 VerifyNavigationEvent(initial_url, initial_url, initial_url, false, true,
396 false, GURL(), nav_map->at(initial_url).at(0));
397 VerifyNavigationEvent(initial_url, blank_url, initial_url, false, false,
398 false, GURL(), nav_map->at(blank_url).at(0));
399 // Source and target are at different tabs.
400 EXPECT_FALSE(nav_map->at(blank_url).at(0).source_tab_id ==
401 nav_map->at(blank_url).at(0).target_tab_id);
402 VerifyNavigationEvent(blank_url, blank_url, blank_url, false, false, false,
403 GURL(), nav_map->at(blank_url).at(1));
404 EXPECT_TRUE(nav_map->at(blank_url).at(1).source_tab_id ==
405 nav_map->at(blank_url).at(1).target_tab_id);
406 VerifyNavigationEvent(blank_url, download_url, blank_url, false, false, false,
407 GURL(), nav_map->at(download_url).at(0));
408 EXPECT_TRUE(nav_map->at(download_url).at(0).source_tab_id ==
409 nav_map->at(download_url).at(0).target_tab_id);
410 }
411
412 // TODO(jialiul): Need to figure out why this test is failing on Windows and
413 // flacky on other platforms.
414 #define MAYBE_DownloadViaHTML5FileApi DISABLED_DownloadViaHTML5FileApi
415 // Download via html5 file API.
416 IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest,
417 MAYBE_DownloadViaHTML5FileApi) {
418 ClickTestLink("html5_file_api", 2);
419 GURL initial_url = embedded_test_server()->GetURL(kSingleFrameTestURL);
420 std::string download_url_str =
421 base::StringPrintf("filesystem:%stemporary/test.exe",
422 embedded_test_server()->base_url().spec().c_str());
423 GURL download_url = GURL(download_url_str);
424 SafeBrowsingNavigationObserverManager::NavigationMap* nav_map =
425 navigation_map();
426 ASSERT_TRUE(nav_map);
427 ASSERT_EQ(std::size_t(2), nav_map->size());
428 ASSERT_EQ(std::size_t(1), nav_map->at(initial_url).size());
429 ASSERT_EQ(std::size_t(1), nav_map->at(download_url).size());
430 VerifyNavigationEvent(initial_url, initial_url, initial_url, false, true,
431 false, GURL(), nav_map->at(initial_url).at(0));
432 VerifyNavigationEvent(initial_url, download_url, initial_url, false, false,
433 false, GURL(), nav_map->at(download_url).at(0));
434 }
435
436 // Click a link in a subframe and start download.
437 IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest,
438 SubFrameDirectDownload) {
439 ui_test_utils::NavigateToURL(
440 browser(), embedded_test_server()->GetURL(kMultiFrameTestURL));
441 EXPECT_TRUE(content::WaitForLoadStop(
442 browser()->tab_strip_model()->GetActiveWebContents()));
443 std::string test_name =
444 base::StringPrintf("%s', '%s", "iframe1", "iframe_direct_download");
445 ClickTestLink(test_name.c_str(), 1);
446 GURL initial_url = embedded_test_server()->GetURL(kSingleFrameTestURL);
447 GURL multi_frame_test_url =
448 embedded_test_server()->GetURL(kMultiFrameTestURL);
449 GURL iframe_url = embedded_test_server()->GetURL(kIframeDirectDownloadURL);
450 GURL iframe_retargeting_url =
451 embedded_test_server()->GetURL(kIframeRetargetingURL);
452 GURL download_url = embedded_test_server()->GetURL(kDownloadItemURL);
453 SafeBrowsingNavigationObserverManager::NavigationMap* nav_map =
454 navigation_map();
455 ASSERT_TRUE(nav_map);
456 ASSERT_EQ(std::size_t(4), nav_map->size());
457 ASSERT_EQ(std::size_t(1), nav_map->at(multi_frame_test_url).size());
458 ASSERT_EQ(std::size_t(1), nav_map->at(iframe_url).size());
459 ASSERT_EQ(std::size_t(1), nav_map->at(iframe_retargeting_url).size());
460 ASSERT_EQ(std::size_t(1), nav_map->at(download_url).size());
461 VerifyNavigationEvent(initial_url, multi_frame_test_url, initial_url, true,
462 true, false, GURL(),
463 nav_map->at(multi_frame_test_url).at(0));
464 VerifyNavigationEvent(iframe_url, iframe_url, multi_frame_test_url, false,
465 true, false, GURL(), nav_map->at(iframe_url).at(0));
466 VerifyNavigationEvent(iframe_retargeting_url, iframe_retargeting_url,
467 multi_frame_test_url, false, true, false, GURL(),
468 nav_map->at(iframe_retargeting_url).at(0));
469 VerifyNavigationEvent(iframe_url, download_url, multi_frame_test_url, false,
470 false, false, GURL(), nav_map->at(download_url).at(0));
471 }
472
473 // Click a link in a subframe and open download in a new tab.
474 IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest,
475 SubFrameNewTabDownload) {
476 ui_test_utils::NavigateToURL(
477 browser(), embedded_test_server()->GetURL(kMultiFrameTestURL));
478 EXPECT_TRUE(content::WaitForLoadStop(
479 browser()->tab_strip_model()->GetActiveWebContents()));
480 std::string test_name =
481 base::StringPrintf("%s', '%s", "iframe2", "iframe_new_tab_download");
482 ClickTestLink(test_name.c_str(), 4);
483 GURL initial_url = embedded_test_server()->GetURL(kSingleFrameTestURL);
484 GURL multi_frame_test_url =
485 embedded_test_server()->GetURL(kMultiFrameTestURL);
486 GURL iframe_url = embedded_test_server()->GetURL(kIframeDirectDownloadURL);
487 GURL iframe_retargeting_url =
488 embedded_test_server()->GetURL(kIframeRetargetingURL);
489 GURL download_url = embedded_test_server()->GetURL(kDownloadItemURL);
490 GURL blank_url = GURL("about:blank");
491 SafeBrowsingNavigationObserverManager::NavigationMap* nav_map =
492 navigation_map();
493 ASSERT_TRUE(nav_map);
494 ASSERT_EQ(std::size_t(5), nav_map->size());
495 ASSERT_EQ(std::size_t(1), nav_map->at(multi_frame_test_url).size());
496 ASSERT_EQ(std::size_t(1), nav_map->at(iframe_url).size());
497 ASSERT_EQ(std::size_t(2), nav_map->at(iframe_retargeting_url).size());
498 ASSERT_EQ(std::size_t(2), nav_map->at(blank_url).size());
499 ASSERT_EQ(std::size_t(1), nav_map->at(download_url).size());
500 VerifyNavigationEvent(initial_url, multi_frame_test_url, initial_url, true,
501 true, false, GURL(),
502 nav_map->at(multi_frame_test_url).at(0));
503 VerifyNavigationEvent(iframe_url, iframe_url, multi_frame_test_url, false,
504 true, false, GURL(), nav_map->at(iframe_url).at(0));
505 VerifyNavigationEvent(iframe_retargeting_url, iframe_retargeting_url,
506 multi_frame_test_url, false, true, false, GURL(),
507 nav_map->at(iframe_retargeting_url).at(0));
508 VerifyNavigationEvent(iframe_retargeting_url, iframe_retargeting_url,
509 multi_frame_test_url, false, true, false, GURL(),
510 nav_map->at(iframe_retargeting_url).at(1));
511 VerifyNavigationEvent(iframe_retargeting_url, blank_url, multi_frame_test_url,
512 false, false, false, GURL(),
513 nav_map->at(blank_url).at(0));
514 VerifyNavigationEvent(blank_url, blank_url, blank_url, false, false, false,
515 GURL(), nav_map->at(blank_url).at(1));
516 VerifyNavigationEvent(blank_url, download_url, blank_url, false, false, false,
517 GURL(), nav_map->at(download_url).at(0));
518 }
519
520 } // namespace safe_browsing
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698