blob: 810c08aa832a707498b9268ea229135914a9a1e1 [file] [log] [blame]
// Copyright 2019 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/renderer/subresource_redirect/subresource_redirect_url_loader_throttle.h"
#include "base/test/scoped_feature_list.h"
#include "base/test/task_environment.h"
#include "chrome/renderer/subresource_redirect/subresource_redirect_hints_agent.h"
#include "chrome/renderer/subresource_redirect/subresource_redirect_util.h"
#include "services/network/public/mojom/fetch_api.mojom-shared.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/blink/public/common/features.h"
#include "third_party/blink/public/common/loader/previews_state.h"
#include "third_party/blink/public/platform/web_network_state_notifier.h"
#include "third_party/blink/public/platform/web_url.h"
#include "third_party/blink/public/platform/web_url_request.h"
namespace subresource_redirect {
int kRenderFrameID = 1;
class TestSubresourceRedirectURLLoaderThrottle
: public SubresourceRedirectURLLoaderThrottle {
public:
TestSubresourceRedirectURLLoaderThrottle(
std::vector<std::string> public_image_urls,
bool allowed_to_redirect)
: SubresourceRedirectURLLoaderThrottle(kRenderFrameID,
allowed_to_redirect) {
subresource_redirect_hints_agent_.SetCompressPublicImagesHints(
blink::mojom::CompressPublicImagesHints::New(public_image_urls));
}
SubresourceRedirectHintsAgent* GetSubresourceRedirectHintsAgent() override {
return &subresource_redirect_hints_agent_;
}
private:
base::test::SingleThreadTaskEnvironment task_environment_;
SubresourceRedirectHintsAgent subresource_redirect_hints_agent_;
};
namespace {
std::unique_ptr<SubresourceRedirectURLLoaderThrottle>
CreateSubresourceRedirectURLLoaderThrottle(
const GURL& url,
network::mojom::RequestDestination request_destination,
int previews_state,
const std::vector<std::string>& public_image_urls) {
blink::WebURLRequest request;
request.SetUrl(url);
request.SetPreviewsState(previews_state);
request.SetRequestDestination(request_destination);
DCHECK(SubresourceRedirectURLLoaderThrottle::MaybeCreateThrottle(
request, kRenderFrameID)
.get() != nullptr);
return std::make_unique<TestSubresourceRedirectURLLoaderThrottle>(
public_image_urls,
previews_state & blink::PreviewsTypes::SUBRESOURCE_REDIRECT_ON);
}
TEST(SubresourceRedirectURLLoaderThrottleTest, TestMaybeCreateThrottle) {
struct TestCase {
bool data_saver_enabled;
bool is_subresource_redirect_feature_enabled;
network::mojom::RequestDestination destination;
int previews_state;
const std::string url;
bool expected_is_throttle_created;
};
const TestCase kTestCases[]{
{true, true, network::mojom::RequestDestination::kImage,
blink::PreviewsTypes::SUBRESOURCE_REDIRECT_ON,
"https://www.test.com/test.jpg", true},
// Failure cases
{false, true, network::mojom::RequestDestination::kImage,
blink::PreviewsTypes::SUBRESOURCE_REDIRECT_ON,
"https://www.test.com/test.jpg", false},
{true, false, network::mojom::RequestDestination::kImage,
blink::PreviewsTypes::SUBRESOURCE_REDIRECT_ON,
"https://www.test.com/test.jpg", false},
{true, true, network::mojom::RequestDestination::kScript,
blink::PreviewsTypes::SUBRESOURCE_REDIRECT_ON,
"https://www.test.com/test.jpg", false},
{true, true, network::mojom::RequestDestination::kImage,
blink::PreviewsTypes::SUBRESOURCE_REDIRECT_ON,
"http://www.test.com/test.jpg", false},
};
for (const TestCase& test_case : kTestCases) {
blink::WebNetworkStateNotifier::SetSaveDataEnabled(
test_case.data_saver_enabled);
base::test::ScopedFeatureList scoped_feature_list;
if (test_case.is_subresource_redirect_feature_enabled) {
scoped_feature_list.InitWithFeaturesAndParameters(
{{blink::features::kSubresourceRedirect,
{{"enable_subresource_server_redirect", "true"}}}},
{});
} else {
scoped_feature_list.InitAndDisableFeature(
blink::features::kSubresourceRedirect);
}
blink::WebURLRequest request;
request.SetPreviewsState(test_case.previews_state);
request.SetUrl(GURL(test_case.url));
request.SetRequestDestination(test_case.destination);
EXPECT_EQ(test_case.expected_is_throttle_created,
SubresourceRedirectURLLoaderThrottle::MaybeCreateThrottle(
request, kRenderFrameID) != nullptr);
}
}
TEST(SubresourceRedirectURLLoaderThrottleTest, TestGetSubresourceURL) {
struct TestCase {
int previews_state;
GURL original_url;
GURL redirected_subresource_url; // Empty URL means there will be no
// redirect.
};
const TestCase kTestCases[]{
{
blink::PreviewsTypes::SUBRESOURCE_REDIRECT_ON,
GURL("https://www.test.com/public_img.jpg"),
GetSubresourceURLForURL(GURL("https://www.test.com/public_img.jpg")),
},
{
blink::PreviewsTypes::SUBRESOURCE_REDIRECT_ON,
GURL("https://www.test.com/public_img.jpg#anchor"),
GetSubresourceURLForURL(
GURL("https://www.test.com/public_img.jpg#anchor")),
},
{
blink::PreviewsTypes::SUBRESOURCE_REDIRECT_ON,
GURL("https://www.test.com/"
"public_img.jpg?public_arg1=bar&public_arg2"),
GetSubresourceURLForURL(
GURL("https://www.test.com/"
"public_img.jpg?public_arg1=bar&public_arg2")),
},
// Private images will not be redirected.
{
blink::PreviewsTypes::SUBRESOURCE_REDIRECT_ON,
GURL("https://www.test.com/private_img.jpg"),
GURL(),
},
{
blink::PreviewsTypes::SUBRESOURCE_REDIRECT_ON,
GURL("https://www.test.com/public_img.jpg&private_arg1=foo"),
GURL(),
},
};
blink::WebNetworkStateNotifier::SetSaveDataEnabled(true);
base::test::ScopedFeatureList scoped_feature_list;
scoped_feature_list.InitWithFeaturesAndParameters(
{{blink::features::kSubresourceRedirect,
{{"enable_subresource_server_redirect", "true"}}}},
{});
for (const TestCase& test_case : kTestCases) {
auto throttle = CreateSubresourceRedirectURLLoaderThrottle(
test_case.original_url, network::mojom::RequestDestination::kImage,
test_case.previews_state,
{"https://www.test.com/public_img.jpg",
"https://www.test.com/public_img.jpg#anchor",
"https://www.test.com/public_img.jpg?public_arg1=bar&public_arg2"});
network::ResourceRequest request;
request.url = test_case.original_url;
request.destination = network::mojom::RequestDestination::kImage;
request.previews_state = test_case.previews_state;
bool defer = true;
throttle->WillStartRequest(&request, &defer);
EXPECT_EQ(defer, test_case.redirected_subresource_url.is_empty());
if (!test_case.redirected_subresource_url.is_empty()) {
EXPECT_EQ(request.url, test_case.redirected_subresource_url);
} else {
EXPECT_EQ(request.url, test_case.original_url);
}
}
}
TEST(SubresourceRedirectURLLoaderThrottleTest, DeferOverridenToFalse) {
blink::WebNetworkStateNotifier::SetSaveDataEnabled(true);
base::test::ScopedFeatureList scoped_feature_list;
scoped_feature_list.InitWithFeaturesAndParameters(
{{blink::features::kSubresourceRedirect,
{{"enable_subresource_server_redirect", "true"}}}},
{});
auto throttle = CreateSubresourceRedirectURLLoaderThrottle(
GURL("https://www.test.com/test.jpg"),
network::mojom::RequestDestination::kImage,
blink::PreviewsTypes::SUBRESOURCE_REDIRECT_ON,
{"https://www.test.com/test.jpg"});
network::ResourceRequest request;
request.url = GURL("https://www.test.com/test.jpg");
request.destination = network::mojom::RequestDestination::kImage;
request.previews_state = blink::PreviewsTypes::SUBRESOURCE_REDIRECT_ON;
bool defer = true;
throttle->WillStartRequest(&request, &defer);
EXPECT_FALSE(defer);
}
} // namespace
} // namespace subresource_redirect