| Index: chrome/browser/safe_browsing/safe_browsing_navigation_observer_browsertest.cc | 
| diff --git a/chrome/browser/safe_browsing/safe_browsing_navigation_observer_browsertest.cc b/chrome/browser/safe_browsing/safe_browsing_navigation_observer_browsertest.cc | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..b9d01ea8e5533dd4343b9990e2e291e63f4f9cd8 | 
| --- /dev/null | 
| +++ b/chrome/browser/safe_browsing/safe_browsing_navigation_observer_browsertest.cc | 
| @@ -0,0 +1,440 @@ | 
| +// Copyright 2016 The Chromium Authors. All rights reserved. | 
| +// Use of this source code is governed by a BSD-style license that can be | 
| +// found in the LICENSE file. | 
| +#include "chrome/browser/safe_browsing/safe_browsing_navigation_observer.h" | 
| + | 
| +#include "base/strings/stringprintf.h" | 
| +#include "chrome/browser/chrome_notification_types.h" | 
| +#include "chrome/browser/download/download_prefs.h" | 
| +#include "chrome/browser/profiles/profile.h" | 
| +#include "chrome/browser/sessions/session_tab_helper.h" | 
| +#include "chrome/browser/ui/browser.h" | 
| +#include "chrome/browser/ui/tabs/tab_strip_model.h" | 
| +#include "chrome/common/pref_names.h" | 
| +#include "chrome/test/base/in_process_browser_test.h" | 
| +#include "chrome/test/base/ui_test_utils.h" | 
| +#include "components/prefs/pref_service.h" | 
| +#include "content/public/browser/browser_context.h" | 
| +#include "content/public/browser/download_item.h" | 
| +#include "content/public/browser/download_manager.h" | 
| +#include "content/public/browser/notification_service.h" | 
| +#include "content/public/test/browser_test_utils.h" | 
| +#include "content/public/test/test_utils.h" | 
| +#include "net/dns/mock_host_resolver.h" | 
| +#include "net/test/embedded_test_server/embedded_test_server.h" | 
| +#include "url/gurl.h" | 
| +#include "url/url_canon.h" | 
| + | 
| +namespace safe_browsing { | 
| + | 
| +const char kSingleFrameTestURL[] = | 
| +    "/safe_browsing/download_protection/navigation_observer/" | 
| +    "navigation_observer_tests.html"; | 
| +const char kMultiFrameTestURL[] = | 
| +    "/safe_browsing/download_protection/navigation_observer/" | 
| +    "navigation_observer_multi_frame_tests.html"; | 
| +const char kRedirectURL[] = | 
| +    "/safe_browsing/download_protection/navigation_observer/redirect.html"; | 
| +const char kDownloadDataURL[] = | 
| +    "data:application/octet-stream;base64,a2poYWxrc2hkbGtoYXNka2xoYXNsa2RoYWxra" | 
| +    "GtoYWxza2hka2xzamFoZGxramhhc2xka2hhc2xrZGgKYXNrZGpoa2FzZGpoYWtzaGRrYXNoZGt" | 
| +    "oYXNrZGhhc2tkaGthc2hka2Foc2RraGFrc2hka2FzaGRraGFzCmFza2pkaGFrc2hkbSxjbmtza" | 
| +    "mFoZGtoYXNrZGhhc2tka2hrYXNkCjg3MzQ2ODEyNzQ2OGtqc2hka2FoZHNrZGhraApha3NqZGt" | 
| +    "hc2Roa3NkaGthc2hka2FzaGtkaAohISomXkAqJl4qYWhpZGFzeWRpeWlhc1xcb1wKa2Fqc2Roa" | 
| +    "2FzaGRrYXNoZGsKYWtzamRoc2tkaAplbmQK"; | 
| +const char kIframeDirectDownloadURL[] = | 
| +    "/safe_browsing/download_protection/navigation_observer/iframe.html"; | 
| +const char kIframeRetargetingURL[] = | 
| +    "/safe_browsing/download_protection/navigation_observer/" | 
| +    "iframe_retargeting.html"; | 
| +const char kDownloadItemURL[] = "/safe_browsing/download_protection/signed.exe"; | 
| + | 
| +class SBNavigationObserverBrowserTest : public InProcessBrowserTest { | 
| + public: | 
| +  SBNavigationObserverBrowserTest() {} | 
| + | 
| +  void SetUpOnMainThread() override { | 
| +    ASSERT_TRUE(embedded_test_server()->Start()); | 
| +    host_resolver()->AddRule("*", "127.0.0.1"); | 
| +    // Navigate to test page. | 
| +    ui_test_utils::NavigateToURL( | 
| +        browser(), embedded_test_server()->GetURL(kSingleFrameTestURL)); | 
| +    observer_ = new SafeBrowsingNavigationObserver(); | 
| +    ASSERT_TRUE(observer_); | 
| +    ASSERT_TRUE(InitialSetup()); | 
| +  } | 
| + | 
| +  bool InitialSetup() { | 
| +    if (!browser()) | 
| +      return false; | 
| + | 
| +    if (!downloads_directory_.CreateUniqueTempDir()) | 
| +      return false; | 
| + | 
| +    // Set up default download path. | 
| +    browser()->profile()->GetPrefs()->SetFilePath( | 
| +        prefs::kDownloadDefaultDirectory, downloads_directory_.path()); | 
| +    browser()->profile()->GetPrefs()->SetFilePath( | 
| +        prefs::kSaveFileDefaultDirectory, downloads_directory_.path()); | 
| +    browser()->profile()->GetPrefs()->SetBoolean(prefs::kPromptForDownload, | 
| +                                                 false); | 
| +    content::DownloadManager* manager = | 
| +        content::BrowserContext::GetDownloadManager(browser()->profile()); | 
| +    DownloadPrefs::FromDownloadManager(manager)->ResetAutoOpen(); | 
| +    manager->RemoveAllDownloads(); | 
| + | 
| +    return true; | 
| +  } | 
| + | 
| +  void TearDownOnMainThread() override { delete observer_; } | 
| + | 
| +  // Most test cases will trigger downloads, though we don't really care if | 
| +  // download completed or not. So we cancel downloads as soon as we record | 
| +  // all the navigation event we need. | 
| +  void CancelDownloads() { | 
| +    std::vector<content::DownloadItem*> download_items; | 
| +    content::DownloadManager* manager = | 
| +        content::BrowserContext::GetDownloadManager(browser()->profile()); | 
| +    manager->GetAllDownloads(&download_items); | 
| +    for (auto item : download_items) | 
| +      item->Cancel(true); | 
| +  } | 
| + | 
| +  // This function needs javascript support, only works on | 
| +  // navigation_observer_tests.html and | 
| +  // navigation_observer_multi_frame_tests.html. | 
| +  void ClickTestLink(const char* test_name, int navigation_count) { | 
| +    content::WebContents* main_web_contents = | 
| +        browser()->tab_strip_model()->GetActiveWebContents(); | 
| +    std::string script = base::StringPrintf("clickLink('%s')", test_name); | 
| +    EXPECT_TRUE(content::ExecuteScript(main_web_contents, script)); | 
| +    // Wait until all the navigation completes. | 
| +    for (int i = 0; i < navigation_count; i++) { | 
| +      content::WebContents* active_contents = | 
| +          browser()->tab_strip_model()->GetActiveWebContents(); | 
| +      content::WaitForLoadStopWithoutSuccessCheck(active_contents); | 
| +    } | 
| +    CancelDownloads(); | 
| +  } | 
| + | 
| +  void VerifyNavigationEvent( | 
| +      const GURL& expected_source_url, | 
| +      const GURL& expected_target_url, | 
| +      const GURL& expected_main_frame_url, | 
| +      bool expected_is_user_initiated, | 
| +      bool expected_has_committed, | 
| +      bool expected_is_server_redirect, | 
| +      bool expected_is_finished, | 
| +      const GURL& expected_redirect_url, | 
| +      const SafeBrowsingNavigationObserver::NavigationEvent& actual_nav_event) { | 
| +    EXPECT_EQ(expected_source_url, actual_nav_event.source_url); | 
| +    EXPECT_EQ(expected_target_url, actual_nav_event.target_url); | 
| +    EXPECT_EQ(expected_main_frame_url, actual_nav_event.main_frame_url); | 
| +    EXPECT_EQ(expected_is_user_initiated, actual_nav_event.is_user_initiated); | 
| +    EXPECT_EQ(expected_has_committed, actual_nav_event.has_committed); | 
| +    EXPECT_EQ(expected_is_server_redirect, actual_nav_event.is_server_redirect); | 
| +    EXPECT_EQ(expected_is_finished, actual_nav_event.is_finished); | 
| +    EXPECT_EQ(expected_redirect_url, actual_nav_event.server_redirect_url); | 
| +  } | 
| + | 
| + protected: | 
| +  SafeBrowsingNavigationObserver* observer_; | 
| + | 
| + private: | 
| +  base::ScopedTempDir downloads_directory_; | 
| +}; | 
| + | 
| +// Click on a link and start download on the same page. | 
| +IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, DirectDownload) { | 
| +  ClickTestLink("direct_download", 1); | 
| +  GURL initial_url = embedded_test_server()->GetURL(kSingleFrameTestURL); | 
| +  GURL download_url = embedded_test_server()->GetURL(kDownloadItemURL); | 
| +  SafeBrowsingNavigationObserver::NavigationMap* nav_map = | 
| +      observer_->navigation_map(); | 
| +  ASSERT_TRUE(nav_map); | 
| +  ASSERT_EQ(std::size_t(1), nav_map->size()); | 
| +  ASSERT_EQ(std::size_t(1), nav_map->at(download_url).size()); | 
| +  VerifyNavigationEvent(initial_url,   // source_url | 
| +                        download_url,  // target_url | 
| +                        initial_url,   // source's main_frame_url | 
| +                        false,         // is_user_initiated, | 
| +                        false,         // has_committed | 
| +                        false,         // is_server_redirect | 
| +                        true,          // is_finished | 
| +                        GURL(),        // redirect_url | 
| +                        nav_map->at(download_url).at(0)); | 
| +} | 
| + | 
| +// Click on a link with rel="noreferrer" attribute, and start download on the | 
| +// same page. | 
| +IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, | 
| +                       DirectDownloadNoReferrer) { | 
| +  ClickTestLink("direct_download_noreferrer", 1); | 
| +  GURL initial_url = embedded_test_server()->GetURL(kSingleFrameTestURL); | 
| +  GURL download_url = embedded_test_server()->GetURL(kDownloadItemURL); | 
| +  SafeBrowsingNavigationObserver::NavigationMap* nav_map = | 
| +      observer_->navigation_map(); | 
| +  ASSERT_TRUE(nav_map); | 
| +  ASSERT_EQ(std::size_t(1), nav_map->size()); | 
| +  ASSERT_EQ(std::size_t(1), nav_map->at(download_url).size()); | 
| +  VerifyNavigationEvent(initial_url, download_url, initial_url, false, false, | 
| +                        false, true, GURL(), nav_map->at(download_url).at(0)); | 
| +} | 
| + | 
| +// Click on a link which navigates to a page then redirect to download using | 
| +// META HTTP-EQUIV="refresh". All transitions happen in the same tab. | 
| +IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, | 
| +                       SingleMetaRefreshRedirect) { | 
| +  ClickTestLink("single_meta_refresh_redirect", 2); | 
| +  GURL initial_url = embedded_test_server()->GetURL(kSingleFrameTestURL); | 
| +  GURL redirect_url = embedded_test_server()->GetURL(kRedirectURL); | 
| +  GURL download_url = embedded_test_server()->GetURL(kDownloadItemURL); | 
| +  SafeBrowsingNavigationObserver::NavigationMap* nav_map = | 
| +      observer_->navigation_map(); | 
| +  ASSERT_TRUE(nav_map); | 
| +  ASSERT_EQ(std::size_t(2), nav_map->size()); | 
| +  ASSERT_EQ(std::size_t(1), nav_map->at(redirect_url).size()); | 
| +  ASSERT_EQ(std::size_t(1), nav_map->at(download_url).size()); | 
| +  VerifyNavigationEvent(initial_url, redirect_url, initial_url, true, true, | 
| +                        false, true, GURL(), nav_map->at(redirect_url).at(0)); | 
| +  VerifyNavigationEvent(redirect_url, download_url, redirect_url, false, false, | 
| +                        false, true, GURL(), nav_map->at(download_url).at(0)); | 
| +} | 
| + | 
| +// Click on a link which redirects twice before reaching download using | 
| +// META HTTP-EQUIV="refresh". All transitions happen in the same tab. | 
| +IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, | 
| +                       MultiMetaRefreshRedirects) { | 
| +  ClickTestLink("multiple_meta_refresh_redirects", 3); | 
| +  GURL initial_url = embedded_test_server()->GetURL(kSingleFrameTestURL); | 
| +  GURL first_redirect_url = embedded_test_server()->GetURL( | 
| +      "/safe_browsing/download_protection/navigation_observer/" | 
| +      "double_redirect.html"); | 
| +  GURL second_redirect_url = embedded_test_server()->GetURL(kRedirectURL); | 
| +  GURL download_url = embedded_test_server()->GetURL(kDownloadItemURL); | 
| +  SafeBrowsingNavigationObserver::NavigationMap* nav_map = | 
| +      observer_->navigation_map(); | 
| +  ASSERT_TRUE(nav_map); | 
| +  ASSERT_EQ(std::size_t(3), nav_map->size()); | 
| +  ASSERT_EQ(std::size_t(1), nav_map->at(first_redirect_url).size()); | 
| +  ASSERT_EQ(std::size_t(1), nav_map->at(second_redirect_url).size()); | 
| +  ASSERT_EQ(std::size_t(1), nav_map->at(download_url).size()); | 
| +  VerifyNavigationEvent(initial_url, first_redirect_url, initial_url, true, | 
| +                        true, false, true, GURL(), | 
| +                        nav_map->at(first_redirect_url).at(0)); | 
| +  VerifyNavigationEvent(first_redirect_url, second_redirect_url, | 
| +                        first_redirect_url, false, true, false, true, GURL(), | 
| +                        nav_map->at(second_redirect_url).at(0)); | 
| +  VerifyNavigationEvent(second_redirect_url, download_url, second_redirect_url, | 
| +                        false, false, false, true, GURL(), | 
| +                        nav_map->at(download_url).at(0)); | 
| +} | 
| + | 
| +// Click on a link which redirects to download using | 
| +// window.location.href. All transitions happen in the same tab. | 
| +IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, | 
| +                       WindowLocationHrefRedirect) { | 
| +  ClickTestLink("window_location_href_redirect", 1); | 
| +  GURL::Replacements repl; | 
| +  repl.SetRef("", url::Component(0, 1)); | 
| +  GURL initial_url = embedded_test_server() | 
| +                         ->GetURL(kSingleFrameTestURL) | 
| +                         .ReplaceComponents(repl); | 
| +  GURL download_url = embedded_test_server()->GetURL(kDownloadItemURL); | 
| +  SafeBrowsingNavigationObserver::NavigationMap* nav_map = | 
| +      observer_->navigation_map(); | 
| +  ASSERT_TRUE(nav_map); | 
| +  ASSERT_EQ(std::size_t(1), nav_map->size()); | 
| +  ASSERT_EQ(std::size_t(1), nav_map->at(download_url).size()); | 
| +  VerifyNavigationEvent(initial_url, download_url, initial_url, false, false, | 
| +                        false, true, GURL(), nav_map->at(download_url).at(0)); | 
| +} | 
| + | 
| +// Click on a link which redirect twice until reaches download using a mixture | 
| +// of meta refresh and window.location.href. All transitions happen in the same | 
| +// tab. | 
| +IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, MixRedirects) { | 
| +  ClickTestLink("mix_redirects", 2); | 
| +  GURL redirect_url = embedded_test_server()->GetURL(kRedirectURL); | 
| +  GURL::Replacements repl; | 
| +  repl.SetRef("", url::Component(0, 1)); | 
| +  GURL initial_url = embedded_test_server() | 
| +                         ->GetURL(kSingleFrameTestURL) | 
| +                         .ReplaceComponents(repl); | 
| +  GURL download_url = embedded_test_server()->GetURL(kDownloadItemURL); | 
| +  SafeBrowsingNavigationObserver::NavigationMap* nav_map = | 
| +      observer_->navigation_map(); | 
| +  ASSERT_TRUE(nav_map); | 
| +  ASSERT_EQ(std::size_t(2), nav_map->size()); | 
| +  ASSERT_EQ(std::size_t(1), nav_map->at(redirect_url).size()); | 
| +  ASSERT_EQ(std::size_t(1), nav_map->at(download_url).size()); | 
| +  VerifyNavigationEvent(initial_url, redirect_url, initial_url, true, true, | 
| +                        false, true, GURL(), nav_map->at(redirect_url).at(0)); | 
| +  VerifyNavigationEvent(redirect_url, download_url, redirect_url, false, false, | 
| +                        false, true, GURL(), nav_map->at(download_url).at(0)); | 
| +} | 
| + | 
| +// Use javascript to open download in a new tab. | 
| +IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, NewTabDownload) { | 
| +  ClickTestLink("new_tab_download", 3); | 
| +  GURL initial_url = embedded_test_server()->GetURL(kSingleFrameTestURL); | 
| +  GURL download_url = embedded_test_server()->GetURL(kDownloadItemURL); | 
| +  GURL blank_url = GURL("about:blank"); | 
| +  SafeBrowsingNavigationObserver::NavigationMap* nav_map = | 
| +      observer_->navigation_map(); | 
| +  ASSERT_TRUE(nav_map); | 
| +  ASSERT_EQ(std::size_t(2), nav_map->size()); | 
| +  ASSERT_EQ(std::size_t(2), nav_map->at(blank_url).size()); | 
| +  ASSERT_EQ(std::size_t(1), nav_map->at(download_url).size()); | 
| +  VerifyNavigationEvent(initial_url, blank_url, initial_url, true, false, false, | 
| +                        false, GURL(), nav_map->at(blank_url).at(0)); | 
| +  // Source and target are at different tabs. | 
| +  EXPECT_FALSE(nav_map->at(blank_url).at(0).source_tab_id == | 
| +               nav_map->at(blank_url).at(0).target_tab_id); | 
| +  VerifyNavigationEvent(blank_url, blank_url, blank_url, false, false, false, | 
| +                        true, GURL(), nav_map->at(blank_url).at(1)); | 
| +  EXPECT_TRUE(nav_map->at(blank_url).at(1).source_tab_id == | 
| +              nav_map->at(blank_url).at(1).target_tab_id); | 
| +  VerifyNavigationEvent(blank_url, download_url, blank_url, false, false, false, | 
| +                        true, GURL(), nav_map->at(download_url).at(0)); | 
| +  EXPECT_TRUE(nav_map->at(download_url).at(0).source_tab_id == | 
| +              nav_map->at(download_url).at(0).target_tab_id); | 
| +} | 
| + | 
| +// Use javascript to open download in a new tab and download has a data url. | 
| +IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, | 
| +                       NewTabDownloadWithDataURL) { | 
| +  ClickTestLink("new_tab_download_with_data_url", 3); | 
| +  GURL initial_url = embedded_test_server()->GetURL(kSingleFrameTestURL); | 
| +  GURL download_url = GURL(kDownloadDataURL); | 
| +  GURL blank_url = GURL("about:blank"); | 
| +  SafeBrowsingNavigationObserver::NavigationMap* nav_map = | 
| +      observer_->navigation_map(); | 
| +  ASSERT_TRUE(nav_map); | 
| +  ASSERT_EQ(std::size_t(2), nav_map->size()); | 
| +  ASSERT_EQ(std::size_t(2), nav_map->at(blank_url).size()); | 
| +  ASSERT_EQ(std::size_t(1), nav_map->at(download_url).size()); | 
| +  VerifyNavigationEvent(initial_url, blank_url, initial_url, true, false, false, | 
| +                        false, GURL(), nav_map->at(blank_url).at(0)); | 
| +  // Source and target are at different tabs. | 
| +  EXPECT_FALSE(nav_map->at(blank_url).at(0).source_tab_id == | 
| +               nav_map->at(blank_url).at(0).target_tab_id); | 
| +  VerifyNavigationEvent(blank_url, blank_url, blank_url, false, false, false, | 
| +                        true, GURL(), nav_map->at(blank_url).at(1)); | 
| +  EXPECT_TRUE(nav_map->at(blank_url).at(1).source_tab_id == | 
| +              nav_map->at(blank_url).at(1).target_tab_id); | 
| +  VerifyNavigationEvent(blank_url, download_url, blank_url, false, false, false, | 
| +                        true, GURL(), nav_map->at(download_url).at(0)); | 
| +  EXPECT_TRUE(nav_map->at(download_url).at(0).source_tab_id == | 
| +              nav_map->at(download_url).at(0).target_tab_id); | 
| +} | 
| + | 
| +// TODO(jialiul): Need to figure out why this test is failing on Windows and | 
| +// flacky on other platforms. | 
| +#define MAYBE_DownloadViaHTML5FileApi DISABLED_DownloadViaHTML5FileApi | 
| +// Download via html5 file API. | 
| +IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, | 
| +                       MAYBE_DownloadViaHTML5FileApi) { | 
| +  ClickTestLink("html5_file_api", 1); | 
| +  GURL::Replacements repl; | 
| +  repl.SetRef("", url::Component(0, 1)); | 
| +  GURL initial_url = embedded_test_server()->GetURL(kSingleFrameTestURL) | 
| +      .ReplaceComponents(repl); | 
| +  std::string download_url_str = | 
| +      base::StringPrintf("filesystem:%stemporary/msghello-bypass.exe", | 
| +                         embedded_test_server()->base_url().spec().c_str()); | 
| +  GURL download_url = GURL(download_url_str); | 
| +  SafeBrowsingNavigationObserver::NavigationMap* nav_map = | 
| +      observer_->navigation_map(); | 
| +  ASSERT_TRUE(nav_map); | 
| +  ASSERT_EQ(std::size_t(1), nav_map->size()); | 
| +  ASSERT_EQ(std::size_t(1), nav_map->at(download_url).size()); | 
| +  VerifyNavigationEvent(initial_url, download_url, initial_url, false, false, | 
| +                        false, true, GURL(), nav_map->at(download_url).at(0)); | 
| +} | 
| + | 
| +// Click a link in a subframe and start download. | 
| +IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, | 
| +                       SubFrameDirectDownload) { | 
| +  ui_test_utils::NavigateToURL( | 
| +      browser(), embedded_test_server()->GetURL(kMultiFrameTestURL)); | 
| +  EXPECT_TRUE(content::WaitForLoadStop( | 
| +      browser()->tab_strip_model()->GetActiveWebContents())); | 
| +  std::string test_name = | 
| +      base::StringPrintf("%s', '%s", "iframe1", "iframe_direct_download"); | 
| +  ClickTestLink(test_name.c_str(), 1); | 
| +  GURL initial_url = embedded_test_server()->GetURL(kSingleFrameTestURL); | 
| +  GURL multi_frame_test_url = | 
| +      embedded_test_server()->GetURL(kMultiFrameTestURL); | 
| +  GURL iframe_url = embedded_test_server()->GetURL(kIframeDirectDownloadURL); | 
| +  GURL iframe_retargeting_url = | 
| +      embedded_test_server()->GetURL(kIframeRetargetingURL); | 
| +  GURL download_url = embedded_test_server()->GetURL(kDownloadItemURL); | 
| +  SafeBrowsingNavigationObserver::NavigationMap* nav_map = | 
| +      observer_->navigation_map(); | 
| +  ASSERT_TRUE(nav_map); | 
| +  ASSERT_EQ(std::size_t(4), nav_map->size()); | 
| +  ASSERT_EQ(std::size_t(1), nav_map->at(multi_frame_test_url).size()); | 
| +  ASSERT_EQ(std::size_t(1), nav_map->at(iframe_url).size()); | 
| +  ASSERT_EQ(std::size_t(1), nav_map->at(iframe_retargeting_url).size()); | 
| +  ASSERT_EQ(std::size_t(1), nav_map->at(download_url).size()); | 
| +  VerifyNavigationEvent(initial_url, multi_frame_test_url, initial_url, true, | 
| +                        true, false, true, GURL(), | 
| +                        nav_map->at(multi_frame_test_url).at(0)); | 
| +  VerifyNavigationEvent(iframe_url, iframe_url, multi_frame_test_url, false, | 
| +                        true, false, true, GURL(), | 
| +                        nav_map->at(iframe_url).at(0)); | 
| +  VerifyNavigationEvent(iframe_retargeting_url, iframe_retargeting_url, | 
| +                        multi_frame_test_url, false, true, false, true, GURL(), | 
| +                        nav_map->at(iframe_retargeting_url).at(0)); | 
| +  VerifyNavigationEvent(iframe_url, download_url, multi_frame_test_url, false, | 
| +                        false, false, true, GURL(), | 
| +                        nav_map->at(download_url).at(0)); | 
| +} | 
| + | 
| +// Click a link in a subframe and open download in a new tab. | 
| +IN_PROC_BROWSER_TEST_F(SBNavigationObserverBrowserTest, | 
| +                       SubFrameNewTabDownload) { | 
| +  ui_test_utils::NavigateToURL( | 
| +      browser(), embedded_test_server()->GetURL(kMultiFrameTestURL)); | 
| +  EXPECT_TRUE(content::WaitForLoadStop( | 
| +      browser()->tab_strip_model()->GetActiveWebContents())); | 
| +  std::string test_name = | 
| +      base::StringPrintf("%s', '%s", "iframe2", "iframe_new_tab_download"); | 
| +  ClickTestLink(test_name.c_str(), 3); | 
| +  GURL initial_url = embedded_test_server()->GetURL(kSingleFrameTestURL); | 
| +  GURL multi_frame_test_url = | 
| +      embedded_test_server()->GetURL(kMultiFrameTestURL); | 
| +  GURL iframe_url = embedded_test_server()->GetURL(kIframeDirectDownloadURL); | 
| +  GURL iframe_retargeting_url = | 
| +      embedded_test_server()->GetURL(kIframeRetargetingURL); | 
| +  GURL download_url = embedded_test_server()->GetURL(kDownloadItemURL); | 
| +  GURL blank_url = GURL("about:blank"); | 
| +  SafeBrowsingNavigationObserver::NavigationMap* nav_map = | 
| +      observer_->navigation_map(); | 
| +  ASSERT_TRUE(nav_map); | 
| +  ASSERT_EQ(std::size_t(5), nav_map->size()); | 
| +  ASSERT_EQ(std::size_t(1), nav_map->at(multi_frame_test_url).size()); | 
| +  ASSERT_EQ(std::size_t(1), nav_map->at(iframe_url).size()); | 
| +  ASSERT_EQ(std::size_t(1), nav_map->at(iframe_retargeting_url).size()); | 
| +  ASSERT_EQ(std::size_t(2), nav_map->at(blank_url).size()); | 
| +  ASSERT_EQ(std::size_t(1), nav_map->at(download_url).size()); | 
| +  VerifyNavigationEvent(initial_url, multi_frame_test_url, initial_url, true, | 
| +                        true, false, true, GURL(), | 
| +                        nav_map->at(multi_frame_test_url).at(0)); | 
| +  VerifyNavigationEvent(iframe_url, iframe_url, multi_frame_test_url, false, | 
| +                        true, false, true, GURL(), | 
| +                        nav_map->at(iframe_url).at(0)); | 
| +  VerifyNavigationEvent(iframe_retargeting_url, iframe_retargeting_url, | 
| +                        multi_frame_test_url, false, true, false, true, GURL(), | 
| +                        nav_map->at(iframe_retargeting_url).at(0)); | 
| +  VerifyNavigationEvent(iframe_retargeting_url, blank_url, multi_frame_test_url, | 
| +                        true, false, false, false, GURL(), | 
| +                        nav_map->at(blank_url).at(0)); | 
| +  VerifyNavigationEvent(blank_url, blank_url, blank_url, false, false, false, | 
| +                        true, GURL(), nav_map->at(blank_url).at(1)); | 
| +  VerifyNavigationEvent(blank_url, download_url, blank_url, false, false, false, | 
| +                        true, GURL(), nav_map->at(download_url).at(0)); | 
| +} | 
| + | 
| +}  // namespace safe_browsing | 
|  |