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

Unified Diff: chrome/browser/safe_browsing/safe_browsing_service_browsertest.cc

Issue 2952583002: SafeBrowsing support for WebSocket (post-network-servicification) (Closed)
Patch Set: Revert change to WebSocketHandshakeThrottle.h Created 3 years, 6 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 | « android_webview/renderer/aw_content_renderer_client.cc ('k') | chrome/renderer/BUILD.gn » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/safe_browsing/safe_browsing_service_browsertest.cc
diff --git a/chrome/browser/safe_browsing/safe_browsing_service_browsertest.cc b/chrome/browser/safe_browsing/safe_browsing_service_browsertest.cc
index ed2c88a1c3549960a4c6dfd6e8d894faca3cb5b9..f735e180cd1ae4225e0778fb2be72ecfb19ab509 100644
--- a/chrome/browser/safe_browsing/safe_browsing_service_browsertest.cc
+++ b/chrome/browser/safe_browsing/safe_browsing_service_browsertest.cc
@@ -77,6 +77,7 @@
#include "sql/statement.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "url/gurl.h"
+#include "url/url_canon.h"
#if defined(OS_CHROMEOS)
#include "chrome/browser/chromeos/profiles/profile_helper.h"
@@ -107,6 +108,7 @@ const char kMalwareDelayedLoadsPage[] =
"/safe_browsing/malware_delayed_loads.html";
const char kMalwareIFrame[] = "/safe_browsing/malware_iframe.html";
const char kMalwareImg[] = "/safe_browsing/malware_image.png";
+const char kMalwareWebSocketPage[] = "/safe_browsing/malware_websocket.html";
const char kNeverCompletesPath[] = "/never_completes";
const char kPrefetchMalwarePage[] = "/safe_browsing/prefetch_malware.html";
@@ -1476,6 +1478,62 @@ IN_PROC_BROWSER_TEST_F(SafeBrowsingServiceTest, StartAndStop) {
EXPECT_FALSE(csd_service->enabled());
}
+IN_PROC_BROWSER_TEST_F(SafeBrowsingServiceTest, MalwareWebSocketBlocked) {
+ // This test currently only passes when the network service is enabled.
+ if (base::CommandLine::ForCurrentProcess()->HasSwitch(
+ ::switches::kEnableNetworkService)) {
+ GURL main_url = embedded_test_server()->GetURL(kMalwareWebSocketPage);
+ // This constructs the URL with the same logic as malware_websocket.html.
+ GURL resolved = main_url.Resolve("/safe_browsing/malware-ws");
+ GURL::Replacements replace_scheme;
+ replace_scheme.SetScheme("ws", url::Component(0, strlen("ws")));
+ GURL websocket_url = resolved.ReplaceComponents(replace_scheme);
+
+ // Add the WebSocket url as malware.
+ SBFullHashResult uws_full_hash;
+ GenUrlFullHashResult(websocket_url, MALWARE, &uws_full_hash);
+ SetupResponseForUrl(websocket_url, uws_full_hash);
+
+ // Brute force method for waiting for the interstitial to be displayed.
+ content::WindowedNotificationObserver load_stop_observer(
+ content::NOTIFICATION_ALL,
+ base::Bind(
+ [](SafeBrowsingServiceTest* self,
+ const content::NotificationSource& source,
+ const content::NotificationDetails& details) {
+ return self->ShowingInterstitialPage();
+ },
+ base::Unretained(this)));
+
+ EXPECT_CALL(observer_,
+ OnSafeBrowsingHit(IsUnsafeResourceFor(websocket_url)));
+ ui_test_utils::NavigateToURL(browser(), main_url);
+
+ // If the interstitial fails to be displayed, the test will hang here.
+ load_stop_observer.Wait();
+
+ EXPECT_TRUE(ShowingInterstitialPage());
+ EXPECT_TRUE(got_hit_report());
+ }
+}
+
+IN_PROC_BROWSER_TEST_F(SafeBrowsingServiceTest, UnknownWebSocketNotBlocked) {
+ GURL main_url = embedded_test_server()->GetURL(kMalwareWebSocketPage);
+
+ auto expected_title = base::ASCIIToUTF16("COMPLETED");
+ content::TitleWatcher title_watcher(
+ browser()->tab_strip_model()->GetActiveWebContents(), expected_title);
+
+ // Load the parent page without marking the WebSocket as malware.
+ ui_test_utils::NavigateToURL(browser(), main_url);
+
+ // Wait for the WebSocket connection attempt to complete.
+ auto new_title = title_watcher.WaitAndGetTitle();
+ EXPECT_EQ(expected_title, new_title);
+ EXPECT_FALSE(ShowingInterstitialPage());
+ EXPECT_FALSE(got_hit_report());
+}
+
class SafeBrowsingServiceShutdownTest : public SafeBrowsingServiceTest {
public:
void TearDown() override {
@@ -2190,6 +2248,67 @@ IN_PROC_BROWSER_TEST_F(V4SafeBrowsingServiceTest, CheckBrowseUrl) {
}
}
+// This is almost identical to
+// SafeBrowsingServiceTest.MalwareWebSocketBlocked. That test will be deleted
+// when the old database backend stops being used.
yzshen1 2017/06/21 16:55:06 optional: You could use parameterized tests.
Adam Rice 2017/06/22 12:29:31 I thought you couldn't parameterize on test framew
+IN_PROC_BROWSER_TEST_F(V4SafeBrowsingServiceTest, MalwareWebSocketBlocked) {
+ // This test currently only passes when the network service is enabled.
+ if (base::CommandLine::ForCurrentProcess()->HasSwitch(
+ ::switches::kEnableNetworkService)) {
+ GURL main_url = embedded_test_server()->GetURL(kMalwareWebSocketPage);
+ // This constructs the URL with the same logic as malware_websocket.html.
+ GURL resolved = main_url.Resolve("/safe_browsing/malware-ws");
+ GURL::Replacements replace_scheme;
+ replace_scheme.SetScheme("ws", url::Component(0, strlen("ws")));
+ GURL websocket_url = resolved.ReplaceComponents(replace_scheme);
+
+ MarkUrlForMalwareUnexpired(websocket_url);
+
+ // Brute force method for waiting for the interstitial to be displayed.
+ content::WindowedNotificationObserver load_stop_observer(
+ content::NOTIFICATION_ALL,
+ base::Bind(
+ [](SafeBrowsingServiceTest* self,
+ const content::NotificationSource& source,
+ const content::NotificationDetails& details) {
+ return self->ShowingInterstitialPage();
+ },
+ base::Unretained(this)));
+
+ EXPECT_CALL(observer_,
+ OnSafeBrowsingHit(IsUnsafeResourceFor(websocket_url)));
+ ui_test_utils::NavigateToURL(browser(), main_url);
+
+ // If the interstitial fails to be displayed, the test will hang here.
+ load_stop_observer.Wait();
+
+ EXPECT_TRUE(ShowingInterstitialPage());
+ EXPECT_TRUE(got_hit_report());
+ EXPECT_EQ(websocket_url, hit_report().malicious_url);
+ EXPECT_EQ(main_url, hit_report().page_url);
+ EXPECT_TRUE(hit_report().is_subresource);
+ }
+}
+
+// Identical to SafeBrowsingServiceTest.UnknownWebSocketNotBlocked. Uses the
+// V4 database backend.
+IN_PROC_BROWSER_TEST_F(V4SafeBrowsingServiceTest, UnknownWebSocketNotBlocked) {
+ GURL main_url = embedded_test_server()->GetURL(kMalwareWebSocketPage);
+
+ auto expected_title = base::ASCIIToUTF16("COMPLETED");
+ content::TitleWatcher title_watcher(
+ browser()->tab_strip_model()->GetActiveWebContents(), expected_title);
+
+ // Load the parent page without marking the WebSocket as malware.
+ ui_test_utils::NavigateToURL(browser(), main_url);
+
+ // Wait for the WebSocket connection attempt to complete.
+ auto new_title = title_watcher.WaitAndGetTitle();
+ EXPECT_EQ(expected_title, new_title);
+ EXPECT_FALSE(ShowingInterstitialPage());
+ EXPECT_FALSE(got_hit_report());
+}
+
#if defined(GOOGLE_CHROME_BUILD)
// This test is only enabled when GOOGLE_CHROME_BUILD is true because the store
// that this test uses is only populated on GOOGLE_CHROME_BUILD builds.
« no previous file with comments | « android_webview/renderer/aw_content_renderer_client.cc ('k') | chrome/renderer/BUILD.gn » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698