Index: chrome/browser/subresource_filter/subresource_filter_browsertest.cc |
diff --git a/chrome/browser/subresource_filter/subresource_filter_browsertest.cc b/chrome/browser/subresource_filter/subresource_filter_browsertest.cc |
index 38c6a7f5f14a83b040cca42d4bc314c139f9f659..a31489eb968af42b49d733345c5e23f8c424b24d 100644 |
--- a/chrome/browser/subresource_filter/subresource_filter_browsertest.cc |
+++ b/chrome/browser/subresource_filter/subresource_filter_browsertest.cc |
@@ -14,6 +14,7 @@ |
#include "base/macros.h" |
#include "base/path_service.h" |
#include "base/strings/string_piece.h" |
+#include "base/strings/stringprintf.h" |
#include "base/test/histogram_tester.h" |
#include "chrome/browser/browser_process.h" |
#include "chrome/browser/metrics/subprocess_metrics_provider.h" |
@@ -47,6 +48,8 @@ |
#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 "net/test/spawned_test_server/spawned_test_server.h" |
+#include "net/test/test_data_directory.h" |
#include "testing/gmock/include/gmock/gmock.h" |
#include "testing/gtest/include/gtest/gtest.h" |
@@ -255,8 +258,8 @@ class SubresourceFilterBrowserTestImpl : public InProcessBrowserTest { |
ASSERT_TRUE(embedded_test_server()->Start()); |
} |
- GURL GetTestUrl(const std::string& path) { |
- return embedded_test_server()->base_url().Resolve(path); |
+ GURL GetTestUrl(const std::string& relative_url) { |
+ return embedded_test_server()->base_url().Resolve(relative_url); |
} |
void ConfigureAsPhishingURL(const GURL& url) { |
@@ -373,6 +376,49 @@ class SubresourceFilterWhitelistSiteOnReloadBrowserTest |
: SubresourceFilterBrowserTestImpl(false, true) {} |
}; |
+enum WebSocketCreationPolicy { |
+ IN_MAIN_FRAME, |
+ IN_WORKER, |
+}; |
+class SubresourceFilterWebSocketBrowserTest |
+ : public SubresourceFilterBrowserTestImpl, |
+ public ::testing::WithParamInterface<WebSocketCreationPolicy> { |
+ public: |
+ SubresourceFilterWebSocketBrowserTest() |
+ : SubresourceFilterBrowserTestImpl(false, false) {} |
+ |
+ void SetUpOnMainThread() override { |
+ SubresourceFilterBrowserTestImpl::SetUpOnMainThread(); |
+ websocket_test_server_ = base::MakeUnique<net::SpawnedTestServer>( |
+ net::SpawnedTestServer::TYPE_WS, net::SpawnedTestServer::kLocalhost, |
+ net::GetWebSocketTestDataDirectory()); |
+ ASSERT_TRUE(websocket_test_server_->Start()); |
+ } |
+ |
+ net::SpawnedTestServer* websocket_test_server() { |
+ return websocket_test_server_.get(); |
+ } |
+ |
+ GURL GetWebSocketUrl(const std::string& path) { |
+ GURL::Replacements replacements; |
+ replacements.SetSchemeStr("ws"); |
+ return websocket_test_server_->GetURL(path).ReplaceComponents(replacements); |
+ } |
+ |
+ void CreateWebSocketAndExpectResult(const GURL& url, |
+ bool expect_connection_success) { |
+ bool websocket_connection_succeeded = false; |
+ EXPECT_TRUE(content::ExecuteScriptAndExtractBool( |
+ browser()->tab_strip_model()->GetActiveWebContents(), |
+ base::StringPrintf("connectWebSocket('%s');", url.spec().c_str()), |
+ &websocket_connection_succeeded)); |
+ EXPECT_EQ(expect_connection_success, websocket_connection_succeeded); |
+ } |
+ |
+ private: |
+ std::unique_ptr<net::SpawnedTestServer> websocket_test_server_; |
+}; |
+ |
// Tests ----------------------------------------------------------------------- |
IN_PROC_BROWSER_TEST_F(SubresourceFilterBrowserTest, MainFrameActivation) { |
@@ -646,6 +692,52 @@ IN_PROC_BROWSER_TEST_F(SubresourceFilterBrowserTest, |
std::vector<const char*>{"b", "d"}, {false, true}); |
} |
+IN_PROC_BROWSER_TEST_P(SubresourceFilterWebSocketBrowserTest, BlockWebSocket) { |
+ GURL url(GetTestUrl( |
+ base::StringPrintf("subresource_filter/page_with_websocket.html?%s", |
+ GetParam() == IN_WORKER ? "inWorker" : ""))); |
+ GURL websocket_url(GetWebSocketUrl("echo-with-no-extension")); |
+ ConfigureAsPhishingURL(url); |
+ ASSERT_NO_FATAL_FAILURE( |
+ SetRulesetToDisallowURLsWithPathSuffix("echo-with-no-extension")); |
+ ui_test_utils::NavigateToURL(browser(), url); |
+ CreateWebSocketAndExpectResult(websocket_url, |
+ false /* expect_connection_success */); |
+} |
+ |
+IN_PROC_BROWSER_TEST_P(SubresourceFilterWebSocketBrowserTest, |
+ DoNotBlockWebSocketNoActivatedFrame) { |
+ GURL url(GetTestUrl( |
+ base::StringPrintf("subresource_filter/page_with_websocket.html?%s", |
+ GetParam() == IN_WORKER ? "inWorker" : ""))); |
+ GURL websocket_url(GetWebSocketUrl("echo-with-no-extension")); |
+ ASSERT_NO_FATAL_FAILURE( |
+ SetRulesetToDisallowURLsWithPathSuffix("echo-with-no-extension")); |
+ ui_test_utils::NavigateToURL(browser(), url); |
+ |
+ CreateWebSocketAndExpectResult(websocket_url, |
+ true /* expect_connection_success */); |
+} |
+ |
+IN_PROC_BROWSER_TEST_P(SubresourceFilterWebSocketBrowserTest, |
+ DoNotBlockWebSocketInActivatedFrameWithNoRule) { |
+ GURL url(GetTestUrl( |
+ base::StringPrintf("subresource_filter/page_with_websocket.html?%s", |
+ GetParam() == IN_WORKER ? "inWorker" : ""))); |
+ GURL websocket_url(GetWebSocketUrl("echo-with-no-extension")); |
+ ConfigureAsPhishingURL(url); |
+ ui_test_utils::NavigateToURL(browser(), url); |
+ |
+ CreateWebSocketAndExpectResult(websocket_url, |
+ true /* expect_connection_success */); |
+} |
+ |
+INSTANTIATE_TEST_CASE_P( |
+ /* no prefix */, |
+ SubresourceFilterWebSocketBrowserTest, |
+ ::testing::Values(WebSocketCreationPolicy::IN_WORKER, |
+ WebSocketCreationPolicy::IN_MAIN_FRAME)); |
+ |
// Tests checking how histograms are recorded. --------------------------------- |
namespace { |