Skip to content

Commit

Permalink
Ensure coop header is properly parsed when set by service worker
Browse files Browse the repository at this point in the history
This adds the parsing of the COOP header within the service worker
navigation loader and an associated unittest.

Bug: 1059295
Change-Id: Ia7ea047ceaa97161ad3263ee6f007362f692a757
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2100790
Commit-Queue: Pâris Meuleman <pmeuleman@chromium.org>
Reviewed-by: Camille Lamy <clamy@chromium.org>
Cr-Commit-Position: refs/heads/master@{#749793}
  • Loading branch information
ParisMeuleman authored and Commit Bot committed Mar 12, 2020
1 parent 632a076 commit fa36317
Show file tree
Hide file tree
Showing 2 changed files with 62 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
#include "base/run_loop.h"
#include "base/strings/string_number_conversions.h"
#include "base/test/metrics/histogram_tester.h"
#include "base/test/scoped_feature_list.h"
#include "content/browser/loader/navigation_loader_interceptor.h"
#include "content/browser/loader/single_request_url_loader_factory.h"
#include "content/browser/service_worker/embedded_worker_test_helper.h"
Expand All @@ -29,6 +30,7 @@
#include "net/ssl/ssl_info.h"
#include "net/test/cert_test_util.h"
#include "net/test/test_data_directory.h"
#include "services/network/public/cpp/features.h"
#include "services/network/public/mojom/fetch_api.mojom.h"
#include "services/network/public/mojom/url_response_head.mojom.h"
#include "services/network/test/test_url_loader_client.h"
Expand Down Expand Up @@ -82,6 +84,15 @@ blink::mojom::FetchAPIResponsePtr RedirectResponse(
return response;
}

blink::mojom::FetchAPIResponsePtr HeadersResponse(
const base::flat_map<std::string, std::string>& headers) {
auto response = blink::mojom::FetchAPIResponse::New();
response->status_code = 200;
response->status_text = "OK";
response->headers.insert(headers.begin(), headers.end());
return response;
}

// Simulates a service worker handling fetch events. The response can be
// customized via RespondWith* functions.
class FetchEventServiceWorker : public FakeServiceWorker {
Expand Down Expand Up @@ -119,6 +130,14 @@ class FetchEventServiceWorker : public FakeServiceWorker {
// Tells this worker to respond to fetch events with an error response.
void RespondWithError() { response_mode_ = ResponseMode::kErrorResponse; }

// Tells this worker to respond to fetch events with a response containing
// specific headers.
void RespondWithHeaders(
const base::flat_map<std::string, std::string>& headers) {
response_mode_ = ResponseMode::kHeaders;
headers_ = headers;
}

// Tells this worker to respond to fetch events with the redirect response.
void RespondWithRedirectResponse(const GURL& new_url) {
response_mode_ = ResponseMode::kRedirect;
Expand Down Expand Up @@ -260,6 +279,13 @@ class FetchEventServiceWorker : public FakeServiceWorker {
std::move(finish_callback)
.Run(blink::mojom::ServiceWorkerEventStatus::COMPLETED);
break;
case ResponseMode::kHeaders:
response_callback->OnResponse(
HeadersResponse(headers_),
blink::mojom::ServiceWorkerFetchEventTiming::New());
std::move(finish_callback)
.Run(blink::mojom::ServiceWorkerEventStatus::COMPLETED);
break;
}

if (quit_closure_for_fetch_event_)
Expand All @@ -276,7 +302,8 @@ class FetchEventServiceWorker : public FakeServiceWorker {
kFailFetchEventDispatch,
kDeferredResponse,
kEarlyResponse,
kRedirect
kRedirect,
kHeaders
};

ResponseMode response_mode_ = ResponseMode::kDefault;
Expand All @@ -297,6 +324,9 @@ class FetchEventServiceWorker : public FakeServiceWorker {
// For ResponseMode::kRedirect.
GURL redirected_url_;

// For ResponseMode::kHeaders
base::flat_map<std::string, std::string> headers_;

bool has_received_fetch_event_ = false;
base::OnceClosure quit_closure_for_fetch_event_;

Expand Down Expand Up @@ -959,5 +989,19 @@ TEST_F(ServiceWorkerNavigationLoaderTest, CancelNavigationDuringFetchEvent) {
EXPECT_EQ(net::ERR_ABORTED, client_.completion_status().error_code);
}

TEST_F(ServiceWorkerNavigationLoaderTest, ResponseWithCoop) {
base::test::ScopedFeatureList feature_list;
feature_list.InitWithFeatures({network::features::kCrossOriginOpenerPolicy},
{});
service_worker_->RespondWithHeaders(
{{"Cross-Origin-Opener-Policy", "same-origin"}});

// Perform the request.
StartRequest(CreateRequest());
client_.RunUntilComplete();
EXPECT_EQ(network::mojom::CrossOriginOpenerPolicy::kSameOrigin,
client_.response_head()->cross_origin_opener_policy);
}

} // namespace service_worker_navigation_loader_unittest
} // namespace content
17 changes: 17 additions & 0 deletions content/common/service_worker/service_worker_loader_helpers.cc
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
#include "net/url_request/redirect_util.h"
#include "services/network/public/cpp/content_security_policy/content_security_policy.h"
#include "services/network/public/cpp/cross_origin_embedder_policy.h"
#include "services/network/public/cpp/cross_origin_opener_policy_parser.h"
#include "services/network/public/cpp/features.h"
#include "services/network/public/cpp/resource_request.h"
#include "services/network/public/cpp/resource_request_body.h"
Expand Down Expand Up @@ -144,6 +145,22 @@ void ServiceWorkerLoaderHelpers::SaveResponseHeaders(
kCrossOriginEmbedderPolicyValueReportOnlyHeader);
out_head->cross_origin_embedder_policy = coep;
}

// TODO(pmeuleman): Remove the code duplication with
// //services/network/url_loader.cc.
if (base::FeatureList::IsEnabled(
network::features::kCrossOriginOpenerPolicy)) {
// Parse the Cross-Origin-Opener-Policy header.
constexpr char kCrossOriginOpenerPolicyHeader[] =
"Cross-Origin-Opener-Policy";
std::string raw_coop_string;
if (out_head->headers &&
out_head->headers->GetNormalizedHeader(kCrossOriginOpenerPolicyHeader,
&raw_coop_string)) {
out_head->cross_origin_opener_policy =
network::ParseCrossOriginOpenerPolicyHeader(raw_coop_string);
}
}
}

// static
Expand Down

0 comments on commit fa36317

Please sign in to comment.