blob: bf4de1386cb6109acb9a22687de6626d1ff3b380 [file] [log] [blame]
// Copyright 2017 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 <memory>
#include <string>
#include "base/macros.h"
#include "base/strings/stringprintf.h"
#include "chrome/browser/subresource_filter/subresource_filter_browser_test_harness.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "chrome/test/base/ui_test_utils.h"
#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "net/test/spawned_test_server/spawned_test_server.h"
#include "net/test/test_data_directory.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "url/gurl.h"
namespace subresource_filter {
enum WebSocketCreationPolicy {
IN_MAIN_FRAME,
IN_WORKER,
};
class SubresourceFilterWebSocketBrowserTest
: public SubresourceFilterBrowserTest,
public ::testing::WithParamInterface<WebSocketCreationPolicy> {
public:
SubresourceFilterWebSocketBrowserTest() {}
void SetUpOnMainThread() override {
SubresourceFilterBrowserTest::SetUpOnMainThread();
websocket_test_server_ = std::make_unique<net::SpawnedTestServer>(
net::SpawnedTestServer::TYPE_WS, 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_;
DISALLOW_COPY_AND_ASSIGN(SubresourceFilterWebSocketBrowserTest);
};
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));
} // namespace subresource_filter