Introduce SWRouterNotCondition to DB and mojo
This CL adds structures to support Conditional Syntax on ServiceWorker
Static Routing API. Some existing structures defined by mojo and
database objects are changed to have `NotCondition` objects.
Explainer: https://github.com/WICG/service-worker-static-routing-api/blob/main/final-form.md
Design Doc: https://docs.google.com/document/d/1B2D8w_2M4j9CZC1VccBOAhfCdiRP3yPCSV5UKKDhU70/
Bug: 1485792
Change-Id: I6237b5af5a5b1103309f4355dfcfd82fe591b7f8
Fuchsia-Binary-Size: Size increase is unavoidable because we add new structures in protobuf and mojo. We also exported symbols, which we did not do by mistake.
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5125493
Reviewed-by: Takashi Nakayama <tnak@chromium.org>
Commit-Queue: Yoshisato Yanagisawa <yyanagisawa@chromium.org>
Reviewed-by: Takashi Toyoshima <toyoshim@chromium.org>
Reviewed-by: Shunya Shishido <sisidovski@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1271991}
This commit is contained in:

committed by
Chromium LUCI CQ

parent
f85d4975c7
commit
dc5507234a
components/services/storage/service_worker
content
browser
service_worker
common
third_party/blink
common
service_worker
public
common
mojom
service_worker
renderer
modules
service_worker
@ -408,8 +408,8 @@ bool WriteToBlinkCondition(
|
|||||||
const ServiceWorkerRegistrationData::RouterRules::RuleV1::Condition&
|
const ServiceWorkerRegistrationData::RouterRules::RuleV1::Condition&
|
||||||
condition,
|
condition,
|
||||||
blink::ServiceWorkerRouterCondition& out) {
|
blink::ServiceWorkerRouterCondition& out) {
|
||||||
auto&& [out_url_pattern, out_request, out_running_status, out_or_condition] =
|
auto&& [out_url_pattern, out_request, out_running_status, out_or_condition,
|
||||||
out.get();
|
out_not_condition] = out.get();
|
||||||
switch (condition.condition_case()) {
|
switch (condition.condition_case()) {
|
||||||
case ServiceWorkerRegistrationData::RouterRules::RuleV1::Condition::
|
case ServiceWorkerRegistrationData::RouterRules::RuleV1::Condition::
|
||||||
CONDITION_NOT_SET:
|
CONDITION_NOT_SET:
|
||||||
@ -733,9 +733,37 @@ bool WriteToBlinkCondition(
|
|||||||
out_or_condition = std::move(or_condition);
|
out_or_condition = std::move(or_condition);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case ServiceWorkerRegistrationData::RouterRules::RuleV1::Condition::
|
||||||
|
kNotCondition: {
|
||||||
|
if (out_not_condition) {
|
||||||
|
// Duplicated `not` condition found
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (!condition.has_not_condition()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
blink::ServiceWorkerRouterNotCondition not_condition;
|
||||||
|
const auto& pb_o = condition.not_condition().object();
|
||||||
|
blink::ServiceWorkerRouterCondition blink_condition;
|
||||||
|
for (const auto& pb_c : pb_o.conditions()) {
|
||||||
|
if (!WriteToBlinkCondition(pb_c, blink_condition)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (blink_condition.IsEmpty()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
not_condition.condition =
|
||||||
|
std::make_unique<blink::ServiceWorkerRouterCondition>(
|
||||||
|
std::move(blink_condition));
|
||||||
|
|
||||||
|
out_not_condition = std::move(not_condition);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!out.IsValid()) {
|
if (!out.IsValid()) {
|
||||||
|
DLOG(ERROR) << "out is not valid";
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -781,8 +809,8 @@ class AddConditionHelper {
|
|||||||
void WriteConditionToProtoWithHelper(
|
void WriteConditionToProtoWithHelper(
|
||||||
const blink::ServiceWorkerRouterCondition& condition,
|
const blink::ServiceWorkerRouterCondition& condition,
|
||||||
AddConditionHelper& out) {
|
AddConditionHelper& out) {
|
||||||
const auto& [url_pattern, request, running_status, or_condition] =
|
const auto& [url_pattern, request, running_status, or_condition,
|
||||||
condition.get();
|
not_condition] = condition.get();
|
||||||
if (url_pattern) {
|
if (url_pattern) {
|
||||||
auto* out_c = out.add_condition();
|
auto* out_c = out.add_condition();
|
||||||
ServiceWorkerRegistrationData::RouterRules::RuleV1::Condition::URLPattern*
|
ServiceWorkerRegistrationData::RouterRules::RuleV1::Condition::URLPattern*
|
||||||
@ -1030,6 +1058,12 @@ void WriteConditionToProtoWithHelper(
|
|||||||
WriteConditionToProtoWithHelper(c, pb_o);
|
WriteConditionToProtoWithHelper(c, pb_o);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (not_condition) {
|
||||||
|
auto* out_c = out.add_condition();
|
||||||
|
AddConditionHelper pb_o(out_c->mutable_not_condition()->mutable_object());
|
||||||
|
CHECK(not_condition->condition);
|
||||||
|
WriteConditionToProtoWithHelper(*not_condition->condition, pb_o);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void WriteConditionToProto(
|
void WriteConditionToProto(
|
||||||
@ -2477,8 +2511,10 @@ ServiceWorkerDatabase::Status ServiceWorkerDatabase::ParseRegistrationData(
|
|||||||
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
|
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
|
||||||
DCHECK(out);
|
DCHECK(out);
|
||||||
ServiceWorkerRegistrationData data;
|
ServiceWorkerRegistrationData data;
|
||||||
if (!data.ParseFromString(serialized))
|
if (!data.ParseFromString(serialized)) {
|
||||||
|
DLOG(ERROR) << "Failed to parse serialized data.";
|
||||||
return Status::kErrorCorrupted;
|
return Status::kErrorCorrupted;
|
||||||
|
}
|
||||||
|
|
||||||
GURL scope_url(data.scope_url());
|
GURL scope_url(data.scope_url());
|
||||||
GURL script_url(data.script_url());
|
GURL script_url(data.script_url());
|
||||||
@ -2719,6 +2755,8 @@ ServiceWorkerDatabase::Status ServiceWorkerDatabase::ParseRegistrationData(
|
|||||||
if (data.router_rules().version() !=
|
if (data.router_rules().version() !=
|
||||||
service_worker_internals::kRouterRuleVersion) {
|
service_worker_internals::kRouterRuleVersion) {
|
||||||
// Unknown route version.
|
// Unknown route version.
|
||||||
|
DLOG(ERROR) << "Router version '" << data.router_rules().version()
|
||||||
|
<< "' is not valid.";
|
||||||
return Status::kErrorCorrupted;
|
return Status::kErrorCorrupted;
|
||||||
}
|
}
|
||||||
blink::ServiceWorkerRouterRules router_rules;
|
blink::ServiceWorkerRouterRules router_rules;
|
||||||
@ -2727,6 +2765,7 @@ ServiceWorkerDatabase::Status ServiceWorkerDatabase::ParseRegistrationData(
|
|||||||
blink::ServiceWorkerRouterCondition condition;
|
blink::ServiceWorkerRouterCondition condition;
|
||||||
for (const auto& c : r.condition()) {
|
for (const auto& c : r.condition()) {
|
||||||
if (!WriteToBlinkCondition(c, condition)) {
|
if (!WriteToBlinkCondition(c, condition)) {
|
||||||
|
DLOG(ERROR) << "Failed to write to blink condition.";
|
||||||
return Status::kErrorCorrupted;
|
return Status::kErrorCorrupted;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2736,6 +2775,7 @@ ServiceWorkerDatabase::Status ServiceWorkerDatabase::ParseRegistrationData(
|
|||||||
switch (s.source_case()) {
|
switch (s.source_case()) {
|
||||||
case ServiceWorkerRegistrationData::RouterRules::RuleV1::Source::
|
case ServiceWorkerRegistrationData::RouterRules::RuleV1::Source::
|
||||||
SOURCE_NOT_SET:
|
SOURCE_NOT_SET:
|
||||||
|
DLOG(ERROR) << "Source not set.";
|
||||||
return Status::kErrorCorrupted;
|
return Status::kErrorCorrupted;
|
||||||
case ServiceWorkerRegistrationData::RouterRules::RuleV1::Source::
|
case ServiceWorkerRegistrationData::RouterRules::RuleV1::Source::
|
||||||
kNetworkSource:
|
kNetworkSource:
|
||||||
|
@ -185,6 +185,9 @@ message ServiceWorkerRegistrationData {
|
|||||||
message OrCondition {
|
message OrCondition {
|
||||||
repeated ConditionObject objects = 1;
|
repeated ConditionObject objects = 1;
|
||||||
}
|
}
|
||||||
|
message NotCondition {
|
||||||
|
required ConditionObject object = 1;
|
||||||
|
}
|
||||||
// TODO(crbug.com/1492871): Make this a `message` to fit WebIDL
|
// TODO(crbug.com/1492871): Make this a `message` to fit WebIDL
|
||||||
oneof condition {
|
oneof condition {
|
||||||
// Used for representing URLPattern.
|
// Used for representing URLPattern.
|
||||||
@ -196,6 +199,9 @@ message ServiceWorkerRegistrationData {
|
|||||||
// Used for representing 'or' condition.
|
// Used for representing 'or' condition.
|
||||||
// The `_condition` suffix is to avoid conflicts with keywords in C++
|
// The `_condition` suffix is to avoid conflicts with keywords in C++
|
||||||
OrCondition or_condition = 4;
|
OrCondition or_condition = 4;
|
||||||
|
// Used for representing 'not' condition.
|
||||||
|
// The `_condition` suffix is to avoid conflicts with keywords in C++
|
||||||
|
NotCondition not_condition = 5;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
message Source {
|
message Source {
|
||||||
|
@ -3649,6 +3649,28 @@ TEST(ServiceWorkerDatabaseTest, RouterRulesStoreRestore) {
|
|||||||
store_and_restore(router_rules);
|
store_and_restore(router_rules);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// `not` condition
|
||||||
|
{
|
||||||
|
blink::ServiceWorkerRouterRules router_rules;
|
||||||
|
blink::ServiceWorkerRouterRule rule;
|
||||||
|
blink::ServiceWorkerRouterNotCondition not_condition;
|
||||||
|
{
|
||||||
|
not_condition.condition =
|
||||||
|
std::make_unique<blink::ServiceWorkerRouterCondition>(
|
||||||
|
blink::ServiceWorkerRouterCondition::WithRequest({}));
|
||||||
|
}
|
||||||
|
rule.condition =
|
||||||
|
blink::ServiceWorkerRouterCondition::WithNotCondition(not_condition);
|
||||||
|
|
||||||
|
blink::ServiceWorkerRouterSource source;
|
||||||
|
source.type = network::mojom::ServiceWorkerRouterSourceType::kNetwork;
|
||||||
|
source.network_source = blink::ServiceWorkerRouterNetworkSource{};
|
||||||
|
rule.sources.emplace_back(source);
|
||||||
|
router_rules.rules.emplace_back(rule);
|
||||||
|
|
||||||
|
store_and_restore(router_rules);
|
||||||
|
}
|
||||||
|
|
||||||
// empty request
|
// empty request
|
||||||
{
|
{
|
||||||
blink::ServiceWorkerRouterRules router_rules;
|
blink::ServiceWorkerRouterRules router_rules;
|
||||||
@ -3711,7 +3733,8 @@ TEST(ServiceWorkerDatabaseTest, RouterRulesStoreRestore) {
|
|||||||
blink::ServiceWorkerRouterRunningStatusCondition::
|
blink::ServiceWorkerRouterRunningStatusCondition::
|
||||||
RunningStatusEnum::kRunning;
|
RunningStatusEnum::kRunning;
|
||||||
}
|
}
|
||||||
rule.condition = {url_pattern, request, running_status, std::nullopt};
|
rule.condition = {url_pattern, request, running_status, std::nullopt,
|
||||||
|
std::nullopt};
|
||||||
}
|
}
|
||||||
|
|
||||||
blink::ServiceWorkerRouterSource source;
|
blink::ServiceWorkerRouterSource source;
|
||||||
|
@ -2093,14 +2093,16 @@ TEST_P(ServiceWorkerVersionStaticRouterTest, SetRouterEvaluator) {
|
|||||||
auto first_rule = version->router_evaluator()->rules().rules[0];
|
auto first_rule = version->router_evaluator()->rules().rules[0];
|
||||||
auto second_rule = version->router_evaluator()->rules().rules[1];
|
auto second_rule = version->router_evaluator()->rules().rules[1];
|
||||||
auto&& [first_url_pattern, first_request, first_running_status,
|
auto&& [first_url_pattern, first_request, first_running_status,
|
||||||
first_or_condition] = first_rule.condition.get();
|
first_or_condition, first_not_condition] =
|
||||||
|
first_rule.condition.get();
|
||||||
EXPECT_EQ(first_running_status->status,
|
EXPECT_EQ(first_running_status->status,
|
||||||
blink::ServiceWorkerRouterRunningStatusCondition::
|
blink::ServiceWorkerRouterRunningStatusCondition::
|
||||||
RunningStatusEnum::kRunning);
|
RunningStatusEnum::kRunning);
|
||||||
EXPECT_EQ(first_rule.sources.begin()->type,
|
EXPECT_EQ(first_rule.sources.begin()->type,
|
||||||
network::mojom::ServiceWorkerRouterSourceType::kNetwork);
|
network::mojom::ServiceWorkerRouterSourceType::kNetwork);
|
||||||
auto&& [second_url_pattern, second_request, second_running_status,
|
auto&& [second_url_pattern, second_request, second_running_status,
|
||||||
second_or_condition] = second_rule.condition.get();
|
second_or_condition, second_not_condition] =
|
||||||
|
second_rule.condition.get();
|
||||||
EXPECT_EQ(second_running_status->status,
|
EXPECT_EQ(second_running_status->status,
|
||||||
blink::ServiceWorkerRouterRunningStatusCondition::
|
blink::ServiceWorkerRouterRunningStatusCondition::
|
||||||
RunningStatusEnum::kNotRunning);
|
RunningStatusEnum::kNotRunning);
|
||||||
|
@ -196,8 +196,8 @@ base::Value OrConditionToValue(
|
|||||||
base::Value ConditionToValue(
|
base::Value ConditionToValue(
|
||||||
const blink::ServiceWorkerRouterCondition& condition) {
|
const blink::ServiceWorkerRouterCondition& condition) {
|
||||||
base::Value::Dict out_c;
|
base::Value::Dict out_c;
|
||||||
const auto& [url_pattern, request, running_status, or_condition] =
|
const auto& [url_pattern, request, running_status, or_condition,
|
||||||
condition.get();
|
not_condition] = condition.get();
|
||||||
if (url_pattern) {
|
if (url_pattern) {
|
||||||
base::Value::Dict url_pattern_value;
|
base::Value::Dict url_pattern_value;
|
||||||
#define TO_VALUE(type, type_name) \
|
#define TO_VALUE(type, type_name) \
|
||||||
@ -360,13 +360,14 @@ bool BaseCondition::Set(const blink::ServiceWorkerRouterCondition& condition) {
|
|||||||
RecordSetupError(ServiceWorkerRouterEvaluatorErrorEnums::kEmptyCondition);
|
RecordSetupError(ServiceWorkerRouterEvaluatorErrorEnums::kEmptyCondition);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
const auto& [url_pattern, request, running_status, or_condition] =
|
const auto& [url_pattern, request, running_status, or_condition,
|
||||||
condition.get();
|
not_condition] = condition.get();
|
||||||
|
|
||||||
CHECK(!or_condition);
|
CHECK(!or_condition);
|
||||||
|
CHECK(!not_condition);
|
||||||
|
|
||||||
non_url_pattern_condition_ = {std::nullopt, request, running_status,
|
non_url_pattern_condition_ = {std::nullopt, request, running_status,
|
||||||
std::nullopt};
|
std::nullopt, std::nullopt};
|
||||||
if (running_status) {
|
if (running_status) {
|
||||||
need_running_status_ = true;
|
need_running_status_ = true;
|
||||||
}
|
}
|
||||||
@ -437,9 +438,10 @@ bool BaseCondition::MatchNonUrlPatternConditions(
|
|||||||
const network::ResourceRequest& request,
|
const network::ResourceRequest& request,
|
||||||
std::optional<blink::EmbeddedWorkerStatus> running_status) const {
|
std::optional<blink::EmbeddedWorkerStatus> running_status) const {
|
||||||
const auto& [url_pattern, request_pattern, running_status_pattern,
|
const auto& [url_pattern, request_pattern, running_status_pattern,
|
||||||
or_condition] = non_url_pattern_condition_.get();
|
or_condition, not_condition] = non_url_pattern_condition_.get();
|
||||||
CHECK(!url_pattern);
|
CHECK(!url_pattern);
|
||||||
CHECK(!or_condition);
|
CHECK(!or_condition);
|
||||||
|
CHECK(!not_condition);
|
||||||
if (request_pattern && !MatchRequestCondition(*request_pattern, request)) {
|
if (request_pattern && !MatchRequestCondition(*request_pattern, request)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -1232,7 +1232,8 @@ TEST(ServiceWorkerRouterEvaluator, ToValueBasicSimpleRule) {
|
|||||||
blink::ServiceWorkerRouterRunningStatusCondition::
|
blink::ServiceWorkerRouterRunningStatusCondition::
|
||||||
RunningStatusEnum::kRunning;
|
RunningStatusEnum::kRunning;
|
||||||
}
|
}
|
||||||
rule.condition = {url_pattern, request, running_status, std::nullopt};
|
rule.condition = {url_pattern, request, running_status, std::nullopt,
|
||||||
|
std::nullopt};
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
blink::ServiceWorkerRouterSource source;
|
blink::ServiceWorkerRouterSource source;
|
||||||
|
@ -18,6 +18,32 @@ bool ServiceWorkerRouterOrCondition::operator==(
|
|||||||
return conditions == other.conditions;
|
return conditions == other.conditions;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ServiceWorkerRouterNotCondition::ServiceWorkerRouterNotCondition() = default;
|
||||||
|
ServiceWorkerRouterNotCondition::~ServiceWorkerRouterNotCondition() = default;
|
||||||
|
ServiceWorkerRouterNotCondition::ServiceWorkerRouterNotCondition(
|
||||||
|
const ServiceWorkerRouterNotCondition& other) {
|
||||||
|
*this = other;
|
||||||
|
}
|
||||||
|
ServiceWorkerRouterNotCondition::ServiceWorkerRouterNotCondition(
|
||||||
|
ServiceWorkerRouterNotCondition&&) = default;
|
||||||
|
|
||||||
|
ServiceWorkerRouterNotCondition& ServiceWorkerRouterNotCondition::operator=(
|
||||||
|
const ServiceWorkerRouterNotCondition& other) {
|
||||||
|
if (other.condition) {
|
||||||
|
condition =
|
||||||
|
std::make_unique<ServiceWorkerRouterCondition>(*other.condition);
|
||||||
|
}
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
ServiceWorkerRouterNotCondition& ServiceWorkerRouterNotCondition::operator=(
|
||||||
|
ServiceWorkerRouterNotCondition&&) = default;
|
||||||
|
|
||||||
|
bool ServiceWorkerRouterNotCondition::operator==(
|
||||||
|
const ServiceWorkerRouterNotCondition& other) const {
|
||||||
|
// Returns false unless both have their value.
|
||||||
|
return condition && other.condition && *condition == *other.condition;
|
||||||
|
}
|
||||||
|
|
||||||
bool ServiceWorkerRouterCondition::operator==(
|
bool ServiceWorkerRouterCondition::operator==(
|
||||||
const ServiceWorkerRouterCondition& other) const {
|
const ServiceWorkerRouterCondition& other) const {
|
||||||
return get() == other.get();
|
return get() == other.get();
|
||||||
|
@ -30,6 +30,19 @@ bool StructTraits<blink::mojom::ServiceWorkerRouterOrConditionDataView,
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool StructTraits<blink::mojom::ServiceWorkerRouterNotConditionDataView,
|
||||||
|
blink::ServiceWorkerRouterNotCondition>::
|
||||||
|
Read(blink::mojom::ServiceWorkerRouterNotConditionDataView data,
|
||||||
|
blink::ServiceWorkerRouterNotCondition* out) {
|
||||||
|
blink::ServiceWorkerRouterCondition condition;
|
||||||
|
if (!data.ReadCondition(&condition)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
out->condition = std::make_unique<blink::ServiceWorkerRouterCondition>(
|
||||||
|
std::move(condition));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool StructTraits<blink::mojom::ServiceWorkerRouterRequestConditionDataView,
|
bool StructTraits<blink::mojom::ServiceWorkerRouterRequestConditionDataView,
|
||||||
blink::ServiceWorkerRouterRequestCondition>::
|
blink::ServiceWorkerRouterRequestCondition>::
|
||||||
Read(blink::mojom::ServiceWorkerRouterRequestConditionDataView data,
|
Read(blink::mojom::ServiceWorkerRouterRequestConditionDataView data,
|
||||||
@ -50,7 +63,8 @@ bool StructTraits<blink::mojom::ServiceWorkerRouterConditionDataView,
|
|||||||
blink::ServiceWorkerRouterCondition>::
|
blink::ServiceWorkerRouterCondition>::
|
||||||
Read(blink::mojom::ServiceWorkerRouterConditionDataView data,
|
Read(blink::mojom::ServiceWorkerRouterConditionDataView data,
|
||||||
blink::ServiceWorkerRouterCondition* out) {
|
blink::ServiceWorkerRouterCondition* out) {
|
||||||
auto&& [url_pattern, request, running_status, or_condition] = out->get();
|
auto&& [url_pattern, request, running_status, or_condition, not_condition] =
|
||||||
|
out->get();
|
||||||
if (!data.ReadUrlPattern(&url_pattern)) {
|
if (!data.ReadUrlPattern(&url_pattern)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -63,6 +77,9 @@ bool StructTraits<blink::mojom::ServiceWorkerRouterConditionDataView,
|
|||||||
if (!data.ReadOrCondition(&or_condition)) {
|
if (!data.ReadOrCondition(&or_condition)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
if (!data.ReadNotCondition(¬_condition)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
9
third_party/blink/common/service_worker/service_worker_router_rule_mojom_traits_unittest.cc
vendored
9
third_party/blink/common/service_worker/service_worker_router_rule_mojom_traits_unittest.cc
vendored
@ -59,7 +59,14 @@ TEST(ServiceWorkerRouterRulesTest, SimpleRoundTrip) {
|
|||||||
or_condition.conditions = std::vector(
|
or_condition.conditions = std::vector(
|
||||||
3, blink::ServiceWorkerRouterCondition::WithRequest({}));
|
3, blink::ServiceWorkerRouterCondition::WithRequest({}));
|
||||||
}
|
}
|
||||||
rule.condition = {url_pattern, request, running_status, or_condition};
|
blink::ServiceWorkerRouterNotCondition not_condition;
|
||||||
|
{
|
||||||
|
not_condition.condition =
|
||||||
|
std::make_unique<blink::ServiceWorkerRouterCondition>(
|
||||||
|
blink::ServiceWorkerRouterCondition::WithRequest({}));
|
||||||
|
}
|
||||||
|
rule.condition = {url_pattern, request, running_status, or_condition,
|
||||||
|
not_condition};
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
blink::ServiceWorkerRouterSource source;
|
blink::ServiceWorkerRouterSource source;
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
#ifndef THIRD_PARTY_BLINK_PUBLIC_COMMON_SERVICE_WORKER_SERVICE_WORKER_ROUTER_RULE_H_
|
#ifndef THIRD_PARTY_BLINK_PUBLIC_COMMON_SERVICE_WORKER_SERVICE_WORKER_ROUTER_RULE_H_
|
||||||
#define THIRD_PARTY_BLINK_PUBLIC_COMMON_SERVICE_WORKER_SERVICE_WORKER_ROUTER_RULE_H_
|
#define THIRD_PARTY_BLINK_PUBLIC_COMMON_SERVICE_WORKER_SERVICE_WORKER_ROUTER_RULE_H_
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
#include <optional>
|
#include <optional>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
@ -28,7 +29,7 @@ static constexpr int kServiceWorkerRouterConditionMaxRecursionDepth = 10;
|
|||||||
// TODO(crbug.com/1503017): set this value by discussing in spec proposal.
|
// TODO(crbug.com/1503017): set this value by discussing in spec proposal.
|
||||||
static constexpr size_t kServiceWorkerMaxRouterSize = 256;
|
static constexpr size_t kServiceWorkerMaxRouterSize = 256;
|
||||||
|
|
||||||
struct ServiceWorkerRouterRequestCondition {
|
struct BLINK_COMMON_EXPORT ServiceWorkerRouterRequestCondition {
|
||||||
// https://fetch.spec.whatwg.org/#concept-request-method
|
// https://fetch.spec.whatwg.org/#concept-request-method
|
||||||
// Technically, it can be an arbitrary string, but Chromium would set
|
// Technically, it can be an arbitrary string, but Chromium would set
|
||||||
// k*Method in net/http/http_request_headers.h
|
// k*Method in net/http/http_request_headers.h
|
||||||
@ -41,7 +42,7 @@ struct ServiceWorkerRouterRequestCondition {
|
|||||||
bool operator==(const ServiceWorkerRouterRequestCondition& other) const;
|
bool operator==(const ServiceWorkerRouterRequestCondition& other) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ServiceWorkerRouterRunningStatusCondition {
|
struct BLINK_COMMON_EXPORT ServiceWorkerRouterRunningStatusCondition {
|
||||||
enum class RunningStatusEnum {
|
enum class RunningStatusEnum {
|
||||||
kRunning = 0,
|
kRunning = 0,
|
||||||
// This includes kStarting and kStopping in addition to kStopped.
|
// This includes kStarting and kStopping in addition to kStopped.
|
||||||
@ -58,12 +59,26 @@ struct ServiceWorkerRouterRunningStatusCondition {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ServiceWorkerRouterOrCondition {
|
struct BLINK_COMMON_EXPORT ServiceWorkerRouterOrCondition {
|
||||||
std::vector<ServiceWorkerRouterCondition> conditions;
|
std::vector<ServiceWorkerRouterCondition> conditions;
|
||||||
|
|
||||||
bool operator==(const ServiceWorkerRouterOrCondition& other) const;
|
bool operator==(const ServiceWorkerRouterOrCondition& other) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct BLINK_COMMON_EXPORT ServiceWorkerRouterNotCondition {
|
||||||
|
std::unique_ptr<ServiceWorkerRouterCondition> condition;
|
||||||
|
|
||||||
|
ServiceWorkerRouterNotCondition();
|
||||||
|
~ServiceWorkerRouterNotCondition();
|
||||||
|
ServiceWorkerRouterNotCondition(const ServiceWorkerRouterNotCondition&);
|
||||||
|
ServiceWorkerRouterNotCondition& operator=(
|
||||||
|
const ServiceWorkerRouterNotCondition&);
|
||||||
|
ServiceWorkerRouterNotCondition(ServiceWorkerRouterNotCondition&&);
|
||||||
|
ServiceWorkerRouterNotCondition& operator=(ServiceWorkerRouterNotCondition&&);
|
||||||
|
|
||||||
|
bool operator==(const ServiceWorkerRouterNotCondition& other) const;
|
||||||
|
};
|
||||||
|
|
||||||
// TODO(crbug.com/1371756): implement other conditions in the proposal.
|
// TODO(crbug.com/1371756): implement other conditions in the proposal.
|
||||||
class BLINK_COMMON_EXPORT ServiceWorkerRouterCondition {
|
class BLINK_COMMON_EXPORT ServiceWorkerRouterCondition {
|
||||||
// We use aggregated getter/setter in this class in order to emit errors on
|
// We use aggregated getter/setter in this class in order to emit errors on
|
||||||
@ -73,12 +88,14 @@ class BLINK_COMMON_EXPORT ServiceWorkerRouterCondition {
|
|||||||
std::tuple<std::optional<SafeUrlPattern>&,
|
std::tuple<std::optional<SafeUrlPattern>&,
|
||||||
std::optional<ServiceWorkerRouterRequestCondition>&,
|
std::optional<ServiceWorkerRouterRequestCondition>&,
|
||||||
std::optional<ServiceWorkerRouterRunningStatusCondition>&,
|
std::optional<ServiceWorkerRouterRunningStatusCondition>&,
|
||||||
std::optional<ServiceWorkerRouterOrCondition>&>;
|
std::optional<ServiceWorkerRouterOrCondition>&,
|
||||||
|
std::optional<ServiceWorkerRouterNotCondition>&>;
|
||||||
using MemberConstRef = std::tuple<
|
using MemberConstRef = std::tuple<
|
||||||
const std::optional<SafeUrlPattern>&,
|
const std::optional<SafeUrlPattern>&,
|
||||||
const std::optional<ServiceWorkerRouterRequestCondition>&,
|
const std::optional<ServiceWorkerRouterRequestCondition>&,
|
||||||
const std::optional<ServiceWorkerRouterRunningStatusCondition>&,
|
const std::optional<ServiceWorkerRouterRunningStatusCondition>&,
|
||||||
const std::optional<ServiceWorkerRouterOrCondition>&>;
|
const std::optional<ServiceWorkerRouterOrCondition>&,
|
||||||
|
const std::optional<ServiceWorkerRouterNotCondition>&>;
|
||||||
|
|
||||||
ServiceWorkerRouterCondition() = default;
|
ServiceWorkerRouterCondition() = default;
|
||||||
ServiceWorkerRouterCondition(const ServiceWorkerRouterCondition&) = default;
|
ServiceWorkerRouterCondition(const ServiceWorkerRouterCondition&) = default;
|
||||||
@ -93,48 +110,67 @@ class BLINK_COMMON_EXPORT ServiceWorkerRouterCondition {
|
|||||||
const std::optional<ServiceWorkerRouterRequestCondition>& request,
|
const std::optional<ServiceWorkerRouterRequestCondition>& request,
|
||||||
const std::optional<ServiceWorkerRouterRunningStatusCondition>&
|
const std::optional<ServiceWorkerRouterRunningStatusCondition>&
|
||||||
running_status,
|
running_status,
|
||||||
const std::optional<ServiceWorkerRouterOrCondition>& or_condition)
|
const std::optional<ServiceWorkerRouterOrCondition>& or_condition,
|
||||||
|
const std::optional<ServiceWorkerRouterNotCondition>& not_condition)
|
||||||
: url_pattern_(url_pattern),
|
: url_pattern_(url_pattern),
|
||||||
request_(request),
|
request_(request),
|
||||||
running_status_(running_status),
|
running_status_(running_status),
|
||||||
or_condition_(or_condition) {}
|
or_condition_(or_condition),
|
||||||
|
not_condition_(not_condition) {}
|
||||||
|
|
||||||
// Returns tuple: suggest using structured bindings on the caller side.
|
// Returns tuple: suggest using structured bindings on the caller side.
|
||||||
MemberRef get() {
|
MemberRef get() {
|
||||||
return {url_pattern_, request_, running_status_, or_condition_};
|
return {url_pattern_, request_, running_status_, or_condition_,
|
||||||
|
not_condition_};
|
||||||
}
|
}
|
||||||
MemberConstRef get() const {
|
MemberConstRef get() const {
|
||||||
return {url_pattern_, request_, running_status_, or_condition_};
|
return {url_pattern_, request_, running_status_, or_condition_,
|
||||||
|
not_condition_};
|
||||||
}
|
}
|
||||||
|
|
||||||
bool IsEmpty() const {
|
bool IsEmpty() const {
|
||||||
return !(url_pattern_ || request_ || running_status_ || or_condition_);
|
return !(url_pattern_ || request_ || running_status_ || or_condition_ ||
|
||||||
|
not_condition_);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool IsOrConditionExclusive() const {
|
bool IsOrConditionExclusive() const {
|
||||||
return or_condition_.has_value() !=
|
return or_condition_.has_value() !=
|
||||||
(url_pattern_ || request_ || running_status_);
|
(url_pattern_ || request_ || running_status_ || not_condition_);
|
||||||
|
}
|
||||||
|
bool IsNotConditionExclusive() const {
|
||||||
|
return not_condition_.has_value() !=
|
||||||
|
(url_pattern_ || request_ || running_status_ || or_condition_);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool IsValid() const { return !IsEmpty() && IsOrConditionExclusive(); }
|
bool IsValid() const {
|
||||||
|
return !IsEmpty() && IsOrConditionExclusive() && IsNotConditionExclusive();
|
||||||
|
}
|
||||||
|
|
||||||
bool operator==(const ServiceWorkerRouterCondition& other) const;
|
bool operator==(const ServiceWorkerRouterCondition& other) const;
|
||||||
|
|
||||||
static ServiceWorkerRouterCondition WithUrlPattern(
|
static ServiceWorkerRouterCondition WithUrlPattern(
|
||||||
const SafeUrlPattern& url_pattern) {
|
const SafeUrlPattern& url_pattern) {
|
||||||
return {url_pattern, std::nullopt, std::nullopt, std::nullopt};
|
return {url_pattern, std::nullopt, std::nullopt, std::nullopt,
|
||||||
|
std::nullopt};
|
||||||
}
|
}
|
||||||
static ServiceWorkerRouterCondition WithRequest(
|
static ServiceWorkerRouterCondition WithRequest(
|
||||||
const ServiceWorkerRouterRequestCondition& request) {
|
const ServiceWorkerRouterRequestCondition& request) {
|
||||||
return {std::nullopt, request, std::nullopt, std::nullopt};
|
return {std::nullopt, request, std::nullopt, std::nullopt, std::nullopt};
|
||||||
}
|
}
|
||||||
static ServiceWorkerRouterCondition WithRunningStatus(
|
static ServiceWorkerRouterCondition WithRunningStatus(
|
||||||
const ServiceWorkerRouterRunningStatusCondition& running_status) {
|
const ServiceWorkerRouterRunningStatusCondition& running_status) {
|
||||||
return {std::nullopt, std::nullopt, running_status, std::nullopt};
|
return {std::nullopt, std::nullopt, running_status, std::nullopt,
|
||||||
|
std::nullopt};
|
||||||
}
|
}
|
||||||
static ServiceWorkerRouterCondition WithOrCondition(
|
static ServiceWorkerRouterCondition WithOrCondition(
|
||||||
const ServiceWorkerRouterOrCondition& or_condition) {
|
const ServiceWorkerRouterOrCondition& or_condition) {
|
||||||
return {std::nullopt, std::nullopt, std::nullopt, or_condition};
|
return {std::nullopt, std::nullopt, std::nullopt, or_condition,
|
||||||
|
std::nullopt};
|
||||||
|
}
|
||||||
|
static ServiceWorkerRouterCondition WithNotCondition(
|
||||||
|
const ServiceWorkerRouterNotCondition& not_condition) {
|
||||||
|
return {std::nullopt, std::nullopt, std::nullopt, std::nullopt,
|
||||||
|
not_condition};
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@ -150,6 +186,10 @@ class BLINK_COMMON_EXPORT ServiceWorkerRouterCondition {
|
|||||||
// `Or` condition to be used for matching
|
// `Or` condition to be used for matching
|
||||||
// We need `_condition` suffix to avoid conflict with reserved keywords in C++
|
// We need `_condition` suffix to avoid conflict with reserved keywords in C++
|
||||||
std::optional<ServiceWorkerRouterOrCondition> or_condition_;
|
std::optional<ServiceWorkerRouterOrCondition> or_condition_;
|
||||||
|
|
||||||
|
// `Not` condition to be used for matching
|
||||||
|
// We need `_condition` suffix to avoid conflict with reserved keywords in C++
|
||||||
|
std::optional<ServiceWorkerRouterNotCondition> not_condition_;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Network source structure.
|
// Network source structure.
|
||||||
|
21
third_party/blink/public/common/service_worker/service_worker_router_rule_mojom_traits.h
vendored
21
third_party/blink/public/common/service_worker/service_worker_router_rule_mojom_traits.h
vendored
@ -117,6 +117,20 @@ struct BLINK_COMMON_EXPORT
|
|||||||
blink::ServiceWorkerRouterOrCondition* out);
|
blink::ServiceWorkerRouterOrCondition* out);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template <>
|
||||||
|
struct BLINK_COMMON_EXPORT
|
||||||
|
StructTraits<blink::mojom::ServiceWorkerRouterNotConditionDataView,
|
||||||
|
blink::ServiceWorkerRouterNotCondition> {
|
||||||
|
static const blink::ServiceWorkerRouterCondition& condition(
|
||||||
|
const blink::ServiceWorkerRouterNotCondition& data) {
|
||||||
|
CHECK(data.condition);
|
||||||
|
return *data.condition;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool Read(blink::mojom::ServiceWorkerRouterNotConditionDataView data,
|
||||||
|
blink::ServiceWorkerRouterNotCondition* out);
|
||||||
|
};
|
||||||
|
|
||||||
template <>
|
template <>
|
||||||
struct BLINK_COMMON_EXPORT
|
struct BLINK_COMMON_EXPORT
|
||||||
StructTraits<blink::mojom::ServiceWorkerRouterConditionDataView,
|
StructTraits<blink::mojom::ServiceWorkerRouterConditionDataView,
|
||||||
@ -147,6 +161,13 @@ struct BLINK_COMMON_EXPORT
|
|||||||
data.get());
|
data.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const std::optional<blink::ServiceWorkerRouterNotCondition>&
|
||||||
|
not_condition(const blink::ServiceWorkerRouterCondition& data) {
|
||||||
|
return std::get<
|
||||||
|
const std::optional<blink::ServiceWorkerRouterNotCondition>&>(
|
||||||
|
data.get());
|
||||||
|
}
|
||||||
|
|
||||||
static bool Read(blink::mojom::ServiceWorkerRouterConditionDataView data,
|
static bool Read(blink::mojom::ServiceWorkerRouterConditionDataView data,
|
||||||
blink::ServiceWorkerRouterCondition* out);
|
blink::ServiceWorkerRouterCondition* out);
|
||||||
};
|
};
|
||||||
|
@ -58,6 +58,13 @@ struct ServiceWorkerRouterOrCondition {
|
|||||||
array<ServiceWorkerRouterCondition> conditions;
|
array<ServiceWorkerRouterCondition> conditions;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// This represents a not condition to match.
|
||||||
|
// See:
|
||||||
|
// https://github.com/WICG/service-worker-static-routing-api/blob/main/final-form.md
|
||||||
|
struct ServiceWorkerRouterNotCondition {
|
||||||
|
ServiceWorkerRouterCondition condition;
|
||||||
|
};
|
||||||
|
|
||||||
// This represents a condition of the router rule.
|
// This represents a condition of the router rule.
|
||||||
// https://github.com/yoshisatoyanagisawa/service-worker-static-routing-api
|
// https://github.com/yoshisatoyanagisawa/service-worker-static-routing-api
|
||||||
// TODO(crbug.com/1371756): implement other conditions in the full picture.
|
// TODO(crbug.com/1371756): implement other conditions in the full picture.
|
||||||
@ -67,6 +74,7 @@ struct ServiceWorkerRouterCondition {
|
|||||||
ServiceWorkerRouterRequestCondition? request;
|
ServiceWorkerRouterRequestCondition? request;
|
||||||
ServiceWorkerRouterRunningStatusCondition? running_status;
|
ServiceWorkerRouterRunningStatusCondition? running_status;
|
||||||
ServiceWorkerRouterOrCondition? or_condition;
|
ServiceWorkerRouterOrCondition? or_condition;
|
||||||
|
ServiceWorkerRouterNotCondition? not_condition;
|
||||||
};
|
};
|
||||||
|
|
||||||
// This is used for specifying the source is network.
|
// This is used for specifying the source is network.
|
||||||
|
2
third_party/blink/renderer/modules/service_worker/service_worker_router_type_converter.cc
vendored
2
third_party/blink/renderer/modules/service_worker/service_worker_router_type_converter.cc
vendored
@ -200,7 +200,7 @@ std::optional<ServiceWorkerRouterCondition> RouterConditionToBlink(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
blink::ServiceWorkerRouterCondition ret(url_pattern, request, running_status,
|
blink::ServiceWorkerRouterCondition ret(url_pattern, request, running_status,
|
||||||
or_condition);
|
or_condition, std::nullopt);
|
||||||
if (ret.IsEmpty()) {
|
if (ret.IsEmpty()) {
|
||||||
// At least one condition should exist per rule.
|
// At least one condition should exist per rule.
|
||||||
exception_state.ThrowTypeError(
|
exception_state.ThrowTypeError(
|
||||||
|
Reference in New Issue
Block a user